Mqtt2server mit Home Assistant Verbindungsprobleme

Begonnen von andre07, 29 September 2026, 12:43:34

Vorheriges Thema - Nächstes Thema

andre07

Hallo zusammen,

ich betreibe FHEM mit MQTT2_SERVER als zentralen Broker. Daran hängen u. a. Zigbee2MQTT 2.14.0 separat auf einem Raspberry Pi mehrere OpenMQTTGateways und seit Kurzem Home Assistant in version 2026.9.3.

Bis vor Kurzem hat Home Assistant die Zigbee2 MQTT-Geräte per Discovery gefunden und angezeigt. Nach einem Update des HA-Containers funktioniert das nicht mehr: Es werden keine Geräte mehr angelegt, und bereits bekannte Geräte stehen auf "nicht verfügbar".

Die Ursachen liegen wahrscheinlich daran das neue HA-Versionen sich automatisch mit MQTT 5 verbinden, sobald der Broker das im CONNACK akzeptiert. Eine manuelle Einstellung auf 3.1.1 wird von HA beim Verbinden wieder auf 5 hochgestuft. Mit MQTT 5 kann HA die vom MQTT2_SERVER weitergeleiteten PUBLISH-Pakete offenbar nicht verarbeiten.

Im HA-Log erscheint folgender Fehler (über 6,5 Mio. Mal innerhalb weniger Stunden):

Logger: homeassistant
Quelle: components/mqtt/client.py:615

Error doing job: Exception in callback MQTT._async_reader_callback()() (task: None)
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/mqtt/client.py", line 615, in _async_reader_callback
    if (status := client.loop_read(MAX_PACKETS_TO_READ)) != 0:
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/client.py", line 2100, in loop_read
    rc = self._packet_read()
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/client.py", line 3142, in _packet_read
    rc = self._packet_handle()
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/client.py", line 3808, in _packet_handle
    return self._handle_publish()
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/client.py", line 4123, in _handle_publish
    props, props_len = message.properties.unpack(packet)
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/properties.py", line 410, in unpack
    attr_type = self.properties[identifier][0]
KeyError: 123

123 ist der ASCII-Code für "{", also das erste Zeichen der JSON-Payload. Meine Vermutung (ohne es im Detail geprüft zu haben): Im PUBLISH-Paket an einen MQTT-5-Client fehlt die Property-Length (bzw. sie wird anders kodiert), sodass paho den Beginn der Payload als Property-Identifier liest.

Zusätzlich meldet HA beim Verbinden:

Logger: homeassistant.components.mqtt.client
Quelle: components/mqtt/client.py:1205

Your MQTT broker reports it does not support Subscription Identifiers, see https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901092. Please use a supported MQTT broker; got broker properties: [SessionExpiryInterval : 0, MaximumQoS : 1, RetainAvailable : 0, SubscriptionIdentifierAvailable : 0, SharedSubscriptionAvailable : 0]

(RetainAvailable : 0 erscheint nur, solange respectRetain nicht gesetzt ist; mit "attr MQTTServer respectRetain 1" fehlt dieser Eintrag.)

Weitere Beobachtungen:
- FHEM selbst empfängt alle Zigbee2MQTT-Nachrichten einwandfrei.
- mosquitto_sub auf dem FHEM-Rechner empfängt die Zigbee2MQTT-Nachrichten vom MQTTServer sowohl mit "-V mqttv311" als auch mit "-V mqttv5" korrekt, inkl. der Discovery-Topics unter homeassistant/#.
- Nachrichten der OpenMQTTGateways kamen in HA teilweise an, die von Zigbee2MQTT nie.
- In dieser Zeit hatte FHEM Verbindungsprobleme und ist einmal eingefroren. Ich vermute einen Zusammenhang mit den ständigen Fehlern bzw. Neuverbindungen von HA, kann das aber nicht belegen.

Versionen:
- MQTT2_SERVER
- MQTT2_DEVICE: 0.305090/2025-11-09
- Home Assistant: core 2026.9.3, Python 3.14, paho-mqtt (aus dem HA-Container)
- Zigbee2MQTT: 2.14.0

Könnte es sich jemand das bitte einmal ansehen? Falls MQTT 5 im MQTT2_SERVER nur teilweise unterstützt wird, wäre alternativ eine Option hilfreich, mit der der Server MQTT-5-Verbindungen ablehnt. HA würde dann auf 3.1.1 zurückfallen. Wenn ich weitere Logs liefern soll vomMQTTServer, mache ich das gern.

Vielen Dank und viele Grüße
Andre

PeterLustig

Es wird Dir in der Sache nicht weiterhelfen, aber ich kann das Fehlerbild bestätigen.

Home Assistant meines Sohnes wollte sich nur noch per V5 mit meinem MQTT2_SERVER verbinden, die Vorgabe V3.1.1 hat sich immer wieder auf V5 geändert. Wir hatten die gleichen Fehlermeldungen zu den Subscription Identifiers.
Letztendlich konnte ich das Problem nur durch einen externen Broker (Eclipse Mosquitto) lösen. Allerdings auch mit den Nachteilen, auf z.B. autocreate usw zu verzichten.

rudolfkoenig

Kann bitte einer von euch testen, ob durch aendern der Zeile
    if($hash->{protoNum} < 3 || $hash->{protoNum} > 5) {
in FHEM/00_MQTT2_SERVER.pm in
    if($hash->{protoNum} < 3) {
und spezifizieren von 3.1.1 in HA das Problem geloest wird?
Wenn ja dann werde ich ein passendes Attribut einbauen.

Auch das eigentliche Problem will ich beheben, aber dazu brauche ich ein Testprogramm, am besten ohne dafuer HA aufsetzen und konfigurieren zu muessen.
Womoeglich reicht auch ein python Programm...

PeterLustig

Ich werde es testen. Aus beruflichen Gründen aber leider erst in der nächsten Woche.

andre07


andre07

Trotz Änderung und anschließender umstellung in HA auf protokoll 3.1.1 schaltet HA wieder auf Protokoll 5

rudolfkoenig

ZitatTrotz Änderung und anschließender umstellung in HA auf protokoll 3.1.1 schaltet HA wieder auf Protokoll 5
Bedeutet das, dass keine Verbindung hergestellt wird?

andre07

Verbindung springt auf grün verbunden aber im log von HA erscheint dies Logger: homeassistant
Quelle: components/mqtt/client.py:615
Erstmals aufgetreten: 13:13:27 (648827 Vorkommnisse)
Zuletzt protokolliert: 13:37:25

Error doing job: Exception in callback MQTT._async_reader_callback()() (task: None)
Traceback (most recent call last):
  File "/usr/local/lib/python3.14/asyncio/events.py", line 94, in _run
    self._context.run(self._callback, *self._args)
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/mqtt/client.py", line 615, in _async_reader_callback
    if (status := client.loop_read(MAX_PACKETS_TO_READ)) != 0:
                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/client.py", line 2100, in loop_read
    rc = self._packet_read()
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/client.py", line 3142, in _packet_read
    rc = self._packet_handle()
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/client.py", line 3808, in _packet_handle
    return self._handle_publish()
           ~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/client.py", line 4123, in _handle_publish
    props, props_len = message.properties.unpack(packet)
                       ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/paho/mqtt/properties.py", line 410, in unpack
    attr_type = self.properties[identifier][0]
                ~~~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 123

andre07

und das hier noch wobei SubscriptionIdentifierAvailable : 0 nicht unterstützt wird Logger: homeassistant.components.mqtt.client
Quelle: components/mqtt/client.py:1205
Integration: MQTT (Dokumentation, Probleme)
Erstmals aufgetreten: 13:13:25 (12 Vorkommnisse)
Zuletzt protokolliert: 13:37:21

Your MQTT broker reports it does not support Subscription Identifiers, see https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901092. Please use a supported MQTT broker; got broker properties: [SessionExpiryInterval : 0, MaximumQoS : 1, SubscriptionIdentifierAvailable : 0, SharedSubscriptionAvailable : 0]

DasQ

Zitat von: rudolfkoenig am 29 September 2026, 19:08:10Kann bitte einer von euch testen, ob durch aendern der Zeile
    if($hash->{protoNum} < 3 || $hash->{protoNum} > 5) {
in FHEM/00_MQTT2_SERVER.pm in
    if($hash->{protoNum} < 3) {
und spezifizieren von 3.1.1 in HA das Problem geloest wird?
Wenn ja dann werde ich ein passendes Attribut einbauen.

Auch das eigentliche Problem will ich beheben, aber dazu brauche ich ein Testprogramm, am besten ohne dafuer HA aufsetzen und konfigurieren zu muessen.
Womoeglich reicht auch ein python Programm...

Kurze Recherche bringt zu Tage das HA hat mqtt 3.1.1 für obsolet erklärt

https://github.com/home-assistant/addons/issues/4647
Fhem in Proxmox on MacMini
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

andre07

#10
Kurze Recherche bringt zu Tage das HA hat mqtt 3.1.1 für obsolet erklärt -> habe ich auch festgestellt
habe das Problem ohne HA mit einem kleinen Python-Skript nachgestellt, Skript anbei. Mit MQTT 3.1.1 funktioniert alles. Mit MQTT 5 verbindet sich der Client erfolgreich (CONNACK meldet SubscriptionIdentifierAvailable : 0), SUBSCRIBE und SUBACK klappen ebenfalls, aber beim ersten eingehenden PUBLISH bricht paho in properties.unpack() mit KeyError ab. Der Wert entspricht jeweils einem Zeichen aus der Payload (49 = ,,1", in HA 123 = ,,{"). Es sieht so aus, als würde MQTT2_SERVER an v5-Clients PUBLISH-Pakete ohne das Property-Length-Byte nach Topic bzw. Packet-ID senden. HA setzt das Protokoll beim Start auf 5 zurück, 3.1.1 ist wohl deaktiviert ?
hier das script # Test MQTT2_SERVER mit paho-mqtt 2.x nutzt HA
# Aufruf: python3 mqtt5_test.py HOST PORT USER PASS [5|311]
#python3 -m venv ~/mqtttest && ~/mqtttest/bin/pip install "paho-mqtt>=2"
#nano ~/mqtt5_test.py
#~/mqtttest/bin/python ~/mqtt5_test.py 192.168.178.78 1884 user pass 5
#~/mqtttest/bin/python ~/mqtt5_test.py 192.168.178.78 1884 user pass 311

import sys, logging, paho.mqtt.client as mqtt
logging.basicConfig(level=logging.DEBUG)
host, port, user, pw = sys.argv[1], int(sys.argv[2]), sys.argv[3], sys.argv[4]
v5 = len(sys.argv) < 6 or sys.argv[5] == "5"
c = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="mqtt5-test",
                protocol=mqtt.MQTTv5 if v5 else mqtt.MQTTv311)
c.enable_logger()
c.username_pw_set(user, pw)
def on_connect(cl, ud, flags, rc, props):
    print("CONNACK:", rc, "Properties:", props)
    cl.subscribe("foxess_m1/#")
c.on_connect = on_connect
c.on_message = lambda cl, ud, m: print("MSG", m.topic, m.payload[:60])
c.connect(host, port, 60)
c.loop_forever()
Hat mir übrigens meine gesamte platte zugemüllt Protocol-log war zum schluß 200gb groß.
noch was Retained-Nachrichten verlieren beim Weiterreichen über den MQTT2_SERVER ihr Retain-Flag hatte das festgestellt nachdem ich mir auf dem server wo HA läuft eine Mosquitto Brücke gebaut habe der Daten von fhem weiterreicht an HA.

rudolfkoenig

Ich habe das obige python Programm mit
python mqtt2_test.py localhost 1883 "" "" 5
gestartet (paho-mqtt Version ist 2.1.0), und in FHEM
set m2s publish foxess_m1/hello World
eingegeben, aber ich bekomme keine Fehlermeldung:
DEBUG:paho.mqtt.client:Sending CONNECT (u1, p1, wr0, wq0, wf0, c1, k60) client_id=b'mqtt5-test' properties=None
DEBUG:paho.mqtt.client:Received CONNACK (0, Success) properties=[SessionExpiryInterval : 0, MaximumQoS : 1, SubscriptionIdentifierAvailable : 0, SharedSubscriptionAvailable : 0]
CONNACK: Success Properties: [SessionExpiryInterval : 0, MaximumQoS : 1, SubscriptionIdentifierAvailable : 0, SharedSubscriptionAvailable : 0]
DEBUG:paho.mqtt.client:Sending SUBSCRIBE (d0, m1) [(b'foxess_m1/#', {QoS=0, noLocal=False, retainAsPublished=False, retainHandling=0})]
DEBUG:paho.mqtt.client:Received SUBACK
DEBUG:paho.mqtt.client:Sending PINGREQ
DEBUG:paho.mqtt.client:Received PINGRESP
DEBUG:paho.mqtt.client:Received PUBLISH (d0, q0, r0, m0), 'foxess_m1/hello', properties=[], ...  (5 bytes)
MSG foxess_m1/hello b'World'

Was mache ich falsch?
Falsche paho Version?

rudolfkoenig

#12
Was mache ich falsch?Ich habe keine retain Nachricht geschickt: publish aus dem retain "Vorrat" war bei V5 kaputt, und das habe ich jetzt gefixt.
Weiterhin wird ab jetzt das Retain-Bit bei publish gesendet.

@andre07: danke fuer das Testprogramm!

andre07

habe das bei mir so gestartet #python3 -m venv ~/mqtttest && ~/mqtttest/bin/pip install "paho-mqtt>=2"
#~/mqtttest/bin/python ~/mqtt5_test.py 192.168.178.78 1884 user pass 5 ->versuch mit protokol 5
#~/mqtttest/bin/python ~/mqtt5_test.py 192.168.178.78 1884 user pass 311 > und hier 3.1.1
Danke für die schnelle hilfe werde das so bald wie möglich testen.
Als Nachtrag
Mit respectRetain 1 werden gespeicherte Nachrichten beim SUBSCRIBE zwar ausgeliefert, aber mit Retain-Flag 0
Habe das problem so lange behoben mit Status Topics direkt im Mosquitto als Retained gesetzt habe docker exec mosquitto mosquitto_pub -p 1885 -u ha -P 'passwort' -t 'zigbee2mqtt/bridge/state' -m '{"state":"online"}' -r
.Daraufhin bekommen devices in HA auch Daten.