Home Assistant zeigt bei Zendure keine aktuellen Werte mehr – MQTT Availability automatisch reparieren
Kennst du das: Zendure läuft eigentlich, MQTT läuft auch – aber in Home Assistant sind plötzlich einzelne Sensoren „nicht verfügbar“ oder es werden keine aktuellen Werte mehr angezeigt?
Genau das hatte ich bei meiner Zendure-Integration.
Das Interessante dabei: Das eigentliche Problem waren nicht unbedingt die Messwerte. Home Assistant hat die Zendure-Geräte teilweise schlicht als offline betrachtet.
Die Ursache liegt im MQTT-Availability-Topic.
Und genau das können wir mit einer kleinen Home-Assistant-Automation automatisch reparieren.
Das eigentliche Problem
Viele Geräte, die sich über MQTT automatisch in Home Assistant anlegen, nutzen die sogenannte MQTT Discovery.
Dabei wird beispielsweise ein Sensor über ein Topic wie dieses angelegt:
homeassistant/sensor/xyz/config
In dieser Config stehen verschiedene Informationen über den Sensor.
Unter anderem:
avty_t
Das ist die Kurzform für:
availability_topic
Über dieses Topic entscheidet Home Assistant, ob das Gerät beziehungsweise der Sensor gerade verfügbar ist.
Das Problem bei meiner Zendure-Anbindung:
Home Assistant hatte teilweise ein falsches beziehungsweise altes Availability-Signal gespeichert.
Das Ergebnis:
unavailable
Obwohl Zendure eigentlich weiterhin vorhanden war.
Home Assistant zeigt dann natürlich auch keinen normalen Sensorwert mehr an.
Meine Lösung: Zendure automatisch wieder auf „online“ setzen
Ich wollte das nicht jedes Mal manuell über MQTT reparieren.
Deshalb läuft bei mir jetzt diese Automation:
alias: Zendure Availability auto-fix
description: >-
Liest jedes Zendure-Discovery-Topic und setzt das zugehörige avty_t retained
auf "online"
triggers:
- topic: homeassistant/+/+/config
trigger: mqtt
conditions:
- condition: template
value_template: |
{{ trigger.payload_json is mapping
and trigger.payload_json.get('dev', {}).get('mf') == 'Zendure'
and trigger.payload_json.avty_t is defined }}
actions:
- data:
topic: '{{ trigger.payload_json.avty_t }}'
payload: '{{ trigger.payload_json.pl_avail | default(''online'') }}'
retain: true
qos: 0
action: mqtt.publish
mode: queued
max: 200
Was macht die Automation genau?
Eigentlich ist das Prinzip ziemlich simpel.
Die Automation hört zunächst auf alle passenden Home-Assistant-MQTT-Discovery-Nachrichten:
homeassistant/+/+/config
Sobald dort eine Config-Nachricht auftaucht, schauen wir uns an, von welchem Gerät sie kommt.
Mit:
trigger.payload_json.get('dev', {}).get('mf') == 'Zendure'
filtere ich ausschließlich Geräte des Herstellers Zendure heraus.
Andere MQTT-Geräte in Home Assistant werden also nicht angefasst.
Danach prüfen wir noch, ob überhaupt ein Availability-Topic definiert wurde:
trigger.payload_json.avty_t is defined
Wenn beides stimmt, liest die Automation das Availability-Topic direkt aus der MQTT-Discovery-Config aus.
Also:
trigger.payload_json.avty_t
An genau dieses Topic schicken wir anschließend:
online
beziehungsweise den von Zendure in pl_avail definierten Online-Wert.
Warum retain: true wichtig ist
Der meiner Meinung nach entscheidende Teil ist:
retain: true
Damit wird die MQTT-Nachricht nicht einfach nur einmal verschickt.
Der MQTT-Broker merkt sich den Wert.
Wenn Home Assistant sich später neu mit dem Broker verbindet oder nach einem Neustart die Geräte wieder einliest, bekommt es direkt den gespeicherten Availability-Status:
online
Das verhindert, dass Home Assistant wieder auf einem alten offline-Status hängen bleibt.
Was die Automation NICHT macht
Das ist wichtig:
Diese Automation erzeugt keine neuen Zendure-Messwerte.
Sie sagt Home Assistant lediglich:
Dieses Gerät ist verfügbar.
Wenn dein Zendure-System tatsächlich keine Leistungs-, Batterie- oder Energiewerte mehr über MQTT sendet, dann löst diese Automation dieses Problem nicht.
Das sind zwei unterschiedliche Fehlerbilder.
Fall 1: Werte kommen über MQTT, Home Assistant zeigt aber unavailable
Dann kann diese Automation genau die richtige Lösung sein.
Fall 2: Auch über MQTT kommen keine neuen Messwerte mehr
Dann musst du weiter vorne suchen.
Zum Beispiel bei:
- Zendure
- der verwendeten Zendure-MQTT-Bridge
- dem MQTT-Broker
- der Netzwerkverbindung
- dem eigentlichen
state_topic
Die Automation repariert ausschließlich die Availability-Ebene.
Warum ich die Lösung trotzdem praktisch finde
Gerade bei MQTT Discovery möchte ich eigentlich nicht anfangen, einzelne Sensoren oder Topics hart in einer Automation einzutragen.
Deshalb liest die Automation das Availability-Topic dynamisch aus:
trigger.payload_json.avty_t
Das bedeutet:
Es ist egal, wie der konkrete Zendure-Sensor heißt.
Sobald ein Zendure-Gerät über MQTT Discovery angelegt wird und ein avty_t besitzt, wird es automatisch berücksichtigt.
Damit funktioniert die Lösung auch bei mehreren Zendure-Sensoren gleichzeitig.
Durch:
mode: queued
max: 200
können außerdem viele Discovery-Nachrichten hintereinander abgearbeitet werden.
Das ist wichtig, weil beim Start von Home Assistant beziehungsweise beim erneuten Einlesen der MQTT-Discovery schnell sehr viele Config-Nachrichten auf einmal eintreffen können.
Automation in Home Assistant anlegen
Du kannst die Automation ganz normal in Home Assistant anlegen.
Gehe zu:
Einstellungen → Automationen & Szenen → Automation erstellen
Erstelle eine neue Automation und wechsle anschließend in den YAML-Modus.
Dort kannst du den Code einfügen:
alias: Zendure Availability auto-fix
description: >-
Liest jedes Zendure-Discovery-Topic und setzt das zugehörige avty_t retained
auf "online"
triggers:
- topic: homeassistant/+/+/config
trigger: mqtt
conditions:
- condition: template
value_template: |
{{ trigger.payload_json is mapping
and trigger.payload_json.get('dev', {}).get('mf') == 'Zendure'
and trigger.payload_json.avty_t is defined }}
actions:
- data:
topic: '{{ trigger.payload_json.avty_t }}'
payload: '{{ trigger.payload_json.pl_avail | default(''online'') }}'
retain: true
qos: 0
action: mqtt.publish
mode: queued
max: 200
Automation speichern und aktivieren.
Danach sollte sie bei neuen beziehungsweise erneut eingelesenen Zendure-MQTT-Discovery-Nachrichten automatisch reagieren.
Prüfen, ob genau das dein Fehler ist
Bevor du einfach irgendeine Automation installierst, würde ich einmal MQTT anschauen.
In Home Assistant kannst du unter:
Einstellungen → Geräte & Dienste → MQTT
auf MQTT-Nachrichten lauschen.
Interessant sind dabei vor allem:
homeassistant/#
und das Availability-Topic des betroffenen Zendure-Gerätes.
Wenn deine eigentlichen Messwerte weiterhin eintreffen, Home Assistant das Gerät aber trotzdem als unavailablebehandelt, bist du ziemlich wahrscheinlich genau bei diesem Problem gelandet.
Fazit
Das Problem sieht auf den ersten Blick so aus, als würde Zendure keine aktuellen Werte mehr liefern.
Tatsächlich kann aber einfach der MQTT-Availability-Status falsch sein.
Home Assistant glaubt dann:
Gerät offline
obwohl im Hintergrund weiterhin MQTT-Kommunikation stattfindet.
Meine Automation sucht deshalb automatisch alle Zendure-MQTT-Discovery-Configs heraus und setzt das jeweilige Availability-Topic retained wieder auf:
online
Kleine Automation – aber deutlich angenehmer, als nach jedem Neustart oder MQTT-Problem einzelne Topics von Hand zu korrigieren.
Und falls deine Sensoren danach zwar wieder verfügbar sind, sich die Werte aber trotzdem nicht verändern, weißt du zumindest: Dann liegt das eigentliche Problem nicht mehr bei availability, sondern beim Datenfluss von Zendure selbst.
