eta2mqtt/get_data.py
2026-03-15 10:03:08 +01:00

106 lines
4.2 KiB
Python
Executable file

#!/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 <value> 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)