[gelöst] repeatcmd verliert Wirkung wenn wait getriggert wurde

Begonnen von holle75, 07 März 2021, 15:19:07

Vorheriges Thema - Nächstes Thema

holle75

Hallo Ihr, um das Rad möglichst simpel neu zu erfinden, frage ich meine Fritzbox für eine Anwesenheitserkennung ab.

defmod HolgerAnwesenheitDOIF DOIF ([FritzBox:"mac_4C_57_CA_10_5B_26.*iPhoneSE-Holger"])\
(set Holger_Anwesenheit present)\
DOELSEIF ([FritzBox:"mac_4C_57_CA_10_5B_26.*inactive"])\
(set Holger_Anwesenheit absent)\
DOELSEIF ([FritzBox:".*"] and [FritzBox:mac_4C_57_CA_10_5B_26,"keinreading"] eq "keinreading")\
(set Holger_Anwesenheit absent)
attr HolgerAnwesenheitDOIF group Anwesenheit
attr HolgerAnwesenheitDOIF repeatcmd 1800:1800:1800
attr HolgerAnwesenheitDOIF wait 0:300:300


das funktioniert gut. Um zeitnah einen definitiven Status nach Neustart zu bekommen (das Reading existiert nach einer Zeit Abwesenheit nicht mehr) gibt es cmd_3.

Um halbstündige Events für ein Log zu generieren kam ich auf die Idee mit repeatcmd. Auch das funktioniert fast gut.

Problem: Wenn das DOIF von cmd_1 kommend in das wait bei cmd_2 läuft aber nicht schaltet (wieder Anwesenheit, bleibt cmd_1), wird danach das repeatcmd auf cmd_1 nicht mehr ausgeführt. Demnach auch keine halbstündigen Events mehr.

Gibt es dafür eine Erklärung?

Grüße!
H.

Damian

#1
ja, das liegt daran, dass der Wait-Timer für repeatcmd und für wait benutzt wird. Mit dem Setzen des Timers für cmd_2 wird der laufende Wait_timer für repeatcmd überschrieben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Aaah, ok, verstehe. Dann bau ich das um. Danke Damian

Damian

Zitat von: holle75 am 07 März 2021, 16:57:40
Aaah, ok, verstehe. Dann bau ich das um. Danke Damian

Alternativ kann man so etwas im Perl-Modus mit dem set_Exec-Timer realisieren, damit kann man beliebig viele Timer gleichzeitig starten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

#4
ich habe mir jetzt so geholfen

defmod HolgerAnwesenheitDOIF DOIF ([FritzBox:mac_4C_57_CA_10_5B_26] eq "iPhoneSE-Holger")\
(set Holger_Anwesenheit present)\
DOELSEIF ([FritzBox:mac_4C_57_CA_10_5B_26] eq "inactive")\
(set Holger_Anwesenheit absent)\
DOELSEIF ([FritzBox:".*"] and [FritzBox:mac_4C_57_CA_10_5B_26] eq "keinreading")\
(set Holger_Anwesenheit absent)
attr HolgerAnwesenheitDOIF do always
attr HolgerAnwesenheitDOIF event-min-interval .*:1800
attr HolgerAnwesenheitDOIF event-on-change-reading .*
attr HolgerAnwesenheitDOIF group Anwesenheit
attr HolgerAnwesenheitDOIF notexist "keinreading"
attr HolgerAnwesenheitDOIF wait 0:300:300


und die fritzbox macht mit event-min-interval mindestens alle 5 Minuten zu mac.* events.

Mal schauen wie das so läuft. Das "notexist" ist mir neu. Weiß nicht, ob es das tut was ich hoffe ;)

ps: braucht es eigentlich das [FritzBox:".*"]  in cmd_3 ... oder würde auch auf ein "nicht existentes Reading irgendwie" getriggert werden? Nee, wohl nicht.

Damian

defmod HolgerAnwesenheitDOIF DOIF ([FritzBox:mac_4C_57_CA_10_5B_26] eq "iPhoneSE-Holger")\
(set Holger_Anwesenheit present)\
DOELSEIF ([FritzBox:mac_4C_57_CA_10_5B_26,"inactive"] eq "inactive")\
(set Holger_Anwesenheit absent)


Das sollte schon ausreichen. Den Defaultwert kann man unmittelbar mit Komma angeben, dafür braucht man kein notexist-Reading.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

#6
stimmt, so macht das (noch) mehr Sinn. Danke

Edit: ... aber worauf triggert das DOIF dann, wenn es das Reading nicht mehr gibt (zB Neustart)? Oder funktioniert ein nicht vorhandenes Reading mit Defaultwert automatisch bei irgendeinem Event als Trigger?

Damian

Zitat von: holle75 am 07 März 2021, 21:41:22
stimmt, so macht das (noch) mehr Sinn. Danke

Edit: ... aber worauf triggert das DOIF dann, wenn es das Reading nicht mehr gibt (zB Neustart)? Oder funktioniert ein nicht vorhandenes Reading mit Defaultwert automatisch bei irgendeinem Event als Trigger?

Der Defaultwert ist nur für den Fall, dass ein Reading nicht belegt ist. Ich benutze auch die Anwesenheitserkenneung über die Fritzbox und sie funktioniert zuverlässig. Es wird offenbar inactive gesendet, bevor ein Reading verschwindet.
Siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Visualisierung:_Anwesenheitsstatus

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

#8
Ja, inactive wird kurzfristig vor dem Löschen des Readings gesetzt, aber ich versuche gerade noch einen Absturz/Neustart durchzudenken falls das Reading dann bei Abwesenheit währendessen nicht mehr existiert....

Dummystatus von "Holger_Anwesenheit " wäre zB "present", der Neustart dauert warum auch immer 20 Minuten, das Reading existiert nicht mehr weil man weg ist, das DOIF würde nicht getriggert und der dann falsche Status von "Holger_Anwesenheit " würde bestehen bleiben. 

edit: seehr hypothetisch, zugegeben

Sany

mal als Anregung Dein Vorhaben ohne DOIF, mit presence:
defmod HolgerAnwesenheit PRESENCE lan-ping hier.die.HandyIP.rein 83 84

attr HolgerAnwesenheit devStateIcon present:it_smartphone@limegreen absent:it_smartphone@slategrey timeout:hourglass@orange
attr HolgerAnwesenheit event-min-interval presence:3600
attr HolgerAnwesenheit event-on-change-reading presence


die 83/84 in der DEF sind die Zeiten für das ping-Intervall bei present/absent.
In der Fritz beim Handy muss eingetragen sein: Diesem Netzwerkgerät immer die gleiche IPv4-Adresse zuweisen.
Weiterhin kann in der Fritzbox die IP fest eingetragen sein, muss aber nicht.
Das Handy bekommt IMMER per DHCP eine IP zugewiesen (eben immer die gleiche!)

Das funktioniert bei mir seit langem sehr zuverlässig und wesentlich schneller, als die Geschichte mit der MAC-Adresse (besonders beim abmelden). Deine DOIF-Lösung sieht ein wenig nach der presence-Lösung mit function und Funktion in der 99_myUtils.pm aus dem Wiki aus. Hatte ich auch mal, weil "früher" der lan-ping irgendwie blocking sein konnte (wenn ich mich da recht erinnere??). Das ist nicht mehr der Fall und, wie gesagt, klappt jetzt einwandfrei. Kannst ja mal parallel testen und dann schauen, was dir besser liegt.

Viel Erfolg!

Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

holle75

So hatte ich es vorher in Kombi mit einem watchdog  und das hat ausreichend funktioniert. Aber bei (unseren) iPhones, je nach Firmware, leider dann final doch unzuverlässig. Selbst mit delays über 30 Minuten vor Abmeldung hats uns trotzdem ab und zu für 5 Minuten oder länger Abwesend gesetzt. Der Firlefanz der dann losgeht macht keine Freude.

Den Fritzbox-Ansatz probiere ich gerade und bis auf der kleinen Unschönheit oben an der ich gerade tüftel sehen die ersten 24 Stunden vielversprechend aus.

Erster Eindruck.

Das presence Device habe ich sogar noch drin, aber nur für "Anwesend" schalten. Min Interval bei der Fritzbox-Abfrage sind 60 Sekunden... und so lange möchte ich beim Heimkommen nicht aufs Licht Abends warten. Das Presence Device ist auf 5 und 60 als Frequenzen gesetzt und übersteuert das DOIF für "Anwesend". Die Fritzbox/DOIF macht "Anwesend" und "Abwesend"


Damian

Zitat von: holle75 am 07 März 2021, 23:33:14
So hatte ich es vorher in Kombi mit einem watchdog  und das hat ausreichend funktioniert. Aber bei (unseren) iPhones, je nach Firmware, leider dann final doch unzuverlässig. Selbst mit delays über 30 Minuten vor Abmeldung hats uns trotzdem ab und zu für 5 Minuten oder länger Abwesend gesetzt. Der Firlefanz der dann losgeht macht keine Freude.

Den Fritzbox-Ansatz probiere ich gerade und bis auf der kleinen Unschönheit oben an der ich gerade tüftel sehen die ersten 24 Stunden vielversprechend aus.

Erster Eindruck.

Das presence Device habe ich sogar noch drin, aber nur für "Anwesend" schalten. Min Interval bei der Fritzbox-Abfrage sind 60 Sekunden... und so lange möchte ich beim Heimkommen nicht aufs Licht Abends warten. Das Presence Device ist auf 5 und 60 als Frequenzen gesetzt und übersteuert das DOIF für "Anwesend". Die Fritzbox/DOIF macht "Anwesend" und "Abwesend"

Beim DOIF kannst du auch das Attribut https://fhem.de/commandref_DE.html#DOIF_checkReadingEvent auf Null setzen.

Dann wird bei jedem Event der Fritzbox das DOIF-Modul getriggert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Danke euch beiden.

Somit wurde jetzt das draus:
defmod HolgerAnwesenheitDOIF DOIF ([FritzBox:mac_4C_57_CA_10_5B_26] eq "iPhoneSE-Holger")\
(set Holger_Anwesenheit present)\
DOELSEIF ([FritzBox:mac_4C_57_CA_10_5B_26] eq "inactive")\
(set Holger_Anwesenheit absent)
attr HolgerAnwesenheitDOIF checkReadingEvent 0
attr HolgerAnwesenheitDOIF do always
attr HolgerAnwesenheitDOIF event-min-interval .*:1800
attr HolgerAnwesenheitDOIF event-on-change-reading .*
attr HolgerAnwesenheitDOIF group Anwesenheit
attr HolgerAnwesenheitDOIF notexist "inactive"
attr HolgerAnwesenheitDOIF wait 0:300


attr do always und die beiden attr event-...  sind für den Logeintrag um Anwesenheit protokollieren zu können. Nicht wirklich hübsch, aber mir fällt nichts besseres ein.
attr checkReadingEvent 0 ist um sicherzustellen, dass mein sehr hypothetischer Gedanke von weiter oben nicht eintreten kann.


Zum notexist hätte ich noch eine Verständnisfrage:
Zitat von: Damian am 07 März 2021, 21:36:38
defmod HolgerAnwesenheitDOIF DOIF ([FritzBox:mac_4C_57_CA_10_5B_26] eq "iPhoneSE-Holger")\
(set Holger_Anwesenheit present)\
DOELSEIF ([FritzBox:mac_4C_57_CA_10_5B_26,"inactive"] eq "inactive")\
(set Holger_Anwesenheit absent)


Das sollte schon ausreichen. Den Defaultwert kann man unmittelbar mit Komma angeben, dafür braucht man kein notexist-Reading.
würde dann nicht cmd_1 einen Error werfen, wenn das Reading nicht existiert?

Damian

Zitat von: holle75 am 08 März 2021, 11:06:41
Danke euch beiden.

Somit wurde jetzt das draus:
defmod HolgerAnwesenheitDOIF DOIF ([FritzBox:mac_4C_57_CA_10_5B_26] eq "iPhoneSE-Holger")\
(set Holger_Anwesenheit present)\
DOELSEIF ([FritzBox:mac_4C_57_CA_10_5B_26] eq "inactive")\
(set Holger_Anwesenheit absent)
attr HolgerAnwesenheitDOIF checkReadingEvent 0
attr HolgerAnwesenheitDOIF do always
attr HolgerAnwesenheitDOIF event-min-interval .*:1800
attr HolgerAnwesenheitDOIF event-on-change-reading .*
attr HolgerAnwesenheitDOIF group Anwesenheit
attr HolgerAnwesenheitDOIF notexist "inactive"
attr HolgerAnwesenheitDOIF wait 0:300


attr do always und die beiden attr event-...  sind für den Logeintrag um Anwesenheit protokollieren zu können. Nicht wirklich hübsch, aber mir fällt nichts besseres ein.
attr checkReadingEvent 0 ist um sicherzustellen, dass mein sehr hypothetischer Gedanke von weiter oben nicht eintreten kann.


Zum notexist hätte ich noch eine Verständnisfrage:würde dann nicht cmd_1 einen Error werfen, wenn das Reading nicht existiert?

es ist alles nicht tragisch, weil ich bei nicht existierenden Readings inzwischen "" zurück liefere.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF