Ist der See warm genug um Baden zu gehen ? Kann ich auf der Isar Schlauchbootfahren ohne mitten im Hochwasser zu stehen ? Oder bekomme ich schnell Wasser im Keller ?

Wenn man sich eine dieser Fragen stellt, kennt man sicher den HND (Hochwassernachrichtendienst Bayern).
Hier werden unter anderem Flusspegel und Wassertemperaturen aktuell dargestellt und gespeichert.

Diese Daten wollen wir jetzt in ein SmartHome einbinden.

Warum ?

  • Push-Benachrichtigung bei Meldestufen oder selbst-definierten Pegeln.
  • vereinfachter Zugriff auf aktuelle Daten durch App, Hub usw.
  • Warum nicht ?

Ziel

Ziel ist es bestimmt Werte des HND als Sensoren in Home-Assistant zu integrieren.

Speichern der Daten ist nicht im Fokus.
Zum einen gibt es direkt beim HND vollständige historische Daten, zum Anderen kann sich darum auch HomeAssistant kümmern.

Vorraussetzungen

  • RaspberryPi
    • als MQTT Broker
    • um die Daten regelmäßig abzurufen
  • vollständige Home Assistant Installation

MQTT Broker aufsetzen

MQTT ist ein einfaches Nachrichtenprotokoll, worauf viele Smart-Home Anwendungen basieren.

Man unterscheidet zwischen Brokern und zwei verschiedenen Arten Clients (“zuhören” und senden)Alle Nachrichten laufen über den Broker, der diese verteilt.

Dazu eignet sich am Besten ein Gerät, dass 24/7 läuft. Der Broker belegt nicht viele Ressourcen.

Auf einem RaspberryPi mit fester IP im Heimnetzwerk ist eine Installation schnell erledigt.

sudo apt install mosquitto mosquitto-clients

Die Clients werden nur zu Testzwecken benötigt.

sudo systemctl enable mosquitto

Hiermit starten wir den Broker und lassen ihn automatisch bei Neustart des PIs ausführen.

Mit folgendem Befehl können wir bestätigen, dass der Broker läuft:

sudo systemctl status mosquitto

Wichtig ist die IP des Broker-PIs, diese wird im folgenden verwendet.

Python-Script zur Datenabfrage

Grundsätzlich wollen wir die Webseite mit dem entsprechenden Pegel aufrufen, die Daten herausfiltern und per MQTT im Netzwerk und damit auch für HomeAssistant zur Verfügung stellen.

Imports:

Wir brauchen als Imports ein Modul als MQTT-Client und eins um die Seite bzw. das HTML-File nach den Daten zu filtern.

import paho.mqtt.client as mqtt
import requests
from lxml import html

Für jeden „Sensor“, den wir haben wollen brauchen wir ein MQTT-Topic und die abzurufende URL. Das wird ganz einfach in einem Array gesapeichert.

urls = []
topics = []

# Messstelle 1
urls.append('URL_1')
topics.append('hnd/FLUSS/ORT')
# Messstelle 2
urls.append('URL_2')
topics.append('hnd/FLUSS/ORT')

Zum Testen ist eine Rückmeldung sinnvoll, ob wir mit dem MQTT-Broker verbunden sind.

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))

Diese Verbindung müssen wir aber zuerst initialisieren und uns am Broker anmelden.

client = mqtt.Client()
client.on_connect = on_connect
client.username_pw_set('user', 'secret_password')
client.connect("ip_des_brokers")

client.loop_start()

Jetzt kommt der spannende Teil.

Für jede angegebene Messstelle rufen wir die Seite auf. Suchen im HTML-File die Tabelle mit den aktuellen Werten und holen den Wert aus der obersten Zeile (neuester Wert). Hier tauschen wir dann noch Punkt und Komma und publishen den Wert im Eentsprechenden MQTT-Topic. Zum Abschluss gehen wir den Wert noch aus.

for i in range(len(urls)):
    page = requests.get(urls[i])
    tree = html.fromstring(page.content)

    # This will create a list of values
    values = tree.xpath('//td[@class="center"]/text()')
    values[0] = values[0].replace(",", ".")
    (rc, mid) = client.publish(topics[i], values[0], qos=1)
    print('Values: ', values)
    print(rc, mid)
    print(topics[i], values[0])

Die Ausgaben am Ende können wir nach einem Test auch rausnehmen, der Cronjob gibt uns aber eh nur Fehler aus und sagt sonst nichts.

Cronjob

In meinem Fall läuft der Cronjob alle 15 Minuten, da auch in diesem Abstand neue Messwerte kommen.

Ein Wassertemperatursensor, den ich tracke wird aber nur stündlich aktualisiert, womit der Cronjob auch nur stündlich laufen muss.

Wir legen das Skript in Home-Verzeichnis desd pi-Users im Ordner scripts ab.

*/15 * * * * /usr/bin/python /home/pi/scripts/hnd-mqtt/hnd-mqtt.py >/dev/null

Jeglicher Output außer Fehler wird so verworfen.

HomeAssistant Configuration

In HomeAssistant müssen wir nur die configuration.yaml bearbeiten.

sensor:
  - platform: mqtt
    state_topic: "hnd/FLUSS/ORT"
    name: "NAME"
    unit_of_measurement: "cm"

Dies wird für jeden Sonsor wiederholt.

Darstellung in HomeAssistant

Zur Darstellung eignen sich die mini-graph-cards aus HACS.

Als visuelle Darstellung von Warnstufen lohnt sich eine entsprechende Färbung des Graphen.

color_thresholds:
  - color: '#1c96ed'
    value: 0
  - color: '#ffff00'
    value: 280
  - color: '#ffa600'
    value: 350
  - color: '#ff0000'
    value: 450
  - color: '#b50282'
    value: 500
entities:
  - sensor.pegel_isar_puppling
hours_to_show: 48
icon: 'mdi:altimeter'
line_color: blue
name: Isar
points_per_hour: 4
show:
  graph: graph
type: 'custom:mini-graph-card'

Was kann man besser machen ?

  • Daten abrufen durch HomeAssistant ohne weiteres Gerät
  • Abruf der URLs aus Datenbank oder config-Datei

Außerdem wird noch die Benachrichtigungsfunktion folgen.