Perl Variable wird aufgelöst in WEB Kommandozeile aber nicht in stateFormat

Begonnen von zeo007, 17 März 2023, 14:19:40

Vorheriges Thema - Nächstes Thema

zeo007

Hallo,

habe meinen Raspberry 3B+ von 32 bit
Linux Keller 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux
                                        auf 64 bit
Linux Keller 5.15.84-v8+ #1613 SMP PREEMPT Thu Jan 5 12:03:08 GMT 2023 aarch64 GNU/Linux
neu aufgesetzt.

Fhem dabei von 5.7 auf 6.0.

Was bisher funktioniert hatte und auch in der neuen Version geht ist in der WEB Interface Kommandozeile:


{(sprintf("%s  %02d:%02d",$today,$hour,$min))}


Das Ergebnis sieht gut aus.
>> 2023-03-17 14:02 <<

In einem Dummy lasse ich mir Datum und Uhrzeit anzeigen und das funktioniert nun leider nicht mehr.


define Funkuhr dummy
attr Funkuhr stateFormat {sprintf("%s %02d:%02d",$today,$hour,$min)}


das gibt in der neuen Version die Fehlermeldung :

Error evaluating Funkuhr stateFormat: Global symbol "$today" requires explicit package name (did you forget to declare "my $today"?) at (eval 104) line 1. Global symbol "$hour" requires explicit package name (did you forget to declare "my $hour"?) at (eval 104) line 1. Global symbol "$min" requires explicit package name (did you forget to declare "my $min"?) at (eval 104) line 1.


An dieser Stelle komme ich leider nicht weiter.
Habe schon die Funktion AnalyzePerlCommand in der fhem.pl verglichen, aber die ist absolut identisch.

Wäre dankbar für einen Tip.

JoWiemann

Hallo,

$today,$hour,$min stehen nur in der Kommandozeile von Fhem zur Verfügung. In Modulen sind sie nicht bekannt.

Wenn diese Variablen in Deiner "alten" Installation funktioniert haben, dann müssen sie irgendwo anders als globale Variablen mal hinterlegt worden sein. Vielleicht mal in Deiner 99_myUtils.pm?

Grüße Jörg

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Beta-User

OT: Warum
Zitat von: zeo007 am 17 März 2023, 14:19:40
Fhem dabei von 5.7 auf 6.0.
Aktuell wäre was anderes, und mit einem einfachen "update"-Befehl ist das sowieso wieder hinfällig...
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

betateilchen

Zitat von: JoWiemann am 17 März 2023, 14:52:45
Wenn diese Variablen in Deiner "alten" Installation funktioniert haben, dann müssen sie irgendwo anders als globale Variablen mal hinterlegt worden sein. Vielleicht mal in Deiner 99_myUtils.pm?

Es würde wenig Sinn machen, die global über die 99_myUtils.pm zur Verfügung zu stellen, weil die Variableninhalte dann nicht aktualisiert werden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

zeo007

Hallo Jörg,

Danke für diese super schnelle Antwort.
Ich habe noch einmal im Backup der alten Version nachgesehen. Es gab keine 99_myUtils.pm.
Auf einer weiteren alten Installation habe ich es jetzt auch probiert und auch dort funktioniert es ohne zusätzliche Deklaration mit sprintf() im stateFormat. Auch dieser Pi hat seit Jahren kein Update bekommen, da er offline arbeitet und für seine Aufgaben kein Internet benötigt.
Scheinbar hat sich wohl doch etwas geändert?

Das heißt dann aber für mich, ich muss mich für diese Anzeige in der neuen Version mit 99_myUtils.pm vertraut machen, denn alles andere funktioniert zum Glück noch wie im Backup.

Wie sieht es aber dann mit der Aktualisierung der Anzeige aus, muss ich dann dafür ein zusätzliches at() basteln?

Danke nochmal !

betateilchen

Ich habe gerade in einer FHEM Installation von 05/2022 getestet, da funktioniert das weder in der Kommandozeile noch sonstwo.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

ZitatDas heißt dann aber für mich, ich muss mich für diese Anzeige in der neuen Version mit 99_myUtils.pm vertraut machen ..

Bin der Meinung nicht unbedingt, geht auch so :
attr Funkuhr stateFormat {my $t = localtime; return $t->dmy('.').' '.$t->hms;}
oder so:
attr Funkuhr stateFormat {my $t = localtime;return $t->strftime("%d.%m.%Y %H:%M:%S")}

betateilchen

Für die Anzeige brauchst Du keine 99_myUtils.pm. du kannst auch einfach ein at machen, das einmal pro Minute den gewünschten String zusammenbaut und mit setreading in das device "global" schreibt. So funktioniert das bei mir seit vielen Jahren und die Uhrzeit steht für unterschiedliche Zwecke einfach als reading systemweit zur Verfügung.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

zeo007

@TomLee

Ergebnis für Vorschlag 1:

Error evaluating Funkuhr stateFormat: Can't locate object method "dmy" via package "Fri Mar 17 17:59:48 2023" (perhaps you forgot to load "Fri Mar 17 17:59:48 2023"?) at (eval 123) line 1.

Ergebnis für Vorschlag 2:

Error evaluating Funkuhr stateFormat: Can't locate object method "strftime" via package "Fri Mar 17 18:02:33 2023" (perhaps you forgot to load "Fri Mar 17 18:02:33 2023"?) at (eval 128) line 1.


@betateilchen

sorry, Angabe Fhem 6.0 war sehr ungenau, letztes Update war 2023-03

Latest Revision: 27327
File              Rev   Last Change
fhem.pl           27302 2023-03-05 17:57:23Z fhemupdate

und auf der Kommandozeile funktioniert sprintf() noch oder wieder in dieser Version

Ich werde dann vermutlich doch die Variante mit at verwenden, obwohl ich es schade finde, dass dieser extra Aufwand jetzt nötig wird.
Habe auch schon mit dem Gedanken gespielt, das alte Image wieder zurück zu schreiben.

Danke



TomLee

Ich weiß die Meldung nicht genau zu deuten, dazu hab ich zu wenig Ahnung von der Materie (Betateilchen kann das mit Sicherheit), wenn es mit der verwendeten Perlversion zu tun hat und du kleiner 5.8 verwendest (mein Gedanke war das machst du mit Sicherheit weil du ja neu aufgesetzt hast), dann musst du ein use Time::Piece mit angeben:

attr Funkuhr stateFormat {use Time::Piece;my $t = localtime; return $t->dmy('.').' '.$t->hms;}

JoWiemann

Zitat von: zeo007 am 17 März 2023, 18:30:54
und auf der Kommandozeile funktioniert sprintf() noch oder wieder in dieser Version

Hallo,

es geht nicht um sprintf(), sondern um die Variablen $today, $hour und $min. Diese Variablen müssen irgendwo declariert und mit Inhalt gefüllt werden. In der Kommandozeile macht das die auswertende Funktion.

Sowohl in einem alten Backup von 2016, noch in einem von 2020 waren diese Variablen irgendwo global deklariert und gefüllt worden. Also muss dies in Deiner "alten" Version irgendwo hinterlegt worden sein. Und zwar von Dir. Vielleicht kannst Du ja mal den Inhalt des alten Verzeichnisses ./fhem die den Moduldateien *.pm posten.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

zeo007

Hallo Jörg,

ich kann's nicht erklären, aber nachdem ich das at definiert habe sind alle Fehlermeldungen verschwunden und die Anzeige ist OK.



define Funkuhr dummy
attr Funkuhr event-on-change-reading zeit
attr Funkuhr readingList zeit
attr Funkuhr stateFormat {(sprintf("%s  %02d:%02d",$today,$hour,$min))}\
\

define a_zeit at +*00:01 setreading Funkuhr zeit {($hms)}
attr a_zeit alignTime 00:00:00


Danke, auch wenn ich nicht wirklich verstehe was hier passiert ist. Es funktioniert.  :)