Nachdem nun unsere Schaltung soweit fertig ist und getestet wurde können wir uns der Software zum Steuern des Relais widmen. Da ich plane meinen Pi3 nicht nur als Türöffner zu verwenden, sondern weitere HomeMatic Komponenten anzusteuern ist die Auswahl der Software zur Steuerung der Relais GPIOs via Webseite recht eingeschränkt.
Inhaltsverzeichnis
Steuerungssoftware
Auch weiterhin fehlt eine richtige Alternative zu FHEM für die Hausautomatisierung, daher verwende ich auch für dieses Projekt die zwar recht komplizierte aber modular erweiterbare Automatisierungslösung FHEM. Die aktuelle Version ist die 5.7 vom 15.11.2015.
Wer die Grundeinrichtung auf seinem Raspberry Pi noch erledigen muss kann hierzu die Einsteiger-Tutorials verwenden.
FHEM installieren
Die Installation von FHEM ist, da es Debian Pakete gibt, recht einfach. Als erstes aktualisieren wir unser System und installieren Perl, auf welchem FHEM basiert. Mit einem Reboot aktivieren wir die neue Firmware.
1 2 3 4 5 |
sudo apt-get update && sudo apt-get upgrade sudo rpi-update sudo apt-get install perl libdevice-serialport-perl libio-socket-ssl-perl libwww-perl python-dev python-rpi.gpio sudo reboot |
Dann holen wir uns das FHEM 5.7 Installationspaket von der Webseite
1 |
wget http://fhem.de/fhem-5.7.deb |
Die Installation von FHEM starten wir dann mit folgendem Kommando
1 |
sudo dpkg -i fhem-5.7.deb |
Wenn die Installation erfolgreich durchgelaufen ist könnt ihr die FHEM Webseite über den Browser eures Rechners oder vom Raspberry Pi aufrufen, ersetzt ggf. die IP-Adresse mit der eures PIs (ifconfig gibt die IP aus).
- Von eurem Rechner: http://raspberrypi:8083/fhem oder http://<IP-Adresse>:8083/fhem
- Vom Raspberry Pi Desktop: http://localhost:8083/fhem
FHEM absichern
Bei so einem sensiblen Aufgabenbereich wie der Türöffnung sollte euer Raspberry Pi zwinged abgesichert sein, passende Tutorials findet ihr hier:
- Raspberry Pi absichern
- Passwort des Benutzers Pi ändern
- Firewall Iptables unter Raspbian einrichten (später nach der Einrichtung von FHEM)
Ebenfalls muss natürlich die FHEM Installation entsprechend abgesichert werden, das passiert indem wir den Zugang zur Webseite mit einem Benutzer und Passwort absichern. Es gibt verschiedene Seiten die wir absichern müssen.
- URL für den Smartphone Zugriff – http://raspberrypi:8084/fhem
- URL für den Zugriff via normalem Browser – http://raspberrypi:8083/fhem
- URL für den Zugriff via Tablet – http://raspberrypi:8085/fhem
Wir kodieren nun in einer SSH Sitzung auf unserem RasPi den Benutzer und das Passwort im Format <Benutzer>:<Passwort> in einen einfachen Base64 String, ich verwende als Benutzer „raspberrytips“ und als Passwort „Passwort„.
1 |
echo -n raspberrytips:MeinPasswort| base64 |
Die Kombination ergibt bei mir „cmFzcGJlcnJ5dGlwczpQYXNzd29ydA==“. Die Einrichtung des Benutzer / Passwort erledigen wir im Browser
Benutzer Passwort für die Smartphone Seite setzen
1 |
attr WEBphone basicAuth cmFzcGJlcnJ5dGlwczpQYXNzd29ydA== |
Benutzer Passwort für den normalen Webzugang setzen
1 |
attr WEB basicAuth cmFzcGJlcnJ5dGlwczpQYXNzd29ydA== |
Benutzer Passwort für den Zugang via Tablet s
1 2 |
attr WEBtablet stylesheetPrefix touchpad attr WEBtablet basicAuth cmFzcGJlcnJ5dGlwczpQYXNzd29ydA== |
Nach einem Neustart fragt euch der Webserver nach eurem Benutzername und Passwort.
1 |
shutdown restart |
FHEM Telnet absichern
Die Software bringt einen eigenen Telnet Server mit der auf Port 7072 lauscht, ohne Passwort ist das natürlich ein Einfallstor, daher vergeben wir auch hier ein Passwort, bei mir als Beispiel „Passwort“.
1 |
attr telnetPort password Passwort |
FHEM Tweaks
Da SD-Karten nicht für dauerhafte Schreib- und Lesevorgänge gemacht worden sind (sie gehen schneller kaputt) optimiere ich Raspbian noch mit zwei Einstellungen um unnötiges Schreiben auf die Kartenzu vermeiden.
Ich deaktiviere die SWAP Datei (Auslagerungsdatei für den Arbeitsspeicher)
1 2 3 |
sudo dphys-swapfile swapoff sudo dphys-swapfile uninstall sudo update-rc.d dphys-swapfile remove |
Ich verlagere die Verzeichnisse /var/run und /var/log in dem Arbeitsspeicher, hierzu editiere ich die Datei /etc/fstab
1 |
sudo nano /etc/fstab |
Folgende Zeilen füge ich ans Ende der Datei an
1 2 |
none /var/run tmpfs size=5M,noatime 00 none /var/log tmpfs size=5M,noatime 00 |
GPIOs mit FHEM steuern
Das Prinzip beim Schalten der GPIO Pins mit FHEM auf dem Raspberry Pi ist recht einfach. Ich verwende hier ein Python Script, ein einfaches Shell Script ist natürlich auch möglich. Wichtig! Das Script muss zu eurem Öffner passen, laut Dokumentation erwartet mein Türöffner einen kurzen Schaltimpuls, er öffnet die Türe dann von selbst. Bei mir muss nicht dauerhaft durchgeschalten werden wie bei klassischen E-Öffnern. Ich habe eine Hörmann Türe mit AutoLock (Selbst-verriegelnd) und Komfortöffner, verbaut ist darin ein „GU-SECURY Automatic mit A-Öffner“ der Firma Gretsch-Unitas.
- Wir erstellen ein Python Script das unabhängig von FHEM die GPIO schalten kann
- Wir legen in FHEM einen Dummy Schalter an welcher das Script aufruft
Dummy Schalter anlegen
Als erstes erstellen wir daher unser Script unter /usr/sbin mit dem Editor Nano
1 |
sudo nano /usr/sbin/fhem-tuere.py |
Wir fügen dann folgenden Code ein
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#!/usr/bin/env python # Tueroeffner Script fuer SainSmart Relais Modul von www.raspberry.tips import time import sys, getopt import RPi.GPIO as GPIO def main(argv): # Setzt GPIO low (0) oder high (1) gpioLowHigh = '' # Pin welchen wir ansteuern wollen bei mir 3 gpioPin = '' # Dauer wie lange durchgeschalten werden soll in Sekunden gpioPinDuration = '' GPIO.setwarnings(False) try: opts, args = getopt.getopt(argv,"o:g:s:",["gpioOption=","gpioPin=","gpioPinDuration="]) except getopt.GetoptError: print 'test.py -o sys.exit(2) for opt, arg in opts: if opt in ("-o", "--gpioOption"): gpioLowHigh = arg elif opt in ("-g", "--gpioPin"): gpioPin = arg elif opt in ("-s", "--gpioPinDuration"): gpioPinDuration = arg # Initialisierung GPIOs im Board Modus und PIN GPIO.setmode(GPIO.BOARD) GPIO.setup(int(gpioPin), GPIO.OUT) # Schalten: # LOW = Relais schaltet durch # HIGH = Relais schaltet nicht durch - Standart beim SainSmart if gpioLowHigh == "0": GPIO.output(int(gpioPin), GPIO.LOW) time.sleep(int(gpioPinDuration)) GPIO.output(int(gpioPin), GPIO.HIGH) if gpioLowHigh == "1": GPIO.output(int(gpioPin), GPIO.HIGH) time.sleep(int(gpioPinDuration)) #Aufruf der Main Funktion if __name__ == "__main__": main(sys.argv[1:]) |
Speichert mit SRG+X, Y und Enter. Dann setzen wir noch +X und machen das Script ausführbar
1 |
sudo chmod +x /usr/sbin/fhem-tuere.py |
Das Script wird mit zwei Parametern aufgerufen, -g (–gpioPin) für den Pin der geschalten werden soll und -s (–gpioPinDuration) für die Dauer. Zum Testen könnt ihr z.B. Pin 3 insg. 5 Sekunden schalten. Das Klackern des Relais sollte entsprechend zu hören sein.
1 |
sudo fhem-tuere.py -o 0 -g 3 -s 5 |
Nachdem unser Python Script zum Schalten der GPIOs nun funktioniert müssen wir es in FEHM einbauen. Das erfolgt anhand eines Dummy Schalters. Wir fügen als erstes den Benutzer „fehm“ zur Gruppe „gpio“ hinzu, sonst darf FHEM die GPIOs nicht ansteuern.
1 |
sudo adduser fhem gpio |
Zum Anlegen des Schalters wechseln wir wieder auf die FHEM Webseite und geben folgendes Kommando ein
1 |
define Haustuere dummy |
Wir landen auf den Einstellungen des erzeugten Dummy Schalters
- NAME ist der vergebene Name
- TYPE ist der Typ des fhem-device, hier dummy.
- STATE ist der Status des Geräts
Wir ordnen der Haustüre zum einfachen Verwalten noch einen Raum zu. Bei mir wird der Schalter „Haustüre“ nun einem zu erstellenden Raum „Flur“ zugeordnet
1 |
attr Haustuere room Flur |
Dann erstellen wir quasi eine Beschreibung für den Schalter. Die erste Zeile hinterlegt eine Aktionen für den Schalter (Öffnen). Die zweite weißt der Aktion Öffnen den Status offen zu. Zusätzlich hinterlegen wir noch Icons für den Schalter und für den Status des Schalters.
1 2 3 4 5 |
attr Haustuere webCmd Oeffnen attr Haustuere eventMap /Oeffnen:offen attr Haustuere icon control_building_outside attr Haustuere devStateIcon offen:fts_door_right_open |
Nach einem Klick auf „Save config“ und dann auf dem Raum „Flur“ sehen wir unseren erstellten Schalter
Schalter Ereignis definieren
Da der Zugriff auf die GPIOs via Python leider root Rechte benötigt müssen wir dem Benutzer FHEM leider noch rechte für das sudo Kommando geben.
1 |
sudo nano /etc/sudoers |
Ganz unten fügen wir die Zeile ein und speichern mit STRG + X, Y und Enter
1 |
fhem ALL=(ALL) NOPASSWD: ALL |
Den Schalter haben wir bereits via FHEM eingerichtet, nun müssen wir noch ein Ereignis hinterlegen. Das erstellte Python Script soll mit entsprechenden Parametern aufgerufen werden und die Türe öffnen. Daher Erstellen wir das Ereignis „haustuere_oeffnen, das auf den Tastendruck „Hastuere:Oeffnen“ lauscht und unser Python Script ausführt.
1 |
define haustuere_oeffnen notify Haustuere:Oeffnen {system('sudo python /usr/sbin/fhem-tuere.py -o 0 -g 3 -s 5&');;} |
Nach dem Speichern des Ereignisses durch „Save config“ solltet ihr beim Klicken auf „Öffnen“ das gewünschte Klicken eures Relais hören. Glückwunsch, jetzt könnt ihr eure Haustüre via Raspberry Pi öffnen!
Relais verkabeln
Als letztes muss noch das gebaute Relais aus dem ersten Teil der Serie mit dem Türöffner verbunden werden, bei mir ist die Verbindung recht simpel, der G-U Autmatic Öffner hat drei Anschlüsse, Plus, Minus und eine Schaltleitung. Wenn zwischen Plus und der Schaltleitung durchgeschalten wird öffnet sich die Haustüre. Meine vorhandene Sprechanlage macht nichts anderes als 12V zwischen Plus und der Schaltleitung durchzuschalten.
Die Lösung ist also recht simpel, wir verbinden Pin 2 und Pin 3 des Relais als parallelen sSchließer zwischen Plus und der Schaltleitung. Vereinfacht dargestellt ergibt sich bei mir folgende Schaltung:
Einbau in den Sicherungskasten
Den Einbau war nach entfernen der Schutzabdeckung recht einfach, die Hutschienen Gehäuse an die Schiene Klemmen und alles sauber verkabel. Zusätzlich habe ich, da in meinem Sicherungskasten natürlich weder WLAN noch LAN verfügbar war, eine Schuko-Steckdose für Hutschienen besorgt und daran einen Powerline Adapter angeschlossen. Somit hat mein Pi auch im Sicherungskasten Netzwerkzugang.
- Einbau Schuko- Steckdose für Schaltschrank Zählerschrank auf Hutschiene
- Ich verwende einen älteren 200MBit Powerline Adapter, die Fritz Geräte, welche ich auch im Einsatz habe sind ebenfalls zu empfehlen
Zur Optimierung des Powerline habe ich übrigens die Schucko Steckdose auf die Sicherung hängen müssen, auf welcher auch der andere Adapter an meinem Router hing, sonst war keine Übertragung möglich.
Wichtig! Netzspannung ist lebensgefährlich! Lasst die Finger vom Sicherungskasten wenn ihr euch unsicher seit und arbeitet grundsätzlich niemals unter Last!
FHEM Tuning für den Raspberry Pi
Zur Optimierung von FHEM auf dem Raspberry Pi 3 habe ich noch folgende Optionale Konfigurationen erledigt.
Da ich LAN verwende deaktiviere ich WLAN und Bluetooth durch das Eintragen folgender Zeilen in die Datei „/etc/modprobe.d/raspi-blacklist.conf“, das spart etwas Strom.
1 2 3 4 5 6 |
#wifi blacklist brcmfmac blacklist brcmutil #bt blacklist btbcm blacklist hci_uart |
Um Raspbian für den Dauerbetrieb zu optimieren deaktiviere ich noch swap
1 2 3 |
sudo dphys-swapfile swapoff sudo dphys-swapfile uninstall sudo update-rc.d dphys-swapfile remove |
und leite durch editieren von /etc/fstab die sehr oft benutzten Verzeichnisse in dem RAM um. Fügt einfach folgende Zeile ans Ende der Datei an.
1 |
tmpfs /var/tmp tmpfs nodev,nosuid,size=100M 0 0 |
Zusätzlich benutze ich in FHEM noch die SYSMON Funktion, um Parameter wie Temperatur, CPU-Frequenz, RAM, Dateisystem auf der SD-Karte bzw. dem ggf. angeschlossenen USB Stick sowie den Datentransfer über Ethernet bzw. ggf. WLAN anzuzeigen. Details gibt es im FHEM WiKi