Ladestation (öffentlich) Zustandabfrage per HTTPMOD

Begonnen von Sany, 20 Dezember 2025, 13:33:45

Vorheriges Thema - Nächstes Thema

Sany

Hallo zusammen,

in dieser trüben Jahreszeit kommt quasi nix von der PV, um den Autoakku nennenswert zu laden. Nun kann ich ja direkt den Hausstrom nutzen, ist aber nicht lukrativ. Ganz in der Nähe habe ich einen Discountmarkt, der immerhine für 29ct Ladestrom anbietet. 11KW, aber nur 2 Stecker. Und wenn es so grau ist, stehen da auch öfter E-Autos und laden...
Hier https://forum.fhem.de/index.php?topic=142825.msg1350198#msg1350198 wurde schon eine Lösung gezeigt, die bei mir aber nicht funktioniert, das diese Ladesäule zwar angezigt wird, aber keine aktuellen Daten dazu. Ich habe dann rumgesucht und bin auf das hier gestossen: https://community.home-assistant.io/t/status-of-enbw-charging-stations/409573
Es beschreibt, wie über die öffentliche Ladekarte von EnbW eine Station ausgelesen werden kann. Dazu benötigt man die stationID der gewünschten Station sowie den API-Key. Beides erhält man, wenn man die Abfrage der gewünschten Station im Browser mit den Entwicklertools mitverfolgt. Der Vorgang ist im ersten Post der HA-Beschreibung genau erklärt.

Die Rückgabe der Abfrage ist ein umfangreiches JSON. Mein Versuch mit JSONMOD hat nichts gebracht, per HTTPMOD ist es aber gelungen. Hier mal meine Abfrage:

defmod Ladestation HTTPMOD https://enbw-emp.azure-api.net/emobility-public-api/api/v1/chargestations/XXXXXX 0
attr Ladestation event-on-change-reading availableChargePoints,unknownStateChargePoints,chargePoints_0._status,chargePoints_0._state_updatedTime
attr Ladestation icon electric_car_charger
attr Ladestation reading104JSON chargePoints_01_state_updatedAt
attr Ladestation reading104Name chargePoints_01_state_updatedAt
attr Ladestation reading105OExpr FmtDateTime($val / 1000)
attr Ladestation reading105JSON chargePoints_01_state_updatedAt
attr Ladestation reading105Name chargePoints_01_state_updatedTime
attr Ladestation reading109JSON chargePoints_02_evseId
attr Ladestation reading109Name chargePoints_02_evseId
attr Ladestation reading120JSON stationId
attr Ladestation reading120Name stationId
attr Ladestation reading128JSON unknownStateChargePoints
attr Ladestation reading128Name unknownStateChargePoints
attr Ladestation reading137JSON chargePoints_01_evseId
attr Ladestation reading137Name chargePoints_01_evseId
attr Ladestation reading139JSON chargePoints_02_state_updatedAt
attr Ladestation reading139Name chargePoints_02_state_updatedAt
attr Ladestation reading140OExpr FmtDateTime($val / 1000)
attr Ladestation reading140JSON chargePoints_02_state_updatedAt
attr Ladestation reading140Name chargePoints_02_state_updatedTime
attr Ladestation reading141JSON chargePoints_02_status
attr Ladestation reading141OMap OCCUPIED:belegt, AVAILABLE:_frei_
attr Ladestation reading141Name chargePoints_02_status
attr Ladestation reading164JSON chargePoints_01_status
attr Ladestation reading164OMap OCCUPIED:belegt, AVAILABLE:_frei_
attr Ladestation reading164Name chargePoints_01_status
attr Ladestation reading167JSON numberOfChargePoints
attr Ladestation reading167Name numberOfChargePoints
attr Ladestation reading170JSON availableChargePoints
attr Ladestation reading170Name availableChargePoints
attr Ladestation replacement4Mode key
attr Ladestation replacement4Regex %%key%%
attr Ladestation replacement4Value key
attr Ladestation requestHeader1 Content-Type: application/json
attr Ladestation requestHeader2 Referer: https://www.enbw.com/
attr Ladestation requestHeader3 Origin: https://www.enbw.com
attr Ladestation requestHeader4 Ocp-Apim-Subscription-Key: %%key%%
attr Ladestation requestHeader5 User-Agent: Firefox
attr Ladestation requestHeader6 Content-Length: 0
attr Ladestation room Volvo
attr Ladestation showBody 0
attr Ladestation showError 1
attr Ladestation showMatched 0
attr Ladestation stateFormat availableChargePoints / numberOfChargePoints\
<br>\
unknown: unknownStateChargePoints
Edit: Typo im Code korrigiert nach betateilchens Hinweis (reading140OExpr etc)


Die XXXXXX in der DEF-Zeile ist die StationID. Den API-Key dann mit
set Ladestation storeKeyValue key abcdefg12345
abspeichern. Der wird dann per Replacement in den Header eingebaut.

Kan natürlich sein, das bei einer anderen Station das zurückgegebene JSON auch anders aussieht. Dann empfiehlt es sich, mittels
extractAllJSON



einfach alles zurückgeben zu lassen und dann auszusortieren, was man nicht braucht.
Der Zeitstempel, ab wann ein Ladepunkt frei/belegt ist (chargePoints_0X_state_updatedAt) , kommt als UNIX Zeitangabe in 1000stel. Den gebe ich formatiert als chargePoints_01_state_updatedTime im lesbaren Format aus. Ebenso wird OCCUPIED zu belegt und AVAILABLE zu _frei_ gemapped.

Das AbfrageIntervall ist auf 0, damit nicht zyklich abgefragt wird.
Wenn ich vorhabe, zu laden, dann schicke ich per Signal ein "Wort" an mein fhem, damit wird die Abfrage freigegeben, und zwar nur zu den Öffnungszeiten (z.B. Sonn/Feiertag ist zu). Wenn beide belegt sind frage ich minütlich ab, ansonsten alle 5min. Damit erfahre ich quasi in Echtzeit, wenn ein Ladepunkt frei wurde. Kann natürlich sein, dass der auch gleich wieder belegt ist. Die Info aber per Push über Signal auf die Armbanduhr ist bequemer, als immer wieder eine App zu öffnen. Mein Auto ist auch in fhem und wenn dieses meldet, dass ein Ladekabel angeschlossen wurde (also habe ich es an die Ladestation angeschlossen) wird die Abfrage wieder gestoppt.
Damit halten sich die Abfragen in Grenzen, andererseits ist das ja nix anderes, als auf deren Website rumzuklicken, was vermutlich viele tun.....

Ohne fhem ist chargefinder.com auch eine schöne Möglichkeit. Wenn man seine Station ausgwählt hat und diese angezeigt wird dann einen Link zum Startbildschirm hinzufügen (Android) und die Seite öffnet sich gleich mit der ausgewählten Station.
Wie immer, viele Möglichkeiten, möge jeder so machen, wie er will ;)


Gruß



Sany

fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

betateilchen

Zitat von: Sany am 20 Dezember 2025, 13:33:45Mein Versuch mit JSONMOD hat nichts gebracht,

Funktioniert aber auch mit JsonMod in einem Zweizeiler 🙃

defmod gh JsonMod system://curl -H "Referer: https://www.enbw.com/" -H "Origin: https://www.enbw.com" -H "Ocp-Apim-Subscription-Key: d495..." -H "Content-Type: application/json" https://enbw-emp.azure-api.net/emobility-public-api/api/v1/chargestations/180532
attr gh readingList complete()
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Sany am 20 Dezember 2025, 13:33:45per HTTPMOD ist es aber gelungen. Hier mal meine Abfrage:

Du solltest aber besser die aktuellen Attribute von HTTPMOD verwenden und nicht die uralten.
Dann läuft auch das Log nicht mit Warnungen voll:

2025.12.21 13:15:15 1: Ladestation: the attribute reading105Expr should no longer be used. Please use reading105OExpr instead
2025.12.21 13:15:15 1: Ladestation: the attribute reading140Expr should no longer be used. Please use reading140OExpr instead
2025.12.21 13:15:16 1: Ladestation: the attribute reading141Map should no longer be used. Please use reading141OMap instead
2025.12.21 13:15:16 1: Ladestation: the attribute reading164Map should no longer be used. Please use reading164OMap instead
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Sany

ZitatFunktioniert aber auch mit JsonMod in einem Zweizeiler 🙃
Prima, dann gibts ja noch einen Weg. Ich hab immer nur irgendwelche Authorization-Fehler bekommen, hab das dann aber nicht weiterverfolgt.

Es werden mit Jsonmod dann wohl auch ein paar mehr Zeilen, wenn man nur die gewünschten Readings haben möchte. Aber auch hier: das Ziel ist das Ziel.


 
ZitatDu solltest aber besser die aktuellen Attribute von HTTPMOD verwenden und nicht die uralten.
Dann läuft auch das Log nicht mit Warnungen vo
Ah, vielen Dank für den Hinweis. Ich habe allerdings nix im Log. Verbose ist nicht gesetzt, also default.
Ich korrigier das im ersten Post.
Ich meine ich hab mit dem reading140 angefangen, daher wohl der Typo mit dem "weggelassenen" O. das fiel mir bei den weiteren dann auch nicht mehr auf. O:-)



Gruß



Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....