FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: gary822 am 29 Januar 2019, 12:45:44

Titel: Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 12:45:44
Hallo an alle :)

Ich verzweifel langsam mit meiner DOIF Automatisierung.
Eventuell sehen die Profis hier im Board meinen Fehler.

Ich habe eine Abfrage in FHEM mit DOIF -> DOELSEIF -> DOELSE.
Solange die Bedingung im DOIF erfüllt ist funktioniert die Automatisierung ohne Probleme.
Wenn die Bedingung allerdings falsch ist springt die Automatisierung zwischen cmd_2 und cmd_3 obwohl er nur cmd_2 setzen sollte.
Sobald die Bedingung für cmd_3 gegeben ist, bleibt er auch auf cmd_3 er hat also nur ein Problem mit cmd_2.

Das interessante dabei ist, dass laut dem Log das Event "Handy_2" teilweise das Verhalten ausgelöst hat welches aber seit Tagen nicht mehr mit dem Netzwerk verbunden war.

Sollten Fragen aufkommen oder weitere Definitionen benötigt werden einfach schreiben :)
Ebenso sollte es Verbesserungsvorschläge in Schreibweise oder anderen Aspekten geben :)

Anbei die relevanten Definitionen:

Heizungssteuerung
DOIF (\
([05:30-23:30|Mo Di Mi Do]||[05:30-01:30|Fr]||[08:30-01:30|Sa So]) and \
([MAX_12b6a2:temperature]||[MAX_13cdaf:temperature] < 23) and \
[MAX_14242a]&&[MAX_1422ee] eq 'closed'||'closed (rf error)' and \
([Handy_1]||[Handy_2] eq 'present')) \
(set MAX_13cdaf&&MAX_12b6a2 desiredTemperature manual comfort) \
DOELSEIF (\
[MAX_14242a]&&[MAX_1422ee] eq 'closed'||'closed (rf error)' and \
([Handy_1]||[Handy_2] eq 'present')) \
(set MAX_13cdaf&&MAX_12b6a2 desiredTemperature manual 20.0) \
DOELSE \
(set MAX_13cdaf&&MAX_12b6a2 desiredTemperature manual eco)

Handy_1
defmod Handy_1 PRESENCE function {checkFritzMACpresent("FritzBox","xx:xx:xx:xx:xx:xx")} 15 60
Handy_2
defmod Handy_2 PRESENCE function {checkFritzMACpresent("FritzBox","xx:xx:xx:xx:xx:xx")} 15 60
MAX_14242a
defmod MAX_14242a MAX ShutterContact 14242a
MAX_1422ee
defmod MAX_1422ee MAX ShutterContact 1422ee
MAX_13cdaf
defmod MAX_13cdaf MAX HeatingThermostat 13cdaf
MAX_12b6a2
defmod MAX_12b6a2 MAX HeatingThermostat 12b6a2

Logauszug aus Heizungssteuerung
2019-01-28_13:18:21 Heizungssteuerung cmd_3
2019-01-28_13:18:25 Heizungssteuerung cmd_nr: 2
2019-01-28_13:18:25 Heizungssteuerung cmd: 2
2019-01-28_13:18:25 Heizungssteuerung cmd_event: MAX_14242a
2019-01-28_13:18:25 Heizungssteuerung cmd_2
2019-01-28_13:18:25 Heizungssteuerung cmd_nr: 3
2019-01-28_13:18:25 Heizungssteuerung cmd: 3
2019-01-28_13:18:25 Heizungssteuerung cmd_event: MAX_12b6a2
2019-01-28_13:18:25 Heizungssteuerung cmd_3
2019-01-28_13:18:29 Heizungssteuerung cmd_nr: 2
2019-01-28_13:18:29 Heizungssteuerung cmd: 2
2019-01-28_13:18:29 Heizungssteuerung cmd_event: MAX_14242a
2019-01-28_13:18:29 Heizungssteuerung cmd_2
2019-01-28_13:18:29 Heizungssteuerung cmd_nr: 3
2019-01-28_13:18:29 Heizungssteuerung cmd: 3
2019-01-28_13:18:29 Heizungssteuerung cmd_event: MAX_12b6a2
2019-01-28_13:18:29 Heizungssteuerung cmd_3
2019-01-28_13:18:30 Heizungssteuerung cmd_nr: 2
2019-01-28_13:18:30 Heizungssteuerung cmd: 2
2019-01-28_13:18:30 Heizungssteuerung cmd_event: Handy_2
2019-01-28_13:18:30 Heizungssteuerung cmd_2
2019-01-28_13:18:34 Heizungssteuerung cmd_nr: 3
2019-01-28_13:18:34 Heizungssteuerung cmd: 3
2019-01-28_13:18:34 Heizungssteuerung cmd_event: MAX_12b6a2
2019-01-28_13:18:34 Heizungssteuerung cmd_3
2019-01-28_13:18:37 Heizungssteuerung cmd_nr: 2
2019-01-28_13:18:37 Heizungssteuerung cmd: 2
2019-01-28_13:18:37 Heizungssteuerung cmd_event: MAX_14242a
2019-01-28_13:18:37 Heizungssteuerung cmd_2
2019-01-28_13:18:38 Heizungssteuerung cmd_nr: 3
2019-01-28_13:18:38 Heizungssteuerung cmd: 3
2019-01-28_13:18:38 Heizungssteuerung cmd_event: MAX_12b6a2
2019-01-28_13:18:38 Heizungssteuerung cmd_3
2019-01-28_13:18:41 Heizungssteuerung cmd_nr: 2
2019-01-28_13:18:41 Heizungssteuerung cmd: 2
2019-01-28_13:18:41 Heizungssteuerung cmd_event: MAX_14242a
2019-01-28_13:18:41 Heizungssteuerung cmd_2
2019-01-28_13:18:42 Heizungssteuerung cmd_nr: 3
2019-01-28_13:18:42 Heizungssteuerung cmd: 3
2019-01-28_13:18:42 Heizungssteuerung cmd_event: MAX_12b6a2
2019-01-28_13:18:42 Heizungssteuerung cmd_3
2019-01-28_13:18:45 Heizungssteuerung cmd_nr: 2
2019-01-28_13:18:45 Heizungssteuerung cmd: 2
2019-01-28_13:18:45 Heizungssteuerung cmd_event: MAX_14242a
2019-01-28_13:18:45 Heizungssteuerung cmd_2
2019-01-28_13:18:46 Heizungssteuerung cmd_nr: 3
2019-01-28_13:18:46 Heizungssteuerung cmd: 3
2019-01-28_13:18:46 Heizungssteuerung cmd_event: MAX_12b6a2
2019-01-28_13:18:46 Heizungssteuerung cmd_3
2019-01-28_13:18:47 Heizungssteuerung cmd_nr: 2
2019-01-28_13:18:47 Heizungssteuerung cmd: 2
2019-01-28_13:18:47 Heizungssteuerung cmd_event: Handy_2
2019-01-28_13:18:47 Heizungssteuerung cmd_2
2019-01-28_13:18:50 Heizungssteuerung cmd_nr: 3
2019-01-28_13:18:50 Heizungssteuerung cmd: 3
2019-01-28_13:18:50 Heizungssteuerung cmd_event: MAX_12b6a2
2019-01-28_13:18:50 Heizungssteuerung cmd_3
2019-01-28_13:18:51 Heizungssteuerung cmd_nr: 2
2019-01-28_13:18:51 Heizungssteuerung cmd: 2
2019-01-28_13:18:51 Heizungssteuerung cmd_event: Handy_1
2019-01-28_13:18:51 Heizungssteuerung cmd_2


VG
gary822
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Otto123 am 29 Januar 2019, 12:51:33
Hallo gary822,

sowas funktioniert nicht wie Du Die das vorstellst!?
([Handy_1]||[Handy_2] eq 'present')
Das musst du generell so machen, Du willst doch beide Handy jeweils auf present testen!?:
([Handy_1] eq 'present'||[Handy_2] eq 'present')

So wird das abgearbeitet: http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity
([Handy_2] eq 'present') oder [Handy_1] -> das ist nicht was Du willst. Der Ausdruck ist immer wahr, wenn Handy_1 nicht 0 enthält.

Ich meine damit alle Deine ähnlichen Ausdrücke! Also deine ganze Definition solltest Du korrigieren, dass  Du meinst, in Teilen funktioniert es, ist blanker Zufall!

Gruß Otto
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 13:05:47
Hallo Otto123,

danke für dein Feedback.
Also würde eine funktionsfähige Konfig so aussehen:

DOIF (\
([05:30-23:30|Mo Di Mi Do]||[05:30-01:30|Fr]||[08:30-01:30|Sa So]) and \
[MAX_14649c:temperature] < 20 and \
([Handy_1] eq 'present'||[Handy_2] eq 'present'||[Handy_3] eq 'present'||[Handy_4] eq 'present')) \
(set MAX_14649c desiredTemperature manual comfort) \
DOELSEIF (\
([Handy_1] eq 'present'||[Handy_2] eq 'present'||[Handy_3] eq 'present'||[Handy_4] eq 'present')) \
(set MAX_14649c desiredTemperature manual 15.0) \
DOELSE \
(set MAX_14649c desiredTemperature manual eco)
?

Ja  nicht wundern ist ein anderes Zimmer mit ich gerade teste :)

VG
gary822

EDIT:

Also so funktioniert es auch nicht :/

2019-01-29_13:00:32 Heizungssteuerung_Flur cmd_2
2019-01-29_13:04:25 Heizungssteuerung_Flur cmd: 0
2019-01-29_13:04:25 Heizungssteuerung_Flur initialized
2019-01-29_13:04:25 Heizungssteuerung_Flur mode: enabled
2019-01-29_13:04:30 Heizungssteuerung_Flur cmd_nr: 1
2019-01-29_13:04:30 Heizungssteuerung_Flur cmd: 1
2019-01-29_13:04:30 Heizungssteuerung_Flur cmd_event: Heizungssteuerung_Flur
2019-01-29_13:04:30 Heizungssteuerung_Flur cmd_1
2019-01-29_13:06:18 Heizungssteuerung_Flur cmd: 0
2019-01-29_13:06:18 Heizungssteuerung_Flur initialized
2019-01-29_13:06:18 Heizungssteuerung_Flur mode: enabled
2019-01-29_13:06:19 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_13:06:19 Heizungssteuerung_Flur cmd: 2
2019-01-29_13:06:19 Heizungssteuerung_Flur cmd_event: Handy_2
2019-01-29_13:06:19 Heizungssteuerung_Flur cmd_2
2019-01-29_13:06:23 Heizungssteuerung_Flur checkall
2019-01-29_13:07:22 Heizungssteuerung_Flur cmd_nr: 3
2019-01-29_13:07:22 Heizungssteuerung_Flur cmd: 3
2019-01-29_13:07:22 Heizungssteuerung_Flur cmd_event: MAX_14649c
2019-01-29_13:07:22 Heizungssteuerung_Flur cmd_3
2019-01-29_13:07:34 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_13:07:34 Heizungssteuerung_Flur cmd: 2
2019-01-29_13:07:34 Heizungssteuerung_Flur cmd_event: Handy_2
2019-01-29_13:07:34 Heizungssteuerung_Flur cmd_2
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Per am 29 Januar 2019, 13:20:23
Mein signaturfähiger ;) Vorschlag: lagere die Present-Abfragen in ein DOIF_Reading aus. Bringt Übersicht und oftmals (hier eher nicht) ein kleines Performance Plus.
Und erleichtert die Fehlersuche, weil das Ergebnis dieser Abfrage schonmal separat getestet werden kann.

Nebenbei:
([05:30-23:30|Mo Di Mi Do]||[05:30-01:30|Fr]||[08:30-01:30|Sa So])
sollte auch so
([05:30-23:30|Mo Di Mi Do Fr]||[08:30-01:30|Fr Sa So])
gehen ;)
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 13:41:13
Hallo @Per,

danke für den Hinweis leider löst das mein Problem nicht :D

VG
gary822
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Otto123 am 29 Januar 2019, 14:01:03
Hi gary822,

lagere die ganzen Handys doch in eine Structure aus, vor allem falls da noch zwei dazu kommen :)

Anhand von deinem Protokoll sehe ich nicht was funktioniert und was nicht. Ein list vom DOIF im jeweiligen Zustand ist meist sehr aussagefähig.

cmd_2 ist: mache 15 wenn einer da sind - war das so gewollt?
Die Bedingungen müssen eindeutig sein, ansonsten wird DOIF nicht eindeutig schalten. Ich denke bei dir ist Bedingung 1 und Bedingung 2 gleichzeitig wahr.

Gruß Otto
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 14:16:59
Hallo Otto123,

ich versuche mal meinen Hintergrund dazu etwas aufzudrieseln :D

cmd_1: (set MAX_14649c desiredTemperature manual comfort(18.5°))
cmd_2: (set MAX_14649c desiredTemperature manual 15.0)
cmd_3: (set MAX_14649c desiredTemperature manual eco(5.0°))
Ich möchte also mit dem DOELSEIF erzielen, dass das Thermostat bei Anwesenheit einer Person auf minimal 15° herunterfährt, da die Motoren laut sind und der "lange" Weg unnötig Strom zieht.
Erst wenn keiner Anwesend ist sollen die Thermostate auf 5° herunterfahren.
Problem ist nun, dass sobald die Temperatur über die 20° geht er zuerst auf cmd_2 schaltet, dann auf cmd_3, dann auf cmd_2 usw.
Da dieses Verhalten aus dem Logfile ersichtlich ist dachte ich es wäre sinnvoll dies mit zu Posten.

Ich hoffe es ist etwas verständlich :D

VG
gary822
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Otto123 am 29 Januar 2019, 14:26:44
Naja man sieht im Log
2019-01-29_13:06:18 Heizungssteuerung_Flur initialized
2019-01-29_13:06:18 Heizungssteuerung_Flur mode: enabled

er geht nach cmd_2

2019-01-29_13:06:19 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_13:06:19 Heizungssteuerung_Flur cmd: 2
2019-01-29_13:06:19 Heizungssteuerung_Flur cmd_event: Handy_2

Handy_2 liefert einen Event, er bleibt in cmd_2

2019-01-29_13:06:19 Heizungssteuerung_Flur cmd_2
2019-01-29_13:06:23 Heizungssteuerung_Flur checkall

Warum checkall? Das warst Du manuell? Er geht nach cmd_3 Warum?

2019-01-29_13:07:22 Heizungssteuerung_Flur cmd_nr: 3
2019-01-29_13:07:22 Heizungssteuerung_Flur cmd: 3
2019-01-29_13:07:22 Heizungssteuerung_Flur cmd_event: MAX_14649c

Der Tempfühler liefert einen event, er bleibt in cmd_3 weil offenbar alle anderen Bedingungen nicht stimmen.

2019-01-29_13:07:22 Heizungssteuerung_Flur cmd_3
2019-01-29_13:07:34 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_13:07:34 Heizungssteuerung_Flur cmd: 2
2019-01-29_13:07:34 Heizungssteuerung_Flur cmd_event: Handy_2

Handy_ 2 liefert einen Event, er geht nach cmd_2

2019-01-29_13:07:34 Heizungssteuerung_Flur cmd_2

Welche Zustände herrschen, welche Werte geliefert werden, siehst nur Du in (einem list). Im Protokoll sieht man nur was es macht, warum sieht man nicht.

Gruß Otto
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 14:51:17
Hallo Otto123,

ich habe jetzt mal ein "list Heizungssteuerung_Flur" durchgeführt.
Anbei der Output:


Internals:
   DEF        (
([05:30-23:30|Mo Di Mi Do Fr]||[08:30-01:30|Fr Sa So]) and
[MAX_14649c:temperature] < 18 and
([Handy_1] eq 'present'||[Handy_2] eq 'present'||[Handy_3] eq 'present'||[Handy_4] eq 'present'))
(set Flur cmd_1)
DOELSEIF (
([Handy_1] eq 'present'||[Handy_2] eq 'present'||[Handy_3] eq 'present'||[Handy_4] eq 'present'))
(set Flur cmd_2)
DOELSE
(set Flur cmd_3)
   FUUID      5c478861-f33f-20f6-0f36-6e1f26a6178dec95
   MODEL      FHEM
   NAME       Heizungssteuerung_Flur
   NR         69
   NTFY_ORDER 50-Heizungssteuerung_Flur
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2019-01-29 14:48:38   Device          Handy_4
     2019-01-29 14:48:08   cmd             2
     2019-01-29 14:48:08   cmd_event       Handy_1
     2019-01-29 14:48:08   cmd_nr          2
     2019-01-29 14:48:38   e_Handy_1_STATE absent
     2019-01-29 14:47:57   e_Handy_3_STATE present
     2019-01-29 14:48:38   e_Handy_4_STATE absent
     2019-01-29 14:48:38   e_Handy_2_STATE absent
     2019-01-29 14:48:06   e_MAX_14649c_temperature 19.8
     2019-01-29 14:18:06   mode            enabled
     2019-01-29 14:48:08   state           cmd_2
     2019-01-29 14:18:06   timer_01_c01    30.01.2019 05:30:00|MoDiMiDoFr
     2019-01-29 14:18:06   timer_02_c01    29.01.2019 23:30:00|MoDiMiDoFr
     2019-01-29 14:18:06   timer_03_c01    30.01.2019 08:30:00|FrSaSo
     2019-01-29 14:18:06   timer_04_c01    30.01.2019 01:30:00|FrSaSo
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0            (::DOIF_time($hash,0,1,$wday,$hms,"MoDiMiDoFr")||::DOIF_time($hash,2,3,$wday,$hms,"FrSaSo")) and  ::ReadingValDoIf($hash,'MAX_14649c','temperature') < 18 and  (::InternalDoIf($hash,'Handy_1','STATE') eq 'present'||::InternalDoIf($hash,'Handy_2','STATE') eq 'present'||::InternalDoIf($hash,'Handy_3','STATE') eq 'present'||::InternalDoIf($hash,'Handy_4','STATE') eq 'present')
     1            (::InternalDoIf($hash,'Handy_1','STATE') eq 'present'||::InternalDoIf($hash,'Handy_2','STATE') eq 'present'||::InternalDoIf($hash,'Handy_3','STATE') eq 'present'||::InternalDoIf($hash,'Handy_4','STATE') eq 'present')
   days:
     0          MoDiMiDoFr
     1          MoDiMiDoFr
     2          FrSaSo
     3          FrSaSo
   devices:
     0           MAX_14649c Handy_1 Handy_2 Handy_3 Handy_4
     1           Handy_1 Handy_2 Handy_3 Handy_4
     all         MAX_14649c Handy_1 Handy_2 Handy_3 Handy_4
   do:
     0:
       0          set Flur cmd_1
     1:
       0          set Flur cmd_2
     2:
       0          set Flur cmd_3
   helper:
     event      absent,presence: absent
     globalinit 1
     last_timer 4
     sleeptimer -1
     timerdev   Handy_4
     timerevent absent,presence: absent
     triggerDev Handy_4
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: Handy_1
       state: cmd_2
     timerevents:
       absent
       presence: absent
     timereventsState:
       state: absent
       presence: absent
     triggerEvents:
       absent
       presence: absent
     triggerEventsState:
       state: absent
       presence: absent
   internals:
     0           Handy_1:STATE Handy_2:STATE Handy_3:STATE Handy_4:STATE
     1           Handy_1:STATE Handy_2:STATE Handy_3:STATE Handy_4:STATE
     all         Handy_1:STATE Handy_2:STATE Handy_3:STATE Handy_4:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
   intervalfunc:
   itimer:
   localtime:
     0          1548822600
     1          1548801000
     2          1548833400
     3          1548808200
   readings:
     0           MAX_14649c:temperature
     all         MAX_14649c:temperature
   realtime:
     0          05:30:00
     1          23:30:00
     2          08:30:00
     3          01:30:00
   time:
     0          05:30:00
     1          23:30:00
     2          08:30:00
     3          01:30:00
   timeCond:
     0          0
     1          0
     2          0
     3          0
   timer:
     0          0
     1          0
     2          0
     3          0
   timers:
     0           0  1  2  3
   trigger:
   triggertime:
     1548801000:
       localtime  1548801000
       hash:
     1548808200:
       localtime  1548808200
       hash:
     1548822600:
       localtime  1548822600
       hash:
     1548833400:
       localtime  1548833400
       hash:
   uiState:
   uiTable:
Attributes:
   devStateIcon cmd_1:status_automatic@green:cmd_2 cmd_2:status_automatic@blue:cmd_3 cmd_3:status_automatic@red:cmd_1 initialized:status_automatic@orange:checkall
   group      Anwesenheit
   icon       status_automatic
   room       Flur
   setList    state:cmd_1,cmd_2,cmd_3,checkall
   verbose    1
   webCmd     state
   webCmdLabel Status


VG
Danny
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Otto123 am 29 Januar 2019, 15:11:15
Naja, aber so ist doch alles schick? Du musst ein list machen, wenn es nicht stimmt.

Ich denke ja, es gibt temporäre Zustände die nicht stimmen, dein DOIF aber (unnötig) triggern und dann Vorgänge auslösen.
Deine "present Events" vom Handy erfolgen, obwohl sich kein Zustand ändert? Stichwort event-on-change-reading

Tipps zur presence:
Das ist die Alternative zu Deiner Oder Verknüpfung
define st_Handy structure bewohner Handy_1 Handy_2 Handy_3 Handy_4
attr st_Handy clientstate_behavior relative 
attr st_Handy clientstate_priority present|1 absent|0 
attr st_Handy event-on-change-reading state 
attr st_Handy room Status 

Nimm zum Testen einen Dummy den Du definiert schaltest, dann kannst Du die presence Effekte schnell ausschließen.

Gruß Otto
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 15:34:07
Hallo Otto123,

danke für dein Feedback.
Das list habe ich ausgeführt in dem Zeitraum als der Fehler auftrat.
Weiter unten nochmal ein list und ein Logauszug.

Das Problem ist, dass ich Plots definiert habe welche auf den Wert "present" gehen
Wenn ich jetzt event-on-change-reading state definiere funktionieren leider meine Plots nicht mehr.

# Created by FHEM/98_SVG.pm, 2019-01-24 23:02:47
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Heizungssteuerung'
set ytics
set y2tics
set grid ytics y2tics
set ylabel ""
set y2label ""
set yrange [0:55]
set y2range [0:55]

#FileLog_MAX_146463 4:MAX_146463.temperature\x3a:/\d+/:
#FileLog_MAX_146463 3:MAX_146463.*:/\d+/:
#FileLog_MAX_146463 4:MAX_146463.mode\x3a::$fld[3]=~"manual"?50:55
#FileLog_MAX_1584e1 3:.*:0:$fld[2]&&$fld[2]=~"opened"?30:0
#FileLog_Handy_1 3:.*:0:$fld[2]&&$fld[2]=~"present"?45:40
#FileLog_Handy_2 3:.*:0:$fld[2]&&$fld[2]=~"present"?40:35

plot "<IN>" using 1:2 axes x1y2 title 'Temperaturverlaufi' ls l1fill lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'gesetzte Temperatur' ls l0fill lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Mode' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Fenster' ls l1 lw 3 with points,\
     "<IN>" using 1:2 axes x1y2 title 'Anwesenheit 1' ls l3 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Anwesenheit 2' ls l4 lw 1 with lines


Wenn es dahingehend natürlich eine bessere Lösung gibt bin ich da offen für Vorschläge.
Genau die gleiche Problematik trifft dann aber auch das Thermostat welches ja auch immer mal das Event auslöst.

2019-01-29_15:28:07 Heizungssteuerung_Flur cmd: 2
2019-01-29_15:28:07 Heizungssteuerung_Flur cmd_event: Handy_1
2019-01-29_15:28:07 Heizungssteuerung_Flur cmd_2
2019-01-29_15:28:15 Heizungssteuerung_Flur cmd_nr: 3
2019-01-29_15:28:15 Heizungssteuerung_Flur cmd: 3
2019-01-29_15:28:15 Heizungssteuerung_Flur cmd_event: MAX_14649c
2019-01-29_15:28:15 Heizungssteuerung_Flur cmd_3
2019-01-29_15:29:03 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_15:29:03 Heizungssteuerung_Flur cmd: 2
2019-01-29_15:29:03 Heizungssteuerung_Flur cmd_event: Handy_2
2019-01-29_15:29:03 Heizungssteuerung_Flur cmd_2
2019-01-29_15:29:15 Heizungssteuerung_Flur cmd_nr: 3
2019-01-29_15:29:15 Heizungssteuerung_Flur cmd: 3
2019-01-29_15:29:15 Heizungssteuerung_Flur cmd_event: MAX_14649c
2019-01-29_15:29:15 Heizungssteuerung_Flur cmd_3
2019-01-29_15:29:18 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_15:29:18 Heizungssteuerung_Flur cmd: 2
2019-01-29_15:29:18 Heizungssteuerung_Flur cmd_event: Handy_2
2019-01-29_15:29:18 Heizungssteuerung_Flur cmd_2
2019-01-29_15:30:03 Heizungssteuerung_Flur cmd_nr: 3
2019-01-29_15:30:03 Heizungssteuerung_Flur cmd: 3
2019-01-29_15:30:03 Heizungssteuerung_Flur cmd_event: MAX_14649c
2019-01-29_15:30:03 Heizungssteuerung_Flur cmd_3
2019-01-29_15:30:06 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_15:30:06 Heizungssteuerung_Flur cmd: 2
2019-01-29_15:30:06 Heizungssteuerung_Flur cmd_event: Handy_2
2019-01-29_15:30:06 Heizungssteuerung_Flur cmd_2
2019-01-29_15:30:35 Heizungssteuerung_Flur cmd_nr: 3
2019-01-29_15:30:35 Heizungssteuerung_Flur cmd: 3
2019-01-29_15:30:35 Heizungssteuerung_Flur cmd_event: MAX_14649c
2019-01-29_15:30:35 Heizungssteuerung_Flur cmd_3
2019-01-29_15:30:36 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_15:30:36 Heizungssteuerung_Flur cmd: 2
2019-01-29_15:30:36 Heizungssteuerung_Flur cmd_event: Handy_2
2019-01-29_15:30:36 Heizungssteuerung_Flur cmd_2
2019-01-29_15:30:38 Heizungssteuerung_Flur cmd_nr: 3
2019-01-29_15:30:38 Heizungssteuerung_Flur cmd: 3
2019-01-29_15:30:38 Heizungssteuerung_Flur cmd_event: MAX_14649c
2019-01-29_15:30:38 Heizungssteuerung_Flur cmd_3
2019-01-29_15:30:51 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_15:30:51 Heizungssteuerung_Flur cmd: 2
2019-01-29_15:30:51 Heizungssteuerung_Flur cmd_event: Handy_2
2019-01-29_15:30:51 Heizungssteuerung_Flur cmd_2
2019-01-29_15:30:55 Heizungssteuerung_Flur cmd_nr: 3
2019-01-29_15:30:55 Heizungssteuerung_Flur cmd: 3
2019-01-29_15:30:55 Heizungssteuerung_Flur cmd_event: MAX_14649c
2019-01-29_15:30:55 Heizungssteuerung_Flur cmd_3
2019-01-29_15:31:06 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_15:31:06 Heizungssteuerung_Flur cmd: 2
2019-01-29_15:31:06 Heizungssteuerung_Flur cmd_event: Handy_2
2019-01-29_15:31:06 Heizungssteuerung_Flur cmd_2
2019-01-29_15:31:56 Heizungssteuerung_Flur cmd_nr: 3
2019-01-29_15:31:56 Heizungssteuerung_Flur cmd: 3
2019-01-29_15:31:56 Heizungssteuerung_Flur cmd_event: MAX_14649c
2019-01-29_15:31:56 Heizungssteuerung_Flur cmd_3
2019-01-29_15:32:06 Heizungssteuerung_Flur cmd_nr: 2
2019-01-29_15:32:06 Heizungssteuerung_Flur cmd: 2
2019-01-29_15:32:06 Heizungssteuerung_Flur cmd_event: Handy_2
2019-01-29_15:32:06 Heizungssteuerung_Flur cmd_2




Internals:
   DEF        (
([05:30-23:30|Mo Di Mi Do Fr]||[08:30-01:30|Fr Sa So]) and
[MAX_14649c:temperature] < 18 and
([Handy_1] eq 'present'||[Handy_4] eq 'present'||[Handy_2] eq 'present'||[Handy_3] eq 'present'))
(set Flur cmd_1)
DOELSEIF (
([Handy_1] eq 'present'||[Handy_4] eq 'present'||[Handy_2] eq 'present'||[Handy_3] eq 'present'))
(set Flur cmd_2)
DOELSE
(set Flur cmd_3)
   FUUID      5c478861-f33f-20f6-0f36-6e1f26a6178dec95
   MODEL      FHEM
   NAME       Heizungssteuerung_Flur
   NR         69
   NTFY_ORDER 50-Heizungssteuerung_Flur
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2019-01-29 15:32:37   Device          Handy_4
     2019-01-29 15:32:06   cmd             2
     2019-01-29 15:32:06   cmd_event       Handy_3
     2019-01-29 15:32:06   cmd_nr          2
     2019-01-29 15:32:37   e_Handy_1_STATE absent
     2019-01-29 15:32:07   e_Handy_2_STATE present
     2019-01-29 15:32:36   e_Handy_3_STATE absent
     2019-01-29 15:32:37   e_Handy_4_STATE absent
     2019-01-29 15:31:56   e_MAX_14649c_temperature 19.7
     2019-01-29 14:18:06   mode            enabled
     2019-01-29 15:32:06   state           cmd_2
     2019-01-29 14:18:06   timer_01_c01    30.01.2019 05:30:00|MoDiMiDoFr
     2019-01-29 14:18:06   timer_02_c01    29.01.2019 23:30:00|MoDiMiDoFr
     2019-01-29 14:18:06   timer_03_c01    30.01.2019 08:30:00|FrSaSo
     2019-01-29 14:18:06   timer_04_c01    30.01.2019 01:30:00|FrSaSo
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0            (::DOIF_time($hash,0,1,$wday,$hms,"MoDiMiDoFr")||::DOIF_time($hash,2,3,$wday,$hms,"FrSaSo")) and  ::ReadingValDoIf($hash,'MAX_14649c','temperature') < 18 and  (::InternalDoIf($hash,'Handy_1','STATE') eq 'present'||::InternalDoIf($hash,'Handy_4','STATE') eq 'present'||::InternalDoIf($hash,'Handy_2','STATE') eq 'present'||::InternalDoIf($hash,'Handy_3','STATE') eq 'present')
     1            (::InternalDoIf($hash,'Handy_1','STATE') eq 'present'||::InternalDoIf($hash,'Handy_4','STATE') eq 'present'||::InternalDoIf($hash,'Handy_2','STATE') eq 'present'||::InternalDoIf($hash,'Handy_3','STATE') eq 'present')
   days:
     0          MoDiMiDoFr
     1          MoDiMiDoFr
     2          FrSaSo
     3          FrSaSo
   devices:
     0           MAX_14649c Handy_1 Handy_4 Handy_2 Handy_3
     1           Handy_1 Handy_4 Handy_2 Handy_3
     all         MAX_14649c Handy_1 Handy_4 Handy_2 Handy_3
   do:
     0:
       0          set Flur cmd_1
     1:
       0          set Flur cmd_2
     2:
       0          set Flur cmd_3
   helper:
     event      absent,presence: absent
     globalinit 1
     last_timer 4
     sleeptimer -1
     timerdev   Handy_4
     timerevent absent,presence: absent
     triggerDev Handy_4
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: Handy_3
       state: cmd_2
     timerevents:
       absent
       presence: absent
     timereventsState:
       state: absent
       presence: absent
     triggerEvents:
       absent
       presence: absent
     triggerEventsState:
       state: absent
       presence: absent
   internals:
     0           Handy_1:STATE Handy_4:STATE Handy_2:STATE Handy_3:STATE
     1           Handy_1:STATE Handy_4:STATE Handy_2:STATE Handy_3:STATE
     all         Handy_1:STATE Handy_4:STATE Handy_2:STATE Handy_3:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
   intervalfunc:
   itimer:
   localtime:
     0          1548822600
     1          1548801000
     2          1548833400
     3          1548808200
   readings:
     0           MAX_14649c:temperature
     all         MAX_14649c:temperature
   realtime:
     0          05:30:00
     1          23:30:00
     2          08:30:00
     3          01:30:00
   time:
     0          05:30:00
     1          23:30:00
     2          08:30:00
     3          01:30:00
   timeCond:
     0          0
     1          0
     2          0
     3          0
   timer:
     0          0
     1          0
     2          0
     3          0
   timers:
     0           0  1  2  3
   trigger:
   triggertime:
     1548801000:
       localtime  1548801000
       hash:
     1548808200:
       localtime  1548808200
       hash:
     1548822600:
       localtime  1548822600
       hash:
     1548833400:
       localtime  1548833400
       hash:
   uiState:
   uiTable:
Attributes:
   devStateIcon cmd_1:status_automatic@green:cmd_2 cmd_2:status_automatic@blue:cmd_3 cmd_3:status_automatic@red:cmd_1 initialized:status_automatic@orange:checkall
   group      Anwesenheit
   icon       status_automatic
   room       Flur
   setList    state:cmd_1,cmd_2,cmd_3,checkall
   verbose    1
   webCmd     state
   webCmdLabel Status

VG
gary822
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Per am 29 Januar 2019, 15:48:51
Vom List des DOIF passt es ja wieder: cmd2 ist ok.
Kannst du ein List machen, wenn cmd = 3 ist?

Kann es sein, dass du noch eine ältere DOIF-Version hast?
Versuch es mal mit
attr Heizungssteuerung_Flur checkReadingEvent 1
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Otto123 am 29 Januar 2019, 15:51:34
Zitat von: gary822 am 29 Januar 2019, 15:34:07
Das Problem ist, dass ich Plots definiert habe welche auf den Wert "present" gehen
Wenn ich jetzt event-on-change-reading state definiere funktionieren leider meine Plots nicht mehr.
Was hat die structure und das event-on-change-reading dort mit deinen Plots zu tun? Das ist ein Zusatz als Vereinfachung deines DOIFs und doch kein genereller Ersatz!

Wie sollte denn der Zustand deiner Meinung nach jetzt sein? Ich sehe es wie Per -> alles Ok
2019-01-29 15:32:07   e_Handy_2_STATE present

Gruß Otto
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 16:10:18
Hallo @all,

attr Heizungssteuerung_Flur checkReadingEvent 1
hat keine Änderung zufolge.

das Attribut "event-on-change-reading state" kann ich nicht verwenden, da sonst nur Einträge in meine Logfiles geschrieben werden sobald sich der Status des Handys ändert und aus diesem Grund meine Plots ewig nicht mit Daten versorgt werden.

Der Status der Handys ist korrekt. Ich habe nie gesagt das diese nicht stimmen allerdings sollte sich der nicht der Status des DOIFs im Sekundentakt ändern.
Der Zustand des DOIFs soll zum aktuellen Zeitpunkt "cmd_2" sein und sich erst wieder ändern wenn die Temperatur den Wert 18 von dem Thermostat unterschritten wird.
Aktuell ändert sich der Status des DOIFs im Sekundentakt von cmd_2 zu cmd_3 zu cmd_2 usw.

Ich halte mein Fhem immer aktuell aus diesem Grund gehe ich davon aus das die aktuellste Version von DOIF installiert ist.

Leider wird der Status "cmd_3" nur einen Bruchteil gehalten weshalb ein list eher nicht möglich ist.
Sollte es natürlich auf BS ebene ein File geben auf welches ich ein tail laufen lassen kann dann kann ich das machen.

VG
gary822
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Per am 29 Januar 2019, 16:35:20
Zitat von: gary822 am 29 Januar 2019, 16:10:18Leider wird der Status "cmd_3" nur einen Bruchteil gehalten weshalb ein list eher nicht möglich ist.
Dann häng mal ein vollständiges Eventlog dieser Zeit an. Vor allem das was vorher ablief.
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 16:44:40
Hallo Per,

anbei ein Logauszug:

2019.01.29 16:41:48 1: checkFritzMACpresent (FritzBox): mac_XX_XX_XX_XX_XX_XX nicht gefunden, abwesend.
2019.01.29 16:41:48 1: checkFritzMACpresent (FritzBox): mac_XX_XX_XX_XX_XX_XX nicht gefunden, abwesend.
2019.01.29 16:41:55 3: MaxScanner Scanner Notify.322 will start <Scanner> triggerd by MAX_14649c desiredTemperature: 18.5
2019.01.29 16:41:55 3: MaxScanner Scanner Timer.1404 ------------started ---------------- instance:Scanner
2019.01.29 16:41:55 3: MaxScanner Scanner Work.1324  next scan in seconds : 977
2019.01.29 16:41:56 3: MaxScanner Scanner Notify.322 will start <Scanner> triggerd by MAX_1464f0 desiredTemperature: 18.5
2019.01.29 16:41:56 3: MaxScanner Scanner Timer.1404 ------------started ---------------- instance:Scanner
2019.01.29 16:41:56 3: MaxScanner Scanner Work.1324  next scan in seconds : 976
2019.01.29 16:41:56 3: MaxScanner Scanner Notify.322 will start <Scanner> triggerd by MAX_146463 desiredTemperature: 30.0
2019.01.29 16:41:56 3: MaxScanner Scanner Timer.1404 ------------started ---------------- instance:Scanner
2019.01.29 16:41:56 3: MaxScanner Scanner Work.1324  next scan in seconds : 976
2019.01.29 16:41:56 3: MaxScanner Scanner Notify.322 will start <Scanner> triggerd by MAX_12b1de desiredTemperature: 18.5
2019.01.29 16:41:56 3: MaxScanner Scanner Timer.1404 ------------started ---------------- instance:Scanner
2019.01.29 16:41:56 3: MaxScanner Scanner Work.1324  next scan in seconds : 976
2019.01.29 16:41:56 3: MaxScanner Scanner Notify.322 will start <Scanner> triggerd by MAX_1464ec desiredTemperature: 19.5
2019.01.29 16:41:56 3: MaxScanner Scanner Timer.1404 ------------started ---------------- instance:Scanner
2019.01.29 16:41:56 3: MaxScanner Scanner Work.1324  next scan in seconds : 976
2019.01.29 16:41:56 3: MaxScanner Scanner Notify.322 will start <Scanner> triggerd by MAX_12b6a2 desiredTemperature: 22.0
2019.01.29 16:41:56 3: MaxScanner Scanner Timer.1404 ------------started ---------------- instance:Scanner
2019.01.29 16:41:56 3: MaxScanner Scanner Work.1324  next scan in seconds : 976
2019.01.29 16:41:56 3: MaxScanner Scanner Notify.322 will start <Scanner> triggerd by MAX_13cdaf desiredTemperature: 22.0
2019.01.29 16:41:56 3: MaxScanner Scanner Timer.1404 ------------started ---------------- instance:Scanner
2019.01.29 16:41:56 3: MaxScanner Scanner Work.1324  next scan in seconds : 976
2019.01.29 16:42:03 1: checkFritzMACpresent (FritzBox): mac_XX_XX_XX_XX_XX_XX nicht gefunden, abwesend.
2019.01.29 16:42:03 1: checkFritzMACpresent (FritzBox): mac_XX_XX_XX_XX_XX_XX nicht gefunden, abwesend.


Bei dem Eintrag "checkFritzMACpresent " wird der Status zu cmd_2 geändert und durch den MAXScanner zu cmd_3

VG
gary822
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Otto123 am 29 Januar 2019, 17:03:20
Zitat von: gary822 am 29 Januar 2019, 16:10:18
Leider wird der Status "cmd_3" nur einen Bruchteil gehalten weshalb ein list eher nicht möglich ist.
Sollte es natürlich auf BS ebene ein File geben auf welches ich ein tail laufen lassen kann dann kann ich das machen.
Dann schau in die Logs deiner Handy_x was da zum fraglichen Zeitpunkt abgeht!
Unter Garantie machen die ihren Status kurz hin und her.

Wenn das so ist, berücksichtigst Du bitte meine Tipps zur Anwesenheitskontrolle (https://forum.fhem.de/index.php/topic,96669.msg897539.html#msg897539)  ::)

Gruß Otto
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 17:18:39
Hallo Otto123,

ok ich muss dir recht geben das Handy schaltet zwischen present und absent -.-
auch wenn ich mir das absolut nicht erklären kann.

Ja scheinbar funktioniert das mit deine Anwesenheitsprüfung ganz gut.
Finde es nur etwas blöd das man für eine Anwesenheit drei "devices" hat.

VG
gary822
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Otto123 am 29 Januar 2019, 17:37:20
Hi gary822,

Du findest es vielleicht jetzt blöd. Nach einer Weile wirst Du es lieben :)

Ich habe sogar 4  ;D -> Hardware_Device -> structure_Person_Devices -> Person_Anwesend -> Structure_Bewohner_Anwesend
davon 3 für jeden Bewohner.

das Konstrukt richtest du einmal ein. Dann kannst Du Personen hinzufügen/wegnehmen und Geräte hinzufügen/wegnehmen OHNE das sich an deiner gesamten Logik etwas ändert.
Du kannst im Haus Aktionen für einzelne Personen machen oder für Alle.
Du musst nicht in allen DOIFs die Einträge deiner Handys ändern  ;D

Gruß Otto
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 17:45:45
Hallo Otto123,

das stimmt wohl aber das einrichten ist schon mega nervig :D

Danke für eure Unterstützung auch wenn ich den Wald nicht gesehen habe ;)

VG
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Otto123 am 29 Januar 2019, 17:54:59
Nö - denk mal weiter wie nervig es ist wenn dein FHEM denkt: Huch jetzt ist er kurz weg  ;D ;D ;D
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 17:57:18
Das kenne ich schon wenn man nur mal kurz beim Auto ist geht alles aus :D

EDIT:

Ganz kurz nur zum Verständnis:
Das Attribut "wait 10" sorgt das dafür das nach 10sec erneut geprüft wird oder das der Befehl erst nach 10sec ausgeführt wird?
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: Otto123 am 29 Januar 2019, 18:17:48
In meinem Beispiel? wait bewirkt 10 sec warten bevor cmd_1 ausgeführt wird. Wenn innerhalb der Zeit sich aber der Status ändert (cmd_2) passiert gar nichts, der Timer wird auch gelöscht.
Im realen Leben sind es bei mir aber dann 5 min :) 10 sec sind nur für den dummy Test brauchbar.
Titel: Antw:Fehlerhafte Schaltung DOIF - DOELSEIF - DOELSE
Beitrag von: gary822 am 29 Januar 2019, 18:20:22
Alles klar danke :)