EV charging infrastructure
OCPP is how nearly every public EV charger talks to the backend that operates it. This is a complete central system, the chargers that connect to it, and a console that shows the protocol actually happening — built to understand an integration boundary by owning both sides of it.
Charge points
Python fleet simulator and a browser-based charge point. They connect out to the server, the way real hardware does.
CSMS
Async server routing each message by negotiated version. SQLite holds sessions and transactions so a restart never loses a charge in flight.
Console
Live fleet view, session metrics, the raw wire log, and the command surface that drives chargers back down the socket.
A central system and the chargers that connect to it. Most OCPP demos implement one side and mock the other, which hides exactly the behaviour that goes wrong in the field — who reconnects, who retries, who owns the transaction when a charger reboots mid-charge.
Every frame in and out is shown as literal OCPP-J, with a per-field glossary. You can watch a StartTransaction get an id assigned, a meter value land against it, and a StopTransaction close it — rather than trusting that a green tick meant the right thing.
Sessions and transactions live in SQLite, not memory. Kill the server mid-charge and it recovers the open transaction on boot. A charger that vanishes without a StopTransaction gets its orphan reaped on a grace window instead of hanging forever.

Four simulated chargers connected over WebSocket, three mid-session. Every card is driving a real OCPP conversation — start, stop, reboot, availability and a per-connector power cap.

Three concurrent sessions. The left one is pinned at 7.4 kW by a SetChargingProfile while the others run free at 10.3 and 10.8 — the load-balancing knob doing something you can see.

Every frame both directions, filterable, with the selected one broken down field by field — what messageTypeId means, why uniqueId matters, how transactionId differs between 1.6 and 2.0.1.