Status of EnBW charging stations

I couldn’t find anything to get the status of public EnBW charging stations, so I wanted to shared my solution:

rest:
  - scan_interval: 60
    resource: https://enbw-emp.azure-api.net/emobility-public-api/api/v1/chargestations/xxxxxx
    headers:
      User-Agent: "Home Assistant"
      Ocp-Apim-Subscription-Key: XXXX
      Origin: 'https://www.enbw.com'
      Referer: 'https://www.enbw.com/'
    sensor:
      - name: Free slots
        value_template: "{{ value_json.availableChargePoints | int}}"
      - name: "Charger 1"
        value_template: "{{value_json.chargePoints | selectattr('evseId','eq','XXXXXX') | map(attribute='status') | first  }}"

You need the number/URL of the charging station and an API key. You can find both information here: Ladestationen finden

Open the development tools of your browser.
Firefox Network Monitor — Firefox Source Docs documentation
Chrome Network features reference - Chrome Developers

Have a look at the network requests and open the charging station. You will find a request to EnBW’s API, e.g. https://enbw-emp.azure-api.net/emobility-public-api/api/v1/chargestations/134057. If you look into the request headers, you can find the header Ocp-Apim-Subscription-Key. The subscription key is alphanumeric. Put both information in the code above and that’s it.

I don’t want to post it here because it is kind of a secret and with a tutorial you can get it also if it changes, but it didn’t change for over one two years.

If you want the status of a special charger (Charger 1 in the example above), you find it in the JSON. I filtered by the evseId, but you can also just select the first, second, … element in the list.

11 Likes

Thank you. I’ve been looking for something like this for a long time

The query hasn’t worked for a few days. Error 403
Solution:
The referrer must be entered in the header.

    headers:
      User-Agent: "Home Assistant REST sensor"
      Ocp-Apim-Subscription-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      Referer: 'https://www.enbw.com/'
      Origin: 'https://www.enbw.com'

Thanks!! I noticed, that it stopped working, but didn’t had time to find out why.

Hey Guys,

I saw your post and was really happy to find it to be able to use it in my HomeAssistant.
I noticed that starting a few days ago my log showed errors:

Logger: homeassistant.components.rest.data
Source: components/rest/data.py:74
Integration: RESTful (documentation, issues)
First occurred: 12. Mai 2022, 21:55:04 (6 occurrences)
Last logged: 13:16:55

Error fetching data: https://enbw-emp.azure-api.net/emobility-public-api/api/v1/chargestations/xxxxx failed with

I cant really figure out what that error tells me.
is there any way to find out what the problem is?

thanks, sttill works for me.

what i did: adapted the value template so it actually gives “frei” and “belegt” in german language :slight_smile:

        value_template: >-
          {% set t = value_json.chargePoints | selectattr('evseId','eq','DE*EBW*XXXXX') | map(attribute='status') | first %}
          {% if t == "OCCUPIED" %} belegt
          {% elif t == "AVAILABLE" %} frei
          {% endif %}
2 Likes

It magically started to work again and I can see the charging stations again.

Thank you such a sensor I was looking for and makes life easier.

Hi, I tried to config the integration, but it failed. Can you maybe post the whole configuration? I am new in that topic :slight_smile: Thank you!

Hi,
This is no integration. This is just a rest sensor.
You have to put the code snippet of the first post into your configuration.yaml.

If it failed, can you please post the error or the relevant part of the logs?

Yes, I entered that code

- platform: rest
    resource: https://enbw-emp.azure-api.net/emobility-public-api/api/v1/chargestations
    name: Ladestation
    scan_interval: 60
    headers:
      User-Agent: "Home Assistant REST sensor"
      Ocp-Apim-Subscription-Key: d4954e8b2e444fc89a89a463788c0a72
      Referer: 'https://www.enbw.com/'
      Origin: 'https://www.enbw.com'
      sensor:
      - name: Freie Ladepunkte
        value_template: "{{ value_json.availableChargePoints | int}}"
      - name: "Ladepunkt 1"
        value_template: >-
          {% set t = value_json.chargePoints | selectattr('evseId','eq','DE*ISE*E0006421') | map(attribute='status') | first %}
          {% if t == "OCCUPIED" %} belegt
          {% elif t == "AVAILABLE" %} frei
          {% endif %}
      - name: "Ladepunkt 2"
        value_template: >-
          {% set t = value_json.chargePoints | selectattr('evseId','eq','DE*ISE*E0006422') | map(attribute='status') | first %}
          {% if t == "OCCUPIED" %} belegt
          {% elif t == "AVAILABLE" %} frei
          {% endif %}```

And the system response:

and get this back 

Invalid config for [sensor.rest]: template value should be a string for dictionary value @ data[‘headers’][‘sensor’]. Got [{‘name’: ‘Freie Ladepunkte’, ‘value_template’: ‘{{ value_json.availableChargePoints | int}}’}, {‘name’: ‘Ladepunkt 1’, ‘value_template’: ‘{% set t = value_json.chargePoints | selectattr('evseId','eq','DE*ISE*E0006421') | map(attribute='status') | first %} {% if t == “OCCUPIED” %} belegt {% elif t == “AVAILABLE” %} frei {% endif %}’}, {‘name’: ‘Ladepunkt 2’, ‘value_template’: '{% set t = value_json.chargePoints | selectattr('evseId','eq','DE*ISE*E0006422') | map(attribute='stat… (See ?, line ?).

I tried it with the code from the first post and got same message.

If it failed, can you please post the error or the relevant part of the logs?

You still didn’t tell us what failed, but I have a first guess: You are using RESTful Sensor instead of RESTful.

If you want to use RESTful Sensor, you have to adapt your config. It doesn’t have the attribute sensor and it will only create one sensor. I wanted to create multiple sensors(Freie Ladepunkte, Ladepunkt 1, Ladepunkt 2) from one REST call. Therefore I used the other component.

Hello, first of all, thanks for the wonderful guide, I got it working with most of the chargers I was interested in.
However it seems some chargers don’t follow the standard template and are not returning any values. Could you please kindly help me troubleshoot it and see if the current charger status is possible to be queried?

I am using the following config to fetch the charger status:

   - scan_interval: 60
    resource: https://enbw-emp.azure-api.net/emobility-public-api/api/v1/chargestations/127327
    headers:
      User-Agent: "Home Assistant REST Sensor"
      Ocp-Apim-Subscription-Key: XXXXX
      Origin: 'https://www.enbw.com'
      Referer: 'https://www.enbw.com/'
    sensor:
      - name: Location Name - Free slots
        value_template: "{{ value_json.availableChargePoints | int}}"
        icon: mdi:ev-station
      - name: "Location Name - AC"
        icon: mdi:ev-plug-type2
        value_template: "{{value_json.chargePoints | selectattr('evseId','eq','SK*EON*E21010015*1') | map(attribute='status') | first  }}"
      - name: "Location Name - CHAdeMO"
        icon: mdi:ev-plug-chademo
        value_template: "{{value_json.chargePoints | selectattr('evseId','eq','SK*EON*E21010015*2') | map(attribute='status') | first  }}"
      - name: "Location Name  - CCS"
        icon: mdi:ev-plug-ccs2
        value_template: "{{value_json.chargePoints | selectattr('evseId','eq','SK*EON*E21010015*3') | map(attribute='status') | first  }}"

My HomeAssistang logs give me the following errors:

Logger: homeassistant.helpers.template
Source: helpers/template.py:735
First occurred: 4:58:06 PM (72 occurrences)
Last logged: 5:21:06 PM`
>`Template variable warning: No first item, sequence was empty. when rendering '{{value_json.chargePoints | selectattr('evseId','eq','SK*EON*E21010015*1') | map(attribute='status') | first }}'
Template variable warning: No first item, sequence was empty. when rendering '{{value_json.chargePoints | selectattr('evseId','eq','SK*EON*E21010015*2') | map(attribute='status') | first }}'
Template variable warning: No first item, sequence was empty. when rendering '{{value_json.chargePoints | selectattr('evseId','eq','SK*EON*E21010015*3') | map(attribute='status') | first }}'`

It seems the response is not delivering on the expected “FIRST” content, however I can’t seem to be able to show the response in plaintext, to be able to troubleshoot this.
Any suggestions, please?

Where did you get the evseIds(SK*EON*E21010015*1, SK*EON*E21010015*2, SK*EON*E21010015*3) from? They look different that the others here. Normally the last number is ascending, e.g. *SK*EON*E21010015, SK*EON*E21010016, and SK*EON*E21010017.

You can use your Browsers developer tools to see the full response when you open the EnBW map with all charging stations.

EDIT: I just noticed that there are in fact a lot of evseIds with *1 and *2 at the end. So this is also a common format.

UPDATE: Nevermind, I found the culprit. I had the same site ID in my config for 2 different sites. When corrected, the status now updates correctly. Thanks for your time and help! You are the best!
Leaving my original post below, in case someone stumbles upon the same issue with reading the raw response.

I got the ID Numbers from the EnBW website, as you can see in the screenshot below:
image

When looking at the source code of the response, I fail to see a difference between the 2 sites below:

This is an example site where current status is reported by HA correctly. Note it has a similar ID format with *1 and *2 at the end.
image

And this is the site where the current status is empty:
image

I am new to HA and have very little programming experience. I managed to create the sensor in configuration.yaml, but I have no idea how to use it in HA. Does anyone have a tutorial or a tip? Google didn’t really get me anywhere.

Hi @Dennse, what do you want to do with the sensor, e.g.

It is impossible to help you, if you do not tell us what you want to do with the sensor.

I only show the status on my car dashboard. I plan to add some automation, if the car’s battery is empty and a charger is free, but I didn’t had the time to do it since I don’t need it so often.

Just dropping my code here:

rest:
  - scan_interval: 60
    resource: https://enbw-emp.azure-api.net/emobility-public-api/api/v1/chargestations/XXX
    headers:
      User-Agent: "Home Assistant"
      Ocp-Apim-Subscription-Key: "XXX"
      Origin: "https://www.enbw.com"
      Referer: "https://www.enbw.com/"
    sensor:
      - name: LIDL - Freie Ladepunkte
        value_template: "{{ value_json.availableChargePoints | int}}"
        unique_id: "charger_lidl_freie_ladepunkte"
        unit_of_measurement: ""
      - name: "LIDL - Ladepunkt 1"
        value_template: >-
          {% set t = value_json.chargePoints | selectattr('evseId','eq','DE*LDL*XXX') | map(attribute='status') | first %}
          {% if t == "OCCUPIED" %} 🚘
          {% elif t == "AVAILABLE" %} 🅿️
          {% elif t == "OUT_OF_SERVICE" %} ❌
          {% else %} "{{ t }}"
          {% endif %}
        unique_id: "charger_bv_ladepunkt1"
      - name: "LIDL - Ladepunkt 2"
        value_template: >-
          {% set t = value_json.chargePoints | selectattr('evseId','eq','DE*LDL*XXX') | map(attribute='status') | first %}
          {% if t == "OCCUPIED" %} 🚘
          {% elif t == "AVAILABLE" %} 🅿️
          {% elif t == "OUT_OF_SERVICE" %} ❌
          {% else %} "{{ t }}"
          {% endif %}
        unique_id: "charger_lidl_ladepunkt2"

unit_of_measurement is important to get Home Assistant in the mood to generate graphs.

unique_id helps when editing stuff via the ui.

Cards show last change of the property as subtext.

type: entities
entities:
  - entity: sensor.lidl_freie_ladepunkte_2
    secondary_info: last-changed
    name: Freie Ladepunkte
    icon: mdi:ev-station
  - entity: sensor.lidl_ladepunkt_1
    name: Ladepunkt 1
    icon: mdi:ev-plug-ccs2
    secondary_info: last-changed
  - entity: sensor.lidl_ladepunkt_2
    secondary_info: last-changed
    name: Ladepunkt 2
    icon: mdi:ev-plug-ccs2
title: 🔋 Ladesäulen LIDL
state_color: false
theme: Mushroom
footer:
  type: graph
  entity: sensor.lidl_freie_ladepunkte
  detail: 2
show_header_toggle: false

3 Likes

It can be done on several ways. My way was to make a sensor for each attribute.
Json response is in German, I translated some to Dutch.

Make a new folder in Home Assistant named :

REST

Add this line in configuration.yaml :

rest: !include_dir_merge_list REST/

Create in folder ‘REST’ a file with a recognizable name for the charge station, like :

rest_pietjepukstraat_1_bogusstad.yaml

Add the following to secret.yaml :

enwb_subscription_key: "d4954e8b2e444fc89a89a463788c0a72"
enwb_origin: "https://www.enbw.com"
enwb_referer: "https://www.enbw.com/"
enwb_api_uri_**vervang_voor_naam_adres**: LINK TO CHARGE STATION

Subscription key, origin and referer are always the same.

For multiple charge stations, add multiple .yaml-files in the folder ‘REST’ and don’t forget to add additional ‘enwb_api_uri_vervang_voor_naam_adres’ in secret.yaml file.

Then fill up the files with the right information, change the lines with ** :

- scan_interval: 60
  resource: !secret enwb_api_uri_**vervang_voor_naam_adres**
  headers:
    User-Agent: "Home Assistant"
    Ocp-Apim-Subscription-Key: !secret enwb_subscription_key
    Origin: !secret enwb_origin
    Referer: !secret enwb_referer
  sensor:
    - name: "Oplaadstation : **VERVANGVOORADRESNAAM**, laadpaal links, Status"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).status|replace('_',' ')|lower|replace('occupied','❌')|replace('available','🅿️')|replace('out of service','❌')|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links_status"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Connectors-Max Power In Kw"
value_template: "{{ ((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).connectors | first).maxPowerInKw|int }}"
      unit_of_measurement: "kWh"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links_connectors_maxpowerinkw"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Connectors-Charge Plug Type Group"
      value_template: "{{ ((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).connectors | first).chargePlugTypeGroup|replace('_',' ')|lower|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links_connectors_chargeplugtypegroup"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Connectors-Plug Type Name"
      value_template: "{{ ((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).connectors | first).plugTypeName|lower|replace('typ 2','type 2')|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links_connectors_plugtypename"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Connectors-Cable Attached"
      value_template: "{{ ((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).connectors | first).cableAttached|lower|replace('true','ja')|replace('false','nee')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links_connectors_cableattached"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Station Number"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).stationNumber }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Charge Point Number"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).chargePointNumber }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Charge Point Label"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).chargePointLabel }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Handicapped Accessible"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).handicappedAccessible }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Connectors-Tariff Info-Tariff Group"
      value_template: "{{ (((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).connectors | first).tariffInfo | first).tariffGroup }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links_connectors_tariffinfo_tariffgroup"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Connectors-Tariff Info-Tariff Description"
      value_template: "{{ (((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).connectors | first).tariffInfo | first).tariffDescription }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links_connectors_tariffinfo_tariffdescription"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal links, Connectors-Tariff Info-Tariff Payment Text"
      value_template: "{{ (((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER1**') | first).connectors | first).tariffInfo | first).paymentText }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_links_connectors_tariffinfo_paymenttext"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Status"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).status|replace('_',' ')|lower|replace('occupied','❌')|replace('available','🅿️')|replace('out of service','❌')|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts_status"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Connectors-Max Power In Kw"
      value_template: "{{ ((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).connectors | first).maxPowerInKw|int }}"
      unit_of_measurement: "kWh"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts_connectors_maxpowerinkw"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Connectors-Charge Plug Type Group"
      value_template: "{{ ((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).connectors | first).chargePlugTypeGroup|replace('_',' ')|lower|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts_connectors_chargeplugtypegroup"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Connectors-Plug Type Name"
      value_template: "{{ ((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).connectors | first).plugTypeName|lower|replace('typ 2','type 2')|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts_connectors_plugtypename"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Connectors-Cable Attached"
      value_template: "{{ ((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).connectors | first).cableAttached|lower|replace('true','ja')|replace('false','nee')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts_connectors_cableattached"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Station Number"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).stationNumber }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Charge Point Number"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).chargePointNumber }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Charge Point Label"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).chargePointLabel }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Handicapped Accessible"
      value_template: "{{ (value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).handicappedAccessible }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Connectors-Tariff Info-Tariff Group"
      value_template: "{{ (((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).connectors | first).tariffInfo | first).tariffGroup }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts_connectors_tariffinfo_tariffgroup"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Connectors-Tariff Info-Tariff Description"
      value_template: "{{ (((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).connectors | first).tariffInfo | first).tariffDescription }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts_connectors_tariffinfo_tariffdescription"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, laadpaal rechts, Connectors-Tariff Info-Tariff Payment Text"
      value_template: "{{ (((value_json.chargePoints | selectattr('evseId','eq','**VERVANGVOORLAADPUNTNUMMER2**') | first).connectors | first).tariffInfo | first).paymentText }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_laadpaal_rechts_connectors_tariffinfo_paymenttext"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Operator"
      value_template: "{{value_json.operator|replace('Niederlande','Nederland')}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_operator"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Operator Code"
      value_template: "{{value_json.operatorCode}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_operatorCode"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Grouped"
      value_template: "{{value_json.grouped|lower|replace('true','ja')|replace('false','nee')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_grouped"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Price Group"
      value_template: "{{value_json.priceGroup|replace('_',' ')|lower|replace('default group','standaard groep')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_pricegroup"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Short Address"
      value_template: "{{value_json.shortAddress}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_shortaddress"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Lattitude"
      value_template: "{{value_json.lat}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_lattitude"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Longitude"
      value_template: "{{value_json.lon}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_longitude"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Number Of Charge Points"
      value_template: "{{value_json.numberOfChargePoints|int}}"
      unit_of_measurement: ""
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_numberofchargepoints"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Unknown State Charge Points"
      value_template: "{{value_json.unknownStateChargePoints}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_unknownstatechargepoints"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Station Id"
      value_template: "{{value_json.stationId|int}}"
      unit_of_measurement: ""
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_stationid"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Plug Types"
      value_template: "{{value_json.plugTypes|join(', ')|replace('_',' ')|lower|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_plugtypes"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Favorite"
      value_template: "{{value_json.favorite|lower|replace('true','ja')|replace('false','nee')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_favorite"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Always Open"
      value_template: "{{value_json.alwaysOpen|lower|replace('true','ja')|replace('false','nee')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_alwaysopen"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Authentication Methods"
      value_template: "{{value_json.authenticationMethods|join(', ')|replace('_',' ')|lower|replace('remote','vanaf afstand')|replace('others','anders')|replace('charge card','creditcard')|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_authenticationmethods"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Hidden With Active Profile"
      value_template: "{{value_json.hiddenWithActiveProfile|replace('None','Niet van toepassing')|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_hiddenwithactiveprofile"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Station Summary"
      value_template: "{{value_json.stationSummary|lower|replace('ladestation details','details oplaadstation')|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_stationsummary"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Additional Info"
      value_template: "{{value_json.additionalInfo|replace('Free publicly accessible','Openbaar laadstation')}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_additionalinfo"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Restrictions"
      value_template: "{{value_json.restrictions|replace('None','Niet van toepassing')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_restrictions"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Opening Hours"
      value_template: "{{value_json.openingHours|replace('None','Niet van toepassing')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_openinghours"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Tariff Informations"
      value_template: "{{value_json.tariffInformations|first|replace('Die angezeigten Preise gelten unabhängig von den Betreiber-Informationen bei der Verwendung der App oder der Ladekarte von EnBW mobility+. Alle Preise inkl. gesetzlicher MwSt.','De weergegeven prijzen gelden ongeacht de operatorinformatie bij gebruik van de app of de EnBW Mobility+ laadpas. Alle prijzen zijn inclusief wettelijke BTW.')}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_tariffinformations"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Parking Fee Descriptions"
      value_template: "{{value_json.parkingFeeDescriptions|lower|replace('*bitte unsere blockiergebühr beachten','')|replace('ab','per')|replace('pro minute','per minuut,')|replace('maximal:','met een maximum')|replace('bis','van')|replace('ac','AC')|replace('dc','DC') }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_parkingfeedescriptions"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** SupportInfo-Support HotLine"
      value_template: "{{value_json.supportInfo.supportHotLine|replace('+31','0')}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_supportinfo-supporthotline"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Opening Times-Regular Hours"
      value_template: "{{value_json.openingTimes.regularHours|replace('None','Niet van toepassing')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_openingtimes_regularhours"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Opening Times-Twenty Four Seven"
      value_template: "{{value_json.openingTimes.twentyFourSeven|replace('None','Niet van toepassing')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_openingtimes_twentyfourseven"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Opening Times-Closed On Holidays"
      value_template: "{{value_json.openingTimes.closedOnHolidays|replace('None','Niet van toepassing')|capitalize}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_openingtimes_closedonholidays"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Opening Times-Next Opening Time"
      value_template: "{{value_json.openingTimes.nextOpeningTime|replace('None','Niet van toepassing')|capitalize }}"
unique_id: "oplaadstation_**vervang_voor_naam_adres**_openingtimes_nextopeningtime"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Opening Times-Next Closing Time"
      value_template: "{{value_json.openingTimes.nextClosingTime|replace('None','Niet van toepassing')|capitalize }}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_openingtimes_nextclosingtime"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** View Port-Lower Left Lattitude"
      value_template: "{{value_json.viewPort.lowerLeftLat}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_viewport_lowerleftlattitude"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** View Port-Lower Left Longitude"
      value_template: "{{value_json.viewPort.lowerLeftLon}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_viewport_lowerleftlongitude"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** View Port-Upper Right Lattitude"
      value_template: "{{value_json.viewPort.upperRightLat}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_viewport_upperrightlattitude"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** View Port-Upper Right Longitude"
      value_template: "{{value_json.viewPort.upperRightLon}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_viewport_upperrightlongitude"
    - name: "Oplaadstation  **VERVANGVOORADRESNAAM** Distance To My Position In KM"
      value_template: "{{value_json.distanceToMyPositioninKm}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_distancetomypositioninkm"
    - name: "Oplaadstation :  **VERVANGVOORADRESNAAM**, vrije laadpalen"
      value_template: "{{ value_json.availableChargePoints | int}}"
      unique_id: "oplaadstation_**vervang_voor_naam_adres**_vrije_laadpalen"
      unit_of_measurement: ""

image

Another handy little information… rate limit is about 666 milliseconds…
Calculated by multiple times ‘time / api_calls_till_authentication_failure’ (and vice versa).

Notice that you don’t create multiple rest calls with the same scan_interval.
If I had to do it, I would do it this way :

first charge station, scan_interval: 3
second charge station, scan_interval: 5
third charge station, scan_interval: 8
fourth charge station, scan_interval: 11
fifth charge station, scan_interval: 13
sixth charge station, scan_interval: 14
seventh charge station, scan_interval: 17

This way they don't interfere much with eachother...
3, 6, 9, 12, 15, 18, 21, 24, 27, 30,33,36,39,42,45,48,51,54,57,60,63,66,69,72...
5, 10, 15, 20, 25, 30, 35,40,45,50,55,60,65,70...
8, 16, 24, 32, 40, 48,56,64,72...
11, 22, 33, 44, 55,66,...
13, 26, 39, 52, 65...
14, 28, 42, 56, 70...
17, 34, 51, 68...
...

You can create wonderfull mapconfigurations with these sensors, I kept it simple and used the code someone posted in the previous post :

show_name: true
show_icon: false
show_state: true
type: glance
entities:
  - entity: sensor.oplaadstation_**vervang_voor_naam_adres1**_laadpaal_links_status
    name: **VERVANGVOORADRESNAAM1**, links
  - entity: sensor.oplaadstation_**vervang_voor_naam_adres1**_laadpaal_rechts_status
    name:** VERVANGVOORADRESNAAM1**, rechts
  - entity: sensor.**vervang_voor_naam_adres2**_laadpaal_links_status
    name: **VERVANGVOORADRESNAAM2**, links
  - entity: sensor.**vervang_voor_naam_adres2**_laadpaal_rechts_status
    name: **VERVANGVOORADRESNAAM2**, rechts
  - entity: sensor.oplaadstation_**vervang_voor_naam_adres3**_laadpaal_links_status
    name: **VERVANGVOORADRESNAAM3**, links
  - entity: sensor.oplaadstation_**vervang_voor_naam_adres3**_rechts_status
    name: **VERVANGVOORADRESNAAM3**, rechts
state_color: true
columns: 2

Another simpler way is to get the links from : https://www.oplaadpalen.nl/

There is no API key and headers needed.