#!/usr/bin/env python3 # Contact Bosh-Siemens Home Connect devices # and connect their messages to the mqtt server import sys import json import re import time import io from threading import Thread from HCSocket import HCSocket, now from HCDevice import HCDevice import paho.mqtt.client as mqtt mqtt_prefix = "homeconnect/" client = mqtt.Client() client.connect("dashboard", 1883, 70) devices = { 'clothes': { "host": '10.1.0.145', "psk64": 'KlRQQyG8AkEfRFPr0v7vultz96zcal5lxj2fAc2ohaY', "iv64": 'tTUvqcsBldtkhHvDwE2DpQ', }, 'dishwasher': { "host": "10.1.0.133", "psk64": "Dsgf2MZJ-ti85_00M1QT1HP5LgH82CaASYlMGdcuzcs=", "iv64": None, # no iv == https }, } # 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", } def client_connect(device_name, device): mqtt_topic = mqtt_prefix + device_name host = device["host"] state = {} for topic in topics: state[topics[topic]] = None while True: try: ws = HCSocket(host, device["psk64"], device["iv64"]) dev = HCDevice(ws) #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) except Exception as e: print("ERROR", host, e, file=sys.stderr) time.sleep(5) for device in devices: thread = Thread(target=client_connect, args=(device, devices[device])) thread.start()