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
Schau mal diesen Post Betateilchens Antwort an, ich glaube das ist genau was du suchst :)
http://forum.fhem.de/index.php/topic,20256.msg138012.html#msg138012
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
Hallo,
du musst (ReadingsVal(Zahl1) < xxx) && (ReadingsVal(Zahl2) > yyy) vergleichen.
< und > ggf umdrehen und && durch || ersetzen - je nachdem was du brauchst.
Grüße
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
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
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.
@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
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