Hauptmenü

DOIF Zeitvergleich

Begonnen von GabbaGundolf, 14 Juni 2020, 17:51:09

Vorheriges Thema - Nächstes Thema

GabbaGundolf

Hallo zusammen,

ich hänge hier schon stundenlang an einem Problem. Ich hoffe, dass mir einer von Euch nun helfen kann.
Ich möchte ein DOIF haben, das schaut, ob das Updatedatum eines Reading eines anderen Gerätes jünger als 2 Minuten ist und daraufhin ein Dummy auf absent/present schaltet. Dazu lese ich das Datum des Readings aus, wandle es in Sekunden um und vergleiche mit der aktuellen Uhrzeit, umgerechnet in Sekunden. Die einzelnen Befehle der Sekundenumrechnung und das Auslesen der aktuellen Zeit und des Zeitstempels des Readings funktionieren auch, jedoch nicht im Zusammenhang mit DOIF. Vermutlich habe ich einen Syntaxfehler, aber ich finde den Fehler einfach nicht.
Das sind aktuell meine beiden Versionen. Einmal im FHEM- und einmal im Perl-Modus.

Einzelne Befehle, die funktionieren:
--------------------------------------------
{time_str2num(ReadingsTimestamp("MQTT2_BeaconMQTT", "dc_0d_30_01_01_bf",0))}     -->Beispiel-Ausgabe 1592147760
{(time_str2num(TimeNow())-2*60)}                                                                               -->Beilspiel-Ausgabe 1592147700

DOIF-Definition, die nicht funktioniert:
--------------------------------------------
define di_Test1 DOIF {if(::time_str2num(::ReadingsTimestamp("MQTT2_BeaconMQTT", "dc_0d_30_01_01_bf",0)) >= ::time_str2num(::TimeNow()-2*60)) {fhem"set Test present"} else {fhem"set Test absent"}}

define di_Test2 DOIF (time_str2num(ReadingsTimestamp("MQTT2_BeaconMQTT", "dc_0d_30_01_01_bf",0)) >= time_str2num(TimeNow()-2*60)) (set Test present) DOELSE (set Test absent)

Vielen vielen Dank im Voraus!

Gruß André

Damian

Du musst dir erst mal überlegen, wann du prüfen willst. In deiner Definition fehlt ein Trigger, der die Prüfung anstößt.

Das Alter eines Readings kannst du übrigens ganz einfach ermitteln, hier:

[?MQTT2_BeaconMQTT:dc_0d_30_01_01_bf:sec]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

GabbaGundolf

Super! Damit hast du mir sehr geholfen. Dann war die Lösung ja mal wieder viel einfacher, als zunächst angenommen.

Die für mich funktionierende "Formel" ist nun:
([00:00-23:59,+:02] and [MQTT2_BeaconMQTT:dc_0d_30_01_01_bf:sec] <= 30) (set Test present) DOELSE (set Test absent)

Bei der Änderung von MQTT2_BeaconMQTT:dc_0d_30_01_01_bf wird das DOIF per Ereignis getriggert und Test auf present gesetzt (die Bedingung <=30 Sekunden wird ja hier immer $true sein). Alle zwei Minuten wird zudem zusätzlich das DOIF ausgeführt und das Alter des Readings auf älter als 30 Sekunden geprüft und ggf. Test auf absent gesetzt.


Ich danke Dir vielmals!

Gruß André