MQTT2_Client: autocreate legt neue LoRaWAN Topics in allen MQTT2_DEVICES an

Begonnen von klaus.schauer, 17 August 2021, 17:37:58

Vorheriges Thema - Nächstes Thema

klaus.schauer

Bei eingeschaltetem autocreate legt der MQTT2_Client neue LoRaWAN (TTN V3) Topics in allen nachgelagerten MQTT2_DEVICE im Attribut readingList in der Form

<MQTT2_Client>:v3/<tenant>\x40ttn/devices/<device>/join:.* { json2nameValue($EVENT) }
<MQTT2_Client>:v3/<tenant>\x40ttn/devices/<device>/up:.* { json2nameValue($EVENT) }

gleichzeitig an.

Gibt es eine Möglichkeit, das Anlegen dieser neuen Topics auf ein einziges MQTT2_DEVCICE zu beschränken?
Zwei Fälle:
- neue LoRaWAN-Devices auf ein definiertes Standard MQTT2_DEVCICE und
- zusätzliche Topics eines bekannten LoRaWAN-Devices, z. B.

<MQTT2_Client>:v3/<tenant>\x40ttn/devices/<device_1>/down:.* { json2nameValue($EVENT) }

auf das bereits darauf zugeordnete MQTT2_DEVICE mit der readingList

<MQTT2_Client>:v3/<tenant>\x40ttn/devices/<device_1>/join:.* { json2nameValue($EVENT) }
<MQTT2_Client>:v3/<tenant>\x40ttn/devices/<device_1>/up:.* { json2nameValue($EVENT) }

rudolfkoenig

Eigentlich sollte ein MQTT-Topic nur in einem MQTT2_DEVICE landen: wenn der Parser was gefunden hat, dann verspuert er kein Beduerfnis autocreate anzuschmeissen.

Wenn das aber nicht der Fall sein sollte, und ich es untersuchen soll, dann benoetige ich mehr Details, d.h. die komplette (raw) Definition von MQTT2_CLIENT und MQTT2_DEVICE, und "problematische" MQTT Nachrichten, z.Bsp. aus dem "attr mqtt2_client vebose 5" Log.

klaus.schauer

Zitat von: rudolfkoenig am 17 August 2021, 18:46:42
Eigentlich sollte ein MQTT-Topic nur in einem MQTT2_DEVICE landen: wenn der Parser was gefunden hat, dann verspuert er kein Beduerfnis autocreate anzuschmeissen.
Das ist ja auch so. Aber wenn - nehmen wir den zweiten Fall - ein neues Topic (besser ein neuer Topicbaum)

<MQTT2_Client>:v3/<tenant>\x40ttn/devices/<device_1>/down:.* { json2nameValue($EVENT) }

kommt, dann wird es nicht nur dem bereits existierenden MQTT2_DEVICE mit der readingList

<MQTT2_Client>:v3/<tenant>\x40ttn/devices/<device_1>/join:.* { json2nameValue($EVENT) }
<MQTT2_Client>:v3/<tenant>\x40ttn/devices/<device_1>/up:.* { json2nameValue($EVENT) }

zugeordnet, sondern allen bestehenden MQTT2_DEVICE, die dem <MQTT2_Client> nachgeordnet sind. Ich werde mal sehen, ob ich das etwas detaillierter darstellen kann.

rudolfkoenig

Habe im Code nachgeschaut: es gibt wohl eine Schleife, die readingList fuer alle Instanzen mit dem gleichen ClientID erweitert. Der Nutzen ist mAn grenzwertig, ich will es aber nicht ohne triftigen Grund entfernen. Autocreate in MQTT2_DEVICE ist halt fuer MQTT2_SERVER gebaut, bei MQTT2_CLIENT ist es ohne einen perfekten bridgeRegexp eigentlich sinnfrei.

D.h. die Loesung ist ein guter bridgeRegexp.
Eine Alternative waere ClientID nur bei einem MQTT2_DEVICE in der define zu spezifizieren, und bei allen aus dem readingList zu entfernen.

klaus.schauer

Zitat von: rudolfkoenig am 17 August 2021, 19:51:34
Die Loesung ist ein guter bridgeRegexp.
Eine Alternative waere ClientID nur bei einem MQTT2_DEVICE in der define zu spezifizieren, und bei allen aus dem readingList zu entfernen.
Wenn ich die Funktion von bridgeRegexp richtig verstanden habe, können z. B. mit

attr <devixe> bridgeRegexp v3/.*ttn/devices/(.*)-(.*)-(.*)[/]?.*:.* "$1_$2_$3"

in einem der vorhandenen MQTT2_DEVICE beim Empfang von Topics wie

v3/<app>\x40ttn/devices/io-controller-01/down/sent/*

neue MQTT2_DEVICE angelegt werden. Existiert das MQTT2_DEVICE "io-controller-01" schon, so wird die readingList dieses Devices aber nicht um die neuen Topics ergänzt.

Ob mein regexp für diesen Zweck auch ein guter ist, ist natürlich die Frage. Außerdem ist mir aufgefallen, dass die Ausführung des regexp-Ausdrucks Fhem über mehrere Sekunden zu beschäftigen und zu blockieren scheint.

Sollte die Funktion so gewollt sein, ist damit aber nicht der Fall abgedeckt, dass zusätzliche Topic-Bäume automatisch in die readingList des "richtigen" MQTT2_DEVICE aufgenommen werden.

Zitat von: rudolfkoenig am 17 August 2021, 19:51:34
Eine Alternative waere ClientID nur bei einem MQTT2_DEVICE in der define zu spezifizieren, und bei allen aus dem readingList zu entfernen.
Ich habe deshalb erst einmal diese Variante gewählt. Das erfordert dann natürlich, neue MQTT2_DEVICE manuell anzulegen und zusätzliche Topic-Bäume in die readingList des passsenden MQTT2_DEVICE zu verschieben.