at definert sich zu frueh

Begonnen von Sailor, 14 April 2020, 08:40:52

Vorheriges Thema - Nächstes Thema

Sailor

Ein herzerfrischendes "Moin" vom achtern Diek vorweg!

Ich habe ein kleines Problem, wo ich ein wenig auf dem Schlauch stehe:

Ich habe ein "at" wie folgt definiert.


*{AstroActionTime("SunRise","06:00:00","08:00:00")} {
Log3 "at_Sunrise", 3, " : Sunrise is triggered - opening blinds.";

my $Status;

#Unconditional opening
fhem("set LR_Blind.* pct 100");
fhem("set KT_Blind.* pct 100");
fhem("set CW_Blind.* pct 100");
fhem("set CE_Blind.* pct 100");
fhem("set AS_Blind.* pct 100");
fhem("set CR_Blind.* pct 100");
fhem("set TR_Blind.* pct 100");

#Unconditional switch off external lights
fhem("set PH_LightStars_Sw off");
fhem("set PH_LightPond_Sw off");

#Conditional opening based on guest room occupancy
$Status = ReadingsVal("GuestRoomOccupied","state","on");
if ($Status eq "off") {
Log3 "at_Sunrise", 3, " : Conditional opening of blind in Guest Room.";
fhem("set GR_Blind.* pct 100");
}
}


Die zugehoerige "AstroActionTime()" befindet sich in der 99_myUtils und sieht wie folgt aus:


###START########## Define SUB for calculation of sunset actions #################################################START###
sub AstroActionTime($$$) {
my ($AstroAction, $TimeNotBefore, $TimeLatest) = @_;
my $TimeSecAction;
my $TimeAction;

my $Today = POSIX::strftime("%Y-%m-%d",localtime(time));
my $TimeSecAstroAction = hms2secs(Astro_Get($defs{"global"},"global","text",$AstroAction,$Today));
my $TimeSecNotBefore = hms2secs($TimeNotBefore);
my $TimeSeclatest = hms2secs($TimeLatest);

if ($TimeSecAstroAction < $TimeSecNotBefore){
$TimeSecAction = $TimeSecNotBefore;
}
elsif ($TimeSecAstroAction > $TimeSeclatest){
$TimeSecAction = $TimeSeclatest;
}
else {
$TimeSecAction = $TimeSecAstroAction;
}

$TimeAction = POSIX::strftime("%H:%M:%S",gmtime($TimeSecAction));

### For debugging purpose only
Log 3, "mUtils - AstroActionTime____________________________________________________________________";
Log 3, "mUtils - AstroActionTime - Today                                    : " . $Today;
Log 3, "mUtils - AstroActionTime - AstroAction                              : " . $AstroAction;
Log 3, "mUtils - AstroActionTime - TimeNotBefore                            : " . $TimeNotBefore;
Log 3, "mUtils - AstroActionTime - Astro_Get                                : " . Astro_Get($defs{"global"},"global","text",$AstroAction,$Today);
Log 3, "mUtils - AstroActionTime - TimeLatest                               : " . $TimeLatest;
Log 3, "mUtils - AstroActionTime - Calculations...";
Log 3, "mUtils - AstroActionTime - TimeSecNotBefore                         : " . $TimeSecNotBefore;
Log 3, "mUtils - AstroActionTime - TimeSecAstroAction                       : " . $TimeSecAstroAction;
Log 3, "mUtils - AstroActionTime - TimeSeclatest                            : " . $TimeSeclatest;
Log 3, "mUtils - AstroActionTime - TimeSecAction                            : " . $TimeSecAction;
Log 3, "mUtils - AstroActionTime - TimeAction                               : " . $TimeAction;

return($TimeAction);
}
####END########### Define SUB for calculation of sunset actions ##################################################END####


Eigentlich funktioniert das sogar, allerdings nicht nach dem Neustart.
Dann faellt er wieder auf "TimeNotBefore" zurueck, weil die Funktion kein Reading auf dem Astro_Get() bzw. dem damit verbundenen Astro-Device (95_Astro.pm) bekommt.

Wartet man einfach bis Mitternacht, funktioniert alles wieder mit den richtigen Werten.

Hier scheint es ein Problem mit der bereit gestellten Reihenfolge zu geben denn im Log steht nach einem Neustart Folgendes:


2020.04.14 08:26:51.150 1: PERL WARNING: Argument "" isn't numeric in multiplication (*) at ./FHEM/99_myUtils.pm line 211, <$fh> line 450.
2020.04.14 08:26:51.151 3: eval: {AstroActionTime("SunRise","06:00:00","08:00:00")}
2020.04.14 08:26:51.151 1: PERL WARNING: substr outside of string at ./FHEM/99_myUtils.pm line 211, <$fh> line 450.
2020.04.14 08:26:51.151 3: eval: {AstroActionTime("SunRise","06:00:00","08:00:00")}
2020.04.14 08:26:51.151 1: PERL WARNING: Use of uninitialized value in multiplication (*) at ./FHEM/99_myUtils.pm line 211, <$fh> line 450.
2020.04.14 08:26:51.151 3: eval: {AstroActionTime("SunRise","06:00:00","08:00:00")}
2020.04.14 08:26:51.151 1: PERL WARNING: Use of uninitialized value in addition (+) at ./FHEM/99_myUtils.pm line 211, <$fh> line 450.
2020.04.14 08:26:51.151 3: eval: {AstroActionTime("SunRise","06:00:00","08:00:00")}
2020.04.14 08:26:51.152 3: mUtils - AstroActionTime____________________________________________________________________
2020.04.14 08:26:51.152 3: mUtils - AstroActionTime - Today                                    : 2020-04-14
2020.04.14 08:26:51.152 3: mUtils - AstroActionTime - AstroAction                              : SunRise
2020.04.14 08:26:51.152 3: mUtils - AstroActionTime - TimeNotBefore                            : 06:00:00
2020.04.14 08:26:51.155 3: mUtils - AstroActionTime - Astro_Get                                : [FHEM::Astro::Get] global has improper time specification SunRise 2020-04-14, use [YYYY-]MM-DD [HH:MM[:SS]] [-1|yesterday|+1|tomorrow]
2020.04.14 08:26:51.155 3: mUtils - AstroActionTime - TimeLatest                               : 08:00:00
2020.04.14 08:26:51.155 3: mUtils - AstroActionTime - Calculations...
2020.04.14 08:26:51.155 3: mUtils - AstroActionTime - TimeSecNotBefore                         : 21600
2020.04.14 08:26:51.155 3: mUtils - AstroActionTime - TimeSecAstroAction                       : 0
2020.04.14 08:26:51.155 3: mUtils - AstroActionTime - TimeSeclatest                            : 28800
2020.04.14 08:26:51.155 3: mUtils - AstroActionTime - TimeSecAction                            : 21600
2020.04.14 08:26:51.155 3: mUtils - AstroActionTime - TimeAction                               : 06:00:00


Wie bekomme ich es hin, das at solange wartet sich zu definieren, bis die Funktion bzw. das Device bereit steht?
Ich vermute der Wurm steckt in der Zeile hms2secs(Astro_Get($defs{"global"},"global","text",$AstroAction,$Today));

Danke vorab!

Gruss
    Sailor
******************************
Man wird immer besser...

rudolfkoenig

ZitatWie bekomme ich es hin, das at solange wartet sich zu definieren, bis die Funktion bzw. das Device bereit steht?
Wenn beim "Bereitstellen" ein Event generiert wird, dann kann man darauf ein notify mit
define updateAt notify readyEvent modify atName *{AstroActionTime("SunRise","06:00:00","08:00:00")}
(ohne den At-Befehlsteil) absetzen, modify im at uebernimmt den alten Befehl.
Eventuell reicht "global:INITIALIZED" als Ausloeser.

Beta-User

Hm, kleiner Zwischenruf:

Jetzt hatte ich hier schon alles mögliche schreiben, aber wäre es nicht einfacher bzw. der vorgesehene Weg, das "computeAfterInit"-Atttribut zu setzen?

Kurzfassung von dem, was ich ursprünglich geschrieben hatte:
Gestern hatte ich die Frage zu beantworten, ob es möglich ist, bei einem WeekdayTimer auch Zeiten zu nutzen, die man über einen Dummy einstellt. Hatte (scheinbar erfolgreich) empfohlen, das mit Perl zu lösen, konkret eine ReadingsVal()-Abfrage zu machen. Beim WDT sollte das unschädlich sein, der startet seit einiger Zeit in zwei Stufen, die zweite Stufe wird über einen InternalTimer "gezündet".

Wenn ich das richtig sehe, ist es bei at so, dass das "einstufig" fährt. Das ist einerseits schön, weil schnell, andererseits birgt das genau das Risiko, das sich hier verwirklicht hat: Es wird auf Daten zurückgegriffen, die noch gar nicht da sind...

Ich vermute, dass "sowas" an noch viel mehr Stellen versteckt ist, wie wir vermuten. Nachdem wir auch an anderen Stellen das "Reihenfolgethma" eliminiert haben: Wäre es nicht besser, das "computeAfterInit" zum default zu machen (zumindest bei den at's, die perlfunc für timespec nutzen?)?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

rudolfkoenig

ZitatJetzt hatte ich hier schon alles mögliche schreiben, aber wäre es nicht einfacher bzw. der vorgesehene Weg, das "computeAfterInit"-Atttribut zu setzen?
Danke fuer den Hinweis, das habe ich komplett vergessen. :/

Sailor

Moin!

Ich bin immer wieder aufs Neue begeistert wie schnell und effizient meine fhem - Probleme in diesem Forum gelöst werden.

Danke, das Attribut "computeAfterInit" hat funktioniert!

Gruß
    Sailor
******************************
Man wird immer besser...