Wenn ich das folgende DOIF über restart neu starte, dann schaltet es je nach Vorgabetemperatur richtig ein oder aus. Verändere ich die Vorgabetemperatur, dann schaltet nichts.
Das folgende list entstand nach einem restart:
Internals:
DEF (([[$SELF:HAn]-[$SELF:HEn]])
and
([$SELF:Ventil] eq "auf"))
## Wenn zwischen Anfangs- und Endzeit die Temperatur unter den
## Vorgabewert sinkt, wird die Heizung eingeschaltet.
(set Shelly_4.1_1 on)
DOELSE
## Wenn die Endzeit erreicht wird oder die Vorgabetemperatur
## überschritten wird die Heizung ausgeschaltet.
(set Shelly_4.1_1 off)
FUUID 5c42f42f-f33f-d4cb-e1c5-44bf9b5d5ff8e114
MODEL FHEM
NAME IHz
NR 64
NTFY_ORDER 50-IHz
STATE cmd_1
TYPE DOIF
VERSION 19786 2019-07-05 21:47:08
READINGS:
2019-07-30 18:08:43 HAn 06:15
2019-07-31 11:29:34 HEn 21:00
2019-07-31 11:28:40 Temp 26.0
2019-07-31 11:30:57 Ventil auf
2019-07-31 11:30:57 cmd 1
2019-07-31 11:30:57 cmd_event IHz
2019-07-31 11:30:57 cmd_nr 1
2019-07-31 11:30:57 e_IHz_Ventil auf
2019-07-31 11:27:41 mode enabled
2019-07-31 11:30:57 state cmd_1
2019-07-31 11:30:56 timer_01_c01 01.08.2019 06:15:00
2019-07-31 11:30:56 timer_02_c01 31.07.2019 21:00:00
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0 (::DOIF_time($hash,0,1,$wday,$hms)) and (::ReadingValDoIf($hash,'IHz','Ventil') eq "auf")
days:
devices:
0 IHz
all IHz
do:
0:
0 set Shelly_4.1_1 on
1:
0 set Shelly_4.1_1 off
helper:
event Ventil: auf
globalinit 1
last_timer 2
sleeptimer -1
timerdev IHz
timerevent Ventil: auf
triggerDev IHz
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: IHz
state: cmd_1
timerevents:
Ventil: auf
e_IHz_Ventil: auf
cmd_nr: 1
cmd: 1
cmd_event: IHz
cmd_1
Ventil: auf
timereventsState:
Ventil: auf
e_IHz_Ventil: auf
cmd_nr: 1
cmd: 1
cmd_event: IHz
cmd_1
Ventil: auf
triggerEvents:
Ventil: auf
e_IHz_Ventil: auf
cmd_nr: 1
cmd: 1
cmd_event: IHz
cmd_1
Ventil: auf
triggerEventsState:
Ventil: auf
e_IHz_Ventil: auf
cmd_nr: 1
cmd: 1
cmd_event: IHz
cmd_1
Ventil: auf
internals:
interval:
0 -1
1 0
intervalfunc:
itimer:
all IHz
localtime:
0 1564632900
1 1564599600
perlblock:
readings:
0 IHz:Ventil
all IHz:Ventil
realtime:
0 06:15:00
1 21:00:00
time:
0 [IHz:HAn]
1 [IHz:HEn]
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
triggertime:
1564599600:
localtime 1564599600
hash:
1564632900:
localtime 1564632900
hash:
uiState:
uiTable:
Attributes:
alias Ina Heizung
devStateIcon cmd_1:sani_heating@red:cmd_2 cmd_2:sani_heating@blue:cmd_1
do always
readingList HAn HEn Temp Ventil
room Heizung,Shelly
setList HAn:time HEn:time Temp:slider,18,0.1,26,1
verbose 5
webCmd HAn:HEn:Temp
webCmdLabel Anfang:Ende:Temperatur
widgetOverride devStateIcon:textField-long
und hier nach Veränderung der Vorgabetemperatur:
Internals:
DEF (([[$SELF:HAn]-[$SELF:HEn]])
and
([$SELF:Ventil] eq "auf"))
## Wenn zwischen Anfangs- und Endzeit die Temperatur unter den
## Vorgabewert sinkt, wird die Heizung eingeschaltet.
(set Shelly_4.1_1 on)
DOELSE
## Wenn die Endzeit erreicht wird oder die Vorgabetemperatur
## überschritten wird die Heizung ausgeschaltet.
(set Shelly_4.1_1 off)
FUUID 5c42f42f-f33f-d4cb-e1c5-44bf9b5d5ff8e114
MODEL FHEM
NAME IHz
NR 64
NTFY_ORDER 50-IHz
STATE cmd_1
TYPE DOIF
VERSION 19786 2019-07-05 21:47:08
READINGS:
2019-07-30 18:08:43 HAn 06:15
2019-07-31 11:29:34 HEn 21:00
2019-07-31 11:33:54 Temp 20.0
2019-07-31 11:33:54 Ventil zu
2019-07-31 11:30:57 cmd 1
2019-07-31 11:30:57 cmd_event IHz
2019-07-31 11:30:57 cmd_nr 1
2019-07-31 11:30:57 e_IHz_Ventil auf
2019-07-31 11:27:41 mode enabled
2019-07-31 11:30:57 state cmd_1
2019-07-31 11:30:56 timer_01_c01 01.08.2019 06:15:00
2019-07-31 11:30:56 timer_02_c01 31.07.2019 21:00:00
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0 (::DOIF_time($hash,0,1,$wday,$hms)) and (::ReadingValDoIf($hash,'IHz','Ventil') eq "auf")
days:
devices:
0 IHz
all IHz
do:
0:
0 set Shelly_4.1_1 on
1:
0 set Shelly_4.1_1 off
helper:
event Temp: 20.0
globalinit 1
last_timer 2
sleeptimer -1
timerdev IHz
timerevent Ventil: auf
triggerDev IHz
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: IHz
state: cmd_1
timerevents:
Ventil: auf
e_IHz_Ventil: auf
cmd_nr: 1
cmd: 1
cmd_event: IHz
cmd_1
Ventil: auf
timereventsState:
Ventil: auf
e_IHz_Ventil: auf
cmd_nr: 1
cmd: 1
cmd_event: IHz
cmd_1
Ventil: auf
triggerEvents:
Temp: 20.0
Ventil: zu
triggerEventsState:
Temp: 20.0
Ventil: zu
internals:
interval:
0 -1
1 0
intervalfunc:
itimer:
all IHz
localtime:
0 1564632900
1 1564599600
perlblock:
readings:
0 IHz:Ventil
all IHz:Ventil
realtime:
0 06:15:00
1 21:00:00
time:
0 [IHz:HAn]
1 [IHz:HEn]
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
triggertime:
1564599600:
localtime 1564599600
hash:
1564632900:
localtime 1564632900
hash:
uiState:
uiTable:
Attributes:
alias Ina Heizung
devStateIcon cmd_1:sani_heating@red:cmd_2 cmd_2:sani_heating@blue:cmd_1
do always
readingList HAn HEn Temp Ventil
room Heizung,Shelly
setList HAn:time HEn:time Temp:slider,18,0.1,26,1
verbose 5
webCmd HAn:HEn:Temp
webCmdLabel Anfang:Ende:Temperatur
widgetOverride devStateIcon:textField-long
triggerEvents und triggerEventsState haben sich geändert, d.h. die DOIF-Bedingung ist nicht mehr erfüllt, aber es bleibt trotzdem auf cmd_1.
Der gleiche Effekt ist bei umgekehrten Voraussetzungen, d.h. beim restart aus und Temperaturerhöhung.
Wer zeigt mir den Fehler bitte?
Wo wird denn die Temperatur abgefragt? Ich sehe nur Zeit und Ventil.
Die Temperatur wird wegen der Hysterese über ein threshold-device abgefragt, das das reading Ventil auf oder zu steuert. Wie die lists zeigen funktioniert das gut und ist schon über Monate bewährt.
Als triggerEvent kommt ja auch Ventil: zu
Ich glaube eben nicht, dass er ein Event für "Ventil zu" sieht. Das Reading wird doch aktualisiert:
Zitat2019-07-31 11:33:54 Temp 20.0
2019-07-31 11:33:54 Ventil zu
aber
Zitat2019-07-31 11:30:57 cmd_nr 1
2019-07-31 11:30:57 e_IHz_Ventil auf
und
Zitathelper:
event Temp: 20.0
globalinit 1
last_timer 2
sleeptimer -1
timerdev IHz
timerevent Ventil: auf
Schaltet er, wenn Du "setreading IHz Ventil zu" machst?
Ja, wenn ich den Befehl direkt eingebe, dann schaltet es.
Dann zeig mal bitte ein "list" von deinem THRESHOLD Device.
Internals:
DEF Prologue_158:temperature:0.2:IHz:Temp IHz|set IHz Ventil zu|set IHz Ventil auf|
FUUID 5c42f430-f33f-d4cb-1462-5866a451a17159c4
NAME IThr
NR 103
NTFY_ORDER 50-IThr
STATE Vorgabe: 20.3 Ist: 23.9
TYPE THRESHOLD
cmd1_gt set IHz Ventil zu
cmd2_lt set IHz Ventil auf
cmd_default 0
hysteresis 0.2
offset 0
sensor Prologue_158
sensor_reading temperature
target_reading Temp
target_sensor IHz
READINGS:
2019-07-31 11:33:54 cmd cmd1_gt
2019-08-01 17:30:23 desired_value 20.3
2019-07-31 11:30:54 mode external
2019-08-01 18:31:48 sensor_value 23.9
2019-08-01 18:31:48 state Vorgabe: 20.3 Ist: 23.9
2019-08-01 17:30:23 threshold_max 20.3
2019-08-01 17:30:23 threshold_min 20.1
Attributes:
number_format %.1f
room Heizung
state_cmd1_gt off
state_cmd2_lt on
state_format Vorgabe: _dv Ist: _s1v
Also... wenn ich richtig verstanden habe, steuert IHz:Temp das Setzen von IHz Ventil.
Ich vermute, dass der Mechanismus, der das Selbsttriggern vom DOIF unterdruckt, das Schalten bei Änderung von Temp ablehnt.
Zitat von: CommandRefStandardmäßig unterbindet das DOIF-Modul Selbsttriggerung. D. h. das Modul reagiert nicht auf Events, die es selbst direkt oder indirekt auslöst. Dadurch werden Endlosschleifen verhindert.
Das kann am besten @Damian erklären.
Versuch mal ein Timer hinzufügen: statt
|set IHz Ventil zu|set IHz Ventil auf|
|sleep 0.1;;set IHz Ventil zu|sleep 0.1;;set IHz Ventil auf|
Das mit dem Timer hat nichts gebracht. Jetzt schaltet das threshold-device nicht mal mehr das Ventil.
Ich glaube aber, Du hast recht mit der Schleife. Ich war nur zu ungeduldig und habe immer mit dem Schieberegler gespielt. Wie oben geschrieben, hat es ja schon länger funktioniert, wenn die gemessene Temperatur sich verändert hat.
Ich habe nur jetzt neue Aktoren für die Ventile und wollte es schnell testen. Vielleicht hilft Geduld. ;)
Es hat jetzt so wie gewünscht funktioniert.
Der Fehler lag bei mir und meiner Ungeduld. Wie von amenomade richtig festgestellt ist das eine Selbstttriggerung gewesen und konnte daher nicht funktionieren.
Vielen Dank amenomade. Dieser Absatz ist mir auch bei mehrmaligem Lesen nicht als relevant aufgefallen.
cu
Walter