403 lines
16 KiB
Python
403 lines
16 KiB
Python
from yeelight import *
|
|
import time
|
|
|
|
##---------------------------------------------------------------------------------------##
|
|
class Yeelight(object):
|
|
##---------------------------------------------------------------------------------------##
|
|
##-----------------------------------------------------------------------------------##
|
|
def __init__(self, bulbs):
|
|
##-----------------------------------------------------------------------------------##
|
|
self.bulbs = {}
|
|
self.groups = {}
|
|
for bulb in bulbs:
|
|
try:
|
|
self.bulbs.update({bulb : Bulb(bulbs[bulb]['ip'],auto_on=True)})
|
|
except:
|
|
print("ERROR: Config not saved for " + bulb)
|
|
|
|
try:
|
|
for group in bulbs[bulb]['groups']:
|
|
groupName = bulbs[bulb]['groups'][group]
|
|
if(groupName not in self.groups):
|
|
print("Create new Group " + groupName)
|
|
self.groups[groupName] = {}
|
|
|
|
self.groups[groupName][bulb] = bulb
|
|
except:
|
|
print(bulb + " ist in keiner Gruppe")
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def config(self):
|
|
##-----------------------------------------------------------------------------------##
|
|
config = {
|
|
"rgb" : {
|
|
"device" : {
|
|
"name" : "",
|
|
"ip" : "",
|
|
"type" : "rgb"
|
|
},
|
|
"power" : {
|
|
"device" : "name",
|
|
"state" : "switch"
|
|
},
|
|
"brightness" : {
|
|
"device" : "name",
|
|
"state" : "dimmer"
|
|
},
|
|
"temperature" : {
|
|
"device" : "name",
|
|
"state" : "dimmer"
|
|
},
|
|
"color" : {
|
|
"device" : "name",
|
|
"r" : "dimmer",
|
|
"g" : "dimmer",
|
|
"b" : "dimmer"
|
|
}
|
|
},
|
|
"white" : {
|
|
"device" : {
|
|
"name": "",
|
|
"ip" : "",
|
|
"type" : "white"
|
|
},
|
|
"power" : {
|
|
"device" : "name",
|
|
"state" : "switch"
|
|
},
|
|
"brightness" : {
|
|
"device" : "name",
|
|
"state" : "dimmer"
|
|
},
|
|
"temperature" : {
|
|
"device" : "name",
|
|
"state" : "dimmer"
|
|
}
|
|
}
|
|
}
|
|
return config
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def state(self):
|
|
##-----------------------------------------------------------------------------------##
|
|
state = {}
|
|
for bulb in self.bulbs:
|
|
state[bulb] = {}
|
|
try:
|
|
properties = self.bulbs[bulb].get_properties()
|
|
except:
|
|
state[bulb]['offline'] = True
|
|
finally:
|
|
state[bulb]['offline'] = False
|
|
state[bulb]['power'] = properties['power']
|
|
state[bulb]['brightness'] = properties['bright']
|
|
state[bulb]['temperature'] = properties['ct']
|
|
state[bulb]['color'] = properties['rgb']
|
|
state[bulb]['groups'] = {}
|
|
for group in self.groups:
|
|
if(bulb in self.groups[group]):
|
|
state[bulb]['groups'][group] = ""
|
|
#r, g, b = tuple(int(properties['rgb'][i:i+2], 16) for i in (0, 2 ,4))
|
|
#print("r:" + str(r) + " g: " + str(g) + " b: " + str(b))
|
|
return state
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def command(self, data):
|
|
##-----------------------------------------------------------------------------------##
|
|
for device in data:
|
|
group = 0
|
|
if device in self.groups:
|
|
group = True
|
|
if(device in self.bulbs or device in self.groups):
|
|
if 'power' in data[device]:
|
|
self.power(device, group, data[device]['power'])
|
|
if(data[device]['power'] == "off"):
|
|
return 0
|
|
if 'brightness' in data[device]:
|
|
self.brightness(device, group, data[device]['brightness'])
|
|
if 'r' in data[device] or 'g' in data[device] or 'b' in data[device]:
|
|
if 'r' in data[device]:
|
|
r = data[device]['r']
|
|
else:
|
|
r = "0"
|
|
if 'g' in data[device]:
|
|
g = data[device]['g']
|
|
else:
|
|
g = "0"
|
|
if 'b' in data[device]:
|
|
b = data[device]['b']
|
|
else:
|
|
b = "0"
|
|
self.color(device, group, r, g, b)
|
|
if 'temperature' in data[device]:
|
|
self.temperature(device, group, data[device]['temperature'])
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def power(self, device, group=None, state=None):
|
|
##-----------------------------------------------------------------------------------##
|
|
if(state==None):
|
|
return -1
|
|
|
|
if(device==None):
|
|
for bulb in self.bulbs:
|
|
self.powerBulb(device, state)
|
|
if(group == True):
|
|
for bulb in self.groups[device]:
|
|
self.powerBulb(bulb, state)
|
|
else:
|
|
if(device in self.bulbs):
|
|
self.powerBulb(device, state)
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def powerBulb(self, device, state):
|
|
##-----------------------------------------------------------------------------------##
|
|
if(device in self.bulbs):
|
|
error = False
|
|
try:
|
|
oldState = self.bulbs[device].get_properties()
|
|
except:
|
|
print(device + ": Konnte nicht angesteuert werden")
|
|
error = True
|
|
finally:
|
|
if(str(oldState['power']) != str(state)):
|
|
if(state=="on"):
|
|
self.bulbs[device].turn_on()
|
|
print(device + " turned on")
|
|
else:
|
|
self.bulbs[device].turn_off()
|
|
print(device + " turned off")
|
|
if(error == True):
|
|
for count in range(0,10):
|
|
try:
|
|
oldState = self.bulbs[device].get_properties()
|
|
except:
|
|
print(device + ": Konnte nicht angesteuert werden")
|
|
finally:
|
|
if(str(oldState['power']) != str(state)):
|
|
if(state=="on"):
|
|
self.bulbs[device].turn_on()
|
|
print(device + " turned on")
|
|
else:
|
|
self.bulbs[device].turn_off()
|
|
print(device + " turned off")
|
|
try:
|
|
oldState = self.bulbs[device].get_properties()
|
|
if(oldState['power'] == str(state)):
|
|
break
|
|
except:
|
|
print(device + " keine Veraenderung")
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def brightness(self, device, group, state=None):
|
|
##-----------------------------------------------------------------------------------##
|
|
if(state==None):
|
|
return -1
|
|
|
|
if(device==None):
|
|
for bulb in self.bulbs:
|
|
self.brightnessBulb(device, state)
|
|
if(group == True):
|
|
for bulb in self.groups[device]:
|
|
self.brightnessBulb(bulb, state)
|
|
else:
|
|
if(device in self.bulbs):
|
|
self.brightnessBulb(device, state)
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def brightnessBulb(self, device, state):
|
|
##-----------------------------------------------------------------------------------##
|
|
if(device in self.bulbs):
|
|
error = False
|
|
try:
|
|
oldState = self.bulbs[device].get_properties()
|
|
print(oldState)
|
|
except:
|
|
print(device + ": Konnte nicht angesteuert werden")
|
|
error = True
|
|
finally:
|
|
if(str(oldState['bright']) != str(state)):
|
|
self.bulbs[device].set_brightness(int(state))
|
|
print(device + " turned brightness to " + str(state))
|
|
if(error == True):
|
|
for count in range(0,10):
|
|
try:
|
|
oldState = self.bulbs[device].get_properties()
|
|
except:
|
|
print(device + ": Konnte nicht angesteuert werden")
|
|
finally:
|
|
if(str(oldState['brigh']) != str(state)):
|
|
self.bulbs[device].set_brightness(int(state))
|
|
print(device + " turned brightness to " + str(state))
|
|
try:
|
|
oldState = self.bulbs[device].get_properties()
|
|
if(oldState['bright'] == str(state)):
|
|
break
|
|
except:
|
|
print(device + " keine Veraenderung")
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def temperature(self, device, group, state=None):
|
|
##-----------------------------------------------------------------------------------##
|
|
if(state==None):
|
|
return -1
|
|
|
|
if(device==None):
|
|
for bulb in self.bulbs:
|
|
self.temperatureBulb(device, state)
|
|
if(group == True):
|
|
for bulb in self.groups[device]:
|
|
self.temperatureBulb(bulb, state)
|
|
else:
|
|
if(device in self.bulbs):
|
|
self.temperatureBulb(device, state)
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def temperatureBulb(self, device, state):
|
|
##-----------------------------------------------------------------------------------##
|
|
if(device in self.bulbs):
|
|
error = False
|
|
try:
|
|
oldState = self.bulbs[device].get_properties()
|
|
except:
|
|
print(device + ": Konnte nicht angesteuert werden")
|
|
error = True
|
|
finally:
|
|
if(str(oldState['ct']) != str(state)):
|
|
self.bulbs[device].set_color_temp(int(state))
|
|
print(device + " turned temperature to " + str(state))
|
|
if(error == True):
|
|
for count in range(0,10):
|
|
try:
|
|
oldState = self.bulbs[device].get_properties()
|
|
except:
|
|
print(device + ": Konnte nicht angesteuert werden")
|
|
finally:
|
|
if(str(oldState['ct']) != str(state)):
|
|
self.bulbs[device].set_color_temp(int(state))
|
|
print(device + " turned temperature to " + str(state))
|
|
try:
|
|
oldState = self.bulbs[device].get_properties()
|
|
if(oldState['ct'] == str(state)):
|
|
break
|
|
except:
|
|
print(device + " keine Veraenderung")
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def color(self, device, group, r, g, b):
|
|
##-----------------------------------------------------------------------------------##
|
|
if(device==None):
|
|
for bulb in self.bulbs:
|
|
self.colorBulb(device, r, g, b)
|
|
if(group == True):
|
|
for bulb in self.groups[device]:
|
|
self.colorBulb(bulb, r, g, b)
|
|
else:
|
|
if(device in self.bulbs):
|
|
self.colorBulb(device, r, g, b)
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def colorBulb(self, device, r, g, b):
|
|
##-----------------------------------------------------------------------------------##
|
|
bulbCount = 0
|
|
bulbCheck = 0
|
|
if(device in self.bulbs):
|
|
error = False
|
|
try:
|
|
bulbCount = bulbCount + 1
|
|
oldState = self.bulbs[device].get_properties()
|
|
except:
|
|
print(device + ": Konnte nicht angesteuert werden")
|
|
error = True
|
|
finally:
|
|
self.bulbs[device].set_rgb(int(r), int(g), int(b))
|
|
print(device + " color r:" + str(r) + " g:" + str(g) + " b:" + str(b))
|
|
bulbCheck = bulbCheck + 1
|
|
if(bulbCount != bulbCheck):
|
|
for count in range(0,10):
|
|
bulbCount = 0
|
|
bulbCheck = 0
|
|
try:
|
|
bulbCount = bulbCount + 1
|
|
oldState = self.bulbs[device].get_properties()
|
|
except:
|
|
print(device + ": Konnte nicht angesteuert werden")
|
|
error = True
|
|
finally:
|
|
self.bulbs[device].set_rgb(int(r), int(g), int(b))
|
|
print(device + " color r:" + str(r) + " g:" + str(g) + " b:" + str(b))
|
|
bulbCheck = bulbCheck + 1
|
|
if(bulbCheck==bulbCount):
|
|
return 0
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def temperatureTransition(self, startTemp=1700, endTemp=6500, startBrightness=100,
|
|
endBrightness=100, seconds=0, count=None):
|
|
##-----------------------------------------------------------------------------------##
|
|
if(count==None):
|
|
count=10
|
|
|
|
duration = seconds*1000
|
|
transitions = [
|
|
TemperatureTransition(startTemp, duration, startBrightness),
|
|
SleepTransition(duration),
|
|
TemperatureTransition(endTemp, duration, endBrightness)
|
|
]
|
|
flow = Flow(
|
|
count=1,
|
|
action=Flow.actions.recover,
|
|
transitions=transitions
|
|
)
|
|
self.temperature(startBrightness)
|
|
self.brightness(startBrightness)
|
|
|
|
bulbCount = 0
|
|
bulbCheck = 0
|
|
for bulb in self.bulbs:
|
|
bulbCount = bulbCount + 1
|
|
try:
|
|
oldState = self.bulbs[bulb].get_properties()
|
|
except:
|
|
print(bulb + ": Konnte nicht angesteuert werden")
|
|
finally:
|
|
self.bulbs[bulb].start_flow(flow)
|
|
print(bulb + " Flow")
|
|
bulbCheck = bulbCheck + 1
|
|
|
|
if(bulbCount == bulbCheck):
|
|
return 0
|
|
else:
|
|
if(count!=0):
|
|
time.sleep(.250)
|
|
temperatureTransition(startTemp, endTemp, startBrightness, endBrightness,seconds,count-1)
|
|
else:
|
|
print("Zu viele Versuche. Fehlgeschlagen!")
|
|
return -1
|
|
return 0
|
|
|
|
##-----------------------------------------------------------------------------------##
|
|
def stopTransition(self, count=None):
|
|
##-----------------------------------------------------------------------------------##
|
|
if(count==None):
|
|
count=10
|
|
bulbCount = 0
|
|
bulbCheck = 0
|
|
for bulb in self.bulbs:
|
|
bulbCount = bulbCount + 1
|
|
try:
|
|
oldState = self.bulbs[bulb].get_properties()
|
|
except:
|
|
print(bulb + ": Konnte nicht angesteuert werden")
|
|
finally:
|
|
self.bulbs[bulb].stop_flow()
|
|
bulbCheck = bulbCheck + 1
|
|
|
|
if(bulbCount == bulbCheck):
|
|
return 0
|
|
else:
|
|
if(count!=0):
|
|
time.sleep(.250)
|
|
stopTransition(count-1)
|
|
else:
|
|
print("Zu viele Versuche. Fehlgeschlagen!")
|
|
return -1
|
|
return 0 |