115 lines
3.4 KiB
Python
115 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Gem nuværende vandingsindstillinger som nye 'initial' standardværdier i YAML-filerne.
|
|
Efter dette script køres vil næste HA-genstart bruge de gemte værdier.
|
|
|
|
Køres inde i homeassistant Docker-containeren via shell_command.
|
|
"""
|
|
import re
|
|
import json
|
|
import urllib.request
|
|
|
|
DATETIME_FILE = "/config/include/input/datetime/vanding.yaml"
|
|
NUMBER_FILE = "/config/include/input/number/vanding.yaml"
|
|
SECRETS_FILE = "/config/secrets.yaml"
|
|
HA_URL = "http://localhost:8123"
|
|
|
|
DATETIME_ENTITIES = [
|
|
"vanding_morgen_tid",
|
|
"vanding_aften_tid",
|
|
"vanding_sikkerhedsstop_morgen",
|
|
"vanding_sikkerhedsstop_nat",
|
|
]
|
|
|
|
NUMBER_ENTITIES = [
|
|
"vanding_varighed_smart",
|
|
"vanding_varighed_hojbed_1",
|
|
"vanding_varighed_hojbed_2",
|
|
"vanding_varighed_hojbed_3",
|
|
]
|
|
|
|
|
|
def get_token():
|
|
with open(SECRETS_FILE) as f:
|
|
for line in f:
|
|
if line.startswith("ha_token:"):
|
|
return line.split(":", 1)[1].strip()
|
|
raise ValueError("ha_token ikke fundet i secrets.yaml")
|
|
|
|
|
|
def get_states(token):
|
|
req = urllib.request.Request(
|
|
f"{HA_URL}/api/states",
|
|
headers={"Authorization": f"Bearer {token}"},
|
|
)
|
|
with urllib.request.urlopen(req, timeout=10) as resp:
|
|
return {d["entity_id"]: d["state"] for d in json.loads(resp.read())}
|
|
|
|
|
|
def update_initial(content, entity_name, new_value):
|
|
"""Erstat initial-værdien for en given entity i YAML-indholdet."""
|
|
pattern = rf"(^{re.escape(entity_name)}:\n(?: [^\n]*\n)*? initial: )\S+"
|
|
new_content, count = re.subn(
|
|
pattern, rf'\g<1>"{new_value}"', content, flags=re.MULTILINE, count=1
|
|
)
|
|
if count == 0:
|
|
print(f" ADVARSEL: {entity_name} ikke fundet i YAML")
|
|
return new_content
|
|
|
|
|
|
def main():
|
|
token = get_token()
|
|
states = get_states(token)
|
|
saved = []
|
|
|
|
# Gem input_datetime tider
|
|
with open(DATETIME_FILE) as f:
|
|
dt_content = f.read()
|
|
|
|
for name in DATETIME_ENTITIES:
|
|
entity_id = f"input_datetime.{name}"
|
|
state = states.get(entity_id)
|
|
if state in (None, "unavailable", "unknown"):
|
|
print(f" SPRING OVER {entity_id}: {state}")
|
|
continue
|
|
# HA returnerer HH:MM:SS for input_datetime (time only)
|
|
dt_content = update_initial(dt_content, name, state)
|
|
saved.append(f"{entity_id} = {state}")
|
|
|
|
with open(DATETIME_FILE, "w") as f:
|
|
f.write(dt_content)
|
|
|
|
# Gem input_number værdier
|
|
with open(NUMBER_FILE) as f:
|
|
num_content = f.read()
|
|
|
|
for name in NUMBER_ENTITIES:
|
|
entity_id = f"input_number.{name}"
|
|
state = states.get(entity_id)
|
|
if state in (None, "unavailable", "unknown"):
|
|
print(f" SPRING OVER {entity_id}: {state}")
|
|
continue
|
|
val = float(state)
|
|
val_str = str(int(val)) if val == int(val) else str(val)
|
|
# input_number initial er uden anførselstegn
|
|
pattern = rf"(^{re.escape(name)}:\n(?: [^\n]*\n)*? initial: )\S+"
|
|
num_content, count = re.subn(
|
|
pattern, rf"\g<1>{val_str}", num_content, flags=re.MULTILINE, count=1
|
|
)
|
|
if count == 0:
|
|
print(f" ADVARSEL: {name} ikke fundet i YAML")
|
|
else:
|
|
saved.append(f"{entity_id} = {val_str}")
|
|
|
|
with open(NUMBER_FILE, "w") as f:
|
|
f.write(num_content)
|
|
|
|
print(f"Gemt {len(saved)} standardværdier")
|
|
for line in saved:
|
|
print(f" {line}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|