This repository has been archived on 2023-06-10. You can view files and clone it, but cannot push or open issues or pull requests.
HomeControl/app/devices/yeelight.py
2018-02-03 23:06:42 +01:00

412 lines
17 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:
oldState = self.bulbs[device].get_properties()
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:
oldState = self.bulbs[device].get_properties()
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()
except:
print(device + " keine Veraenderung")
finally:
if(oldState['power'] == str(state)):
break
##-----------------------------------------------------------------------------------##
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:
oldState = self.bulbs[device].get_properties()
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:
oldState = self.bulbs[device].get_properties()
if(str(oldState['bright']) != str(state)):
self.bulbs[device].set_brightness(int(state))
print(device + " turned brightness to " + str(state))
try:
oldState = self.bulbs[device].get_properties()
except:
print(device + " keine Veraenderung")
finally:
if(oldState['bright'] == str(state)):
break
##-----------------------------------------------------------------------------------##
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:
oldState = self.bulbs[device].get_properties()
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:
oldState = self.bulbs[device].get_properties()
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()
except:
print(device + " keine Veraenderung")
finally:
if(oldState['ct'] == str(state)):
break
##-----------------------------------------------------------------------------------##
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