Hallo zusammen,
ich bräuchte bitte mal wieder etwas Unterstützung bei einem Syntax- bzw. Perlproblem.
Ich habe ein DWD_OpenData Device angelegt und hier kommen auch schön Daten rein in folgender Form:
fc0_0_DD 251 2021-05-12 06:00:11
fc0_0_FX1 19 2021-05-12 06:00:11
fc0_0_Neff 97 2021-05-12 06:00:11
fc0_0_SunUp 0 2021-05-12 06:00:11
fc0_0_TTT 11.1 2021-05-12 06:00:11
fc0_0_time 00:00 2021-05-12 06:00:11
fc0_0_ww 61 2021-05-12 06:00:11
fc0_0_wwd durchgehend leichter Regen 2021-05-12 06:00:11
Die readings sind dabei so aufgebaut, dass am Anfang immer fc_ steht, dann kommt die aktuelle Stunde (im Beispiel oben also 0 Uhr) und dann kommt ein Kürzel, das die eigentliche Information beschreibt.
Im Reading fc0_0_Neff steht beispielsweise die Wolkenbedeckung für 0 Uhr.
Ich möchte nun gerne ein Userreading "Wolken" erstellen, in dem der Wert der Wolkenbedeckung aus dem Reading der aktuellen Stunde steht. Also um 09 Uhr morgens soll der Wert aus dem Reading fc_9_Neff im Userreading stehen und um 16 Uhr soll der Wert aus dem Reading fc_16_Neff im Userreading stehen.
Ich hatte die Überlegung, dass ich hier eventuell die Systemvariable $hour verwenden könnte, da darin ja immer die aktuelle Stunde steht. Aber Versuche mit Konstrukten wie
{my $wert="fc0_".$hour."_Neff";
return $wert}
haben natürlich nicht funktioniert.
Kann mir bitte jemand auf die Sprünge helfen wie man sowas umstezen könnte?
Hallo,
eher in die Richtung:
{my $wert="fc0_".$hour."_Neff";
return ReadingsVal($name,$wert,'0')}
du möchtest doch den Wert des Reading erhalten, ich mein die Frage ist aber ob der trigger richtig gewählt ist.
Gruß
Thomas
Zitat von: TomLee am 12 Mai 2021, 18:43:04
eher in die Richtung:
{my $wert="fc0_".$hour."_Neff";
return ReadingsVal($name,$wert,'0')}
du möchtest doch den Wert des Reading erhalten, ich mein die Frage ist aber ob der trigger richtig gewählt ist.
Leider kommt auch hierbei folgende Fehlermeldung, die ich zuvor schon hatte:
Error evaluating Wetter_DWD userReading Wolken: Global symbol "$hour" requires explicit package name (did you forget to declare "my $hour"?) at (eval 3263627) line 1.
Scheinbar kann ich auf diese Weise nicht mit $hour arbeiten.
Zitat von: Wolle02 am 12 Mai 2021, 20:38:33
Scheinbar kann ich auf diese Weise nicht mit $hour arbeiten.
An der Stelle offenbar nicht https://forum.fhem.de/index.php?topic=31371.0
Da hilft vorher im Perlcode:
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
Zeig mal genau was du ausgeführt hast.
{my $wert="fc0_".$hour."_Neff";;return $wert}
gibt mir korrekt
fc0_20_Neff
zurück.
@Thomas Ja funktioniert in der Kommandzeile aber eventuell nicht im userReadings ...
Ich wollt gerade ausholen das es aus der Kommandozeile klappt, jetzt teste ich das userReadings :P
Vielen Dank Thomas und Otto, eure beiden Tipps haben zum Ziel geführt.
Im Userreading steht nun folgendes:
Wolken {my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my $wert="fc0_".$hour."_Neff";
return ReadingsVal($name,$wert,'0')}
Damit wird mir in das Reading Wolken der Wert 95 geschrieben und das ist genau der Wert von fc0_21_Neff :D
Vielen Dank mal wieder.
Trotzdem fehlt der trigger oder soll das Reading bei jeder Änderung im Device aktualisiert werden/sind die Events soweit eingeschränkt das dies immer nur zur vollen Stunde passiert ?
event-on-change-reading .* ist gesetzt und die Readings werden stündlich upgedatet. Dann soll natürlich auch das Userreading aktualisiert werden, denn dann ist ja eine Stunde rum und dann muss der Wert eines anderen Readings da rein. Das war ja Sinn der Sache.
In so fern ist das ohne trigger schon ok so oder?
Ich kenne DWD_OpenData nicht, sicher lieg ich auch daneben mit meiner Vermutung/verstehe es falsch, verstehe es so das es 192 (24x8) Readings gibt, bei einer Änderung wird doch auch das Wolken-Reading bis zu 192 mal "geschrieben" ?
Ah jetzt verstehe ich was du meinst. Ok, da muss ich mal schauen, was ich dann da als trigger verwenden kann. Muss ich mal beobachten. Danke für den Tipp.