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.

LED info panel

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.

LED infopanel 2

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!

gast1

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.

Dieser Beitrag wurde unter Fhem-Hausautomation abgelegt und mit verschlagwortet. Setze ein Lesezeichen auf den Permalink.

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

  1. Patrick sagt:

    Hallo zusammen,

    ich habe mir das Bibliopixel mal angeschaut und konnte auch schon ein paar Funktionen zum laufen bekommen. Ich habe allerdings das Problem, dass wenn ich eine Funktion ausführe, die LEDs nur für einige Millisekunden an bleiben und dann wieder ausgehen.
    Wenn das ganze in einer Schleife läuft, dann bleibt die LED zwar an, aber man nimmt ein leichtes Flackern wahr (eben durch das ständige aus und einschalten). Gibt es eine Möglichkeit, die LED dauerhaft leuchten zu lassen?

    Viele Grüße,
    Patrick

  2. Muehli sagt:

    Hi wolle,

    ok, jetzt geht es. Nun kann ich direkt Werte aus dem Colorpicker an den LED-Strip übergeben. Das spart mir viele umständliche Umrechnungen. Danke

  3. wolle sagt:

    Ich werd hier noch bekloppt:

    led.setHex(22, "ff00ff") oder
    led.setHex(22, 'ff00ff')
    

    so nun aber!

  4. wolle sagt:

    weil ich Hammel das auch selber hier falsch geschrieben hatte, obwohl ich es beim Testen richtig gemacht hatte. 🙂

    led.setHex(22,ff00ff)
    NameError: name ‚ff00ff‘ is not defined

    Der Hex Wert muss als string übergeben werden, dann gibts auch kein nameError
    led.setHex(22, „ff00ff“) oder
    led.setHex(22, ‚ff00ff‘)

    Ob die Hex Werte gross oder klein geschrieben sind, spielt keine Rolle:

    Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
    >>> from raspledstrip.color import color_hex, Color
    >>> color_hex('FF00FF')
    color_hex: 255 0 255 1  <<---
    
    >>> color_hex("ff00ff")
    color_hex: 255 0 255 1  <<---
    
    
  5. Muehli sagt:

    Hi wolle,

    Die falschen Formatierungen, das war mein Fehler, da war einmal Tab statt Leerzeichen. Das sah optisch gleich aus.

    Ich habe beide Varianten probiert. (30.09 18:52 und 1.10) Ich bekomme immer die gleichen Fehlermeldungen. Und auch egal ob Groß- oder Kleinschreibung im Hex-Wert. Wobei der Colorpicker Kleinschreibung (ff00ff) ausgibt.

    File „/opt/fhem/RPi-LPD8806/status.py“, line 25, in
    led.setHex(22,FF0000)
    NameError: name ‚FF0000‘ is not defined

    File „/opt/fhem/RPi-LPD8806/status.py“, line 25, in
    led.setHex(22,ff00ff)
    NameError: name ‚ff00ff‘ is not defined

    Vielleicht noch ein Versuch?

  6. wolle sagt:

    Test: 🙂

        def setHex(self, pixel, hex_value):
            self.set(pixel, color_hex(hex_value))
    
  7. wolle sagt:

    huch aha. das ging auch daneben, wurde wohl als HTML Tag erkannt.
    Also nochmal zu 1.

    def setHex(self, pixel, hex_value):
    -TAB-self.set(pixel, color_hex(hex_value))

  8. wolle sagt:

    Dachte ich mir es doch das wir über die Formatierung stolpern werden, da sie hier verloren geht, oder ich nicht weiss, wie sie erhalten bleibt. :))
    1.
    self.set(pixel, color_hex(hex_value))
    ^
    IndentationError: expected an indented block

    Einrückungsfehler. Bei Python sind die Einrückungen wichtig.
    Orientier dich an den anderen Funktionen. Die Tabs müssen stimmen oder gleiche Anzahl Leerzeichen. (Stell dir das wie Spalten vor).Ich markier das mal mit :

    def setHex(self, pixel, hex_value):
    self.set(pixel, color_hex(hex_value))

    2.
    AttributeError: LEDStrip instance has no attribute ’setHEX‘

    stimmt, die Klasse LEDStrip hat kein Attribut (Methode, Funktion) setHEX.
    Gross/kleinschreibung ist auch wichtig.
    vergleiche: setHEX setHex

    Das sollte helfen 🙂

  9. Muehli sagt:

    Hi wolle,

    Danke für die Erleuterungen. Nun sehe ich auch Fehlermeldungen.

    wenn ich in der ledstrip.py stehen habe:

    def setHex(self, pixel, hex_value):
    self.set(pixel, color_hex(hex_value))

    kommt folgende Fehlermeldung:

    root@raspberrypi:~# python /opt/fhem/RPi-LPD8806/status.py
    Traceback (most recent call last):
    File „/opt/fhem/RPi-LPD8806/status.py“, line 1, in
    from bootstrap import *
    File „/opt/fhem/RPi-LPD8806/bootstrap.py“, line 9, in
    from raspledstrip.ledstrip import *
    File „/opt/fhem/RPi-LPD8806/raspledstrip/ledstrip.py“, line 99
    self.set(pixel, color_hex(hex_value))
    ^
    IndentationError: expected an indented block

    ##########################################
    Wenn in der ledstrip.py steht:

    def setHex(self, pixel, hex_value):
    color = color_hex(hex_value)
    self.setRGB(pixel, color.r, color.g, color.b)

    bekomme ich diese Fehlermeldung:

    root@raspberrypi:~# python /opt/fhem/RPi-LPD8806/status.py
    Traceback (most recent call last):
    File „/opt/fhem/RPi-LPD8806/status.py“, line 25, in
    led.setHEX(22,FFFF00)
    AttributeError: LEDStrip instance has no attribute ’setHEX‘
    ##################################################

    Vielleich hast Du noch einen Tip für mich.

    Danke

  10. wolle sagt:

    >>> led.setHEX(ff0000)
    NameError: name ‚led‘ is not defined

    ist nicht verwunderlich, weil das Objekt led nicht bekannt ist.
    led ist ein LEDStrip Objekt (Instanz) und setHex() ist eine Methode des Objekts.
    Das Ganze rein im Python Interpreter zu machen, ist umständlich.
    Führe einfach deine status.py direkt aus:
    python „Pfad“/status.py
    und schau was passiert.

    Beim „Studieren“ von dem RPI-LPD8806-master Dateien, fiel mir noch auf das die setHex Funktion kürzer sein kann:

    def setHex(self, pixel, hex_value):
    self.set(pixel, color_hex(hex_value))

    Das erspart den Umweg über setRGB().

    Schöne Grüsse

  11. Muehli sagt:

    Hi wolle,

    Fehlermeldungen sehe ich keine. Da ich normalerweise gar nicht zu Python komme. FHEM ist ein Perl-Sript.

    Der übergebene Hex-Wert sieht so aus led.setHEX(14,ff0000). Auch eine Großschreibung (14,FF0000) ändert nichts am Ergebnis.

    Wie kann ich in Python direkt Befehle ausführen? Über Putty (Konsole) bekomme ich in Python folgende Fehlermeldung wenn ich led.setHEX(ff0000) direkt eingebe:

    >>> led.setHEX(ff0000)
    Traceback (most recent call last):
    File „“, line 1, in
    NameError: name ‚led‘ is not defined

    Da mache ich noch einen Fehler. Wie kann ich in Python direkt Befehle ausführen, oder wo sehe ich sonst noch Fehlermeldungen?

  12. wolle sagt:

    siehst du evtl. irgendwelche Fehlermeldungen des python Teils?
    Wie sieht denn der vom Colorpicker kommende Hex Wert aus?

    Ich kenne mich übrigens mit dem FHEM Zeug garnicht aus. Ich lese nur den Blog, weil ich es interessant finde, was so machbar ist. 😉

  13. Muehli sagt:

    Hi wolle,

    Danke für Deine Hilfe.
    Ich habe alles so, wie beschrieben, in der ledstrip.py geändert. Leider klappt es noch nicht mit der Umwandlung von hex zu rgb. Wenn ich an Python übergebe, gehen nur alle LED’s aus. Mit leuchtet LED13 und auch die anderen wieder.

  14. wolle sagt:

    Hi Muehli!

    Ich hab mir mal das RPi-LPD8806-master Paket angesehen. Mit der von dir bereits erwähnten color_hex Funktion hast du eigentlich schon alles was du brauchst.

    Man könnte die LEDStrip Klasse in ledstrip.py erweitern.
    aus: from color import Color, ColorHSV
    wird: from color import Color, ColorHSV, color_hex

    Dann fügst du nach evtl. nach der Fuktion setRGB eine neu Funktion ein:

    def setHex(self, pixel, hex_value):
    color = color_hex(hex_value)
    self.setRGB(pixel, color.r, color.g, color.b)

    Jetzt solltest du mit dem HexWert des Colorpickers einfach beispielsweise:
    led.setHex(13, 0000FF) deine LED Nummer 13 setzen können.

    Die Hexadezimalwerte werden in color_hex umgerechnet und dann in einem Color Objekt gespeichert. Diese reichen wir dann einfach weiter an setRGB genauso wie die Nummer der LED.

    Gruss Wolle

  15. Muehli sagt:

    Ergänzung:

    Zusätzlich ist noch ein Umschaltrelais verbaut, welches mir den Lautsprecher auf eine externe Klinkenbuchse legt. Damit ist die Box als Rear-Mitten- Lautsprecher in meiner 6.1 Surround-Anlage nutzbar. Gesteuert wird das Relais mit dem Muting-Signal.

  16. Muehli sagt:

    Hi Tobias,

    Das Lautsprechergehäuse ist ein DynaVox WS-502.

    Im Gehäuse ist drin:

    Raspberry ,
    W-LAN Stick (Edimax),
    NF-Verstärker-Modul (mit Muting zur Reduzierung des Ruhestrom’s),
    Temperatursensor DS18B20,
    Schaltregler 12 zu 5V für Raspberry und LED,
    LED-Stripes 46cm LPD8806 60 LED/cm.

    Unten am Gehäuse habe ich noch ein kleines Lautstärkepoti zur Grundjustierung angebracht. Die Lautstärke wird zusätzlich in MyTTS tageszeitabhängig eingestellt.

    Es wird nur ein externes 12V Netzteil 1,2A benötigt. 12V wird für das NF-Verstärker-Modul benötigt. Es gibt auch welche für 5V, die sind aber nicht so laut. Da würde dann der Schaltregler wegfallen und ein 5V/2A Netzteil benötigt.

  17. Tobias sagt:

    Wirklich schönes Projekt.

    Mich würde sehr interessieren welches Lautsprechergehäuse du verwendest, und ob du da auch den Raspberry mit eingebaut bekommen hast. 🙂

    Danke,
    Tobi

  18. Muehli sagt:

    Danke füe die Info,

    Leider fehlen mir da einige Level dazwischen.
    Im Phyton steuere ich die LED im Moment von FHEM so an:

    Auszug aus der „status.py“
    ———————————————–
    from bootstrap import *
    from raspledstrip.ledstrip import *
    led.setMasterBrightness(0.3)
    led.setRGB(13,0,0,255)
    led.setRGB(12,0,255,0)
    ——————————————-
    die erste Ziffer ist die LED-Nr. die anderen drei die rgb-Werte. Hier würden nun hex-Werte ankommen.

    led.setHEX(13,0000ff)
    led.setHEX(12,00ff00)

    Diese Werte sollen auf die obigen RGB-Werte umgerechnet werden. Wie würde das konkret aussehen?

    Wo kommen die „def“ hin und wie werden die eingebunden?

    Danke

  19. wolle sagt:

    Hi!

    Ich hoffe ich hab das Problem richtig verstanden:

    Color Umrechnung in python:

    def hex_to_rgb(value):
    value = value.lstrip(‚#‘)
    lv = len(value)
    return tuple(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3))

    def rgb_to_hex(rgb):
    return ‚#%02x%02x%02x‘ % rgb

    hex_to_rgb(„#ffffff“) #==> (255, 255, 255)
    hex_to_rgb(„#ffffffffffff“) #==> (65535, 65535, 65535)
    rgb_to_hex((255, 255, 255)) #==> ‚#ffffff‘
    rgb_to_hex((65535, 65535, 65535)) #==> ‚#ffffffffffff‘

    Quelle: http://stackoverflow.com/questions/214359/converting-hex-color-to-rgb-and-vice-versa

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.