[gelöst&gelernt]Hilfe bei erweiterten ReadingList Attribut Einträgen benötigt

Begonnen von supernova1963, 27 April 2020, 05:34:34

Vorheriges Thema - Nächstes Thema

supernova1963

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

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

1. Nein, es handelt sich hier um ein Regexp, und nicht die primitive +# von MQTT

2. Nein, nur Message, wie das hier 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.

supernova1963

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