Hauptmenü

FHEM - IF seltsames Verhalten

Begonnen von Billy, 10 Juni 2019, 16:05:14

Vorheriges Thema - Nächstes Thema

Billy

@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


FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

Damian

Am besten die Ursache eliminieren, vermutlich versuchst du im userReading eine negative Wurzel zu ziehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Billy

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.
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

Damian

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.

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

Per

Du kannst mittels davorliegendem (DO)IF die Fehlermeldung abfangen und die eigentliche Prozedur nur im Gut-Fall starten.