Mit dem Raspberry Pi und OpenHAB Funksteckdosen (433 MHz) schalten

Wer zur Miete wohnt oder nicht seine Wände aufreißen möchte, der wird wahrscheinlich nicht unbedingt Relais nutzen können, um seine Geräte per Smart Home Panel zu steuern. Stattdessen können Geräte aber auch über Steckdosen per 433 MHz Funk gesteuert werden. Dazu bietet der Raspberry Pi eine hervorragende Plattform, um die OpenHAB Funksteckdosen auszulesen und per Klick an- und auszuschalten.

In diesem Tutorial nehmen wir daher jene Funksteckdosen in unsere Hausautomatisierung hinzu. Im speziellen lesen wir die Steckdosen aus und erstellen die Weboberfläche zum Schalten der Steckdosen.

 

Zubehör

Raspberry Pi Funksteckdosen (433Mhz)Raspberry Pi Funksteckdosen (433Mhz)

433MHz Funksteckdosen

Damit wir die 433.92 MHz Funksteckdosen über das Raspberry Pi und OpenHAB 2 verwenden und per Weboberfläche bzw. Touchscreen schalten können, ist folgendes Zubehör nötig:

Hinweis: Achte darauf, dass die Funksteckdosen manuell einstellbar (einstellbarer Hauscode) sind und nicht Plug & Play sind. Ich rate dazu die verlinkten 433 MHz Funksteckdosen von Brennenstuhl zu nehmen, da es mit diesen definitiv funktioniert und das Tutorial auch damit erstellt wurde. Weitere funktionierende Modelle können gerne in den Kommentaren verlinkt werden.

Eine weitere Möglichkeit bieten das Brennenstuhl Brematic Home Automation Gateway GWY 433, welches speziell auf deren Funksteckdosen ausgerichtet ist und natürlich auch mit OpenHAB genutzt werden kann. Allerdings wird dieses Gerät in diesem Tutorial nicht benötigt, da wir uns für wenige Euro das ganze auch selber bauen können.

 

OpenHAB Funksteckdosen vorbereiten

Beginnen wir mit der Verkabelung des 433 MHz Senders und Empfängers. Der Empfänger ist nicht unbedingt dauerhaft nötigt, aber mindestens jedoch zum Auslesen der Codes. Beide Module (Transmitter/Sender und Receiver/Empfänger) brauchen 5V Spannung. Daher wird VCC des Moduls an 5V angeschlossen des Raspberry Pi’s (Pin 2) und GND an einen freien GND Pin (z.B: Pin 6) angeschlossen.

Darüber hinaus wird der ATAD (Daten) Pin des Senders (im Bild rechts) an GPIO 17 angeschlossen. Einen der mittleren beiden Pins des Empfängers schließen wir an GPIO 27 an. Die der schematische Aufbau:

Raspberry Pi + OpenHAB Funksteckdosen App 433 MHz Sender Empfänger Anschluss SteckplatineMehr ist vorläufig nicht nötig, um zunächst die Codes auszulesen. Solltest du andere GPIOs verwenden, musst du dies gleich entsprechend anpassen.

Die Steckdosen sind per Hauscode einstellbar. Dazu musst du die Hinterseite öffnen und einen Code einstellen. Dabei sind die ersten fünf Schalter der Code (Unten: Null, Oben: Eins) und danach die Auswahl von A-E. In diesem Bild ist es Code 00011 für Steckdose E:

Den gleichen Hauscode stellst du auch in der Fernbedienung ein:

Schließe die Steckdose an und teste sie auf Funktionalität.

 

Software für 433 MHz Funksteckdosen installieren

Wir nutzen rc-switch und die 433Utils von ninjablocks, um die Funkcodes auszulesen. Öffne dazu eine SSH Verbindung zu OpenHAB und klone das Verzeichnis (git muss installiert sein: sudo apt-get install git):

cd /opt/
git clone --recursive git://github.com/ninjablocks/433Utils.git

Anschließend kompilieren wir die Dateien, wofür allerdings wiringpi notwendig ist:

sudo apt-get install wiringpi
cd /opt/433Utils/RPi_utils/
make

Nun kümmern wir uns um das Auslesen der Codes. Falls du die Codes bereits aus einem früheren Tutorial kennst, brauchst du sie nicht erneut auszulesen. Falls du sie nicht kennst, ist es sehr einfach diese Auszulesen. Starte dazu im Verzeichnis die ausführbare  RFSniffer Datei:

 ./RFSniffer

Drücke anschließend die Tasten der Funkfernbedienung, mit denen du die Steckdose an- bzw. ausschaltest. Die Codes werden nacheinander angezeigt. Es ist möglich, dass zwischen vielen Wiederholungen mal ein anderer Code angezeigt wird – dies ist aber oftmals einfach zu ignorieren. Drücke den Knopf am besten mehrere Sekunden und siehe welcher Code am häufigsten auftritt – dieser ist es mit hoher Wahrscheinlichkeit. Gleich wirst du es auch noch testen können.

Bei mir sind es diese Codes für meine zu schaltende 433 MHz Funksteckdose:

  • An: 5506385
  • Aus: 5506388

Nun senden wir die Codes als Überprüfung (passe deine Codes an):

./codesend 5506385

Die Steckdose sollte nun an- bzw. ausgeschaltet werden (je nachdem, welchen Code du gesendet hast).

Dieses Skript soll anschließend von OpenHAB aus aufgerufen werden, weshalb wir noch eine Bash Datei erstellen, in welcher die Codes gespeichert werden (inkl.

sudo nano /opt/433Utils/RPi_utils/run.sh

Die Datei bekommt den nachfolgenden Inhalt. Falls du mehrere Steckdosen schalten willst, kannst du das Skript entsprechend anpassen. Beachte auch, dass du deine entsprechenden Codes angibst:

#!/bin/sh
if [ "$1" = "D" ]; then
    if [ "$2" = "off" ] || [ "$2" = "0" ] || [ "$2" = "OFF" ]; then
        /opt/433Utils/RPi_utils/codesend 5506388
    else
        /opt/433Utils/RPi_utils/codesend 5506385
    fi
fi

Speichere mit STRG+O und kehre zurück ins Terminal mit Strg+X. Mit den nötigen Input Parametern (bspw: D OFF) kannst du das Skript auch bereits testen.

Für uns ist nachfolgend nur noch die codesend sowie unsere erstellte Bash Datei wichtig, daher geben wir diesen die nötigen Rechte:

sudo chmod +x /opt/433Utils/RPi_utils/codesend
sudo chmod +x /opt/433Utils/RPi_utils/run.sh

Übrigens: Falls du andere GPIO Pins nutzt, so musst du die Dateien vor dem Kompilieren bearbeiten (die Pin Nummerierung kannst du hier entnehmen).

 

OpenHAB Vorbereitung

In OpenHAB 2 müssen wir nun noch Things und Items für jede Steckdose anlegen. Wenn du mehr als eine Steckdose nutzt, so sollte das Shell Skript natürlich ebenfalls angepasst sein. In diesem Beispiel erstellen wir die Dateien allerdings erst einmal nur für eine 433 MHz Funksteckdose in OpenHAB.

Wir erstellen also zunächst ein Thing:

sudo nano /etc/openhab2/things/poweroutlets.things

Folgender Inhalt kommt hinein:

Thing exec:command:poweroutletD-control [ command="/opt/433Utils/RPi_utils/run.sh D %2$s", interval=0, autorun=true ]

Nach dem Speichern erstellen wir ebenfalls noch ein Item in einer separaten Datei:

sudo nano /etc/openhab2/items/poweroutlets.items

Dieser Inhalt kommt hier hinein (Namen etc. können angepasst werden):

Group grp_poweroutlets "Funksteckdosen Gruppe" <poweroutlet>
String poweroutletDSwitch "Funksteckdose D" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletD-control:input", autoupdate="true" }

Als letztes erstellen wir nur noch die Sitemap. Natürlich kann ebenso eine existierende Sitemap einfach erweitert werden, falls dies gewünscht ist:

 sudo nano /etc/openhab2/sitemaps/poweroutlets.sitemap

Das war es auch bereits. Nach speichern der Datei können wir zum nächsten Schritt gehen – dem Testen.

 

Testen der OpenHAB Funksteckdosen

Um das User Interface und die Funksteckdosen in OpenHAB 2 zu testen, rufen wir die gerade erstellte Sitemap über einen Browser (Desktop PC oder Smartphone) aus dem selben Netzwerk auf:
http://openhabianpi:8080/basicui/app?sitemap=poweroutlets

Hierbei sollte ein solches Bild erscheinen:

Mit dem Raspberry Pi und OpenHAB Funksteckdosen (433 MHz) schalten Panel

Durch betätigen des Schalters kannst du nun die Steckdose an- und ausschalten.

Damit ist es natürlich auch möglich seine 433 MHz Funksteckdosen über das Smartphone fernzusteuern. Gerade, wenn der Abstand der Steckdosen zum 433 MHz Sender größer ist, kann es sein, dass die Verbindung unterbrochen wird. In diesem Fall eignen sich ESP8266 Außenstationen, die ähnlich angesteuert werden.

 

Weiteres zur Benutzung von OpenHAB 2 und 433 MHz Funksteckdosen

Ein Problem, das wir bei der Benutzung haben, ist, dass beim Neustart des Raspberry Pi’s bzw. OpenHABs der Status der Steckdose verloren geht. Dies können wir allerdings durch Installieren des Perstistence Add-ons umgehen.

Ein weiterer Punkt ist, falls du die Steckdosen per Handsender schaltest, wird der Status in OpenHAB nicht automatisch geändert. Daher musst du in diesem Fall den RFSniffer im Hintergrund laufen lassen und bei erkanntem Signal den Status auch in OpenHAB 2 updaten. Dies geht zum Beispiel mit der REST API von OpenHAB 2.

Ach ja: Solltest du das ganze ohne Raspberry Pi und  OpenHAB  umsetzen wollen, ist dies auch möglich: Ein einfacher ESP8266 NodeMCU für wenige Euro ist ausreichend, um die Brennenstuhl Funksteckdosen zu schalten.

26 Kommentare

  1. Ich bin dabei das Setup mit einem ESP8266 aufzubauen, der per MQTT mit OpenHAB auf dem RasPi kommuniziert.

    Ich persistiere den Status und die Fernbedienung wird weggelassen 😊
    Aktuell versuche ich nun eine Zeitschaltuhr in OpenHAB nachzubilden. Aber so richtig gelingt mir das noch nicht. Ich habe es mir einer Regel versucht, doch irgendwie wird diese noch nicht ausgeführt.

    Antworten
  2. Vielen Dank für die Anleitung aber auch für die weitergehend Tipps am Ende des Beitrags.
    Frage: Wozu ist eigentlich Input Parameter „D“ gut? Welchen Sinn hat der?
    Könnte ich den auch weg lassen.

    Antworten
  3. Hallo,

    kannst Du demnächst vielleicht ein Beispiel posten, wie Du den Status in OpenHAB mit der „REST API“ und RFSniffer erfassen würdest? Das wäre klasse. Habe mir gerade die REST API Docu angeschaut und bin schwer ins Grübeln gekommen, wie das gehen soll.

    Vielen Dank, Andreas

    Antworten
  4. Ich habe länger mit RasPi und 433 MHz Funksteckdosen experimentiert. Ein Problem war in meinen Augen der fehlende Rückkanal: Man sieht nur, dass man einen Befehl gesendet hat, aber nicht, ob die Funksteckdose den auch ausführt.
    Wenn ich das richtig verstehe, wird auch der RFSniffer nur den Sendeimpuls eines Fremdsenders aufschnappen und den Status entsprechend auf dem RasPi anpassen. Damit ist aber nicht gesagt, dass die Funksteckdose auch wirklich geschaltet hat. Oder sehe ich das falsch?
    Ich bin schließlich auf teure AVM DECT Funksteckdosen umgestiegen, die ich mit dem RasPi schalte. Ein Zusatznutzen war dabei, dass man damit auch die Temperatur am Ort der Steckdose abfragen kann (ZB für Gewächshausheizung).

    Antworten
  5. Super Anleitung
    Bei mir hat es auf Anhieb geklappt. Habe aber noch ein kleiner Problem zwar ist die Kennung [„Switchable“] ja vorhanden aber Alexa erkennt die Steckdose nicht hat das was mit dem String zu tun ?
    Vielen Dank, Tim

    Antworten
  6. Tolle Anleitung und vielen Dank für die ausführliche Erklärung.
    Befasse mich nun gerade wenige Tage mit der Thematik – das Schalten einer Steckdose habe ich – dank Deiner Anleitung auch hinbekommen.
    Kannst Du mir bitte erklären, weche Schritte (Erweiteungen in den jeweiligen scripten) notwendig sind, um mehrere Dosen zu schalten?
    Für die Unterstützung schon mal besten Dank…,
    Christian

    Antworten
  7. Hallo,
    hört sich sehr interessant an. Leider scheitere ich gerade an eine sehr frühen Stelle…
    Ich benutze die Steckdosen von Brennenstuhl. Die Steckdosen funktionieren mit der Fernbedienung.
    Und ich habe den Aufbau mit Sender und Empfänger realisiert. Mit „codesend“ und „RFSniffer./RFSniffer“ funktioniert der Aufbau.
    Ich kann die Codes der FB nicht empfangen 🙁
    Da ich die Codes aus einem früheren Aufbau kenne, habe ich sie gesendet. Leider auch das ohne Erfolg.

    Antworten
  8. Hallo und danke für die Anleitung.
    Ich habe zwei 4er Sets Funksteckdosen verschiedener MArken (Elro und Intertechno) eingebunden und kann sie per openHAB nun steuern.
    Sinn des ganzen war, sie dann mit Alexa steuern zu können.
    Leider klappt das nicht.
    Wie oben schon von Tim geschrieben, scheint der Grund die Definition als „String“ zu sein.
    Die offizielle Dokumentation ist zwar recht kurz ausgefallen, aber in diversen Foren wird erwähnt, dass ein als „Switchable“ getaggtes Item auch ein Switch sein muss für Alexa.

    Lässt sich das bei der hier Beschriebenen Lösung irgendwie anpassen?

    PS: Da es hier gefragt wurde, hier mein Code zum Steuern mehrerer Steckdoesen:

    #!/bin/sh
    case "$1" in
            SA|sa)
                    case "$2" in
                    off|0|OFF) /opt/433Utils/RPi_utils/codesend xxx
                    ;;
                    on|1|ON) /opt/433Utils/RPi_utils/codesend xxx
                    ;;
                    esac
            ;;
    
            SB|sb)
                    case "$2" in
                    off|0|OFF) /opt/433Utils/RPi_utils/codesend xxx
                    ;;
                    on|1|ON) /opt/433Utils/RPi_utils/codesend xxx
                    ;;
                    esac
            ;;
    
            SC|sc)
                    case "$2" in
                    off|0|OFF ) /opt/433Utils/RPi_utils/codesend xxx
                    ;;
                    on|1|ON) /opt/433Utils/RPi_utils/codesend xxx
                    ;;
                    esac
            ;;
    
            SD|sd)
                    case "$2" in
                    off|0|OFF) /opt/433Utils/RPi_utils/codesend xxx
                    ;;
                    on|1|ON) /opt/433Utils/RPi_utils/codesend xxx
                    ;;
                    esac
            ;;
    esac
    Antworten
  9. Hallo,

    das Tutorial hat mir wirklich weitergeholfen.
    Nun möchte ich aber die Alexa-Sprachsteuerung benutzen, die soweit auch unter Openhabian (auf den Raspberry Pi) funktioniert.
    Leider kann Alexa den .Item-Eintrag „String poweroutletDSwitch „Funksteckdose D“ ….“ nicht finden, während „Switch“-Einträge gefunden werden.

    Danke im Vorraus

    Antworten
  10. Nachdem ich Tage lang erfolglos nach einer Lösung für Alexa recherchiert habe (offenbar hat niemand sonst das Alexa-Einbindeproblem), kommte ich mir selbst etwas erbasteln. Ich habe mir die Rules Thematik angeschaut und kam auf die Idee, ‚Dummy‘-Switche an zu legen, die per Rule dann die eigentlichen String Items der Funksteckdosen triggern. Funktioniert super mit Alexa.
    Ich poste hier meinen Code, reduziert auf 2 meiner 8 Funksteckdosen.
    (Achtung, ich habe die Bezeichnungen dem Tutorial gegenüber geändert)

    Inhalt der xxx.items Datei:

    //Echte Items fuer die Funksteckdosen
    Group grp_funksteck "Funksteckdosen Gruppe"  [ "Switchable" ]
    String funksteckWCSwitch "Steckdose C"  (grp_funksteck) [ "Switchable" ] { channel="exec:command:funksteckWC-control:input", autoupdate="true" }
    String funksteckWDSwitch "Steckdose D"  (grp_funksteck) [ "Switchable" ] { channel="exec:command:funksteckWD-control:input", autoupdate="true" }
    
    //Dummy Items fuer Alexa
    Group grp_alexa433 "Funksteckdosen Gruppe Alexa"  [ "Switchable" ]
    Switch Stecker_C_Alexa "Steckdose C"  (grp_alexa433) [ "Switchable" ]
    Switch Stecker_D_Alexa "Steckdose D"  (grp_alexa433) [ "Switchable" ]

    Inhalt der alexa.rules Datei:

    rule "Steckdose-C"
    when
        Item Stecker_C_Alexa received command
    then
        switch(receivedCommand) {
        case ON : { funksteckWCSwitch.postUpdate(ON)
                    funksteckWCSwitch.sendCommand("ON") }
        case OFF : { funksteckWCSwitch.postUpdate(OFF)
                    funksteckWCSwitch.sendCommand("OFF") }
      }
    end
    
    rule "Steckdose-D"
    when
        Item Stecker_D_Alexa received command
    then
        switch(receivedCommand) {
        case ON : { funksteckWDSwitch.postUpdate(ON)
                    funksteckWDSwitch.sendCommand("ON") }
        case OFF : { funksteckWDSwitch.postUpdate(OFF)
                    funksteckWDSwitch.sendCommand("OFF") }
      }
    end

    Die eigentliche Schaltung des ‚echten‘ Items erfolgt durch sendCommand. Das postUpdate ändert den Zustand des Items, der würde andernfalls nämlich trotz Schaltvorgang nicht geändert werden.

    Viel Erfolg damit.

    Antworten
  11. Super, auf Anhieb hat fast alles geklappt…
    Per rus.sh schalten geht.
    danach habe ich item, thing und sitemap 1:1 erstellt.
    Die Sitemap im Browser aufrufen geht, aber der Schalter hat keine Wirkung…
    Gibt es sowas wie einen Debugmodus, oder wie kann ich den Fehler suchen?

    Antworten
    • Hi,
      ich habe das gleiche Problem. Sehe den Schalter auch in der App auf dem Iphone. Der schaltet auch, was man im Log sehen kann. Aber irgendwie tut sich nichts. Wenn ich das Script in der Shell ausführe funktioniert es. Kann das an den Berechtigungen liegen? Die angegebene URL http://openhabianpi:8080/basicui/app?sitemap=poweroutlets funktioniert bei mir auch nicht. Fehler 404 not found. Komisch aber dass es die Handyapp tut.

      Antworten
      • Versuch es mal mit sudo -u openhab aus der Shell zu starten. Dass die Sitemap nicht geladen wird, deutet auf einen anderen Namen hin.

      • Hi, sudo -u openhab funktoniert auch. Das mit der Sitemap habe ich nun auch hinbekommen. Die war einfach im Standardsetup nicht intstalliert. Leider habe ich immer noch das Problem, dass die Schalter ohne Funktion sind.

      • Habe das gleiche Problem (Schalter ohne Reaktion). Ich habe die Weboberfläche einfach über die IP aufgerufen und mich zum BasciUI durchgeklickt. Laut event.log tut sich auch was, aber die Steckdosen bleiben aus. Die run.sh alleine funktioniert.

      • So, hab jetzt den Fehler gefunden.
        @Sodamann. Bei mir war nach der Installation das Exec Binding nicht installiert. Dies macht das Ausführen von Scripts auf Kommandozeilenebene erst möglich. Also in der PaperUI unter Bindings auf das + gehen und das Exec Binding installieren. Danach funktionieren auch die Schalter.

  12. Moin,

    erst mal Danke für die Anleitung und generell für die coolen Projekte. Ich habe deine Anleitung befolgt und meine Steckdosen (aktuell zwei) laufen auch sowohl per ./codesend, als auch per Script Bsp. exec /../../run.sh D ON bzw. OFF (gleiche mit C). Jedoch gehen die beiden nicht über das Interface von openHAB zu schalten. Sowohl einzeln nicht, wenn ich deine Anleitung eins zu eins befolge, als zu zweit eben nicht.

    Bin gerade etwas ratlos :/.

    Viele Grüße

    Dennis

    Antworten
      • Rechte sind genau wie in der Anleitung gesetzt, habe auch extra die gleichen GPio’s benutzt und die gleichen Namen.

        Meine Wetterdaten werden leider ebenfalls nicht angezeigt. Werde zur Sicherheit morgen openHAB noch mal neu aufsetzen.

  13. Hallo Leute, die Anleitung hat, nachdem ich auch das Binding „Exce“ installiert habe ohne Probleme funktioniert.

    Ich wollte jetzt eine Regel eingeben, dass wenn ein Ereignis eintritt, die Funksteckdose schaltet.
    Ich bekomme das doch zum Verrecken nicht hin 🙂
    Habt Ihr das hinbekommen?

    Die logische Regel:
    rule „Steckdose-D“
    when
    Item vAlleAusserHaus changed from OFF to ON
    then
    sendCommand(poweroutletDSwitch, „ON“)
    end

    funktioniert nicht.
    Kann ich nicht sagen, dass er einen „Codesend“ machen soll, wenn ein Ereignis eintritt?
    Hat jemand dazu eine Vorlage, die er hier posten würde, damit ich das auf meine Umgebung anpassen kann?

    Danke schon mal im Voraus

    Markus

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Raspberry Pi Tutorials, um kein Tutorial mehr zu verpassen!