Wie schon im Titel beschrieben frage ich mich warum die PRESENCE Devices nach einem Neustart von FHEM immer wieder bei "maybe absent" anfangen, obwohl sie vor dem Neustart auf "absent" standen.
Das ist in einigen Situationen sehr hinderlich denn z.B. ein notify auf "absent" wird dann nach dem Neustart und Durchlaufen der "absenceThreshold" erneut getriggert, da ja zwischenzeitlich state auf "maybe absent" stand und sich somit von "absent" unterscheidet. Ob das bei "presenceThreshold" auch so ist kann ich nicht sagen, da ich es nicht brauche.
Warum ist das so "unglücklich"?
Lässt sich das beheben?
Der letzte Stand vor dem Neustart müsste doch eigentlich aus dem statefile kommen und dementsprechend wieder "absent" sein!? ???
Gruß
Dan
Das ist auch erst seit dem letzten oder vorletzten Update so. Hatte das auch schon angesprochen, allerdings im falschen Thread.
@Markus
Hast Du eine Idee wie das auf einmal da rein gekommen sein kann?
Grüße
Das ist schon so lange, soweit ich mich recht erinnere, wie es absenceThreshold im Modul gibt und ärgert mich schon immer.
Gruß
Dan
Also bei mir ist es erst vor ein oder zwei Monaten gekommen. Vorher hatte es gut funktioniert.
*Hust*
**Lutschbonbon reich**
Habe dem Markus mal eine Nachricht geschickt.
Zitat von: CoolTux am 11 Mai 2017, 13:55:18
Habe dem Markus mal eine Nachricht geschickt.
Danke, dann können wir ja gespannt sein... 8)
Gruß
Dan
Hallo zusammen,
sorry, dass ich den Thread übersehen habe. Ich bin in letzter Zeit nicht mehr so häufig im Forum unterwegs. Der Sommer kommt ;)
Der Grund liegt daran, dass die internen Counter beim Start von FHEM noch nicht existieren:
$hash->{helper}{PRESENT_COUNT}
$hash->{helper}{ABSENT_COUNT}
Sie zählen dann erst hoch und erst dann gehen sie final auf absent bzw. present.
Diesen Counter müsste man eigentlich abspeichern in Form von Readings mit Punkt beginnend. Beim Starten müsste man die Counter darüber wieder einlesen, dann wäre der Status beim ersten Check sofort wieder absent/present.
Kann ich erst am Wochenende angehen, oder jemand stellt einen funktionierenden Patch bereit 8)
Viele Grüße
Markus
Und was ist wenn Du sie in der define einfach deklarierst?
$hash->{helper}{PRESENT_COUNT} = 0;
$hash->{helper}{ABSENT_COUNT} = 0;
Würde das in der Define Funktion Sinn ergeben?
Bei mir gibt es bereits entsprechende Readings an den Devices.
Und ich habe die da nicht zusätzlich erzeugt. 8)
Internals:
ADDRESS BLABLABLA
CHANGED
DEF lan-bluetooth BLABLABLA 127.0.0.1:5333 10 30
DeviceName 127.0.0.1:5333
FD 38
MODE lan-bluetooth
NAME PRESENCE_rr_Dan
NOTIFYDEV global
NR 101
NTFY_ORDER 50-PRESENCE_rr_Dan
PARTIAL
STATE present
TIMEOUT_NORMAL 10
TIMEOUT_PRESENT 30
TYPE PRESENCE
Helper:
Dblog:
Battery:
Logdb:
TIME 1494523617.09942
VALUE 85
Presence:
Logdb:
TIME 1494523599.10279
VALUE present
Readings:
2017-05-11 19:26:29 .absenceThresholdCounter 0
2017-05-11 22:14:39 .presenceThresholdCounter 0
2017-05-11 19:26:57 battery 85
2017-05-11 19:26:39 command_accepted yes
2017-05-11 22:14:39 daemon lepresenced V0.81
2017-05-11 22:14:39 device_name Gigaset G-tag
2017-05-11 22:14:39 presence present
2017-05-11 22:14:39 rssi -70
2017-05-11 22:14:39 state present
Helper:
CURRENT_STATE present
CURRENT_TIMEOUT present
Attributes:
absenceThreshold 10
Gruß
Dan
P.S. Kann gerne warten, kein Stress Markus.
Schaue gerade mal interessenhalber ins Modul:
if(grep(m/^(?:INITIALIZED|REREADCFG)$/, @{$events}))
{
$hash->{helper}{ABSENT_COUNT} = int(ReadingsVal($name, ".absenceThresholdCounter", 0));
$hash->{helper}{PRESENT_COUNT} = int(ReadingsVal($name, ".presenceThresholdCounter", 0));
}
Wird sogar wieder eingelesen.
Gruß
Dan
Du hast leider die Readings immer auf 0 gesetzt wenn die Threshold erreicht war. 8)
Hier ein kurz getesteter Diff der bei mir funktioniert wie gewünscht.Zitat
Index: FHEM/73_PRESENCE.pm
===================================================================
--- FHEM/73_PRESENCE.pm (revision 14249)
+++ FHEM/73_PRESENCE.pm (working copy)
@@ -1289,7 +1289,7 @@
{
if(++$count >= $absenceThreshold)
{
- readingsBulkUpdate($hash, ".absenceThresholdCounter", 0);
+ readingsBulkUpdate($hash, ".absenceThresholdCounter", $count);
readingsBulkUpdate($hash, "state", "absent");
readingsBulkUpdate($hash, "presence", "absent");
}
@@ -1334,7 +1334,7 @@
{
if(++$count >= $presenceThreshold)
{
- readingsBulkUpdate($hash, ".presenceThresholdCounter", "0");
+ readingsBulkUpdate($hash, ".presenceThresholdCounter", $count);
readingsBulkUpdate($hash, "state", "present");
readingsBulkUpdate($hash, "presence", "present");
Gruß
Dan
Also für mich ergibt die Null Sinn. Der Threshold ist abgeschlossen, die Readings werden gesetzt und der Zähler geht wieder auf Null. Wieso soll das jetzt falsch sein?
Grüße
Zitat von: CoolTux am 11 Mai 2017, 23:16:35
Also für mich ergibt die Null Sinn. Der Threshold ist abgeschlossen, die Readings werden gesetzt und der Zähler geht wieder auf Null. Wieso soll das jetzt falsch sein?
Grüße
Eben nicht!
Der Zähler muss doch auf dem letzten (höchsten) Stand stehen bleiben, damit der eben beim Neustart nicht bei 0 anfängt zu zählen sondern bei dem letzten Stand und damit merkt dass der absent Cycle schon durchlaufen ist.
Gruß
Dan
Ok, wahrscheinlich muss man sich Mal den ganzen Code anschauen. Werde das mal so einbauen und testen bei mir. Ausserdem schaue ich morgen mal in den Code.
Habe gerade vor $count noch das -- ergänzt damit der Zähler stimmt.
Bei mir überleben die absent Devices so schon mal sauber einen Neustart. 8)
Gruß
Dan
Ganz rund ist die Sache noch nicht, denn der Counter muss ja tatsächlich wieder auf 0 gesetzt werden.
Ich denke so geht es, die Readings waren einfach vertauscht:
ZitatIndex: FHEM/73_PRESENCE.pm
===================================================================
--- FHEM/73_PRESENCE.pm (revision 14249)
+++ FHEM/73_PRESENCE.pm (working copy)
@@ -1289,7 +1289,7 @@
{
if(++$count >= $absenceThreshold)
{
- readingsBulkUpdate($hash, ".absenceThresholdCounter", 0);
+ readingsBulkUpdate($hash, ".presenceThresholdCounter", 0);
readingsBulkUpdate($hash, "state", "absent");
readingsBulkUpdate($hash, "presence", "absent");
}
@@ -1334,7 +1334,7 @@
{
if(++$count >= $presenceThreshold)
{
- readingsBulkUpdate($hash, ".presenceThresholdCounter", "0");
+ readingsBulkUpdate($hash, ".absenceThresholdCounter", 0);
readingsBulkUpdate($hash, "state", "present");
readingsBulkUpdate($hash, "presence", "present");
Gruß
Dan
EDIT:
Nein immer noch nicht!
Die Mischung aus beiden klappt nun gut bei mir:
Index: FHEM/73_PRESENCE.pm
===================================================================
--- FHEM/73_PRESENCE.pm (revision 14249)
+++ FHEM/73_PRESENCE.pm (working copy)
@@ -1289,7 +1289,8 @@
{
if(++$count >= $absenceThreshold)
{
- readingsBulkUpdate($hash, ".absenceThresholdCounter", 0);
+ readingsBulkUpdate($hash, ".presenceThresholdCounter", 0);
+ readingsBulkUpdate($hash, ".absenceThresholdCounter", $count);
readingsBulkUpdate($hash, "state", "absent");
readingsBulkUpdate($hash, "presence", "absent");
}
@@ -1334,7 +1335,8 @@
{
if(++$count >= $presenceThreshold)
{
- readingsBulkUpdate($hash, ".presenceThresholdCounter", "0");
+ readingsBulkUpdate($hash, ".absenceThresholdCounter", 0);
+ readingsBulkUpdate($hash, ".presenceThresholdCounter", --$count);
readingsBulkUpdate($hash, "state", "present");
readingsBulkUpdate($hash, "presence", "present");
Hast Du es mal getestet Marko?
Gruß
Dan
Zitat von: DeeSPe am 12 Mai 2017, 23:15:02
Hast Du es mal getestet Marko?
Gruß
Dan
Leider noch nicht. Bin noch nicht dazu gekommen. Stecke mitten im Umbau von AMAD fest ;D
Läuft es bei Dir?
Grüße
Es tut erfolgreich seinen Dienst, überlebt die Neustarts problemlos und setzt auch den Zähler zurück.
Sogar wenn man mitten in einem absence Cycle neustartet, startet auch PRESENCE wieder beim richtigen Zähler.
Ganz perfekt ist der Zähler am Ende (nach Ablauf des Cycle) irgendwie teilweise noch nicht! 8)
Ist aber nur ein Schönheitsfehler, der nicht wirklich stört. Markus wird da sicher gleich die Lösung für sehen.
Habe allerdings bisher auch nur den absence Cycle getestet. presenceThreshold habe ich nicht im Einsatz.
Gruß
Dan
Klingt auf jeden Fall gut. PresenceThreshold habe ich auch nicht im Einsatz.
Hallo zusammen,
mein Fehler war, dass ich beim erreichen des finalen Zustands (absent/present), den Counter mit dem Wert 0 gespeichert habe, was bei einem Neustart ein erneutes durchgehen zufolge hat. Jetzt wird der Counter im korrekten Zustand gespeichert, sodass nach einem Neustart der Zustand sofort final gesetzt wird.
Vielen Dank für eure Hilfe.
Gruß
Markus
Danke, und freut mich dass Du das so schnell gefixt hast. :)
Dann war ja meine vorgeschlagene Änderung gar nicht sooo schlecht. 8)
Und eigentlich hattest Du ja, entgegen Deiner eigenen Vermutung, bereits alles vorbereitet. Nur war die Umsetzung noch nicht ganz perfekt.
Gruß
Dan
Zitat von: DeeSPe am 13 Mai 2017, 13:17:38
Und eigentlich hattest Du ja, entgegen Deiner eigenen Vermutung, bereits alles vorbereitet. Nur war die Umsetzung noch nicht ganz perfekt.
Man wird mit dem zunehmenden Alter eben auch vergesslicher ;)
Und attraktiver, vergiss das attraktiver nicht!!!
;D ;D ;D