專案

一般

配置概況

動作

Bug #1421

進行中

Bug #1343: [Branch] 華城充電樁 FINISHING 後未送 StatusNotification(Available),導致 connector 卡住無法充電 (FINISHING timeout fallback 修補)

[E2E testing] Fortune OCPP command capability 與 FINISHING 無人恢復驗證

是由 陳國瑋 於 約 2 個月 前加入. 於 約 2 個月 前更新.

狀態:
In Progress
優先權:
High
被分派者:
開始日期:
2026-08-10
完成日期:
預估工時:

概述

背景

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。

目標

  1. 建立 Fortune 的 OCPP command capability matrix,保存每個 command 的:
    • 測試時設備/Connector 狀態。
    • request payload。
    • CALLRESULT/CALLERROR/timeout。
    • 後續 StatusNotification、transaction 與 power-state 變化。
    • firmware/model 適用範圍。
  2. 找出能在不需要人員拔槍的前提下,支援離峰與輪充的可行控制方式。
  3. 依實機結果提出精準方案,區分短期 workaround、正式輪充設計與 vendor firmware 需求。
  4. 將已驗證結果回寫 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、不拔槍的情況下繼續充電。
  • 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 與本問題沒有直接收益或風險過高,首輪不執行:

  • UpdateFirmware
  • SendLocalList
  • ClearCache
  • 任意 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 個月 前更新

需求確認 1:測試目標

Ken 確認本次 Fortune OCPP capability 與 FINISHING 無人恢復測試,以 EXPO 私人 Connector CBDAX50A-24L-XX-B351-001 為目標。

任何實際 command dispatch 前仍須完成現場配合、安全前置檢查與測試計畫確認。

是由 陳國瑋 於 約 2 個月 前更新

需求確認 2:遠端與現場測試分批

Ken 確認:

  • 現在只允許執行不需人工介入的遠端 OCPP command 測試。
  • 需要車輛插槍、確認實際供電或製造 FINISHING 的測試,延至 2026-08-11 Ken 到 EXPO 現場後手動配合。
  • Agent 先完成兩批測試的詳細計畫;任何遠端 command dispatch 仍依 SOP 等待測試計畫核准及明確「開始測試」指令。

是由 陳國瑋 於 約 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。

依序測試:

  1. TriggerMessage(Heartbeat):CALLRESULT 後還必須看到新的 Heartbeat。
  2. TriggerMessage(StatusNotification, connectorId=1):CALLRESULT 後還必須看到新的 connector StatusNotification。
  3. GetConfiguration({}):取得全部 configuration;若設備不接受才對 SmartCharging/transaction/unlock keys 分批查詢一次。
  4. 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 現場

  1. 建立正常插槍充電基線。
  2. SetChargingProfile(TxProfile, 0A) 驗證實際降載且 transaction 不終止。
  3. 只清除本測試 profile,驗證同 transaction 恢復供電。
  4. 建立 StopTransaction 後槍不拔的 FINISHING。
  5. 分開驗證 RemoteStartTransaction、TriggerMessage(StatusNotification)、ChangeAvailability(Inoperative → Operative)、UnlockConnector、Reset(Soft) 的實際 recovery 能力。
  6. 以 MeterValues、實際電流、transaction 與狀態證據判定,不以 Accepted 取代 business success。

E2E Impact

  • Update:ENG-010、ENG-014。
  • Add(暫定):ROT-010 Fortune 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.md
  • documents/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 已確認規劃可接受,並明確指示先執行今晚可遠端完成的內容。

本次授權範圍:

  1. Preflight read-only checks。
  2. TriggerMessage(Heartbeat)。
  3. TriggerMessage(StatusNotification, connectorId=1)。
  4. GetConfiguration。
  5. GetCompositeSchedule(connectorId=1, duration=300)。
  6. 每筆 Engineer audit/OCPP response/後續 event 與測試後 idle-state 驗證。

不包含 RemoteStart/Stop、ChangeAvailability、UnlockConnector、Reset、Set/ClearChargingProfile、ChangeConfiguration 或其他 write command。若 preflight 不符或任一 command 異常,立即停止,不自動重送或擴大範圍。

是由 陳國瑋 於 約 2 個月 前更新

測試證據補充要求

Ken 要求遠端批次逐案回報完整 request/response 內容。

報告至少包含:HTTP method/endpoint、request body、HTTP status、response body、Engineer operation detail/timeline、OCPP CALLRESULT/CALLERROR,以及 TriggerMessage 對應的後續 Heartbeat/StatusNotification。Password、JWT 與其他 secret 一律遮罩。

是由 陳國瑋 於 約 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:vendor FE-EVI、model FEEVC-3-32A-CNS、firmware V_0.09.43.00,1.8.38.0、OCPP ONLINE,但 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)
  • GetConfiguration
  • GetCompositeSchedule

仍禁止 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 維持開啟,待未來實負載現場驗證。

動作

匯出至 Atom PDF