Skip to content

Commit

Permalink
working on #29 and #32
Browse files Browse the repository at this point in the history
  • Loading branch information
En3rGy committed Jan 14, 2024
1 parent 80fe003 commit b0aea91
Show file tree
Hide file tree
Showing 6 changed files with 162 additions and 128 deletions.
2 changes: 1 addition & 1 deletion config.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<config>
<modules>
<module category="Datenaustausch" context="14100_Hue" id="14100" name="Hue Group (14100)" version="3.9">
<module category="Datenaustausch" context="14100_Hue" id="14100" name="Hue Group (14100)" version="3.10">
<inputs>
<input type="number" const_name="trigger" init_value="0">Get Status</input>
<input type="string" const_name="hue_key" init_value="">Key</input>
Expand Down
106 changes: 54 additions & 52 deletions libs/hue_lib/hue_bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,27 +225,26 @@ def get_html_device_list(self):
return info_data

def __register_device_type(self, data):
with supp_fct.TraceLog(self.logger):
global devices
for item in data:
item_id = supp_fct.get_val(item, "id")
global devices
for item in data:
item_id = supp_fct.get_val(item, "id")

services = supp_fct.get_val(item, "services")
device = hue_item.HueDevice(self.logger)
device.device_id = item_id
metadata = supp_fct.get_val(item, "metadata")
device.name = supp_fct.get_val(metadata, "name")
services = supp_fct.get_val(item, "services")
device = hue_item.HueDevice(self.logger)
device.device_id = item_id
metadata = supp_fct.get_val(item, "metadata")
device.name = supp_fct.get_val(metadata, "name")

for service in services:
rid = supp_fct.get_val(service, "rid")
for service in services:
rid = supp_fct.get_val(service, "rid")

rtype = supp_fct.get_val(service, "rtype")
if rtype == "light":
device.light_id = rid
elif rtype == "zigbee_connectivity":
device.zigbee_connectivity_id = rid
rtype = supp_fct.get_val(service, "rtype")
if rtype == "light":
device.light_id = rid
elif rtype == "zigbee_connectivity":
device.zigbee_connectivity_id = rid

devices[device.device_id] = device
devices[device.device_id] = device

def __register_room_type(self, data):
with supp_fct.TraceLog(self.logger):
Expand Down Expand Up @@ -320,23 +319,22 @@ def __register_scene_type(self, data):
devices[device.device_id] = device

def __register_grouped_light_type(self, data):
with supp_fct.TraceLog(self.logger):
global devices
for item in data:
item_id = supp_fct.get_val(item, "id")
owner = supp_fct.get_val(item, "owner")
rid = supp_fct.get_val(owner, "rid")
rtype = supp_fct.get_val(owner, "rtype")
global devices
for item in data:
item_id = supp_fct.get_val(item, "id")
owner = supp_fct.get_val(item, "owner")
rid = supp_fct.get_val(owner, "rid")
rtype = supp_fct.get_val(owner, "rtype")

for device in devices.values():
if rtype == "room":
if device.room == rid:
device.grouped_lights.append(item_id)
devices[device.device_id] = device
elif rtype == "zone":
if device.zone == rid:
device.grouped_lights.append(item_id)
devices[device.device_id] = device
for device in devices.values():
if rtype == "room":
if device.room == rid:
device.grouped_lights.append(item_id)
devices[device.device_id] = device
elif rtype == "zone":
if device.zone == rid:
device.grouped_lights.append(item_id)
devices[device.device_id] = device

def register_devices(self, key, rid, host_ip):
"""
Expand Down Expand Up @@ -370,7 +368,8 @@ def register_devices(self, key, rid, host_ip):
try:
data = json.loads(data_raw["data"]) # type: dict
except Exception as e:
self.logger.error("In register_devices #377, " + str(e))
self.logger.error("hue_bridge.py | register_devices({key}, {rid}, {host}) | "
"Caught exception '{msg}'".format(key=key, rid=rid, host=host_ip, msg=e))
continue

data = supp_fct.get_val(data, "data")
Expand All @@ -397,29 +396,32 @@ def get_own_device(self, rid):
:rtype: hue_item.HueDevice
:return: Device
"""
with supp_fct.TraceLog(self.logger):
global devices
global devices

# check if identified before
if rid in self.device.get_device_ids(True):
if rid != self.device.id:
self.logger.debug("hue_bridge.py | get_own_device({}) | Restorig device".format(rid))
self.device.id = rid
self.device.get_type_of_device()
return self.device

# check if identified before
if rid in self.device.get_device_ids():
if rid != self.device.id:
# search and store own device if not identified before
else:
for device in devices.values():
if rid in device.get_device_ids(True):
self.logger.debug("hue_bridge.py | get_own_device({}) | Registering device".format(rid))
self.device = device
self.device.id = rid
self.device.get_type_of_device()
return self.device

# search and store own device if not identified before
else:
for device in devices.values():
if rid in device.get_device_ids():
self.device = device
self.device.id = rid
self.device.get_type_of_device()
break
break

if self.device is None:
self.logger.warning("Requested device not found")
if not self.device.id:
error_msg = ("hue_bridge.py | get_own_device('{rid}') | Requested device not found!".format(rid=rid))
self.logger.error(error_msg)
assert error_msg

return self.device
return self.device

def connect_to_eventstream(self, conn, host_ip, key):
with supp_fct.TraceLog(self.logger):
Expand Down
14 changes: 11 additions & 3 deletions libs/hue_lib/hue_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,18 @@ def __str__(self):

return res

def get_device_ids(self):
def get_device_ids(self, full_search=False):
with supp_fct.TraceLog(self.logger):
ret = [self.device_id, self.light_id, self.zigbee_connectivity_id, self.room, self.zone] # type: [str]
ret = [self.device_id, self.light_id, self.zigbee_connectivity_id] # type: [str]
for scene in self.scenes:
ret.append(scene["id"]) # tod: check if extend vs. append
# ret.extend(self.grouped_lights) # Fix for https://github.com/En3rGy/14100_Hue/issues/29

if self.rtype == "room" or full_search: # Fix for https://github.com/En3rGy/14100_Hue/issues/29
ret.extend(self.room)
if self.rtype == "zone" or full_search:
ret.extend(self.zone)
if self.rtype == "grouped_light" or full_search:
ret.extend(self.grouped_lights)
ret = filter(lambda x: x != '', ret) # remove empty elements

return ret
Expand Down Expand Up @@ -296,4 +302,6 @@ def get_type_of_device(self):
elif self.id in self.light_id:
self.rtype = "light"

self.logger.debug("hue_item.py | get_type_of_device | Deviye type is {}".format(self.rtype))

return self.rtype
58 changes: 29 additions & 29 deletions libs/hue_lib/supp_fct.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,35 +136,35 @@ def get_data(ip, key, api_cmd, logger):
:return: {'data': Data received, 'status': html return code}
:rtype: {str, str}
"""
with TraceLog(logger):
logger.debug("#### {} // {}".format(ip,key))
api_path = 'https://' + ip + '/clip/v2/resource/' + api_cmd
url_parsed = urlparse.urlparse(api_path)
headers = {'Host': url_parsed.hostname, "hue-application-key": key}

# Build a SSL Context to disable certificate verification.
ctx = ssl._create_unverified_context()

try:
# Build a http request and overwrite host header with the original hostname.
request = urllib2.Request(api_path, headers=headers)
# Open the URL and read the response.
response = urllib2.urlopen(request, data=None, timeout=5, context=ctx)
data = {'data': response.read(), 'status': str(response.getcode())}
logger.debug("Received {} byte with return code {}".format(len(data.get("data")), data.get("status")))

if int(data["status"]) != 200:
logger.warning(
"In supp_dct.get_data #99, Hue bridge response code for '{cmd}' is {status}".format(cmd=api_cmd,
status=data[
"status"]))

except Exception as e:
data = {'data': str(e), 'status': str(0)}
logger.error("In get_data #291, for request '{cmd}' received '{error}', data: {data}".format(cmd=api_cmd,
error=e,
data=data))
return data
logger.debug("supp_fct.py | get_data | ip= '{}', key= '{}', api_cmd= '{}'".format(ip, key, api_cmd))
api_path = 'https://{}/clip/v2/resource/{}'.format(ip, api_cmd)
url_parsed = urlparse.urlparse(api_path)
headers = {'Host': url_parsed.hostname, "hue-application-key": key}

# Build a SSL Context to disable certificate verification.
ctx = ssl._create_unverified_context()

try:
# Build a http request and overwrite host header with the original hostname.
request = urllib2.Request(api_path, headers=headers)
# Open the URL and read the response.
response = urllib2.urlopen(request, data=None, timeout=5, context=ctx)
data = {'data': response.read(), 'status': str(response.getcode())}
logger.debug("supp_dct.py | get_data | Received {} byte with return code {}".format(len(data.get("data")),
data.get("status")))

if int(data["status"]) != 200:
logger.warning(
"supp_dct.py | get_data | Hue bridge response code for '{cmd}' is {status}".format(cmd=api_cmd,
status=data[
"status"]))

except Exception as e:
data = {'data': str(e), 'status': str(0)}
logger.error("supp_dct.py | get_data | For request '{cmd}' received '{error}', data: {data}".format(cmd=api_cmd,
error=e,
data=data))
return data


def http_put(ip, key, device_rid, api_path, payload, logger):
Expand Down
46 changes: 27 additions & 19 deletions src/14100_Hue Group (14100).py
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,7 @@ def process_json(self, msg):
device_id = supp_fct.get_val(data, "id")

corresponding_device_ids = hue_device.get_device_ids()
print("###########{} in {}? {}".format(device_id,
corresponding_device_ids,
device_id in corresponding_device_ids))

if device_id not in corresponding_device_ids:
pass

Expand Down Expand Up @@ -265,14 +263,16 @@ def process_eventstream_msgs(self, msgs):
try:
module_instance.process_json(msg)
except Exception as e:
self.logger.warning("In eventstream #336, calling remote modules, '" + str(e) + "'.")
self.logger.warning("14100_Hue Group (14100).py | process_eventstream_msgs(...) | "
"Calling remote modules, '{}'".format(e))

self.process_json(msg)

except Exception as e:
self.logger.error("Eventstream #342, error with '" + e.message[:len(e.message)] + "'.")
self.log_data("Eventstream #342 error msg", str(e))
self.log_data("Eventstream #342 erroneous str", msg)
self.logger.error("14100_Hue Group (14100).py | "
"process_eventstream_msgs(...) | {}".format(e.message))
self.log_data("14100_Hue Group (14100).py | process_eventstream_msgs(...) | Exception",
"{}:\n---Start---\n{}\n---End---".format(e, msg))

def eventstream(self, running, key):
"""
Expand Down Expand Up @@ -367,18 +367,25 @@ def do_init(self):

# get own lamp data if already registered
device = self.bridge.get_own_device(device_id)
data = supp_fct.get_data(ip, key, "light/" + device.light_id, self.logger)
self.logger.debug("14100_Hue Group (14100).py | do_init | Printing Device:"
"---Start of device---\n{}\n---End of device---".format(device))

# if e.g. grouped_light, there is no light_id available
if device.light_id:
data = supp_fct.get_data(ip, key, "light/{}".format(device.light_id), self.logger)

if int(data["status"]) is 200:
self.process_json(data)
else:
self.logger.warning("Could not retrieve data for master light id in on_init")
if int(data["status"]) is 200:
self.process_json(data)
else:
self.logger.warning("Could not retrieve data for master light id in on_init")

data = supp_fct.get_data(ip, key, "zigbee_connectivity/" + device.zigbee_connectivity_id, self.logger)
if int(data["status"]) is 200:
self.process_json(data)
else:
self.logger.warning("Could not retrieve zigbee connectivity data for master light")
# if e.g. grouped_light, there is no light_id available
if device.zigbee_connectivity_id:
data = supp_fct.get_data(ip, key, "zigbee_connectivity/" + device.zigbee_connectivity_id, self.logger)
if int(data["status"]) is 200:
self.process_json(data)
else:
self.logger.warning("Could not retrieve zigbee connectivity data for master light")

if self.singleton.is_master():
# eventstream init & start
Expand Down Expand Up @@ -471,14 +478,15 @@ def on_input_value(self, index, value):
self.logger.debug("Received Item Index input.")
self.bridge.register_devices(key, value, self.FRAMEWORK.get_homeserver_private_ip())
device = self.bridge.get_own_device(value)
device.get_type_of_device()

# get own lamp data if registered
data = supp_fct.get_data(ip, key, "light/" + device.light_id, self.logger)
data = supp_fct.get_data(ip, key, "light/{}".format(device.light_id), self.logger)

if data["status"] == 200:
self.process_json(data)
else:
self.logger.warning("Could not retrieve data for master light id in on_init")
self.logger.warning("X | on_input_value | Could not retrieve data for master light id")

elif ((self.PIN_I_R == index) or
(self.PIN_I_G == index) or
Expand Down
Loading

0 comments on commit b0aea91

Please sign in to comment.