(Zigbee2MQTT) Stolperfallen

Aus TippvomTibb
Zur Navigation springen Zur Suche springen

Fehlermeldung

Beim Deaktivieren der legacy_action_sensor option kommt folgende fehlermeldung frontend:api:bridge: Sending {"topic":"bridge/request/options","payload":{"options":{"homeassistant":{"legacy_action_sensor":false}},"transaction":"yaom6-1"}} [4/12/2026, 7:57:04 AM] z2m: Request 'zigbee2mqtt/bridge/request/options' failed with error: 'Extension with name HomeAssistant already present'

Das ist sehr wahrscheinlich ein Bug beim Umschalten der Home-Assistant-Optionen zur Laufzeit im Zigbee2MQTT-Frontend, nicht ein Fehler in deiner Konfiguration. Ein aktueller Issue zeigt denselben Fehler beim Ein-/Ausschalten von HA-Optionen per bridge/request/options:

Extension with name HomeAssistant already present (GitHub)

Außerdem ist legacy_action_sensor in der Zigbee2MQTT-Doku als Home-Assistant-Option beschrieben; wenn aktiviert, sendet Zigbee2MQTT nach jeder Action absichtlich ein leeres action. (Zigbee2MQTT)

Was das für dich bedeutet

Dein eigentliches Problem bleibt:

  • .../action Topic ist korrekt
  • payload.action wird danach leer
  • das passt exakt zu legacy_action_sensor: true (Zigbee2MQTT)

Der neue Fehler bedeutet nur:

  • das Frontend kann die HomeAssistant-Extension gerade nicht sauber live neu aufbauen
  • daher musst du die Option in der Datei ändern und Zigbee2MQTT neu starten, statt sie im Frontend umzuschalten. (GitHub)

So gehst du sauber vor

Öffne deine Zigbee2MQTT-configuration.yaml und setze:

homeassistant:
  enabled: true
  legacy_action_sensor: false

Optional, wenn du die neuere Richtung nutzen willst:

homeassistant:
  enabled: true
  legacy_action_sensor: false
  experimental_event_entities: true

Danach Zigbee2MQTT komplett neu starten. Die Doku führt beide Optionen im homeassistant-Block. (Zigbee2MQTT)

Wichtig: nicht im Frontend umschalten

Der Fehler kommt genau von diesem Weg:

zigbee2mqtt/bridge/request/options

also vom dynamischen Options-Update aus dem Frontend. Dafür gibt es aktuell einen bekannten Fehler bei HA-bezogenen Optionen. (GitHub)

Wenn du den Code trotzdem patchen willst

Die richtige Stelle ist nicht der TS0044-Converter, sondern die HA-Extension von Zigbee2MQTT:

lib/extension/homeassistant.ts

Dort sitzt die Logik, die bei aktivem legacy_action_sensor direkt nach einer Action noch einmal {action: ""} publiziert. Das ist im aktuellen Quellcode so zu sehen. (GitHub)

Wenn du lokal patchen willst, ist der Minimal-Patch, diese Zeile zu deaktivieren:

await this.publishEntityState(data.entity, {action: ""});

Aber der bessere Weg ist wirklich, legacy_action_sensor: false in der Konfig zu setzen und Zigbee2MQTT neu zu starten. (Zigbee2MQTT)

Erwartetes Verhalten danach

Nach dem Neustart solltest du typischerweise sehen:

  • kein absichtliches Leeren von payload.action
  • Actions weiter korrekt auf zigbee2mqtt/DEIN_GERAET/action
  • in Home Assistant besser mit MQTT Device Triggern oder Event-Entities arbeiten statt mit dem alten Action-Sensor. Das wird in den Zigbee2MQTT-Hinweisen ebenfalls so empfohlen. (GitHub)

Wenn du den Patch direkt suchst

Je nach Installation findest du die laufende JS-Datei oft eher hier als die TS-Datei:

/app/lib/extension/homeassistant.js

Die Quellreferenz bleibt aber:

lib/extension/homeassistant.ts

(GitHub)

TS0044 action = Leerstring im payload

Das liegt sehr wahrscheinlich nicht am TS0044_1-Converter, sondern an der Home-Assistant-Integration von Zigbee2MQTT.

Der entscheidende Hinweis ist dein Symptom:

  • .../action Topic enthält den richtigen Tastendruck
  • Payload-Feld action im normalen Geräte-Topic ist danach leer
  • im Frontend ist action ebenfalls leer

Genau dieses Verhalten ist dokumentiert, wenn homeassistant.legacy_action_sensor aktiviert ist: Dann wird nach jeder Action absichtlich ein leeres action gesendet. (Zigbee2MQTT)

Außerdem zeigt der Zigbee2MQTT-Quellcode genau diese Logik in der Home-Assistant-Extension: Wenn legacyActionSensor aktiv ist und data.message.action existiert, wird direkt danach publishEntityState(..., {action: ""}) aufgerufen; erst darunter wird der korrekte Wert zusätzlich auf .../action publiziert. (GitHub)

Was bei dir also wahrscheinlich aktiv ist

In deiner configuration.yaml von Zigbee2MQTT vermutlich so etwas:

homeassistant:
  enabled: true
  legacy_action_sensor: true

Die Doku beschreibt genau dazu:

  • legacy_action_sensor: aktiviert alte Action-Sensoren
  • dabei wird nach jeder Action ein leerer action-Wert gesendet (Zigbee2MQTT)

Warum „Recent activity“ trotzdem richtig ist

Weil Zigbee2MQTT für Actions zusätzlich das separate MQTT-Topic

zigbee2mqtt/DEIN_GERAET/action

publiziert. Das ist genau der Pfad, den Zigbee2MQTT für MQTT Device Triggers verwendet. (GitHub)

Was du tun solltest

Sauberste Lösung

legacy_action_sensor deaktivieren oder entfernen:

homeassistant:
  enabled: true
  legacy_action_sensor: false

Danach Zigbee2MQTT neu starten.

Dann solltest du für Automationen das separate /action Topic oder die von Zigbee2MQTT empfohlenen MQTT device triggers verwenden. Zigbee2MQTT empfiehlt für Button-Actions in Home Assistant genau diesen Weg. (Zigbee2MQTT)

Falls du in Home Assistant Event-Entities willst

Optional:

homeassistant:
  enabled: true
  experimental_event_entities: true

Das ist die neuere Richtung für Action-/Event-Geräte. (Zigbee2MQTT)



Wo du patchen müsstest

Nicht im TS0044_1-Geräte-Converter, denn der liefert die Action offenbar korrekt — sonst wäre das Topic .../action nicht richtig.

Die richtige Stelle ist in Zigbee2MQTT selbst:

lib/extension/homeassistant.ts

Dort in der Methode onPublishEntityState(...).

Die relevante Stelle ist sinngemäß:

if (this.legacyActionSensor && data.message.action) {
    await this.publishEntityState(data.entity, {action: ""});
}

if (settings.get().advanced.output === "json" && entity.isDevice() && entity.definition && data.message.action) {
    const value = data.message.action.toString();
    await this.publishDeviceTriggerDiscover(entity, "action", value);
    await this.mqtt.publish(`${data.entity.name}/action`, value, {});
}

Genau dieser Code ist im Repository sichtbar. (GitHub)

Wenn du wirklich patchen willst

Dann ist der Minimal-Patch:

if (this.legacyActionSensor && data.message.action) {
    // await this.publishEntityState(data.entity, {action: ""});
}

oder härter:

if (false && this.legacyActionSensor && data.message.action) {
    await this.publishEntityState(data.entity, {action: ""});
}

Wichtig dabei

Bei einer laufenden Installation patchst du meistens nicht die TypeScript-Quelldatei direkt, sondern die ausgelieferte JS-Datei im Container/Add-on. Je nach Installation liegt sie oft unter etwas wie:

/app/lib/extension/homeassistant.js

Die saubere Lösung ist aber trotzdem: legacy_action_sensor ausschalten, statt den Code zu patchen.

Kurzfazit

Dein Problem ist sehr wahrscheinlich:

  • kein TS0044_1-Bug
  • kein Converter-Bug
  • sondern das absichtliche Verhalten von legacy_action_sensor: true

Die beste Abhilfe ist daher, diese Option auszuschalten und mit .../action bzw. MQTT Device Triggers weiterzuarbeiten. (Zigbee2MQTT)