Ausgangslage:
Zuhause werden einige Lichter mit deCONZ (Zigbee Netzwerk) gesteuert. Nun ist in mir den Wunsch aufgekommen, die Zustände der gesteuerten Lichter in Echtzeit zu erfahren.
Unterlagen:
Dresden-elektronik (der Hersteller von deCONZ) hat auf github eine Beschreibung Ihrer REST-API bereit gestellt.
Im Abschnitt Websocket wird erklärt wie man auf "den" Websocket Server zugreifen kann.
Erledigte Schritte:
Die Unterlagen habe ich gelesen und soweit ich diese verstanden habe, habe ich es im folgendes Script umgesetzt:
Code: Alles auswählen
# reason for this script => I want the real-time state of my lights from Deconz.
# description deconz-api section webserver: https://dresden-elektronik.github.io/deconz-rest-doc/endpoints/websocket/
import websocket
# websocket is use from library install with "pip3 install websocket-client"
import json
i = 0
j = 0
def on_message(wsapp, message):
# how can i use / print number of runs without global....
global i
global j
# print(message) # Python thinks "message" is a string
data = json.loads(message) # convert str to Python Dict
# print(data)
if (list(data.keys())[0] == "e"
and data.get("e") == "changed"
and data.get("r") == "lights"
and data.get("state", None) is not None):
print("++++++++++++++++++++++")
state_value = data.get("state").get("on")
light_id = data.get("id")
print("ID: {}, Status: {}".format(light_id, state_value))
i += 1
j += 1
print("Number of runs: {} // number of runs where the conditions are met: {}".format(j, i))
def main():
server = "127.0.0.1"
port = "8088"
wsapp = websocket.WebSocketApp("ws://{}:{}".format(server, port),
on_message=on_message)
wsapp.run_forever()
if __name__ == "__main__":
main()
Code: Alles auswählen
Number of runs: 1 // number of runs where the conditions are met: 0
++++++++++++++++++++++
ID: 27, Status: True
Number of runs: 2 // number of runs where the conditions are met: 1
Number of runs: 3 // number of runs where the conditions are met: 1
++++++++++++++++++++++
ID: 26, Status: True
Number of runs: 4 // number of runs where the conditions are met: 2
Number of runs: 5 // number of runs where the conditions are met: 2
Number of runs: 6 // number of runs where the conditions are met: 2
Beim Script habe ich folgende Fragen / "Probleme" (teilweise schon im script (in englisch) notiert.
- Wie erhalte ich die gleiche Funktionalität vom Script ohne die globalen Variablen?
- Erklärt mir bitte jemand noch folgende Verständnisprobleme:
- Wieso muss in der Zeile: "def on_message(wsapp, message):" wsapp vorkommen? (ohne funktioniert das Script nicht - dies habe ich bereits probiert)
- Warum klappt der Aufruf der Funktion: on_message?
Für die Beantwortung einer oder aller Fragen / "Probleme" bedanke ich mich bereits im voraus herzlich.
Freundliche Grüsse
Daniel