Skip to content

Choose a tag to compare

@cbrandlehner cbrandlehner released this 10 Sep 15:36
· 2 commits to main since this release

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 / TriggerMessage answers
    • EverHome — WebSocket without the ocpp1.6 subprotocol
    • Monta — CallResults, optional RemoteStart, transaction-id remapping
  • 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.