#!/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()