Skip to content

Commit 547e2ae

Browse files
authored
Merge pull request diyhue#50 from mariusmotea/develop
Improve Deconz integration
2 parents a97f32f + 460fd92 commit 547e2ae

File tree

2 files changed

+28
-17
lines changed

2 files changed

+28
-17
lines changed

BridgeEmulator/HueEmulator.py

+26-17
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ def syncWithLights(): #update Hue Bridge lights states
489489
else:
490490
bridge_config["lights"][light]["state"]["reachable"] = True
491491
bridge_config["lights"][light]["state"].update(light_data)
492-
elif bridge_config["lights_address"][light]["protocol"] in ["hue","deconz"]:
492+
elif bridge_config["lights_address"][light]["protocol"] == "hue":
493493
light_data = json.loads(sendRequest("http://" + bridge_config["lights_address"][light]["ip"] + "/api/" + bridge_config["lights_address"][light]["username"] + "/lights/" + bridge_config["lights_address"][light]["light_id"], "GET", "{}", 1))
494494
bridge_config["lights"][light]["state"].update(light_data["state"])
495495
elif bridge_config["lights_address"][light]["protocol"] == "ikea_tradfri":
@@ -525,6 +525,7 @@ def opened(self):
525525

526526
def closed(self, code, reason=None):
527527
print(("deconz websocket disconnected", code, reason))
528+
del bridge_config["deconz"]["websocketport"]
528529

529530
def received_message(self, m):
530531
print(m)
@@ -540,8 +541,17 @@ def received_message(self, m):
540541
if "buttonevent" in message["state"]:
541542
if message["state"]["buttonevent"] in [2001, 3001, 4001, 5001]:
542543
Thread(target=longPressButton, args=[bridge_sensor_id, message["state"]["buttonevent"]]).start()
544+
if "presence" in message["state"] and message["state"]["presence"] and "virtual_light" in bridge_config["alarm_config"] and bridge_config["lights"][bridge_config["alarm_config"]["virtual_light"]]["state"]["on"]:
545+
sendEmail(bridge_config["sensors"][bridge_sensor_id]["name"])
546+
bridge_config["alarm_config"]["virtual_light"]
543547
elif "config" in message:
544548
bridge_config["sensors"][bridge_sensor_id]["config"].update(message["config"])
549+
elif message["r"] == "lights":
550+
bridge_light_id = bridge_config["deconz"]["lights"][message["id"]]["bridgeid"]
551+
if "state" in message:
552+
bridge_config["lights"][bridge_light_id]["state"].update(message["state"])
553+
updateGroupStats(bridge_light_id)
554+
545555

546556
except Exception as e:
547557
print("unable to process the request" + str(e))
@@ -554,34 +564,32 @@ def received_message(self, m):
554564
ws.close()
555565

556566
def scanDeconz():
557-
if bridge_config["deconz"]["enabled"]:
558-
if "port" in bridge_config["deconz"]:
559-
port = bridge_config["deconz"]["port"]
560-
else:
561-
port = 8080
562-
567+
if not bridge_config["deconz"]["enabled"]:
563568
if "username" not in bridge_config["deconz"]:
564569
try:
565-
registration = json.loads(sendRequest("http://127.0.0.1:" + str(port) + "/api", "POST", "{\"username\": \"283145a4e198cc6535\", \"devicetype\":\"Hue Emulator\"}"))
570+
registration = json.loads(sendRequest("http://127.0.0.1:" + str(bridge_config["deconz"]["port"]) + "/api", "POST", "{\"username\": \"283145a4e198cc6535\", \"devicetype\":\"Hue Emulator\"}"))
566571
except:
567572
print("registration fail, is the link button pressed?")
568573
return
569574
if "success" in registration[0]:
570575
bridge_config["deconz"]["username"] = registration[0]["success"]["username"]
571-
deconz_config = json.loads(sendRequest("http://127.0.0.1:" + str(port) + "/api/" + bridge_config["deconz"]["username"] + "/config", "GET", "{}"))
576+
bridge_config["deconz"]["enabled"] = True
577+
if "username" in bridge_config["deconz"]:
578+
deconz_config = json.loads(sendRequest("http://127.0.0.1:" + str(bridge_config["deconz"]["port"]) + "/api/" + bridge_config["deconz"]["username"] + "/config", "GET", "{}"))
572579
bridge_config["deconz"]["websocketport"] = deconz_config["websocketport"]
573580
registered_deconz_lights = []
574581
for light in bridge_config["lights_address"]:
575582
if bridge_config["lights_address"][light]["protocol"] == "deconz":
576583
registered_deconz_lights.append( bridge_config["lights_address"][light]["light_id"] )
577-
deconz_lights = json.loads(sendRequest("http://127.0.0.1:" + str(port) + "/api/" + bridge_config["deconz"]["username"] + "/lights", "GET", "{}"))
584+
deconz_lights = json.loads(sendRequest("http://127.0.0.1:" + str(bridge_config["deconz"]["port"]) + "/api/" + bridge_config["deconz"]["username"] + "/lights", "GET", "{}"))
578585
for light in deconz_lights:
579586
if light not in registered_deconz_lights:
580587
new_light_id = nextFreeId("lights")
581588
print("register new light " + new_light_id)
582589
bridge_config["lights"][new_light_id] = deconz_lights[light]
583-
bridge_config["lights_address"][new_light_id] = {"username": bridge_config["deconz"]["username"], "light_id": light, "ip": "127.0.0.1:" + str(port), "protocol": "deconz"}
584-
deconz_sensors = json.loads(sendRequest("http://127.0.0.1:" + str(port) + "/api/" + bridge_config["deconz"]["username"] + "/sensors", "GET", "{}"))
590+
bridge_config["lights_address"][new_light_id] = {"username": bridge_config["deconz"]["username"], "light_id": light, "ip": "127.0.0.1:" + str(bridge_config["deconz"]["port"]), "protocol": "deconz"}
591+
bridge_config["deconz"]["lights"][light] = {"bridgeid": new_light_id}
592+
deconz_sensors = json.loads(sendRequest("http://127.0.0.1:" + str(bridge_config["deconz"]["port"]) + "/api/" + bridge_config["deconz"]["username"] + "/sensors", "GET", "{}"))
585593
for sensor in deconz_sensors:
586594
if sensor not in bridge_config["deconz"]["sensors"]:
587595
new_sensor_id = nextFreeId("sensors")
@@ -593,6 +601,9 @@ def scanDeconz():
593601
print("register TRADFRI remote control as Philips Motion Sensor")
594602
newMotionSensorId = addHueMotionSensor()
595603
bridge_config["deconz"]["sensors"][sensor] = {"bridgeid": newMotionSensorId}
604+
if "websocketport" in bridge_config["deconz"]:
605+
print("Starting deconz websocket")
606+
Thread(target=websocketClient).start()
596607

597608

598609

@@ -676,7 +687,7 @@ def webformIndex():
676687
content += "<label for=\"" + deconzSensor + "\">" + bridge_config["sensors"][bridge_config["deconz"]["sensors"][deconzSensor]["bridgeid"]]["name"] + "</label>\n"
677688
content += "<select id=\"" + deconzSensor + "\" name=\"" + bridge_config["deconz"]["sensors"][deconzSensor]["bridgeid"] + "\">\n"
678689
for group in bridge_config["groups"].iterkeys():
679-
if bridge_config["deconz"]["sensors"][deconzSensor]["room"] == group:
690+
if "room" in bridge_config["deconz"]["sensors"][deconzSensor] and bridge_config["deconz"]["sensors"][deconzSensor]["room"] == group:
680691
content += "<option value=\"" + group + "\" selected>" + bridge_config["groups"][group]["name"] + "</option>\n"
681692
else:
682693
content += "<option value=\"" + group + "\">" + bridge_config["groups"][group]["name"] + "</option>\n"
@@ -840,7 +851,6 @@ def do_GET(self):
840851
self.wfile.write(webform_hue())
841852
elif self.path.startswith("/deconz"): #setup imported deconz sensors
842853
get_parameters = parse_qs(urlparse(self.path).query)
843-
pprint(get_parameters)
844854
#clean all rules related to deconz Switches
845855
sensorsResourcelinks = []
846856
if get_parameters:
@@ -1148,15 +1158,14 @@ def run(server_class=HTTPServer, handler_class=S):
11481158
if __name__ == "__main__":
11491159
if bridge_config["deconz"]["enabled"]:
11501160
scanDeconz()
1151-
Thread(target=websocketClient).start()
11521161
try:
11531162
updateAllLights()
11541163
Thread(target=ssdpSearch).start()
11551164
Thread(target=ssdpBroadcast).start()
11561165
Thread(target=schedulerProcessor).start()
11571166
run()
1158-
except:
1159-
print("server stopped")
1167+
except Exception as e:
1168+
print("server stopped " + str(e))
11601169
finally:
11611170
run_service = False
11621171
saveConfig()

BridgeEmulator/config.json

+2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@
7777
},
7878
"deconz": {
7979
"enabled": false,
80+
"lights": {},
81+
"port": 8080,
8082
"sensors": {}
8183
},
8284
"groups": {},

0 commit comments

Comments
 (0)