/ ambilight / Comments

[LEDPiZero] Die Software

Dies ist Teil 3 meiner kleinen Serie über den LEDPiZero.


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.

HyperCon

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.

Tagged in: ambilight | raspberry pi | ledpizero | raspberry pi zero | hyperion