MQTT2-Loop vermeiden

Begonnen von herr.vorragend, 22 Januar 2021, 21:29:59

Vorheriges Thema - Nächstes Thema

herr.vorragend

Guten Tag, 

auf Basis der heutigen Templates von Beta-User (Danke) habe ich folgendes Konstrukt erstellt:

defmod mosquitto MQTT2_CLIENT mosquitto:1883
attr mosquitto autocreate simple
attr mosquitto clientId fhem
attr mosquitto keepaliveTimeout 60
attr mosquitto msgAfterConnect -r fhem/connection/status connected
attr mosquitto msgBeforeDisconnect -r fhem/connection/status disconnected
attr mosquitto qosMaxQueueLength 100
attr mosquitto username myusername



MGB

defmod mqttGeneric MQTT_GENERIC_BRIDGE mqtt room=System->MQTT-Bridge
attr mqttGeneric IODev mosquitto
attr mqttGeneric disable 0
attr mqttGeneric globalDefaults sub:base={"fhem/set"} pub:base={"fhem"} pub:qos=0 sub:qos=2 retain=0
attr mqttGeneric stateFormat in: incoming-count out: outgoing-count devices: device-count


Das Device

attr mydevice mqttPublish *:topic={"$base/$device/$name"}
attr mydevice mqttSubscribe :stopic={"$base/$device/$name"}


Das Autocreate vom M2C erstellt mir nun jedoch leider ein neuen M2D mitsamt alle Readings aus allen Geräten, die über die Bridge laufen.


defmod MQTT2_fhem MQTT2_DEVICE fhem
attr MQTT2_fhem IODev mosquitto
attr MQTT2_fhem readingList fhem:fhem/mydevice/energy:.* energy\
fhem:fhem/mydevice/power:.* power\
...
attr MQTT2_fhem room MQTT2_DEVICE


Kann mir jemand einen Tipp geben, wie man das vermeiden kann?

Danke.

Beta-User

Vorab mal Danke für's austesten!

Da sind jetzt bei aktiviertem autocreate am IO noch zwei Punkte verbesserungsfähig, an die ich in dem MQTT2_CLIENT-setting auch erst mal noch nicht gedacht hatte, und dann ist da noch "clientOrder"...

Letzteres ist bereits in der Doku:
attr MQTT2_CLIENT clientOrder MQTT_GENERIC_BRIDGE MQTT2_DEVICE
Die anderen beiden bisher nicht berücksichtigten Punkte braucht man nur, wenn man autocreate im M2_CLIENT haben will:

Zum einen sollte man "normale messages", die aus FHEM rausgehen ignorieren. Dazu muss man das "ignoreRegexp" erweitern, um einen Anteil, der nur die "set"-Topics durchläßt. Hier wäre das der Teil:
fhem/(?!set/)

Da gehört unbedingt noch mehr rein als nur der obige Teil, und meine Empfehlung ist auch, das direkt am IO abzufangen! Beispiel für eine vollständige ignoreRegexp:
attr MQTT2_CLIENT ignoreRegexp fhem/(?!set/)|milight/0x[0-9a-fA-F]{1,4}/.*/[0-8]|shellies/[^/]+/command|cmnd/[^/]+/|homeassistant/.*/config
Zum anderen will man in der Regel ja die eigenen Readings nicht wieder haben, was vielleicht über subscriptions im M2_CLIENT geregelt werden kann. Da ich aber das grade nicht vertiefen kann, wäre mein hotfix-Vorschlag, das über das bridgeRegexp zu lösen an dem MQTT2_DEVICE mit dem attrTemplate "MQTT2_CLIENT_general_bridge". Dort musst du die passend erweitern, dass das auf eine ClientID "" umgeleitet wird, was auf "fhem/.*" kommt, so wie es bisher im Wiki schon beschrieben war.




Zur Klarstellung, weil wir das bisher unvollendete Thema Zwave2MQTT-BridgeExpression? neulich hatten: Dafür braucht man mAn. keine MQTT_GENERIC_BRIDGE, das geht auch auf alleiniger Basis von MQTT2_DEVICE und einer passenden (separaten) bridgeRegexp.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

herr.vorragend

#2
Ich danke dir, wieder einmal, für deine Mühe.
Ich wollte eigentlich gerade schreiben, dass ich hier https://forum.fhem.de/index.php/topic,116162.msg1104338.html#msg1104338 etwas zu meiner Frage gefunden habe und ich habe im IODev mit ignoreRegexp ausprobiert. Nur habe ich einfach nur "fhem" eingegeben. Was natürlich keine Sinn macht; wie ich jetzt weiß.

Diese Antwort hier ist detaillierter und ich probiere mal herum. Danke. 

Zitat von: Beta-User am 23 Januar 2021, 06:28:10

Zur Klarstellung, weil wir das bisher unvollendete Thema Zwave2MQTT-BridgeExpression? neulich hatten: Dafür braucht man mAn. keine MQTT_GENERIC_BRIDGE, das geht auch auf alleiniger Basis von MQTT2_DEVICE und einer passenden (separaten) bridgeRegexp.

Das war mir ausnahmsweise sogar klar. Ich hatte den Bridge-Begriff immer nur auf die bridgeRegexp bezogen. Ähnlich ebusd,OpenMQTTGateway, etc.
Eine MGB wollte ich dafür nicht nehmen.
Ich bin hiermit nur nicht so schnell, weil ich dafür den Zwave-Stick umhängen muss und dann mein Produktivsystem "down" ist.