Hallo zusammen,
seit einiger Zeit löst meine doif-Abfrage, die bisher funktionierte und an der ich nichts geändert habe, nicht mehr aus.
Hintergrund der Abfrage ist es, dass FHEM anhand eines eigenen Readings "last_present" in "iPhone" (LAN-Ping) erkennt, ob ich 360 Sekunden nach dem Tür-öffnen zu Hause bin und meinen Zustand entsprechend auf "present" oder "absent" stellt.
In "iPhone:last_present" wird immer dann, wenn das iPhone per LAN-Ping erkannt wird, die entsprechende Zeit geschrieben.
Ich bin etwas hilflos, die Abfragen liefen bis dato recht stabil. Jetzt checkt die doif-Abfrage nur noch, wenn ich in FHEM manuell ein "checkall" auslöse. Dann laufen die Prüfungen korrekt durch und mein Zustand wird korrekt gesetzt...
Die Abfrage ist folgende:
([Mathias] ne "present" and
time_str2num([iPhone:last_present]) - 360 > time_str2num(ReadingsTimestamp("tuer","state","")))
(set Mathias present)
DOELSEIF (([Mathias] eq "present") and
[tuer] eq "open")
(set Mathias going)
DOELSEIF (([Mathias] eq "going" or [Mathias] eq "coming") and
[iPhone] eq "absent" and
time_str2num([iPhone:last_present]) - 900 < time_str2num(ReadingsTimestamp("tuer","state","")) and
(time - 900) > time_str2num(ReadingsTimestamp("tuer","state","0")))
(set Mathias absent)
DOELSEIF (([Mathias] eq "absent") and
[tuer] eq "open")
(set Mathias coming)
Ich hoffe, jemand hat eine zündende Idee?
Viele Grüße
Mathias
Bitte ein vollständiges "list" vom DOIF liefern (am besten, wenn er den "falschen" Zustand hat)
Hier die "list" des doifs:
Internals:
DEF ([Mathias] ne "present" and
time_str2num([iPhone:last_present]) - 360 > time_str2num(ReadingsTimestamp("tuer","state","")))
(set Mathias present)
DOELSEIF (([Mathias] eq "present") and
[tuer] eq "open")
(set Mathias going)
DOELSEIF (([Mathias] eq "going" or [Mathias] eq "coming") and
[iPhone] eq "absent" and
time_str2num([iPhone:last_present]) - 900 < time_str2num(ReadingsTimestamp("tuer","state","")) and
(time - 900) > time_str2num(ReadingsTimestamp("tuer","state","0")))
(set Mathias absent)
DOELSEIF (([Mathias] eq "absent") and
[tuer] eq "open")
(set Mathias coming)
FUUID 5c46bfc9-f33f-698d-f8f3-6bf6845f7ff522ef
MODEL FHEM
NAME di_Mathias
NOTIFYDEV tuer,global,Mathias,iPhone
NR 84
NTFY_ORDER 50-di_Mathias
STATE cmd_4
TYPE DOIF
VERSION 23418 2020-12-26 10:04:12
READINGS:
2021-01-09 11:21:05 Device iPhone
2021-01-08 20:10:20 cmd 4
2021-01-08 20:10:20 cmd_event tuer
2021-01-08 20:10:20 cmd_nr 4
2021-01-09 11:18:14 e_tuer_STATE close
2020-12-31 17:54:56 e_Mathias_STATE present
2021-01-09 11:21:05 e_iPhone_STATE present
2019-03-08 21:28:52 iPhone_last_absent 2019-03-08 21:19:48
2019-03-08 21:28:52 iPhone_last_present 2019-03-08 21:25:26
2020-12-31 17:54:01 mode enabled
2019-03-05 17:01:37 present
2021-01-08 20:10:20 state cmd_4
Regex:
accu:
cond:
tuer:
0:
1:
&STATE ^tuer$
2:
3:
&STATE ^tuer$
Mathias:
0:
&STATE ^Mathias$
1:
&STATE ^Mathias$
2:
&STATE ^Mathias$
3:
&STATE ^Mathias$
iPhone:
0:
last_present ^iPhone$:^last_present:
1:
2:
&STATE ^iPhone$
last_present ^iPhone$:^last_present:
3:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::InternalDoIf($hash,'Mathias','STATE') ne "present" and time_str2num(::ReadingValDoIf($hash,'iPhone','last_present')) - 360 > time_str2num(ReadingsTimestamp("tuer","state",""))
1 (::InternalDoIf($hash,'Mathias','STATE') eq "present") and ::InternalDoIf($hash,'tuer','STATE') eq "open"
2 (::InternalDoIf($hash,'Mathias','STATE') eq "going" or ::InternalDoIf($hash,'Mathias','STATE') eq "coming") and ::InternalDoIf($hash,'iPhone','STATE') eq "absent" and time_str2num(::ReadingValDoIf($hash,'iPhone','last_present')) - 900 < time_str2num(ReadingsTimestamp("tuer","state","")) and (time - 900) > time_str2num(ReadingsTimestamp("tuer","state","0"))
3 (::InternalDoIf($hash,'Mathias','STATE') eq "absent") and ::InternalDoIf($hash,'tuer','STATE') eq "open"
do:
0:
0 set Mathias present
1:
0 set Mathias going
2:
0 set Mathias absent
3:
0 set Mathias coming
4:
helper:
DEVFILTER ^global$|^tuer$|^Mathias$|^iPhone$
NOTIFYDEV global|tuer|Mathias|iPhone
event present
globalinit 1
last_timer 0
sleeptimer -1
timerdev tuer
timerevent open,contact: false,linkquality: 31,voltage: 3015,battery: ok,battery_level: 100
triggerDev iPhone
timerevents:
open
contact: false
linkquality: 31
voltage: 3015
battery: ok
battery_level: 100
timereventsState:
state: open
contact: false
linkquality: 31
voltage: 3015
battery: ok
battery_level: 100
triggerEvents:
present
triggerEventsState:
state: present
internals:
all Mathias:STATE tuer:STATE iPhone:STATE
readings:
all iPhone:last_present
trigger:
uiState:
uiTable:
Attributes:
room DOIF,Residents
iPhone:last_absent und iPhone:last_present schicken kein Event mehr (seit März 2019?)
März kann gut hinkommen, das Problem gibt es schon länger und ich habe bis jetzt keine Zeit gehabt, mich da reinzudenken.
Woran mag das liegen? An den presence-Modulen mit LAN-Ping habe ich nichts geschraubt...
Versuch mal das [iPhone:last_present] in doppelte klammern zu setzen.
[[iPhone:last_present]]
Zitat von: SamNitro am 09 Januar 2021, 21:35:42
Versuch mal das [iPhone:last_present] in doppelte klammern zu setzen.
[[iPhone:last_present]]
Warum denn? ? ? Doppelte eckige Klammern sind für indirekte Zeitangaben als Zeittrigger, aber da nutzt er time_str2num()
@mheiker: zeig mal ein "list iPhone"
Hatte gedacht das last present eine Zeitangabe ist. Hatte letztens ein Problem mit einer indirekt Zeitangabe und dachte jetzt das könnte der selbe Fall sein.
Die doppelten eckigen Klammern habe ich einmal getestet, leider kein Erfolg...
Das "list iPhone":
Internals:
ADDRESS 192.168.178.50
DEF lan-ping 192.168.178.50 20 180
FUUID 5c46bfc9-f33f-698d-29e0-29c6cb50d5a00d46
INTERVAL_NORMAL 20
INTERVAL_PRESENT 180
MODE lan-ping
NAME iPhone
NOTIFYDEV global
NR 80
NTFY_ORDER 50-iPhone
STATE present
TYPE PRESENCE
READINGS:
2021-01-10 18:28:52 last_absent 2021-01-10 18:28:28
2021-01-10 18:28:52 last_present 2021-01-10 18:28:52
2019-03-04 21:38:35 last_present_seconds 1551731764
2020-12-31 17:56:16 model lan-ping
2021-01-10 18:28:52 presence present
2021-01-10 18:28:52 state present
helper:
CURRENT_STATE present
Attributes:
room Residents
userReadings last_present {ReadingsVal("iPhone","state",'')eq"present" ? ReadingsTimestamp("iPhone","state",'') : ReadingsVal("iPhone","last_present",'')}, last_absent {ReadingsVal("iPhone","state",'')eq"absent" ? ReadingsTimestamp("iPhone","state",'') : ReadingsVal("iPhone","last_absent",'')}
Juhu, es funktioniert wieder :) Aber ich habe keine Ahnung, warum! ???
Nachdem die doppelte eckige Klammer entfernt wurde (und nur die): Änderungen gespeichert und das doif läuft jetzt wieder problemlos!
Zitat von: mheiker am 10 Januar 2021, 18:32:30
Juhu, es funktioniert wieder :) Aber ich habe keine Ahnung, warum! ???
Nachdem die doppelte eckige Klammer entfernt wurde (und nur die): Änderungen gespeichert und das doif läuft jetzt wieder problemlos!
Du weißt aber, dass DOIF standardmäßig nur einmal die selbe Anweisung ausführt, wenn das Attribut do always nicht gesetzt ist?
Ja, das weiß ich. Stellt das denn ein Problem in der Logik des doifs dar?
Zitat von: mheiker am 10 Januar 2021, 18:32:30
Juhu, es funktioniert wieder :) Aber ich habe keine Ahnung, warum! ???
Ja, weil iPhone auch wieder funktioniert:
Zitat READINGS:
2021-01-10 18:28:52 last_absent 2021-01-10 18:28:28
2021-01-10 18:28:52 last_present 2021-01-10 18:28:52
Zitat von: mheiker am 10 Januar 2021, 18:50:54
Ja, das weiß ich. Stellt das denn ein Problem in der Logik des doifs dar?
Nur dann, wenn man das Schalten eines Zweiges erwartet, obwohl das Modul bereits in diesem Zustand ist.