vorschlag PRESENCE threshold

Begonnen von justme1968, 07 April 2016, 12:10:05

Vorheriges Thema - Nächstes Thema

Markus Bloch

Wieso? Wenn das Reading "presence" den Timestamp enthält, wann es zuletzt geändert wurde (was ja dein Patch in dem anderen Thread bewirken soll), dann kann man doch den Zeitpunkt der Änderung mittels ReadingsTimestamp oder ReadingsAge ermitteln. Ich persönlich würde diese Lösung vorziehen, da sie systemweit anwendbar ist.

Dein Fall mit dem DHCP Lease versteh ich gerade irgendwie nicht...  :-\

Gruß
Markus

Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

justme1968

das mit dem rechnen ist zwar prinzipiell kein problem. beim ftui ist es aber einfacher nur ein reading anzuzeigen.

das ginge zwar über user readings aber eigentliche grund ist natürlich das der vorschlag hier ist eine halbe stunde älter ist als der generelle ansatz aus dem anderen theead :)

eine airport base station meldet ein gerät erst etwa 15 minuten nach dem letzten kontakt als abwesend. ich vermute das ist die lease zeit. ich habe aber noch nicht nachgeschaut.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

ragnarok

#32
Kann ich mir hier noch eine kleine Änderung wünschen ?

Eingestiegen bin ich in das Presence Modul ohne die absenceThreshold und ich reagiere explizit auf presence = present / absent mit je einem Notify genau auf diese Statusänderung.

Jetzt habe ich noch einen absenceThreshold definiert und keinen Timeout. Mein Problem ist nun, dass in der 73_PRESENCE.pm Methode ProcessState der Status auch von absent auf maybe absent wechselt, sobald dann nochmal der absenceThreshold abläuft, wird mein notify nochmal getriggert.

Mich interessiert aber nur die Kette von present->maybe absent->absent und nicht absent->maybe absent->absent.

Das "if($hash->{MODE} eq "event")" trifft nicht zu, weshalb er da in das else geht.

Ich habe es bei mir lokal auch schon umgebaut, nur mit dem nächsten Update ist das natürlich nochmal weg.

Könnte man also die folgende Stelle

            if(++$count >= $absenceThreshold)
            {
                readingsBulkUpdate($hash, ".presenceThresholdCounter", 0);
                readingsBulkUpdate($hash, ".absenceThresholdCounter", ($count-1));
                readingsBulkUpdate($hash, "state", "absent");
                readingsBulkUpdate($hash, "presence", "absent");
            }
            else
            {
                $hash->{helper}{ABSENT_COUNT} = $count;

                readingsBulkUpdate($hash, ".presenceThresholdCounter", 0);
                readingsBulkUpdate($hash, ".absenceThresholdCounter", $count);
                readingsBulkUpdate($hash, "state", "maybe absent");
                readingsBulkUpdate($hash, "presence", "maybe absent");

                Log3 $name, 4, "PRESENCE ($name) - device is absent after $count check".($count == 1 ? "" : "s").". ".($absenceThreshold-$count)." check".(($absenceThreshold-$count) == 1 ? "" : "s")." left $
            }


ändern auf das hier und analog dazu auch untendrunter, wenn $state gleich "present" ?

            if(++$count >= $absenceThreshold)
            {
                readingsBulkUpdate($hash, ".presenceThresholdCounter", 0);
                readingsBulkUpdate($hash, ".absenceThresholdCounter", ($count-1));
                readingsBulkUpdate($hash, "state", "absent");
                readingsBulkUpdate($hash, "presence", "absent");
            }
            else
            {
                $hash->{helper}{ABSENT_COUNT} = $count;

                readingsBulkUpdate($hash, ".presenceThresholdCounter", 0);
                readingsBulkUpdate($hash, ".absenceThresholdCounter", $count);
                if ($current_state ne "absent")
                {
                    readingsBulkUpdate($hash, "state", "maybe absent");
                    readingsBulkUpdate($hash, "presence", "maybe absent");
                }

                Log3 $name, 4, "PRESENCE ($name) - device is absent after $count check".($count == 1 ? "" : "s").". ".($absenceThreshold-$count)." check".(($absenceThreshold-$count) == 1 ? "" : "s")." left $
            }


In meinen Augen ist es so sogar richtiger, wie es aktuell ist.

Als Modus habe ich function gewählt und benutze die checkAllFritzMACpresent aus dem Wiki.

Markus Bloch

#33
Hallo Ragnarok,

eigentlich können mMn nur folgende Zustandswechsel auftreten:

present -> absent -> present  (ohne absenceThreshold/presentThreshold)
present -> maybe absent -> absent (absenceThreshold=2)
absent -> maybe present -> present (presenceThreshold=2)

absent -> maybe present -> absent (erster Check positiv, zweiter negativ)
present -> maybe absent -> present (erster Check negativ, zweiter positiv)

Ein Zustandswechsel absent -> maybe absent -> absent ist so nicht vorgesehen und habe ich auch bei meinen (damaligen) Tests nicht feststellen können. In so einem Fall, bleibt der Status konstant auf absent.

Falls das bei dir dennoch der Fall sein sollte, bitte mal die Ausgabe des FHEM-Befehls "list" von deiner PRESENCE-Definition hier posten, sowie das verbose-Attribut deiner PRESENCE-Definition bitte mal auf 5 stellen, einige Zeit warten bis der Fehler wieder auftritt und dann bitte die gesamten Logmeldungen zu PRESENCE aus deinem fhem.log hier anhängen.

Vielen Dank

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

ragnarok

Hallo Markus,

danke für deine Antwort. Frag mich bitte nicht, was ich am 27. da gemacht habe, ich kriege es grad nicht mehr nachgestellt.

Hab das ganze zwischenzeitlich noch eingeschränkt, dass das Notify nur morgens innerhalb einer bestimmten Uhrzeit auf absent reagieren soll und das gleiche auch mittags bei present. Ansonsten wurde das Notify ohne weitere Aktion beendet.

Hab jetzt mal testweise wieder die originale 73_PRESENCE.pm aktiv und dafür gesorgt, dass ich bei jedem Wechsel auf present oder absent ne Nachricht per Telegram bekomme.

Falls ich da jetzt wieder erwarten Botschaft bekomme, würde ich mich nochmal melden ;-)

Gruß Michael