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
vielleicht bei einem weiteren Vergleich eher mit DOELSEIF arbeiten anstatt mit DOELSE ?
(nur eine Vermutung, DOIF kommt mir nicht ins Haus)
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.
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
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.
Danke an alle,
ab und an sieht man den Wald vor lauter Bäumen nicht. Na klar muß das DOELSEIF heißen.
Danke
Stefan