(gelöst) PRESENCE als function bzgl. eines Readings

Begonnen von macfly, 21 Dezember 2020, 20:20:50

Vorheriges Thema - Nächstes Thema

macfly

Moin zusammen,

ich versuche gerade, meine PRESENCE-Implementierung (mit unifi-controller) von event-basiert:
defmod PRESENCE.user PRESENCE event unifi:Handy:.disconnected unifi:Handy:.connected

umzustellen auf function-basiert. Grund dafür ist, dass mein Handy beim wechseln zwischen zwei Accesspoints immer mal wieder als disconnected angezeigt wird (nur ganz kurz), und dann schon mal spontan die Rolladen fahren *grmbls*

ich versuch das gerade so:
defmod PRESENCE.userTest PRESENCE function { return ((time() - time_str2num(ReadingsVal("unifi", "Handy_last_seen",0))) > 300) }


also, PRESENCE.userTest soll "abwesend" werden, wenn das handy länger als 5 minuten nicht "gesehen" wurde. Aber PRESENCE.userTest ist nur im Status error und ich sehe den Wald gerade nicht.

mag da mal jemand drüber schauen?

vielen Dank,
Friedhelm




betateilchen

Zitat von: macfly am 21 Dezember 2020, 20:20:50
Grund dafür ist, dass mein Handy beim wechseln zwischen zwei Accesspoints immer mal wieder als disconnected angezeigt wird (nur ganz kurz), und dann schon mal spontan die Rolladen fahren *grmbls*

Solche kurzen disconnects kannst Du doch einfach mit dem Attribut absenceThreshold unterdrücken.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

macfly

Zitat von: betateilchen am 21 Dezember 2020, 20:23:14
Solche kurzen disconnects kannst Du doch einfach mit dem Attribut absenceThreshold unterdrücken.

Ja schon, aber der zustand wechselt dann immer auf "maybe absent" - das sieht doof aus.

Otto123

Hi,

sieht doof aus? Wo? Im STATE? Kannst Du doch ändern. ;)

Bei event ist es das absenceTimeout Attribute :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

macfly

Ja, das habe ich soweit verstanden.
Bei mir ist absenceTimeout auf 00:05:00, und nach dem ersten "Fehlalarm" steht das presence-device auf "maybe absent" und nach knapp 60 Sekunden wieder auf present.

Deswegen will ich das umstellen, außerdem will ich verstehen, wieso das mit der function definition im PRESENCE-Device nicht funktioniert. Das letztere ist eigentlich noch wichtiger. ;-)


Zitat von: Otto123 am 21 Dezember 2020, 21:57:05
Hi,

sieht doof aus? Wo? Im STATE? Kannst Du doch ändern. ;)

Bei event ist es das absenceTimeout Attribute :)

Gruß Otto

macfly

Oh, ich lese gerade, das steht sogar in der Doku  ;D

Zitat
absenceTimeout

(only in mode "event" applicable)
The timeout after receiving an "absent" event, before the state of the PRESENCE definition is switched to "absent". This can be used to verify the permanent absence by waiting a specific time frame to not receive an "present" event. If this timeout is reached with no "present" event received in the meantime, the presence state will finally be set to "absent". The timeout is given in HH:MM:SS format, where hours and minutes are optional. If this attribute is set to a valid value, the reading state and presence will be set to "maybe absent" during the absence verification.

und genau das will ich nicht ..

Otto123

Sagst Du mir noch welche Anzeige Du doof findest? Du willst im STATE nur absent und present? Kann man ändern :)

Testen wir Deine Funktion:
{ return ((time() - time_str2num("2020-12-22 18:20:00")) > 300) } - liefert jetzt 1  - wäre aber abwesend
{ return ((time() - time_str2num("2020-12-22 18:30:00")) > 300) } - liefert jetzt nix wäre aber jetzt anwesend
ist also genau anders
ZitatDiese Funktion muss 0 (Abwesend) oder 1 (Anwesend) zurückgeben. Ein entsprechendes Beispiel findet man im FHEM-Wiki.

Was liefert das hier wirklich zurück?
ReadingsVal("unifi", "Handy_last_seen",0)

https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

#7
Für das maybe absent "Problem" ein stateFormat als Vorschlag:
{ReadingsVal($name,'presence','error') =~ /maybe|present/?'present':'absent'}

Aber Vorsicht: das ändert nur STATE und nicht state ;)
Deswegen die Frage: Was ist eigentlich doof?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

macfly

Moin,

das hat mir zumindest zu einem Ergebnis verholfen.

ReadingsVal("unifi", "Handy_last_seen",0) liefert:
2020-12-22 19:54:03

und ja, der Vergleichsoperator war falsch rum.


Ich habe das jetzt mit dem ?Operator gelöst bekommen:


defmod PRESENCE.user PRESENCE function {return ((time() - time_str2num(ReadingsVal("unifi", "Handy_last_seen",0))) > 300)?0:1}



Ich bin darüber gestolpert, dass der Vergleich mit > 300  im Anwesendfall (also der last_seen ist jünger als 5 Minuten) nicht 0 liefert für boolean falsch, sondern nix. Ich denke, dass da das (mein) Problem liegt.

aber vielen Dank für das Schubsen in die richtige Richtung!



schöne Grüße,
Friedhelm




Zitat von: Otto123 am 22 Dezember 2020, 18:32:05
Sagst Du mir noch welche Anzeige Du doof findest? Du willst im STATE nur absent und present? Kann man ändern :)

Testen wir Deine Funktion:
{ return ((time() - time_str2num("2020-12-22 18:20:00")) > 300) } - liefert jetzt 1  - wäre aber abwesend
{ return ((time() - time_str2num("2020-12-22 18:30:00")) > 300) } - liefert jetzt nix wäre aber jetzt anwesend
ist also genau anders
Was liefert das hier wirklich zurück?
ReadingsVal("unifi", "Handy_last_seen",0)

https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit