[gelöst] Timestamp der letzten Speicherung von fhem.save

Begonnen von FHEMAN, 03 Dezember 2017, 13:38:53

Vorheriges Thema - Nächstes Thema

FHEMAN

Einen schönen 1. Advent!

Ich möchte (muss) beim Start (global:initialized) einen Dummywert ändern, aber nur, wenn die Status in der fhem.save nicht älter als 3 Minuten sind.

Wie mache ich das am besten?

Hintergrund ist, dass durch einen wenn auch seltenen Hard Reset (Stecker raus) beim Neustart die fhem.save eben nicht gespeichert wird und nach dem Neustart viele Zustände (zu) alt sind. Bei einer hohen zeitlichen Differenz zwischen der letzten Speicherung und dem Fhem Start gehe ich davon aus, dass ein solcher Hard Reset erfolgt ist.

Btw: Wie kann ich ein fhem save triggern?

Gruß
Ronny
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

dev0

Zitat
Ich möchte (muss) beim Start (global:initialized) einen Dummywert ändern, aber nur, wenn die Status in der fhem.save nicht älter als 3 Minuten sind.
Du kannst das Alter einzelner Readings mit ReadingsAge() abfragen und mit der aktuellen Zeit vergleichen. Den last modified Timestamp des Statefiles kannst Du vmtl. auch benutzen, zB. mit "(stat($fh))[9]".

Zitat
Wie kann ich ein fhem save triggern?

CommandSave(undef,undef);  # save fhem config + write statefile
WriteStatefile();          # write statefile only

FHEMAN

Das hört sich schon mal gut an! $fh kennt er allerdings nicht. Was ist $fh?

Alternativ oder zusätzlich könnte ich WriteStatefile() ja quasi alle X Minuten aufrufen. Übersehe ich da etwas? Denn das wäre ja schon per default sinnvoll?
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

dev0

$fh ist ein filehandle. Siehe Perl Doku zu stat.
Ja, nein, meistens nicht nötig. ;)

FHEMAN

#4
Ok, besten Dank für die Hilfe!
stat($filename)[9] liest also das last modified date aus (http://perldoc.perl.org/functions/stat.html)
Bei mir wird nun beim FHEM Start geprüft, ob der "Rasensprenger" an ist und das fhem.save File älter als 5 Minuten ist (mein Systemstart dauert weit weniger lang):


global:(INITIALIZED) {
        my $statefile = ReadingsVal("global", "statefile", "/opt/fhem/log/fhem.save");
my $fhemSaveDiff = time() - ((stat($statefile))[9]);
if ((Value("Rasensprenger") eq "on") && ($fhemSaveDiff > 300)) {
fhem("setex Rasensprenger off FHEM_init(FHEMSTART)");
}
}


(Rasensprenger ist nur ein blödes Beispiel...)

Schöner wäre natürlich wenn es ein Reading statefilemodified unter global gäbe.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

dev0

Dann überwache doch ein konkretes Reading mit ReadingsAge.