[gelöst]DOIF: Vergleichsoperator lt funktioniert nicht

Begonnen von Wiesenfreund, 14 November 2019, 08:08:11

Vorheriges Thema - Nächstes Thema

Wiesenfreund

Seit mehreren Wochen funktioniert bei mir ein DOIF nicht mehr richtig. Es wird eine Raumtemperatur gemessen und deren Wert soll im DOIF zu definierten Öffnungsständen von Fenstern führen. Das hat seit April funktioniert, jetzt nicht mehr. Verwendet wird:
Internals:
   DEF        ([MQTT2_GWH:tempOben] gt [$SELF:sollwert] and [MQTT2_GWH:tempOben] lt ([$SELF:sollwert]+1))
(set doif_GWH_FenstVerstOben oeffnung 25)

DOELSEIF([MQTT2_GWH:tempOben] ge ([$SELF:sollwert]+1) and [MQTT2_GWH:tempOben] lt ([$SELF:sollwert]+2))
(set doif_GWH_FenstVerstOben oeffnung 50)

DOELSEIF([MQTT2_GWH:tempOben] ge ([$SELF:sollwert]+2) and [MQTT2_GWH:tempOben] lt ([$SELF:sollwert]+3))
(set doif_GWH_FenstVerstOben oeffnung 75)

DOELSEIF([MQTT2_GWH:tempOben] ge ([$SELF:sollwert]+3))
(set doif_GWH_FenstVerstOben oeffnung 100)

DOELSEIF([MQTT2_GWH:tempOben] le [$SELF:sollwert])
(set doif_GWH_FenstVerstOben oeffnung 0)
   FUUID      5dcbb378-f33f-b67a-8606-a1af5fa721ed5136
   FVERSION   98_DOIF.pm:0.205000/2019-11-12
   MODEL      FHEM
   NAME       doif_GWH_FensterOben
   NOTIFYDEV  MQTT2_GWH,doif_GWH_FensterOben,global
   NR         263
   NTFY_ORDER 50-doif_GWH_FensterOben
   STATE      5.75°C Fenster 100% offen enabled
   TYPE       DOIF
   VERSION    20500 2019-11-12 17:54:48
   READINGS:
     2019-11-14 06:01:32   cmd             4
     2019-11-14 06:01:32   cmd_event       doif_GWH_FensterOben
     2019-11-14 06:01:32   cmd_nr          4
     2019-11-14 06:01:32   e_doif_GWH_FensterOben_sollwert 11
     2019-11-14 06:01:15   mode            enabled
     2019-11-14 06:01:32   sollwert        11
     2019-11-14 06:01:32   state           cmd_4
   Regex:
     accu:
     cond:
       MQTT2_GWH:
         0:
           tempOben   ^MQTT2_GWH$:^tempOben:
         1:
           tempOben   ^MQTT2_GWH$:^tempOben:
         2:
           tempOben   ^MQTT2_GWH$:^tempOben:
         3:
           tempOben   ^MQTT2_GWH$:^tempOben:
         4:
           tempOben   ^MQTT2_GWH$:^tempOben:
       doif_GWH_FensterOben:
         0:
           sollwert   ^doif_GWH_FensterOben$:^sollwert:
         1:
           sollwert   ^doif_GWH_FensterOben$:^sollwert:
         2:
           sollwert   ^doif_GWH_FensterOben$:^sollwert:
         3:
           sollwert   ^doif_GWH_FensterOben$:^sollwert:
         4:
           sollwert   ^doif_GWH_FensterOben$:^sollwert:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') gt ::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert') and ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') lt (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+1)
     1          ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') ge (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+1) and ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') lt (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+2)
     2          ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') ge (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+2) and ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') lt (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+3)
     3          ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') ge (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+3)
     4          ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') le ::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')
   do:
     0:
       0          set doif_GWH_FenstVerstOben oeffnung 25
     1:
       0          set doif_GWH_FenstVerstOben oeffnung 50
     2:
       0          set doif_GWH_FenstVerstOben oeffnung 75
     3:
       0          set doif_GWH_FenstVerstOben oeffnung 100
     4:
       0          set doif_GWH_FenstVerstOben oeffnung 0
     5:
   helper:
     DEVFILTER  ^global$|^doif_GWH_FensterOben$|^MQTT2_GWH$
     NOTIFYDEV  global|doif_GWH_FensterOben|MQTT2_GWH
     event      sollwert: 11
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   doif_GWH_FensterOben
     timerevent sollwert: 11
     triggerDev doif_GWH_FensterOben
     timerevents:
       sollwert: 11
       e_doif_GWH_FensterOben_sollwert: 11
     timereventsState:
       sollwert: 11
       e_doif_GWH_FensterOben_sollwert: 11
     triggerEvents:
       sollwert: 11
       e_doif_GWH_FensterOben_sollwert: 11
     triggerEventsState:
       sollwert: 11
       e_doif_GWH_FensterOben_sollwert: 11
   internals:
   readings:
     all         MQTT2_GWH:tempOben doif_GWH_FensterOben:sollwert
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   do         always
   event-on-change-reading .*
   group      Gewaechshaus
   icon       fts_window_2w_open_lr
   readingList sollwert
   room       GWH
   setList    sollwert:slider,0,1,50
   stateFormat [MQTT2_GWH:tempOben]°C Fenster [doif_GWH_FenstVerstOben:oeffnung]% offen [doif_GWH_FensterOben:mode]
   webCmd     sollwert


Bei Temperaturwerten kleiner als der Sollwert wird nicht auf oeffnung 0 gestellt. Bei Temperaturen größer dem Sollwert wird die oeffnung richtig gesteuert. Ich habe gestern das selbe DOIF auf einem Testsystem eingerichtet. Dort hat es zunächst richtig funktioniert, wie auf dem Produktivsystem. Nach einigen Stunden Laufzeit, in der Nacht, trat der Fehler in beiden Systemen auf.

Auf dem Testsystem habe ich im Zuge der Fehlersuche das DOIF mehrmals verändert, was dort dazu geführt hat, dass es zzt. funktioniert. Denselben Effekt hatte ich in den vergangenen Tagen auch auf dem Produktivsystem. Momentan kann ich den Fehler aber nicht beheben. Weder Neustart von fhem oder des Raspberry,  noch ein Löschen des Moduls und Neuanlage konnte den Fehler beheben. 

Aufgefallen ist mir, dass in den Readings die Temperatur, sie wird aus einem anderen Gerät (MQTT2) gelesen, nicht angezeigt wird. Manchmal -nicht reproduzierbar- wird das e-Reading aber auch angezeigt. Einen Einfluss auf den Fehler habe ich nicht bemerkt.

FHEM ist auf dem aktuellen Stand.
Ich kenne mich in fhem noch nicht so gut aus und wäre für jeden Hinweis dankbar.

Danke im Voraus, Eberhard
Raspberry 4 mit fhem, Raspberry 3 mit fhem (FS20-, MAX-Schnittstellen), RaspiMatic Raspberry 3B, HM und HMW-Geräte (Heizung, Wetterstation, Fensterkontakte), Shellys (Rollladen, MQTT), ESPEasy (Energiezähler, MQTT), MAX-Taster (CUL),  FS20 Taster  (CUL), Synology NAS (Mosquitto,Chat

MadMax-FHEM

Kann schon sein, dass es funktioniert hat wie du dachtest, dass es sollte...

ABER:

lt, gt, ... ist ein "Zeichenkettenvergleich"

Bei numerischen Werten: <, >, ==, ...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Wiesenfreund

Joachim, danke für die schnelle Antwort.
Verwende ich die für numerische Vergleiche vorgesehenen Operatoren, tauchen im log andauernd PERL Fehlermeldungen auf. Die Temperaturwerte kommen über MQTT (Mosquitto) herein. Ich ändere es aber trotzdem mal komplett ab und melde mich.

Gruß Eberhard
Raspberry 4 mit fhem, Raspberry 3 mit fhem (FS20-, MAX-Schnittstellen), RaspiMatic Raspberry 3B, HM und HMW-Geräte (Heizung, Wetterstation, Fensterkontakte), Shellys (Rollladen, MQTT), ESPEasy (Energiezähler, MQTT), MAX-Taster (CUL),  FS20 Taster  (CUL), Synology NAS (Mosquitto,Chat

Wiesenfreund

Ich habs umgestellt und es hat funktioniert. Aber zur Vorgeschichte: Ich hatte alles im April auf numerische Vergleichsoperatoren und ständig die PERL Fehlermeldungen. Dann umgestellt auf nicht numerischen Vergleich. Die Fehlermeldungen waren weg und es hat, wie gesagt bis vor wenigen Wochen funktioniert.

Ich lass es mal so und schau mal, ob der Fehler behoben ist. Das Problem war ja, dass z.B. gestern nach vergeblicher Fehlersuche das DOIF plötzlich wieder funktioniert hat.

Nochmals Danke,
Eberhard
Raspberry 4 mit fhem, Raspberry 3 mit fhem (FS20-, MAX-Schnittstellen), RaspiMatic Raspberry 3B, HM und HMW-Geräte (Heizung, Wetterstation, Fensterkontakte), Shellys (Rollladen, MQTT), ESPEasy (Energiezähler, MQTT), MAX-Taster (CUL),  FS20 Taster  (CUL), Synology NAS (Mosquitto,Chat

frank

schau dir mal die werte von den readings an. eventuell ist manchmal ein wert nicht numerisch.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Damian

Also

1) Du hast zwischendurch nicht numerische Werte drin, das solltest du mit dem Filteroperator eliminieren, z. B. [MQTT2_GWH:tempOben:d]

2) lt, gt  usw. funktionieren bei Zahlen nur, wenn sie die gleiche Stelligkeit haben: 03 lt 10 ist wahr, aber 3 lt 10 ist falsch, daher Zahlen immer mit <,> vergleichen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Wiesenfreund

Besten Dank für die Hinweise. Die Werte habe ich schon geprüft (mit MQTT.fx) , das sind definitiv Zahlen. Sollte ich weiter Probleme haben, baue ich den Filter <:d> noch ein.
Ich warte noch bis nächsten Morgen, dann werde ich sehen was los ist. Ich denke aber, dass mit der Umstellung auf numerische Operatoren alles im Lot ist. Ich finde auch keine Warnmeldungen.

Raspberry 4 mit fhem, Raspberry 3 mit fhem (FS20-, MAX-Schnittstellen), RaspiMatic Raspberry 3B, HM und HMW-Geräte (Heizung, Wetterstation, Fensterkontakte), Shellys (Rollladen, MQTT), ESPEasy (Energiezähler, MQTT), MAX-Taster (CUL),  FS20 Taster  (CUL), Synology NAS (Mosquitto,Chat

Wiesenfreund

#7
Danke an alle,
mein Fehler ist beseitig, DOIF läuft jetzt wieder durch. Der Paramter <:d> war nicht notwendig.
Raspberry 4 mit fhem, Raspberry 3 mit fhem (FS20-, MAX-Schnittstellen), RaspiMatic Raspberry 3B, HM und HMW-Geräte (Heizung, Wetterstation, Fensterkontakte), Shellys (Rollladen, MQTT), ESPEasy (Energiezähler, MQTT), MAX-Taster (CUL),  FS20 Taster  (CUL), Synology NAS (Mosquitto,Chat