DOIF: Fehler bei Interpretation numerischer Operatoren

Begonnen von Paul Panther, 13 Februar 2023, 10:06:53

Vorheriges Thema - Nächstes Thema

Paul Panther

Hallo! Als langjähriger Nutzer von FHEM habe ich einige Erfahrung sammeln dürfen, bin aber jetzt nach 3 Tagen Fehlersuche ratlos.
Nach Neuinstallation von FHEM bekomme ich zu folgendem, bislang funktionierendem DOIF

define Batteriestatus DOIF ([D1_Min_160_INA219_2:Mittelwert] >= 27.3)(set Batt_status state 100%) \
DOELSEIF ([D1_Min_160_INA219_2:Mittelwert] < 27.3 and [D1_Min_160_INA219_2:Mittelwert] >= 26)(set Batt_status state 50-100%) \
DOELSEIF ([D1_Min_160_INA219_2:Mittelwert] < 26 and [D1_Min_160_INA219_2:Mittelwert] >= 25.6)(set Batt_status state 33-50%) \
DOELSEIF ([D1_Min_160_INA219_2:Mittelwert] < 25.6)(set Batt_status state <33%) \
DOELSE
attr Batteriestatus room Controller->D1_Mini_160,PV Batteriespeicher

trotz vieler Alternativversuche folgende Fehlermeldung mit der ich überfordert bin:
2023.02.13 00:44:37 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 33189) line 1.
2023.02.13 00:44:37 3: eval: Batteriestatus: warning in condition c01
2023.02.13 00:44:37 1: stacktrace:
2023.02.13 00:44:37 1:     main::__ANON__                      called by (eval 33189) (1)
2023.02.13 00:44:37 1:     (eval)                              called by ./FHEM/98_DOIF.pm (2826)
2023.02.13 00:44:37 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (3170)
2023.02.13 00:44:37 1:     main::DOIF_Trigger                  called by ./FHEM/98_DOIF.pm (4433)
2023.02.13 00:44:37 1:     main::DOIF_Set                      called by fhem.pl (3971)
2023.02.13 00:44:37 1:     main::CallFn                        called by fhem.pl (1964)
2023.02.13 00:44:37 1:     main::DoSet                         called by fhem.pl (1996)
2023.02.13 00:44:37 1:     main::CommandSet                    called by fhem.pl (1276)
2023.02.13 00:44:37 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2848)
2023.02.13 00:44:37 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (1024)
2023.02.13 00:44:37 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (609)
2023.02.13 00:44:37 1:     main::FW_Read                       called by fhem.pl (3976)
2023.02.13 00:44:37 1:     main::CallFn                        called by fhem.pl (784)


Das zugrunde liegende Reading kommt von ESPEASY als normaler Wert "Voltage" und wird mittels Userreading modifiziert:
attr D1_Mini_160_INA219 userReadings Voltage-Mittelwert_10 {sprintf("%.2f",movingAverage("D1_Mini_160_INA219","Voltage",600))},
Spannung {sprintf("%.2f",ReadingsNum("D1_Mini_160_INA219","Voltage",0))}


Aber auch das direkt ankommende "Voltage"-Signal oder das vorstehende Userreading "Spannung" wird nicht als numerisch interpretiert.
Die Änderung der Operatoren >= zu ge oder > zu gt beseitigt zwar die Fehlermeldungen, aber das DOIF interpretiert die Logik falsch.

define Batteriestatus DOIF ([D1_Min_160_INA219:Voltage-Mittelwert_10] ge "27.3")(set Batt_status state 100%)
DOELSEIF ([D1_Min_160_INA219:Voltage-Mittelwert_10] gt "27.3" and [D1_Min_160_INA219:Voltage-Mittelwert_10] le "26")(set Batt_status state 50-100%)
DOELSEIF ([D1_Min_160_INA219:Voltage-Mittelwert_10] gt "26" and [D1_Min_160_INA219:Voltage-Mittelwert_10] le "25.6")(set Batt_status state 33-50%)
DOELSEIF ([D1_Min_160_INA219:Voltage-Mittelwert_10] gt "25.6")(set Batt_status state <33%)
DOELSE


Ich bin für jeden Hinweis dankbar!

yersinia

hast du mal :d versucht?
Zitatd - Der Buchstabe "d" ist ein Synonym für das Filtern nach Dezimalzahlen, es entspricht intern dem regulären Ausdruck "(-?\d+(\.\d+)?)". Ebenfalls lässt sich eine Dezimalzahl auf eine bestimmte Anzahl von Nachkommastellen runden. Dazu wird an das "d" eine Ziffer angehängt. Mit der Angabe d0 wird die Zahl auf ganze Zahlen gerundet.
https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen

define Batteriestatus DOIF ([D1_Min_160_INA219_2:Mittelwert:d] >= 27.3)(set Batt_status state 100%) \
DOELSEIF ([D1_Min_160_INA219_2:Mittelwert:d] < 27.3 and [D1_Min_160_INA219_2:Mittelwert:d] >= 26)(set Batt_status state 50-100%) \
DOELSEIF ([D1_Min_160_INA219_2:Mittelwert:d] < 26 and [D1_Min_160_INA219_2:Mittelwert:d] >= 25.6)(set Batt_status state 33-50%) \
DOELSEIF ([D1_Min_160_INA219_2:Mittelwert:d] < 25.6)(set Batt_status state <33%) \
DOELSE
attr Batteriestatus room Controller->D1_Mini_160,PV Batteriespeicher


ge bzw gt sind für string vergleiche => https://en.perlzemi.com/blog/20080318120585.html
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Damian

Die Warnung ist eindeutig:

Zitat2023.02.13 00:44:37 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 33189) line 1.
2023.02.13 00:44:37 3: eval: Batteriestatus: warning in condition c01

bedeutet:

[D1_Min_160_INA219_2:Mittelwert] ist leer, vermutlich weil das Reading nicht existiert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

yersinia

guter Hinweis, wenn man richtig hinschaut:
D1_Min_160_INA219_2
vs
D1_Mini_160_INA219

Wenn das Device richtig ist, müsste das DOIF leicht angepasst
define Batteriestatus DOIF ([D1_Mini_160_INA219:Mittelwert:d] >= 27.3)(set Batt_status state 100%) \
DOELSEIF ([D1_Mini_160_INA219:Mittelwert:d] < 27.3 and [D1_Mini_160_INA219:Mittelwert:d] >= 26)(set Batt_status state 50-100%) \
DOELSEIF ([D1_Mini_160_INA219:Mittelwert:d] < 26 and [D1_Mini_160_INA219:Mittelwert:d] >= 25.6)(set Batt_status state 33-50%) \
DOELSEIF ([D1_Mini_160_INA219:Mittelwert:d] < 25.6)(set Batt_status state <33%) \
DOELSE
attr Batteriestatus room Controller->D1_Mini_160,PV Batteriespeicher

funktionieren.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Paul Panther

Vielen Dank an die schnellen Rückmeldungen!
Zunächst muss ich Asche auf mein Haupt streuen, da ich versehentlich von den vielen ausprobierten Codes die falschen zusammengestellt habe :-((
Hier jetzt die richtigen aus der fhem.cfg:
define D1_Mini_160_INA219 ESPEasy 10.10.10.160 80 espbridge4 D1_Mini_160_INA219
setuuid D1_Mini_160_INA219 63ea04f1-f33f-04e2-e546-0467e65d12143ed5
attr D1_Mini_160_INA219 IODev espbridge4
attr D1_Mini_160_INA219 Interval 700
attr D1_Mini_160_INA219 group ESPEasy Device
attr D1_Mini_160_INA219 icon measure_voltage
attr D1_Mini_160_INA219 presenceCheck 1
attr D1_Mini_160_INA219 readingSwitchText 1
attr D1_Mini_160_INA219 room Controller->D1_Mini_160,PV Batteriespeicher
attr D1_Mini_160_INA219 setState 7
attr D1_Mini_160_INA219 userReadings Voltage-Mittelwert_10 {sprintf("%.2f",movingAverage("D1_Mini_160_INA219","Voltage",600))},
Spannung {sprintf("%.2f",ReadingsNum("D1_Mini_160_INA219","Voltage",0))}


define Batteriestatus DOIF ([D1_Min_160_INA219:Voltage-Mittelwert_10:d1] >= 27.3)(set Batt_status state 100%)\
DOELSEIF ([D1_Min_160_INA219:Voltage-Mittelwert_10:d1] < 27.3 and [D1_Min_160_INA219:Voltage-Mittelwert_10:d1] >= 26)(set Batt_status state 50-100%)\
DOELSEIF ([D1_Min_160_INA219:Voltage-Mittelwert_10:d1] < 26 and [D1_Min_160_INA219:Voltage-Mittelwert_10:d1] >= 25.6)(set Batt_status state 33-50%)\
DOELSEIF ([D1_Min_160_INA219:Voltage-Mittelwert_10:d1] < 25.6)(set Batt_status state <33%) \
DOELSE
setuuid Batteriestatus 63e55153-f33f-04e2-e185-b68869228cc54380
attr Batteriestatus room Controller->D1_Mini_160,PV Batteriespeicher


Hatte aber schon die richtigen Readings jeweils gesetzt.
Habe auch zuvor schon und jetzt wieder auch :d bzw. :d1 versucht, negativ.
Das mit den String-Operatoren ist mir weitgehend bewusst. Seltsamerweise bekomme ich dann keine Fehlermeldungen mehr.
Also kann der movingAverage-Wert "Voltage-Mittelwert_10" (oben ohne _10) und auch der zugrunde liegend "Voltage"-Wert wohl nicht numerisch sein.
Hab's auch mit dem UserReading "Spannung" versucht, immer diesselben Fehlermeldungen....

@ Damian: die movingAverage-Readings kommen sauber im Log, auch in den Graphs.

Leider kommen mit den obigen Codes bei "set Batteriestatus checkall" immer noch die Fehlermeldungen im Logfile:

2023-02-13_18:01:45 Logfile clear
2023.02.13 18:16:09 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 18460) line 1.
2023.02.13 18:16:09 3: eval: Batteriestatus: warning in condition c01
2023.02.13 18:16:09 1: stacktrace:
2023.02.13 18:16:09 1:     main::__ANON__                      called by (eval 18460) (1)
2023.02.13 18:16:09 1:     (eval)                              called by ./FHEM/98_DOIF.pm (2826)
2023.02.13 18:16:09 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (3170)
2023.02.13 18:16:09 1:     main::DOIF_Trigger                  called by ./FHEM/98_DOIF.pm (4433)
2023.02.13 18:16:09 1:     main::DOIF_Set                      called by fhem.pl (3971)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (1964)
2023.02.13 18:16:09 1:     main::DoSet                         called by fhem.pl (1996)
2023.02.13 18:16:09 1:     main::CommandSet                    called by fhem.pl (1276)
2023.02.13 18:16:09 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2848)
2023.02.13 18:16:09 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (1024)
2023.02.13 18:16:09 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (609)
2023.02.13 18:16:09 1:     main::FW_Read                       called by fhem.pl (3976)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (784)
2023.02.13 18:16:09 1: PERL WARNING: Argument "" isn't numeric in numeric lt (<) at (eval 18461) line 1.
2023.02.13 18:16:09 3: eval: Batteriestatus: warning in condition c02
2023.02.13 18:16:09 1: stacktrace:
2023.02.13 18:16:09 1:     main::__ANON__                      called by (eval 18461) (1)
2023.02.13 18:16:09 1:     (eval)                              called by ./FHEM/98_DOIF.pm (2826)
2023.02.13 18:16:09 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (3170)
2023.02.13 18:16:09 1:     main::DOIF_Trigger                  called by ./FHEM/98_DOIF.pm (4433)
2023.02.13 18:16:09 1:     main::DOIF_Set                      called by fhem.pl (3971)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (1964)
2023.02.13 18:16:09 1:     main::DoSet                         called by fhem.pl (1996)
2023.02.13 18:16:09 1:     main::CommandSet                    called by fhem.pl (1276)
2023.02.13 18:16:09 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2848)
2023.02.13 18:16:09 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (1024)
2023.02.13 18:16:09 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (609)
2023.02.13 18:16:09 1:     main::FW_Read                       called by fhem.pl (3976)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (784)
2023.02.13 18:16:09 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 18461) line 1.
2023.02.13 18:16:09 3: eval: Batteriestatus: warning in condition c02
2023.02.13 18:16:09 1: stacktrace:
2023.02.13 18:16:09 1:     main::__ANON__                      called by (eval 18461) (1)
2023.02.13 18:16:09 1:     (eval)                              called by ./FHEM/98_DOIF.pm (2826)
2023.02.13 18:16:09 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (3170)
2023.02.13 18:16:09 1:     main::DOIF_Trigger                  called by ./FHEM/98_DOIF.pm (4433)
2023.02.13 18:16:09 1:     main::DOIF_Set                      called by fhem.pl (3971)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (1964)
2023.02.13 18:16:09 1:     main::DoSet                         called by fhem.pl (1996)
2023.02.13 18:16:09 1:     main::CommandSet                    called by fhem.pl (1276)
2023.02.13 18:16:09 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2848)
2023.02.13 18:16:09 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (1024)
2023.02.13 18:16:09 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (609)
2023.02.13 18:16:09 1:     main::FW_Read                       called by fhem.pl (3976)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (784)
2023.02.13 18:16:09 1: PERL WARNING: Argument "" isn't numeric in numeric lt (<) at (eval 18462) line 1.
2023.02.13 18:16:09 3: eval: Batteriestatus: warning in condition c03
2023.02.13 18:16:09 1: stacktrace:
2023.02.13 18:16:09 1:     main::__ANON__                      called by (eval 18462) (1)
2023.02.13 18:16:09 1:     (eval)                              called by ./FHEM/98_DOIF.pm (2826)
2023.02.13 18:16:09 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (3170)
2023.02.13 18:16:09 1:     main::DOIF_Trigger                  called by ./FHEM/98_DOIF.pm (4433)
2023.02.13 18:16:09 1:     main::DOIF_Set                      called by fhem.pl (3971)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (1964)
2023.02.13 18:16:09 1:     main::DoSet                         called by fhem.pl (1996)
2023.02.13 18:16:09 1:     main::CommandSet                    called by fhem.pl (1276)
2023.02.13 18:16:09 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2848)
2023.02.13 18:16:09 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (1024)
2023.02.13 18:16:09 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (609)
2023.02.13 18:16:09 1:     main::FW_Read                       called by fhem.pl (3976)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (784)
2023.02.13 18:16:09 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 18462) line 1.
2023.02.13 18:16:09 3: eval: Batteriestatus: warning in condition c03
2023.02.13 18:16:09 1: stacktrace:
2023.02.13 18:16:09 1:     main::__ANON__                      called by (eval 18462) (1)
2023.02.13 18:16:09 1:     (eval)                              called by ./FHEM/98_DOIF.pm (2826)
2023.02.13 18:16:09 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (3170)
2023.02.13 18:16:09 1:     main::DOIF_Trigger                  called by ./FHEM/98_DOIF.pm (4433)
2023.02.13 18:16:09 1:     main::DOIF_Set                      called by fhem.pl (3971)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (1964)
2023.02.13 18:16:09 1:     main::DoSet                         called by fhem.pl (1996)
2023.02.13 18:16:09 1:     main::CommandSet                    called by fhem.pl (1276)
2023.02.13 18:16:09 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2848)
2023.02.13 18:16:09 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (1024)
2023.02.13 18:16:09 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (609)
2023.02.13 18:16:09 1:     main::FW_Read                       called by fhem.pl (3976)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (784)
2023.02.13 18:16:09 1: PERL WARNING: Argument "" isn't numeric in numeric lt (<) at (eval 18463) line 1.
2023.02.13 18:16:09 3: eval: Batteriestatus: warning in condition c04
2023.02.13 18:16:09 1: stacktrace:
2023.02.13 18:16:09 1:     main::__ANON__                      called by (eval 18463) (1)
2023.02.13 18:16:09 1:     (eval)                              called by ./FHEM/98_DOIF.pm (2826)
2023.02.13 18:16:09 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (3170)
2023.02.13 18:16:09 1:     main::DOIF_Trigger                  called by ./FHEM/98_DOIF.pm (4433)
2023.02.13 18:16:09 1:     main::DOIF_Set                      called by fhem.pl (3971)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (1964)
2023.02.13 18:16:09 1:     main::DoSet                         called by fhem.pl (1996)
2023.02.13 18:16:09 1:     main::CommandSet                    called by fhem.pl (1276)
2023.02.13 18:16:09 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2848)
2023.02.13 18:16:09 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (1024)
2023.02.13 18:16:09 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (609)
2023.02.13 18:16:09 1:     main::FW_Read                       called by fhem.pl (3976)
2023.02.13 18:16:09 1:     main::CallFn                        called by fhem.pl (784)


Gibt's noch weitere Hinweise?

yersinia

Wenn das nun wirklich die richtigen Auszüge sind und das DOIF zum gezeigten ESPEasy Device gehören soll, dann hat das DOIF Device immernoch einen typo - das i fehlt im Devicenamen:
D1_Mini_160_INA219
vs
D1_Min_160_INA219
Ich würde erstmal hier nochmal genauer hinschauen.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Paul Panther

yersinia, allerbesten Dank!
Ich mag es fast nicht glauben, aber das war's!
Shame on me...