FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: z0lt1 am 08 Oktober 2018, 21:03:32

Titel: Mal wieder Hilfe bei DOIF
Beitrag von: z0lt1 am 08 Oktober 2018, 21:03:32
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
Titel: Antw:Mal wieder Hilfe bei DOIF
Beitrag von: amenomade am 09 Oktober 2018, 01:11:39
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?
Titel: Antw:Mal wieder Hilfe bei DOIF
Beitrag von: z0lt1 am 09 Oktober 2018, 09:04:01
Ja im Nachhinein scheint es wirklich ein wenig kompliziert beschrieben zu sein. Ich versuche es mal heute Abend besser zu erklären.
Titel: Antw:Mal wieder Hilfe bei DOIF
Beitrag von: z0lt1 am 09 Oktober 2018, 21:17:49
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.
Titel: Antw:Mal wieder Hilfe bei DOIF
Beitrag von: amenomade am 10 Oktober 2018, 16:12:17
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?
Titel: Antw:Mal wieder Hilfe bei DOIF
Beitrag von: z0lt1 am 10 Oktober 2018, 20:08:32
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.
Titel: Antw:Mal wieder Hilfe bei DOIF
Beitrag von: Damian am 10 Oktober 2018, 21:59:55
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)

Titel: Antw:Mal wieder Hilfe bei DOIF
Beitrag von: z0lt1 am 10 Oktober 2018, 22:59:30
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.