This commit is contained in:
Micha Horlboge 2022-01-28 22:54:12 +01:00
parent 9bf21d04e3
commit 5a14d251b4
3 changed files with 5 additions and 42 deletions

View File

@ -7,14 +7,6 @@ from asyncio import Queue, Task, Event, Lock
from typing import Callable, Dict, Optional from typing import Callable, Dict, Optional
import websockets import websockets
"""
- sender fun, bekommt packete per queue
- receiver fun, schreibt packete in map id -> msg bzw events in queue(?)
- blockieren beim auf antwort warten per "pseudo-queue", in die sich alle wartenden eintragen und warten, dass sie leer ist, receiver leert queue wenn irgendeine nachricht rein kommt
- andere (auch außerhalb) können dann auf neue daten warten und ggf verarbeiten
"""
class HomeAssistantAPI: class HomeAssistantAPI:
def __init__(self, token: str, url: str) -> None: def __init__(self, token: str, url: str) -> None:
@ -143,4 +135,3 @@ class HomeAssistantAPI:
return device_state return device_state
return None return None

View File

@ -1,3 +1,3 @@
#!/usr/bin/env bashio #!/usr/bin/env bashio
python3 /srv/sync_ha_fb.py python3 /srv/sync_ha_fb.py /data/options.json

View File

@ -1,11 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""
hier die verbindungen zu HA aufbauen etc
außerdem das vergleichen der werte und dass anstoßen der updates
"""
import asyncio import asyncio
import os import os
from typing import Dict import sys
from fritzbox import FritzBox from fritzbox import FritzBox
from homeassistant import HomeAssistantAPI from homeassistant import HomeAssistantAPI
@ -15,6 +12,7 @@ import json
sensor_mappings = {} sensor_mappings = {}
thermostate_mappings = {} thermostate_mappings = {}
async def handle_event(idx: int): async def handle_event(idx: int):
logging.debug(f"Wait for events for {idx}") logging.debug(f"Wait for events for {idx}")
@ -85,42 +83,16 @@ async def init(ha: HomeAssistantAPI):
asyncio.get_running_loop().stop() asyncio.get_running_loop().stop()
async def migrate_config(config_path: str, ha: HomeAssistantAPI):
config = json.load(open(config_path))
therm_ids = {}
for state in await ha.get_states():
if state["entity_id"].startswith("climate.") and "friendly_name" in state["attributes"].keys():
therm_ids[state["attributes"]["friendly_name"]] = state["entity_id"]
mappings = []
for mapping in config["mappings"]:
if not mapping["thermostate"].startswith("climate."):
mapping["thermostate"] = therm_ids[mapping["thermostate"]]
mappings.append(mapping)
config["mappings"] = mappings
json.dump(open(config_path), config)
return config
logging.basicConfig(level=logging.INFO, format="[%(asctime)s] [%(levelname)s] %(message)s") logging.basicConfig(level=logging.INFO, format="[%(asctime)s] [%(levelname)s] %(message)s")
config_path = "/data/options.json" config_path = sys.argv[1]
config_path = "options.json"
config = json.load(open(config_path)) config = json.load(open(config_path))
logging.debug(config) logging.debug(config)
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
fb = FritzBox(config["fritzbox"]["url"], config["fritzbox"]["password"]) fb = FritzBox(config["fritzbox"]["url"], config["fritzbox"]["password"])
supervisor_url = "ws://supervisor/core/websocket" supervisor_url = "ws://supervisor/core/websocket"
supervisor_url = "ws://192.168.124.187:8123/api/websocket"
ha = HomeAssistantAPI(os.environ["SUPERVISOR_TOKEN"], supervisor_url) ha = HomeAssistantAPI(os.environ["SUPERVISOR_TOKEN"], supervisor_url)
if '"thermostate": "climate.' not in open(config_path).read():
config = loop.run_until_complete(migrate_config(config_path, ha))
logging.info(config)
exit()
for mapping in config["mappings"]: for mapping in config["mappings"]:
if mapping["sensor"] not in sensor_mappings.keys(): if mapping["sensor"] not in sensor_mappings.keys():
sensor_mappings[mapping["sensor"]] = [] sensor_mappings[mapping["sensor"]] = []