Globale Zeitvariable im valueFormat der readingsGroup

Begonnen von sd, 07 April 2021, 18:56:04

Vorheriges Thema - Nächstes Thema

sd

Hallo,

ich habe das Problem, dass ich im valueFormat ein $isdst im Perlcode benutzen muss. Dabei habe ich festgestellt, dass die Verwendung dieser globalen Variable in einen Fehler läuft. Dabei reicht schon ein
my $j= $isdst;
damit die weiteren Anweisungen nicht ausgeführt werden.
Derselbe Effekt tritt bei den anderen globalen Zeitvariablen ($we,$hour,...) auf.
Ist der Fehler bei Euch nachvollziehbar oder liegt das an meiner Installation?
Gruß
Steffen

MadMax-FHEM

Probiere mal:


my $j = AnalyzeCommand(0, '{return $isdst}');


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sd

Gruß
Steffen

MadMax-FHEM

FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sd

Hallo Joachim,

mit dem Link komme ich nicht ganz weiter. Ich erkenne, dass jetzt die Verarbeitung durchläuft. Allerdings liefert AnalyzeCommand offenbar den Wert 1. Mit Verbose 5 habe ich im Monitor keinen Fehler erkannt. Mit dem Definition-Hash kann ich leider nichts anfangen.
Kannst Du mir ein Stück weiter helfen?

Gruß Steffen
Gruß
Steffen

MadMax-FHEM

Was soll denn kommen?

Was ist: $isdst

Was kommt, wenn du:


{ $isdst }

in die FhemWeb-cmd Zeile eingibst?

Da wird eben auch '1' kommen...

Ich weiß ja nicht was du willst...

Aber wenn du fhem-Variablen wie z.B
$we etc. in einer Perl-Sub verwenden willst (z.B. myUtils), dann geht das eben wie geschrieben.
Der Link war nur, weil du wissen wolltest was/wie/warum und das sollte dort erläutert sein.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sd

Im Perlcode liefert $isdst beispielsweise bei einem NOTIFY den Wert 1 oder 0 zurück, ebenso wie alle anderen Zeitvariablen ($we,$hour,...).

Dieses Verhalten kann ich im Perlcode eines VALUEFORMAT-Attributs einer Readinggroup nicht nachvollziehen, da läuft es in einen Fehler.
Gruß
Steffen

MadMax-FHEM

#7
Für das, dass du Hilfe/Unterstützung willst bist du schon sehr üppig mit Informationen...

Es wäre ja beispielsweise hilfreich/interessant: welcher fehler kommt denn?

Und es kommt doch 1 zurück!?
Dann passt das doch?

Wie geschrieben: wenn du "fhem-Variablen" in Perl nutzen willst und diese im jeweiligen "Context" nicht zur Verfügung stehen, dann brauchst du eben AnalyzeCommand...
...zumindest habe ich das so verstanden und nutze es so.
Allerdings "nur" für "$we".
Wenn du $hour etc. willst (und es da nicht geht), dann nimm doch einfach direkt "Perl-Zeitfunktionen"...

EDIT: wenn ich { $hour } in fhem-Web eintippe bekomme ich aktuell "11" was ja stimmt. Ich verstehe also nicht was dein (aktuelles) Problem ist...

Also:


define nTest1 notify dummy:on {if($we eq "1"){fhem("set irgendwas off")}}


geht direkt.


define nTest2 notify dummy:on {mySub2($we)}

Und dann eben "abfrage" der "übergebenen Variablen" innerhalb der sub: geht auch.

sub mySub2 ($)
{
  my ($myWE)  = @_;
  if($myWE eq "1")
  {
    fhem("set irgendwas off");
  }
}




define nTest3 notify dummy:on {mySub3()}

da ist IN der Sub kein $we!
Also das geht nicht:

sub mySub3 ($)
{
  if($we eq "1")
  {
    fhem("set irgendwas off");
  }
}

was aber geht:

sub mySub3 ($)
{
  my $myWE = AnalyzeCommand(0, '{return $we}');
  if($myWE eq "1")
  {
    fhem("set irgendwas off");
  }
}


Ansonsten kann ich hier nicht mehr helfen...
...bzw. kann auch sein, dass ich (immer noch) nicht genau verstehe WAS GENAU du machen willst und WAS GENAU WARUM (Fehlermeldung) nicht geht.
Das iegt aber an dir...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

Zitat von: sd am 08 April 2021, 10:50:16
Im Perlcode liefert $isdst beispielsweise bei einem NOTIFY den Wert 1 oder 0 zurück, ebenso wie alle anderen Zeitvariablen ($we,$hour,...).

Dieses Verhalten kann ich im Perlcode eines VALUEFORMAT-Attributs einer Readinggroup nicht nachvollziehen, da läuft es in einen Fehler.

Habe ich ja geschrieben und eben noch mal verdeutlicht...

Dort wo es die Variable nicht "direkt/einfach so" gibt, brauchst du eben AnalyzeCommand...

Und wenn du noch den Fehler nennen würdest könnte man auch helfen...
...aber ich vermute, dass wenn du AnalyzeCommand nutzt wie schon (1000mal) geschrieben, wäre das Problem "gegessen" ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

Zitat von: sd am 07 April 2021, 22:32:03
Das passt! Aber ich verstehe es nicht.

Wobei ich ja hier angenommen habe, dass das Problem gelöst ist...

Wenn so: dann pack doch bitte ein [gelöst] vorne dran...
...wenn nicht: ich weiß nicht mehr weiter ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sd

Hallo Joachim,

Danke für die Antworten und die Geduld.

Ich habe mit AnalyzeCommand noch nicht gearbeitet



Rückgabewert
$errorFehlermeldungen, die beim Ausführen des Kommandos aufgetreten sind. Wenn keine Fehlermeldungen aufgetreten sind, wird undef zurückgegeben.

Bei mir wird 1 zurückgegeben und das bedeudet doch wohl Fehler, oder?

Mein Code in Readingsgroup Attribut valueFormat:
{
my $i=AttrVal("wetter2", "u_tage","5")+0;
my $t=AttrVal("wetter2", "u_time",12)+0;
#$t=$t + AnalyzeCommand(0, '{return $isdst}');
$t=$t + $isdst;
my $v=$READING;
$v=~ s/[^0-9]//g;
if  (
     (  not  (ReadingsVal($DEVICE,"hfc".$v."_day_of_week","") =~ $t)
       || ($COLUMN ge ($i+1))
)&& ($COLUMN gt 1)
    )  {return undef};


Bezweckt das Ausblenden einzelner Spalten, die eine spezielle Uhrzeit haben, die sich aber bei Sommerzeit um 1 Stunde verschiebt.

Gruß
Steffen

MadMax-FHEM

#11
Muss gestehen, dass ich das noch nie gelesen habe.
Ich hatte nur eine ähnliche Frage bzgl. $we in einer Sub in myUtils und die Antwort war eben "AnalyzeCommand" und Punkt.
EDIT: oder ich hab's da "gefunden" und behalten ;) https://forum.fhem.de/index.php/topic,59365.msg507409.html#msg507409

Also nur als Beispiel:

wenn ich

{ AnalyzeCommand(0, '{return $hour}') }

in FhemWeb eingebe, dann kommt eben aktuell 19.
Passt für mich, es ist ja eben 19:irgendwas...

Ebenso verwende ich es in einer Sub in myUtils zur "Auswertung" von $we.
Weil es $we eben IN der Sub NICHT gibt.

Also: geht es nun oder nicht!?

Du kannst es jetzt nutzen oder lassen.
Mir egal...

EDIT: vermutlich brauchst du AnalyzeCommand gar nicht? Weil das ja im Context von valueFormat der readingsGroup ausgeführt wird!? Allerdings weiß ich eben NICHT was denn alles WO "definiert"/"vorhanden"/"zugreifbar" ist. Aber wenn du einfach eine Logausgabe einbaust und $isdst ausgibst, dann siehst du ja was kommt bzw. "in" der Variablen steht. Wenn sie nicht "definiert"/"zugreifbar" ist an DER STELLE, dann halt mit AnalyzeCommand... Also ich nehme (jetzt) mal an, dass "isdst" "is daylight saving time" bedeuten soll. Aktuell ist ja Sommerzeit, also stimmt eine 1 ja wohl. Frage: Sommerzeit? Antwort: 1 also "true" -> JA. Daher musst du doch eher abfragen, ob $isdst true/1 ist und dann eine Stunde drauf oder eben nicht...Diese Abfrage sehe ich in deinem Code ja nirgends... Und da ja auch keine lists der betroffenen Devices gegeben sind und auch sonst immer nur Info-Fetzen (auf mehrfache Nachfrage) kann ich das auch nicht "prüfen" bzw. versuchen mir einen Reim drauf zu machen, evtl. ist ja diese "Abfrage": "not  (ReadingsVal($DEVICE,"hfc".$v."_day_of_week","") =~ $t)" die das prüft? Wobei der gesamte Ausdruck mit den vielen Klammern schwer zu ergründen ist. Aber du wirst schon wissen was du tust...

Viel Spaß noch, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

sd

Hallo Joachim,

Danke. Die Beschreibung zu AnalyzeCommand hat mich irritiert.
Ich lasse es jetzt so mit dem AnalyzeCommand, weil es offenbar funktioniert.
$t=$t + AnalyzeCommand(0, '{return $isdst}');

sollte die Stunde bei Sommerzeit um 1 erhöhen.
Gruß
Steffen

sd

Nachtrag:

Besser ist:
$t=$t + fhem('{$isdst}');

wegen der Beschreibung zu AnalyzeCommand.
Gruß
Steffen