Mit dem Raspberry Pi 433 MHz-Funksteckdosen schalten

Sicher hat fast jeder diese praktischen Funksteckdosen zu Hause. So auch ich. Die gab es mal günstig bei Pollin für 10 Euro. Aber man kann sie natürlich auch bei anderen Elektronikversendern oder auch im Baumarkt finden. Sie ersparen einem viel Gestrecke und Gebücke. Es ist einfach wunderbar, wenn man einen Knopf auf der Fernbedienung drücken kann und das Licht geht an, ohne dass man einen Stecker in eine Steckdose einstecken oder einen Schalter an einer schlecht zugänglichen Stelle betätigen muss.

Die Nachteile seien auch gleich erläutert: Zuerst einmal verbrauchen die Funksteckdosen selbst Strom. Nicht viel, maximal 1 Watt für meine. Aber dennoch: das macht 8.6 kWh oder etwas über 2 Euro pro Dose pro Jahr.


Zweitens sind sie nicht sicher. Man kann in den Steckdosen (und entsprechend natürlich auch in den Fernbedienungen) nur über 5 Bits den Systemcode einstellen, auf die die Funksteckdose hören soll. Macht 25, gleich 32 Möglichkeiten. Pro System kann man 5 Steckdosen anschließen. Macht insgesamt 32*5 = 160 Steckdosen. Wenn ich ca. eine Zehntel Sekunde zum Senden eines Codes brauche, habe ich in 16 Sekunden alle Geräte eingeschaltet, die an einer Funksteckdose hängen. Oder ausgeschaltet. Oder wenn man den Nachbarn ärgern will, schaltet man ihm alles im 16-Sekunden-Takt ein und aus (und kassiert ggf. eine Anzeige wegen Belästigung der Allgemeinheit / groben Unfugs, also nicht machen, bitte).

Außerdem ist die zulässige Leistung der Steckdose herabgesetzt und nicht mehr die üblichen 3500 Watt, sondern nur noch 1000 Watt. Aber das sollte nicht stören, denn man sollte aus erwähnten Sicherheitsgründen eh keine größeren Verbraucher der Gefahr aussetzen, unberechtigt eingeschaltet zu werden. Wenn es aber nur eine 5W-LED-Lampe ist, die an der Funksteckdose hängt, dann kann nicht viel passieren. Wenn ich nach 3 Wochen aus dem Urlaub zurückkomme und die Lampe war ungewollterweise die ganze Zeit an, dann kostet mich das keine 70 Cent.







Den Systemcode stellt man üblicherweise über sogenannte DIP-Schalter an der Fernbedienung und jeder Steckdose ein. Das sind fünf kleine Schalterchen in einem oft roten Gehäuse, die man mit einem Kugelschreiber nach oben (1) oder unten (0) schieben kann. Dadurch kann man mehrere Systeme betreiben. Wenn einem der Nachbar also ständig den Fernseher ausschaltet, hilft es nicht viel, ihn wieder einzuschalten, wenn dies das Gerät des Nachbarns auch wieder einschaltet und der dann wieder beide (seines und ihres) ausschaltet. Dann sollte man frei nach dem Motto "Wer zuerst kommt, mahlt zuerst" und dem Prinzip "älteres Recht für den zuerst Dagewesenen" seinen Code anders einstellen, damit man dem Nachbarn nicht mehr in die Quere kommt.

An den Steckdosen stellt man nicht nur den Systemcode ein (oben im Bild 12345), wobei hier beliebig viele Schalter hochgeschoben werden dürfen, um 32 Kombinationsmöglichkeiten zu erreichen, sondern auch die Nummer der Funksteckdose im System (ABCDEF). Hier darf nur ein Schalter nach oben geschoben werden. Eine Funkfernbedienung kann maximal 5 Geräte in einem System steuern. Meist haben die Fernbedienungen allerdings nur 4 Knöpfe.

Der 433-MHz-Sender FS1000A


Im Paket habe ich einen Sender FS1000A und einen Empfänger MX-RM-5V für kleines Geld erhalten. Aus dem Empfänger habe ich außer einem eigentlich immer gleich bleibenden Digitalsignal um 400 Hertz nichts heraus bekommen, egal wie sehr ich die Funkfernbedienungen bemühte. Wahrscheinlich ist das Modul defekt. Eine kalte Lötstelle ist mir gleich aufgefallen. Aber die Beseitigung führte zu keiner Besserung. Darum gehe ich hier nicht weiter auf den MX-RM-5V ein. Ein besseres Empfangsmodul ist bereits bestellt und wenn es da ist, werden wir uns auch mit dem Empfang beschäftigen.

Heute geht es nur um das Senden von Codes zum Schalten von Funksteckdosen mit dem FS1000A. Der Aufbau des Moduls ist denkbar einfach. Eine Leitung für die Versorgungsspannung VCC (5V, sendet aber auch klaglos mit 3.3V, dann aber vielleicht nicht so weit), eine Leitung GND, die an Masse muss und eine Leitung Data, die an einen Pin der Raspberry Pis muss, um das Signal daran auszuwerten. Ich habe mich hier für den Pin BCM 17 entschieden, weil dies der Default-Pin für die RC_Switch-Library ist und er bei mir noch frei war. So spart man sich das Umschreiben des Codes. Den Pin BCM 27 sollte man sich schon einmal für das Empfangsmodul reservieren.

Technische Daten Sendemodul FS-1000A Um den Sender komfortabel von der Kommandzeile zu steuern gibt es die 433-Utils von NinjaBlocks. Diese basiert wiederum auf der RC_Switch Library. Außerdem bringt das Paket auch noch Dinge für den Arduino mit.

433 Utils installieren

Installiert wird das Paket, indem wir es von GitHub herunterladen und kompilieren git clone --recursive git://github.com/ninjablocks/433Utils.git cd 433Utils/RPi_utils/ make Hängt die Datenleitung nicht an BCM 17, sondern an einem anderen Pin, muss in send.cpp die Zeile int PIN = 0; vor dem Kompilieren (make) angepasst werden. Es ist hier die WPI-Nr. anzugeben, die man hier nachschlagen kann. Außerdem muss das WiringPi-Paket installiert sein. Danach finden sich ein paar Tools im Verzeichnis ~/433Utils/RPi_utils pi@raspberrypi:~/433Utils/RPi_utils $ ll insgesamt 104K drwxr-xr-x 2 pi pi 4,0K Sep 12 18:35 . drwxr-xr-x 7 pi pi 4,0K Sep 12 18:33 .. -rwxr-xr-x 1 pi pi 20K Sep 12 18:35 codesend -rw-r--r-- 1 pi pi 2,0K Sep 12 18:33 codesend.cpp -rw-r--r-- 1 pi pi 2,3K Sep 12 18:35 codesend.o -rw-r--r-- 1 pi pi 535 Sep 12 18:33 Makefile -rw-r--r-- 1 pi pi 925 Sep 12 18:33 README.md -rwxr-xr-x 1 pi pi 21K Sep 12 18:35 RFSniffer -rw-r--r-- 1 pi pi 1,3K Sep 12 18:33 RFSniffer.cpp -rw-r--r-- 1 pi pi 2,7K Sep 12 18:35 RFSniffer.o -rwxr-xr-x 1 pi pi 20K Sep 12 18:35 send -rw-r--r-- 1 pi pi 1,9K Sep 12 18:33 send.cpp -rw-r--r-- 1 pi pi 3,0K Sep 12 18:35 send.o Interessant ist für das Senden das Tool send. Die Syntax ist einfach: ./send <systemCode> <unitCode> <command> [pulseLength]. Der SystemCode ist binär anzugeben und muss mit dem DIP-Schalter übereinstimmen. UnitCode gibt das Gerät für das gewählte System an und beträgt zwischen 1 bis 5 (für A bis E). Und Command schließlich kann 0 für ausschalten und 1 für einschalten sein. ./send 11111 3 1 schaltet z. B. das 3. Gerät des Systems 11111 ein.

In Python integrieren

Ich habe den Sender in mein Projekt Always-On-Display, zuletzt erweitert durch eine Infrarot-Fernbedienung, integriert, indem ich einfach einen entsprechenden Prozess starte und das Tool aufrufe: def funksteckdose (steckdosenNr, onOff): # steckdosenNr = 1 bis 5 (für A bis E), onOff = 1 | 0 proc=os.popen("/home/pi/433Utils/RPi_utils/send 11111 "+str(steckdosenNr)+ " " +str(onOff)) Die 11111 ist natürlich nicht echt - hier muss noch der reale Systemcode rein.

Jetzt kann ich z. B. in dem Always-On-Display-Programm automatisch um 1.00 morgens mit funksteckdose(1,0) und funksteckdose(2,0) Fernseher und Raumlicht ausschalten, für den Fall, dass ich mal wieder vorm Fernseher weggepennt bin. Ist der Fernseher eh schon aus, läuft der Befehl ins Leere und wenn nicht, freut es den Geldbeutel (Stromkosten).

Natürlich sind auch noch andere Dinge möglich: Ab einer bestimmten vom Raspi gemessenen Temperatur den Deckenventilator einschalten, das Licht einschalten, wenn der PIR-Sensor bemerkt, dass ich den Raum betrete oder ab 23:00 das Telefon aus und um 08:00 die Kaffeemaschine einschalten. Freilich kann man auch den Systemcode übergeben und somit mehrere Systeme und insgesamt bis zu 160 Steckdosen steuern - falls man keine Sicherheitsbedenken hat.