Hallo zusammen,
ich möchte den Wecker (Alexa) meines Sohnes per HA einstellen. Dazu möchte ich mir den Vertretungsplan von Stundenplan24 holen, dort die Klasse meines Sohnes finden, nicht relevante Stunden (z.B. Sport Mädchen) und Ausfallstunden filtern und dann die Stundennummer der ersten verbleibenden Stunde holen. Das ganze soll per RESTfull Sensor passieren.
Die Daten bekomme ich als XML. Die Doku sagt, dass XML vom RESTfull Sensor automatisch zu JSON gewandelt und per JSONPath gefiltert werden kann/muss.
Ich habe mir testweise das XML für einen Tag geholt, bei Best XML to JSON Converter Online umgewandelt und einen JSONPath (mit try & error ) geschrieben. Das XML bzw. JSON kann ich hier nicht posten. Das ist zu lang und enthält sensible Daten aber wenn ich den JSONPath bei JSONPath Online Evaluator teste, erhalte ich das folgende String-Array:
[
"2",
"3",
"4",
"5",
"6"
]
Nun hab ich meinen REST Sensor wie folgt konfiguriert (die Schulnummer hab ich in der URL geändert):
sensor:
- platform: rest
resource_template: "https://www.stundenplan24.de/10000000/mobil/mobdaten/PlanKl{{ (now() + timedelta(days=1)).strftime('%Y%m%d') }}.xml"
name: "indiware_first_lesson"
username: !secret indiware_username
password: !secret indiware_password
authentication: basic
json_attributes_path: "$.VpMobil.Klassen.Kl[?(@.Kurz == '7a')].Pl.Std[?(@.Fa != '---' && @.Fa.__text != '---' && @.Fa != 'SPOw' && @.Fa.__text != 'SPOw')].St"
value_template: "{{ value_json[0] }}"
Meine Erwartung wäre, dass der Wert 2 (als String) aus dem oberen String-Array als Sensorwert zurückkommt. Der Sensor funktioniert so aber nicht. Im Log erhalte ich die Warnung:
Template variable warning: dict object has no element 0 when rendering '{{ value_json[0] }}'
Was mache ich hier falsch?
In diesem Zusammenhang kommt mir noch eine Frage in den Sinn: In älteren Posts hab ich einen Parameter “scan_intervall” gesehen. Den scheint es in der HA Version 2024.12 nicht mehr zu geben. Wie kann ich verhindern, dass der Sensor im Minutentakt die Daten abruft? Mir würde ja stündlich oder noch besser einmal täglich zu einer bestimmten Zeit vollkommen reichen.
Danke für eure Unterstützung und schöne Feiertage!
fion
[edit “Lösung”]
Disclaimer: Ich übernehme keine Haftung, falls eure Kinder zu spät zur Schule kommen !
Der JSONPath filtert zwar die ausgeschlossenen Zweige im JSON Baum heraus, die grundlegende Struktur (auch der übergeordneten Elemente bleibt erhalten. Man muss sich also im value_template nochmal durch den Baum hangeln, bis man an der richtigen Stelle ist. Mein value_template sieht jetzt so aus (ich hab zusätzlich eine Prüfung eingebaut, wenn kein (regulärer) Unterricht stattfindet, es also keine erste Unterrichtsstunde gibt):
value_template: >
"{% if value_json|length == 0 or value_json.VpMobil.Klassen.Kl[0].Pl.Std|length == 0 %}
{{ 0 }}
{% else %}
{{ value_json.VpMobil.Klassen.Kl[0].Pl.Std[0].St }}
{% endif %}"
Auch was das Scan Intervall angeht, habe ich einen Lösungsansatz. Es gibt eine Integration RESTful Command. Diese wird nicht permanent ausgeführt, sondern steht als Aktion zur Verfügung und kann so in Automationen verwendet werden. Nachteil, sie bietet out of the box keinen Filter. Das muss man dann mit dem Ergebnis selbst tun.