79 lines
3.1 KiB
Python
Executable File
79 lines
3.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
hier die verbindungen zu HA aufbauen etc
|
|
außerdem das vergleichen der werte und dass anstoßen der updates
|
|
"""
|
|
import os
|
|
from fritzbox import FritzBox
|
|
from homeassistant import HomeAssistantAPI
|
|
import logging
|
|
import websocket
|
|
import json
|
|
|
|
mappings = {}
|
|
|
|
def handle_event(event):
|
|
entity_id = event["data"]["entity_id"]
|
|
if entity_id in mappings.keys():
|
|
new_state = event["data"]["new_state"]
|
|
logging.debug(entity_id)
|
|
logging.debug(new_state["attributes"]["temperature"])
|
|
rounded = round(float(new_state["attributes"]["temperature"])*2)/2
|
|
logging.debug(rounded)
|
|
if new_state["attributes"]["device_class"] == "temperature":
|
|
if entity_id in mappings.keys():
|
|
fb.login()
|
|
logged = False
|
|
for thermostate in mappings[entity_id]:
|
|
current_temp, current_offset, id, name = fb.get_device_data(name=thermostate)
|
|
if not logged:
|
|
logging.info(f"Current measurement from {entity_id}: {new_state['attributes']['temperature']} ({rounded})")
|
|
logged = True
|
|
logging.info(f"Current measurement from {thermostate}: {current_temp}")
|
|
new_offset = current_offset + rounded - current_temp
|
|
if new_offset != current_offset:
|
|
old_offset = current_offset
|
|
logging.debug(f"Set offset for {thermostate} from {current_offset} to {new_offset}")
|
|
fb.set_offset(current_temp, new_offset, id, name)
|
|
current_temp, current_offset, id, name = fb.get_device_data(name=thermostate)
|
|
logging.debug(f"Target: {new_offset} ; Set: {current_offset}")
|
|
if new_offset == current_offset:
|
|
logging.info(f"Adjustet offset from {old_offset} to {new_offset}")
|
|
else:
|
|
logging.warning(f"Failed to adjust offset from {old_offset} to {new_offset}")
|
|
fb.logout()
|
|
|
|
def on_error(ws, error):
|
|
print(error)
|
|
|
|
def on_close(ws, close_status_code, close_msg):
|
|
pass
|
|
|
|
def on_open(ws):
|
|
pass
|
|
|
|
def init(ha: HomeAssistantAPI):
|
|
logging.debug("Subscribe")
|
|
ha.subscribe_event("state_changed", handle_event)
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO, format="[%(asctime)s] [%(levelname)s] %(message)s")
|
|
config = json.load(open("/data/options.json"))
|
|
logging.debug(config)
|
|
for mapping in config["mappings"]:
|
|
if mapping["sensor"] not in mappings.keys():
|
|
mappings[mapping["sensor"]] = []
|
|
mappings[mapping["sensor"]].append(mapping["thermostate"])
|
|
|
|
fb = FritzBox(config["fritzbox"]["url"], config["fritzbox"]["password"])
|
|
ha = HomeAssistantAPI(os.environ["SUPERVISOR_TOKEN"], init)
|
|
|
|
websocket.enableTrace(False)
|
|
ws = websocket.WebSocketApp("ws://supervisor/core/websocket",
|
|
on_open=on_open,
|
|
on_message=ha.handle_message,
|
|
on_error=on_error,
|
|
on_close=on_close)
|
|
|
|
ws.run_forever()
|