Philips Hue Bewegungsmelder - Zeit in Minuten seit der letzten Bewegung in State

Begonnen von PS915, 07 Februar 2019, 22:43:34

Vorheriges Thema - Nächstes Thema

PS915

Hallo zusammen,

ich versuche in StateFormat meines Philips Hue Bewegungsmelders die Zeit in Minuten seit der letzten Bewegung zu berechnen, doch ich scheitere leider.

Der Sensor hat folgendes "Internal":
lastupdated_local: 2019-02-07 22:04:38

Nun versuche ich mit folgender Formel die Minuten auszugeben.
{POSIX::strftime("%M",time_str2num(InternalVal("motion.FlurOG","lastupdated_local","")) - time_str2num(localtime))}

Doch leider erhalte ich immer wieder diverse Fehlermeldungen. Mit dieser Formel erhalte ich den Error:
Error evaluating motion.FlurOG stateFormat: Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at (eval 2900) line 2.

Ich habe keinerlei Perl-Kentnisse, nur ein wenig PHP und C, sodass ich grundlegende Dinge verstehe, aber hierdran gerade scheitere.


Gruß,
Phil

KernSani

POSIX::strftime mag das Format von time_str2num nicht.

sowas

time() - time_str2num(InternalVal("motion.FlurOG","lastupdated_local",""))

sollte die Sekunden seit dem letzten Update geben...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

PS915

Danke, das funktioniert.

Mir ist allerdings aufgefallen, dass die Berechnung nur ausgeführt wird wenn man das Attribut "stateFormat" ändert/aktualisiert oder den Bewegungsmelder erneut ausgelöst wird.

Gibt es eine Möglichkeit, die Berechnung alle x Sekunden erneut ausführen zu lassen damit ich jederzeit die aktuelle Differenz bekomme?

Gruß,
Phil

KernSani

Es wird nur aktualisiert, wenn ein Event kommt... Du könntest also mit einem at alle x Sekunden ein Event triggern (https://fhem.de/commandref_DE.html#trigger), ob das Sinn macht, wenn du 99% der Zeit nicht auf das Reading starrst, überlasse ich dir ;-)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

PS915

Wie würde man es denn eleganter umsetzen? Es würde ja auch ausreichen, wenn die Aktualisierung nur jede Minute kommt.

Mein Hintergedanke ist folgender:
Schalte das Licht in Raum X nach Sonnenuntergang aus, wenn für x Sekunden keine Bewegung in stattgefunden hat.

CoolTux

Es wird doch sicherlich Readings geben die ausschließlich bei Bewegung entsprechend geändert werden, oder?
Zeig mal bitte ein list vom Device.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

doman75

müsste das auch gehen wenn man auf das Userreading ein event-min-interval oder halt aufs state legt?

Also  event-min-interval state:60 das sollte doch das at überflüssig machen oder?

justme1968

es gibt keine attribute die ein device dazu bringen öfter zu senden als es möchte. die event attribute sind nur dazu da events zu ignorieren die öfter kommen als man möchte.

such mal im forum nach beispielen für counter auf on-for-timer. die funktionieren genau so und du kannst den code für dich abwandeln.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

justme1968

ansonsten ist das hier:
ZitatSchalte das Licht in Raum X nach Sonnenuntergang aus, wenn für x Sekunden keine Bewegung in stattgefunden hat.

ein typischer Anwendungsfall für einen WATCHDOG oder ein benanntes sleep. auch dafür gibt es viele beispiele hier im forum.

oder du schaltest einfach bei jeder bewegung mit on-for-timer für etwas mehr als das doppelte meldeintervall an. sobald keine neue bewegung kommt geht das licht von ganz alleine kurz danach aus.

du siehst: es gibt viele möglichkeiten dir out of the box mit fhem gehen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

doman75

Zitat von: justme1968 am 08 Februar 2019, 07:08:44
es gibt keine attribute die ein device dazu bringen öfter zu senden als es möchte. die event attribute sind nur dazu da events zu ignorieren die öfter kommen als man möchte.

such mal im forum nach beispielen für counter auf on-for-timer. die funktionieren genau so und du kannst den code für dich abwandeln.

Im Wiki steht aber
" Mit dem Attribut event-min-interval kann für Readings eines Gerätes festgelegt werden, dass nach einer bestimmten Zeit ein Event, auch ohne Wertänderung ausgelöst wird. "

???

KernSani

Das Wiki ist da in der Tat etwas unklar. Bei event-on-change ist der Zusammenhang klarer: https://wiki.fhem.de/wiki/Event-on-change-reading


Kurz, weil mobil
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

doman75

okay ich habe jetzt gerade das event-min-interval verstanden. Bisher habe ich immer angenommen, das nach dem Interval ein event generiert wird, automatisch sozusagen. Es wird aber nur ein event generiert wenn das reading auch getriggert wird. Also das reading muss aktualisiert werden.

efmod DummyTest dummy
attr DummyTest event-min-interval .*:60
attr DummyTest setList on off

setstate DummyTest on
setstate DummyTest 2019-02-08 08:10:09 state on

Habe das mit meinem DummyTest mal nachgestellt, drücke ich auf on wechselt der state und ein event wird generiert. in den nächsten 60 sekunden kann ich soviel on off drücken wie ich will es kommt kein event, das reading state bekommmt aber imme einen neuen zeitstempel. nach 60 sekunden wird wieder ein event generiert  und alles föngt von vorn an.
Und ich dachte immer das ich on drücke und nach 60 sekunden wird wieder ein event erzeugt mit dem aktuellen readingsstatus.

PS915

Ich glaube das Problem ist, dass die HueDevices keine Statusmeldungen in einem gewissen Abstand senden, sondern ausschließlich wenn eine Bewegung erkannt wurde.

Hier das aktuelle List device. Das letzte reading (Bewegung) war um 07:06.

Internals:
   DEF        sensor 3 1 IODev=huebridge
   FUUID      5c5c96e5-f33f-1bb7-8097-12468e37eb9a6ace
   ID         S3
   INTERVAL   1
   IODev      huebridge
   NAME       motion.FlurOG
   NR         220
   STATE      10236
   TYPE       HUEDevice
   lastupdated 2019-02-08 06:06:44
   lastupdated_local 2019-02-08 07:06:44
   manufacturername Philips
   modelid    SML001
   name       Flur OG
   on         1
   reachable  1
   sensitivity 2
   swversion  6.1.0.18912
   type       ZLLPresence
   uniqueid   00:17:88:01:02:02:6b:b3-02-0406
   READINGS:
     2019-02-08 07:06:44   battery         80
     2019-02-08 07:06:44   reachable       true
     2019-02-08 07:06:44   state           nomotion
   helper:
     devtype    S
     update_timeout 1
     setList:
Attributes:
   IODev      huebridge
   room       Bewegung
   stateFormat {time() - time_str2num(InternalVal("motion.FlurOG","lastupdated_local",""))}


CoolTux

Das ist doch gut.
Schau Dir watchdog an wie von Andre erwähnt. Der kann genau das was du willst.
Trigger auf state nomotion und wenn nach x Sekunden sich der state nicht ändert soll geschalten werden. Übe erstmal mit einem Dummy als Lampe.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

justme1968

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

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