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