Eigentlich ist Peter K. Boxler Mac-Nutzer – aber er ist auch Raspberry-Projektentwickler. Als solcher hat er drei Projekte erfolgreich auf die Beine gestellt. Alle machten und machen ihm viel Spaß, wie er sagt, kosteten aber auch viel Schweiß und Tränen. Die Projektbeschreibungen sind eher für Pi-Hacker geeignet, da er die einfacheren Schritte nicht dokumentiert hat. Sie können aber generell als Anregung für Projektideen dienen.
Hier stellt er sein Projekt zur Lampensteuerung während einer längeren Abwesenheit vor.
Der Raspberry Pi hat mich von Anfang an fasziniert. 2012 schaffte ich mir den Ein-Platinen-Computer an, ein Modell B+, legte ihn jedoch nach einigem Herumprobieren auf die Seite – ich hatte noch keine wirkliche Idee für ein Projekt. Das änderte sich im Frühjahr 2014 – ich wollte für die Abwesenheit während eines Urlaubs eine Lampensteuerung einrichten.
Der Pi hat 4 USB-Anschlüsse, einen LAN-Anschluss, einen HDMI-Anschluss für einen Monitor und einen Audio-Video-Ausgang. Ebenfalls auf dem Board ist ein Anschluss für die Pi-Camera – eine HD-fähige Kleinst-Kamera für Fotos und Video. Was den Pi auszeichnet, ist die 40-polige Steckerleiste. Viele dieser Anschlüsse sind General Purpose Input/Output-Pins, die in Programmen angesteuert/gelesen werden können. Und mittlerweile gibt es viele Erweiterungsboards von unzähligen Anbietern. Der Pi verbraucht lediglich 1 Watt Leistung: 5 V und 200 mA Strom.

©Peter K. Boxler
Die Anforderungen
Während meiner Ferien sollen 4 Funksteckdosen (Typ ELRO) nach einem vorgegebenen Schema ein- und ausgeschaltet werden. Die Funksteckdosen werden in verschiedenen Räumen platziert, und die geschalteten Lampen sollen Anwesenheit vortäuschen. Pro Dose soll jeder Wochentag (von Sonntag bis Samstag) ein eigenes Schaltprogramm haben, und die Schaltprogramme werden jede Woche wiederholt.
Die Schaltaktionen sollen außerhalb des Programms in einem XML-File definiert und der Raspberry soll mit einem un-interruptible Power Supply ausgestattet sein.
Das Schaltprogramm (Python) soll als Linux-Daemon laufen, der beim Boot des Pi gestartet wird. Via Interprocess-Kommunikation kann ein Client-Programm den Schaltstatus abfragen. Zudem soll man via Web-Interface den aktuellen Schaltstatus abfragen können.
Die Lösung
Der Aufbau der fertigen Lösung sieht so aus – ohne Gehäusedeckel

©Peter K. Boxler

©Peter K. Boxler

©Peter K. Boxler

©Peter K. Boxler
Der Hardware-Aufbau

©Peter K. Boxler
Der Pi bzw. das ganze System wird via un-interruptible Power Supply UPiS (mit blauem LiPo-Akku) mit 5 V Spannung versorgt. Da im ELRO-Handsender bereits ein Sende-Protokoll-Chip PT2262 sowie ein 433-MHz-Sender enthalten ist, wird der Handsender über einen Treiber-Chip 2803A von den General Purpose Input/Output Pins (GPIO-Pins) des Pi angesteuert.
Das grüne Board enthält eine batteriegepufferte Real Time Clock sowie den Treiber-Chip 2803A. Ebenfalls auf diesem Board befinden sich 3 LED und 2 Drucktasten. LED1 und LED3 werden für Statusanzeigen benutzt. Die Drucktasten sind derzeit nicht benutzt.
Das Board enthält ebenfalls 2 Anschlüsse für einen im Gehäuse montierten Mini-Kippschalter. Dieser hat 2 Positionen: ‚Nobody Home‘ und ‚Somebody Home‘.
Die Boards wurden in einem handelsüblichen Alu-Gehäuse montiert.
Kurioser Bug: Raspberry mag nicht geblitzt werden
Pin-Belegung Raspberry Pi
Der verwendete Raspberry Pi Modell B+ hat 40 Pins, verwendet werden aber nur die ersten 26 Pins.

©Peter K. Boxler
Verbindung zum Handsender
Dieses Schema zeigt die Verbindungen vom Pi zum Chip (auf Interface Board) und zum Handsender.

©Peter K. Boxler
Das UPiS
Das verwendete un-interruptible Power Supply Module (genannt UPiS) mit dem blauen LiPo-Akku wird von einer Firma in Athen hergestellt. Das Modul hat vielfältige Funktionen und kann über ein serielles Interface, das über die Pins 8 und 10 läuft, weitgehend konfiguriert werden. Fällt die von außen kommende 5-V-Stromversorgung aus, wird das System für rund 3 bis 6 Stunden über den Akku mit Strom versorgt. Wird der untere Ladezustand erreicht, wird der Pi kontrolliert heruntergefahren.
Über das serielle Interface können Befehle an das UPiS gesendet werden, einer davon, der Befehl @status, bringt den internen Status des UPiS. Das sieht so aus:
----------------------
www.pimodules.com
UPiS Advanced
Firmware Version:1.096 Beta Version
Hardware Release:VCO2
----------------------
UPiS Status
Powering Source:USB
UPiS RTC Date:2000:01:04
Switcher Doku Seite 6
UPiS RTC Time:03:52:08
Average Powering Values
----------------------
RPi Voltage:04.90 V
EPR Voltage:00.00 V
USB Voltage:04.96 V
BAT Voltage:04.11 V
UPiS Current:0464 mA
----------------------
Battery Charger ON
Low Power Restart Time (LPRSTA) is 5 seconds
Raspberry Pi timed shutdown is inactive
Raspberry Pi timed start-up is inactive
File Safe Power Cut-Off Time is: 30 Seconds
File Safe Shut Down type is: RPi NOT Powered while sleep
File Safe Unconditional Shutdown when Power loose Timer is OFF, UPiS will work until battery
discharged
Real Time Clock Correction Factor value is: 0x00
Analog Sensor Temperature:29 C 84 F

©Peter K. Boxler
Nobody Home-Switch
Der Switcher ist nicht nur während eines Urlaubs in Betrieb, sondern auch, wenn wir daheim sind, aber abends mal weggehen. Mit dem Kippschalter Home/NotHome kann man die Funktion des Switchers folgendermassen beeinflussen:
- Stellung NotHome: Switcher schaltet die Dosen gemäß den Angaben im Control-File
- Stellung Home Switcher schaltet nach Umschalten auf Home alle Dosen sofort AUS. Folgende Aktionen (Aus/Ein) werden nicht mehr durchgeführt, der aktuelle Dosenstatus wird jedoch nachgeführt.
Beim Umschalten von Home auf NotHome werden die Dosen sofort wieder auf den zu diesem Zeitpunkt gültigen Stand geschaltet. Das vordefinierte Programm wird wieder normal abgearbeitet.
Die besten Rasperry-Pi-Alternativen
Die Software
Das Switcher-Programm
Die verwendete Script-Sprache ist Python. Das Switcher-Programm switcher.py ist ca. 550 Zeilen lang, es steuert den Handsender (und damit auf Distanz die Funksteckdosen) nach einem festgelegten Wochenprogramm.
Die Schaltsequenzen sind außerhalb des Programms in einem XML-File codiert. Dieser File wird nach Programm-Start eingelesen und geparst. Es entsteht eine Aktionen-Tabelle, die alle Schaltvorgänge (EIN/AUS) für jeden Tag der Woche und für jede Dose enthält. Pro Dose und Tag können beliebig viele Schaltvorgänge definiert werden. Das Wochenprogramm wird endlos wiederholt.
Das Switcher-Programm enthält eine Simulations-Funktion (Commandline-Paramater -s), die einen Schnelldurchlauf durch 3 Wochen in ca. 10 Minuten ermöglicht. Damit lässt sich schnell prüfen, ob das Programm im Wochenablauf einwandfrei funktioniert.
Das Switcher-Programm kann auf zwei Arten gestartet werden:
- Einfacher Aufruf auf Commandline: sudo python switcher.py [- Commandline Parameter]
- Aufruf als Linux-Daemon (siehe Kapitel weiter unten)
Beim Start des Programms können folgende Commandline-Parameter spezifiziert werden:
-d kleiner Debug, Statusmeldungen werden ausgegeben (stdout)
-D großer Debug, weitere Statusmeldungen
-f filename XML-Inputfile
-s Simulation (Schnelldurchlauf durch 3 Wochen)
-i min Inkrement-Intervall bei Simulation (Minuten, 2 bis 8 sinnvoll)
-t wochentag an dem die Simulation gestartet wird
-h Help, Usage wird ausgegeben
-a es werden nur die im File gefundenen Aktionen ausgegeben
Control File
Der Control-File im XML-Format beinhaltet alle Schaltsequenzen für alle Tage der Woche pro Dose. Der File hat im Tag
Hier ein Ausschnitt des Files:

©Peter K. Boxler
Switcher-Client
Das Switcher-Client-Programm swclient.py kann Requests an den Switcher-Daemon senden (siehe Kapitel Interprocess Kommunikation weiter unten).
Der Status-Request bringt folgende Antwort vom Daemon:

©Peter K. Boxler
In diesem Beispiel ist zu sehen, dass der Switcher-Daemon auf 17:38 Uhr wartet, um dann Dose 3 einzuschalten. Letzte Aktion war um 0:22 Uhr, als Dose 1 ausgeschaltet wurde. Alle Dosen sind zur Zeit ausgeschaltet (Dosenstatus). Der Home/NotHome-Switch ist in Stellung NotHome.
Schaltzeiten anzeigen
Das Script swaction.py wird in der Entwicklung benutzt, um die im XML-File codierten Schaltzeiten pro Tag und pro Dose auszugeben – für Tests und Doku. Es werden 3 Listen ausgegeben:
- Schaltzeiten für alle Tage der Woche für alle Dosen
- Schaltzeiten für jede Dose für alle Tage der Woche
- Grafische Darstellung (Timeline) für alle Tage und Dosen
Dieses Script benutzt dieselbe Parsing-Funktion wie das Switcher-Script switcher.py. Diese Parsing-Funktion ist im Script swparse.py zu finden. Dieselben Listen werden auch vom Switcher-Script switcher.py ausgegeben, falls der Commandline-Parameter -a gesetzt ist.
Für die Ausgabe in einen Textfile ist folgender Befehl einzugeben:
sudo python swaction.py > schaltzeiten.txt
Daemonisierung
Das Switcher-Programm switcher.py erfüllt alle Anforderungen für das Schalten der Dosen.
Als weitere Herausforderung wurde der Switcher-Prozess ‚daemonisiert‘, d.h. es wurden weitere Code-Teile angefügt, die es erlauben, den Switcher als Linux-Daemon laufen zu lassen. Der Switcher-Daemon kann von der Commandline mit folgenden Aufrufen gestartet und gestoppt werden:
sudo python swdaem.py start
sudo python swdaem.py stop
Der dafür zusätzlich notwendige Code wurde hier gefunden und leicht angepasst.
Interprocess-Kommunikation
Da der Switcher-Prozess als Linux Daemon im Hintergrund läuft und damit keine Verbindung zu einer Konsole hat, ist das Switcher-Programm als Server ausgeführt, das neben dem Schalten der Dosen auch Requests von einem Client beantworten kann. Einer dieser Requests ist der „stat“-request, der etwa folgendes meint: Sag mir, was du jetzt gerade tust, was du als letztes getan hast und was du als nächstes tun wirst.
Diese Interprocess-Kommuikation wird über Sockets abgewickelt – dazu wird das geniale Framework ZeroMQ verwendet: ‚ an intelligent transport layer for distributed applications ‘.
Aus dem Guide:
ØMQ (also known as ZeroMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It‘s fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems. ØMQ is from iMatix and is LGPLv3 open source.
Das Switcher-Programm fragt im Main-Loop nonblocking die Queue ab und kann so Anfragen vom Client-Programm swclient.py beantworten.
Das Client-Programm swclient.py wird bei Bedarf in einer Konsole gestartet.
Eine Status-Abfrage ist zudem auch via Web-Interface möglich – siehe weiter unten. Aus diesem Grund ist im Pi der Web-Server lighttpd installiert.
Shutdown Pi
Für ordentlichen Shutdown des Pi läuft das Script softshut_upis.py. Dieses prüft, ob Pin GPIO27 auf Null geht – bei Tastendruck (rote Taste) auf dem UPiS-Board. Der Pi wird dann heruntergefahren mit dem Befehl „halt“. Das UPiS sorgt dafür, dass die 5-V-Versorgung des Pi abgeschaltet wird. Druck auf denselben Knopf schaltet 5 V zum Pi wieder ein.
Web-Interface
Auf dem Pi des Switchers ist der Web-Server lighttpd einschließlich PHP installiert. Via Port 8008 kann der Status des Switchers analog dem Commandline-Client swclient.py abgefragt werden. Mittels Port-Forwarding kann dieser auch von außerhalb des lokalen Netzwerks angefragt werden. Die gelieferte Webseite sieht so aus:

©Peter K. Boxler
Die Software-Komponenten
Das Switcher-Projekt besteht aus folgenden Codeteilen:

©Peter K. Boxler
Interessante Links
Noch mehr coole Verwendungsmöglichkeiten für den Raspberry
Meine Raspberry Projekte:
Light Painting Projekt, Bau eines Pixelsticks
Andere Links:
Eine erste Idee für die Ansteuerung des Handsenders habe ich in einem Artikel von Hermann Kurz gefunden. Er verwendete den ELRO-Handsender, da dieser bereits den Sende-Protokoll-Chip PT2262 sowie einen 433-MHz-Sender enthält.
Interprocess-Kommunikation mittels ZeroQM Framework
UPiS-Module von PI-Modules.com
Real Time Clock Module mit Batterie von Adafruit
Funksteckdosen-Set von ELRO , Artikelnummer AB440S/3, 3 Stück mit Handsender