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:
sollte ohne Fehler starten.
Davor oder jetzt muss nun die /etc/boblight.conf für die LED angepasst werden.
Hier meine derzeitige Datei:
root@dm800se:~# cat /etc/boblight.conf
[global]
#interface 127.0.0.1
port 19333
[device]
name device1
output python /usr/dreamWifiLight/Test.py
channels 3
type popen
interval 100001
debug off
[color]
name red
rgb FF0000
[color]
name green
rgb 00FF00
[color]
name blue
rgb 0000FF
[light]
name mai
color red device1 1
color green device1 2
color blue device1 3
hscan 0 100
vscan 0 100
Alles anzeigen
Wie wir hier sehen, soll boblight alle informationen an python /usr/dreamWifiLight/Test.py senden. Dies ist halt gerade die Großbaustelle
[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.
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