HA: Werte einer beliebigen Webseite als Entität verwenden
Nachdem mein Internetzugang von Zeit zu Zeit die Verbindung verloren hat, wollte ich die Signalqualität des Kabelrouters in Home-Assistant überwachen. Mangels API, verwende ich die Verwaltungsoberfläche des Routers für die Abfrage und parse die Ausgabe in Bash. Mit diesem Ansatz können die Werte aus fast jeder Web-GUI in Home Assistant verfügbar gemacht werden.
Beispiel 1: GUI -> curl ohne einer Anmeldung und mehrere Werte mit einem Aufruf
Zunächst werfe ich einen Blick auf die Web-GUI, von der ich die Daten abfragen will. Im einfachsten Fall stellt dieser die Daten ohne Benutzeranmeldung zur Verfügung: Was bei der Vorgängerversion meines aktuellen Routers der Fall war:
Das Ziel ist die Werte der GUI in Home-Assistant zur Verfügung zu stellen:
Schritt für Schritt
Als ersten Schritt habe ich versucht, ob die Daten generell heruntergeladen werden können. Dazu habe ich den gesamten HTML-Quellcode der Seite mittels des Bash-Befehls curl und der Router-URL heruntergeladen. Für das Testen und Zusammenstellen des Befehls kann ein Linux-PC, der Home-Assistant-Docker-Container oder Linux unter Windows: WSL verwendet werden.
Erster Versuch: Herunterladen der Startseite mittels Bash-Befehl: curl
curl http://192.168.0.1
Als Antwort bekomme ich den Quellcode der Startseite, dieser beinhaltet neben dem Layout der GUI auch die Statuswerte:
Um die Werte aus dem Quellcode zu extrahieren, kann dieser an bestimmte Bash-Funktionen übergeben werden. Als Beispiel kann "grep" bestimmte Passagen aus dem Text mithilfe von Regex herauslösen. Dabei ist es auch möglich die Textblöcke zunächst grob und mittels einer näheren Definition ein weiteres Mal an "grep" zu übergeben. Die Werte aus dem dargestellten HTML-Quellcode können beispielsweise wie folgt abgerufen und extrahiert werden:
curl - Aufruf und Übergabe an grep, um die gewünschten Textpasssagen zu extrahieren:
Um mit einem Aufruf mehrere Werte auszulesen, können diese zunächst über die command_line-Platform abgerufen und später mittels Template-Sensoren als einzelne Entitäten verwendet werden.
Die Entität cablelink_channels sammelt alle Werte und trennt diese mit einem Leerzeichen.
Template-Sensoren, einzelne Werte extrahieren
Über Templates kann auf die einzelnen Werte zugegriffen werden, indem der String über dessen Leerzeichen in ein Array verwandelt wird. Die Werte des Arrays können dann über den jeweiigen Index [0], [1] ... verwendet werden:
Die min_max Platform ermöglicht es die Durchschnitts-, Maximal- oder Minimal-Werte bestimmter Entitäten in einer eigenen Entität zur Verfügung zu stellen.
Beispiel 2: Web-GUI mit Benutzeranmeldung: Technicolor Router (Salzburg AG Cablelink)
Sollte die Statusseite der WebGui erst nach einer Benutzeranmeldung aufgerufen werden können, müssen wir uns die Anmeldung in den Entwicklertools (F12) mit einem Browser (z.B. Google Chrome) näher ansehen:
Der Reiter "Network" verrät uns, wie die Daten für den Anmeldevorgang übertragen werden:
Ein Blick in die Payload zeigt uns die mittels "POST" übertragenen Formulardaten:
Umgemünzt auf einen curl-Befehl, würde die Anmeldung wie folgt aussehen:
curl -X POST http://192.168.0.1/goform/logon -d "username_login=admin&password_login=mysupersecretpassword&language_selector=en" -c cookies.txt;
Natürlich muss in der Befehlszeile das Passwort entsprechend angepasst werden. Der Parameter "-c" erzeugt eine Datei mit den für die Session verwendeten Cookies, also die Information für die stattgefundene Anmeldung. Verwenden wir diesen Parameter bei einer weiteren Abfrage, ist curl an der GUI angemeldet.
Nun können wir die Details für unsere Überwachung aus der Statusseite holen: http://192.168.0.1/st_docsis.html
Ziel ist es wieder, die Werte der Statusseite in Home Assistant zur Verfügung zu stellen:
Die folgende Befehlszeile führt eine Anmeldung durch und lädt den kompletten HTML-Sourcecode der Statusseite herunter:
Der Befehl sammelt alle Channel-Daten in einem Sensor mit Namen cablelink_channels und trennt diese mit einem Leerzeichen, entsprechende Templates können die einzelnen Werte dann extrahieren:
states("sensor.cablelink_channels").split(" ") erzeugt ein Array mit den einzelnen Werten. Die jeweiligen Werte können mit dessen Index [0], [1] extrahiert werden.
Entwicklerwerkzeuge: Template testen
Für das Testen und zusammenstellen der Templates, also das Extrahieren der einzelnen Werte helfen die Entwicklerwerkzeuge in Home-Assistant.
Unter "TEMPLATE" können die in der configuration.yaml verwendeten "value_template"-Werte getestet werden:
Ein anderes Beispiel ist der Einspeisetarif für eine PV-Anlage in Österreich. Der OeMAG-Marktpreis für das Einspeisen kann der folgenden Webseite entnommen werden: https://www.oem-ag.at/de/marktpreis. Ein Blick in die Entwicklertools des Browsers verrät den HTML-Quellcode und hilft beim Zusammenstellen des Bash-Befehls:
Mit folgendem Befehl konnte ich den Tarif auslesen:
Für einzelne Werte kann alternativ zum command_line-Senser die Integration "Scrape" verwendet werden. Scrape arbeitet mit CSS-Selektoren und kann damit einzelne Werte aus den Webseiten extrahieren:
Über die folgende Eingabemaske können die Details für den Aufruf der Webseite hinterlegt werden:
Auch wenn das Auslesen über CSS-Selektoren sicherlich einen Mehrwert bietet, können Bash-Befehle meiner Meinung nach dennoch wesentlich einfacher in einem Linux-OS getestet werden, bevor diese in Home-Assistant zum Einsatz kommen.
Fazit
Die Command-Line Platform in Home Assistant kann im Prinzip alles, was das Betriebssystem von Home Assistant zulässt. Unter anderem können Linux-Befehle bestimmte Webseiten herunterladen und deren Daten extrahieren, wodurch diese ohne entsprechenden Integration in Home Assistant zur Verfügung gestellt werden können.
Aktueller OeMAG-Marktpreis
Aktueller OeMAG-Marktpreis
erstellt:
03.10.2023
von
Bernhard
Nachdem der aktuelle Marktpreis auf www.oem-ag.at immer erst nach ein paar Tagen aktualisiert wird und die Berechnung über die E-Control ev. schon vor einem Wochenende für das nächste Quartal erfolgt, versuche ich hier die aktuellen Daten zu präsentieren:
... weiterlesen
ich versuche eine Preis von folgender Website auszulesen, mit Scrape funktioniert es nur leider kann ich diesen Wert nicht für das Energie Dashboard verwenden und bekomme eine Fehlermeldung:
Entität hat einen nicht-numerischen Status
Die folgenden Entitäten haben einen Zustand, der nicht als Zahl geparst werden kann:
sensor.wasserpreis_je_m3 (2,67)
Mit dem Link von dir welcher mir den OeMAG Preis anzeigt funktioniert es wunderbar. Könntest du mir hier weiterhelfen?
Fragen / Kommentare