FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: meyerhavener am 30 November 2019, 17:39:33

Titel: Filter per perl if für subscribeReading_.*
Beitrag von: meyerhavener am 30 November 2019, 17:39:33
Hallo liebe FHEM-Gemeinde

für mein ein aktuelles Projekt möchte ich gerne in einem MQTT_DEVICE die $message aus einem subscribeReading_.* filtern.

Hierzu hat mich folgender Eintrag der Commandref auf die richtige Fährte gebracht, jedoch scheitert es an meinen mangelnden Perl-Kenntnissen:
Zitat
attr <name> subscribeReading_<reading> [{Perl-expression}] [qos:?] [retain:?] <topic>
mapps a reading to a specific topic. The reading is updated whenever a message to the configured topic arrives.
QOS and ratain can be optionally defined for this topic.
Furthermore, a Perl statement can be provided which is executed when the message is received. The following variables are available for the expression: $hash, $name, $topic, $message. Return value decides whether reading is set (true (e.g., 1) or undef) or discarded (false (e.g., 0)).

Ziel ist es nur bestimmte Werte in das state Reading zu schreiben. In diesem Beispiel den Wert 1000.

Folgende Ansätze habe ich bereits probiert:


attr SZ_bedlamp2 subscribeReading_state { if ($message ne "1000") {return $0} } WO_WUL/funkRX
attr SZ_bedlamp2 subscribeReading_state { return $0 if $message ne "1000";} WO_WUL/funkRX


Vielleicht hat jemand von euch einen Tipp für mich  :)


Titel: Antw:Filter per perl if für subscribeReading_.*
Beitrag von: OdfFhem am 30 November 2019, 23:34:56
@meyerhavener

Laut Zitat sollte der Perl-expression 0 oder 1 zurückgeben.

Sofern die Annahmen zu topic und $message stimmen, muss $0 vermutlich nur durch 0 ersetzt werden.
Titel: Antw:Filter per perl if für subscribeReading_.*
Beitrag von: meyerhavener am 01 Dezember 2019, 09:45:55
Hallo oldfhem,

Danke für die schnelle Antwort :) Aber das habe ich auch schon vergeblich versucht. Also 0 $0 oder "0".
Ich bin mir auch sicher,dass es an dem Return liegt. Habe auch schon "1" eq "1" abgefragt ohne Erfolg.
Titel: Antw:Filter per perl if für subscribeReading_.*
Beitrag von: OdfFhem am 02 Dezember 2019, 13:17:54
@meyerhavener

Irgendwie interessierte mich diese Variante auch und habe ein wenig herumprobiert. Aufgefallen ist mir dann irgendwann, dass der Perl-expression nur bei der Neuanlage eines Attributes übernommen wird. Nach dieser "überraschenden" Erkenntnis hatte ich recht schnell ein Test-Szenario:

In Deinem Fall könnte Folgendes zum Testen hilfreich sein:

attr SZ_bedlamp2 subscribeReading_testVALUE { my $t = time;; fhem("setreading SZ_bedlamp2 testEPOCH $t");; return (($message eq "1000")?1:0);; } WO_WUL/funkRX


Für Deine Testläufe wichtig:
Titel: Antw:Filter per perl if für subscribeReading_.*
Beitrag von: meyerhavener am 03 Dezember 2019, 20:37:16
@oldfhem

Tausend Dank an dich :)
Das war die richtige Information bzgl. der Neuanlage. Aber ebenso hast du mir damit weiteres Verständnis bzgl. der doppelten ; gegeben.
Nur noch einmal für mich zur Klärung: Ein Semikolon ist für den PERL-Befehl und das weitere ist dazu da eine neue Befehlszeile einzuleiten?

Was nun auf jeden Fall für mich funktioniert und praktikabel ist, ist folgender Code:

attr SZ_bedlamp2 subscribeReading_state{return ((($message eq "123456")||($message eq "456789"))?1:0);; } WO_WUL/funkRX


Ich werde es, um weiter zu lernen, auch noch einmal mit meinen Ansätzen zur if Abfrage probieren.
Aber momentan bin ich erst einmal super happy :)