Guten Abend zusammen,
wahrscheinlich ist meine Frage recht trivial, aber mir fehlt der richtige Ansatz ...
Wenn FHEM beendet wird, werden ja beim Start diverse Werte aus fhem.save eingelesen um die Status vor dem Stopp wieder herzustellen.
Nun möchte ich anhand des $hash->{State} feststellen, ob zum Zeitpunkt des shutdown von FHEM dieser Wert gleich "on" war (um entsprechende Reaktionen auszuführen).
An welcher Stelle bzw. Funktion wird während der Startsequenz fhem.save eingelesen, d.h. wann stehen die Werte auswertbar zur Verfügung ?
Habe das bereits erfolglos am Ende X_Define-Routine ausprobiert, aber zu diesem Zeitpunkt stehen die Werte von $hash->{State} noch auf "???" wenn ich nichts falsch gemacht habe.
Bitte gebt mir mal einen Schubs .....
viele Grüße
Heiko
$hash->{State} steht nie zur VErfügung, denn diesen Wert gibt es überhaupt nicht. (Man achte auf Groß-/Kleinschreibung!)
Zitat von: DS_Starter am 28 Januar 2016, 00:33:47
An welcher Stelle bzw. Funktion wird während der Startsequenz fhem.save eingelesen, d.h. wann stehen die Werte auswertbar zur Verfügung ?
Reihenfolge:
- Zuerst werden nacheinander alle nicht-volatilen devices zusammen mit ihren Attributen angelegt,
- danach werden die Daten aus fhem.save verarbeitet und dabei auch volatile devices (z.B. einmalig auszuführende at) angelegt,
- danach wird $init_done auf 1 gesetzt.
Es besteht übrigens auch die Möglichkeit, ein fhem zu starten, ohne die fhem.save überhaupt zu verarbeiten (zumindest bei configDB).
Auf Werte aus der fhem.save sollte man sich als Entwickler besser nicht verlassen - man weiss nicht, ob sie überhaupt vorhanden und/oder gültig sind.
Guten Morgen,
danke für die Info betateilchen, das hilft mir auf jeden Fall weiter denke ich.
Ja, STATE ist klar .... war schon ein bisschen spät gestern Abend bzw. heute früh :)
Schönen Tag noch !
$hash->{STATE} ist übrigens ein Internal, das meiner Meinung nach überhaupt nicht in die fhem.save geschrieben oder von dort gelesen wird.
Naja, mir sieht das so aus. Schau mal in diesen Auszug meiner fhem.save:
........................
setstate CUL_868 2015-12-02 00:36:19 raw is00000F000FF0
setstate CUL_868 2016-01-28 00:40:27 state Initialized
setstate CUL_868 2015-12-01 00:33:28 version V 1.61 CUL868
setstate Cam3 2016-01-28 00:40:28 Availability
setstate Cam3 2016-01-28 00:40:28 PollState Inactive
setstate CamCP1 off
setstate CamCP1 2016-01-28 01:09:59 Availability enabled
setstate CamCP1 2016-01-28 01:09:59 CamIP 192.168.2.33
setstate CamCP1 2016-01-28 01:09:59 CamLiveMode Liveview from DS
setstate CamCP1 2016-01-28 01:09:59 CamModel BU-3025
setstate CamCP1 2016-01-28 01:09:59 CamPort 80
setstate CamCP1 2016-01-28 01:09:59 CamPreRecTime 10
setstate CamCP1 2016-01-28 01:09:59 CamRecShare surveillance
setstate CamCP1 2016-01-28 01:09:59 CamRecVolume volume1
.......................
Das fette "setstate CamCP1 off" sollte es m.M. nach sein. Aber ich probiere es aus.
das ist nicht STATE internal sondern das state reading.
leg ein notify auf global:INITIALIZED an und lies das reading state aus.
das solltet zumindest so lange funktionieren wie das modul beim starten keine readings ändert und ist vermutlich das beste was du erreichen kannst.
gruss
andre
Aha ... ok ...
Dann mache ich das mal.
Danke euch beiden ! :)
Gruß
Heiko
Jetzt habe ich ein paar Versuche gemacht und auch eine Lösung gefunden die nach wiederholten Tests bis jetzt prima funktioniert.
Zunächst in X-Define-Routine Aufruf zu Sub:
recstoponboot($hash); # check ob nach Reboot alle Recordings aus -> sonst stoppen
Die dazu gehörige Subroutine sieht so aus:
######################################################################################
### check ob alle Recordings = Stop nach Reboot -> sonst stoppen
sub recstoponboot ($) {
my ($hash) = @_;
my $logstr;
if ($init_done == 1) {
if ($hash->{STATE} eq "on") {
$logstr = "Recording of $hash->{CAMNAME} seems to be active after reboot - try to stop it now";
&printlog($hash,$logstr,"1");
&camstoprec($hash);
}
}
else {
InternalTimer(gettimeofday(), "recstoponboot", $hash, 0);
}
return undef;
}
Das klappt beim FHEM Neustart prima um das Recording der Kameras zu stoppen, falls noch eine Aufnahme (zumindest entsprechend fhem.save) läuft.
Habe mir auch mal einen Logstring mit dem Wert von STATE zum Auswertungszeitpunkt ($init_done=1) ausgeben lassen und man sieht deutlich "on" oder "off".
Also scheint doch STATE (groß -> internal) durch fhem.save beeinflusst zu werden, denn das werte ich hier aus wenn $init_done.
Oder seht ihr einen Denkfehler ? (Es funktioniert ja schließlich)
Grüße
Heiko
Zitat von: DS_Starter am 28 Januar 2016, 11:32:07
Also scheint doch STATE (groß -> internal) durch fhem.save beeinflusst zu werden, denn das werte ich hier aus wenn $init_done.
Oder seht ihr einen Denkfehler ? (Es funktioniert ja schließlich)
Es kommt drauf an, wie die readings im Modul gehandhabt werden.
Im "Normalfall" wird beim setzen des readings state auch das Internal STATE aktualisiert, das muss aber nicht in jedem Modul so sein.
ZitatEs kommt drauf an, wie die readings im Modul gehandhabt werden.
Ach ja deswegen .... ich glaube mich zu erinnern bei diversen Studien im Wiki und Forum darüber gestolpert zu sein.
Da muß ich mal schauen ob ich diverse Textstellen im Wiki etc. finde die beschreiben wo und wie das "Normalverhalten" geändert wird/werden kann.
Nicht das ich dieses Verhalten im Modul unbeabsichtigt abändere und mich dann wundere warum die oben beschriebene Routine nicht mehr funktioniert.
Super ... danke !
Zitat von: DS_Starter am 28 Januar 2016, 11:53:02
Nicht das ich dieses Verhalten im Modul unbeabsichtigt abändere und mich dann wundere warum die oben beschriebene Routine nicht mehr funktioniert.
Ich denke, dass Du einfach das Reading "state" statt das Internal "STATE" verwenden solltest. Dann müsstest Du auf der sicheren Seite sein.
Gruß,
Thorsten
Ja das geht natürlich auch ;) ...thx
Gruß,
Heiko