Filter per perl if für subscribeReading_.*

Begonnen von meyerhavener, 30 November 2019, 17:39:33

Vorheriges Thema - Nächstes Thema

meyerhavener

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  :)



OdfFhem

@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.

meyerhavener

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.

OdfFhem

@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:

  • Dein Attribut subscribeReading_state muss vorher gelöscht werden, da ein Topic nur eindeutig verarbeitet werden kann.
  • Ist das Attribut subscribeReading_testVALUE bereits vorhanden und Du willst einen anderen Perl-expression verwenden, musst Du unbedingt das Attribut löschen und mit dem veränderten Perl-expression neu anlegen.
  • Das Reading testEPOCH sollte sich bei jedem Wert gesetzt werden; das Reading testVALUE nur, falls der Wert 1000 empfangen wurde.

meyerhavener

@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 :)