RESTfull Sensor JSONPath und value_template

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 :slight_smile: ) 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 :wink:!

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.

Hallo @fion ,

dein Beitrag ist sehr interessant. Ich bin an einer ähnlichen Lösung interessiert. Ich möchte den Stundenplan aus der “extrahieren”. Leider bin ich beim Programmieren mit value_template und den Sensoren nicht wirklich fit.

Mein letzter Beitrag ist hier. Kannst du mir evtl. einen Tipp geben?

Ziel soll sein, die XML zu durchsuchen und die Stunden / Fach / Lehrer und Raum in HA anzeigen zu lassen. Sinnvoll vielleicht einen Sensor (Plan9o) und die Daten dann als Attribute.

Für deine Hilfe und deine Tipps wäre ich dankbar. :wink:

Hallo @Ronny1978,

leider funktioniert bei mir der Sensor noch nicht richtig. value_json gibt mir immer noch nicht den korrekten Wert.

Wenn du nicht nur ein bestimmtes Attribut, sondern den kompletten Stundenplan haben möchtest, musst du im JSONPath nur den letzten Teil (“.St”) weglassen, den Filter für die Klasse und für die nicht relevanten Stunden anpassen.

Ich hab mal den Plan vom 8.1. von meinem Sohn (Klasse 7a) geholt. Wenn ich den folgenden JSONPath anwende,

$.VpMobil.Klassen.Kl[?(@.Kurz == '7a')].Pl.Std[?(@.Fa != '---' && @.Fa.__text != '---' && @.Fa != 'SPOw' && @.Fa.__text != 'SPOw')]

bekomme ich dieses Ergebnis (die Lehrer hab ich in AAA geändert):

[
  {
    "St": "3",
    "Fa": "MA",
    "Le": "AAA",
    "Ra": "2.14",
    "Nr": "120",
    "If": ""
  },
  {
    "St": "4",
    "Fa": "MA",
    "Le": "AAA",
    "Ra": "2.14",
    "Nr": "120",
    "If": ""
  },
  {
    "St": "5",
    "Fa": "SPOm",
    "Le": "AAA",
    "Ra": {
      "_RaAe": "RaGeaendert",
      "__text": "TH1"
    },
    "Nr": "124",
    "If": ""
  },
  {
    "St": "6",
    "Fa": "SPOm",
    "Le": "AAA",
    "Ra": {
      "_RaAe": "RaGeaendert",
      "__text": "TH1"
    },
    "Nr": "124",
    "If": ""
  }
]

“St” ist die Stunde, “Fa” das Fach, “Le” der Lehrer, “Ra” der Raum. Der Rest ist uninteressant. Wichtig ist, wenn es in einem Attribut Abweichungen vom regulärem Plan gibt, wird das wie in Stunde 5 und 6 bei Raum dargestellt. “_RaAe” kannst du ignorieren, “__text” ist dann der neue Wert. Auch wenn es Änderungen beim Fach oder Lehrer gibt, wird das so dargestellt. Deswegen steht im Filter für die nicht relevanten Stunden auch immer alles doppelt drin.

Wie du die Werte dann in Attribute packst, musst du mal ausprobieren. Ich hab das auch noch nicht gemacht aber die Doku zum RESTful Sensor hat dafür Beispiele.

Wie das dann in der Oberfläche dargestellt werden kann, kann ich dir nicht sagen. Damit hab ich mich noch nicht beschäftigt.

Lass uns gerne an deinen Ergebnissen teilhaben. Vielleicht können die Experten im Forum noch weitere Tipps geben.

cu, fion

1 „Gefällt mir“

Danke für deine Tipps. Ich dachte, du hättest es schon am Laufen :wink: . Na ich schaue mal, wie weit ich mit REST noch komme. Hier muss ich mir das Programmierwissen ergooglen. Wenn ich was weiß, werde ich es teilen.

Danke dir und eine schöne Restwoche.

So @fion : Ich bin jetzt soweit und habe alles mit RESTFUL lösen können. Da ich nicht das Forum mit doppelten Beiträgen sprengen möchte und ggf. dann Ärger mit den Admins bekommen, hier der Link zur detaillierten Beschreibung.

Viel Erfolg.

Ronny

1 „Gefällt mir“