MQTT2_Discovery - nativer HA/Tasmota discovery Support

Begonnen von Guybrush, 19 August 2026, 23:50:58

Vorheriges Thema - Nächstes Thema

SH_Heini

Das längste gemeinsame Präfix hört sich doch genau richtig an.
Meld Dich, wenn eine neue Version verfügbar ist, ich teste gerne weiter.

Guybrush

ich hab jetzt alles eingebaut, was ich anhand deiner Posts als Problem erkennen konnte. ist noch nicht im main, aber du kannst die aktuelle version so testen:

update force https://raw.githubusercontent.com/next81/fhem.MQTT2_Discovery/0.9.0-dev/controls_MQTT2_DISCOVERY.txt
shutdown restart

unittests liefen jedenfalls alle sauber durch und bei mir lokal funktionierts jetzt so wie es soll

SH_Heini

Geräte gelöscht, Update gemacht und mqttDiscovery neu angelegt.

Devicetopic passt soweit für mich, aber es werden wieder die readingslist bei jedem Restart erneut befüllt (alle Geräte).

neu angelegtes Device nach 2 restarts:

defmod WZ_LIGHTSTRIP_LICHT MQTT2_DEVICE mqtt2_discovery_7b82ac6886500890
attr WZ_LIGHTSTRIP_LICHT DbLogExclude .*
attr WZ_LIGHTSTRIP_LICHT devicetopic zigbee2mqtt/WZ_LIGHTSTRIP_LICHT
attr WZ_LIGHTSTRIP_LICHT group N_E_U
attr WZ_LIGHTSTRIP_LICHT readingList $DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }
attr WZ_LIGHTSTRIP_LICHT room N_E_U
attr WZ_LIGHTSTRIP_LICHT setList brightness:slider,0,1,254 $DEVICETOPIC/set {"brightness":$EVTPART1}\
effect:blink,breathe,okay,channel_change,candle,fireplace,colorloop,sunset,sunrise,sparkle,opal,glisten,underwater,cosmos,sunbeam,enchant,none,finish_effect,stop_effect,stop_hue_effect $DEVICETOPIC/set/effect\
effect_color $DEVICETOPIC/set/effect_color\
effect_speed:slider,0,0.01,1 $DEVICETOPIC/set/effect_speed\
power_on_behavior:off,on,toggle,previous $DEVICETOPIC/set/power_on_behavior\
state:ON,OFF $DEVICETOPIC/set {"state":"$EVTPART1"}

Fehlermeldung im Log zu dem Device:

2026.08.22 18:44:24 2: MQTT2_DISCOVERY mqttDiscovery: manual configuration wins for target=WZ_LIGHTSTRIP_LICHT; conflicts=state,brightness,effect_speed,effect,power_on_behavior,effect_color

Gruß

Guybrush

schon gefunden. alleine auf INITIALIZED abzustellen reicht nicht. ich muss die retained messages wohl erstmal cachen bis INITIALIZED erreicht ist. das geht aber schnell zu fixen

Guybrush

hab die Änderungen drin:

update force https://raw.githubusercontent.com/next81/fhem.MQTT2_Discovery/0.9.2-dev/controls_MQTT2_DISCOVERY.txt
shutdown restart

SH_Heini

0.9.2

Leider keine Verbesserung: (1 Restart)

$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }
$DEVICETOPIC:.* { json2nameValue($EVENT) }
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }
$DEVICETOPIC:.* { json2nameValue($EVENT) }
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }

der bridge Eintrag verwundert mich ebenfalls, war bei den anderen Versionen auch schon.

Beim Erstellen von mqttDiscovery hab ich noch folgendes im Log:

2026.08.22 20:53:18 1: PERL WARNING: Prototype mismatch: sub main::decode_json ($) vs none at /usr/lib/aarch64-linux-gnu/perl-base/Exporter.pm line 63.
2026.08.22 20:53:18 2: MQTT2_DISCOVERY mqttDiscovery: defined for MQTT2_CLIENT MQTT2_TEST_CLIENT; version=0.9.2

Gruß

Guybrush

da komm ich jetzt leider nicht weiter ohne deine hilfe. führe bitte einmal diesen befehl in der fhem kommandozeile aus. bei $d="mqttDiscovery" bitte dein devicename eintragen, wenn es jetzt anders heissen sollte:
{my $d="mqttDiscovery";; my $v=ReadingsVal($d,".registry","");; local $@="";; my $r=length($v) ? eval { JSON::PP->new->decode($v) } : undef;; my $e=$@;; my $h=defined($defs{$d}) ? $defs{$d}{helper}{registry} : undef;; my $sd=length($v)==0 ? 0 : (!$e && ref($r) eq "HASH" && ref($r->{devices}) eq "HASH" ? scalar(keys %{$r->{devices}}) : "-");; my $hd=(ref($h) eq "HASH" && ref($h->{devices}) eq "HASH") ? scalar(keys %{$h->{devices}}) : "undef";; "time=".TimeNow()." device=".$d." init_done=".$main::init_done." configDB=".(configDBUsed()?1:0)." discoveredDevices=".ReadingsVal($d,"discoveredDevices","?")." discoveredEntities=".ReadingsVal($d,"discoveredEntities","?")." registryLength=".length($v)." decode=".(length($v)==0 ? "empty" : ($e ? "ERROR ".$e : "ok"))." storedDevices=".$sd." helperDevices=".$hd}

output kopieren. danach fhem über "shutdown restart" neu starten. nach dem neustart kurz warten und schauen ob neue duplikate da sind. dann den befehl nochmal ausführen. ich brauche beide outputs einmal zum abgleichen. danke  ;)

SH_Heini

time=2026-08-22 21:48:10 device=mqttDiscovery init_done=1 configDB=0 discoveredDevices=58 discoveredEntities=480 registryLength=855523 decode=ok storedDevices=58 helperDevices=58
time=2026-08-22 21:51:25 device=mqttDiscovery init_done=1 configDB=0 discoveredDevices=58 discoveredEntities=480 registryLength=855523 decode=ok storedDevices=58 helperDevices=58

Guybrush

und das bitte nochmal:

{my $d="mqttDiscovery";;my $t="WZ_LIGHTSTRIP_LICHT";;my $r=$defs{$d}{helper}{registry};;my @rec=grep {ref($_) eq "HASH" && defined($_->{name}) && $_->{name} eq $t} values %{$r->{devices}};;my $o=@rec && ref($rec[0]{owned_reading}) eq "ARRAY" ? $rec[0]{owned_reading}:[];;my @c=grep {length($_)} split(/\r?\n/,AttrVal($t,"readingList",""));;my %u=map {$_=>1}@c;;my $m=grep {$u{$_}}@$o;;my %seen;;my $dups=grep {$seen{$_}++}@c;;"device=$d target=$t records=".scalar(@rec)." current=".scalar(@c)." unique=".scalar(keys%u)." owned=".scalar(@$o)." matched=$m duplicates=$dups"}

SH_Heini

device=mqttDiscovery target=WZ_LIGHTSTRIP_LICHT records=1 current=24 unique=3 owned=3 matched=3 duplicates=21


defmod WZ_LIGHTSTRIP_LICHT MQTT2_DEVICE mqtt2_discovery_7b82ac6886500890
attr WZ_LIGHTSTRIP_LICHT DbLogExclude .*
attr WZ_LIGHTSTRIP_LICHT devicetopic zigbee2mqtt/WZ_LIGHTSTRIP_LICHT
attr WZ_LIGHTSTRIP_LICHT group N_E_U
attr WZ_LIGHTSTRIP_LICHT readingList $DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }
attr WZ_LIGHTSTRIP_LICHT room N_E_U
attr WZ_LIGHTSTRIP_LICHT setList brightness:slider,0,1,254 $DEVICETOPIC/set {"brightness":$EVTPART1}\
effect:blink,breathe,okay,channel_change,candle,fireplace,colorloop,sunset,sunrise,sparkle,opal,glisten,underwater,cosmos,sunbeam,enchant,none,finish_effect,stop_effect,stop_hue_effect $DEVICETOPIC/set/effect\
effect_color $DEVICETOPIC/set/effect_color\
effect_speed:slider,0,0.01,1 $DEVICETOPIC/set/effect_speed\
power_on_behavior:off,on,toggle,previous $DEVICETOPIC/set/power_on_behavior\
state:ON,OFF $DEVICETOPIC/set {"state":"$EVTPART1"}

Guybrush

#25
Die Ursache lag bei der Zeichenkodierung der internen Geräteliste. Enthielt sie Sonderzeichen wie °, konnte sie nach einem FHEM-Neustart nicht korrekt gelesen werden. MQTT2_DISCOVERY erkannte dadurch seine vorhandenen Einträge nicht mehr und fügte sie erneut hinzu.  Das ist mit Version 0.9.3 behoben und wurde mit mehreren Neustarts erfolgreich getestet:

update force https://raw.githubusercontent.com/next81/fhem.MQTT2_Discovery/0.9.3-dev/controls_MQTT2_DISCOVERY.txt
shutdown restart

SH_Heini

0.9.3

Auch nach mehreren Restarts keine Verdoppelung der Einträge mehr.

Was jetzt immernoch auffällt ist, dass bei jedem Zigbeegerät der Eintrag der bridge enthalten ist:

attr readingList:
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }
$DEVICETOPIC:.* { json2nameValue($EVENT) }
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }

Gruß

Guybrush

$DEVICETOPIC ist auch in dem Beispiel weiter "zigbee2mqtt/WZ_LIGHTSTRIP_LICHT" ? kannst du mal ein list von dem device posten? danke

SH_Heini

Ist bei allen Zigbeegeräten vorhanden,

hier das List:

Internals:
   CID        mqtt2_discovery_7b82ac6886500890
   DEF        mqtt2_discovery_7b82ac6886500890
   FUUID      6a8aa3ee-f33f-0f6f-86df-a2e363e4650d3e8b
   IODev      MQTT2_TEST_CLIENT
   LASTInputDev MOSQUITTO_WPI
   MOSQUITTO_WPI_MSGCNT 7
   MOSQUITTO_WPI_TIME 2026-08-23 10:35:14
   MQTT2_TEST_CLIENT_MSGCNT 7
   MQTT2_TEST_CLIENT_TIME 2026-08-23 10:35:14
   MSGCNT     14
   NAME       WZ_LIGHTSTRIP_LICHT
   NR         1065
   STATE      OFF
   TYPE       MQTT2_DEVICE
   eventCount 14
   .DT:
     DEVICETOPIC zigbee2mqtt/WZ_LIGHTSTRIP_LICHT
   .attraggr:
   .attrminint:
   READINGS:
     2026-08-23 09:58:05   IODev           MQTT2_TEST_CLIENT
     2026-08-23 10:35:14   availability    online
     2026-08-23 10:35:14   brightness      72
     2026-08-23 10:35:14   color_mode      xy
     2026-08-23 10:35:14   color_temp      168
     2026-08-23 10:35:14   color_x         0.323
     2026-08-23 10:35:14   color_y         0.329
     2026-08-23 10:35:14   effect          none
     2026-08-23 10:35:14   philips_raw     07000001ea01
     2026-08-23 10:35:14   state           OFF
   SEMANTIC_METADATA:
     confidence 0.95
     entities:
       HASH(0x559357e9c8)
       HASH(0x5593590e00)
       HASH(0x55935932b0)
       HASH(0x55935abc80)
       HASH(0x5593590f50)
Attributes:
   DbLogExclude .*
   devicetopic zigbee2mqtt/WZ_LIGHTSTRIP_LICHT
   group      N_E_U
   readingList $DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }
$DEVICETOPIC:.* { json2nameValue($EVENT) }
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }
   room       N_E_U
   setList    brightness:slider,0,1,254 $DEVICETOPIC/set {"brightness":$EVTPART1}
effect:blink,breathe,okay,channel_change,candle,fireplace,colorloop,sunset,sunrise,sparkle,opal,glisten,underwater,cosmos,sunbeam,enchant,none,finish_effect,stop_effect,stop_hue_effect $DEVICETOPIC/set/effect
effect_color $DEVICETOPIC/set/effect_color
effect_speed:slider,0,0.01,1 $DEVICETOPIC/set/effect_speed
power_on_behavior:off,on,toggle,previous $DEVICETOPIC/set/power_on_behavior
state:ON,OFF $DEVICETOPIC/set {"state":"$EVTPART1"}

SH_Heini

Die devicetopics passen noch nicht bei allen Gerätearten.
Bei "light" passt das

Bei Sensoren (Kontakt/ Temperatur) sieht es noch so aus:

defmod TEMP_SENSOR_SZ MQTT2_DEVICE mqtt2_discovery_d1ba2cf229e73501
attr TEMP_SENSOR_SZ DbLogExclude .*
attr TEMP_SENSOR_SZ devicetopic zigbee2mqtt
attr TEMP_SENSOR_SZ group N_E_U
attr TEMP_SENSOR_SZ readingList $DEVICETOPIC/TEMP_SENSOR_SZ/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC/TEMP_SENSOR_SZ:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/bridge/state:.* { json2nameValue($EVENT) }
attr TEMP_SENSOR_SZ room N_E_U

Bei Schaltern sieht es momentan noch so aus.
automatisch angelegtes Gerät:

defmod SCHALTER_WAND_SZ MQTT2_DEVICE mqtt2_discovery_c4cf107fac74f7e2
attr SCHALTER_WAND_SZ DbLogExclude .*
attr SCHALTER_WAND_SZ devicetopic zigbee2mqtt/SCHALTER_WAND_SZ
attr SCHALTER_WAND_SZ group N_E_U
attr SCHALTER_WAND_SZ readingList $DEVICETOPIC/action:off$ action_off\
$DEVICETOPIC/action:on$ action_on\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }\
zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }
attr SCHALTER_WAND_SZ room N_E_U
attr SCHALTER_WAND_SZ setList schalter_wand_sz_identify:noArg $DEVICETOPIC/set/identify identify

schön fände ich:

defmod SCHALTER_WAND_SZ MQTT2_DEVICE mqtt2_discovery_c4cf107fac74f7e2
attr SCHALTER_WAND_SZ DbLogExclude .*
attr SCHALTER_WAND_SZ devicetopic zigbee2mqtt/SCHALTER_WAND_SZ
attr SCHALTER_WAND_SZ group N_E_U
attr SCHALTER_WAND_SZ readingList $DEVICETOPIC/availability:.* { json2nameValue($EVENT, '', {'state' => 'availability'}) }\
$DEVICETOPIC:.* { json2nameValue($EVENT) }
attr SCHALTER_WAND_SZ room N_E_U
attr SCHALTER_WAND_SZ setList identify:noArg $DEVICETOPIC/set/identify identify

Gruß