Portrait Michael Malura

Zigbee Smart Heating: Telegraf crasht und TRVs lügen

Ich hab 6 Zigbee-Geräte für die Heizungssteuerung: 4 Sonoff Thermostate (TRVs) und 2 Temperatursensoren. In InfluxDB tauchten aber nur 3 davon auf. Telegraf lief, zigbee2mqtt auch, aber irgendwas dazwischen war kaputt. Also hab ich debuggt.

Das Zigbee Smart Heating Setup lief ein paar Tage, dann fiel mir auf dass nicht alle Geräte Daten liefern. Zeit zum Debuggen.

Telegraf crasht mit Bridge-Topics

Telegraf subscribte auf zigbee2mqtt/+, ein Wildcard der ALLE Topics matched. Das ging schief weil zigbee2mqtt auch zigbee2mqtt/bridge Messages mit Arrays und nested Objects sendet. Telegraf's JSON-Parser kam damit nicht klar und crashte.

Die Lösung war explizite Device-Topics statt Wildcard in der Telegraf-Config:

[[inputs.mqtt_consumer]]
  topics = [
    "zigbee2mqtt/Büro Temp",
    "zigbee2mqtt/Büro groß",
    "zigbee2mqtt/Büro klein",
    "zigbee2mqtt/Wohnzimmer Temp",
    "zigbee2mqtt/Wohnzimmer groß",
    "zigbee2mqtt/Wohnzimmer klein",
  ]

Danach kamen alle 6 Geräte in InfluxDB an.

TRV misst viel zu warm

Das Thermostat "Büro klein" zeigte 24°C obwohl der externe Sensor 21°C meldete. Das Ventil regelte entsprechend falsch. Stellte sich raus dass temperature_sensor_select auf internal stand. Der interne Fühler sitzt direkt am Heizkörper und misst die Heizkörper-Temperatur, nicht die Raumluft.

Also hab ich ihn via MQTT auf den externen Sensor umgeschaltet:

mosquitto_pub -t "zigbee2mqtt/Büro klein/set" \
  -m '{"temperature_sensor_select": "external_2"}'

Jetzt regelt das TRV nach dem echten Raumsensor.

valve_opening_degree Missverständnis

Ich dachte valve_opening_degree zeigt die aktuelle Ventilstellung in Prozent. Stand aber konstant bei 100%, egal ob das Ventil offen oder geschlossen war. Recherche in der zigbee2mqtt Dokumentation und GitHub Issues brachte die Erkenntnis dass das Feld ein Kalibrierungslimit ist, nicht die Position.

Die Sonoff TRVZB gibt die tatsächliche Ventilstellung nicht als Prozentwert aus. Nur running_state (idle/heat) zeigt ob aktiv geheizt wird.

Also hab ich das Panel entfernt und stattdessen eine State-Timeline für running_state gebaut. Dafür musste ich running_state in der Telegraf-Config als json_string_fields hinzufügen:

json_string_fields = ["running_state", "battery", "linkquality"]

Jetzt sehe ich für jedes TRV ob es gerade heizt oder idle ist. Das reicht.

Lessons Learned

  • Wildcards in MQTT-Subscriptions sind gefährlich wenn die Topics unterschiedliche Strukturen haben
  • TRVs mit internem Sensor sind unzuverlässig → immer externe Sensoren verwenden
  • Dokumentation lesen bevor man sich über "kaputte" Werte ärgert, manchmal bedeuten Felder nicht das was man denkt

Die Heizungssteuerung läuft jetzt sauber. Alle 6 Geräte loggen korrekt, die TRVs regeln nach echten Raumtemperaturen.

Zigbee Geräte Status

16.04.2026 aktualisiert 16.04.2026