#!/usr/bin/python import requests, sys, re, time import paho.mqtt.client as mqtt import xml.etree.ElementTree as ET NAMESPACE = "http://www.eta.co.at/rest/v1" # MQTT Broker mqttBroker = '192.168.0.11' mqttPort = 1883 mqttuser = 'eta' mqttpasswort = 'uiRCX0vWs6lIYbWL' # Aktuelle Werte auf Console ausgeben (True | False) printValues = True # ETA REST API BASEURL = "http://192.168.0.55:8080" endpoints = [ { 'key': 'Abgas_Geblase_RPM', 'endpoint': '/user/var/48/10391/0/11120/2111' }, { 'key': 'Abgas_Geblaese_BS', 'endpoint': '/user/var/48/10391/0/0/12299' }, { 'key': 'Abgas_Geblaese_O2', 'endpoint': '/user/var/48/10391/0/11108/0' }, { 'key': 'Abgas_Geblaese_Temp', 'endpoint': '/user/var/48/10391/0/11110/0' }, { 'key': 'Aussen_Temp', 'endpoint': '/user/var/120/10101/0/0/12197' }, { 'key': 'HK1_Mischer', 'endpoint': '/user/var/120/10101/0/11125/2127' }, { 'key': 'HK1_Modus', 'endpoint': '/user/var/120/10101/0/0/12092' }, { 'key': 'HK1_Pumpe', 'endpoint': '/user/var/120/10101/0/11124/0' }, { 'key': 'HK1_Temp', 'endpoint': '/user/var/120/10101/0/11060/0' }, { 'key': 'Isoliertuer', 'endpoint': '/user/var/48/10391/0/11193/0' }, { 'key': 'Kessel_Pumpe', 'endpoint': '/user/var/48/10391/0/11123/0' }, { 'key': 'Kessel_RL_mischer', 'endpoint': '/user/var/48/10391/0/11163/2127' }, { 'key': 'Kessel_RL_temp', 'endpoint': '/user/var/48/10391/0/11160/0' }, { 'key': 'Kessel_Stellmotor_oben', 'endpoint': '/user/var/48/10391/0/11094/2071' }, { 'key': 'Kessel_Stellmotor_unten', 'endpoint': '/user/var/48/10391/0/11095/2071' }, { 'key': 'Kessel_Temp', 'endpoint': '/user/var/48/10391/0/11109/0' }, { 'key': 'Kessel_BS', 'endpoint': '/user/var/48/10391/0/0/12153' }, { 'key': 'Kessel_BS_seit_Wartung', 'endpoint': '/user/var/48/10391/0/0/12404' }, { 'key': 'Kessel_Heizbetriebe', 'endpoint': '/user/var/48/10391/0/0/12017' }, { 'key': 'Kessel_RL_Temp_niedrig', 'endpoint': '/user/var/48/10391/0/0/12222' }, { 'key': 'Kessel_Zaehler_Uebertemp', 'endpoint': '/user/var/48/10391/0/0/12540' }, { 'key': 'Puffer_Anfahrentlastung', 'endpoint': '/user/var/120/10601/0/11159/0' }, { 'key': 'Puffer_Ladung', 'endpoint': '/user/var/120/10601/0/0/12528' }, { 'key': 'Puffer_Temp1', 'endpoint': '/user/var/120/10601/0/11327/0' }, { 'key': 'Puffer_Temp2', 'endpoint': '/user/var/120/10601/0/11328/0' }, { 'key': 'Puffer_Temp3', 'endpoint': '/user/var/120/10601/0/11329/0' }, { 'key': 'Puffer_Temp4', 'endpoint': '/user/var/120/10601/0/11330/0' }, { 'key': 'Puffer_Temp5', 'endpoint': '/user/var/120/10601/0/11331/0' }, { 'key': 'Innen_Temp', 'endpoint': '/user/var/120/10101/0/11237/2293' }, { 'key': 'Innen_Temp_Soll', 'endpoint': '/user/var/120/10101/0/11237/2291' } ] # MQTT init def on_connect(client, userdata, flags, rc, properties=None): if rc != 0: print("Connection to MQTT broker failed with rc = ", rc) try: client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="eta", protocol=mqtt.MQTTv5) client.username_pw_set(mqttuser, mqttpasswort) client.on_connect = on_connect client.connect(mqttBroker, mqttPort) client.loop_start() except: print("MQTT connection error:", e) sys.exit(1) while True: for item in endpoints: api_url = BASEURL + item['endpoint'] try: response = requests.get(api_url, timeout=5) response.raise_for_status() except Exception as e: print(f"HTTP error for {item['key']}: {e}") continue content = response.text try: root = ET.fromstring(content) except ET.ParseError as e: print(f"XML parse error for {item['key']}: {e}") continue value = None # Each element is in the ETA namespace for elem in root.iter(f"{{{NAMESPACE}}}value"): if elem.attrib.get("uri") == item["endpoint"]: value = elem.attrib.get("strValue") break if value is None: print(f"No matching value found for {item['key']}") continue if printValues: print(f"{item['key']}: {value}") client.publish(f"neues-haus/keller/zentralheizung/{item['key']}", value) time.sleep(60)