Ich habe mir gedacht, dass ich mal ein Tutorial für das pilight-Projekt erstelle. Ich selbst benutze die Software schon sehr lange unter Wheezy Raspbian und bin sehr zufrieden - zudem werden ständig neue Funktionen ergänzt.
Da ich das Projekt selbst in der Development-Version nutze und diese meiner Meinung nach sehr stabil ist, möchte ich das Tutorial auch darauf aufbauen.
Das folgende kann pilight:
+ steuern von 433Mhz Funksteckdosen, Dimmern, Jalousieschalter, etc verschiedener Hersteller
+ Möglichkeit zur Erweiterung auf 868Mhz oder andere Frequenzen (das Projekt ist modular aufgebaut)
+ Auslesen und Darstellen von 1wire-Sensoren und Funkwetterstationen und vielen anderen Dingen
+ sehr geringe Auslastung der CPU (<5% beim Ausführen von Befehlen), da in C geschrieben
+ integrierte webgui
+ Unmengen an Protokollen und damit unterstützten Geräten + seit neustem auch Programme starten und beenden
+ adhoc Modus, um die Reichweite zu erhöhen
+ Möglichkeit einen bandpassfilter zu installieren, um das Rauschen zu reduzieren
+ gute API, um Apps zu entwickeln (es existieren bereits einige)
+ und vieles mehr
Vorab gleich mal die Warnung: Ich bin kein Programmierer und eigentlich eher der Nutzer. Wenn jemand also Verbesserungsvorschläge hat, immer her damit
Das Projekt wurde (soweit ich weiß) von curlymo ins Leben gerufen und wird laufend von der Community erweitert und verbessert.
Aber fangen wir doch einfach an
Inhalt:
1) Die Hardware
2) Hardware mit dem Raspberry Pi verbinden
3) Installation
4) Einstellungen anpassen
5) Erste Versuche und Grundbefehle
6) Raumkonfiguration
7) 1wire Sensoren
Updates
9) Beispiel Config Einträge (in work)
___________________________________________________________________________
1) Die Hardware
Benötigt wird ein 433Mhz Sender und ein Receiver. Es existieren viele verschiedene Ausführungen und diese unterscheiden sich in der Qualität. Während die Sender eigentlich alle gleich gut sind, gibt es bei den Receivern deutliche Unterschiede!
Ich selbst verwende pilight mit der günstigsten Hardware (ebay: 300951544840; Habe diesen Artikel nur auf die schnelle eingefügt. Es geht sicherlich noch günstiger). Das beste Ergebnis wird aber wohl mit dem Superheterodyne Set erzielt (ebay: 281169560721; ebenfalls geht's hier wohl günstiger). Für meine Zwecke reicht das günstige Set aber allemal aus.
___________________________________________________________________________
2) Hardware mit dem Raspberry Pi verbinden
- Fahre den RPi herunter und trenne ihn vom Strom.
- schließe den Sender und den Receiver an, wie es auf dem Bild gezeigt (credits: neevedr.) (Data vom Sender an GPIO17(=wiringPi #0) und Data vom Receiver an GPIO18(=wiringPi #1))
- Starte den Raspberry Pi
___________________________________________________________________________
3) Installation der Software
Wir haben die Wahl zwischen der aktuellsten Development Version und der letzten Stable. Da die Development-Versionen aber ebenfalls immer stabil sind (nach meiner Erfahrung), werde ich diesen Weg hier beschreiben:
Als erstes fügen wir die offiziellen Quellen für pilight hinzu. Dazu öffnen wir die sources.list:
und fügen die folgenden Zeilen hinzu:
deb http://apt.pilight.org/ stable main
deb http://apt.pilight.org/ development main
deb http://apt.pilight.org/ nightly main
Anschließend speichern wir die Datei mit Strg+X und Y
Da pilight eine signierte Quelle nutzt, müssen wir den Schlüssel hierfür hinzufügen:
Jetzt stellen wir sicher, dass der PI auf dem aktuellsten Stand ist und aktualisieren die Paketliste:
Hier können wir uns nun entscheiden, welche Version wir installieren wollen. Mit
sehen wir die verfügbaren Versionen:
sudo apt-cache madison pilight
pilight | 5.0.4-g56831a6 | http://apt.pilight.org/ nightly/main armhf Packages
pilight | 5.0 | http://apt.pilight.org/ development/main armhf Packages
pilight | 4.0 | http://apt.pilight.org/ stable/main armhf Packages
pilight | 3.0 | http://apt.pilight.org/ stable/main armhf Packages
pilight | 2.1 | http://apt.pilight.org/ stable/main armhf Packages
pilight | 2.0 | http://apt.pilight.org/ stable/main armhf Packages
pilight | 1.0 | http://apt.pilight.org/ stable/main armhf Packages
Die aktuellste steht dabei immer oben. Da wir, wie bereits erwähnt, die Development Version installieren wollen, geben wir folgendes ein, wobei wir pilight=5.0.4-g56831a6 mit der im Moment aktuellsten Version ersetzen:
Sollte ein Fehler angezeigt werden, dass das Paket nicht verifiziert werden konnte, lasst das -y weg und bestätigt die Installation.
Jetzt könnt ihr die Einstellungen vornehmen.
___________________________________________________________________________
4) Einstellungen anpassen
Nachdem das Projekt installiert ist, können einige Einstellungen angepasst werden. Die Datei, die diese Einstellungen steuert, liegt unter /etc/pilight/settings.json, aber vorher entfernen wir noch das Installationsverzeichnis.
Der Inhalt der Datei sieht wie folgt aus:
{
"log-level": 4,
"pid-file": "/var/run/pilight.pid",
"config-file": "",
"hardware-file": "/etc/pilight/hardware.json",
"log-file": "/var/log/pilight.log",
"send-repeats": 10,
"receive-repeats": 1,
"webserver-enable": 1,
"webserver-root": "/usr/local/share/pilight/",
"webserver-port": 5001,
"webserver-cache": 1,
"whitelist": "",
"update-check": 1,
"firmware-update": 0
}
Alles anzeigen
Die meisten Einstellungen sind selbsterklärend. Mit der Einstellung "config-file" kann ein alternativer Pfad für die Config-Datei festgelegt werden. In diese Datei tragt ihr später Eure Räume und Steckdosen, sowie alle anderen Geräte ein. Für meine Zwecke habe ich die Zeile in soweit geändert, dass die Config unter "/home/pi/pilight_config.json" liegt. So kann ich später schnell und unkompliziert die Datei mittels FTP Programm überschreiben und verändern.
Damit pilight startet, muss die Datei vorhanden sein. Dazu erzeugen wir diese und fügen einen Pseudoinhalt ein:
Als Inhalt soll die Datei folgendes enthalten. Wir passen dies nachher an unsere Bedürfnisse an:
Weiterhin könnt ihr euren Port für den Webserver ändern, falls dieser belegt sein sollte, oder ihr es einfacher haben wollt
Die Datei /etc/pilight/hardware.json bestimmt, auf welchen Pins Ihr eure Hardware verbunden habt. Es wird hier und im gesamten Projekt die wiringPi Deklarierung verwendet!
Sind alle Einstellungen getan, können wir schon mit den ersten Test fortfahren.
___________________________________________________________________________
5) Erste Versuche und Grundbefehle
pilight kommt mit einer Reihe an Grundbefehlen:
pilight-receive: Gibt über den Empfänger erhaltene Signale als JSON-Objekte aus
pilight-debug: Gibt den RAW-Code von empfangenen Befehlen aus, um basierend darauf neue Protokolle zu entwickeln, oder Probleme zu finden
pilight-learn: Ähnlich zu pilight-debug, aber versucht soviele Informationen wie möglich von einer Fernbedienung zu debuggen. (Funktioniert derzeit nur mit An/Aus-Geräten, als keine Dimmer)
pilight-send: Sendet Befehle zu dem pilight-daemon, der diese wiederum als Signal versendet. Näheres dazu weiter unten.
pilight-control: Ähnlich zu pilight-send. Es nutzt aber die in der Raumkonfiguration abgelegten Bezeichnungen für die Räume. Näheres weiter unten.
pilight-raw: zeigt alle Signale an, die vom Receiver empfangen werden. Hier sieht man auch gut, ob man ein starkes "Rauschen" in der Umgebung hat, oder nicht. Optimal wäre es, wenn man nur etwas sehen würde, sollte man ein Signal mittels Fernbedienung senden
pilight-daemon: Der eigentliche Dienst, der dafür sorgt, dass die Befehle in Signale umgesetzt und an die Geräte gesendet werden.
pilight-flash: Mit diesem Programm kann der zusätzliche Bandpassfilter aktualisiert werden, sollte die automatische Aktualisierung nicht geklappt haben.Das betrifft natürlich nur die, die einen Bandpassfilter mit pilight nutzen.
Versuchen wir nun einmal einen Befehl zu senden. Ich nehme als Beispiel einfach eine meiner Mumbi-Funksteckdosen.
Zuerst müssen wir den pilight-Service starten
Anschließend stellen wir die DIP-Schalter der Steckdose auf unseren Wunsch ein. Ich habe diese beispielsweise auf den Systemcode 11001 und den Gerätecode 00100 eingestellt (wobei 1=On und 0=Off ist).
Diesen Code rechnen wir nun in binären Code um (Darauf achten, dass die Reihenfolge invers ist: 11001 muss also als 10011 in das dezimale System umgerechnet werden). Folglich ist unser Systemcode=19 und unser Gerätecode=4.
wir können die Steckdose nun also mit
anschalten.
Für das Ausschalten verwenden wir anstatt dem Parameter "-t" den Parameter "-f":
-p ist dabei der Parameter, der das zu verwendende Protokoll definiert. In diesem Fall natürlich das mumbi-Protokoll. -s ist der Systemcode (dezimal) und -u der Gerätecode (dezimal).
Es existiert eine große Anzahl an unterstützten Protokollen und alle haben natürlich etwas andere Parameter und Wertebereiche (siehe unten).
Wir können natürlich auch pilight-receive nutzen, um den Code über unsere Fernbedienung zu debuggen:
{
"code": {
"systemcode": 19,
"unitcode": 4,
"state": "on"
},
"origin": "receiver",
"protocol": "silvercrest",
"uuid": "0000-00-00-32-cf5528",
"repeats": 3
}
Alles anzeigen
6) Raumkonfiguration
Da wir nun grundsätzlich Befehle senden können, versuchen wir mal eine Config zu erstellen, in der wir verschiedene Geräte verwenden.
Erstellt nun eine leere Config-Datei an dem Ort, den ihr in der settings.json definiert habt. In meinem Fall wäre das also /home/pi/pilight_config.json.
Vorher muss aber der pilight-Service gestoppt werden, da die Config-Datei sonst vom Programm überschrieben wird. Dies ist _immer_ notwendig, wenn ihr die Config verändern wollt:
Öffnet eure Config-Datei Datei nun mit eurem bevorzugten Editor und beginnt ein Beispiel einzutragen.
Erläuterungen zu dem Beispielcode folgen danach:
{
"room1": {
"name": "Raum1",
"switch1": {
"name": "Schalter 1",
"protocol": [ "mumbi" ],
"id": [{
"systemcode": 27,
"unitcode": 2
}],
"state": "off",
"gui-readonly": 0
},
"switch2": {
"name": "Schalter 2",
"protocol": [ "intertechno_old" ],
"id": [{
"unit": 2,
"id": 1
}],
"state": "off",
"gui-readonly": 0
}
},
"room2": {
"name": "Raum 2",
"RPiTemperatur": {
"name": "RPi-Temperatur",
"protocol": [ "rpi_temp" ],
"id": [{
"id": 1
}],
"temperature": 43333,
"gui-show-temperature": 1,
"poll-interval": 60,
"gui-decimals": 3
},
"Sunset": {
"name": "Sonne",
"protocol": [ "sunriseset" ],
"id": [{
"longitude": "52.00000000",
"latitude": "7.00000"
}],
"sunrise": 712,
"sunset": 1855,
"sun": "set"
}
}
}
Alles anzeigen
Ich denke, dass es offensichtlich ist, wie die Struktur der Datei auszusehen hat. Man sieht gut, dass dort verschiedene Protokolle verwendet werden. Außerdem können jedem Gerät verschiedene Optionen zugeordnet werden. gui-readonly gibt beispielsweise an, ob du dieses Gerät in der Webgui lediglich angezeigt bekommen willst, ohne es zu schalten.
Speichert diese Datei nun ab und starte den pilight-Service erneut:
Ihr könnt nun auch pilight-control verwenden, um eure Steckdosen damit zu steuern:
So schaltet Ihr beispielsweise das erste Gerät in eurer Config an. Ruft nun die IP eures Rpi auf dem Port auf, den ihr in der settings.json vergeben habt. In meinem Fall ist es die 192.168.178:33:5001.
Dort sollte nun die webgui mit der von euch erstellten Config erscheinen. Wenn ihr nun die Config erweitern wollt, denk dran erst den pilight-Service zu stoppen.
Falls die config-Datei einen Fehler enthält, kopiert euren Inhalt hier hin und lasst ihn überprüfen.
___________________________________________________________________________
7. Notwendige Schritte für 1wire Sensoren. (z.B. DS18B20)
(für den Anschluss an den RPi sieh dir das angehängten Breadboard an: credit koffie)
Da es anscheinend einen Bug im aktuellen Kernel gibt, der das gleichzeitige Nutzen von 1wire Sensoren bei aktivierter raspi-camera unmöglich macht, müssen ein paar Systemdateien angepasst werden (siehe https://github.com/raspberrypi/linux/issues/435).
Hierbei spielt besonders das Laden der Module eine wichtige Rolle. Diese müssen in einer bestimmten Reihenfolge geladen werden. Wie ich bereits eingangs geschrieben hatte, bin ich eher kein Programmierer und kenne mich damit auch nicht wirklich aus, aber mit der folgenden Reihenfolge funktioniert sowohl die Kamera als auch die 1wire Sensoren:
Die Datei /etc/modprobe.d/raspi-blacklist.conf sollte folgender Maßen aussehen:
# blacklist spi and i2c by default (many users don't need them)
#blacklist spi-bcm2708
blacklist i2c-bcm2708
Die Reihenfolge der Module wird in der Datei /etc/modules bestimmt. Wichtig ist, dass die 1wire Module als erstes geladen werden.
Meine sieht wie folgt aus.
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.
wire
w1-gpio
w1-therm
i2c-dev
i2c-bcm2708
spi-bcm2708
snd-bcm2835
bcm2708_wdog
bcm2835_thermal
Alles anzeigen
Ob ihr alle diese Module benötigt, sei dahin gestellt. Es sollte aber nicht schaden, diese zu laden. Da ich wie gesagt unsicher bin, was dort die besten Einstellungen sind, würde ich mich freuen, wenn jemand diesen Abschnitt verbessert
Nun starten wir den RPi einmal neu. Die Module sind nun geladen und der angeschlossene Sensor (in diesem Fall ein DS18B20) sollte erkannt werden. Um das zu prüfen, führen wir den folgenden Befehl aus:
Wie man sieht, wurde ein Sensor erkannt (28-00000530ed24). Jeder Sensor hat eine einmale ID, mit der ausgelesen werden kann. Diese sieht bei euch dann anders aus und ihr solltet euch diese merken oder notieren.
Um zu testen, ob der Sensor auch funktioniert, lesen wir den Wert aus:
sudo cat /sys/bus/w1/devices/28-00000530ed24/w1_slave
35 01 4b 46 7f ff 0b 10 31 : crc=31 YES
35 01 4b 46 7f ff 0b 10 31 t=19312
In der letzten Zeile steht nun t=19312. Dies entspricht einer Temperatur von 19,312 °C.
Damit wir den Sensor nun in unserer Config-Datei verwenden können, fügen wir ein weiteres Gerät einem Raum unserer Wahl hinzu, nachdem wir den pilight-Service gestoppt haben:
"DS18B20": {
"name": "Temp DS18B20",
"protocol": [ "ds18b20" ],
"id": [{
"id": "00000530ed24"
}],
"temperature": 1,
"gui-show-temperature": 1,
"poll-interval": 60,
"gui-decimals": 2
}
Alles anzeigen
Wie ihr seht, wird die "28-" bei der ID weggelassen, da dies durch das Protokoll ds18b20 bereits hinzugefügt wird.
Nachdem wir die Datei gespeichert haben und den pilight-Service neu gestartet haben, können wir den Wert nun in der Webgui auslesen.
Hier noch einmal die gesamte Config inklusive dem 1wire Sensor:
{
"room1": {
"name": "Raum1",
"switch1": {
"name": "Schalter 1",
"protocol": [ "mumbi" ],
"id": [{
"systemcode": 27,
"unitcode": 2
}],
"state": "off",
"gui-readonly": 0
},
"switch2": {
"name": "Schalter 2",
"protocol": [ "intertechno_old" ],
"id": [{
"unit": 2,
"id": 1
}],
"state": "off",
"gui-readonly": 0
}
},
"room2": {
"name": "Raum 2",
"RPiTemperatur": {
"name": "RPi-Temperatur",
"protocol": [ "rpi_temp" ],
"id": [{
"id": 1
}],
"temperature": 43333,
"gui-show-temperature": 1,
"poll-interval": 60,
"gui-decimals": 3
},
"Sunset": {
"name": "Sonne",
"protocol": [ "sunriseset" ],
"id": [{
"longitude": "52.00000000",
"latitude": "7.00000"
}],
"sunrise": 712,
"sunset": 1855,
"sun": "set"
},
"DS18B20": {
"name": "Temp DS18B20",
"protocol": [ "ds18b20" ],
"id": [{
"id": "00000530ed24"
}],
"temperature": 1,
"gui-show-temperature": 1,
"poll-interval": 60,
"gui-decimals": 2
}
}
}
Alles anzeigen
___________________________________________________________________________
8. Updates
Das updaten der Development Version ist denkbar einfach.
Zuerst stoppen wir sicherheitshalber den pilight-Service und dann führen wir einfach ein update bzw. upgrade durch und bestätigen die Sicherheitsabfrage nach dem unautorisierten Webgui-Paket(falls sie auftaucht):
Da die Configdateien mit den Standardwerten überschrieben werden, müssen wir das Backup für die hardware.json und die settings.json wiederherstellen (das wird von pilight automatisch erzeugt) VOrher aber noch den piligfht-service stoppen, damit die Dateien nicht direkt wieder überschrieben werden:
sudo service pilight stop
sudo cp /etc/pilight/hardware.json.bak /etc/pilight/hardware.json
sudo cp /etc/pilight/settings.json.bak /etc/pilight/settings.json
Nun können wir den Service wieder starten:
Sollte eure Config-Datei nach dem Update nicht mehr starten, schaut auf GitHub, ob irgendwelche Änderung der Synthax durchgeführt wurden und passt eure Config an. Diese bleibt natürlich beim Update erhalten.
___________________________________________________________________________
9. Beispiel Config Einträge (in work)
Webcam-Protokoll:
Ermöglicht das Anzeigen eines Webcambildes:
"Webcam": {
"name": "Webcam",
"protocol": [ "generic_webcam" ],
"id": [{
"url": "http://www.meteosat.com/imagenes/meteosat/sp/d2-col.jpg"
}],
"poll-interval": 1,
"gui-show-webcam": 1
}
Weitere Parameter: gui-image-width, gui-image-height
DHT22/DHT11:
"DHT22": {
"name": "Temp DHT22",
"protocol": [ "dht22" ],
"id": [{
"gpio": 2
}],
"humidity": 1,
"temperature": 1,
"gui-show-temperature": 1,
"gui-show-humidity": 1,
"poll-interval": 60,
"gui-decimals": 2
},
Alles anzeigen
Relay:
"pcstart": {
"name": "GPIO AnAus",
"protocol": [ "relay" ],
"id": [{
"gpio": 17
}],
"state": "off"
},
Openweathermap:
"Wetter": {
"name": "Wetter",
"protocol": [ "openweathermap" ],
"id": [{
"location": "berlin",
"country": "de"
}],
"humidity": 1,
"temperature": 1,
"poll-interval": 600,
"sunrise": 720,
"sunset": 2003,
"update": 1,
"sun": "set",
"gui-show-update": 1,
"gui-show-sunriseset": 1,
"gui-show-humidity": 1,
"gui-show-temperature": 1
}
Alles anzeigen
Uhrzeit und Datum:
"Datum": {
"name": "Datum",
"protocol": [ "datetime" ],
"id": [{
"longitude": "52.0000000",
"latitude": "7.00000",
"ntpserver": ""
}],
"year": 2014,
"month": 3,
"day": 26,
"hour": 23,
"minute": 10,
"second": 36
}
Alles anzeigen
___________________________________________________________________________
Unterstützte Geräte
- Elro
- Intertechno
- Mumbi
- Kaku
- DI-O
- Conrad
- und weitere
Für eine Liste siehe unter anderem: http://wiki.pilight.org/doku.php/protocols und für die unterstützten Geräte: http://wiki.pilight.org/doku.php/devices
Es kann sich aber auch lohnen ein Blick ins Forum zu werfen, um weitere Protokolle zu finden, die eventuell nicht aufgeführt werden.
Wichtige Anmerkung:
Da dieses Tutorial auf der development-Version basiert, ist es durchaus möglich, dass die Wiki-Einträge auf der pilight-Seite nicht aktuell sind, da sie sich auf die stabile Version beziehen. Nutzt stattdessen das pilight-Forum oder die commits in GitHub, um nach der entsprechenden Synthax zu schauen.
Wichtige Links:
pilight Projektseite: http://www.pilight.org
Github: https://github.com/pilight/pilight/tree/development
Wiki: http://wiki.pilight.org/doku.php
Forum: http://forum.pilight.org/
Informationen zur Dev-Version: http://wiki.pilight.org/doku.php/changes_features_fixes
JSON-Debugger: http://jsonlint.com/
Stand: 15.06.2014
Wenn ich mal wieder Zeit übrig habe, werde ich weitere Beispiele ergänzen.
Solltet ihr einen Fehler finden, würde ich mich freuen, wenn ihr mir diesen mitteilen würdet (auch Rächtschreibfehler ;))
Über Feedback würde ich mich freuen.