Hallo Zusammen,
ich möchte ich mal auf den aktuellen Stand bringen, was ich so zusammen mit ChatGPT und Gemini probiert habe. Für alle die mitlesen: Ja, ich weiß, dass es mit NodeRed geht, aber darauf möchte ich verzichten.
Also den Rest Sensor habe ich angelegt und der gibt auch ein “ok” zurück. Also scheint die Verbindung zu Stundenplan24.de schon einmal zu gehen.
# Stundeplan24.de
- platform: rest
authentication: basic
username: !secret rest_username
password: !secret rest_password
scan_interval: 3600
resource: "https://www.stundenplan24.de/schulnummer//wplan/wdatenk/WPlanKl_{{ now().strftime('%Y%m%d') }}.xml"
method: GET
headers:
Accept: "application/xml"
value_template: "ok"
name: "Plan 9o"
json_attributes_path: "$.WplanVp.Klassen.Kl"
json_attributes:
- St
- Fa
- Le
- Ra
Was auch funktioniert ist der/die XPath expression (getestet und XPath Tester). Mit //Kl[Kurz="9o"]/Pl/Std/Ra/text()
werden mir aus XML die Räume für die 9o angezeigt. Hier wollten sowohl ChatGPT wie auch Gemini ein “@” vor “Kurz” stellen. Damit war die Treffrate “No Match”.
Was mir aber im Moment noch Schwierigkeiten bereit, ist das aufbereiten der Daten mittels “value_template”. Sowohl ChatGPT wie auch Gemini konnten hier nicht helfen. Sobald ich eine der vorgeschlagen Templates eingebe, geht der Sensor auf “unknown”.
Beispiele sind:
{% set stunden = value.xpath('//Kl[Kurz="9o"]/Pl/Std') %}
[
{% for stunde in stunden %}
{
"stunde": "{{ stunde.xpath('St/text()')[0] }}",
"fach": "{{ stunde.xpath('Fa/text()')[0] }}",
"lehrer": "{{ stunde.xpath('Le/text()')[0] }}",
"raum": "{{ stunde.xpath('Ra/text()')[0] }}"
}{% if not loop.last %},{% endif %}
{% endfor %}
]
value_template: >
{% set stunden = value.xpath('//Kl[Kurz="9o"]/Pl/Std') %}
{
"stunde": "{{ stunden[0].xpath('St/text()')[0] }}",
"fach": "{{ stunden[0].xpath('Fa/text()')[0] }}",
"lehrer": "{{ stunden[0].xpath('Le/text()')[0] }}",
"raum": "{{ stunden[0].xpath('Ra/text()')[0] }}"
}
name: "stundenplan_9o"
json_attributes:
- stunde
- fach
- lehrer
- raum
Ich bekomme leider die Sensoren oder Attribute nicht wirklich in den Sensor rein. Die Attribute würden ja reichen. Auch der Vorschlag mit RAW Daten zu arbeiten und einen template_sensor anzulegen, hat leider im Moment nicht nicht funktioniert.
value_template: "{{ value }}"
name: "stundenplan_raw"
und dann
template:
- sensor:
- name: "Plan 9o Raum Stunde 1"
state: >
{% set xml = states('sensor.stundenplan_raw') %}
{% if '<Kl>' in xml %}
{% set klassen = xml.split('<Kl>') %}
{% for klasse in klassen %}
{% if '<Kurz>9o</Kurz>' in klasse %}
{% set stunden = klasse.split('<Std>') %}
{% if stunden[1] %}
{{ stunden[1].split('<Ra>')[1].split('</Ra>')[0] }}
{% else %}
"Keine Stunden gefunden"
{% endif %}
{% endif %}
{% endfor %}
{% else %}
"Keine Daten gefunden"
{% endif %}
oder so ähnlich. Die Daten aus der XML lassen sich im Moment nicht wirklich extrahieren. Wenn jemand noch eine Idee hat, wäre ich dankbar. Ich bin leider kein Profil im Code schreiben. endif, else und if ist okay, aber dann hört es auf . Bei “value_xpath” denke, dass funktionieren könnte, aber ChatGPT und Gemini sind (stellenweise - nicht immer) der Meinung das die XPATH Anweisung in REST und HA nicht funktioniert.
Das erst einmal zum Zwischenstand. Euch ein wunderschönes Wochenende.