Skip to content
This repository has been archived by the owner on Jan 5, 2021. It is now read-only.

Commit

Permalink
Merge pull request #97 from sstangle73/develop
Browse files Browse the repository at this point in the history
Fixed fritz-fritz wemo LED group support
  • Loading branch information
iancmcc committed Aug 20, 2015
2 parents 28c48fa + 07db1c5 commit 1b45b0f
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 25 deletions.
35 changes: 32 additions & 3 deletions ouimeaux/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ def light(args):
Usage: wemo light NAME (on|off|toggle|status)"""
sys.exit(1)

device_name = args.device
device_name = args.name
alias = WemoConfiguration().aliases.get(device_name)
if alias:
matches = lambda x:x == alias
Expand All @@ -114,6 +114,7 @@ def on_motion(motion):

def on_bridge(bridge):
bridge.bridge_get_lights()
bridge.bridge_get_groups()
for light in bridge.Lights:
if matches(light):
if args.state == "toggle":
Expand All @@ -137,10 +138,33 @@ def on_bridge(bridge):
sys.exit(1)
bridge.light_set_state(bridge.Lights[light],state=state,dim=dim)
sys.exit(0)
for group in bridge.Groups:
if matches(group):
if args.state == "toggle":
found_state = bridge.group_get_state(bridge.Groups[group]).get('state')
bridge.group_set_state(bridge.Groups[group], state=not found_state)
elif args.state == "status":
print bridge.group_get_state(bridge.Groups[group])
else:
if args.dim == None and args.state == "on":
dim = bridge.group_get_state(bridge.Groups[group]).get('dim')
state = 1
elif args.state == "off":
dim = None
state = 0
elif args.dim <= 255 and args.dim >= 0:
dim = args.dim
state = 1
else:
print """Invalid dim specified.
Dim must be between 0 and 255"""
sys.exit(1)
bridge.group_set_state(bridge.Groups[group],state=state,dim=dim)
sys.exit(0)

scan(args, on_switch, on_motion, on_bridge)
# If we got here, we didn't find anything
print "No device found with that name."
print "No device or group found with that name."
sys.exit(1)

def maker(args):
Expand Down Expand Up @@ -220,6 +244,9 @@ def on_maker(maker):
def on_bridge(bridge):
print "Bridge:", bridge.name
bridge.bridge_get_lights()
bridge.bridge_get_groups()
for group in bridge.Groups:
print "Group:", group
for light in bridge.Lights:
print "Light:", light

Expand Down Expand Up @@ -256,6 +283,8 @@ def on_bridge(bridge):
bridge.bridge_get_lights()
for light in bridge.Lights:
print "Light:", light, '\t', bridge.light_get_state(bridge.Lights[light])
for group in bridge.Groups:
print "Group:", group, '\t', bridge.group_get_state(bridge.Groups[group])

scan(args, on_switch, on_motion, on_bridge, on_maker)

Expand Down Expand Up @@ -339,7 +368,7 @@ def wemo():

stateparser = subparsers.add_parser("light",
help="Turn a WeMo LED light on or off")
stateparser.add_argument("device", help="Name or alias of the device")
stateparser.add_argument("name", help="Name or alias of the device or group")
stateparser.add_argument("state", help="'on' or 'off'")
stateparser.add_argument("dim", nargs='?', type=int,
help="Dim value 0 to 255")
Expand Down
84 changes: 62 additions & 22 deletions ouimeaux/device/bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,50 +5,71 @@

class Bridge(Device):
Lights = {}

# def __init__(self, address):
# pass
#self.bridge_get_lights()
Groups = {}

def __repr__(self):
self.bridge_get_lights()
# for light in self.Lights:
# print 'Light: {name}, State: {state}'.format(name=self.light_name(light), state=self.light_get_state(light).get('state'))
return '<WeMo Bridge "{name}" Lights: {LightCount} >'.format(name=self.name, LightCount=len(self.Lights))
self.bridge_get_groups()
return '<WeMo Bridge "{name}", Lights: {LightCount}, Groups: {GroupCount}>'.format(name=self.name, LightCount=len(self.Lights), GroupCount=len(self.Groups))

def bridge_get_lights(self):
UDN = self.basicevent.GetMacAddr().get('PluginUDN')
endDevices = self.bridge.GetEndDevices(DevUDN=UDN,ReqListType='PAIRED_LIST').get('DeviceLists')
endDevicesList = et.fromstring(endDevices)
for light in endDevicesList[0][1]:
# if self.light_name(light) in [ self.light_name(x) for x in self.Lights ]:
endDevices = self.bridge.GetEndDevices(DevUDN=UDN,ReqListType='PAIRED_LIST')
endDeviceList = et.fromstring(endDevices.get('DeviceLists'))

for light in endDeviceList.iter('DeviceInfo'):
if self.light_name(light) in self.Lights:
pass
else:
#self.Lights.append(light)
self.Lights[self.light_name(light)] = light
return self.Lights

def bridge_get_groups(self):
UDN = self.basicevent.GetMacAddr().get('PluginUDN')
endDevices = self.bridge.GetEndDevices(DevUDN=UDN,ReqListType='PAIRED_LIST')
endDeviceList = et.fromstring(endDevices.get('DeviceLists'))

for group in endDeviceList.iter('GroupInfo'):
if self.group_name(group) in self.Groups:
pass
else:
self.Groups[self.group_name(group)] = group
return self.Groups

def light_attributes(self, light):
return {
'devIndex' : light[0].text,
'devID' : light[1].text,
'name' : light[2].text,
'iconvalue' : light[3].text,
'firmware' : light[4].text,
'capabilities' : light[5].text,
'state' : light[6].text,
'manufacturer' : light[7].text,
'model' : light[8].text,
'certified' : light[9].text
'devIndex' : light.find('DeviceIndex').text,
'devID' : light.find('DeviceID').text,
'name' : light.find('FriendlyName').text,
'iconvalue' : light.find('IconVersion').text,
'firmware' : light.find('FirmwareVersion').text,
'capabilities' : light.find('CapabilityIDs').text,
'state' : light.find('CurrentState').text,
'manufacturer' : light.find('Manufacturer').text,
'model' : light.find('ModelCode').text,
'certified' : light.find('WeMoCertified').text
}

def group_attributes(self, group):
return {
'GroupID' : group.find('GroupID').text,
'name' : group.find('GroupName').text,
'capabilities' : group.find('GroupCapabilityIDs').text,
'state': group.find('GroupCapabilityValues').text
}

def light_name(self, light):
return self.light_attributes(light).get('name')

def group_name(self, group):
return self.group_attributes(group).get('name')

def light_get_id(self, light):
return self.light_attributes(light).get('devID')

def group_get_id(self, group):
return self.group_attributes(group).get('GroupID')

def light_get_state(self, light):
(
state, # 0 (off) or 1 (on)
Expand All @@ -59,6 +80,16 @@ def light_get_state(self, light):
'dim' : dim
}

def group_get_state(self, group):
(
state, # 0 (off) or 1 (on)
dim # 0-255 dark to bright
) = self.group_attributes(group).get('state').split(':', 1)[0].split(',',1)
return {
'state' : state,
'dim' : dim
}

def light_set_state(self, light, state=None, dim=None):
if state == None:
state = self.light_get_state(light).get('state')
Expand All @@ -69,3 +100,12 @@ def light_set_state(self, light, state=None, dim=None):

return self.bridge.SetDeviceStatus(DeviceStatusList=sendState)

def group_set_state(self, group, state=None, dim=None):
if state == None:
state = self.group_get_state(group).get('state')
if dim == None:
state = self.group_get_state(group).get('dim')

sendState = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;DeviceStatus&gt;&lt;IsGroupAction&gt;YES&lt;/IsGroupAction&gt;&lt;DeviceID available=&quot;YES&quot;&gt;{groupID}&lt;/DeviceID&gt;&lt;CapabilityID&gt;10006,10008&lt;/CapabilityID&gt;&lt;CapabilityValue&gt;{state},{dim}&lt;/CapabilityValue&gt;&lt;/DeviceStatus&gt;'.format(groupID=self.group_get_id(group),state=state,dim=dim)

return self.bridge.SetDeviceStatus(DeviceStatusList=sendState)
2 changes: 2 additions & 0 deletions ouimeaux/environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ def _process_device(self, device, cache=None):
registry = self._bridges
for light in device.Lights:
log.info("Found light \"%s\" connected to \"%s\"" % (light, device.name))
for group in device.Groups:
log.info("Found group \"%s\" connected to \"%s\"" % (group, device.name))
elif isinstance(device, Maker):
callback = self._maker_callback
registry = self._makers
Expand Down

0 comments on commit 1b45b0f

Please sign in to comment.