Hallo Zusammen,
ich möchte mit einem DOIF "Heizung.Wochenprogramm" meine Heizung an- oder ausschalten. In einem anderen DOIF "Heizung.Pause" möchte ich festlegen wann die Heizung pausieren soll. ""Heizung.Wochenprogramm" reagiert auf den Status von "Heizung.Pause" und schaltet die Heizung entsprechend ein oder aus. Wenn die Zeiten gestellt sind, und z.B. bei "Heizung.Pause" Pause Beginn erreicht wird, schaltet der Status auf deaktiviert und "Heizung.Wochenprogramm" schaltet die Heizung entsprechend aus. Wenn ich jedoch innerhalb der definierten Pausenzeit die Pause von on auf off schalte, was bewirkt dass der Status von "Heizung.Pause" auf "aktiviert" gesetzt wird, dann reagiert "Heizung.Wochenprogramm" genau anders herum.
Ich hoffe dass war nicht zu kompliziert ausgedrückt.
Hier die Definitionen:
Internals:
DEF ([Heizung.Pause] eq "deaktiviert") (
set TestLampe on
)
DOELSEIF ([Heizung.Pause] eq "aktiviert") (
set TestLampe off
)
MODEL FHEM
NAME Heizung.Wochenprogramm
NR 47
NTFY_ORDER 50-DOIF_Heizung.Betriebsart
STATE cmd_2
TYPE DOIF
OLDREADINGS:
READINGS:
2018-10-08 20:53:51 Device Heizung.Pause
2018-10-08 20:43:27 P_mybutton on
2018-10-06 18:20:34 P_pauseButton off
2018-10-06 17:51:02 P_pauseTimer_01 12:00
2018-10-07 21:48:16 P_pauseTimer_02 21:55
2018-10-06 17:50:28 P_timer_01 05:30
2018-10-06 17:50:39 P_timer_02 08:00
2018-10-07 22:32:33 P_timer_03 22:00
2018-10-08 20:53:51 cmd 2
2018-10-08 20:53:51 cmd_event Heizung.Pause
2018-10-08 20:53:51 cmd_nr 2
2018-10-08 20:53:51 e_Heizung.Pause_STATE aktiviert
2018-10-08 20:50:28 mode enabled
2018-10-08 20:53:51 state cmd_2
Regex:
condition:
0 InternalDoIf($hash,'Heizung.Pause','STATE') eq "deaktiviert"
1 InternalDoIf($hash,'Heizung.Pause','STATE') eq "aktiviert"
devices:
0 Heizung.Pause
1 Heizung.Pause
all Heizung.Pause
do:
0:
0 set TestLampe on
1:
0 set TestLampe off
2:
helper:
DOIF_Readings_events
DOIF_eventas
event P_mybutton: off
globalinit 1
last_timer 0
sleeptimer -1
timerdev Heizung.Pause
timerevent P_mybutton: off
triggerDev Heizung.Pause
timerevents:
P_mybutton: off
e_Heizung.Pause_P_mybutton: off
Device: Heizung.Pause
cmd_nr: 2
cmd: 2
cmd_event: Heizung.Pause
deaktiviert
timereventsState:
P_mybutton: off
e_Heizung.Pause_P_mybutton: off
Device: Heizung.Pause
cmd_nr: 2
cmd: 2
cmd_event: Heizung.Pause
deaktiviert
triggerEvents:
P_mybutton: off
e_Heizung.Pause_P_mybutton: off
Device: Heizung.Pause
cmd_nr: 2
cmd: 2
cmd_event: Heizung.Pause
deaktiviert
triggerEventsState:
P_mybutton: off
e_Heizung.Pause_P_mybutton: off
Device: Heizung.Pause
cmd_nr: 2
cmd: 2
cmd_event: Heizung.Pause
deaktiviert
internals:
0 Heizung.Pause:STATE
1 Heizung.Pause:STATE
all Heizung.Pause:STATE
itimer:
readings:
trigger:
uiState:
uiTable:
Attributes:
group Heizung
readingList P_mybutton P_timer_01 P_timer_02 P_timer_03
room 00_Kontrollzentrum
setList P_mybutton:on,off P_timer_01:time P_timer_02:time P_timer_03:time
webCmd P_mybutton:P_timer_01:P_timer_02:P_timer_03
webCmdLabel Heizungsprogramm
:--An-Arbeit
:--An-Wochenende
:--Aus
Internals:
CFGFN
DEF ([$SELF:P_mybutton] eq "on" and [[$SELF:P_timer_01]-[$SELF:P_timer_02]]) ()
DOELSE ()
MODEL FHEM
NAME Heizung.Pause
NR 3914
NTFY_ORDER 50-Heizung.Pause
STATE deaktiviert
TYPE DOIF
READINGS:
2018-10-08 20:53:51 Device Heizung.Pause
2018-10-08 20:53:51 P_mybutton off
2018-10-08 20:46:05 P_timer_01 20:47
2018-10-08 20:50:52 P_timer_02 21:50
2018-10-08 20:53:51 cmd 2
2018-10-08 20:53:51 cmd_event Heizung.Pause
2018-10-08 20:53:51 cmd_nr 2
2018-10-08 20:53:51 e_Heizung.Pause_P_mybutton off
2018-10-07 22:19:37 mode enabled
2018-10-08 20:53:51 state deaktiviert
2018-10-08 20:50:00 timer_01_c01 09.10.2018 20:47:00
2018-10-08 20:50:52 timer_02_c01 08.10.2018 21:50:00
Regex:
condition:
0 ReadingValDoIf($hash,'Heizung.Pause','P_mybutton') eq "on" and DOIF_time($hash,0,1,$wday,$hms)
days:
devices:
0 Heizung.Pause
all Heizung.Pause
do:
0:
0
1:
0
helper:
DOIF_Readings_events
DOIF_eventas
event P_mybutton: off
globalinit 1
last_timer 2
sleeptimer -1
timerdev Heizung.Pause
timerevent P_mybutton: off
triggerDev Heizung.Pause
timerevents:
P_mybutton: off
e_Heizung.Pause_P_mybutton: off
Device: Heizung.Pause
cmd_nr: 2
cmd: 2
cmd_event: Heizung.Pause
deaktiviert
timereventsState:
P_mybutton: off
e_Heizung.Pause_P_mybutton: off
Device: Heizung.Pause
cmd_nr: 2
cmd: 2
cmd_event: Heizung.Pause
deaktiviert
triggerEvents:
P_mybutton: off
e_Heizung.Pause_P_mybutton: off
Device: Heizung.Pause
cmd_nr: 2
cmd: 2
cmd_event: Heizung.Pause
deaktiviert
triggerEventsState:
P_mybutton: off
e_Heizung.Pause_P_mybutton: off
Device: Heizung.Pause
cmd_nr: 2
cmd: 2
cmd_event: Heizung.Pause
deaktiviert
internals:
interval:
0 -1
1 0
itimer:
all Heizung.Pause
localtime:
0 1539110820
1 1539028200
readings:
0 Heizung.Pause:P_mybutton
all Heizung.Pause:P_mybutton
realtime:
0 20:47:00
1 21:50:00
time:
0 [Heizung.Pause:P_timer_01]
1 [Heizung.Pause:P_timer_02]
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
triggertime:
1539028200:
localtime 1539028200
hash:
1539110820:
localtime 1539110820
hash:
uiState:
uiTable:
Attributes:
cmdState aktiviert|deaktiviert
group Heizung
readingList P_mybutton P_timer_01 P_timer_02
room 00_Kontrollzentrum
setList P_mybutton:on,off P_timer_01:time P_timer_02:time
webCmd P_mybutton:P_timer_01:P_timer_02
webCmdLabel Pause Status
:Pause Beginn
:Pause Ende
Zitat von: z0lt1 am 08 Oktober 2018, 21:03:32
Ich hoffe dass war nicht zu kompliziert ausgedrückt.
Doch schon...
Was (Zeit, Knopf, usw) soll die Heizung einschalten, was soll die ausschalten?
Warum brauchst Du 2 DOIFs?
Ja im Nachhinein scheint es wirklich ein wenig kompliziert beschrieben zu sein. Ich versuche es mal heute Abend besser zu erklären.
So, also ich versuche es nochmal. Ich hab das Beispiel jetzt auch vereinfacht und hoffe es so besser erklären zu können. Also, es gibt zwei DOIFs
1. Heizung.Betrieb: Legt die Betriebszeiten der Heizung (in meinem Beispiel ist das ein dummy "TestLampe") fest und schaltet diese zu den angegebenen Uhrzeiten an und aus. Das funktioniert auch soweit so gut.
([$SELF:Heizung.Betrieb_button] eq "on" and
[05:30-22:00] and
[Heizung.Pause] eq "Pause_AUS") (
set TestLampe on
)
DOELSEIF ([Heizung.Pause] eq "Pause_AN") (
set TestLampe off
)
DOELSEIF ([$SELF:Heizung.Betrieb_button] eq "off") (
set TestLampe off
)
DOELSE (
set TestLampe off
)
2. Heizung.Pause: Darüber möchte ich die Heizung innerhalb der Betriebszeiten zu auswählbaren Zeiten ein- oder ausschalten ohne die normalen Betriebszeiten zu verändern.
([$SELF:P_mybutton] eq "on" and [[$SELF:P_timer_01]-[$SELF:P_timer_02]]) ()
DOELSE ()
Funktionieren tut das ganze leider nicht. Ich denke aber dass ich mich schon ziemlich verrant habe in den letzten Tagen. Ich denke der Fehler liegt irgendwo bei der Abfrage von Heizung.Pause, aber wie es richtig ist habe ich nicht herausgefunden, und wäre deswegen um Ratschläge dankbar.
Mach mal bitte ein "list" von beiden DOIFs, ich möchte gerne die andere Attribute, Readings, und Stati sehen.
Z.B. gibt es "do always" auf Heizung.Betrieb?
Hier Heizung.Betrieb:
Internals:
CFGFN
DEF ([$SELF:Heizung.Betrieb_button] eq "on" and
[05:30-22:00] and
[Heizung.Pause] eq "Pause_AUS") (
set TestLampe on
)
DOELSEIF ([Heizung.Pause] eq "Pause_AN") (
set TestLampe off
)
DOELSEIF ([$SELF:Heizung.Betrieb_button] eq "off") (
set TestLampe off
)
DOELSE (
set TestLampe off
)
MODEL FHEM
NAME Heizung.Betrieb
NR 5679
NTFY_ORDER 50-Heizung.Betrieb
STATE cmd_1
TYPE DOIF
READINGS:
2018-10-09 22:45:00 Device Heizung.Pause
2018-10-09 21:14:33 Heizung.Betrieb_button on
2018-10-10 05:30:00 cmd 1
2018-10-10 05:30:00 cmd_event timer_1
2018-10-10 05:30:00 cmd_nr 1
2018-10-09 21:14:33 e_Heizung.Betrieb_Heizung.Betrieb_button on
2018-10-09 22:45:00 e_Heizung.Pause_STATE Pause_AUS
2018-10-09 21:12:10 mode enabled
2018-10-10 05:30:00 state cmd_1
2018-10-09 22:00:00 timer_01_c01 10.10.2018 05:30:00
2018-10-09 22:00:00 timer_02_c01 10.10.2018 22:00:00
Regex:
condition:
0 ReadingValDoIf($hash,'Heizung.Betrieb','Heizung.Betrieb_button') eq "on" and DOIF_time($hash,0,1,$wday,$hms) and InternalDoIf($hash,'Heizung.Pause','STATE') eq "Pause_AUS"
1 InternalDoIf($hash,'Heizung.Pause','STATE') eq "Pause_AN"
2 ReadingValDoIf($hash,'Heizung.Betrieb','Heizung.Betrieb_button') eq "off"
days:
devices:
0 Heizung.Betrieb Heizung.Pause
1 Heizung.Pause
2 Heizung.Betrieb
all Heizung.Betrieb Heizung.Pause
do:
0:
0 set TestLampe on
1:
0 set TestLampe off
2:
0 set TestLampe off
3:
0 set TestLampe off
helper:
DOIF_Readings_events
DOIF_eventas
event timer_1
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent timer_1
triggerDev
timerevents:
timer_1
timereventsState:
cmd_nr: 2
cmd: 2
cmd_event: timer_2
state: Pause_AUS
triggerEvents:
timer_1
triggerEventsState:
cmd_nr: 2
cmd: 2
cmd_event: timer_2
state: Pause_AUS
internals:
0 Heizung.Pause:STATE
1 Heizung.Pause:STATE
all Heizung.Pause:STATE
interval:
0 -1
1 0
itimer:
localtime:
0 1539142200
1 1539201600
readings:
0 Heizung.Betrieb:Heizung.Betrieb_button
2 Heizung.Betrieb:Heizung.Betrieb_button
all Heizung.Betrieb:Heizung.Betrieb_button
realtime:
0 05:30:00
1 22:00:00
time:
0 05:30:00
1 22:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
triggertime:
1539201600:
localtime 1539201600
hash:
uiState:
uiTable:
Attributes:
group Heizung
readingList Heizung.Betrieb_button
room 00_Kontrollzentrum
setList Heizung.Betrieb_button:on,off
webCmd Heizung.Betrieb_button
Und hier Heizung.Pause:
Internals:
CFGFN
DEF ([$SELF:P_mybutton] eq "on" and [[$SELF:P_timer_01]-[$SELF:P_timer_02]]) ()
DOELSE ()
MODEL FHEM
NAME Heizung.Pause
NR 3914
NTFY_ORDER 50-Heizung.Pause
STATE Pause_AUS
TYPE DOIF
READINGS:
2018-10-09 21:14:40 Device Heizung.Pause
2018-10-09 21:14:40 P_mybutton on
2018-10-09 21:02:05 P_timer_01 21:03
2018-10-09 21:01:11 P_timer_02 22:45
2018-10-09 22:45:00 cmd 2
2018-10-09 22:45:00 cmd_event timer_2
2018-10-09 22:45:00 cmd_nr 2
2018-10-09 21:14:40 e_Heizung.Pause_P_mybutton on
2018-10-07 22:19:37 mode enabled
2018-10-09 22:45:00 state Pause_AUS
2018-10-09 22:45:00 timer_01_c01 10.10.2018 21:03:00
2018-10-09 22:45:00 timer_02_c01 10.10.2018 22:45:00
Regex:
condition:
0 ReadingValDoIf($hash,'Heizung.Pause','P_mybutton') eq "on" and DOIF_time($hash,0,1,$wday,$hms)
days:
devices:
0 Heizung.Pause
all Heizung.Pause
do:
0:
0
1:
0
helper:
DOIF_Readings_events
DOIF_eventas
event timer_2
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent timer_2
triggerDev
timerevents:
timer_2
timereventsState:
P_mybutton: on
e_Heizung.Pause_P_mybutton: on
Device: Heizung.Pause
cmd_nr: 1
cmd: 1
cmd_event: Heizung.Pause
Pause_AN
triggerEvents:
timer_2
triggerEventsState:
P_mybutton: on
e_Heizung.Pause_P_mybutton: on
Device: Heizung.Pause
cmd_nr: 1
cmd: 1
cmd_event: Heizung.Pause
Pause_AN
internals:
interval:
0 -1
1 0
itimer:
all Heizung.Pause
localtime:
0 1539198180
1 1539204300
readings:
0 Heizung.Pause:P_mybutton
all Heizung.Pause:P_mybutton
realtime:
0 21:03:00
1 22:45:00
time:
0 [Heizung.Pause:P_timer_01]
1 [Heizung.Pause:P_timer_02]
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
triggertime:
1539198180:
localtime 1539198180
hash:
1539204300:
localtime 1539204300
hash:
uiState:
uiTable:
Attributes:
cmdState Pause_AN|Pause_AUS
group Heizung
readingList P_mybutton P_timer_01 P_timer_02
room 00_Kontrollzentrum
setList P_mybutton:on,off P_timer_01:time P_timer_02:time
webCmd P_mybutton:P_timer_01:P_timer_02
webCmdLabel Pause Status
:Pause Beginn
:Pause Ende
Kein "do always". Ich denke es hat etwas damit zu tun, dass Heizung.Betrieb, nur den Status des Heizung.Pause ausliest und nicht das Event selbst, wie ich das aber richtigstelle habe ich noch nicht herausgefunden.
Packe doch alles in eins:
DOIF ([$SELF:Heizung.Betrieb_button] eq "on" and [05:30-22:00] and !([$SELF:P_mybutton] eq "on" and [[$SELF:P_timer_01]-[$SELF:P_timer_02]]))(set TestLampe on)
DOELSE (set TestLampe off)
Vielen Dank das funktioniert, und ist genau das was ich brauche. Mal wieder habe ich etwas dazu gelernt: Das "!" vor der Klammer, welches den Inhalt der Klammer negiert ist das Werkzeug der Wahl in diesem Fall.
Mich würde jedoch trotzdem interessieren, warum meine Definition nicht funktioniert. Im Endeffekt habe ich ja nur den Ausdruck nach dem Ausrufezeichen
!([$SELF:P_mybutton] eq "on" and [[$SELF:P_timer_01]-[$SELF:P_timer_02]])
als Status in einem anderen DOIF zusammengefasst, der dann abgefragt wird.
Sollte es mehrere Ereignisse geben die evtl. ziemlich verschachtelt sein könnten, würde es m.M.n. schon Sinn machen das Haupt-DOIF einfach zu gestallten, und "nur "den Zustand anderer "Unter-DOIFs" überwachen und darauf reagieren zu lassen.