Leider fehlen mir sowohl die Kenntnisse der fhem Internas als auch die notwendigen Perl Kenntnisse, um zu verstehen, wie diese Perl Erweiterungen im readingList Attribut funktionieren:
shellies/shellies/announce:.* {\$EVENT =~ m,..id...(.*)...mac.*, ? json2nameValue(\$EVENT,"\${1}_") : undef }
Ähnlich, wie der announce command gibt es auch den update command per MQTT. Er veranlasst alle Shellies im Topic
shellies/<shelly MQTT id>/online true
zurückzugeben, wenn der Befehl angekommen ist.
Meine laienhafte Vorstellung ist, dass im $EVENT auch das Topic enthalten ist und mit regex die <shelly MQTT id> herausgefiltert werden kann, um diese in der json2value Funktion als Präfix zu verwenden.
So war mein Ansatz, der nicht funktioniert:
shellies/+/online:.* {\$EVENT =~ m,[\w\W]*?shellies\/(.*)\/[\w\W]*?online.*, ? json2nameValue(\$EVENT,"\${1}_") : undef }
Ziel:
Ein Übersichts MQTT2_DEVICE, das den Status aller Shellies zusätzlich zu den announce readings (funktioniert!) das reading "<shelly MQTT id>_online: true" enthält.
Fragen:
1. Funktioniert die MQTT Ebenen Variable "+"?
2. Enthält der $EVENT das "Ziel Topic"?
3. Ist das regex korrekt?
4. Ist es überhaupt möglich, oder wäre eine myUtils Prozedur mit einer Schleife über die MQTT2_DEVICE der geeignetere Ansatz?
Vielen Dank,
Gernot
Habe mich jetzt nicht intensiv eingedacht, aber erst mal als "Schubs": Es gibt die Variable $TOPIC (und noch ein paar mehr), die bei der Evaluierung einer Perl-Auswertung in readingList genutzt werden können (stehen afaik in der commandref zu M2_Device). gibt auch (wenige) Beispiele in der template-file, die das nutzen.
1. Nein, es handelt sich hier um ein Regexp, und nicht die primitive +# von MQTT
2. Nein, nur Message, wie das hier (https://fhem.de/commandref_modular.html#MQTT2_DEVICEattr) dokuementiert ist:
Zitatin the perl expression the variables $TOPIC, $NAME, $DEVICETOPIC $JSONMAP and $EVENT are available (the letter containing the whole message), as well as $EVTPART0, $EVTPART1, ... each containing a single word of the message.
3. vermutlich nicht, mir kommt im Perl-Ausdruck auch vieles als falsch vor. Ich wuerde Folgendes vorschlagen:
shellies/.*/online:.* { $TOPIC =~ m,shellies/(.*)/online, ? { $1 => $EVENT } : undef }
4. "überhaupt möglich" ist vmtl. falsch formuliert: theoretisch kann man in einem Perl-Einzeiler beliebig komplizierte Berechnungen implementieren. Ich rate nur aus praktischen Gruenden davor ab.
Der Weg mit weniger Bastelarbeit ist mAn die Anzeige per readingsGroup.
Vielen Dank @rudolfkoenig,
mit shellies/.*/online:.* { $TOPIC =~ m,shellies/(.*)/online, ? { $1."_online" => $EVENT } : undef }
hat's funktioniert.
lg
Gernot
P.S.: Für die, die es interessiert habe ich mal einen ersten Blick auf mein Ziel angehangen