[GELÖST] DOIF mit "and" und "or" und Temperaturvergleich

Begonnen von Felix_86, 01 Juni 2019, 14:17:03

Vorheriges Thema - Nächstes Thema

Felix_86

Hallo zusammen,

bei dem schönen sonnigen Wetter verstehe ich (mal wieder) nicht, warum FHEM das tut, was es tut. Ich habe zuvor zahlreiche Threads durchsucht, die sich dem Thema DOIF mit "and" und "or" Kombinationen befassen. Leider habe ich keinen Hinweis gefunden, der mein Problem löst,

Also ich habe ein DOIF, dass die Zimmertemperatur überwachen soll. Liegt die Temperatur über 25 Grad möchte ich eine Info haben, liegt der Wert unter 15 Grad möchte ich auch eine Benachrichtigung haben. Bei allem dazwischen soll keine Info kommen.

Nun ist aktuell noch keine Temperatur über 25 Grad, dennoch werde ich informiert und ich verstehe nicht wieso.


Anbei ein List von dem DOIF:
Internals:
   DEF        (([Klima_Info_per_Telegram_Felix_iPhone:state] eq "ja") and ([Thermometer_DB:temperature]<7 or [Thermometer_BZ:temperature]<15 or [Thermometer_WZ:temperature]<15 or [Thermometer_SZ:temperature]<15 or [Thermometer_KU:temperature]<15))
({fhem("set Telegram message \@123456 [doif_Raumklima_Warnung:Device] meldet zu kalte Temperatur")})

DOELSEIF
(([Klima_Info_per_Telegram_Felix_iPhone:state] eq "ja") and ([Thermometer_DB:temperature]>25 or [Thermometer_BZ:temperature]>25 or [Thermometer_WZ:temperature]>25 or [Thermometer_SZ:temperature]>20 or [Thermometer_KU:temperature]>25))
({fhem("set Telegram message \@123456 [doif_Raumklima_Warnung:Device] meldet zu warme Temperatur")})

DOELSE
({fhem("set doif_Raumklima_Warnung initialize")})
   MODEL      FHEM
   NAME       doif_Raumklima_Warnung
   NR         294
   NTFY_ORDER 50-doif_Raumklima_Warnung
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2019-06-01 14:15:26   Device          Thermometer_BZ
     2019-06-01 14:15:26   cmd             2
     2019-06-01 14:15:26   cmd_event       Thermometer_BZ
     2019-06-01 14:15:26   cmd_nr          2
     2019-06-01 14:15:26   e_Thermometer_BZ_temperature 22.7
     2019-06-01 14:15:12   e_Thermometer_DB_temperature 22.2
     2019-06-01 14:07:46   e_Thermometer_KU_temperature 22.9
     2019-06-01 14:10:17   e_Thermometer_SZ_temperature 22.4
     2019-06-01 14:10:21   e_Thermometer_WZ_temperature 23.2
     2019-06-01 14:04:34   mode            enabled
     2019-06-01 14:15:26   state           cmd_2
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          (::ReadingValDoIf($hash,'Klima_Info_per_Telegram_Felix_iPhone','state') eq "ja") and (::ReadingValDoIf($hash,'Thermometer_DB','temperature')<7 or ::ReadingValDoIf($hash,'Thermometer_BZ','temperature')<15 or ::ReadingValDoIf($hash,'Thermometer_WZ','temperature')<15 or ::ReadingValDoIf($hash,'Thermometer_SZ','temperature')<15 or ::ReadingValDoIf($hash,'Thermometer_KU','temperature')<15)
     1          (::ReadingValDoIf($hash,'Klima_Info_per_Telegram_Felix_iPhone','state') eq "ja") and (::ReadingValDoIf($hash,'Thermometer_DB','temperature')>25 or ::ReadingValDoIf($hash,'Thermometer_BZ','temperature')>25 or ::ReadingValDoIf($hash,'Thermometer_WZ','temperature')>25 or ::ReadingValDoIf($hash,'Thermometer_SZ','temperature')>20 or ::ReadingValDoIf($hash,'Thermometer_KU','temperature')>25)
   devices:
     0           Klima_Info_per_Telegram_Felix_iPhone Thermometer_DB Thermometer_BZ Thermometer_WZ Thermometer_SZ Thermometer_KU
     1           Klima_Info_per_Telegram_Felix_iPhone Thermometer_DB Thermometer_BZ Thermometer_WZ Thermometer_SZ Thermometer_KU
     all         Klima_Info_per_Telegram_Felix_iPhone Thermometer_DB Thermometer_BZ Thermometer_WZ Thermometer_SZ Thermometer_KU
   do:
     0:
       0          {fhem("set Telegram message \@123456 [doif_Raumklima_Warnung:Device] meldet zu kalte Temperatur")}
     1:
       0          {fhem("set Telegram message \@123456 [doif_Raumklima_Warnung:Device] meldet zu warme Temperatur")}
     2:
       0          {set doif_Raumklima_Warnung initialize}
   helper:
     event      temperature: 22.7,T: 22.7 H: 55
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Thermometer_BZ
     timerevent temperature: 22.7,T: 22.7 H: 55
     triggerDev Thermometer_BZ
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: Thermometer_BZ
       state: cmd_2
     timerevents:
       temperature: 22.7
       T: 22.7 H: 55
     timereventsState:
       temperature: 22.7
       state: T: 22.7 H: 55
     triggerEvents:
       temperature: 22.7
       T: 22.7 H: 55
     triggerEventsState:
       temperature: 22.7
       state: T: 22.7 H: 55
   internals:
   itimer:
   readings:
     0           Klima_Info_per_Telegram_Felix_iPhone:state Thermometer_DB:temperature Thermometer_BZ:temperature Thermometer_WZ:temperature Thermometer_SZ:temperature Thermometer_KU:temperature
     1           Klima_Info_per_Telegram_Felix_iPhone:state Thermometer_DB:temperature Thermometer_BZ:temperature Thermometer_WZ:temperature Thermometer_SZ:temperature Thermometer_KU:temperature
     all         Klima_Info_per_Telegram_Felix_iPhone:state Thermometer_DB:temperature Thermometer_BZ:temperature Thermometer_WZ:temperature Thermometer_SZ:temperature Thermometer_KU:temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Doif
   verbose    3


Kann mir jemand sagen, wo hier der Fehler liegt? Warum wird immer cmd_2 ausgführt, obwohl keine Temperatur über 25 Grad liegt?

Vielen Dank im Voraus
Grüße von Felix

Pi3, Raspbian 11, FHEM 6.4, ca 315 Device
SIGNALduino (TCM, TX, IT, SD_GT), CUL (EM, FS20, HMS), JeeLink (PCA301), mailcheck, echodevice, alexa, TelegramBot, Weather (OWM), DWD_OpenData, FRITZBOX, TabletUI, Calendar, Abfall, Vitoconnect, LGTV_WebOS, Nina, MQTT2

mi.ke

Moin,
ich denke mal, Du muss bei Verwenudung von and und or Klammern verwenden, sondt wird's wirr

Also z.B.
[iPhone:state] eq "ja") and  (<7 or <15 or >17) (....)

Bin unterwegs, deshalb kurz
Hoffe das hilft Dir trotzdem

Cheers
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Felix_86

#2
Danke, aber genau das habe ich doch getan  :o Wie dem DEF zu entnehmen sein sollte.

Ich habe ein bisschen den Verdacht / die Vermutung, dass es am Vergleich der Kommazahl liegt
Grüße von Felix

Pi3, Raspbian 11, FHEM 6.4, ca 315 Device
SIGNALduino (TCM, TX, IT, SD_GT), CUL (EM, FS20, HMS), JeeLink (PCA301), mailcheck, echodevice, alexa, TelegramBot, Weather (OWM), DWD_OpenData, FRITZBOX, TabletUI, Calendar, Abfall, Vitoconnect, LGTV_WebOS, Nina, MQTT2

thgorjup

Hmm, sieht eigentlich ganz gut aus. Aber ich würde es trotzdem in eigene DOELSEIF ändern und auf jedenfall das "do always" rausnehmen, sonst bekommst du bei jeder Änderung eine Nachricht. Ohne das "do always" bekommst du nur Nachrichten, wenn sich der Status eines anderes Devices ändert.


define doif_Raumklima_Warnung DOIF ( [Klima_Info_per_Telegram_Felix_iPhone] eq "ja" && ([Thermometer_DB:temperature] < 7 ) ( set Telegram message \@123456 [Thermometer_DB:name] meldet [Thermometer_DB:temperature] °C )
DOELSEIF ( [Klima_Info_per_Telegram_Felix_iPhone] eq "ja" && ([Thermometer_BZ:temperature] < 15 ) ( set Telegram message \@123456 [Thermometer_BZ:name] meldet [Thermometer_BZ:temperature] °C )
...
...
 
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

amenomade

Das Problem:
- mit do always wirst Du bei jeder Änderung der Temperaturen benachrichtigt, so lange mind. ein Gerät unter (bzw. über) Limit ist
- ohne do always wirst Du nur beim ersten Thermostat unter Limit (bzw. über) benachrichtigt. Geht danach ein anderes unter Limit, kriegst Du nichts da der Zustand des DOIFs sich nicht mehr ändern.


Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

thgorjup

Zitat von: amenomade am 01 Juni 2019, 17:20:36
Das Problem:
- mit do always wirst Du bei jeder Änderung der Temperaturen benachrichtigt, so lange mind. ein Gerät unter (bzw. über) Limit ist
- ohne do always wirst Du nur beim ersten Thermostat unter Limit (bzw. über) benachrichtigt. Geht danach ein anderes unter Limit, kriegst Du nichts da der Zustand des DOIFs sich nicht mehr ändern.

Genau, deswegen ohne "do always" und in einzelne DOELSEIF trennen.
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

amenomade

Zitat von: thgorjup am 01 Juni 2019, 17:27:30
Genau, deswegen ohne "do always" und in einzelne DOELSEIF trennen.
Stimmt. Deine Trennung in einzelne DOELSEIF war aber nicht als Pflicht vorgestellt;)

Man könnte auch evtl. mit Aggregationsfunktionen des DOIFs arbeiten.

Übrigens: das DOELSE....  set initialize mache wenig Sinn. Ein einfaches lehres DOELSE reicht an der Stelle
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Felix_86

Zitat von: thgorjup am 01 Juni 2019, 16:54:56
Hmm, sieht eigentlich ganz gut aus.
Was soll das bedeuten? Dass FHEM hier richtig reagiert mit cmd_2, obwohl keine Temperatur über 25 Grad liegt? Oder dass das DOIF gut aussiehst und du ebenfalls nicht nachvollziehen kannst, warum cmd_2 gesetzt wird?

Zitat von: thgorjup am 01 Juni 2019, 16:54:56
Aber ich würde es trotzdem in eigene DOELSEIF ändern....

define doif_Raumklima_Warnung DOIF ( [Klima_Info_per_Telegram_Felix_iPhone] eq "ja" && ([Thermometer_DB:temperature] < 7 ) ( set Telegram message \@123456 [Thermometer_DB:name] meldet [Thermometer_DB:temperature] °C )
DOELSEIF ( [Klima_Info_per_Telegram_Felix_iPhone] eq "ja" && ([Thermometer_BZ:temperature] < 15 ) ( set Telegram message \@123456 [Thermometer_BZ:name] meldet [Thermometer_BZ:temperature] °C )
...
...


Ja, so sah das DOIF vorher auch aus, bevor ich die oben gepostete kurze Variante gebaut habe: 2x 5 DOELSEIF Statements zur Prüfung, ob die Temperatur über oder unter dem Schwellwert liegt. Dann hat man aber sehr schnell ein Flackern und bekommt zig Meldungen, z.B.:
- Thermometer_DB meldet 25.1 Grad -> DOIF cmd_1 verschickt eine Meldung
- Thermometer_BZ meldet 25.1 Grad -> DOIF cmd_2 verschickt eine Meldung
- Thermometer_DB meldet 25.2 Grad -> DOIF cmd_1 verschickt eine Meldung
- Thermometer_BZ meldet 25.2 Grad -> DOIF cmd_2 verschickt eine Meldung
.......
Das ist / war mir dann aber auch zu viel an Infos. Mir reicht es, wenn ich einmalig beim über- oder unterschreiten eine Meldung bekomme.

Zitat von: thgorjup am 01 Juni 2019, 16:54:56
.... und auf jedenfall das "do always" rausnehmen, sonst bekommst du bei jeder Änderung eine Nachricht. Ohne das "do always" bekommst du nur Nachrichten, wenn sich der Status eines anderes Devices ändert.

Was das "do always" hier bewirkt ist mir durchaus klar ;) Ich hatte es gestern für einen Test aktiviert. Primär bin ich irritiert, dass cmd_2 aktiviert wird, obwohl keine Temperatur über 25 Grad lag. Leider hatte ich vergessen / übersehen, dass "do always" zu entfernen, bevor ich hier das List gepostet habe. Ich sehe das "do always" hier allerdings nicht als Hauptproblem, denn aus meiner Sicht ist die Auswertung des DOIF falsch.

Zitat von: amenomade am 01 Juni 2019, 17:20:36
Das Problem:
- mit do always wirst Du bei jeder Änderung der Temperaturen benachrichtigt, so lange mind. ein Gerät unter (bzw. über) Limit ist
- ohne do always wirst Du nur beim ersten Thermostat unter Limit (bzw. über) benachrichtigt. Geht danach ein anderes unter Limit, kriegst Du nichts da der Zustand des DOIFs sich nicht mehr ändern.

Absolut korrekt. Ich hatte es gestern für einen Test aktiviert. Primär bin ich irritiert, dass cmd_2 aktiviert wird, obwohl keine Temperatur über 25 Grad lag. Leider hatte ich vergessen / übersehen, dass "do always" zu entfernen, bevor ich hier das List gepostet habe. Ich sehe das "do always" hier allerdings nicht als Hauptproblem, denn aus meiner Sicht ist die Auswertung des DOIF falsch.

Grüße von Felix

Pi3, Raspbian 11, FHEM 6.4, ca 315 Device
SIGNALduino (TCM, TX, IT, SD_GT), CUL (EM, FS20, HMS), JeeLink (PCA301), mailcheck, echodevice, alexa, TelegramBot, Weather (OWM), DWD_OpenData, FRITZBOX, TabletUI, Calendar, Abfall, Vitoconnect, LGTV_WebOS, Nina, MQTT2

amenomade

#8
ZitatPrimär bin ich irritiert, dass cmd_2 aktiviert wird, obwohl keine Temperatur über 25 Grad lag. Leider hatte ich vergessen / übersehen, dass "do always" zu entfernen, bevor ich hier das List gepostet habe. Ich sehe das "do always" hier allerdings nicht als Hauptproblem, denn aus meiner Sicht ist die Auswertung des DOIF falsch.
Aaah! Das war die Frage?!

Zitat von: Felix_86 am 01 Juni 2019, 14:17:03DOELSEIF
(([Klima_Info_per_Telegram_Felix_iPhone:state] eq "ja") and ([Thermometer_DB:temperature]>25 or [Thermometer_BZ:temperature]>25 or [Thermometer_WZ:temperature]>25 or [Thermometer_SZ:temperature]>20 or [Thermometer_KU:temperature]>25))
({fhem("set Telegram message \@123456 [doif_Raumklima_Warnung:Device] meldet zu warme Temperatur")})
...
2019-06-01 14:10:17   e_Thermometer_SZ_temperature 22.4

Übrigens: Du hast auch
Zitat von: Felix_86 am 01 Juni 2019, 14:17:03DEF        (([Klima_Info_per_Telegram_Felix_iPhone:state] eq "ja") and ([Thermometer_DB:temperature]<7 or [Thermometer_BZ:temperature]<15 or [Thermometer_WZ:temperature]<15 or [Thermometer_SZ:temperature]<15 or [Thermometer_KU:temperature]<15))
({fhem("set Telegram message \@123456 [doif_Raumklima_Warnung:Device] meldet zu kalte Temperatur")})
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Felix_86

Zitat von: amenomade am 02 Juni 2019, 15:13:26
Aaah! Das war die Frage?!
Ja, war es - schon seit Start des Threads
Zitat von: Felix_86 am 01 Juni 2019, 14:17:03Kann mir jemand sagen, wo hier der Fehler liegt? Warum wird immer cmd_2 ausgführt, obwohl keine Temperatur über 25 Grad liegt?

Vielen Dank. Klarer Vorteil, wenn man lesen kann  ::)

Zitat von: amenomade am 02 Juni 2019, 15:13:26
Übrigens: Du hast auch
Was soll das heißen?
War die Thermometer_DB kleiner als 7 Grad?
Grüße von Felix

Pi3, Raspbian 11, FHEM 6.4, ca 315 Device
SIGNALduino (TCM, TX, IT, SD_GT), CUL (EM, FS20, HMS), JeeLink (PCA301), mailcheck, echodevice, alexa, TelegramBot, Weather (OWM), DWD_OpenData, FRITZBOX, TabletUI, Calendar, Abfall, Vitoconnect, LGTV_WebOS, Nina, MQTT2

amenomade

Deine Anforderung
ZitatLiegt die Temperatur über 25 Grad möchte ich eine Info haben, liegt der Wert unter 15 Grad möchte ich auch eine Benachrichtigung haben.
Dein DOIF hat aber
- [Thermometer_SZ:temperature]>20
- [Thermometer_DB:temperature]<7

Was das heissen soll: bei diesen beiden Bedingungen wird es nicht die Anforderungen erfüllen. Mehr nicht
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus