[LEDPiZero] Die Software
Damit die LEDs auch leuchten, müssen sie entsprechend mit Daten versorgt werden. Dieser Artikel beschreibt die Vorgehensweise zur Installation der Software.
Dies ist Teil 3 meiner kleinen Serie über den LEDPiZero.
- Teil 1: Besseres Ambilight? LEDPiZero!
- Teil 2: [LEDPiZero] Eine Platine
- Teil 3: [LEDPiZero] Die Software
- Teil 4: [LEDPiZero] Pi Zero W
Die Einrichtung von WLAN habe ich bereits in dem Artikel WLAN-Radio mit PiFace Control and Display [Update] beschrieben. Wichtiger ist nun die eigentliche Einrichtung des AmPilight.
Ich verwende für die Ansteuerung der LEDs ein Tool namens Hyperion. Laut dem offiziellen Wiki muss man einfach ein Hilfsprogramm namens HyperCon herunterladen. Das wiederum liegt nur als JAR vor und benötigt das Java SDK. Nach dessen Download und Installation konnte ich das Programm starten.
Im letzten Tab (SSH) kann man die Zugangsdaten zum eigenen Raspberry Pi angeben und über "Connect" verbindet sich das Programm mit dem Raspberry. Dann einfach "Inst./Akt. Hyperion" wählen und schon wird Hyperion auf dem Raspberry installiert. Dies kann eine Weile dauern.
Nach der Installation muss Hyperion noch nach den persönlichen Gegebenheiten angepasst werden. Dazu wählt man den ersten Tab "Allgemein". Mein Fernseher hat 40", ich nutze 92 LEDs - 29 jeweils oben und unten, 17 links und rechts, unten keine Lücke, da der Fernseher an der Wand hängt. Die Zählung beginnt bei mir unten rechts (wenn man vor dem Fernseher steht und geht gegen den Uhrzeigersinn.
Das Wiki bietet hier eine sehr gute Unterstützung, deswegen will ich nur auf die wichtigsten Punkte eingehen.
Über den Button "Generiere Konfiguration für Hyperion" kann man die entsprechende hyperion.config.json
erzeugen, die dann über den Tab "SSH" im Bereich "SSH - Sende Konfiguration" auf den Raspberry geladen werden kann. Klickt man dann mit der rechten Maustaste auf das bunte Bild im rechten Bereich, kann man mit Klick auf "Hole Bild vom Grabber..." ein aktuelles Bild von der Quelle laden (vorausgesetzt, es ist bereits etwas angeschlossen und läuft bereits). Nun geht es ans Feintuning, was die schwarzen Bereiche um das Bild herum angeht. Im besten Fall wählt man eine Quelle, die das Bild komplett füllt, also nicht, wo sowieso schon oben und unten schwarze Balken sind. Nun ist der Tab "Grabber" der wichtigste Arbeitsort. Der Haken bei "Externer Grabber" muss natürlich gesetzt sein. Sind nun um das Bild herum noch schwarze Streifen zu sehen, kann man diese mit "Entf. Pixel links/rechts/oben/unten" korrigieren. Nach jeder Änderung sollte man die Auswirkungen kontrollieren, indem die Konfiguration auf den Raspberry geladen wird und ein neues Bild vom Grabber geladen wird. Andere Einstellungen können natürlich auch noch angepasst und perfektioniert werden.
Das war's eigentlich schon mit der Installation des AmPiLights. Bei jedem Start des Raspberry sollte nun auch das Licht rund um den Fernseher starten und die Wand entsprechend beleuchten.
Einrichtung Infrarot
Ich habe auf meine Platine noch einen Infrarot-Empfänger gelötet. Mit einem kleinen Skript lässt sich dieser noch mit einer Nutzung hinterlegen. Meine Idee dahinter war, dass ich durchaus auch die Möglichkeit haben will, das Licht um den Fernseher auch bei Betrieb desselben auszuschalten oder auch das angeschlossene WLAN ein- und auszuschalten.
Zuerst muss lirc
installiert werden. Dies geschieht am einfachsten über
sudo apt-get install lirc
Die Datei /etc/modules
muss um ein paar Angaben ergänzt werden. So muss hier lirc
erst aktiviert werden und mitgeteilt werden, auf welchem Pin das Signal ankommt. Mit
sudo nano /etc/modules
startest du den Editor und kannst die Datei bearbeiten. Hier ergänzt du einfach
lirc_dev
lirc_rpi gpio_in_pin=25
Die Angabe "25" bedeutet dabei, dass das Signal vom Infrarot-Empfänger auf dem Pin GPIO25
ankommt. Dies ist nicht der Pin 25!
Mit Strg
+ X
schließt du den Editor und mit Y
bestätigst du die Änderungen.
Danach muss mittels
sudo nano /etc/lirc/hardware.conf
die Konfiguration geöffnet und wie abgebildet geändert werden.
# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"
#Don't start lircmd even if there seems to be a good config file
#START_LIRCMD=false
#Don't start irexec, even if a good config file seems to exist.
#START_IREXEC=false
#Try to load appropriate kernel modules
LOAD_MODULES=true
# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""
Nach dem Schließen und Speichern dieser Datei ist die Konfiguration des Raspberry an der Reihe. Mit
sudo nano /boot/config.txt
wird die Konfigurationsdatei im Editor geöffnet. Hier änderst du
#dtoverlay=lirc
zu
dtoverlay=lirc,gpio_in_pin=25
Auch hier kommt wieder dieselbe Zählweise wie oben zum Einsatz.
Speichern und Schließen oder Schließen und Speichern - je nachdem.
Mit
sudo reboot
startest du den Raspberry neu und nun wird lirc
auch hoffentlich geladen. Dies kann nach dem Neustart getestet werden, indem der Lirc-Daemon zuerst beendet wird.
sudo /etc/init.d/lirc stop
Mit dem Befehl
mode2 -d /dev/lirc0
wird ein Modus aktiviert, der es ermöglicht, dass die Daten, die über Infrarot empfangen werden, direkt im Terminal angezeigt werden. Also kannst du jetzt auf der Fernbedienung herum drücken und es sollten Angaben wie pulse
und space
auftauchen. Dann beendest du mit Strg
+ C
den Modus wieder.
In der folgenden Konfiguration werden Tasten festgelegt, auf die der Raspberry später reagieren soll. Diese Taste muss einen Namen bekommen. Diese möglichen Namen sind aber festgelegt. Mit
irrecord --list-namespace
kann man sich die Liste ausgeben lassen. Ich entschied mich für KEY_POWER
sowie KEY_WLAN
. Ich denke, dass die beiden Namen mein Vorhaben ganz gut wiedergeben.
Die eigentliche Konfiguration wird dann erst mit dem Befehl
irrecord -d /dev/lirc0 ~/lircd.conf
gestartet. Nach etwas Text steht dort dann die Aufforderung einige Tasten auf der Fernbedienung zu drücken, um das Anlernen zu ermöglichen. Das sollte also gemacht werden - sonst geht es auch nicht weiter.
Danach wird dann abgefragt, welche Taste gelernt werden soll. Hier tippst du den Namen ein, z. B. "KEY_POWER", drückst Enter
und dann die Taste. Dasselbe wiederholst du für "KEY_WLAN". Die Konfiguration wird abgeschlossen, in dem bei der Abfrage für eine neue Taste kein Name eingegeben und stattdessen nur mit Enter
bestätigt wird.
Die soeben erzeugte Konfigurationsdatei solltest du dann noch mal im Editor öffnen.
nano ~/lircd.conf
und in der Zeile "name" eventuell einen aussagekräftigeren Namen statt "/home/pi/lircd.conf" vergeben. Ich habe dort "ledpizero" eingetragen.
Nach dem Speichern der Änderungen wird die Datei einfach an den eigentlichen Bestimmungsort verschoben.
sudo mv ~/lircd.conf /etc/lirc/lircd.conf
und der Dienst wieder gestartet.
sudo /etc/init.d/lirc start
Der Befehl
irsend LIST ledpizero ""
listet alle Tastenzuordnungen auf, die nun definiert sind. (Solltest du deiner Konfiguration einen anderen Namen gegeben haben, musst du ledpizero
durch denselben ersetzen.
Den umgekehrten Weg kann man mit
sudo irw
gehen. Das startet einen Modus, in dem man die Tasten auf der Fernbedienung drückt und die entsprechend konfigurierten Namen werden dann im Terminal angezeigt. Mit Strg
+ C
wird das Ganze wieder beendet.
Damit man die Fernbedienung dann entsprechend auch in einem Python-Skript verwenden kann, müssen entsprechende Mappings erstellt werden.
Mit
nano ~/.lircrc
erstellst du die entsprechende Datei. Diese bekommt folgenden Inhalt:
begin
button = KEY_POWER
prog = ledpizero
config = KEY_POWER
end
begin
button = KEY_WLAN
prog = ledpizero
config = KEY_WLAN
end
button
bezeichnet dabei die entsprechende Taste, die denselben Namen bekommt wie bei dem Anlernen. prog
bezeichnet das Programm, das dann den String übergeben bekommt - in unserem Fall der Name der Fernbedienung. config
wiederum ist der String, der dann entsprechend übergeben wird.
Damit diese Konfiguration systemweit gültig wird, kopierst du sie einfach in das Systemverzeichnis.
sudo cp ~/.lircrc /etc/lirc/lircrc
Für die Nutzung von lirc
mit Python muss noch
sudo apt-get install python-lirc
ausgeführt werden, das den entsprechende Plugin für Python installiert.
Das eigentliche Skript gestaltet sich recht einfach und wird mit
nano ~/ledpizero.py
im Editor geöffnet. Füge hier den Inhalt
#! /usr/bin/env python
# coding: utf8
import lirc
import os
import subprocess
import time
sockid = lirc.init('ledpizero', blocking=False)
hyperionrunning = subprocess.check_output('sudo service hyperion status | grep running | wc -l', shell=True) == 1
wifi = False
while True:
codeIR = lirc.nextcode()
if codeIR:
if codeIR[0] == 'KEY_POWER':
if hyperionrunning:
os.system('sudo service hyperion stop')
hyperionrunning = False
else:
os.system('sudo service hyperion start')
hyperionrunning = True
if codeIR[0] == 'KEY_WLAN':
if wifi:
os.system('sudo ifdown wlan0')
wifi = False
else:
os.system('sudo ifup wlan0')
wifi = True
time.sleep(0.05)
ein. Der Inhalt ist nicht weiter kompliziert. Es wird eine Verbindung zum Socket geöffnet, der unsere Fernbedienung darstellt. Zusätzlich wird geprüft, ob Hyperion läuft und das wird in einer Variablen zwischen gespeichert.
In der Schleife erfolgt dann die Abfrage, ob eine Taste auf der Fernbedienung gedrückt wurde - und wenn ja, welche. Für die definierten Tasten werden entsprechende Aktionen ausgeführt.
Damit das Skript auch beim Systemstart geladen wird, ergänzt du einfach in der Datei /etc/rc.local
den Eintrag
python /home/pi/ledpyzero.py &
und das war's dann auch schon. Fertig.