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
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
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
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 ;)
Hallo @Per,
danke für den Hinweis leider löst das mein Problem nicht :D
VG
gary822
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
Hallo Otto123,
ich versuche mal meinen Hintergrund dazu etwas aufzudrieseln :D
cmd_1: (set MAX_14649c desiredTemperature manual comfort(18.5°))
- Uhrzeit wahr
- Temperatur unter 20°
- eine Person anwesend
cmd_2: (set MAX_14649c desiredTemperature manual 15.0)
- Uhrzeit falsch
- Temperatur über 20°
- eine Person anwesend
cmd_3: (set MAX_14649c desiredTemperature manual eco(5.0°))
- Uhrzeit irrelevant
- Temperatur irrelevant
- keiner ist anwesend
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
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
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
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:
- Baue ein Abwesenheitsschwelle ein: present sofort, absent erst nach 5 min.
- packe alle in eine Structure, nimm die structure für alles weitere
- ich nehme sogar noch eine Stufe mehr -> https://heinz-otto.blogspot.com/2016/01/anwesenheitserkennung.html
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
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
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
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
presentGruß Otto
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
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.
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
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
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
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
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
Nö - denk mal weiter wie nervig es ist wenn dein FHEM denkt: Huch jetzt ist er kurz weg ;D ;D ;D
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?
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.
Alles klar danke :)