In diesem Blog Eintrag möchte ich mein aktuelles Projekt zur Steuerung von 433 MHz Funksteckdosen mit einem Raspberry Pi beschreiben. Der Minicomputer stellt dabei eine REST API zur Verfügung mit dem ich die Steckdosen über einen Webbrowser oder eine Home Automation Plattform von überall in der Wohnung oder auch aus der Welt steuern kann.

Warum 433 MHz Funksteckdosen?

Wie sicherlich viele andere auch besitze ich bereits eine gewisse Anzahl solcher Steckdosen mit einer Funkfernbedienung. Teilweise auch seit dem Einzug hinter Möbeln schwer erreichbar verbaut und damit nur mit größerem Aufwand zu tauschen.

Als eines der wenigen Selbstbauprojekte die ich kennen ist dieses sogar vom finanziellen Aspekt interessant. Während man ein Paket mit drei bis vier 433 MHz Steckdosen für um die 20,00 Euro bekommt, zahlt man für eine WLAN Steckdose immer noch schnell das Doppelte. Ab einer gewissen Anzahl von zu steuernden Steckdosen lohnt sich das ganze also trotz Zusatzkosten für den Raspberry Pi und die investierte Zeit.

Einen Nachteil haben die 433 MHz Steckdosen jedoch, nämlich die fehlende Rückmeldung ob der Schaltvorgang erfolgreich war. Für die meisten Schaltvorgänge (u.a. Lampen) ist das aber in meinen Augen vernachlässigbar.

Verteilte Hausautomatisierung mit Funksteckdosen

Es gibt diverse Tutorials (siehe Google Suche) wie man mit einem 433 MHz Modul Steckdosen per Raspberry PI ansteuert. Die besondere Herausforderung bei der Hausautomatisierung ist, dass die 433 MHz Sender nur eine relativ begrenzte Reichweite haben. Noch mehr wenn, wie in eigentlich jeder Wohnung, Wände im Weg sind.
Daher habe ich eine Möglichkeit gesucht die Steckdosen nicht nur über einen Raspberry P, sondern im kompletten Heimnetzwerk über eine REST API, zu steuern. Dadurch kann ich in Kombination mit zum Beispiel einer Home Automation Plattform ein verteiltes System aufbauen und Steckdosen in der ganzen Wohnung zentral steuern.

Ich konnte bei meiner Recherche keine fertige Lösung für eine REST API finden, um die Steckdosen einfach über einen Webbrowser oder eine Home Automation Plattform zu steuern. Daher habe ich selbst einen solchen REST API Server für das Projekt in Node.js geschrieben. Der Quellcode für die API ist übrigens auf GitHub zu finden.

Auswahl und Aufbau der Hardware

Verwendete Hardware

Sofern ihr noch keinen Raspberry PI und entsprechendes Zubehör zum Aufbau von Schaltungen besitzt und evt. mehr ausprobieren möchtet würde ich euch ein Raspberry Pi Starter-Set * empfehlen. Dort sind alle Teile enthalten mit den man die ersten Schritte machen kann.

Zum Aufbau dieser Schaltung reichen im Zweifel aber auch nur ein Raspberry Pi mit Netzteil, das Sendemodul und ein paar Jumperkabel (Female-Female). Wer mag kann das ganze dann am Ende noch in einem Gehäuse verstecken.

Aktuell ist der Raspberry PI 3 das am besten erhältliche und vom Preis-/Leistungsverhältnis sinnvollste Modell. Grundsätzlich funktioniert die Schaltung und Software aber mit jedem Modell. Ich habe zum testen selbst ein „nur“ ein Raspberry Pi Model B verwendet.

Die benötigte Hardware habe ich in der folgenden Tabelle aufgelistet:

Bezeichnung Preis
Raspberry Pi 3 * ca. 39,00 Euro
Netzteil für Raspberry Pi 3 * ca. 10,00 Euro
microSD Karte, 16 GB * ca. 10,00 Euro
Gehäuse für Raspberry Pi 3 (Optional) * ca. 8,00 Euro
Jumperkabel * ca. 7,00 Euro
433MHz Sende- und Empfangsmodul, 3er Set * ca. 8,00 Euro
Funksteckdosen, 3er Set * ca. 18,00 Euro

Funksteckdosen mit einstellbaren Codes

Bei den Funksteckdosen ist es wichtig solche mit per DIP Schaltern einstellbaren Codes zu verwenden. Es gibt auch 433MHz Funksteckdosen mit selbstlernenden Codes. Diese Codes müssen dann jedoch erst ausgelesen werden und bei einem Stromausfall in der Regel auch wieder neu angelernt werden.
RCS 1000 N von Brennstuhl mit DIP Schaltern

Ich habe für diesen Artikel Steckdosen aus dem RCS 1000 N Set von Brennstuhl * verwendet, besitze jedoch auch eine No Name Serie aus dem Baumarkt die sich genauso schalten lässt.

433 MHz Sendemodul

433 MHz Sendemodul FS1000A

Um unsere Funksteckdosen schalten zu können brauchen wir ein 433 MHz Sendemodul. Diese findet man für relativ kleines Geld entweder einzeln oder auch als Pack mit mehren Modulen. Meistens wird der Sender auch in Kombination mit einem Empfangsmodul verkauft. Dann benötigen wir nur das quadratische Sendemodul.

Das Sendemodul verfügt über 3 Pins:

  • DATA – Daten
  • VCC – Spannungsversorung
  • GND – Masseanschluss

Außerdem gibt es noch einen Lötpunkt an den man eine Antenne anbringen kann um die Sendeleistung zu verbessern.

Aufbau der SchaltungAufbau der Schaltung mit 433 MHz Sendemodul und Raspberry Pi 3

Das 433 MHz Sender Modul kann direkt mit dem Raspberry Pi verbunden werden. Dafür könnt ihr entweder eine Steckplatine (Breadboard) verwenden oder direkt Female-Female Jumper Kabel. Mit letzterem hat man direkt einen Aufbau den man auch in einem größerem Gehäuse unterbringen kann.

Die Sendemodule vertragen in der Regel eine Betriebsspannung von 3,3 Volt bis 5 Volt, so dass wir bei der Spannungsversorgung auf beide Möglichkeiten am Pi zurückgreifen können. Im oben gezeigten Aufbau habe ich den Pin 4 (5 Volt) für die Spannungsversorgung (rot) gewählt, und GND mit dem Ground Pin vom Pi verbunden (schwarz). Den Data-Pin des Sendemodul habe ich mit dem Pin 11 ( GIPO 17, WiringPi 0) verbunden (blau).

Einrichtung der Software

Für den Betrieb der REST API müssen wir zunächst einige Voraussetzungen schaffen, falls diese noch nicht gegeben sind. Die Installation und Konfiguration des API Servers selbst ist dann aber schnell erledigt.

System

Zunächst bringen wir unser System auf den aktuellen Stand und installieren falls notwendig den benötigten Git-Core:

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install git-core

Wiring Pi installieren

Die RESTful API setzt auf dem rcswitch-pi bzw. genauer auf den Node JS Bindings node-rcswitch auf. Daher müssen wir auf dem Raspberry Pi zunächst die GIPO Interface Bibliothek Wiring Pi installieren die von node-rcswitch benötigt wird. Dies können wir mit den folgenden Befehlen erledigen:

$ git clone git://git.drogon.net/wiringPi
$ cd ~/wiringPi
$ ./build

Abschließend kann die Installation kurz mit dem folgendem Befehl getestet werden.

$ gpio -v
$ gpio readall

Node.js installieren

Node.js ist eine Plattform die in der der Chrome V8 JavaScript Engine ausgeführt wird und es erlaubt Server-Anwendungen in Javascript zu entwickeln. Die Platform verwendet npm als Paketmanager und erlaubt es so, Anwendungen einfach zu verteilen.

Node.js auf dem Raspberry Pi B+ oder älter installieren

Wir laden zunächst ein für den ARM Prozessor des Raspberry PI optimiertes Installations Paket herunter und installieren dieses dann mit dem zweitem Befehl.

$ wget http://node-arm.herokuapp.com/node_latest_armhf.deb
$ sudo dpkg -i node_latest_armhf.deb

Node.js auf dem Raspberry PI 2 oder neuer installieren

Hier kann man direkt die auch auf der Node.js Homepage beschriebene Installation für Debian Systeme mit den folgenden zwei Befehlen verwenden.

$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
$ sudo apt-get install -y nodejs

In beiden Fällen können wir anschließend mit folgendem Befehlt die installierte Version überprüfen:

$ node -v

RESTful API installieren

$ git clone https://github.com/c-klinger/node-raspi-rcswitch-api.git
$ cd ~/node-raspi-rcswitch-api
$ npm install

Anschließend müsst ihr in der Datei noch unter dem Punkt transmitter_pin den GIPO Pin eintragen, an dem ihr den Sender angeschlossen habt. Beachtet dabei die abweichende Pin Nummerierung von Wiring Pi.
Optional könnt ihr auch die Anzahl der Wiederholungen, die ein Signal gesendet wird unter retries anpassen. Sollte der Port 3000 der im Standard verwendet wird auf eurem Raspberry schon durch eine andere Anwendung belegt sein, kann dieser ebenfalls angepasst werden.

Nun können wir den API Server mit folgendem Befehl starten:

npm start

Anschließend sollten wir über unseren Browser nach dem Muster http://raspberrypi:3000/api/v1/switch/systemCode/unitCode/state unsere Steckdosen schalten können. Eventuell müsst ihr, abhängig von eurem Netzwerk, den Namen und den Port in der Adresse anpassen.

  • Der systemCode ist der fünf Zeichen lange Code den ihr in der Fernbedienung und den Steckdosen eingestellt habt.
  • Der unitCode ist die Nummer der Steckdose (1-4)
  • Der state kann entweder on oder off sein, je nachdem ob ihr die Steckdose ein oder ausschalten möchtet.

Über die Konfigurationsdatei device_config.json kann einzelnen Steckdosen auch ein Name zugewiesen werden, so dass man diese etwas einfacher ansprechen kann. Mehr dazu findet ihr in der README Datei unter dem Punkt Mapped device access.

Ausblick

Als nächstes steht noch die Integration der Steckdosen über die API in eine Home Automation Plattform an um sie einfach über eine Web-Oberfläche oder Smartphone App steuern zu können. Ich experimentiere in diesem Bereich noch mit einigen Lösungen, grundsätzlich ist das ansteuern von RESTful APIs aber bei allen möglich. Alternativ könnte man zum Beispiel auch einen Dienst wie IFTTT nutzen um die Steckdosen zum Beispiel über einen Amazon Echo * und Alexa zu steuern.

Aktuell ist der Aufbau bei mir wie auf den Fotos zu sehen auch noch ein Prototyp auf dem Breadboard. In einem nächsten Schritt werde ich den 433 MHz Sender noch zusammen mit weiteren Sensoren in einem Raspberry Pi Gehäuse unterzubringen um ihn dann an seinem Einsatzort im Wohnzimmer platzieren zu können.

Update – 20.01.2018

Ich habe die Codebeispiele basierend auf den Kommentaren und einer neueren Node.js LTS Version aktualisiert. Theoretisch sollte sich die API per npm install raspi-rcswitch-api installieren lassen, da dies in der Praxis jedoch zu Problemen geführt hat habe ich jetzt die Befehle zum Klonen des Quellcodes von GitHub und manuelle Installation im Artikel eingefügt.

Zusätzlich gibt gibt es jetzt einen Artikel dazu wie man die Sendeleistung / Reichweite mit einer externen Antenne verbessern kann.

Disclosure: Ich habe in diesem Artikel sogenannte Affiliate-Links verwendet und sie mit einem „*“ gekennzeichnet. Erfolgt über diese Links eine Bestellung, erhalte ich eine Provision vom Verkäufer, für den Besteller entstehen dabei keine Mehrkosten.


13 Kommentare

Alex · 25. August 2017 um 20:07

Hallo, genau das habe ich gesucht, krieg es aber nicht zu laufen. Frischer PI 2 und lt. Anleitung installiert endet mit:
npm start
npm ERR! Linux 4.9.41-v7+
npm ERR! argv „/usr/local/bin/node“ „/usr/local/bin/npm“ „start“
npm ERR! node v4.2.1
npm ERR! npm v2.14.7
npm ERR! path /home/pi/wiringPi/package.json
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall open

npm ERR! enoent ENOENT: no such file or directory, open ‚/home/pi/wiringPi/package.json‘
npm ERR! enoent This is most likely not a problem with npm itself
npm ERR! enoent and is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! Please include the following file with any support request:
npm ERR! /home/pi/wiringPi/npm-debug.log

Auf alle Fälle fehlt mehr als nur die JSON Datei. Gute Idee ?
Alex

    Alex · 25. August 2017 um 20:27

    Nochmal neuer Versuch, anderes Ergegbnis:
    npm WARN enoent ENOENT: no such file or directory, open ‚/home/pi/package.json‘
    npm WARN pi No description
    npm WARN pi No repository field.
    npm WARN pi No README data
    npm WARN pi No license field.
    pi@mhz:~ $ npm start
    npm ERR! Linux 4.9.41-v7+
    npm ERR! argv „/usr/bin/nodejs“ „/usr/bin/npm“ „start“
    npm ERR! node v6.11.2
    npm ERR! npm v3.10.10
    npm ERR! path /home/pi/package.json
    npm ERR! code ENOENT
    npm ERR! errno -2
    npm ERR! syscall open

    npm ERR! enoent ENOENT: no such file or directory, open ‚/home/pi/package.json‘
    npm ERR! enoent ENOENT: no such file or directory, open ‚/home/pi/package.json‘
    npm ERR! enoent This is most likely not a problem with npm itself
    npm ERR! enoent and is related to npm not being able to find a file.
    npm ERR! enoent

    npm ERR! Please include the following file with any support request:
    npm ERR! /home/pi/npm-debug.log

      Chris · 25. August 2017 um 21:25

      Beim ersten Versuch hätte ich jetzt pauschal auf die Node JS Version getippt. Ich nehme an
      $ gpio -v
      $ gpio readall
      funktionieren?
      Was sagt denn das npm-debug.log?

Alex · 5. September 2017 um 19:00

Hi, hatte vorher keine Zeit gehabt…
wie folgt siehts aus:
node -v
v6.11.2

gpio -v
gpio version: 2.44
Copyright (c) 2012-2017 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
Type: Pi 2, Revision: 01, Memory: 1024MB, Maker: Sony
* Device tree is enabled.
*–> Raspberry Pi 2 Model B Rev 1.1
* This Raspberry Pi supports user-level GPIO access.

gpio readall
+—–+—–+———+——+—+—Pi 2—+—+——+———+—–+—–+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 1 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+—–+—–+———+——+—+—Pi 2—+—+——+———+—–+—–+

Ich mach den PI noch mal neu mit Noobs und probieres es nochmal. WiringPI klappt, hab schon Steckdosen geschaltet. Melde mich….

Alex · 5. September 2017 um 20:00

Leider wieder gleiches Ergebnis. Frisch Rasperian installiert und danach deine Steps….

npm WARN enoent ENOENT: no such file or directory, open '/home/pi/wiringPi/package.json'
npm WARN wiringPi No description
npm WARN wiringPi No repository field.
npm WARN wiringPi No README data
npm WARN wiringPi No license field.
pi@mhz:~/wiringPi $ npm start
npm ERR! Linux 4.9.41-v7+
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "start"
npm ERR! node v6.11.2
npm ERR! npm v3.10.10
npm ERR! path /home/pi/wiringPi/package.json
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall open

npm ERR! enoent ENOENT: no such file or directory, open '/home/pi/wiringPi/package.json'
npm ERR! enoent ENOENT: no such file or directory, open '/home/pi/wiringPi/package.json'
npm ERR! enoent This is most likely not a problem with npm itself
npm ERR! enoent and is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! Please include the following file with any support request:
npm ERR! /home/pi/wiringPi/npm-debug.log

pi@mhz:~/wiringPi $ more npm-debug.log
0 info it worked if it ends with ok
1 verbose cli [ '/usr/bin/nodejs', '/usr/bin/npm', 'start' ]
2 info using npm@3.10.10
3 info using node@v6.11.2
4 verbose stack Error: ENOENT: no such file or directory, open '/home/pi/wiringPi/package.json'
4 verbose stack at Error (native)
5 verbose cwd /home/pi/wiringPi
6 error Linux 4.9.41-v7+
7 error argv "/usr/bin/nodejs" "/usr/bin/npm" "start"
8 error node v6.11.2
9 error npm v3.10.10
10 error path /home/pi/wiringPi/package.json
11 error code ENOENT
12 error errno -2
13 error syscall open
14 error enoent ENOENT: no such file or directory, open '/home/pi/wiringPi/package.json'
15 error enoent ENOENT: no such file or directory, open '/home/pi/wiringPi/package.json'
15 error enoent This is most likely not a problem with npm itself
15 error enoent and is related to npm not being able to find a file.
16 verbose exit [ -2, true ]

Idee?

    Chris · 27. November 2017 um 23:43

    Sorry ich war hier für einige Zeit raus, habe aber in der Zwischenzeit mal einen Pi 2 in die Finger bekommen. Dort bekomme ich tatsächlich den gleichen Fehler. Habe jetzt die Gegenprobe nicht mehr gemacht, bin mir aber sicher, dass genau diese Befehle auf dem Pi 3 gehen …

    Workaround auf dem Pi 2:
    git clone https://github.com/c-klinger/node-raspi-rcswitch-api.git
    cd node-raspi-rcswitch-api
    npm install

    Spaß haben … zumindest bei mir. Älteres Debian, nodejs war gerade auf 8, wenn 6 noch installiert ist. Sonst einfach oben die 6 gegen die 8 tauschen.

    curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash –
    sudo apt-get upgrade

    Wenn ich mal Zeit habe versuche ich mal dem npm install Problem auf den Grund zu gehen…

      Alex · 8. Dezember 2017 um 20:39

      Ok. ich probiere es mal…..

Nico · 9. Dezember 2017 um 17:10

Hi, wie sieht die Sendeleistung bei dir aus? Ab 2m hat das Funkmodul nur noch sehr sporadisch die Befehle übermittelt… Kommst du ohne Antenne klar?

    Chris · 17. Dezember 2017 um 23:25

    Kommt ein bisschen auf die Raumsituation an. Bei „Sicht“ ist das i.d.R kein Problem, bei sehr versteckten Ecken und eingebautem Sender im Gehäuse etc. habe ich bei 2-3 Steckdosen auch Probleme die zuverlässig zu schalten. Wollte da wenn ich mal Zeit finde eine Antenne ausprobieren.

    Die Module vertragen ja 3.3V oder 5V. Habe mal gelesen mit 5V soll es etwas besser gehen, daher laufen die bei mir auch auf 5V

    Chris · 20. Januar 2018 um 15:07

    Ich habe das ganze inzwischen mal mit einer Antenne ausprobiert. Funktioniert deutlich besser. Eine Anleitung findest du in einem extra Artikel: https://chrisklinger.de/2018/01/433-mhz-antenne-zur-verbesserung-der-ansteuerung-von-funksteckdosen/

Alex · 9. Dezember 2017 um 22:21

Installation hat jetzt geklappt. Starten auch. Jetzt mach ich weiter mit den Codes..Danke. Und schönen 2. Advent.

Alex · 11. Dezember 2017 um 20:51

Funktioniert ! Hab aber auch einige Steckdosen, bei denen den Code nicht einstellen kann. Wenn man den mit RFsniffer ausliest, werden nur 2 stellige Codes geliefert. Die kann ich wohl mit dem Webdienst nicht ansprechen…

Schreibe einen Kommentar

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