First stable release of ocpp-fanout: an unofficial OCPP 1.6-J fan-out in front of a single wallbox slot.
Most chargers expose one OCPP WebSocket. A local controller (MQTT / HTTP / Modbus) should still set current and phases, while backends such as Enphase, EverHome, or Monta see live data without taking over the box. ocpp-fanout sits in front of that slot: joulo-ocpp-proxy splits 1→N, dummy-csms answers as primary, and small shims keep picky secondaries alive.
This project is independent community software. It is not affiliated with, endorsed by, or supported by go-e, Enphase, everHome, Monta, Joulo, Tesla, or any other vendor.
Highlights
- One inbound WebSocket for the wallbox (
ws://<host>:9100/<chargePointId>). - Dummy primary returns CallResults so the charger stays OCPP-online. It does not originate control.
- Secondaries are read-only by default. CSMS Calls are answered locally in the shim. Only Setup-allowlisted actions are injected on the primary path (
POST /inject) so Joulo can forward them to the box. - Vendor shims (one image, three services):
- Enphase IQ Energy Router — local
GetConfiguration/TriggerMessageanswers - EverHome — WebSocket without the
ocpp1.6subprotocol - Monta — CallResults, optional
RemoteStart, transaction-id remapping
- Enphase IQ Energy Router — local
- Web UI (
http://<host>:8088/) — live packet scene, Setup for backends and allowlists, dark/light theme. - Two Compose files: full stack with healthchecks and log rotation, or a simple stack where Setup is the source of truth for CPID, URLs, and allowlists.
Install
git clone https://github.com/cbrandlehner/ocpp-fanout.git
cd ocpp-fanout
git checkout v1.0.0
cp .env.example .env
docker compose up -d --build
# or: docker compose -f docker-compose.simple.yml up -d --build| Wallbox OCPP | ws://<this-host>:9100/<CHARGE_POINT_ID> |
| Web UI | http://<this-host>:8088/ |
English: README.md. German: docs/ANLEITUNG.md.
Security
Do not publish the OCPP WebSocket or the Setup UI to the public internet. Charging current and phases belong to a local controller, not to a secondary CSMS, unless you allowlist a command.
Report vulnerabilities via GitHub private vulnerability reporting. See SECURITY.md.
What's in this tag
v1.0.0 is main at e5dd460 (Harden GitHub Actions and document private vulnerability reporting), including CI, CodeQL, Dependabot auto-merge, and the initial public tree.