Home Assistant × Joulo

    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.

    REST
    Bearer token
    JSON
    No add-on needed

    // 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
    # secrets.yaml
    joulo_token: "joulo_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    
    configuration.yaml
    # 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.

    ui-lovelace.yaml
    # 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.

    Ready to get started?

    Create a free account and connect your charger. Find your API token directly in the dashboard.