doif löst nicht mehr aus

Begonnen von mheiker, 09 Januar 2021, 00:46:23

Vorheriges Thema - Nächstes Thema

mheiker

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

amenomade

Bitte ein vollständiges "list" vom DOIF liefern (am besten, wenn er den "falschen" Zustand hat)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

mheiker

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

amenomade

iPhone:last_absent und iPhone:last_present schicken kein Event mehr (seit März 2019?)

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

mheiker

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...

SamNitro

Versuch mal das [iPhone:last_present] in doppelte klammern zu setzen.

[[iPhone:last_present]]
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

amenomade

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"
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

SamNitro

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.
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

mheiker

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",'')}

mheiker

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!

Damian

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?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

mheiker

Ja, das weiß ich. Stellt das denn ein Problem in der Logik des doifs dar?

amenomade

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
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF