Liebe Leserinnen und Leser – heute möchte ich euch mal beschreiben, wie ihr mithilfe des Raspberry Pi Funk-Steckdosen schalten könnt. Es gibt sicher einen Haufen praktischer Einsatzmöglichkeiten für diese Anwendung des Raspberry, ich selbst schalte damit meinen Drucker, der sich im Keller befindet ein und aus, da er auch im Standby einiges an Strom zieht und ich ungern für jeden Druck erstmal in den Keller laufen möchte, um ihn einzuschalten und dann wieder auszuschalten.
Aber jetzt zum Projekt selbst: Alles was ihr brauch sind folgende Dinge:
- einen Raspberry Pi
- einen 433MHz Sender (für 1,90 bei dx.com)
- ein paar Jumper-Kabel (gut 3€ bei dx.com) und bei Bedarf noch ein Breadboard (ca. 2,50 € bei dx.com)
- Funksteckdosen vom Typ Elro AB440S (die habe ich zumindest selbst getestet und im Einsatz)
Das ist hardwaretechnisch schon alles, was ihr dafür braucht, also relativ günstig zu bekommen. Der Aufbau der Hardware ist auch relativ simpel. Die folgende Skizze soll den Aufbau verdeutlichen:
Allgemein sieht die Verkabelung folgendermaßen aus:
Sender Raspberry Pi
ANT*
GND GND
DATA #17
VCC 5V
Der (zusätzliche) Antennen-Anschluss (ANT) ist das kleine Loch unten links auf dem Bild. Der Anschluss einer externen Antenne ist optional, da bereits eine auf dem Sender integriert ist (die Spule). Solltet ihr einen anderen Sender mit 433MHz verwenden, der keine integrierte Antenne besitzt (oder euch die Reichweite mit der internen Antenne nicht ausreichen), müsst ihr dort noch einen Jumper (oder ein leitendes Stück Draht) daran befestigen, das als Antenne fungiert. Damit lassen sich auch weiter entfernte Steckdosen steuern.
Das war es auch schon, was hardwaretechnisch zu tun ist, also alles relativ simpel, ohne Löten möglich und auch für handwerklich nicht so begabte Leute sollte das alles machbar sein.
Kommen wir nun zur Software. Hierzu müsst ihr erstmal euren Raspberry Pi starten, an dem alles wie oben beschrieben montiert wurde. Anschließen solltet ihr erst mal
sudo apt-get update
ausführen. Dadurch werden eure Paketquellen aktualisiert. Dann muss git-core installiert werden (falls nicht sowieso schon geschehen):
sudo apt-get install git-core
Um die Ansteuerung des Transmitters zu realisieren gibt es ein Projekt namens WiringPi. Dieses installiert ihr euch auf eurem Raspberry Pi wie folgt:
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
Auch für unseren Zweck, die Steckdosen zu steuern gibt es bereits ein Projekt. Dieses stammt von xkonni und nennt sich Raspberry-Remote. Ihr installiert es euch so:
cd ~
git clone git://github.com/xkonni/raspberry-remote.git
cd raspberry-remote
Damit es läuft, müsst ihr euch noch die send.cpp kompilieren, also folgendes eintippen:
make send
Das war es auch schon mit der Basis! Jetzt könnt ihr schon über das Terminal Befehle an eure Steckdosen schicken, um sie aus- und anzuschalten. Aber zuerst solltet ihr noch den Hauscode bei euren Dosen ändern, nicht, dass euer Nachbar zufällig auch diese Steckdosen hat und ihr euch diese gegenseitig an- und ausschaltet. Dazu öffnet ihr einfach mit einem Kreuz-Schraubendreher die Dosen hinten und legt die Dip-Schalter mit einem Code eurer Wahl um. Also z.B. hoch, hoch, unten, hoch, unten. Diese Kombination solltet ihr bei allen Steckdosen eingeben und dann auch bei dem Handsender. Mit diesem könnt ihr dann auch überprüfen, ob alles soweit schon funktioniert.
Falls dies der Fall ist, seid ihr kurz davor, eure Steckdosen erstmals über den Raspberry zu steuern. Über die gerade vorhin kompilierte send.cpp ist das möglich. Dazu gebt ihr einen Befehl nach dem Schema „sudo ./send <Hauscode> <Steckdosennummer> <Zustand 1 AN, 0 AUS>“ ins Terminal ein, also für den oben genannten Code für die Steckdose B (=2) zum Einschalten:
sudo ./send 11010 2 1
Jetzt sollte die Steckdose B angeschaltet werden. Falls dies der Fall ist: Herzlichen Glückwunsch!
Webinterface
Natürlich ist es etwas umständlich und unkomfortabel, das Ganze immer über das Terminal/eine SSH-Verbindung machen zu müssen. Aber kein Problem! Raspberry-Remote liefert auch gleich ein passendes Webinterface mit. Damit ihr das nutzen könnt, solltet ihr erst mal Apache und PHP installieren auf eurem Raspberry:
sudo apt-get install apache2
sudo apt-get install php5
Jetzt gehts zum Webinterface, was xkonni direkt mitliefert. Dazu habe ich im Ordner /var/www/html einen Unterordner remote erstellt. Anschließend den Inhalt von ~/raspberry-remote/webinterface dorthin verschoben: mv ~/raspberry-remote/webinterface/* /var/www/html/remote . Jetzt muss noch in der config.php Datei die IP Adresse des Raspberry Pis angepasst werden: dazu einfach nano verwenden.
[Update 2.11.2015] Hinweis: Die aktuell auf GitHub erhältliche Version des Webinterfaces von raspberry-remote machte bei mir Probleme, sodass ich auf diese ältere Version zurückgriff. Solltet bei euch die neue Version auch nicht funktionieren, könnt ihr die oben verlinkte, etwas ältere Version versuchen. Läuft die aktuelle Version bei euch, könnt ihr diese natürlich auch verwenden.
Nun fehlt noch der Daemon, auf den das PHP-Script des Webinterfaces zugreift. Dazu gehen wir in das Raspberry-Remote Verzeichnis zurück: cd ~/raspberry-remote und kompilieren den daemon: make daemon
Nun können wir diesen Starten: sudo ./daemon & (Das & bewirkt, dass der Prozess im Hintergrund läuft.
Jetzt können wir unser Glück mit dem Webinterface probieren: Dazu rufen wir von einem anderen Rechner/Handy das Webinterface per http://192.168.11.44/remote/ (Eure IP einsetzen) auf. Wenn das geht und dort die verschiedenen Steckdosen sichtbar sind, dann muss man jetzt nur noch in der config.php die Steckdosen mit Namen versehen und evtl. die Codes, etc. anpassen. Die Konfiguration sollte selbsterklärend sein.
Falls ihr eine Fehlermeldung wie „Switch out of range: GET /:XY“ bekommt, keine Sorge! In der daemon.cpp sind standardmäßig nur die Hauscodes 00000 & 00001 & 00010 abgedeckt. Das lässt sich aber einfach ändern. Geht dazu wieder ins Verzeichnis von Raspberry Remote (bei mir /home/pi/raspberry-remote/, also via cd /home/pi/raspberry-remote/) und öffnet die daemon.cpp mit nano. Darin befindet sich der Eintrag „nPlugs=10;“, welche ihr einfach durch „nPlugs= 1110;“. Anschließend über sudo make daemon neu kompilieren und über sudo ./daemon & wieder starten. Jetzt sollte auch bei euch das Webinterface funktionieren.
Automatischer Start des Daemon und Neustart bei Absturz
Um den Daemon automatisch bei Systemstart zu starten und um ihn bei einem möglichen Absturz neu zu starten, habe ich ein kleines Script geschrieben:
1 2 3 4 5 6 7 | #!/bin/bash # Check if daemon_remote running if ! ps aux | pgrep "daemon_remote" > /dev/null; then cd /home/pi/raspberry-remote/ ./daemon_remote & exit 0 fi |
Zur Verwendung: Zuerst sollte der daemon umbenannt werden in daemon_remote. Dazu die Datei „daemon“ (in /home/pi/raspberry-remote/) nach dem Kompilieren und vor dem Starten umbenennen: sudo mv daemon daemon_remote. Anschließend das obige Skript unter der Datei „daemon_restart.sh“ z.B. unter /home/pi/ abspeichern und über sudo chmod +x daemon_restart.sh ausführbar machen. Um es automatisiert zu starten legt ihr noch 2 Einträge in der root-crontab an via sudo crontab -e Dort diese Zeilen einfügen (einfach untern anhängen, je eine eigene Zeile):
1 2 | @reboot cd /home/pi/ && ./daemon_restart.sh */15 * * * * cd /home/pi/ && ./daemon_restart.sh |
Anschließend speichern und den Pi neu starten. Der Daemon sollte nun automatisch gestartet werden und zudem wird alle 15 Minuten überprüft, ob er noch läuft. Wenn nicht, wird er neu gestartet.
Für Raspbmc-Nutzer: Standardmäßig ist cron hier nicht aktiviert. Ihr müsst es in den Raspbmc-Einstellungen aktivieren, um es nutzen zu können! (Danke Christian!)
Alternative Webinterfaces
Interface von Dan
Dan hat in den Kommentaren (siehe hier) ein Paket bereitgestellt, das ein schöneres Design für das Webinterface bietet – danke dafür! Sicherheitshalber habe ich es auch auf den Blog-Webspace hochgeladen. Es sieht so aus:
Im Paket fehlen aus Lizenzgründen die Switch-Button-Bilder, welche ihr noch nachträglich ergänzen müsst. Da hier Sprites verwendet werden, lässt sich das Interface auch schnell den eigenen Design-Vorstellungen anpassen. Hier meine aktuelle Ansicht, die ich damit realisiert habe:
Zur Nutzung zitiere ich hier mal Dans Kommentar:
Am besten sicherheitshalber die index.php und das CSS backuppen und erst dann alle Dateien aus dem ZIP drüberbügeln.
Die Dateien “ie.css” und “logo_sd.png” sind für Windows Phone 7-Geräte, die aufgrund des alten Internet Explorers nicht mit Retina-Grafiken umgehen können.
Der on/off-Schalter befindet sich in einem Sprite mit den Maßen 106x174px. Die obere Hälfte des Sprites ist der “on”-Zustand, die untere “off”. Das müsstet ihr leider selbst basteln. Auch hier gibt es für WP7 eine Non-Retina-Version “on_off_sd.png” mit der halben Auflösung. Wer nur Android und/oder iOS benutzt, kann sich das sparen.
Interface von Matteo
Matteo hat in den Kommentaren eine Version des Webinterfaces gepostet, das sowohl vom Design angepasst wurde, als auch technisch um eine Login-Funktion erweitert wurde. Ihr könnt es via Github mit oder ohne Passwort-Funktion beziehen. Hier 2 Screenshots davon (der erste Zeigt die Desktop-Ansicht des Webinterfaces und die zweite die mobile Ansicht [sprich Smartphone]):

Interface für eBook-Reader
Um auch von Schwarz-Weiß-eBook-Readern die Steckdosen bequem steuern zu können habe ich ein kontrastreiches Interface für diese Geräteklasse erstellt. Dieses habe ich bisher auf dem Kobo Glo sowie einem Kindle 5 erfolgreich getestet. Ob es auch auf den Browsern von anderen Lesegeräten und Herstellern korrekt angezeigt wird, weiß ich allerdings nicht, die Browser sind meist auch nur als Beta-Feature in den eBook-Lesegeräten aufgeführt. Die .css-Datei hier habe ich möglichst simpel gehalten und auch die Schrift sollte auf den meisten Lesegeräten funktionieren. Ihr könnt es hier herunterladen. Für die Installation macht ihr am Besten einen eigenen Ordner auf eurem Webserver, z.B. über mkdir /var/www/html/remotebook und kopiert die Heruntergeladenen Dateien dort hinein. Um auf dem Lesegerät schnell darauf zugreifen zu können, empfiehlt es sich (wenn möglich), ein Lesezeichen zur entsprechenden Adresse zu setzen.
Siri-Proxy
Achtung! iOS 7 und neuer funktionieren mit SiriProxy nicht! Siri-Proxy sollte allerdings weiter mit Geräten mit iOS 6 und älter funktionieren, sodass ich diesen Teil noch im Tutorial behalte.
[Update 27.08.2015] Ich habe gerade einen Artikel zur Steuerung über Apples HomeKit verfasst. Das funktioniert auch mit den Funksteckdosen.
Wer seine Steckdosen mit iOS 7 aufwärts per Sprachsteuerung schalten möchte, kann das nach dieser Anleitung machen, in der beschrieben wird, wie ihr Sprachsteuerung und Widget für iOS einrichtet.
Wem selbst das Webinterface noch zu kompliziert ist (oder wer lieber redet statt zu tippen und zu klicken), der kann die Steuerung auch in Siri integrieren. Das funktioniert auch ohne Jailbreak und ist eine tolle Sache – leider auch etwas komplizierter. Zum Glück gibt es aber auch dafür schon Anleitungen und fertige Projekte im Netz, sodass sich der Aufwand in Grenzen hält. Realisieren lässt sich das Vorhaben durch siriproxy, den ihr auf dem Raspberry installieren könnt. Dazu müssen erst mal ein paar neue Pakete installiert werden:
1 | sudo apt-get install openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libc6-dev ncurses-dev subversion libxslt1.1 libxslt-dev xvfb build-essential autoconf libgdbm-dev libncurses5-dev automake libtool bison libffi-dev |
Anschließend führt ihr Folgendes aus:
sudo curl -L https://get.rvm.io | bash -s stable --ruby
Das kann einige Zeit dauern. Lasst den Befehl einfach laufen und gönnt euch eine Tasse Kaffee oder Tee. Wenn der Befehl durchgelaufen ist, tippt folgendes ein:
1 | echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"' >> ~/.bashrc |
Anschließend:
echo 'export PATH=$HOME/.rvm/bin:$PATH' >> ~/.bashrc
dann:
. ~/.bashrc
dann:
rvm install 2.0.0
dann:
rvm use 2.0.0 --default
dann:
gem install siriproxy
dann:
mkdir ~/.siriproxy
Anschließend sollte siriproxy an sich schon installiert sein auf eurem Raspberry Pi. Damit ihr den Dienst auch auf eurem iOS-Gerät nutzen könnt, müsst ihr euch noch ein Zertifikat generieren lassen:
siriproxy gencerts
Dieses liegt nun im oben generierten Ordner .siriproxy. Ihr lönnt es nun z.B. auf einen USB-Stick kopieren oder es euch direkt vom Raspberry per Mail schicken. Die benötigte Datei heißt „ca.pem“. Am einfachsten ist es wie gesagt sie euch einfach selbst per Mail zu schicken und die Mail dann auf eurem iOS gerät öffnen. Tippt auf eurem iOS-Gerät auf das Zertifikat und installiert es. Jetzt müsst ihr nur noch am iPad bei den WLAN-Einstellungen den DNS-Server ändern. Das geht selbsterklärend. Fügt vor eurem aktuellen (primären) DNS-Server einfach die IP-Adresse eures Raspberry Pi ein. Jetzt noch schnell den Flugmodus an- und ausschalten (damit die neuen WLAN-Einstellungen auch übernommen werden).
Jetzt ist es an der Zeit, siriproxy auf dem Raspberry zu starten:
siriproxy bundle
rvmsudo siriproxy server -d IP_ADRESSE_VOM_RASPBERRY
Wenn alles glatt gelaufen ist, solltet ihr die Meldung „SiriProxy up and running“ erhalten. Wenn das der Fall ist, startet Siri auf eurem iOS-Device und sagt „Test Siri Proxy“. Wenn Siri nun „SiriProxy is up and running“ antwortet, habt ihr alles richtig gemacht! Glückwunsch!
Nun könnt ihr euch daran machen, die Steuerung der Steckdosen in SiriProxy zu integrieren. Leider haben die Tutorials, die ich im Netz dazu gefunden habe bei mir nicht so funktioniert, wie erwünscht. Letztendlich habe ich aber trotzdem eine relativ simple Methode gefunden, eigene Befehle in SiriProxy zu integrieren. Dazu wechselt ihr erstmal das Verzeichnis:
1 2 3 4 | cd /home/pi/.rvm/gems/ruby-2.0.0-p247/gems/siriproxy-0.5.4 cd plugins cd siriproxy-example cd lib |
Darin befindet sich eine Datei namens „siriproxy-example.rb“. Diese nun mit sudo nano öffnen. Fügt darin folgende Zeilen ein:
1 2 3 4 5 6 7 8 9 10 11 | listen_for /drucker einschalten/i do say "Okay, Drucker wird eingeschaltet!" request_completed system("sudo /home/pi/raspberry-remote/./send 11010 1 1") end listen_for /drucker ausschalten/i do say "Okay, Drucker wird ausgeschaltet!" request_completed system("sudo /home/pi/raspberry-remote/./send 11010 1 0") end |
Die Codes solltet ihr noch anpassen, falls ihr andere gewählt habt. Auch die Befehle und Antworten könnt ihr nach Belieben anpassen. Achtet nur darauf, dass bei dem listen-Befehl nur Kleinbuchstaben verwendet werden dürfen. Dann die Datei wieder speichern. Anschließend müsst ihr siriproxy neu starten:
siriproxy bundle
rvmsudo siriproxy server -d IP_ADRESSE_VOM_RASPBERRY
Testet nun an eurem iOS-Gerät, ob alles so funktioniert, wie ihr es wolltet. Falls ja, müsst ihr nur noch siriproxy laufen lassen auf eurem Raspberry. Leider ist das gar nicht so einfach, da siriproxy beendet wird, wenn ihr die ssh-Verbindung zum Raspberry schließt. Nach langem Ausprobieren und vielen frustrierenden – weil nicht funktionierenden – Versuchen, habe ich eine einfach Möglichkeit gefunden, siriproxy weiter laufen zu lassen. Das Ganze habe ich über tmux realisiert. Dazu erst einma tmux installieren:
sudo apt-get install tmux
Anschließend tmux starten. Dann gebt ihr wieder
rvmsudo siriproxy server -d IP_ADRESSE_VOM_RASPBERRY
ein. Jetzt sollte siriproxy gestartet sein. Dann könnt ihr die SSH-Sitzung schließen. Nun wieder eine SSH-Verbindung aufbauen und „tmux attach“ eingeben. Ab jetzt solltet ihr die SSH-Sitzung wieder schließen können und siriproxy sollte auch weiterhin laufen.
Das wars auch schon! Von nun an könnt ihr dank des Raspberry Pi eure Geräte einfach via Terminal, Webinterface oder Siri ein- und ausschalten.
Ich hoffe, ich konnte euch alle Schritte gut erklären und wünsche gutes Gelingen! Falls ihr noch Fragen oder Anregungen habt, immer her damit! Auch wenn ihr Fehler findet, könnt ihr diese im Kommentarfeld posten.
Danke für das schöne Tutorial. Klappt prima.
Allerdings sieht deine Schaltung so aus, als hättest du beim Raspi nen 3V Pin genommen. Das würde die Reichweitenprobleme erklären. Ich bin auf 5V gegangen (wie du ja eigentlich auch geschrieben hast…) und komme mit den Signalen problemlos durch die gesamte 90qm Wohnung. Habe die Elro 440s Steckdosen und das selbe Transmitter Modul wie oben.
Laut Transmitter-Beschreibung hängt die Reichweite von der Eingangsspannung ab. :-)
Oder hat Rev.1 doch eine andere PIN-Belegung?
Gruß Adrian
Hi Adrian,
da hast du recht, in der Skizze (und in meinem Aufbau) habe ich den 3V-Pin verwendet. Natürlich kann bei dem verlinkten Sendemodul auch der 5V-Pin verwendet werden (wie ich in der Tabelle auch geschrieben habe), sodass sich die Reichweite dadurch erhöhen sollte. Bei mir hat das aber auch mit einer externen Antenne ganz gut funktioniert, sodass ich vom Keller aus bis in den ersten Stock (also über 3 Stockwerke) sauber senden kann.
Der Grund, warum der Sender bei mit am 3V-Pin hängt, liegt wohl daran, dass ich damit den 5V-Pin für andere Hardware „freigehalten“ habe ;)
Hallo,
was meinst du mit nano beim Webinterface? Verstehe da nicht so ganz, was damit gemeint ist.
Ansonsten tolle Anleitung!
Danke und Viele Grüße
Tim
Hallo Tim,
vielen Dank für das positive Feedback!
Mit nano meinte ich den Texteditor, den man vom Terminal aus in Raspbian nutzen kann. Um die Datei config.php zu bearbeiten also einfach „sudo nano config.php“ eingeben und schon kann die Datei bearbeitet und anschließend gespeichert werden. Natürlich kann auch ein anderer Texteditor benutzt werden, diesen verwende ich hauptsächlich, weil ich auf den Pi nur via SSH zugreife und ich die Dateien so einfach in der Konsole bearbeiten kann.
Schöne Grüße zurück!
Alex
Moin!
Erstmal danke für das Tut :) es funktioniert auch wunderbar!
Aber wenn ich das webinterface machen möchtefür mein iphone verstehe ich nichts mehr
Hab leider null Ahnung von linux und weissnach : sudo apt-get install php5
Null was ich machensoll, ich hab kA wie ich ein ordner erstelle oder so und xkoni? Hab ich gegoogelt und nichts gefunden!
Wäre toll wenn mir einer helfen könnte:(
Hi Sven,



mit xkonni meinte ich das Projekt, das wir uns von GitHub geholt haben. Dort ist bereits das Webinterface mit integriert. Ich nehme mal an, dass du über das Terminal arbeitest, daher hier mal vereinfacht die nächsten Schritte als Befehle:
Hier wurde das Verzeichnis „remote“ erstellt und der Inhalt aus dem GitHub-Projekt rüberkopiert. Zudem wurde noch die Datei „config.php“ geöffnet, in der (im ersten Schritt) die IP-Adresse des Raspberry Pi eingetragen werden muss und zwar bei „$target = ‚xxx.xxx.xxx.xxx'“. Die „x“ durch die IP-Adresse des Raspberry Pi ersetzen.
Die nächsten Schritte wären:
Hier wurde der Daemon kompiliert und gestartet. Dann kann das Webinterface zum test mal aufgerufen werden. Man erreicht es im Browser über „xxx.xxx.xxx.xxx/remote“, wobei die x wieder Platzhalter für die IP des Raspberry Pi sind. Wenn die Seite lädt wurde bisher alles richtig gemacht. Anschließend die Datei „config.php“ nach eigenen Wünschen anpassen:
Hier ist der Bereich „$config=array[…]“ interessant, in dem die verschiedenen Steckdosen eingetragen werden können. Ein Beispiel von mir findest du auf der vorherigen Kommentarseite (unten auf „Ältere Kommentare“ klicken, um dorthin zu gelangen).
Bei sudo mv web zu www/remote kommt:
Aufruf von stat für xxxwebinterface usw nicht möglich : datei oder verzeichnis nicht gefunden:/
Hi Sven,
sorry, ich hab da wohl einen kleinen Fehler reingebracht. Der erste Befehl sollte entweder ohne „sudo“ aufgerufen werden, oder über „sudo mv /home/pi/raspberry-remote/webinterface/* /var/www/remote“. Die Tilde (~) bewirkt nämlich, dass vom Standard-Verzeichnis des aktuellen Users ausgegangen wird, was bei „sudo“ ja root wäre ;)
Der Rest müsste so passen.
Hallo,
danke für die Antwort mit dem nano Texteditor, jetzt wird mir das klar, habe einen anderen genommen und habe mich gewundert, ob mit nano eventuell ein Befehl gemeint war.
Ich habe noch eine kleine Frage bezüglich des Webinterfaces:
Ich habe soweit alle bnötigten Files mit root-Rechten nach /var/www/remote kopiert.
Jetzt meine eigentliche Frage. In meinem Router-Menü bekommt der Raspberry eine dynamische IP zugewiesen, also z.B. 192.168.1.28. Wenn ich nun in der config.php eine 192.168.1.44, bleibt im Browser nach eingabe von 192.168.1.44 die Seite leer, bzw. es kommt der Fehler, dass der Server zu lange braucht, um zu antworten.
Daraufhin habe ich mal die config.php angepasst mit 192.168.1.28, jedoch kommt nun im Terminal nach eingabe von sudo ./daemon & die Fehlermeldung „Error on binding: Adress already in use“.
Wahrscheinlich ist damit die Adresskollision von zwei gleichen IP-Adressen für zwei unterschiedliche Geräte gemeint, ich weiß aber nicht genau, wie das sonst funktionieren soll.
Vielleicht kannst du mir ja weiterhelfen.
Vielen Dank im Vorraus!
Gruß Tim
Hi,
das Webinterface mit einer dynamischen IP zu betreiben ist etwas ungünstig, da dann auch immer die config.php geändert werden muss. Es wäre daher sehr geschickt, dem Pi eine statische IP zuvergeben. Wie das geht ist sehr gut im Blog von Jan Karres beschrieben.
Dass du die Fehlermeldung bekommst, liegt wohl daran, dass der Daemon bereits läuft. Wenn du ihn vorher beendest, sollte das kein Problem geben. Wobei das Beenden und Neustarten normal nicht notwendig ist, da du in dessen Konfiguration nichts geändert hast, sondern nur im Webinterface.
Hallo,
ich versuche die Steckdosen von außerhalb über das webinterface zu steuern.
Dazu habe ich alles gemacht wie beschrieben und zusätzlich DynDNS eingerichtet und die Ports in meiner FritzBox freigegeben. Ich habe folgende Dinge probiert:
– http://54.XXX.148.122:11337/ – meine momentane IP-Adresse
– http://meinusername.no-ip.org:11337/ – meine statische no-ip.org Adresse, diese funktioniert mit meinem NAS einwandfrei
Ich habe auch versucht den Port zu ändern sowohl in der config.php als auch in daemon.h . Im Heimnetzwerk funktioniert alles wunderbar, ich würde nur auch gerne vom gesamten Internet aus die Steckdosen steuern können.
Den entsprechenden Port (11337) habe ich in der Fritzbox für meinen Raspberry Pi freigegeben als TCP und UDP. Als Schema habe ich sowohl http als auch https ausprobiert.
Ich habe auch SSH aktiviert, dieses funktioniert einwandfrei nachdem ich den Port freigegeben habe. Ich kann also den Pi selbst von außerhalb steuern, die Steckdosen also auch, aber eben nicht über das webinterface und nicht vom Smartphone aus.
Danke schonmal für jede Hilfe,
John
Hi John,
leider habe ich selbst keine Erfahrungen mit der Fritzbox oder der Portweiterleitung allgemein. Allerdings sehe ich, dass du immer nur vom Port 11337 gesprochen hast, der für die interne Kommunikation des Webinterfaces mit dem Daemon zuständig ist. Für das Interface sollte allerdings Port 80 (Standardport für http) oder je nach Apache-Einstellungen ein anderer Port notwendig sein.
Am Besten einfach mal eine kleine Test-PHP-Seite anlegen und schauen, ob du die von außen nach Freigabe von Port 80 im Router erreichen kannst.
Schöne Grüße
Hi Alexander,
vielen Dank für die schnelle Hilfe.
Die Freigabe für Port 80 hat auf jeden Fall schonmal gefehlt. Jetzt komme ich aus dem Internet auf die „It works“ Seite von apache. Seit dem letzten reboot bekomme ich die „Could not connect to socket“-Fehlermeldung. Die hatte ich aber vorher schon ein paar mal und das wird sich lösen lassen. Ich melde mich nochmal wenn ichs hinbekommen habe.
Danke nochmal,
John
Hi Alexander,
jetzt funktioniert alles wie es soll.
Der daemon war noch nicht gestartet.
Falls noch jemand Hilfe beim webserver einrichten braucht, ich habe diese Anleitung verwendet:
http://www.instructables.com/id/Host-your-website-on-Raspberry-pi/?lang=de
Eine interessante Anwendung ist diese „Zeitschaltuhr“ mit Google Calender und IFTTT: http://www.xn--c-lmb.net/2012/12/home-automation-mit-dem-raspberry-pi-5.html
Danke nochmal,
John
Hi John,
schön, dass es nun klappt bei dir!
Zum Thema Daemon: Ich verweise mal auf den Kommentar von Christian, der beschreibt, wie man den Daemon automatisch starten lassen kann. Gerade wenn das System öfter neu gestartet wird, ist das sicher eine praktische Sache.
Die Anwendung mit der Google-Kalender Zeitschaltuhr ist sehr interessant! Nutze momentan noch cronjobs, aber ich werde mir die Geschichte definitiv mal ansehen.
Hallo John, hallo Alexander,
es geht auch nur mit einer Zeile in der crontab
Ich habe mit „crontab -e“ die crontab geöffnet und dann am Ende folgende Zeile eingefügt:
@reboot sudo /home/pi/raspberry-remote/daemon &
Dann braucht man den Daemon nicht mehr von Hand starten.
Gruss Jürgen
PS
Der Blog ist super, weiter so.
Vielen Dank für die Anleitung! Damit habe sogar ich als absoluter Laie es sofort hinbekommen! :)
Hat alles super jetzt geklappt :)
Danke jungs!
Hallo.
Hast du schon eine möglichkeit gefunden um es auf ios 7 zum laufen zu bringen ??
Hi David,
ich fürchte ich kann dich da auch nur an die GitHub Diskussion verweisen. Wann, ob und wie SiriProxy mal unter iOS 7 läuft kann ich selbst auch nur schwer abschätzen. Es beschäftigen sich aber einige Leute aktiv mit der Problematik.
Hat schon jemand die Google-Kalender Verknüpfnug mit dem Webinterface von xkonni zum laufen bekommen? Er legt bei mir eine .png in die Dropbox, es rührt sich aber nichts an den Steckdosenleisten. Wenn ich dieselbe URL im Browser direkt öffne funktioniert es!?
Hallo zusammen,
super Anleitung, kann man einfach so herunterschreiben. Habe auch auf 5V umgebaut und bin begesitert, dass zumindest der send-Befehl auf Anhieb klappt!! Mein Problem ist aktuell nur, dass der Webclient nicht richtig funktioniert.
Also ich habe den daemon laufen, habe auch zuvor die daemon.cpp angepasst, da mein Hauscode aktuell 11110 ist, aber wenn ich dann in dem Webserver einen Klick mache, schaltet der im Webinterface brav um, aber die Dose wird leider nicht geschaltet. Sehr sonderbar, da es auch keine Fehlermeldung gibt :-/?
Funktionieren tut also einwandfrei:
„sudo ./send 11110 1 1“ für einschalten
„sudo ./send 11110 1 0“ für ausschalten
Nicht funktionieren tut:
Webserver-Klick auf Steckdose mit Config-Setup:
$config=array(
array(„11110“, „01“, „Steckdose 1“),
array(„11110“, „02“, „Steckdose 2“),
[…])
Gibt es hier vielleicht eine Einschränkung, dass der Hauscode 11110 nicht mit dem Daemon genutzt werden kann, selbst wenn man vorher in der daemon.cpp den Wert für nPlugs angepasst hat, zu einen auf „nPlugs=1110;“ oder aber sogar auch „nPlugs=11111;“?
/Andreas
Hi Andreas,
das mit dem Daemon und den nplugs ist wirklich eine verzwickte Sache. Ich kann leider kein C/C++, daher ist für mich der daemon.cpp nicht ganz verständlich. Evtl. hilft ein umstellen auf „32“ (2^5 -> alle Hauscodes abgedeckt), aber das ist nur so eine Idee.
Da du aber nicht den üblichen „Switch out of range“-Error bekommst, denke ich, dass das evtl. gar nicht mit den nplugs zusammenhängt.
Was bei dem config-Array wichtig ist, ist, dass nach jedem „array([…])“ ein Komma steht, auch beim letzten nach meiner Erfahrung.
Sollte es dann immer noch nicht klappen und du keine Fehlermeldung erhalten, würde ich einen Blick in den Apache-Log werfen (cat /var/log/apache2/error.log), evtl. findest du hier eine Fehlermeldung, wenn Syntaxfehler in den PHP-Dateien liegen oder der daemon nicht erreicht werden kann.
Alexander
Hey wenn ich nun nicht den gpio17 verwenden möchte. Wo muss ich etwas ändern, dass es trotzdem mit z.B gpio 21 funktioniert?
reicht es aus in der send.cpp die Zeile „int PIN = 0;“
entsprechend anzupassen? Irgendwie funktioniert es nicht..
Hi Marc,
ja, für den send-Befehl sollte es reichen, die send.cpp zu ändern. Wichtig ist hier, dass die Pinnamen/-nummern nach der Definition von Wiring Pi genommen werden müssen. Bei einem Pi Rev. 1 wäre das dann „int PIN = 2“, wenn ich es gerade richtig abgelesen habe.
Danke für die schnelle Antwort, super Hilfe!. Per shell funktioniert jetz alles, nur das Webinterface nicht. habe nPlugs auf =1110 gesetzt. Aber es sagt immernoch außer reichweite.. :/
=========================================================================
Tut mir leid für die vielen Kommentare auf einmal :D Habs jetzt hinbekommen :) Sag mal wenn ich jetz nicht immer “sudo ./daemon” per shell eingabe starten will.. wie kann ich das in die index.php integrieren dass er das automatisch macht? z.B so irgendwie: exec(“sudo /home/pi/raspberry-remote/./daemon”));
Kein Problem, ich sollte bei Gelegenheit mal eine Edit-Funktion für die Kommentare einführen ;)
Schön, dass es soweit nun klappt bei dir! Den Daemon musst du natürlich nicht jedesmal startwen, bevor du das Webinterface nutzen kannst. Wie in der Anleitung steht, einfach über „sudo ./daemon &“ im Hintergrund starten und laufen lassen. Ist bei mir in 6 Monaten Dauerbetrieb erst einmal abgestürzt – was aber wohl an den mickrigen 256MB RAM meines Pi der ersten Generation lag. Sollte dein Pi nicht durchlaufen, würde ich empfehlen, dem daemon in den Autostart zu packen. Hierzu einfach den Tipp im Kommentar von Christian befolgen.
Wenn du eine Lösung ohne den daemon bevorzugst, kannst du natürlich auch den send-Befehl in die exec-Funktion packen. Dazu aber evtl. noch die sudoers-Datei bearbeiten (wg. Rechte).
Super danke :) habe die jetz alles mit exec aus der php datei gemacht und www in die sudoers eingetragen.. benutze den pi voerst nicht im inet. gruß
Hi ,
Ich hab da mal ne frage undzwar bekomme ich das webinterface nicht zum laufen. Hab alles nach der Anleitung gemacht , aber wenn ich auf ip/remote zugreifen möchte kommt erst ne ganze Zeit lang garnichts und nach ner Minute ca öffnet sich ein schwarzer Hintergrund da steht Delay 0:|15…. Und dadrunter steht Dan Could Not connect to socket.
Woran kann das liegen ? Ich bin alles jetzt mehrfach durchgegangen kann aber den Fehler nicht finden der Daemon läuft wenn ich ip:11337 eingebe steht im Terminal das.
message: GET /remote/ HTTP/1.1
Host: 192.168.178.61:11337
Connection: keep-alive
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.
Switch out of range: GET /:53
Hi Chris,
die Frage ist für mich jetzt aus der Ferne etwas schwer zu beantworten ;)
„Could not connect to socket“ deutet ja darauf hin, dass die Seite nicht auf den Daemon zugreifen kann – was mit deiner Terminal-Abfrage aber widerlegt wurde. Hier ist aber das „Switch out of range“ interessant. Hast du die gleichen Hauscodes verwendet, wie ich und die nplugs-Anzahl entsprechend geändert?
Hi :)
Ja habe alles so gemacht wie in der Anleiung.
Das komische ist das wenn ich auf IP/remote
gehe das die seite sich nichtmal läd bzw nur halb oben steht delay… und mit nem schwarzen hintergrund und dadrunter could not connect to socket.
das steht im apache2 error log.
[Tue Mar 04 16:58:06 2014] [error] [client 192.168.178.24] PHP Warning: socket_connect(): unable to connect [110]: Connection timed out in /var/www/remote/index.php on line 98, referer: http://192.168.178.61/
Hauscode ist gleich und nplugs auch.
also es sieht wirklich so aus als wenn die seite nicht auf den daemon zugreifen kann. Wo kann da die ursache sein?
Hi Chris,
leider habe ich mit Socket-Verbindungen keine Erfahrung. Was ich mir aber vorstellen könnte, wäre eine Firewall etc., die Verbindungen zum Port sperrt. Das wäre aber jetzt nur eine Vermutung. In der PHP-Dokumentation gibt es noch ein paar Infos über die Funktion socket_connect. Dort wird auch beschrieben, dass sich mit den Funktionen socket_last_error() der Fehlercode und über socket_strerror() die Fehlerbeschreibung ausgegeben werden kann. Ich fürchte aber fast, dass hier nur wieder das Timeout beschrieben wird.
Meine Ideen wären jetzt:
– daemon stoppen und neu starten -> überprüfen, ob das Webinterface nun läuft
– Pi neu starten (dürfte zwar den gleichen Effekt haben, aber einen Versuch ist es wert)
– einen anderen Port probieren, daemon neu kompilieren und starten (in der config.php den Port dann natürlich entsprechend anpassen)
– wenn alle Stricke reißen: Selbst ein kleines Webinterface gestalten, das ohne den daemon und nur mit dem send-Befehl funktioniert (ist in PHP ganz einfach in den exec-Befehl einzutragen)
Ich weiß nicht, ob dir das jetzt unbedingt weiterhilft, aber das wäre so mein Ansatz.
danke erstmal.
Dieses hier kommt wenn ich auf IP:11337 connecte
message: GET /remote/ HTTP/1.1
Host: 192.168.178.61:11337
Connection: keep-alive
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.
Message
Wenn ich ohne den port auf ip/remote gehe dan kommt halt erst nichts und nach ner minute ca. kommt der schwarze hintergrund mit dem socket error.
Aber das von oben vom daemon kommt nicht wenn ich auf der seite connecte. Von daher gehe ich davon aus das er die verbindung zum daemon nicht aufbauen kann.
Ich frage mich nur warum nicht hmm..
daemon hab ich schon neu gestartet unzählige male und reboot auch ;)
langsam bin ich ratlos.
vllt sollte ich alles nochmal neu installieren
Hi Leute,
bin gerade per Zufall auf diese Seite gekommen, da ich auch mit Funksteckdosen am experimentieren bin.
Die Sache mit den Root-Rechten lässt sich auf folgende Art ändern:
sudo chmod u+s send
Damit wird das sogen. „S“-Bit für die Datei gesetzt (SetUID) und jeder Nuter sollte sie dann, automatisch mit den Rechten des Dateibesitzers, ausführen können.
siehe: http://wiki.ubuntuusers.de/chmod?highlight=chmod%20u%2Bs
@lofwyr: Vielen Dank für den Tipp! Hat bei mir bestens geklappt!
Hallo,
ich hab dazu auch mal eine Frage.
Ihr sendet ja explizite Codes(also zbz 11010), wir dieser im Hintergrund noch irgendwie umgewandelt oder verarbeiten die Dosen genau diesen Binärcode?
Hintergrund ist das ich bereits einige Steckdosen im Einsatz habe, die ich mit der Harmony Remote + Funkwandler ansteuere. Diese Dosen haben aber keine Dip Schalter, sondern sind per Funk anlernbar.
Hat den jemand Erfahrungen mit anderen Herstellern als ELRO?
Hi Torro,
was mit dem Binärcode passiert, kannst du in der send.cpp nachlesen bzw. den dort referenzierten RCSwitch. Leider kann ich selbst kein C, aber der Code ist relativ gut dokumentiert. Wenn es dich interessiert, kannst du dich da mal durchlesen.
Was wohl einfacher ist (finde ich zumindest), wäre es mit pilight zu probieren. Dort wird auch ein Programm namens „pilight-receive“ mitgeliefert, mit dem sich Funkfernbedienungen auslesen lassen. Hier eine kleine Anleitung dazu.
Wenn auch das nicht klappt, kannst du die Signale immer noch über die Soundkarte und 433MHz-Empfänger auslesen oder mittels SDR. Zum Senden müsstest du dir dann aber wohl selbst ein kleines Programm schreiben.
Noch eine allgemeine Übersicht zu 433MHz Funksteckdosen und deren Protokolle, evtl. ist dein Modell auch dabei (habe ich glaube ich schon mehrfach hier verlinkt ;)).
Hallo,
Die Elro Funksteckdosen kann man mit der Fernbedienung auch dimmen. Wie kann man das mit dem Raspberry umsetzen?
Hi Bueno,
die Frage wurde mir bereits vor kurzem mal per Mail gestellt. Leider habe ich mit der Person, die dieses gleiche Problem hatte, keine Lösung gefunden. Normalerweise werden die send-Befehle nur mehrfach hintereeinander an den Dimmer gesendet – sofern die Informationen stimmen, die ich im Netz gefunden habe.
Evtl. klappt es bei dir, indem du den send-Befehl in eine kleine Schleife packst und schaust, ob gedimmt wird.
@Alexander
Zum dimmen wird auf der Fernbedienung 2 mal ON gedrückt. Schließlich fällt die Spannung und es wird langsam dunkler. Solange man nicht erneut auf ON drückt, fällt und steigt die Spannung. Idee: Man baut einen Button für start dimmer mit ON Funktion und einen zweiten Button für Stop ebenfalls mit der Funktion ON (Bit 1 also). Und noch ein OFF Button mit dem 0 Bit noch und es sollte machbar sein. Die Reaktionszeit der Dimmer Button ist wichtig.
Die Umsetzung fehlt nur noch. Eine direkte Programmierung ist mit diesen Dosen wohl nicht möglich.
Erstmal will ich Alex für diesen Tutorial danken,war sehr hilfreich.. für die Leute die ihre eigene WebApp,Website schreiben wollen oder App oder weiss der Geier was… ich habe hier ein Tutorial gemacht, so könnt ihr euch alles selbst programmieren und das Design nach euren belieben gestalten.
hier https://www.youtube.com/watch?v=Pl908uhZZF8
Hallo,
beim Make von der send.cpp become ich folgende warning:
send.cpp:38:47: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
Ich bekomme zumindestens meine Intertechno steckdosen derzeit nicht ans laufen. Irgendjemand eine idde?
Danke
Hi Karsten,
da das nur eine Warnung ist, sollte es nicht weiter schlimm sein. Das Kompilieren müsste trotzdem funktionieren.
Leider habe ich keine Intertechno-Dosen, aber was ich so gelesen habe, nutzen die teilweise ein anderes Protokoll.
Vielen Dank an Alex, hat super funktioniert dein Totorial!
Tausend Dank für dieses tolle Tutorial! Jeder einzelne Schritt funktioniert völlig problemlos – man könnte vielleicht noch den Autostart des Daemons mit reinnehmen, das musste ich mir aus den Kommentaren fischen :)
Die Reichweite des Senders kann ich übrigens bestätigen. 2-3 Meter ohne Antenne, mit Antenne locker 10 Meter. Interessanterweise kommen Einschaltsignale weiter als Ausschaltsignale.
Hi Dan,
danke für dein Feedback!
Ich habe den Tipp mal aufgegriffen und die Autostart-Geschichte direkt in den Artikel gepackt ;)
Besten Dank für die ausführliche Anleitung!
Ich hoffe mal, dass SiriProxy auch bald unter iOS funktioniert, damit ich auch Apple-Geräte zur Sprachsteuerung nutzen kann ;)
Hi Junger_Tiger,
es gäbe momentan noch eine andere Möglichkeit. Nennt sich PiMate und ist hier zu finden.