Auf der Suche nach einer Anleitung, wie ich mein vor einiger Zeit gekauftes Funksteckdosen-Set (REV Ritter, 8342-BHC, Foto am Ende des Artikels) über einen Raspberry-Pi schalten kann, habe ich im Internet lediglich Anleitungen für Funksteckdosen gefunden, bei denen man über Schalter den Code einstellen kann. Bei meinen Funksteckdosen kann man das leider nicht. Durch das Ändern der Pulslänge des gesendeten Signals kann ich die Funksteckdosen nun ansprechen. Ich vermute, dass das beschriebene Vorgehen auch für andere Funksteckdosen funktioniert.
Die Funksteckdosen hören auf ein Signal mit 433 MHz Wellenlänge. 433 MHz Empfänger und Transmitter für den Raspberry Pi gibt es für ein paar Euro zu kaufen (siehe Fotos am Ende des Artikels).
Voraussetzungen:
- Pi läuft mit einer auf Debian basierenden Distribution (z.B. Raspbian)
- Sende- und Empfangsmodul 433 MHz (siehe Fotos)
Zunächst müssen die beiden Module folgendermaßen an den Raspberry Pi oder Banana Pi angeschlossen werden (bei beiden werden dieselben PINs benutzt):
Sende-Modul (guadratisch und kleiner als Empfängermodul, mit 3 Pins):
VCC —> Pin-2 (5 Volt)
GND —> Pin-6 (GND)
ADAT —> Pin-11 (PI 19)
Empfänger-Modul (länglich, 4 Pins von denen nur 3 benutzt werden):
VCC —> Pin-1 (3,3 Volt)
GND —> Pin-9 (GND)
DATA —> PIN-13 (PI 18)
Beim Empfänger-Modul gibt es zwei mit “DATA” bezeichnete Anschlüsse, ich habe den benutzt, der direkt neben dem GND-Anschluss auf dem Modul sitzt.
Bei beiden Modulen sind schon Antennen vormontiert. Beim Sendemodul habe ich den gewickelten Draht “entwickelt” – ich verspreche mir davon eine größere Reichweite, habe das aber nicht nachgemessen. Mit den Fotos am Ende des Artikels kann die Verkabelung gut nachvollzogen werden.
Um die GPIO-Pins ansprechen zu können, das Programm WiringPi installieren:
Für Raspberry Pi: Anleitung Installation WiringPi für Raspberry Pi
Für Banana Pi: Anleitung Installation WiringPi für Banana Pi
Das Paket wird im Ordner /usr/local/bin/gpio installiert, so dass der WiringPi-Ordner im Benutzer-Verzeichnis wieder gelöscht werden kann.
Um Funk-Codes über WiringPi und die Module senden und empfangen zu können, das Programm https://github.com/ninjablocks/433Utils installieren:
(Update 24.01.2016: Damit der make all
-Befehl fehlerfrei ausgeführt werden kann muss das Paket build-essential
installiert sein. Daher die erste Zeile im folgenden Codeblock hinzugefügt.)
sudo apt-get update && sudo apt-get install build-essential git clone https://github.com/ninjablocks/433Utils.git cd 433Utils/RPi_utils make all
Das Sendemodul scheint nach dem Anschließen (oder auch nach einem Neustart) ein großes “Rauschen” zu produzieren, so dass die Steckdosen nicht auf das Signal der Fernbedienung reagieren und auch das Auslesen der Fernbedienung nicht funktioniert. Dieses “Rauschen” lässt sich jedoch relativ einfach durch das Senden eines beliebigen Funksignals beenden (unter Bananian-Linux muss das “sudo” bei den Befehlen weggelassen werden):
sudo ./codesend 1
Erst danach war es möglich, die Codes der mitgelieferten Fernbedienung (Typ: 8342-BHC) auszulesen. Im Terminal den folgenden Befehl ausführen (es erfolgt zunächst keine Ausgabe):
sudo ./RFSniffer
Dann mit der Fernbedienung ganz nah (1cm) an den Empfänger gehen, nacheinander die Tasten drücken, die Terminalausgabe beobachten und die ermittelten Codes notieren. Falls keine Terminalausgabe erfolgen sollte, kann man versuchen, den Empfänger an den noch freien 5V-PIN (PIN-4) anzuschließen.
Der notierte Code kann mit folgendem Befehl gesendet werden (XXXXX mit dem Code ersetzen, der Code kann länger oder auch kürzer sein):
sudo ./codesend XXXXX
Obwohl bei mir die zu schaltende Funksteckdose nur etwa 20cm vom Empfänger entfernt ist, hat das nicht funktioniert. Dass das Sendemodul kaputt war konnte ich ausschließen, da ich in einem zweiten Terminalfenster mit RFSniffer die gesendeten Signale empfangen konnte. Bei einer Internet-Recherche bin ich auf die Seiten https://www.bastelbunker.de/funksteckdosen-von-rev-uber-arduino-ansteuern/ und http://dc2ip.darc.de/funksteckdose.htm gestoßen. Da ich mich mit Elektronik ungenügend auskenne, hatte ich jedoch Hemmungen, das Plastikgehäuse meiner Fernbedienung zu zerstören.
In einem Kommentar eines anderen Blogs (http://www.3bm.de/2012/09/19/arduino-funksteckdosen-ansteuern/#comment-295) habe ich eine RC-Switch Implementierung auf Github gefunden, bei der im Code eine Pulslänge angegeben ist. (https://github.com/thjm/rcswitch-pi/blob/master/sendRevBHC.cpp). So kam ich auf die Idee, mit der Pulslänge des gesendeten Signals rumzuspielen.
In der Datei 433Utils/RPi_utils/codesend.cpp diese Zeile suchen:
mySwitch.enableTransmit(PIN);
Direkt danach die folgende Zeile einfügen (die Zahl in Klammern gibt die Pulslänge in µs an):
mySwitch.setPulseLength(180);
Nach der Änderung muss neu kompiliert werden mit:
make
Jetzt erneut den notierten Code senden:
sudo ./codesend XXXXX
Die Pulslänge habe ich in 20er-Schritten ausprobiert. Meine Funksteckdosen sprechen auf eine Pulslänge von 100-260µs an (bei anderen Modellen mag das anders sein) und ich habe meine codesend.cpp auf eine Pulslänge von 180µs eingestellt, einfach nur weil das in der Mitte der funktionierenden Werte liegt. Vermutlich ist das aber irrelevant.
Da das Sendemodul auch nach einem Neustart das oben beschriebene “Rauschen” erzeugt, habe ich folgende Zeile der Datei /etc/crontab hinzugefügt, um das “Rauschen” zu beenden:
@reboot root /Pfad/zum/Ordner/433Utils/RPi_utils/codesend 1
Nach Bedarf kann die Datei 433Utils/RPi_utils/codesend in den Ordner /usr/local/bin/ kopiert werden, so muss man nicht immer in den 433Utils-Ordner wechseln um einen Code zu senden und der Befehl kann leicht in eigene Skripte (oder ein Webinterface) eingebaut werden.
Bei der Internetsuche nach meinen Funksteckdosen bin ich auf den Hinweis gestoßen, dass die Steckdosen von REV über sogenannte TriState-Signale angesprochen werden können. Diese Signale kann auch der oben schon genannte Fork von rc-switch senden (https://github.com/thjm/rcswitch-pi). Doch zumindest bei meinen Funksteckdosen ist es egal, ob ich TriState-Signale sende oder die Dezimalsignale, die der Befehl oben (codesend) versendet.
Update 21.07.2015: Ich habe mir mal die Mühe gemacht die einzelnen Tristate-Codes mit RFSniffer auszulesen. Dabei rausgekommen ist diese Tabelle: TriState-Codes.pdf
Mit Hilfe der Tabelle kann ich zumindest die TriState-Codes, die meine Steckdosen schalten, in die Dezimal-Codes umrechnen, mit denen ich ebenfalls meine Steckdosen schalten kann. Stichprobenartig habe ich diese Umrechnung auch bei den Werten von https://www.bastelbunker.de/funksteckdosen-von-rev-uber-arduino-ansteuern/ positiv überprüft. Ich weiß jedoch nicht, ob diese Umrechnung generell funktioniert.
Update 22.07.2015: Auf https://www.das-labor.org/wiki/Funkfernbedienung habe ich gelesen, dass TriState-Codes nicht trinär, sondern binär gesendet werden. Insofern müsste die angehängte Umrechnungstabelle allgemein gültig sein.
———————
Dateien und erläuternde Fotos:
TOP, 1000 Dank Dir, hatte exakt das selbe Problem.
Mein ELRO-Set funktionierte mit ./send und ./codesend aber mein ZAP-Set nicht.
Mit der Anpassung „mySwitch.setPulseLength(180);“ funktioniert jetzt alles perfekt 🙂
Dito, ewig rumgesucht und endlich funktionieren meine Steckdosen! 1000 Dank !!!
Beim Versuch Signale zu empfangen und zu senden bekomme ich die Meldung „Kommando nicht gefunden“
Installiert habe ich alles wie beschrieben und es gab auch keine Fehlermeldungen?
Hallo Klaus,
welcher Befehl wird denn nicht gefunden? Bzw. was gibst du ein, das diese Fehlermeldung verursacht?
Besser geht nicht! Funktioniert auf Anhieb.
Good job