[gelöst] Verständnisproblem beim Temperaturvergleich

Begonnen von bommel-bs, 13 Juli 2023, 15:41:26

Vorheriges Thema - Nächstes Thema

bommel-bs

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

betateilchen

vielleicht bei einem weiteren Vergleich eher mit DOELSEIF arbeiten anstatt mit DOELSE ?

(nur eine Vermutung, DOIF kommt mir nicht ins Haus)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Nobbynews

#2
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.

MadMax-FHEM

#3
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
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)

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

bommel-bs

Danke an alle,

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

Danke
Stefan