Nachdem wir bereits den Status von Bewegungsmeldern und Magnetkontakten per Android Smartphone abfragen können, wollen wir als nächstes die Steuerung von 433MHz Funksteckdosen per Handy – über das Raspberry Pi – in Angriff nehmen. Dazu sollen die Steckdosen auch weiterhin mit der normalen Fernbedienung gesteuert werden, aber zusätzlich eben auch per Raspberry Pi Funksteckdosen App auf dem Handy. Der Status soll daher erkannt werden und auch in der Android App angezeigt werden sowie verändert werden können.
Dafür sind zwei Modi nötig: Zum einen wird ein Listener benötigt, welcher die Signale einer Fernbedienung erkennt und außerdem ein Sendeskript, welches auf Befehl der Android Funksteckdosen App ein 433MHz Signal aussendet.
Update: Inzwischen auch für iOS verfügbar.
Raspberry Pi Funksteckdosen App erstellen und installieren
Bevor wir richtig starten verweise ich auf das Tutorial von staticfloat.de, in welchem die App erstellt wird. Da einige Pfade im Code angegeben werden, müssen die Ordner auf dem Raspberry Pi später identisch sein. Die App verbindet sich per SSH mit dem Raspberry Pi und ruft zum Senden des 433MHz Codes ein Skript auf, welches wiederum den Code mittels Modul sendet. Das Skript kann allerdings auch von jedem anderen Programm aufgerufen werden. Daneben wird der Status aller angegebenen Funkmodule in einer JSON Datei gespeichert, welche auch von der App abgerufen wird.
Zubehör
Hast du die App soweit fertig erstellt oder vorkompiliert heruntergeladen, so können wir mit der Einrichtung starten. Dafür benötigen wir neben einem Raspberry Pi folgendes Zubehör:
Übrigens: Nicht nur Funksteckdosen können mit diesem Programm gestartet werden. Auch z.B. Funk-Lampen(fassungen) sowie ähnliche Funkmodule können an- und ausgeschaltet werden (einstellbarer Hauscode vorausgesetzt).
Anschluss der Funksteckdosen am Raspberry Pi
Die Verkabelung des Senders und Empfängers ist sehr einfach, da alles bereits auf dem PCB enthalten ist und dadurch keine zusätzlichen Bauteile benötigt werden. Beide Module sind beschriftet und enthalten VCC, GND sowie DATA (Empfänger) bzw. ATAD (Sender).
VCC von beiden Modulen wird an Pin 2 (5V) des Raspberry Pi’s angeschlossen. GND kommt an Pin 6 vom Pi (siehe schematische Zeichnung). Darüber hinaus wird der Sender (ATAD) an Pin 11 (GPIO 17) angeschlossen und der Empfänger (einer der beiden DATA Pins) and Pin 13 (GPIO 27) vom Raspberry Pi. Hier geht es zur Pin Belegung des Raspberry Pi’s.
Wichtig: Solltest du andere Pins verwenden wollen, so ist die WiringPi Pinbelegung im folgenden Skript entscheidend und nicht die normale GPIO Nummerierung.
Skript zum Abhören und Schalten der Funksteckdosen
Wie bereits angekündigt werden zwei Teile benötigt – einer zum Lauschen und einer zum Senden. Um es so einfach wie möglichst zu gestalten sind beide Teile in einem Skript, womit wir eine Datei mit zwei Funktionen haben. Daneben werden einige Bibliotheken benötigt:
- WiringPi (auf den aktuellen Raspbian Versionen bereits vorinstalliert)
- rc-switch (C++ Bibliothek zum Bedienen von 433MHz RF Transmitter & Receiver)
- RapidJSON (Bibliothek zum Speichern und Auslesen von JSON Dateien mit C++)
Damit diese Bibliotheken nicht manuell zusammengeführt werden, kann das komplette Archiv (worin diese Bibliotheken auch enthalten sind) heruntergeladen werden. Wir wechseln also nun in die Kommandozeile des Raspberry Pi’s und laden das Paket herunter:
wget http://tutorials-raspberrypi.de/wp-content/uploads/scripts/Funksteckdosen-RaspberryPi.zip
Wir entpacken die Datei in unser Homeverzeichnis. Achtung: Falls du einen anderen Ordnernamen in der App angegeben hast, so musst du diesen hier auch entsprechend anpassen:
unzip Funksteckdosen-RaspberryPi.zip -d ~/Funksteckdosen-RaspberryPi
Anschließend wechseln wir in den neu erstellten Ordner:
cd ~/Funksteckdosen-RaspberryPi
Hierin befinden sich nun mehrere Dateien. Das eigentliche Skript, welches wir im nächsten Schritt anpassen werden, ist die Datei android-funksteckdosen.cpp
.
Bevor wir jedoch hier weiter machen, wirst du die Codes zum Ein- und Ausschalten der Funksteckdosen benötigen. Wie du diesem am einfachsten erfährst, ist in diesem Tutorial beschrieben. Sobald du die Codes aller Funksteckdosen hast, können wir fortfahren.
Wir bearbeiten nun die Datei, welche von der App aufgerufen wird und geben alle unsere Module an:
sudo nano android-funksteckdosen.cpp
Ab Zeile 100 findest du die Benutzerdefinierten Variablen:
100 101 102 103 104 |
int PIN_SEND = 0; // from WiringPi int PIN_RECEIVE = 2; // from WiringPi std::vector<Outlet> outlets; outlets.push_back(Outlet("Wohnzimmer Stehlampe", 5506385, 5506388)); outlets.push_back(Outlet("Kueche Kaffemaschine", 5509457, 5509460)); |
Sofern du die selben Pins für Sender und Empfänger nutzt, brauchst du die Pin Angabe nicht zu verändern. In Zeile 104 und 105 siehst du zwei von mir angelegte Module. Dabei wird als erstes ein Name angegeben, welcher später zur Identifikation helfen soll. Als nächstes wird der zuvor erhaltene Code zum Einschalten angegeben (Bsp.: 5506385), gefolgt vom Code zum Ausschalten (Bsp: 5506388). Du kannst hierbei so viele Module anlegen, wie nötig sind – in meinem Beispiel sind es lediglich zwei. Kopiere dazu einfach eine dieser beiden Zeilen und passe sie entsprechend an.
433MHz Funksteckdosen-Skript kompilieren und Testen
Nachdem die Datei alle unsere Codes eingetragen sind, kompilieren wir die Datei und erstellen so eine ausführbare Datei. Dazu benötigen wir u.a. die RCSwitch.cpp Datei. Der Name des Programms lautet in meinem Fall „funk“:
g++ -std=c++11 -DRPI RCSwitch.cpp android-funksteckdosen.cpp -o funk -lwiringPi
Wenn das Kompilieren ohne Fehler abgeschlossen ist, können wir das Programm bereits testen. Wie bereits erwähnt gibt es zwei Modi: Wenn wir das Programm ohne Parameter starten (sudo ./funk
), so wird auf eingehende Signale gewartet. Dies nutzen wir im nächsten Schritt. Zunächst aber möchten wir die Sendefunktion testen.
Dazu wird das Programm mit zwei Parametern aufgerufen: Als erstes wird eine ID übergeben, welches einfach der vorher festgelegten Reihenfolge entspricht. Bei mir hat der Eintrag „Wohnzimmer Stehlampe“ die ID 0 und „Küche Kaffeemaschine“ hat die ID 1, usw. Der zweite Parameter ist entweder Eins oder Null und gibt an, ob die Steckdose ein- oder ausgeschaltet werden soll. Also wenn ich z.B. meine „Wohnzimmer Stehlampe“ mit dem Programm einschalten will, gebe ich folgenden Befehl an:
sudo ./funk 0 1
Du kannst dies einmal mit allen Kombinationen testen, um sicher zu gehen, dass die eingetragenen Codes korrekt sind. Sollte ein Code falsch sein, musst du nach dem Bearbeiten der Datei erneut kompilieren.
Weiterhin wird bei jedem Aufruf der Datei die Datei status.json
beschrieben. Diese enthält Informationen zu allen angegbenen Modulen (Name, Codes, Status). Falls der Status noch nicht definiert ist (weil er noch nicht aktualisiert wurde), so ist er -1 statt 0/1.
Raspberry Pi Funksteckdosen App – Listener Autostart
Schlussendlich lassen wir das Skript (ohne Parameter) noch bei jedem Neustart ausführen. Dazu nutzen wir crontab:
crontab -e
Als neuen Eintrag fügen wir unten folgende Zeile ein:
@reboot sudo ~/Funksteckdosen-RaspberryPi/funk
Nun wird das Programm bei jedem Start im Hintergrund ausgeführt und sobald ein eingetragenes Signal empfangen wird, wird die JSON Datei aktualisiert. Natürlich kannst du auch eigene Anwendungen anstelle der Raspberry Pi Funksteckdosen App entwickeln, die das Skript und die entsprechende JSON Ausgabe nutzen.
Solltest du Fragen zur Raspberry Pi Funksteckdosen Programmierung haben, kannst du diese hierunter stellen; für Fragen, die die App angehen, stellst du diese am besten auf staticfloat.
22 Kommentare
Danke für die tolle Anleitung.
Leider lässt sich das Programm bei mir nicht übersetzen. gcc mag den Schalter -std=gnu++11 bei mir nicht:
„g++ -std=c++11 -DRPI RCSwitch.cpp android-funksteckdosen.cpp -o funk -lwiringPi“
c1plus: error: unrecognized command line option ‚-std=c++11‘
Ohne diesen bekomme ich Fehlermeldungen.
Was kann ich tun ?
Statt
std=c++11
kannst du-std=c++0x
versuchen.Hallo Felix,
deine Kommentare sind mir aufgefallen, weil überaus freundlich, hilfreich und nett.
Ich bin Anfänger mit Ideen und suche jemand der mich in die Programmierung einführt.
Ich würde mich freuen, wenn du mir antwortest.
Liebe Grüße
Danke für Deine Antwort. Leider geht das auch nicht. Was für ein Image benutzt du denn ? bzw. gcc version ?
ich benutze
“ gcc –version“
gcc (Debian 4.6.3-14+rpi1) 4.6.3
Meine Raspbian Jessie Version ist ein paar Monate alt.
Hey,
danke für die gute Anleitung!
Ich habe nur noch Probleme mit der status.json Datei.
Und zwar bekomme ich nach dem Befehl „sudo ./funk“ folgende Fehlermeldung:
funk: rapidjson/filewritestream.h:37: rapidjson::FileWriteStream::FileWriteStream(File*, char*, std::size_t): Assertion fp_!=0 failed
Habe jetzt leider nicht so den Überblick über den rapidjson code bekommen..
bei der Pinbelegung auf dem Bild am Empfänger stimmt nicht mit meinen überein.
Bei mir ist V+ und GRD – vetauscht.
Du hast recht, danke für den Hinweis 🙂 Ist geändert.
Wäre toll wenn du da Bild mit der falschen pinbelegung raus nehmen / ersetzen würdest ,
Habe dementsprechend angeschlossen und mir das empfngsmodul zerschossen , nicht so toll .
Wunderte mich nur warum ich nichts empfangen habe . Nachdem ich auf dem modul die richtige polung sah und die getauscht habe war es schon zu spät , neues modul dran ( richtig gepolt) und es funktioniert.
Sind ja zum Glück nicht teuer , nur eben unnötige Fehlersuche.
Erledigt 🙂
Hallo Felix,
weist du wann Droid-lernen.de wieder online ist? Seit mindestens einer Woche sind sie in Wartungsarbeiten(weiß nicht wie lange das so ist). Könnest du uns die App zur Verfügung stellen, falls das noch länger dauert?
Vielen Dank
Hi Josue,
sorry das kann ich leider auch nicht sagen. Du könntest aber die Seite aus der WaybackMachine bzw. dem Google Cache abrufen. Der Code der App hat sich ja nicht verändert. Alternativ könntest du Marvin von Droid-Lernen auch kontaktieren.
LG, Felix
Wieder was gelernt. Dankeschön 🙂
Hallo Josue,
Droid-Lernen.de ist wieder online.
Ich entschuldige mich für die längere DownTime.
Gruß,
Marvin von Droid-Lernen
Hallo,
danke für die super Anleitung,
hat jemand eine Idee, wie man die Steckdosen über eine Website (mit lokalem Webserver am Raspberry Pi) ansteuern kann?
Freu mich schon auf eure Inputs 🙂
Hallo,
droid-lernen ist erneut offline und in der Wayback Maschine ist nicht alles archiviert. Hat hier jemand eventuell eine Kopie der Android per App Steuern Artikelserie und kann sie zur Verfügung stellen? (insg. 6 Artikel).
Hallo
Kann man die App auch über einen anderen Weg erreichen, weil die Internetseite von Droid-Lernen.de nicht ereichbar ist? Über Google Cache und WaybackMachine ist die Seite auch nicht erreichbar.
Hallo ich habe schon einige deiner Projekte erfolgreich ausprobiert. Diesemal komme Ich aber nicht weiter. Das kompilieren des Programms verlief erfolgreich ,aber beim Start bekomme Ich folgende Meldung:
Unable to determine hardware version. I see: Hardware : BCM2835
– expecting BCM2708 or BCM2709.
If this is a genuine Raspberry Pi then please report this
to projects@drogon.net. If this is not a Raspberry Pi then you
are on your own as wiringPi is designed to support the
Raspberry Pi ONLY.
Ich habe einen Rasperry3
Kann mir da jemand weiterhelfen?
Habe es selbst gefunden. WiringPi war eine alte Version.
Hallo zusammen, vielen Dank für das super Tutorial. Was bedeutet PIN_SEND, und wo kann ich den Wert bei wiringPi finden und wann muss ich ihn ändern? Bezieht er sich auf den Anschluss der Kabel auf dem Steckboard oder bezieht er sich auf die einzelnen Steckdosen?
PIN_SEND ist die Variable für die WiringPi Nummer des GPIOs für den Sende Pin.
Hallo Felix,
deine Kommentare sind mir aufgefallen, weil überaus freundlich, hilfreich und nett.
Ich bin Anfänger mit Ideen und suche jemand der mich in die Programmierung einführt.
Ich würde mich freuen, wenn du mir antwortest.
Liebe Grüße