[gelöst] Vergleich in einem Perl Ausdruck funktioniert nicht

Begonnen von franky08, 16 Februar 2014, 07:52:43

Vorheriges Thema - Nächstes Thema

franky08

Hallo, nachdem ich gestern schon etliche Stunden damit verbracht habe, folgendes notify zu erstellen:
myWS1080 {if (ReadingsVal("myWS1080","Wind-Dir","---")(>0.5<315.9) {fhem "set Wind_Symb_dummy 10"}}

komme ich nicht voran. Funktionieren tut das ganze, wenn ich nur auf >0.5 prüfe, dann liefert mir der dummy braf 10 nur der Vergleich (>0.5<315.9) oder (>=0.5 && <315.9) oder noch etliche Varianten, bringen keinen Erfolg. Habe mir im Perl Handbuch das ganze schon ein paar mal durchgelesen, komme aber irgendwie nicht weiter.

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Rince

Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

franky08

Danke, Rince auf den Beitrag bin ich bei der Suche im Forum auch schon gestossen. Aber leider werden hier keine numerischen Ausdrücke verglichen sondern Zeichenketten (Strings). Bei Uhrzeiten funktioniert das ganze auch, davon habe ich einige in meiner conf. Es geht im Prinzip nur um den Ausdruck (ReadingsVal)(>Zahl1 && <Zahl2) und da weis ich nicht, wie ich das ausdrücken kann.

VG
Frank
PS Vieleicht habe ich mich auch schon völlig in eine falsche Richtung verrannt und sehe den Wald vor lauter Bäumen nicht mehr  :o
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Puschel74

#3
Hallo,

du musst (ReadingsVal(Zahl1) < xxx) && (ReadingsVal(Zahl2) > yyy) vergleichen.
< und > ggf umdrehen und && durch || ersetzen - je nachdem was du brauchst.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Damian

Zitat von: Puschel74 am 16 Februar 2014, 09:05:07
Hallo,

du musst (ReadingsVal(Zahl1) < xxx) && (ReadingsVal(Zahl2) > yyy) vergleichen.
< und > ggf umdrehen und && durch || ersetzen - je nachdem was du brauchst.

Grüße

Da Frank die Zahl zwischen den beiden Werten haben will, ist hier "und" angesagt, also:

myWS1080 {if (ReadingsVal("myWS1080","Wind-Dir","---")>0.5 && ReadingsVal("myWS1080","Wind-Dir","---")<315.9) {fhem "set Wind_Symb_dummy 10"}}


oder etwas kürzer, wenn du IF ausprobieren willst (http://forum.fhem.de/index.php/topic,17895.msg118503.html#msg118503):


myWS1080 IF ([myWS1080:Wind-Dir]>0.5 && [myWS1080:Wind-Dir]<315.9) (set Wind_Symb_dummy 10)


Gruß

Damian


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rince

#5
Zitatkeine numerischen Ausdrücke verglichen sondern Zeichenketten (Strings).
Nicht wirklich von Bedeutung, bzw. wohl falsch!

(ReadingsVal("myWS1080","Wind-Dir","000") ist eine Zahl und ein Ausdruck gleichermaßen

Du kannst schreiben:
my $Windrichtung = (ReadingsVal("myWS1080","Wind-Dir","999")

$Windrichtung ist zunächst mal eine Variable!
Ob diese Variable nun ein numerischer Ausdruck ist, oder ein String, das entscheidest du selber!

Ob $Windrichtung eine Zahl oder ein Text ist, ist Perl egal. Es ist in diesem Fall, zumindest wenn du die --- gegen 999 austauscht, immer eine Zahl. Und drum darfst du sie auch einfach vergleichen mit <=>

Wäre es ein String, müßtest du z.b. statt < lt schreiben, less than. Dann würdest du einen String vergleichen wollen.


Aber in unserem Fall ist es eine Zahl, und bei Verwendung von <=> bleibt es das auch.

http://perl-6.de/tutorials/anfaenger/if-anweisung
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

Nachtrag:
Ich würde auch dringen raten, die --- nicht zu verwenden!
Mach eine Zahl, die keinen Sinn ergibt. 999 zum Beispiel.

Auch dann, wenn du Damians Code benutzt.

Warum?
Die --- sind das, was im Fehlerfall gemeldet wird.

Da du aber Zahlen vergleichst, geht das mit dem ---, was eine Zeichenkette ist, in die Hose. Perl wird dir keinen Fehler melden, sondern die --- in 0 umwandeln.

Du bekommst also eine reguläre Windrichtung von 0 Grad raus!

Woher willst du nun wissen, was 0 Grad gemessen oder --- zu 0 Grad umgewandelt ist?

Wenn du 999 nimmst, kannst du das mit if ($Windrichtung == 999) auffangen. Oder eben mit dem ReadingsVal, wenn dir das lieber ist.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

franky08

#7
@Damian
Die Variante 1 mit && hatte ich schon probiert und die läuft nicht, habe mir dann aus deinem Beitrag die 98_IF.pm kopiert und deine gepostete Variante funktioniert auf Anhieb.
Vielen Dank für die Denkanstöße, auch an Rince, wenn man ewig an einer Problemlösung klebt sieht man rechts und links nichts mehr.
Das mit numerischen Ausdrücken und Strings habe ich wohl falsch interpretiert ("Programmieren lernen mit Perl" hab ich durchforstet)

Vielen Dank
Frank

P.S. In Damians Code ist duch gar kein default vorgegeben
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Damian

#8
Zitat von: franky08 am 16 Februar 2014, 09:49:39
P.S. In Damians Code ist duch gar kein default vorgegeben

Ja, dafür liefert IF auch sinnvolle Fehlermeldungen bei nicht Existenz eines Devices oder Readings. Dass falsche Zahlen im Reading stehen, sollte nicht vorkommen und wenn ja, dann musst du solche Fälle gesondert berücksichtigen. Für alles Andere gibt es die Filteroption für Zahlen beim IF-Befehl.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF