FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: bommel-bs am 13 Juli 2023, 15:41:26

Titel: [gelöst] Verständnisproblem beim Temperaturvergleich
Beitrag von: bommel-bs am 13 Juli 2023, 15:41:26
Hallo,

ich möchte mit einem DOIF eine Variable setzen. Wenn die Temperatur über 27°C ist auf true und unter auf false. Zwieschen 18 und 22 Uhr ebenfalls auch auf false. Dafür habe ich folgendes DIOIF angelegt:

define di_hitze DOIF ( [18:30-22:00] ) (\
   set Hitze "false"\
)\
DOELSE ( [Temp_outside:temperature] > 27 ) (\
   set Hitze "true"\
)\
DOELSE ( [Temp_outside:temperature] < 27) (\
   set Hitze "false"\
)
attr di_hitze do always
attr di_hitze room 99_System
#   DEF        ( [18:30-22:00] ) (
#   set Hitze "false"
#)
#DOELSE ( [Temp_outside:temperature] > 27 ) (
#   set Hitze "true"
#)
#DOELSE ( [Temp_outside:temperature] < 27) (
#   set Hitze "false"
#)
#   FUUID      64ad9572-f33f-78f8-6158-8143e5a9e7fa19bd
#   MODEL      FHEM
#   NAME       di_hitze
#   NOTIFYDEV  global
#   NR         873
#   NTFY_ORDER 50-di_hitze
#   STATE      cmd_2
#   TYPE       DOIF
#   VERSION    27262 2023-02-21 19:36:39
#   eventCount 20
#   READINGS:
#     2023-07-13 15:32:19   cmd             2.2
#     2023-07-13 15:32:19   cmd_event       di_hitze
#     2023-07-13 15:32:19   cmd_nr          2
#     2023-07-13 15:32:19   cmd_seqnr       2
#     2023-07-13 12:04:19   mode            enabled
#     2023-07-13 15:32:19   state           cmd_2
#     2023-07-13 12:04:19   timer_01_c01    13.07.2023 18:30:00
#     2023-07-13 12:04:19   timer_02_c01    13.07.2023 22:00:00
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#   attr:
#     cmdState:
#     wait:
#     waitdel:
#   condition:
#     0           ::DOIF_time($hash,0,1,$wday,$hms)
#   days:
#   do:
#     0:
#       0              set Hitze "false"
#     1:
#       0           [Temp_outside:temperature] > 27
#       1              set Hitze "true"
#   helper:
#     NOTIFYDEV  global
#     globalinit 1
#     last_timer 2
#     sleeptimer -1
#     timerdev   
#     timerevent
#     timerevents
#     timereventsState
#     triggerDev
#   interval:
#     0          -1
#     1          0
#   intervalfunc:
#   localtime:
#     0          1689265800
#     1          1689278400
#   realtime:
#     0          18:30:00
#     1          22:00:00
#   time:
#     0          18:30:00
#     1          22:00:00
#   timeCond:
#     0          0
#     1          0
#   timer:
#     0          0
#     1          0
#   timers:
#     0           0  1
#   triggertime:
#     1689265800:
#       localtime  1689265800
#       hash:
#     1689278400:
#       localtime  1689278400
#       hash:
#   uiState:
#   uiTable:
#
setstate di_hitze cmd_2
setstate di_hitze 2023-07-13 15:32:19 cmd 2.2
setstate di_hitze 2023-07-13 15:32:19 cmd_event di_hitze
setstate di_hitze 2023-07-13 15:32:19 cmd_nr 2
setstate di_hitze 2023-07-13 15:32:19 cmd_seqnr 2
setstate di_hitze 2023-07-13 12:04:19 mode enabled
setstate di_hitze 2023-07-13 15:32:19 state cmd_2
setstate di_hitze 2023-07-13 12:04:19 timer_01_c01 13.07.2023 18:30:00
setstate di_hitze 2023-07-13 12:04:19 timer_02_c01 13.07.2023 22:00:00


Leider teht regelmäßig im Log
di_hitze:  22.9 > 27 : Unknown command 22.9, try help.
In der Ref finde ich folgendes Beispiel

define di_shutters DOIF ([sensor:brightness]>100 and [06:25-09:00|8] or [09:00|7]) (set shutters up) DOELSEIF ([sensor:brightness]<50) (set shutters down)
Hier wird ja auch eine Meßwert mit einer Zahl vergliechen.

Wenn ich es so umbaue
define di_hitze DOIF ( [18:30-22:00] or [Temp_outside:temperature] < 27) (\
   set Hitze "false"\
)\
DOELSE ( [Temp_outside:temperature] > 27 ) (\
   set Hitze "true"\
)\

attr di_hitze do always
attr di_hitze room 99_System
#   DEF        ( [18:30-22:00] or [Temp_outside:temperature] < 27) (
#   set Hitze "false"
#)
#DOELSE ( [Temp_outside:temperature] > 27 ) (
#   set Hitze "true"
#)
#
#   FUUID      64ad9572-f33f-78f8-6158-8143e5a9e7fa19bd
#   MODEL      FHEM
#   NAME       di_hitze
#   NOTIFYDEV  Temp_outside,global
#   NR         873
#   NTFY_ORDER 50-di_hitze
#   STATE      cmd_1
#   TYPE       DOIF
#   VERSION    27262 2023-02-21 19:36:39
#   eventCount 22
#   READINGS:
#     2023-07-13 15:39:08   cmd             1
#     2023-07-13 15:39:08   cmd_event       di_hitze
#     2023-07-13 15:39:08   cmd_nr          1
#     2023-07-13 15:39:05   mode            enabled
#     2023-07-13 15:39:08   state           cmd_1
#     2023-07-13 15:39:05   timer_01_c01    13.07.2023 18:30:00
#     2023-07-13 15:39:05   timer_02_c01    13.07.2023 22:00:00
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       Temp_outside:
#         0:
#           temperature ^Temp_outside$:^temperature:
#   attr:
#     cmdState:
#     wait:
#     waitdel:
#   condition:
#     0           ::DOIF_time($hash,0,1,$wday,$hms) or ::ReadingValDoIf($hash,'Temp_outside','temperature') < 27
#   days:
#   do:
#     0:
#       0              set Hitze "false"
#     1:
#       0           [Temp_outside:temperature] > 27
#       1              set Hitze "true"
#   helper:
#     NOTIFYDEV  Temp_outside,global
#     globalinit 1
#     last_timer 2
#     sleeptimer -1
#     timerdev   
#     timerevent
#     timerevents
#     timereventsState
#     triggerDev
#   interval:
#     0          -1
#     1          0
#   intervalfunc:
#   localtime:
#     0          1689265800
#     1          1689278400
#   readings:
#     all         Temp_outside:temperature
#   realtime:
#     0          18:30:00
#     1          22:00:00
#   time:
#     0          18:30:00
#     1          22:00:00
#   timeCond:
#     0          0
#     1          0
#   timer:
#     0          0
#     1          0
#   timers:
#     0           0  1
#   triggertime:
#     1689265800:
#       localtime  1689265800
#       hash:
#     1689278400:
#       localtime  1689278400
#       hash:
#   uiState:
#   uiTable:
#
setstate di_hitze cmd_1
setstate di_hitze 2023-07-13 15:39:08 cmd 1
setstate di_hitze 2023-07-13 15:39:08 cmd_event di_hitze
setstate di_hitze 2023-07-13 15:39:08 cmd_nr 1
setstate di_hitze 2023-07-13 15:39:05 mode enabled
setstate di_hitze 2023-07-13 15:39:08 state cmd_1
setstate di_hitze 2023-07-13 15:39:05 timer_01_c01 13.07.2023 18:30:00
setstate di_hitze 2023-07-13 15:39:05 timer_02_c01 13.07.2023 22:00:00

Kommt keine Fehlermeldung mehr.

Was ist bei der esten Version falsch?

Danke
Stefan
Titel: Aw: Verständnisproblem beim Temperaturvergleich
Beitrag von: betateilchen am 13 Juli 2023, 15:49:21
vielleicht bei einem weiteren Vergleich eher mit DOELSEIF arbeiten anstatt mit DOELSE ?

(nur eine Vermutung, DOIF kommt mir nicht ins Haus)
Titel: Aw: Verständnisproblem beim Temperaturvergleich
Beitrag von: Nobbynews am 13 Juli 2023, 15:53:04
Und was ist bei 27°C?
In der ersten Bedingung neben dem Vorschlag/Hinweis von @betateilchen den Vergleich von ">" auf ">=" abändern.
Oder aber je nach Geschmack den zweiten Vergleich auf "<=" abändern.
Titel: Aw: Verständnisproblem beim Temperaturvergleich
Beitrag von: MadMax-FHEM am 13 Juli 2023, 15:53:42
Wo anfangen, wo aufhören ;)

EDIT: gut einiges wurde ja bereits genannt... Ich leg noch ein paar drauf ;)

DOIF -> mache wenn

DOELSEIF -> wenn nicht aber

DOELSE -> mache wenn nicht(s passt) und da gibt es dann KEINE Bedingung mehr (siehe dein letzter Versuch)

2x DOELSE hintereinander? -> das ist Quatsch ;)

In dem von dir zitierten Beispiel:

DOIF ... DOELSEIF ... 8)


Eine Variable setzen?
set Hitze "false"/"true"
So setzt du ein Device Hitze auf "false" oder "true": was immer das soll? ;)

Eine Perl Variable müsstest du erst mal definieren, z.B.: my $Hitze
Dazu allerdings erst mal nach Perl gehen {PERL} (denke auch in DOIF so)...
EDIT: https://wiki.fhem.de/wiki/Klammerebenen

Allerdigs: was willst du dann mit dem Wert in einer Variablen?
Weil: "Fokus"/"Gültigkeit" der Variablen beachten!

Wenn du in einem Device ein Reading setzen willst (so als quasi "Variable"), dann: setreading Device Wert

Gruß, Joachim
Titel: Aw: Verständnisproblem beim Temperaturvergleich
Beitrag von: betateilchen am 13 Juli 2023, 15:56:36
Mal schauen, wer eine noch kompliziertere Antwort auf einen simplen Syntaxfehler findet.

Ich nehme mal mein Popcorn und setze mich auf mein Sofa, das könnte noch lustig werden.
Titel: Aw: Verständnisproblem beim Temperaturvergleich
Beitrag von: bommel-bs am 13 Juli 2023, 16:13:26
Danke an alle,

ab und an sieht man den Wald vor lauter Bäumen nicht. Na klar muß das DOELSEIF heißen.

Danke
Stefan