Im ersten Teil der Serie bin ich auf die Hardware eingegangen und wie man den Schaltvorgang grundsätzlich per Software durchführen kann. In diesem Teil wird es nochmal spannend, denn jetzt wird die eigentliche Automatisierung durchgeführt und die Bastellösung an das OpenHab System gekoppelt.
Zuerst wollte ich ein kleines Skript haben, damit ich auf dem Raspberry einen Rollladen über die Kommandozeile rauf/runterfahren oder stoppen kann. Also ein Äquivalent zu der Fernbedienung. Den entsprechenden Pin habe ich erstmal hardcodet und dann bei Bedarf umgesetzt. Somit kann man sich mit der GPIO Nutzung in Python vertraut machen. Auch lässt sich besser die Zeit bestimmen, die zwischen dem High und Low eines Pins optimal ist, sodass ein Tastendruck simuliert wird. Ich habe hier 100-200ms als optimales Intervall gefunden. Hält man die Taste länger gedrückt, wechselt also später auf Low zurück, dann verhält sich der Rollladen anders und wechselt in den manuellen Modus. Dies ist sicherlich interessant, wenn man Zwischenzustände ansteuern möchte. Also zum Beispiel eine 75% Öffnung oder ähnliches. Die Programmierung steht aber momentan hinten an und wird irgendwann umgesetzt.
import time import RPi.GPIO as GPIO # wir benutzen die BCM Nummerierung GPIO.setmode(GPIO.BCM) # Rollladen 1 Pins vorbereiten GPIO.setup(9, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(10, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(11, GPIO.OUT, initial=GPIO.LOW) # Rollladen 2 Pins vorbereiten GPIO.setup(23, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(24, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(25, GPIO.OUT, initial=GPIO.LOW) # ende Initialisierung # Rolladen 2 hochfahren GPIO.output(23, GPIO.HIGH) time.sleep(0.1) GPIO.output(23, GPIO.LOW)
Nun möchte ich das Skript aber automatisiert anstoßen und das System mit OpenHab verknüpfen. Da ich bereits einen MQTT Broker nutze und die Erweiterung sehr einfach durchzuführen ist wurde das Skript entsprechend ergänzt. Es wurden entsprechende Topics angelegt und als Payload wird der Befehl gesendet, den ich normalerweise auf der Fernbedienung drücken würde. Also UP
, DOWN
oder STOP
.
Dadurch bin ich nicht nur in der Lage den Rollladen automatisiert zu öffnen und zu schließen, sondern auch die Shutter-Komponente von OpenHab optimal zu nutzen.
Das Pythonskript wird dann also erweitert und sieht folgendermaßen aus:
#!/usr/bin/env python import paho.mqtt.client as mqtt import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(9, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(10, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(11, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(23, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(24, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(25, GPIO.OUT, initial=GPIO.LOW) # GPIO Initialisierung ende # subscribe den channel windows bei erfolgreicher Verbindung def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("windows/#") # check die eingehende Message und identifiziere die Aktion def on_message(client, userdata, msg): pin = -5 if msg.topic=="windows/bath": pin = 9 if msg.topic=="windows/bed": pin = 23 if str(msg.payload) == "STOP": pin += 1 if str(msg.payload) == "DOWN": pin += 2 print(msg.topic + " " + str(msg.payload) + " pin: " + str(pin)) if pin > 0: GPIO.output(pin, GPIO.HIGH) time.sleep(0.1) GPIO.output(pin, GPIO.LOW) time.sleep(0.5) else: print("Unsupported window: " + msg.topic + " payload: " + str(msg.payload)) # mqtt client initialisieren client = mqtt.Client() client.username_pw_set("<username>", "<password>") client.on_connect = on_connect client.on_message = on_message # mqtt client verbinden ... client.connect("<mqtt server ip>", <mqtt server port>, 60) # ... und starten client.loop_forever()
Nun kann man einen Rolladen in OpenHab eintragen. Dazu nutzt man die Shutter
Komponente. Diese muss dann mit den 3 möglichen MQTT-Aufrufen bestückt werden und ist dann direkt einsatzbereit. Ein Beispiel Item sieht dann so aus:
Rollershutter bathShutter "Rollladen" <rollershutter> (Shutter) {mqtt=">[mosquitto:windows/bath:command:UP:UP],>[mosquitto:windows/bath:command:DOWN:DOWN],>[mosquitto:windows/bath:command:STOP:STOP]"}
Dieses Item kann dann auch genutzt werden um programmatisch den Rollladen zu steuern. Hier gibt es dann noch einen wichtigen Tipp. Wenn man mehrere Rollläden auf einmal steuern will, muss das Funksignal leicht versetzt gesendet werden, da es ansonsten zu einer Interferenz zu kommen scheint. Wenn ich zwischen den einzelnen Vorgängen ca 500ms warte, so funktioniert alles wie gedacht. Diese Wartezeit wurde dann auch gleich im Pythonskript verdrahtet, sodass man eine korrekte Ansteuerung der Rollläden hat und diese Latenz ist auch nicht spürbar. Selbst wenn man die Rollläden in einer for
-Schleife anspricht, ist die Zeit nicht erkennbar. Möglicherweise kann man diese Wartezeit auch noch optimieren. Wenn die Interferenz zuschlägt bewegen sich die Rollläden einfach mal nicht, ein Problem was man während der Entwicklung und Anpassung verschmerzen kann. Die Manuelle Steuerung, selbst über Openhab, ist ja jederzeit möglich.
Abschließend kann man das Python Skript auch noch als Linux Service einrichten und mit dem Starten des Raspberry verbinden. Dadurch ist die Rollladen-Steuerung auch nach einem Stromausfall wieder online. Da es hier verschiedene Methoden und Herangehensweisen gibt, kann man sich einfach per Google die suchen, die am besten passt.