updating configuration
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
#!/usr/bin/env python3
|
||||
# Contact Bosh-Siemens Home Connect devices
|
||||
# and connect their messages to the mqtt server
|
||||
import json
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
import datetime
|
||||
from threading import Thread
|
||||
|
||||
import click
|
||||
import paho.mqtt.client as mqtt
|
||||
|
||||
from HCDevice import HCDevice
|
||||
from HCSocket import HCSocket, now
|
||||
|
||||
def restart_script():
|
||||
"""Перезапускает скрипт"""
|
||||
print(f"{now()} Перезапуск скрипта...")
|
||||
python = sys.executable
|
||||
os.execl(python, python, *sys.argv)
|
||||
|
||||
@click.command()
|
||||
@click.argument("config_file")
|
||||
@click.option("-h", "--mqtt_host", default="localhost")
|
||||
@click.option("-p", "--mqtt_prefix", default="homeconnect/")
|
||||
@click.option("-u", "--mqtt_user", default="")
|
||||
@click.option("-pw", "--mqtt_password", default="")
|
||||
def hc2mqtt(config_file: str, mqtt_host: str, mqtt_prefix: str, mqtt_user: str, mqtt_password: str):
|
||||
click.echo(f"Hello {config_file=} {mqtt_host=} {mqtt_prefix=} {mqtt_user=}")
|
||||
|
||||
with open(config_file, "r") as f:
|
||||
devices = json.load(f)
|
||||
|
||||
client = mqtt.Client()
|
||||
if mqtt_user != "" and mqtt_password != "":
|
||||
client.username_pw_set(mqtt_user, mqtt_password)
|
||||
client.connect(host=mqtt_host, port=1883, keepalive=70)
|
||||
|
||||
for device in devices:
|
||||
mqtt_topic = mqtt_prefix + device["name"]
|
||||
thread = Thread(target=client_connect, args=(client, device, mqtt_topic))
|
||||
thread.start()
|
||||
|
||||
last_restart = datetime.datetime.now()
|
||||
|
||||
while True:
|
||||
current_time = datetime.datetime.now()
|
||||
# Проверяем, прошло ли 24 часа с последнего перезапуска
|
||||
if (current_time - last_restart).total_seconds() >= 86400: # 86400 секунд = 24 часа
|
||||
restart_script()
|
||||
time.sleep(60) # Проверяем каждую минуту
|
||||
client.loop(timeout=1.0)
|
||||
|
||||
|
||||
# Map their value names to easier state names
|
||||
topics = {
|
||||
"OperationState": "state",
|
||||
"DoorState": "door",
|
||||
"RemainingProgramTime": "remaining",
|
||||
"PowerState": "power",
|
||||
"LowWaterPressure": "lowwaterpressure",
|
||||
"AquaStopOccured": "aquastop",
|
||||
"InternalError": "error",
|
||||
"FatalErrorOccured": "error",
|
||||
"MachineCareReminder": "machinecarereminder",
|
||||
"ActiveProgram": "activeprogram" #8215 - machine care
|
||||
}
|
||||
|
||||
|
||||
|
||||
def client_connect(client, device, mqtt_topic):
|
||||
host = device["host"]
|
||||
|
||||
state = {}
|
||||
for topic in topics:
|
||||
state[topics[topic]] = None
|
||||
|
||||
while True:
|
||||
try:
|
||||
ws = HCSocket(host, device["key"], device.get("iv",None))
|
||||
dev = HCDevice(ws, device.get("features", None))
|
||||
|
||||
ws.debug = True
|
||||
ws.reconnect()
|
||||
|
||||
while True:
|
||||
msg = dev.recv()
|
||||
if msg is None:
|
||||
break
|
||||
if len(msg) > 0:
|
||||
print(now(), msg)
|
||||
|
||||
update = False
|
||||
for topic in topics:
|
||||
value = msg.get(topic, None)
|
||||
if value is None:
|
||||
continue
|
||||
|
||||
# Convert "On" to True, "Off" to False
|
||||
if value == "On":
|
||||
value = True
|
||||
elif value == "Off":
|
||||
value = False
|
||||
|
||||
new_topic = topics[topic]
|
||||
if new_topic == "remaining":
|
||||
state["remainingseconds"] = value
|
||||
value = "%d:%02d" % (value / 60 / 60, (value / 60) % 60)
|
||||
|
||||
state[new_topic] = value
|
||||
update = True
|
||||
|
||||
if not update:
|
||||
continue
|
||||
|
||||
msg = json.dumps(state)
|
||||
print("publish", mqtt_topic, msg)
|
||||
client.publish(mqtt_topic + "/state", msg, retain=True)
|
||||
|
||||
except Exception as e:
|
||||
print("ERROR", host, e, file=sys.stderr)
|
||||
|
||||
time.sleep(5)
|
||||
|
||||
if __name__ == "__main__":
|
||||
hc2mqtt(auto_envvar_prefix='HC')
|
||||
Reference in New Issue
Block a user