preAlpha dreamWifiLight (Mi-Light like Philips Hue über Boblight steuern)

  • Hallo zusammen,


    wir der Titel schon sagt habe ich angefangen ein Script zu entwerfen welches LED Raumleuchten in den Farben des Fernsehers leuchten lassen soll.


    Insperiert wurde es von diesen Video, wo aber die Farben nicht wirklich passen:
    https://www.youtube.com/watch?v=0z_jPeR8BZk


    Wieso Mi-Light?


    Mi-Light oder LimitleesLED sind quasi nachbauten von Philips HUE, aber dafür halt auch wesentlich billiger. Zudem liegt die API offen und man kann diese über UDP Pakete ansprechen:


    http://www.limitlessled.com/dev/


    Gebraucht wird dann nur diese Wifi Bridge und eine Lampe, welche ich mir über eBay bestellt habe.


    Nun endlich zum Script:


    Ersteinmal muss natürlich Boblight installiert werden, und geschaut werden das dieser wenigsten in den Grundeinstellungen läuft:


    Code
    boblightd


    sollte ohne Fehler starten.
    Davor oder jetzt muss nun die /etc/boblight.conf für die LED angepasst werden.
    Hier meine derzeitige Datei:



    Wie wir hier sehen, soll boblight alle informationen an python /usr/dreamWifiLight/Test.py senden. Dies ist halt gerade die Großbaustelle :rolleyes:


    [php]
    import sys
    import socket
    import colorsys
    import time
    UDP_IP = "192.168.178.116" #this is the IP of the wifi bridge, or 255.255.255.255 for UDP broadcast
    UDP_PORT = 8899
    sock = socket.socket(socket.AF_INET, # Internet
    socket.SOCK_DGRAM) # UDP


    sock.sendto("\x40\x00\x55", (UDP_IP, UDP_PORT))


    def popen():
    spidev = file('/usr/dreamWifiLight/aufruf.log', "wb")
    while True:
    #try:
    eingabe = sys.stdin.readline()
    if len(eingabe)>0:
    r,g,b,x = eingabe.split(' ')
    r = float(r)
    g = float(g)
    b = float(b)
    # calc the color for the LED
    h, l, s = colorsys.rgb_to_hls(r,g,b)
    #check if the screen is black = no send to my light ;-)
    if(r > 0 or g > 0 or b > 0):
    # berechne Brightness
    #l = max(2,int((l / 127.5) * 27))
    # berechne Farbwerte
    h = abs(int(round((h) * 255))-170)
    # Befehle zusammen setzen
    #MESSAGE2 = "\x4E" + chr(l) + "\x55"
    MESSAGE1 = "\x40" + chr(h) + "\x55"
    if(int(h) < 155 and (int(round(l * 255)) > 2)): # TODO: skip Black and withe frame first??, later change to synonym color?
    #send to my Bridge
    sock.sendto(MESSAGE1, (UDP_IP, UDP_PORT))
    #sock.sendto(MESSAGE2, (UDP_IP, UDP_PORT))
    else:
    continue
    else:
    #l = 0
    h = 0
    #MESSAGE2 = "\x4E" + chr(2) + "\x55"
    #MESSAGE1 = "\x40\x80\x55"
    #little logging
    spidev.write("Boblight: " + eingabe)
    spidev.write("RGB: " + str(r*255) + ":" + str(g*255) + ":" + str(b*255))
    spidev.write("lightness: " + str(int (round (l * 255))))
    spidev.write("hue: " + str(h))
    spidev.write("LimitlessLED: " + str(hex(h)) + "\n")
    spidev.flush()
    else:
    break
    #except:
    # break


    # start boblight read, but we wait 3 seconds to start
    import time
    time.sleep(3)
    popen()
    [/php]


    Einfach auf die Dream unter den Pfad packen und ggf rechte setzen.
    Ip adresse der Wlan bridge anpassen und ggf den Port
    Danach kann boblightd gestartet werden um zu sehen ob Python Fehler kommen wenn nicht.


    Code
    /etc/init.d/boblight-control start | restart


    unter /usr/dreamWifiLight/aufruf.log wird ein Logfile geschrieben, diesen entweder ab und an leeren oder logging auskommentieren, da sonst der flash vollgemüllt wird


    Was geht:
    - Die Farben kommen von Boblight bis zur LED
    - Die Umrehnung von RGB auf HLS und speziellen Farbraum der LED, ganzes Rot, Grün und Blau kommen genau an


    Was geht nocht nicht:
    - Brightness, das flackert dann doch sehr
    - Schwarze, Graue und weiße Farbe erkennen und diese weglassen bzw umlegen



    Ggf hilft ja dieser Ansatz dem einen oder anderen weiter.....und gerne nehme ich och Tipps und Tricks an ;)

  • top projekt :-)


    Die Produkte von IWY müssten doch auch funktionieren oder ?
    bzw. kann ich jede normale wifi bridge nutzen zur steuerung ?

  • Danke für die Blumen :tongue:


    Ja die IWY müssen genauso gehen da das, dass selbe ist. Hab ja Teilweise die Farbwerte der IWY aus dem Internet.


    Bei der Bridge musste nur schauen welchen Port du hast. Der wurde laut API mal geändert. Aber IP und Port kannst du im Script ganz oben einfach anpassen.


    Quote

    NEW Port Number: 8899 The Port Number most importantly has changed from 50000 to 8899


    Wie gesagt preAlpha!!! Aber über einen Tester würde ich mich natürlich freuen :hurra:

  • ich habe mit diese IWY dinger bestellt.. ich denke anfang der woche kann ich berichten.


    und wenn du magst kann ich auch ein plugin dazu basteln (für enigma2 mit gui).

  • Klar gerne, unterstützung ist super. Ich kann zwar Proggeln aber von Dream und Pluginwesen hab ich noch 0 Plan.


    Dann hoff ich mal das die Teile kommen und das es zumindest ein wenig flackert ;-) ... bei Problemen einfach melden..Versuche am Wochende mal die Fehlfarben zu analysieren und diese umzulegen (Weiß-grau-schwarz)

  • [php]
    import sys
    import socket
    import colorsys
    import time


    UDP_IP = "192.168.178.116" #this is the IP of the wifi bridge, or 255.255.255.255 for UDP broadcast
    UDP_PORT = 8899
    sock = socket.socket(socket.AF_INET, # Internet
    socket.SOCK_DGRAM) # UDP


    sock.sendto("\x40\x00\x55", (UDP_IP, UDP_PORT))


    def popen():
    spidev = file('/usr/dreamWifiLight/aufruf.log', "wb")
    while True:
    #try:
    eingabe = sys.stdin.readline()
    if len(eingabe)>0:
    # get rgb from Boblight
    r,g,b,x = eingabe.split(' ')
    r = float(r)
    g = float(g)
    b = float(b)
    # calc the color for the LED
    h, l, s = colorsys.rgb_to_hls(r,g,b)
    #calculate brightness
    l = max(2,int((l * 27)))
    spidev.write("Boblight: " + eingabe)
    spidev.write("RGB: " + str(r*255) + ":" + str(g*255) + ":" + str(b*255))
    spidev.write("lightness: " + str(l))
    spidev.write("hue: " + str(h))
    #spidev.write("LimitlessLED: " + str(hex(h)) + "\n")
    spidev.flush()
    if(h==0 and s==0): # h==0 and s==0 greyscale black, gray or white -> not red red == h=0 and light 50%
    #so we send white with brightness
    MESSAGE1 = "\xC2\x00\x55"
    MESSAGE2 = "\x4E" + chr(l) + "\x55"
    else:
    # normal color, calc it
    h = abs(int(round((h) * 255))-170) # 170 is the offset for IWY
    # todo send all h_old to h_new to make it smooth ??
    MESSAGE1 = "\x40" + chr(h) + "\x55"
    MESSAGE2 = "\x4E" + chr(l) + "\x55"
    sock.sendto(MESSAGE1, (UDP_IP, UDP_PORT))
    sock.sendto(MESSAGE2, (UDP_IP, UDP_PORT))


    else:
    break
    #except:
    # break


    # start boblight read, but we wait 2 seconds to start
    import time
    time.sleep(3)
    popen()


    [/php]


    Changelog:
    - Herrausgefunden wie ich die Lampe auf Weiß umstelle
    - Weiß wird gesenden
    - Brightness eingebaut, aber noch alles was zu dunkel
    - Moonlamp farben stimmen zu 80%, fehlt noch Rot zu korrigieren


    Kleines Update, ich weiß das das bei weiten noch nicht die Lösung ist aber ich wollte euch teilhaben lassen an dem was ich so werkle....


    Edit: Anbei noch eine boblight.conf, die mit sedubaord und diesem script zusamen funktioniert

  • hmmm, nun habe ich hier ein Karatelight16 mit Boblight am laufen.
    Ausserdem habe ich hier ein Philips HUE System.


    unter XBMC wird das KL16 von Boblight verwaltet und die HUE eben vom HUE-Plugin.


    Kann das Boblight mit deiner Methode auch beide Devices gleichzeitig ansteuern und geht es überhaupt mit HUE (API ist da ja auch offen) oder nur mit den Nachbauten?


    Kann Boblight ggfs. mit 2 boblight.conf 2x laufen?


    Noch ein kleiner Tipp, unter XBMC gibt es den "Cinema mode" welcher sobald ein Film abgespielt wird die Lichter abdunkelt... Klar bei der Dream müsste man das über einen Quickbutton realisieren, aber wäre schon cooool.


    Also wenn das ding ist wie ich es mir vorstelle, dann jetzt schon mal MUCHAS GRACIAS!!!


    Werde heute Abend testen.


    Greetz
    Tomster

  • Im Prinzip kann man das auch für das original Hue erweitern. Derzeit geht nur das eine System, weil ich genau nur dieses habe. Das Hue war mir einfach viel zu teuer :evil:


    Aber die eigentliche Aufgabe ist die selbe, nur die zu sendende Paket mit den Befehlen sind anders, wenn du die herrausfindest können wir das über anpassen.

  • ui, hattest schon geantwortet während ich editiert habe...


    Na das finde ich raus ;-)


    bis später...


    *edit on*


    Hier ist das XBMC script welches denke ich alles drin hat. Ich denke ein Problem wird aber sein das boblight nicht mein KL16 und HUE Gleichzeitig steuern können wird...


    *edit off*

  • Hi,


    wieso sollte boblight das nciht gleichzeitig steuern können?


    Mein Seduboard und meine Mi.Lights werden auch gleichzeitig gesteuert, siehe meine conf oben?

  • Ja so vollen support kann ich nicht geben, da ich nicht testen kann. aber ich schau mal was sich machen lässt

  • sooo.... ich habe das iwy set erhalten und alles installiert. Es läuft soweit auch alles sehr gut, manchmal habe ich das gefühl die lampe könnte heller sein. Die lampe ist selten sehr hell.


    wie wird das eigentlich errechnet ? oder woran orientierst du dich oder übernimmt das boblight ?


    wenn du willst kann ich jetzt mal ein plugin basteln evtl. erstmal wo man port und ip einstellen kann.


    ich könnte noch eine art testmodus einbauen wo er verschiedene farben testet dazu müsste ich nur die http/udp commands wissen.

  • Hi,


    also errechnet wird die Helligkeit über das HLS Farbsystem / Farbraum. Dabei steht das L für Lighness also die Helligkeit. Diese gebe ich an die Lampen weiter. ggf müssen wir hier noch eine offset Variante/Variable einführen damit die einfach um einen Faktor x heller gemacht wird.


    [php] # calc the color for the LED
    h, l, s = colorsys.rgb_to_hls(r,g,b)
    .....
    MESSAGE2 = "\x4E" + chr(l) + "\x55"
    [/php]



    Farben werden derzeit wie folgt berechnet
    [php]
    h = abs(int(round((h) * 255))-170) # 170 is the offset for IWY
    MESSAGE1 = "\x40" + chr(h) + "\x55"
    [/php]


    h kommt wieder von der HLS umrechnung. Meine Lampen sind aber im HUE um 170 grad verdreht. Blau ist 0 und nicht rot wie normal. daher das -170. abs entfernt bei negativen zahlen das - ....
    Zudem versuche ich Weiß und Grau im Script zu erkennen und diese gesondert zu senden, siehe die If


    gesendet wir es dann noch als hex byte, deswegen das chr( )


    Hoffe ich konnte deine fragen beantworten, wenn nicht einfach weiter fragen ;-)


    Gruß


    P.S: Cool wäre ein An/ausschalter. Der müsste aber zudem auch Boblight starten damit das senden der Daten aus Boblight zu unseren Script neu beginnt!

  • also muss ich 170 einstellen und nicht -170 :-) ?


    bzw. ich kann boblight ja per telnet/shell starten/restarten/stopen
    ich mache mich morgen mal an ein plugin ran.


    die log datei /usr/dreamWifiLight/aufruf.log ist jetzt schon 26 mb evtl. sollte man das anders lösen on/off log funktion.

  • Quote

    die log datei /usr/dreamWifiLight/aufruf.log ist jetzt schon 26 mb evtl. sollte man das anders lösen on/off log funktion.


    preAlpha ,-). Klar das soll net für den Dauer betrieb sein, war für mich um zu sehen was da abgeschickt wird.
    Einfach die Zeilen mit "spidev" vorne auskommentieren dann wird nix mehr geschrieben. Ich bau dann eine Funktion die das schreiben übernimmt dann kann man die über einen parameter steuern...muss mir noch sagen wie ich an deinen plugin on/off parameter ran komme..0 ahnung von dream plugins :-)



    zu den 170, versuchs nochmal:


    Hue gibt den farbwert als kreis Radius an. HLS kreis sihet so aus:


    http://upload.wikimedia.org/wi…g/220px-Triangulo_HSV.png


    Wie du auf dem Bild sieht ist auf Grad 0 und 360, die farbe ROT.


    Die Lampen haben aber diesen Hue Kreis:


    http://www.msxfaq.de/lync/impresence/iwylight13.gif


    da ist BLAU auf 0 grad. Somit ist der Kreis verdreht. die Drehung habe ich mit 170 Grad bestimmt. Daher ziehe ich diese 170 vom errechneten HLS (bzw hue) ab um auf die richtigen Gardzahl für die Lampe zu kommen. wenn die farben bei dir uach stimmen, passt das ja

  • also nochmal für dumme :-) ich blick noch nicht ganz durch


    iwy, mi light etc.. müssen dann die option +170 haben
    und bei hue -170 ?

  • Milight ziehst du vom errechneten Hue 170 ab. Andere lampen müssen ggf andere werte abziehen oder addieren

  • hi, ich hab ein bisschen damit gespielt, zu meiner hardware:


    mi light wifi brdige und mi light led strip controller...


    beide verbunden und per boblight gesteuert....



    funzt soweit, allerdings hauen die farbwerte noch nicht 100% hin


    wenn ich zum beispiel nur 100%(255) auf rot stelle, ist die grüne farbe trotzdem noch aktiv, aber richtig dunkel...


    wenn ich grün 100% stelle, is blau noch an , dunkler natürlich...



    bei 100% blau, is rot schwach aktiv...



    bei weiss....dauert es bis es weiss wird....


    passiert erst, wenn man rot blau und grünn auf 255 stellt also 100%


    wenn man bei rot weniger hat, als 100% ...iist es nich weiss und die rote farbe ist auch garnicht aktiv, komplett aus...erst bei 100% an

  • Ja das mit den Fehlfarben ist mir bewusst. Das kommt besonders bei dunklen und hellen Farben vor die eigentlich als weiß abgebildet werden müssen. Das stimmen die Rechnungen noch nicht. Wie hast du boblight eingestellt auf feste Farben dann schau ich mir das mal mit deinen Farben an.


    Gruß