Skip to content

v0.1.1

Latest

Choose a tag to compare

@github-actions github-actions released this 19 Oct 08:55

Date: 2026-10-19
Previous release: v0.1.0

Summary

ocppctl moves to go-ocpp v0.1.3, which fixes the three go-ocpp bugs found while building ocppctl, and is qualified against the five reference implementations of ocpp-interop v0.4.1, CitrineOS among them. Every known issue, limitation and open question, with its root cause, is in docs/KNOWN_ISSUES.md.

Fixed

  • Frames lost on close (G1, go-ocpp v0.1.2). A SEND queued just before a graceful close, or the answer to a CALL from the peer (a Reset) right before the connection closed, could be lost. ocppctl's own workaround (counting written frames through the frame observer) is removed: every connection now closes with go-ocpp's graceful Shutdown, which drains first.
  • 20000.0 refused for an integer field (G2, go-ocpp v0.1.2). EVerest libocpp's 2.0.1 NotifyEVChargingNeeds was refused by server start; it is now accepted, as the draft-06 OCA schemas allow. The draft-04 OCPP 1.6 core schemas still refuse it, as draft-04 requires.
  • A SEND dropped when the peer closes right after it (G3, go-ocpp v0.1.3). SENDs received before the end of a connection are always delivered.

Changed

  • client run: after a Reset the simulated station is gone for 2 s before it connects again, as a charger that restarts. An immediate reconnection could be mistaken by a CSMS for the connection it had not finished closing (seen with CitrineOS).
  • client script: when a scenario ends, a CALL from the CSMS held for a step that never ran gets the default answer and is listed as unexpected, so the connection closes gracefully at once.
  • scripts/interop.sh: ocpp-interop v0.4.1 by default, with CitrineOS as a fifth reference (a CSMS for 1.6, 2.0.1 and 2.1). It waits until a reference CSMS has handled a close before it connects again, and until the simulated station has booted again after a Reset. A message the reference never sent (no API for it, its library cannot encode it, it refused the payload), as ocppctl's event log shows, is a skip with the reference's reason, not a failure.

Quality

  • Interoperability: against ocpp-interop v0.4.1 (results in reports/interop-v0.4.1.tsv, run with go-ocpp v0.1.2; v0.1.3 changes only the delivery of a SEND received right before a close), every fixture sample in both directions: ocppctl as the station against the CSMSs of mobilityhouse (1.6, 2.0.1, 2.1), ChargeTime (1.6, 2.0.1), lorenzodonini (1.6, 2.0.1) and CitrineOS (1.6, 2.0.1, 2.1), and the stations of mobilityhouse, ChargeTime, lorenzodonini and EVerest libocpp (1.6, 2.0.1, 2.1) against ocppctl's server. Of 1218 exchanges, 1154 passed, 29 were answered with a CALLERROR (9 of them ocppctl's own NotSupported for the PKI and VAT services it does not have), 32 were skipped because the reference did not send the message, and 3 failed: ocpp-go's schema-invalid 2.0.1 responses, which ocppctl refuses. In v0.1.0 (ocpp-interop v0.3.1, four references): 999 passed, 11 CALLERROR, 8 failed.
  • Tests: whole-module statement coverage 89.3% (floor 85%). New tests for the --debug frame trace, a scenario ending with a held CALL, and a station stopped while it restarts; make stress passes.