@Damian
Nachdem FHEM - IF auch von Damian programmiert wurde, erlaube ich mir mein kleines Problem hier reinzustellen.
Worum geht es?
Meine seit langem funktionierende Zisternen Zulaufsteuerung sieht so aus.
myZisterne:FstD.*
IF ([myZisterne:FstD] < 5000 and [Zulauf_Strg2] eq "deactivated") (
attr Zulauf_Strg2 disable 0, ,set Broker_Syn publish retain:1 fhem/status/alarm/Zisterne_Zulauf_Strg2 on
) ELSE ...........................
Im Klartext wenn der Füllstand "FstD" unter 5000 Liter fällt soll eine Nachfüllpumpe eingeschaltet werden.
Das klappt im Normalfall problemlos.
Nun zum Problem:
Den Füllstand berechne ich für die liegende Zisterne mit einem user reading wie folgt:
FstD:ANALOG_A0.* {sprintf("%.0f",0.207*((10000*acos((100-ReadingsNum($NAME,"WstD",0))/100))
+(sqrt(10000-(ReadingsNum($NAME,"WstD",0)-100)*(ReadingsNum($NAME,"WstD",0)-100)))*(ReadingsNum($NAME,"WstD",0)-100)));;}
Ab und zu kommt es jedoch vor, dass mein Drucksensor Werte liefert, die bei der Berechnung des Füllstandes zu Fehlern führt.
Im Log sieht das dann so aus.
2019-06-10_14:27:18 myZisterne Time: 2019-06-10T14:27:18
2019-06-10_14:27:18 myZisterne ANALOG_A0: 438
2019-06-10_14:27:18 myZisterne WstD: 146
2019-06-10_14:27:18 myZisterne FstD: 5086
2019-06-10_14:27:18 myZisterne Switch1: OFF
2019-06-10_14:47:18 myZisterne Time: 2019-06-10T14:47:18
2019-06-10_14:47:18 myZisterne ANALOG_A0: 653 --> falscher Wert führt zu einem Error bei FstD-Berechnung
2019-06-10_14:47:18 myZisterne WstD: 218
2019-06-10_14:47:18 myZisterne FstD: Error evaluating myZisterne userReading FstD: Can't take sqrt of -3924 at (eval 813898) line 1.
Die IF Bedingung von oben interpretiert den FstD: Error evaluating ... Wert jedoch als Wert < 5000 und startet somit die Nachlaufsteuerung. :'(
Was ist die Erklärung hierfür und wie kann man erreichen,dass FHEM IF in diesem Fall nur numerische Werte beachtet?
Billy
Am besten die Ursache eliminieren, vermutlich versuchst du im userReading eine negative Wurzel zu ziehen.
Du hast insofern recht, dass durch den falschen Sensorwert ein negativer Wert entsteht der die Fehlermedung ergibt.
Trotzdem hätte ich erwartet, dass das IF mit <> nur auf numerische Werte anspricht.
Dann muss ich halt falsche Sensorwerte im Vorfeld abfangen.
Zitat von: Billy am 10 Juni 2019, 16:40:26
Du hast insofern recht, dass durch den falschen Sensorwert ein negativer Wert entsteht der die Fehlermedung ergibt.
Trotzdem hätte ich erwartet, dass das IF mit <> nur auf numerische Werte anspricht.
Dann muss ich halt falsche Sensorwerte im Vorfeld abfangen.
IF ist nichts anders als ein Präprozessor für einen Perl-if - und der kann es auch nicht :)
Du kannst auch im IF nach Zahlen filtern, bringt dir aber auch nicht sehr viel, da in deiner Fehlermeldung auch (falsche) Zahlen vorkommen.
Du kannst mittels davorliegendem (DO)IF die Fehlermeldung abfangen und die eigentliche Prozedur nur im Gut-Fall starten.