Schlagwort: python

Waveshare Modbus Relais in Homeassistant

In diesem Beitrag möchte ich dir zeigen, wie ich ein 8-fach Modbus Relais von Waveshare in Homeassistant eingebunden habe.

Material

Aufbau

Der Aufbau ist nicht kompliziert. Die Anschlüsse A+, B- und GND müssen mit den entsprechend gleichnamigen Anschlüssen am Relais verbunden werden. Dann ist nur noch eine Spannungsversorgung für das Relais notwendig und man kann loslegen.

Mitgelieferte Software

Im Waveshare Wiki findet man neben zahlreichen Beispielen auch einen Beispielcode in Python. Dieser sendet die Daten direkt über „serial“ an das Modbus Relais und zur Berechnung der Paritätsbytes wird ebenfalls ein eigenes Pythonmodul mitgeliefert. Das ist etwas umständlich, da es für Modbus bereits fertige Pythonmodule wie minimalmodbus gibt.

Steuerung mit Minimalmodbus

Nach der Installation mit

kann das Modul verwendet werden. Folgendes wäre ein Beispielcode:

In Zeile 3 wird der Pfad zum USB -> Modbus Konverter und die ID des Relais angegeben. Die ID wird in den meisten Fällen 1 sein. Bei mir habe ich sie aber geändert, da am selben Modbus auch ein Stromzähler hängt, der die ID 1 bekommen hat. Mit den Funktionen get_relais() und set_relais(relais, on/off) kann man jetzt die Relais schalten und deren Status abfragen.

Einbindung in Homeassistant

Um das Modbus Relais in Homeassistant einzubinden, verwende ich MQTT. Dieses sollte bereits installiert und eingebunden sein. Mein Code sieht dann folgendermaßen aus:

Hinzu kommt jetzt die Anbindung an MQTT. Wichtig ist dabei

  • Z. 8: Siehe oben
  • S. 23+25: Hier werden die Statuswerte der Relais an MQTT gesendet
  • Z. 29: Hier wird das MQTT Topic subscribed, an das nachher die Befehle zum setzen gesendet werden
  • Z. 43: Hier findet die Verbindung zum MQTT Broker statt

In Homeassistant verwende ich nun folgende Konfiguration:

Jetzt kann ich die Relais auch in Homeassistant schalten. Dabei muss das Pythonskript dauerhaft laufen, was man bspw. mit einer systemd Service Unit erreicht.

Gleichzeitig Modbus Relais und Stromzähler auslesen

Da ich, wie bereits erwähnt, einen Stromzähler und Relais an einem Modbus hängen habe und immer nur ein Programm auf den Modbus zugreifen kann, muss ich im selben Skript auch den Stromzähler auslesen. Das Skript dazu sieht so aus:

Hinzu kommt hier die Verbindung zur Influx Datenbank (Z. 12) und das eigentliche Auslesen des Stromzählers ab Z. 57. Es werden auch noch andere Stromzähler, die über Tasmota angebunden sind, ausgelesen, um einige Werte zu berechnen. Wichtig hier ist auch die Variable relais_freigabe, die dafür sorgt, dass wenn gerade der Stromzähler ausgelesen wird, mit dem Setzen des Relais noch kurz gewartet wird, da dies nicht gleichzeitig passieren kann.

Bildquelle: waveshare.com, wikipedia.org

Shelly Plug S in Grafana visualisieren

Wenn man Strom sparen möchte, ist es vorteilhaft zu wissen, welche Geräte wann wie viel Strom verbrauchen. Um das herauszufinden, gibt es Messsteckdosen, die man zwischen Steckdose und Stecker stecken kann, um den Stromverbrauch zu messen. Eine Möglichkeit dafür ist die Shelly Plug S. Diese Steckdose lässt sich per App bedienen. Dort kann man neben der aktuellen Leistung auch den Stromverbrauch sehen. Ein Diagramm, welches die Leistung über einen Zeitraum angibt, gibt es hier aber leider nicht. Und außerdem ist die Steckdose in dieser Form von der Cloud abhängig – das möchte auch nicht jeder.

Was ich an Shellys gut finde, ist, dass man sie auch völlig Lokal per Webinterface oder MQTT bedienen kann. Theoretisch kann man auf den meisten von ihnen sogar eine eigene Firmware flashen (Info dazu hier: https://templates.blakadder.com/index.html ), aber das wäre mir an dieser Stelle zu viel.

Material

Installation von MQTT

Auf dem Server müssen wir einen MQTT Server installieren, an den die Shelly die Daten senden kann:

Konfiguration der Shelly

Die Shelly macht bei ersten Start einen Hotspot auf, mit dem man sich beispielsweise mit dem Handy verbinden kann. Im Browser gibt man dann die Adresse http://192.168.33.1 ein, wo man dann die Zugangsdaten zum WLAN eingeben kann. Danach startet die Shelly neu und man kann nun das Webinterface aus dem Heimnetz öffnen und dort sämtliche Einstellungen vornehmen.

Unter „Internet & Security“, „Advanced Developer Settings“ gibt es hier den Punkt „Enable action execution via MQTT“. Diesen aktivieren wir und geben dann unter „Server“ die IP-Adresse des Servers und den Port (Standard ist 1883) an. Danach das Speichern nicht vergessen!

Shelly MQTT Einstellungen

Eine andere wichtige Einstellung wäre noch unter dem Punkt „Settings“ „POWER ON DEFAULT MODE“, also was passieren soll, wenn die Shelly mal keinen Strom mehr bekommt (z.B. bei einem Stromausfall). Das hängt davon ab, was an der Shelly hängt. Bei einer Lampe macht es Sinn, sie nach einem Stromausfall auszuschalten, während ein Kühlschrank immer an bleiben sollte.

Test

Mit dem Befehl

werden alle Nachrichten im Terminal angezeigt, die per MQTT verschickt werden. Nach spätestens 30 Sekunden (Die Shelly sendet alle 30 Sekunden Daten) sollte es eine Ausgabe geben, die ungefähr so aussieht:

Interessant sind hier die Punkte „Power“ (aktuelle Leistung in Watt) und „Energy“ (Gesamtverbrauch in Wattminuten)

Python Skript

Zuerst müssen folgende Python Module installiert werden:

Mein Code dafür ist folgender:

Kurze Erklärung: (Diese stellen müssen angepasst werden!)

Z. 7-8: Es wird eine Verbindung zur Datenbank hergestellt
Z. 14-15: Die topics von power und energy der Shelly werden subscribed. Hier können auch noch zusätzliche topics hinzukommen, z.B. für die Betriebstemperatur oder weitere Shellys, siehe Abschnitt „Test“)
Z. 19-30: Auch hier muss das topic angepasst werden. In diesem Abschnitt wird dann der Wert in der Konsole ausgegeben und anschließend in die Datenbank in das measurement „shellyplugs1“ in das Feld „leistung“ eingetragen. Dieser Abschnitt muss auch wiederholt werden, falls weitere topics nach Z. 15 hinzugefügt wurden.
Z. 44: Es wird eine Verbindung zum MQTT Broker hergestellt.

Dieses Skript kann nun laufen, zum Beispiel als Systemd Service Unit und schreibt die Daten dann in die Influx Datenbank, von wo sie beispielsweise mit Grafana visualisiert werden können.

Beispiel Visualisierung mit Grafana

Die Shelly hängt bei mir am Kühlschrank. Im folgenden Diagramm sieht man gut, dass die Ausschläge in der Nacht im Gesamtstromverbrauch (gelb) vom Kühlschrank kommen (grün):

Grafna Grafik