Charging sessions, ERE and status in Home Assistant
Joulo provides a REST API with the same data as your dashboard. A single YAML block in your configuration.yaml gives you sensors for charging status, kWh per session, total ERE credits and the active TAG ID.
// what you get
Four data streams, one token
The Joulo REST API exposes three endpoints. On top of those you can build as many Home Assistant sensors as you need — status, energy, sessions and EVCC linking.
Realtime status
GET /chargers • status of each charger, whether it is actively charging and the kWh accumulated in the current session.
Sessions
GET /sessions • list of recent charging sessions with kWh, start and end time, and the ERE credits per session.
Energy & ERE
GET /energy • total charged kWh and accrued ERE credits. Ideal for single-number indicators on your dashboard.
EVCC TAG ID
current_session.id_tag • the RFID/TAG ID behind the active session. Paste it into EVCC so it knows which vehicle is charging.
// setup
Up and running in four steps
The integration uses Home Assistant's built-in rest: integration. No custom component, no HACS — just YAML.
01 • Generate API token
Log in to your Joulo dashboard and open the API tab. Activate the API and copy the token. It's read-only — Joulo cannot write to your Home Assistant.
02 • secrets.yaml
Paste the token into secrets.yaml under the key joulo_token. Configuration.yaml then references it safely as !secret joulo_token.
03 • configuration.yaml
Add the rest: block below. The three endpoints (chargers, energy, sessions) together expose every sensor you need.
04 • Restart Home Assistant
Do a full restart (not just YAML reload). After a minute the Joulo entities show up in Developer Tools → States.
// configuration
Copy-paste YAML
Paste this into your configuration.yaml. Change [0] to an index or slug if you run multiple chargers.
# secrets.yaml joulo_token: "joulo_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# configuration.yaml — Joulo sensors
rest:
- resource: https://api.joulo.nl/functions/v1/api/chargers
scan_interval: 60
headers:
Authorization: "Bearer !secret joulo_token"
sensor:
- name: "Joulo Charger Status"
value_template: "{{ value_json.chargers[0].status }}"
- name: "Joulo Is Charging"
value_template: "{{ value_json.chargers[0].is_charging }}"
- name: "Joulo Session kWh"
value_template: >-
{{ value_json.chargers[0].current_session.kwh_so_far | default(0) }}
unit_of_measurement: "kWh"
device_class: energy
# RFID/TAG-ID van de actieve sessie — handig voor EVCC om
# de auto achter de sessie te identificeren.
- name: "Joulo Active TAG ID"
value_template: >-
{{ value_json.chargers[0].current_session.id_tag | default('') }}
- resource: https://api.joulo.nl/functions/v1/api/energy
scan_interval: 3600
headers:
Authorization: "Bearer !secret joulo_token"
sensor:
- name: "Joulo Total kWh"
value_template: "{{ value_json.total_kwh }}"
unit_of_measurement: "kWh"
device_class: energy
- name: "Joulo Total ERE"
value_template: "{{ value_json.total_ere_credits }}"
- resource: https://api.joulo.nl/functions/v1/api/sessions?limit=10
scan_interval: 600
headers:
Authorization: "Bearer !secret joulo_token"
sensor:
- name: "Joulo Last Session kWh"
value_template: "{{ value_json.sessions[0].kwh }}"
unit_of_measurement: "kWh"
device_class: energy
- name: "Joulo Last Session ERE"
value_template: "{{ value_json.sessions[0].ere_credits | default(0) }}"
// dashboard
Lovelace card in five lines
A basic entities card shows the key Joulo sensors. Swap for a gauge, history-graph or mini-graph card for a richer view.
# Lovelace dashboard kaart
type: entities
title: Joulo laadstation
entities:
- entity: sensor.joulo_charger_status
name: Status
- entity: binary_sensor.joulo_is_charging
name: Laadt nu
- entity: sensor.joulo_session_kwh
name: Huidige sessie
- entity: sensor.joulo_total_kwh
name: Totaal geladen
- entity: sensor.joulo_total_ere
name: ERE-credits
// automations
Two automation recipes
What you do with the data is up to you. Two common patterns you can use directly:
Push notification when session ends
# automations.yaml — notify wanneer sessie eindigt
- id: joulo_session_done
alias: "Joulo • sessie afgerond"
trigger:
- platform: state
entity_id: binary_sensor.joulo_is_charging
from: "on"
to: "off"
action:
- service: notify.mobile_app_jouw_telefoon
data:
title: "Laadsessie klaar"
message: >-
{{ states('sensor.joulo_session_kwh') }} kWh geladen.
Totaal vandaag: {{ states('sensor.joulo_total_kwh') }} kWh.
EVCC vehicle ID via TAG ID
# evcc.yaml — gebruik de Joulo TAG-ID voor auto-identificatie
vehicles:
- name: tesla
type: template
template: tesla
identifiers:
# Plak hier de waarde van sensor.joulo_active_tag_id na een
# eerste laadsessie. EVCC herkent dan welke auto er laadt.
- "DEADBEEF12345678"
// troubleshooting
If entities stay empty
401 Unauthorized
Token not copied correctly, or quotes wrap the token in secrets.yaml. Remove them, restart Home Assistant and check the log.
unavailable / unknown
value_template can't find the value — usually because no session is active yet. Use | default(0) or | default('') as in the example.
Multiple chargers
The response is an array. Replace chargers[0] with chargers[1], or filter by slug with chargers | selectattr('slug', 'eq', 'my-charger') | first.
Rate limiting
Keep scan_interval at 60 s or higher for /chargers and 600 s or higher for /sessions and /energy. Polling faster doesn't give you more data — Joulo syncs from the upstream provider every 15 min.
Related pages
proxy.joulo.nl (guide)
Hosted OCPP proxy: WebSocket URL, CSMS + Joulo.
Joulo for developers
Overview of all tools, APIs and integrations.
OCPP connection
Connect any OCPP 1.6J charger to Joulo.
OCPP Proxy / Splitter
Open-source proxy for multiple backends.
Hosted OCPP Proxy
Use proxy.joulo.nl without self-hosting.
OCPP API
OCPP WebSocket integration and configuration.
Platform status
Realtime status of all Joulo services.
Developer Docs
Quickstart, authentication, guides and REST API reference.
status.joulo.nl
Realtime status of all Joulo services.
Ready to get started?
Create a free account and connect your charger. Find your API token directly in the dashboard.