What's New1.69.1 - PlugStream Firmware 1.69.1

PlugStream Change Logs

PlugStream is continuously updated to improve reliability, security, and user experience. This page provides a transparent record of every software and firmware release, including what changed and why it matters.

Latest

PlugStream Firmware 1.63.2

PlugStream Firmware 1.63.2

1.63.2Stable
Recommended for production deployments.
Tests: passed (967/967)Coverage: 73.0%
Firmware
September 6, 2026
Supported devices
#PlugStream 7
#PlugStream 22

PlugStream Firmware 1.63.2

Bug Fixes

  • ci: consume host schema coverage without Python in Rust image (fc7bac1)
  • ci: initialize only declared firmware target submodules (ee0a76a)
  • ocpp: enforce schema coverage for every implemented message (2f9a872)
  • ocpp: exclude invalid TLS profiles from reconnect retries (7d2c7e9)
  • ocpp: preserve transaction delivery and negotiated payloads (10b1809)
  • ocpp: protect credentials and refresh secure reconnects (3d87225)
  • ocpp: reconcile password recovery with current firmware (08b9253)
  • ocpp: retry registration and report truthful command outcomes (3e96b11)
  • ocpp: scope dynamic schedules and send unconfirmed event streams (67ff50b)
  • reconnect after accepted OCPP password changes (da2a903)
  • ocpp: certificate inventory and install speak OCPP 2.0.1, not just 1.6 (e5ff33f)
  • ocpp: pre-deployment sweep of the certificate paths - four more 2.0.1 gaps (f2ca242)
  • security: remove the dead CpCertificates class and its hardcoded passphrase (40fe0b4)
  • firmware: OTA download trust must survive a CSMS root install (b5c3144)
  • network: a 4-way handshake timeout is not proof of a wrong password (841d9c8)
  • network: accept full-size (16KB) TLS records - restore spec-compliant RX buffer (52f2077)
  • network: stop dialing the CSMS with no uplink IP; give sys_evt headroom (bdbca4f)
  • security: one verified root bundle for every TLS client; BLE stays down during OTA (11f50f7)
  • system: sys_evt stack 6144 -> 8192 - observed peak now 4376 bytes (b50a76e)
  • network: dial the preferred-profile retry from an internal-stacked task (426ada4)
  • network: widen the WS RX frame pool 3 -> 6 slots (b4514a6)
  • ocpp: bound per-message response maps with FIFO eviction (90576ed)
  • ocpp: bound the remaining v201 per-message state maps (b26f5f7)
  • security: GetLog uploads trust the verified root bundle, not the counterfeit (8ffda32)
  • ocpp: SignCertificate CALL went out with an empty action - map + guard + test (64bbce5)
  • ocpp: keep the PSRAM-stacked monitor task out of NVS - first profile-3 connection boot-looped the unit (c05e711)
  • tasks: close the "PSRAM stack touches flash" class - static audit, runtime attribution, two more paths fixed (489b1ff)
  • websocket: run certificate CALLs on the flash worker, not ws_rx; give ws_rx its full 9K (2d70605)
  • config: stop sdkconfig.defaults contradicting the build (a4476ea)
  • ocpp: default MessageTimeout to 30 s, not 5 (11f1a4a)
  • ocpp: report the real meter cadence, and let the CSMS set it (962d0dd)
  • websocket: stop the TX path compounding its own pressure (3c67bbf)
  • journal: rebuild an oversized idle offline journal, as the sensor journal does (293426b)
  • journal: trim superseded acked rows at ack time, bounding an open session's file (65094a2)
  • ocpp21: actually wire the tariff store Authorize needs, and gate the class (461b255)
  • ocpp21: NotifyPeriodicEventStream was never actually sent (7cd1035)
  • ocpp: ChangeAvailability never worked - wrong fields, and it cut drivers off (2d22541)
  • ocpp: ChangeAvailability read the wrong field names and rejected everything (2e784c0)
  • ocpp: honour the Reset type and evseId instead of discarding them (eaa7099)
  • ocpp: negotiate the OCPP subprotocol instead of assuming it (39f2466)
  • ocpp: preserve native status snapshots and binary authorization (153e7bd)
  • ocpp: refresh live status after native transaction replay (fee8b93)
  • ocpp: retain log request context and gate journal readiness (93c6e88)
  • ocpp: stop emitting and reading keys the schemas do not define (2a6b55d)
  • preserve transaction event lifecycle and retry connector status (c1589e3)
  • websocket: send Basic authentication in the initial handshake (63ea921)

Features

  • ocpp: make security profile 3 (mutual TLS) actually usable - cert-auth foundations (35f883b)
  • ocpp: move CSR generation to a dedicated PSRAM worker task (7f11ede)
  • ocpp: SessionIndicator.v1 - trusted session-completion progress on the LEDs (3b01bf6)
  • bluetooth: move BLE stack start/stop onto a dedicated worker task (4a707e7)
  • ocpp: retry the preferred certificate profile (2090dc4)
  • security: database becomes the single source of TLS trust (55198de)
  • security: seed only the Let's Encrypt roots (a6a23c5)
  • security: bundle the announced ISRG successor roots (YE/YR) (6fc95e1)
  • security: client-certificate renewal supervisor (cert-auth Phase 2) (8330efa)
  • security: EC P-256 client keys - the backend mandates it (closes G7) (465b6ad)
  • ocpp: report stored network profile slots via the device model (9913579)
  • ble: release the BLE controller memory when the CSMS disables Bluetooth - RebootRequired + idle reboot (92f48b5)
  • charging: CSMS-settable maximum charge current, and stop the pilot rounding up (d425147)
  • charging: name the binding ceiling in limitSource (3b5a164)
  • charging: report site load management separately from the power mode (2eedc81)
  • ocpp21: advertise the two 2.1 capabilities this station actually has (07a2021)
  • ocpp21: enforce the transaction limits this station can measure (5137608)
  • ocpp21: honour a charging profile's offline validity, and stamp dynUpdateTime (954928e)
  • ocpp21: honour ChargingScheduleType.useLocalTime, which costs nothing here (9643989)
  • ocpp21: honour SetVariableMonitoring.periodicEventStream (2f8ea9a)
  • ocpp21: honour the two fields AuthorizeResponse gained in 2.1 (a602bb2)
  • ocpp21: indicate web payment on the LEDs, and fix two message directions (df21355)
  • ocpp21: match a signed certificate to the CSR that asked for it (1dd6a9d)
  • ocpp21: name the signing root on SignCertificate, derived rather than guessed (158a473)
  • ocpp21: per-slot basic-auth credentials on SetNetworkProfile (7bf5205)
  • ocpp21: pull dynamic schedule updates instead of only receiving them (b1fb5d1)
  • ocpp21: report costDetails, and timeSpentCharging which was never filled in (ac66c99)
  • ocpp21: report eventNotificationType and maxElements (989afc7)
  • ocpp21: report the cost breakdown as chargingPeriods (5ba81cc)
  • ocpp21: stagger schedule period starts with randomizedDelay (7796ebf)
  • ocpp: implement GetCertificateChainStatus over CRL (a63f3e5)
  • ocpp: implement GetReport, and stop discarding CostUpdated (8960e8e)
  • ocpp: implement OCPP 2.1 dynamic schedules (6d1bb08)
  • ocpp: implement OCPP 2.1 periodic event streams (48b4b1a)
  • ocpp: implement OCPP 2.1 tariffs (5a4dd70)
  • ocpp: speak OCPP 2.1 alongside 2.0.1 (d2b764c)
  • ocpp: add native 1.6J adapter and durable transaction delivery (5dbab96)

Performance Improvements

  • ram: turn the Wi-Fi IRAM speed optimisations off - ~32 KB of internal RAM back (44a1d61)
  • db: route SQLite's allocator to PSRAM (f8cef97)