Syntax- bzw. Perlhilfe bei Userreading

Begonnen von Wolle02, 12 Mai 2021, 18:28:30

Vorheriges Thema - Nächstes Thema

Wolle02

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?

TomLee

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

Wolle02

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.

Otto123

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);
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Zeig mal genau was du ausgeführt hast.

{my $wert="fc0_".$hour."_Neff";;return $wert}

gibt mir korrekt
fc0_20_Neff
zurück.

Otto123

@Thomas Ja funktioniert in der Kommandzeile aber eventuell nicht im userReadings ...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Ich wollt gerade ausholen das es aus der Kommandozeile klappt, jetzt teste ich das userReadings :P

Wolle02

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.

TomLee

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 ?

Wolle02

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?

TomLee

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" ?

Wolle02

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.