Android + Raspberry Pi: Funksteckdosen App Bedienung

Projekte

Raspberry Pi + Android: Funksteckdosen per App schalten

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.



 

Raspberry Pi Funksteckdosen App erstellen und installieren

Bevor wir richtig starten verweise ich auf das Tutorial von droid-lernen.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.

Android Raspberry Pi Funksteckdosen App 433 MHz Sender Empfänger Anschluss

 

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:

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 droid-lernen.de.



, , , , , , , ,


7 Kommentare

  1. g. sagt:

    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 ?

  2. G. sagt:

    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

  3. Ingo sagt:

    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..

  4. Rette70 sagt:

    bei der Pinbelegung auf dem Bild am Empfänger stimmt nicht mit meinen überein.
    Bei mir ist V+ und GRD – vetauscht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!