Bug #1421
進行中Bug #1343: [Branch] 華城充電樁 FINISHING 後未送 StatusNotification(Available),導致 connector 卡住無法充電 (FINISHING timeout fallback 修補)
[E2E testing] Fortune OCPP command capability 與 FINISHING 無人恢復驗證
概述
背景¶
Fortune(華城/FE-EVI)充電樁完成一次交易後,在充電槍仍插於車上的情況下會維持 FINISHING;必須實體拔槍後才回報 AVAILABLE。這使離峰充電與輪充在「第一次與第二次充電之間無人拔槍」的實務情境中,可能無法再次啟動。
目前 EMS 已提供受控的 Engineer Command API,可發送 19 個 OCPP 1.6 CSMS → Charge Point actions;Fortune FE-EVI 對這些 action 的 capability 尚缺乏完整實機證據,初始狀態為 UNVERIFIED。本單不重複建立 raw OCPP console,而是利用既有 audit、schema validation 與 operation timeline 進行 vendor certification。
相關議題:#1342、#1343、#1397、#1398、#1418。
目標¶
- 建立 Fortune 的 OCPP command capability matrix,保存每個 command 的:
- 測試時設備/Connector 狀態。
- request payload。
-
CALLRESULT/CALLERROR/timeout。 - 後續
StatusNotification、transaction 與 power-state 變化。 - firmware/model 適用範圍。
- 找出能在不需要人員拔槍的前提下,支援離峰與輪充的可行控制方式。
- 依實機結果提出精準方案,區分短期 workaround、正式輪充設計與 vendor firmware 需求。
- 將已驗證結果回寫
e_ocpp_command_capability與長期 E2E Catalog。
優先測試範圍¶
Phase 0:只讀/低風險能力探測¶
-
GetConfiguration- 查詢 smart charging profiles、max profiles、charging rate units,以及 transaction/unlock 相關 configuration keys。
-
TriggerMessage(StatusNotification)- 驗證能否要求 Fortune 主動重送 connector 狀態。
-
GetCompositeSchedule- 驗證 smart charging schedule 查詢能力。
Phase 1:避免結束 transaction 的輪充路徑¶
-
SetChargingProfile- 交易進行中將允許功率/電流降至 0 或設備可接受的最小值,觀察是否進入
SuspendedEVSE且交易保持。 - 恢復 profile 後觀察是否能在不經
FINISHING、不拔槍的情況下繼續充電。
- 交易進行中將允許功率/電流降至 0 或設備可接受的最小值,觀察是否進入
-
ClearChargingProfile- 驗證清除 profile 後的恢復行為。
-
GetCompositeSchedule- 驗證 profile 實際生效結果。
Phase 2:FINISHING 恢復能力¶
在交易已結束、槍仍插著且 raw status 為 FINISHING 時,依序分開測試:
-
RemoteStartTransaction:確認 Fortune 是否允許由FINISHING直接開始下一筆交易。 -
TriggerMessage(StatusNotification):確認設備是否只重送FINISHING,或重新判定實際狀態。 -
ChangeAvailability(Inoperative → Operative):確認是否能重置 connector lifecycle。 -
UnlockConnector:確認是否會解除鎖定並改變狀態;不得把「回 Accepted」等同於可再次充電。 -
Reset(Soft):確認 soft reset 後設備在槍未拔除時回到何種狀態,以及能否 RemoteStart。
Phase 3:情境驗證¶
- 私樁離峰:先插槍等待離峰,到點啟動、暫停/結束後於下一控制週期再次啟動。
- 輪充:車輛數大於 slots 時,Fortune 被輪出與再輪入期間不需拔槍。
- 交易一致性:不得產生重複 transaction、幽靈 operation 或供電狀態與 EMS 投影不一致。
首輪排除項目¶
以下 actions 與本問題沒有直接收益或風險過高,首輪不執行:
UpdateFirmwareSendLocalListClearCache- 任意 vendor
DataTransfer - 未先備份原值的
ChangeConfiguration Reset(Hard)-
ReserveNow/CancelReservation GetDiagnostics
若低風險測試無法形成解法,再另行提出擴充測試計畫並重新取得授權。
安全與前置條件¶
- 每次 state-changing command 前確認目標 Charge Point OCPP online。
- 確認沒有其他住戶/測試者正在使用,且 Branch/CP 不存在非本測試的 ACTIVE transaction/remote operation。
- 一次只測一個 command,等待狀態穩定並保存證據後才進下一項。
-
SetChargingProfile必須同步驗證實際 MeterValues/電流,不以Accepted作為成功。 -
Reset(Soft)、ChangeAvailability與UnlockConnector必須預先確認可接受短暫離線或設備狀態改變。 - 所有 command 由既有 Engineer Command API 發送並留下 audit,不繞過安全邊界直接注入 WebSocket frame。
E2E Impact¶
- Add:Fortune 插槍不拔情境下,離峰再次啟動/輪出再輪入的 vendor regression。
- Add:Fortune smart charging pause/resume capability certification。
- Priority:P0 Conditional(影響開始/停止與 unsafe power-state 判定)。
- Trigger:Fortune firmware/model 導入、離峰/輪充/OCPP charging-control 變更,以及 Fortune 案場發版。
- Release pack:Charging/OCPP + Site/Vendor Certification。
- 執行結果保存於
test_report/;長期 Catalog 只保存穩定案例與 capability。
驗收標準¶
- 對每個實際測試的 command 都取得 request、response、後續狀態與 power/transaction 證據。
- 將 capability 明確標示為
VERIFIED、UNSUPPORTED或保留UNVERIFIED並註明原因。 - 至少得到一項可支援無人拔槍的離峰/輪充方案,或以完整實機證據確認必須由 Fortune firmware 配合。
- 推薦方案必須說明失敗 fallback、timeout、重試與避免重複 transaction 的條件。
- E2E Catalog validator 通過。
SOP 狀態¶
本單建立後先進行需求確認與測試規劃。任何會連接外部環境、操作實體 Fortune 樁或修改共用資料的測試,均需先列出完整步驟與風險,等待 Ken 明確回覆「開始測試」後才能執行。
是由 陳國瑋 於 約 2 個月 前更新
- 狀態 從 New 變更為 In Progress
- 被分派者 設定為 陳國瑋
收案啟動¶
- 已依 SOP 執行
git pull --ff-only origin private,結果為已同步。 - 已建立 branch:
feature/redmine-1421-fortune-ocpp-capability。 - 已保存本地 ticket 快照:
redmine-tickets/1421.md。 - 已確認現有 Engineer Command API 支援 19 個受控 OCPP actions;本單重點是 Fortune 實機 capability 驗證,而非新增 raw OCPP sender。
- 尚未對外部環境或實體充電樁發送任何測試指令,先進入需求確認 gate。
是由 陳國瑋 於 約 2 個月 前更新
階段 2:Fortune OCPP 實機測試規劃待確認¶
完整計畫已建立:documents/20260810/redmine-1421-fortune-ocpp-command-test-plan.md。
批次 A:現在可遠端、無人介入¶
前置條件:目標 OCPP ONLINE、Connector AVAILABLE、currentTransactionId=null、Branch/CP 無 ACTIVE transaction、無 active remote/Engineer operation;任一不符即不送 command。
依序測試:
-
TriggerMessage(Heartbeat):CALLRESULT 後還必須看到新的 Heartbeat。 -
TriggerMessage(StatusNotification, connectorId=1):CALLRESULT 後還必須看到新的 connector StatusNotification。 -
GetConfiguration({}):取得全部 configuration;若設備不接受才對 SmartCharging/transaction/unlock keys 分批查詢一次。 -
GetCompositeSchedule(connectorId=1, duration=300, unit=A):只讀 idle baseline;只有 configuration 明確只支援 W 才追加一次 W。
本批明確不執行 RemoteStart/Stop、ChangeAvailability、UnlockConnector、Reset、Set/ClearChargingProfile、ChangeConfiguration 或任何 firmware/vendor write。每筆 HTTP 202 後輪詢 audit,最多 180 秒且不因等待重送。
批次 B:2026-08-11 EXPO 現場¶
- 建立正常插槍充電基線。
-
SetChargingProfile(TxProfile, 0A)驗證實際降載且 transaction 不終止。 - 只清除本測試 profile,驗證同 transaction 恢復供電。
- 建立 StopTransaction 後槍不拔的
FINISHING。 - 分開驗證
RemoteStartTransaction、TriggerMessage(StatusNotification)、ChangeAvailability(Inoperative → Operative)、UnlockConnector、Reset(Soft)的實際 recovery 能力。 - 以 MeterValues、實際電流、transaction 與狀態證據判定,不以 Accepted 取代 business success。
E2E Impact¶
- Update:
ENG-010、ENG-014。 - Add(暫定):
ROT-010Fortune smart charging pause/resume;ROT-011槍不拔跨控制週期再次啟動,均為 P0 Conditional/Gap。 - 受影響 baseline:
CHG-006/029/030/044、OCP-012/014、ROT-001/003/005/008、ENG-003/010/014。 - Release pack:targeted Site/Vendor Certification;若後續實作 solution,再跑完整 Charging/OCPP applicable P0+P1+受影響 P2。
預計檔案/資料¶
redmine-tickets/1421.mddocuments/20260810/redmine-1421-fortune-ocpp-command-test-plan.md- 批次 A/B 各一份
test_report/ - 實測確認後更新 E2E Catalog、相關
ai/文件與e_ocpp_command_capability - 測試階段不修改 charging business logic、API contract 或 schema
目前尚未對 Fortune 發送任何 command。等待 Ken 回覆「規劃可接受」;通過後會再列一次批次 A 的實際命令與資料影響,並等待「開始測試」。
是由 陳國瑋 於 約 2 個月 前更新
階段 2/3 Gate 通過:開始遠端批次 A¶
Ken 已確認規劃可接受,並明確指示先執行今晚可遠端完成的內容。
本次授權範圍:
- Preflight read-only checks。
-
TriggerMessage(Heartbeat)。 -
TriggerMessage(StatusNotification, connectorId=1)。 -
GetConfiguration。 -
GetCompositeSchedule(connectorId=1, duration=300)。 - 每筆 Engineer audit/OCPP response/後續 event 與測試後 idle-state 驗證。
不包含 RemoteStart/Stop、ChangeAvailability、UnlockConnector、Reset、Set/ClearChargingProfile、ChangeConfiguration 或其他 write command。若 preflight 不符或任一 command 異常,立即停止,不自動重送或擴大範圍。
是由 陳國瑋 於 約 2 個月 前更新
批次 A Preflight:STOP,尚未 dispatch OCPP command¶
時間:2026-08-10 20:32(Asia/Taipei)。
Read-only 結果:
- Branch
/api-docs:HTTP 200。 - Charge Point
CBDAX50A-24L-XX-B351:vendorFE-EVI、modelFEEVC-3-32A-CNS、firmwareV_0.09.43.00,1.8.38.0、OCPPONLINE,但 operational status=CHARGING。 - Connector
CBDAX50A-24L-XX-B351-001:raw status=PREPARING、currentTransactionId=NULL,lastStatusChange=2026-08-10 20:07:14。 - Branch ACTIVE transaction=0;CP ACTIVE transaction=0;active remote operation=0;active Engineer operation=0。
- Fortune capability:19 個皆
UNVERIFIED。 - 20:07:14 原始 CP request:
StatusNotification(connectorId=1, status=Preparing, errorCode=NoError, vendorErrorCode=0);Branch 已回空 CALLRESULT。 - 最近一次
Available是 19:16:41,之後 19:16:54 與 20:07:14 都由 CP 主動回報Preparing。
依核准計畫,遠端批次要求 connector=AVAILABLE;因此前置條件不符後已停止。尚未送出 TriggerMessage、GetConfiguration 或 GetCompositeSchedule,也沒有 request/response 可回報。
目前需要 Ken 決定是否允許把今晚範圍縮成「即使 connector 為 PREPARING,仍只送完全不改變設備狀態的 Heartbeat trigger/configuration/schedule query」,或維持原 gate 全部延後至現場。
是由 陳國瑋 於 約 2 個月 前更新
批次 A 範圍調整已核准¶
Ken 允許在目標目前為 PREPARING、currentTransactionId=NULL、Branch/CP 無 ACTIVE transaction 的條件下,繼續執行完全不控制供電的遠端 command:
TriggerMessage(Heartbeat)TriggerMessage(StatusNotification, connectorId=1)GetConfigurationGetCompositeSchedule
仍禁止 RemoteStart/Stop、ChangeAvailability、UnlockConnector、Reset、Set/ClearChargingProfile、ChangeConfiguration 與其他 write command。每筆需完整回報 request/response;任一 command 或設備狀態異常立即停止。
是由 陳國瑋 於 約 2 個月 前更新
2026-08-10 遠端 OCPP 能力探測結果¶
本批已依 Ken 授權完成;測試期間未送出啟停充電、profile 寫入、解鎖、重置、availability 或 configuration 寫入命令。執行前後均為 OCPP ONLINE、Connector PREPARING、Branch/CP ACTIVE transaction 0、active remote/Engineer operation 0。
Exact OCPP request/response¶
[2,"5e02b242-971f-4e6c-a36d-d3ef2b8c9749","TriggerMessage",{"requestedMessage":"Heartbeat"}]
[3,"5e02b242-971f-4e6c-a36d-d3ef2b8c9749",{"status":"Accepted"}]
Fortune 隨即送出:
[2,"9c9bda84-4eba-421c-b8ad-da8419fdadab","Heartbeat",{}]
[3,"9c9bda84-4eba-421c-b8ad-da8419fdadab",{"currentTime":"2026-08-10T20:39:08.510013248"}]
[2,"464dd0d4-209a-4610-8518-d8c98e47e1e2","TriggerMessage",{"requestedMessage":"StatusNotification","connectorId":1}]
[3,"464dd0d4-209a-4610-8518-d8c98e47e1e2",{"status":"Accepted"}]
Fortune 隨即重送:
[2,"6f5fce86-c7cb-485c-b63a-c430f52b9f1b","StatusNotification",{"connectorId":1,"errorCode":"NoError","status":"Preparing","timestamp":"2026-08-10T20:07:12.815862Z","vendorErrorCode":"0"}]
[3,"6f5fce86-c7cb-485c-b63a-c430f52b9f1b",{}]
[2,"4205a5ca-aa6c-4260-975f-d484ad7ba513","GetConfiguration",{}]
[4,"4205a5ca-aa6c-4260-975f-d484ad7ba513","InternalError","An unexpected error occurred.",{}]
指定 SmartCharging keys 後成功:
{
"configurationKey":[
{"key":"SupportedFeatureProfiles","readonly":true,"value":"Core,SmartCharging,RemoteTrigger"},
{"key":"MaxChargingProfilesInstalled","readonly":true,"value":"1"},
{"key":"ChargingScheduleAllowedChargingRateUnit","readonly":true,"value":"Current,Power"},
{"key":"ChargingScheduleMaxPeriods","readonly":true,"value":"10"},
{"key":"ChargeProfileMaxStackLevel","readonly":true,"value":"1"}
],
"unknownKey":["ConnectorSwitch3to1PhaseSupported"]
}
指定 transaction/unlock keys 後成功:
{
"configurationKey":[
{"key":"StopTransactionOnEVSideDisconnect","readonly":true,"value":"True"},
{"key":"UnlockConnectorOnEVSideDisconnect","readonly":true,"value":"True"},
{"key":"AuthorizeRemoteTxRequests","readonly":true,"value":"True"},
{"key":"ConnectionTimeOut","readonly":true,"value":"120"},
{"key":"MeterValuesSampledData","readonly":true,"value":"Energy.Active.Import.Register,Voltage,Current.Import,Power.Active.Import,Temperature"}
],
"unknownKey":[]
}
[2,"6aa8853a-e251-4beb-9092-49e7a96ef457","GetCompositeSchedule",{"connectorId":1,"duration":300,"chargingRateUnit":"A"}]
[3,"6aa8853a-e251-4beb-9092-49e7a96ef457",{"status":"Rejected","connectorId":1}]
判讀¶
- RemoteTrigger 已以實際 Heartbeat/StatusNotification 回送證明可用。
- Fortune 宣告支援 SmartCharging 與 Current/Power,但最多只安裝 1 個 charging profile、stack level 最高 1。
-
GetConfiguration {}會 CALLERROR;指定 key 可正常使用。 -
GetCompositeSchedule在 PREPARING/無 active transaction 時 Rejected,保留 UNVERIFIED,需在 CHARGING 時重測。 - TriggerMessage 重送相同狀態時,EMS 仍刷新
last_status_change,可能影響 FINISHING duration 判斷,已列為待追蹤問題。
完整 run-specific report:test_report/20260810_003_redmine-1421-expo-fortune-remote-ocpp.md。
目前停在 Redmine SOP 階段 5,請 Ken 確認測試報告;確認後才更新長期 E2E Catalog/capability 文件。
是由 陳國瑋 於 約 2 個月 前更新
2026-08-11 EXPO Solution 3 follow-up¶
目標設備:FE-EVI / FEEVC-3-32A-CNS / firmware V_0.09.43.00,1.8.38.0,connector CBDAX50A-24L-XX-B351-001。
在同一 ACTIVE transaction 46、同一 chargingProfileId=1421002 下,依序測試 TxProfile / Relative / stackLevel=0:
| Step | Request 核心 payload | commandLogId | Response |
|---|---|---|---|
| 1 | transactionId=46, A, limit=6.0 |
5653518b-dbe5-4550-b9a4-a8fd1022f483 |
Accepted / 246 ms |
| 2 | transactionId=46, A, limit=0.0 |
e961b976-7528-4d86-adee-43c17c2fa079 |
Accepted / 482 ms |
| 3 | transactionId=46, A, limit=6.0 |
05dd3195-430b-4da8-8594-0807794bfe47 |
Accepted / 369 ms |
| 4 | transactionId=46, W, limit=0.0 |
9f274dc9-d55c-4fc6-8088-5ba5d81c6675 |
Accepted / 294 ms |
| 5 | transactionId=46, A, limit=6.0 |
c6d594cd-2b58-401c-82f7-7e5bfbd6149b |
Accepted / 424 ms |
0 A 持續觀察超過 2 分鐘,0 W 也另行重測;兩者皆未讓模擬器離開「供電中」,沒有接觸器斷開聲,OCPP connector 持續 CHARGING,沒有 SuspendedEVSE。Transaction 全程保持同一筆 ACTIVE,未送 StopTransaction、未進入 FINISHING、未建立重複 transaction。
正式判定:
- Transaction continuity:PASS
- Smart Charging pause supply:FAIL
- Solution 3:此 firmware 不可用
-
CALLRESULT Accepted只證明 protocol 接受,不能視為暫停供電成功。
模擬器無法拉真實電流,所以正值限流(例如 16 A→6 A)仍不可量測;但這不沖銷 0 A/0 W 缺乏所有暫停跡象的 failure。後續需 Fortune 說明 zero-limit 語意,並提供 firmware 或經文件化的 private pause/session-rearm 能力。
Cleanup:transaction 46 已於 16:20:05 COMPLETED;拔除模擬器後 connector 於 16:21:13 AVAILABLE,current transaction 為 NULL。
文件與 E2E:
- 完整 request/response:
test_report/20260811_001_redmine-1421-expo-fortune-onsite-ocpp.md - 新增 P0 Conditional:
CHG-045、ROT-023、ROT-024 - 更新:
CHG-044、ENG-010、ENG-014 - Catalog validator:PASS(170 cases;P0=54)
- Commit:
98b0188 docs(#1421): 補充 Fortune SmartCharging 暫停失敗證據
Issue 保持開啟,待 Fortune firmware/private command 回覆與後續認證。
是由 陳國瑋 於 約 2 個月 前更新
已依 Ken 指示完成 commit、push,並直接合併至 private(未建立 MR)。
EMS 主倉庫
- feature commit: 050fd86 fix(#1421): 延長 Fortune 啟動等待並補降載測試程序
- private merge commit: 397156a merge(#1421): 整合 Fortune OCPP 能力驗證與降載程序
- 已包含 java/ems_branch/conf/deploying/application.yml 的 dsproxy DEBUG 變更。
- ems_branch ConnectorType.FORTUNE.maxWaitTime 已調整為 120000 ms,並補 Accepted 後 deadline/grace 的 unit regression。
charge_point 獨立倉庫
- feature commit: 381ce72 fix(#1421): 將 Fortune 啟動等待時間同步為 120 秒
- private merge commit: 3c3cd84 merge(#1421): 同步 Fortune 120 秒啟動等待
- charge_point ConnectorType.FORTUNE.maxWaitTime 同步為 120000 ms。
驗證
- RemoteOperationPersistenceServiceTest 指定案例:PASS
- RemoteOperationLifecycleServiceTest 指定案例:PASS
- charge_point mvn -DskipTests package:PASS
- E2E catalog validator(合併後):PASS,172 cases;P0=55、P1=66、P2=46、P3=5。
- 合併衝突處理:保留 private 既有 #1395 ROT-023;Fortune capability/跨週期案例調整為 ROT-024/ROT-025,相關 #1421 文件已同步。
文件
- documents/20260811/redmine-1421-fortune-real-load-smartcharging-test-procedure.md
- test_report/20260811_002_redmine-1421-fortune-timeout-and-test-procedure.md
限制:ROT-024 真實 EV/load bank 的正值降載、0 A/0 W physical pause 與同 transaction resume 仍為 NOT EXECUTED;不可把 OCPP CALLRESULT Accepted 視為物理供電控制成功。Ticket 維持開啟,待未來實負載現場驗證。