Phase 11 — Register your first chargers
You have a running stack: web, SteVe, the database, and the email Worker. Now you need to register at least one ChargeBox in SteVe and point a real (or simulated) charge point at it. Until you do, the Polaris Express dashboard has nothing to display and no transactions to authorize.
This phase wires up the OCPP side of your installation. After it, you have a charge point sending heartbeats and a row in SteVe’s charge_box table that Polaris Express can join against.
Prerequisites
Section titled “Prerequisites”- Phases 1–10 complete: stack is up, DNS resolves, TLS works, admin user can log in to Polaris Express.
- You can reach the SteVe web UI at
https://<your-steve-host>/steve/manager(orhttp://<host>:8180/steve/managerif you are running plain HTTP behind a reverse proxy). - You have the SteVe web credentials you set in
application-docker.properties(webapp.userName/webapp.password). - You have at least one of:
- A physical OCPP 1.6J charge point you can configure, or
- A charge point simulator (for example,
micro-ocpp-simulatororocpp-gocli).
- You know the ChargeBox ID the charge point will identify itself with. This is a vendor-set or operator-set string; it must be unique within SteVe.
1. Log in to SteVe
Section titled “1. Log in to SteVe”Open https://<your-steve-host>/steve/manager and sign in with the SteVe web credentials.
You should see the SteVe dashboard with Home, Data Management, Operations, Events and Certificates, and Settings in the navigation.
2. Add the ChargeBox in SteVe
Section titled “2. Add the ChargeBox in SteVe”- Go to Data Management → Charge Points → Add.
- Enter the ChargeBox ID exactly as the charge point will report it. This field is case-sensitive.
- Leave the optional metadata fields blank for now (description, location, vendor) unless you already know them — you can edit later.
- Click Add.
The new ChargeBox appears in the list with status Unknown until the first heartbeat arrives.
3. Configure the charge point
Section titled “3. Configure the charge point”Point the charge point at SteVe. The endpoint depends on the OCPP transport.
ws://<your-steve-host>:<port>/steve/websocket/CentralSystemService/<ChargeBoxId>If you are terminating TLS in front of SteVe, use wss:// and the public hostname:
wss://steve.example.com/steve/websocket/CentralSystemService/<ChargeBoxId>http://<your-steve-host>:<port>/steve/services/CentralSystemServiceBehind TLS:
https://steve.example.com/steve/services/CentralSystemServiceSet the charge point’s OCPP version to match (the URL path is the same; SteVe routes based on the protocol of the inbound message).
4. Reboot the charge point
Section titled “4. Reboot the charge point”Most charge points only re-read OCPP configuration on reboot. Power-cycle it or trigger a soft reset from the vendor UI.
Within ~30 seconds you should see a BootNotification and then Heartbeat traffic.
Configure environment variables
Section titled “Configure environment variables”No new env vars are introduced in this phase, but the following — set in earlier phases — must be correct for SteVe to be reachable by both your charge points and the Polaris Express web app.
| Variable | Default | Required | Source file |
|---|---|---|---|
STEVE_DATABASE_URL | (unset) | yes | web/.env |
STEVE_DATABASE_USER | steve | yes | web/.env |
STEVE_DATABASE_PASSWORD | (unset) | yes | web/.env |
steve.host | 0.0.0.0 | yes | application-docker.properties |
steve.context.path | steve | no | application-docker.properties |
webapp.userName | admin | yes | application-docker.properties |
webapp.password | (unset) | yes | application-docker.properties |
Polaris Express reads STEVE_DATABASE_URL to query the SteVe schema directly for ChargeBox, Connector, and transaction data. If you change SteVe’s database credentials, also update the web .env and restart the web container.
Verify
Section titled “Verify”1. Check the ChargeBox status in SteVe
Section titled “1. Check the ChargeBox status in SteVe”Go to Data Management → Charge Points. Your ChargeBox should now show:
- A recent Last Heartbeat timestamp (within the heartbeat interval).
- A non-empty OCPP Protocol column (e.g.,
OCPP1.6J).
2. Check the connector status
Section titled “2. Check the connector status”Go to Home (or Connector Status). Each physical connector on the charge point should appear with a status such as Available, Preparing, or Charging.
3. Check that Polaris Express sees the ChargeBox
Section titled “3. Check that Polaris Express sees the ChargeBox”Open the Polaris Express admin console and navigate to the chargers/locations view. The ChargeBox should appear with the same ID. If it does not appear, the web app is reading from SteVe’s database, so the most likely cause is a database connection misconfiguration.
# From the host, confirm the row exists in SteVe's DBdocker compose exec mysql mysql -usteve -p stevedb \ -e "SELECT charge_box_id, ocpp_protocol, last_heartbeat_timestamp FROM charge_box;"4. Check OCPP traffic at the wire (optional)
Section titled “4. Check OCPP traffic at the wire (optional)”docker compose logs -f steve | grep -iE 'boot|heartbeat|statusnotification'You should see incoming BootNotification and periodic Heartbeat messages.
If something goes wrong
Section titled “If something goes wrong”The charge point never connects
Section titled “The charge point never connects”- Wrong URL. The path must include
/steve/(or whatever you setsteve.context.pathto) and the correct transport segment (websocket/CentralSystemServicefor JSON,services/CentralSystemServicefor SOAP). - TLS mismatch. If your reverse proxy terminates TLS, the charge point must use
wss:///https://, notws:///http://. Some firmware silently fails the upgrade if the scheme is wrong. - WebSocket upgrade stripped. Confirm your reverse proxy forwards
UpgradeandConnectionheaders for the/steve/websocket/path. - ChargeBox ID not registered. SteVe rejects unknown IDs by default. Re-check that the ID in Charge Points matches what the charge point sends (including case).
Charge point connects but Polaris Express does not show it
Section titled “Charge point connects but Polaris Express does not show it”- Confirm
STEVE_DATABASE_URLin the web container points at the same database as SteVe. - Restart the web container after any env change:
docker compose restart web. - Check web logs for query errors against the
charge_boxtable.
Heartbeats stop arriving
Section titled “Heartbeats stop arriving”- Check that the charge point still has network reachability to your SteVe host.
- If you are behind a proxy with a short idle timeout, increase the timeout for the
/steve/websocket/path to at least 2× your heartbeat interval.
Next phase
Section titled “Next phase”You have a live ChargeBox. Next, register your first idTags and link them to users so Polaris Express can authorize charging sessions.
→ Phase 12 — Register idTags and link to users