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.

Hat dir der Artikel geholfen?

Ja! 👍
Ne 🙁
Danke für dein Feedback!

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert