Robins Blog – Technik und Multimedia

Gastbeitrag: Statusanzeige mit digitalen LED-Streifen auf der Basis 8806 und Raspberry Pi unter Fhem

07.10.2015 Update: Blog-Beitrag erweitert

LED info panelIch finde es immer klasse, wenn sich Blog-Leser von meinen Blog-Beiträgen inspiriert fühlen und meine Projekte nachbauen. Ich hatte Euch damals meinen digitalen Bilderrahmen (-> Blog-Beitrag Bilderrahmen) vorgestellt, welcher einen hohen WAF besitzt. Jetzt hat sich Blog-Leser Muehli hat sich mal drangesetzt und aus einem LED-Streifen mit dem 8806 Chipsatz und einem alten Raspberry Pi B eine Status-Anzeige gebastelt. Alles läuft unter Fhem.

Folgende Zutaten benötigt ihr dafür (Bauteile):

Raspberry Pi: -> siehe Blog-Beitrag
2x Netzteil 5V 2A:
LED-Stripes: LED-Stripes bei eBay kaufen
Kabel:
Nach oben (Optik) sind natürlich keine Grenzen gesetzt.

Hier übergebe ich an meinem Gast-Autor Muehli, und wie immer bei Fragen, fragen:

Dies ist mein erster Versuch um eine Statusanzeige kostengünstig zu realisieren.
Ich hatte hier noch einen ausgedienten Raspberry B rumliegen und habe diesen zur Statusanzeige und Ausgabe von akustischen Statusmeldungen benutzt. Eingebaut habe ich alles in ein flaches Lautsprechergehäuse mit aufgeklebten LED-Streifen. Davor wurden zwei Plexiglasscheiben mit dazwischenliegender Beschriftung montiert.

Benötigt wird eine laufende FHEM Installation, LED-Streifen mit der gewünschten Anzahl von LED’s und ein entsprechen passendes 5V. Für 30 LED’s reichen hier 2A.
Das Soundmodul Text2Speech habe ich nach der Anleitung der Commandref installiert.
Verbunden ist der Raspberry über WLAN und dem Modul FHEM2FHEM mit der steuernden FHEM-Installation.

Man sieht auf diesem Foto, das es sich hier um kein Massenprodukt, sondern um ein Hobby-Projekt handelt. Wie dem auch sei, wichtig ist, was am Ende herauskommt!

Der LED-Streifen wird an dem Raspberry Pi wie folgt angeschlossen:

Raspberry LED-Streifen Netzteil 5V/2A
SPI MOSI (Pin19) -> DI
SPI SCLK (Pin23) -> CI
GND (Pin25) -> GND +5V

Als nächstes die Firmware aktualisieren:
sudo rpi-update

 

Wichtig ist die gemeinsame Masseverbindung vom Raspberry, LED-Streifen und Netzteil.

Auf den Raspberry habe ich in des FHEM-Verzeichnis /opt/fhem/RPi-LPD8806 nachfolgende Software entpackt und kopiert. Die Software kann hier herunter geladen werden.

https://github.com/adammhaile/RPi-LPD8806

Folgende Installationen sind evtl. noch auf den Raspberry notwendig.

SPI Aktivieren:

Sudo raspi-config
– Advanced Options -> A6 SPI -> enabled -> yes
Would you like the SPI kernel module to be loaded by default -> yes
-> Advanced Options -> A0 Update

Fertig – Reboot

Phyton installieren:
apt-get install python-pip

Rechtevergabe:

sudo nano /etc/modprobe.d/raspi-blacklist.conf

blacklist i2c-bcm2708-> aktivieren (Raute entfernen)

sudo nano /etc/udev/udev.conf einfügen
KERNEL=="spidev*", SUBSYSTEM=="spidev", GROUP="spi", MODE="0660"

In der Kommandozeile eingeben:

/dev/spidev0.0
modprobe spidev bufsiz=8192
chown -R fhem /dev/spidev0.0
sudo adduser fhem spi

Für die Buttons in die fhem.cfg einfügen:
#### Demo-Anzeige
#### LED Muster
define LPD01 dummy
attr LPD01 alias Demo
attr LPD01 room LED Muster
attr LPD01 stateFormat &nbsp
attr LPD01 webCmd Start

define LPD01_Run notify LPD01:Start {system("python ./RPi-LPD8806/example.py");;system("python ./RPi-LPD8806/status.py")}
##### Status Anzeige
##### LED status
define StatusLED_on notify (LED.*:.*|LPDon:Aus) set $NAME $EVENT;;{StatusLED};;{system("python ./RPi-LPD8806/status.py")}

define LED_hell dummy
attr LED_hell alias Helligkeit
attr LED_hell room LED Status
attr LED_hell sortby 01
attr LED_hell webCmd 0.12:0.3:0.5:0.8:1

## Änderung state von "rgb hex" auf "hex"
define HexLed dummy
attr HexLed userattr hex
attr HexLed room LED Status
attr HexLed setList rgb:colorpicker
attr HexLed sortby 02
attr HexLed userReadings {ReadingsVal("HexLed","state","") substr($state,-6)}
attr HexLed webCmd rgb 000000:rgb ff0000:rgb 00ff00:rgb 0000ff:rgb ffff00:rgb ffffff:rgb

define LED01 dummy
attr LED01 devStateIcon 0,0,0:general_aus 255,255,255:rc_dot 255,0,0:rc_RED 0,255,0:rc_BLUE 0,0,255:rc_GREEN 255,0,255:rc_YELLOW *.:general_an
attr LED01 room LED Status
attr LED01 setList 0,0,0 0,255,0 255,0,0 0,0,255 255,255,255 0,255,255
attr LED01 sortby 03
attr LED01 webCmd 0,0,0:255,0,0:0,255,0:0,0,255:255,160,0:255,255,255

define LED02 dummy
attr LED02 devStateIcon 0,0,0:general_aus 255,255,255:rc_dot 255,0,0:rc_RED 0,255,0:rc_BLUE 0,0,255:rc_GREEN 255,0,255:rc_YELLOW *.:general_an
attr LED02 room LED Status
attr LED02 setList 0,0,0 255,0,0 0,255,0 0,0,255 255,255,255 255,0,255
attr LED02 sortby 04
attr LED02 webCmd 0,0,0:255,0,0:0,255,0:0,0,255:255,255,255:255,0,255
…… weiter so bis Anzahl der gewünschten LED’s errreicht ist, bei mir bis LED28

define LED27 dummy
attr LED27 devStateIcon 0,0,0:general_aus 255,255,255:rc_dot 255,0,0:rc_RED 0,255,0:rc_BLUE 0,0,255:rc_GREEN 255,0,255:rc_YELLOW
attr LED27 room LED Status
attr LED27 setList 0,0,0 255,0,0 0,255,0 0,0,255 255,255,255 255,0,255
attr LED27 sortby 29
attr LED27 webCmd 0,0,0:255,0,0:0,255,0:0,0,255:255,255,255:255,0,255

define LED28 dummy
attr LED28 devStateIcon 0,0,0:general_aus 255,255,255:rc_dot 255,0,0:rc_RED 0,255,0:rc_BLUE 0,0,255:rc_GREEN 255,0,255:rc_YELLOW
attr LED28 room LED Status
attr LED28 setList 0,0,0 255,0,0 0,255,0 0,0,255 255,255,255 255,0,255
attr LED28 sortby 30
attr LED28 webCmd 0,0,0:255,0,0:0,255,0:0,0,255:255,255,255:255,0,255
in die 99_myUtils.pm einfügen
## RGB-Stripes Status ##########################################################
## RGB-Stripes Status ##########################################################

sub StatusLED()
{
my $sta1 = "from bootstrap import *\n"."from raspledstrip.ledstrip import *\n";
my $sta2 = "led.setMasterBrightness(".(ReadingsVal("LED_hell","state",0.0)).")\n";
#my $sta3 = "led = hexstrip(52)\n";
#my $st01a = substr((ReadingsVal("LED01","state","")),-6);
#my $st01 = "led.setHEX(0,".$st01a.")\n";
my $st01 = "led.setRGB(13,".(ReadingsVal("LED01","state","")).")\n";
my $st02 = "led.setRGB(12,".(ReadingsVal("LED02","state","")).")\n";
…… hier wieder bis Ende ergänzen.
my $st27 = "led.setRGB(26,".(ReadingsVal("LED16","state","")).")\n";
my $st28 = "led.setRGB(27,".(ReadingsVal("LED15","state","")).")\n";
my $stend = "led.update()\n";
open (DATEI, ">./RPi-LPD8806/status.py") or die $!;
print DATEI "$sta1$sta2$st01$st02$st03$st04$st05$st06$st07$st08$st09$st10$st11$st12$st13$st14$st15$st16$st17$st18$st19$st20$st21$st22$st23$st24$st25$st26$st27$st28$stend";
close (DATEI)
}

######################################################

Sicherlich kann der Code mit einer Schleife in der 99_myUtils.pm vereinfacht werden. Leider habe ich dazu nicht die notwendigen Kenntnisse. So funktioniert es auch.
Angesteuert wird die entsprechende Status-LED im FHEM (Beispiel für die 1. LED rot) mit: set LED01 255,0,0

Noch Offen:
Leider kann ich den Colorpicker nicht nutzen, da ich nicht weiß, wie man Color dezimal zu hex umrechnet, bzw. wie man das Phyton Programm mit hex Werten füttert. Im Modul color.py ist zwar eine Umrechnung vorgesehen (def color_hex(hex), aber ich komme mit meinen bescheidenen Programmierkentnissen damit nicht klar.
Auch gibt es bei https://github.com/ManiacalLabs/BiblioPixel/wiki ein verbessertes Programm, welches zur Ansteuerung anderer LED-Stripes geeignet ist. Hier die Momentan unterstützten Chips:
LPD8806, WS2801, WS2811, WS2812, WS2812B, NEOPIXEL, APA104, TM1809, TM1804, TM1803, UCS1903, SM16716, APA102, LPD1886, P9813.

Leider bin ich damit auch nicht klar gekommen.
Gerne bin ich an Verbesserungen interessiert und bitte um Unterstützung.

Die mobile Version verlassen