Hauptmenü

PERL Frage im FHEM

Begonnen von MikeR, 13 Juli 2020, 18:48:19

Vorheriges Thema - Nächstes Thema

MikeR

Hallo,

ist vermutlich eine irre blöde Frage, ich bin aber in Perl Anfänger...
Hintergrund: Ich möchte in einer Notification-Funktion eine static Variable definieren. Grund ist, dass ich mir dort jeweils den letzten Wert der Notifikation merken will, um eine notwendige Aktion nur dann zu tätigen, wenn sich der Auslösewert auch geändert hat.

Also mache ich in dem Notify-Block (ich denke das ist ein Wrapper für eine Funktionsdefinition) sowas wie...
static $LastValue = 0
my $NewValue = ReadingsVal( 'IrgendeinObjekt', 'IrgendeinWert', '');
if( $NewValue ne $LastValue )
{
   # Mach was
}

$LastValue = $NewValue;

...und bekomme einen Fehler "Global symbol "$OldValue" requires explicit package name".

Das mit dem static habe ich aus einer Perl Doku. Aus meinen uralten C++ Kenntnissen heraus scheint das plausibel zu sein. Nur geht's halt nicht.

Ein klitzekleiner Tipp für einen Anfänger wäre echt nett!

Danke schön
Mike


betateilchen

Zitat von: MikeR am 13 Juli 2020, 18:48:19
...und bekomme einen Fehler "Global symbol "$OldValue" requires explicit package name".

naja, wenn die Variable bei Dir in Wirklichkeit "$LastValue" heißt, und Du irgendwo versuchst, auf eine nicht existierende Variable "$OldValue" zuzugreifen, ist die Fehlermeldung nicht verwunderlich.

Und das mit dem "static" mag in C++ korrekt sein, aber perl ist eine andere Sprache.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

MikeR

Zitat von: betateilchen am 13 Juli 2020, 19:28:30
naja, wenn die Variable bei Dir in Wirklichkeit "$LastValue" heißt, und Du irgendwo versuchst, auf eine nicht existierende Variable "$OldValue" zuzugreifen, ist die Fehlermeldung nicht verwunderlich.

Sorry, das war ein Tippfehler hier in meinem Posting, nicht im Code/der Fehlermeldung. Da steht beides Mal "$LastValue"!

Zitat von: betateilchen am 13 Juli 2020, 19:28:30
Und das mit dem "static" mag in C++ korrekt sein, aber perl ist eine andere Sprache.

Ja, stimmt. Perl ist eine andere Sprache. Deswegen schrieb ich auch "...habe ich aus einer Perl Doku" und "...scheint das plausibel zu sein".

Wenn meine Syntax falsch ist, oder es sowas wie statische Variablen in Perl-Funktionen gar nicht gibt, wie würde den eine Lösung aussehen, um in einem notify einen neu eingetroffenen Wert mit dem Vorgängerwert zu vergleichen und ggf. die Notofikation zu verwerfen, weil schon darauf reagiert wurde?

bartman121

https://wiki.fhem.de/wiki/Event-on-change-reading

Das im device setzen und dein notify Triggert nur noch, wenn sich der Wert ändert.

betateilchen

Zitat von: bartman121 am 13 Juli 2020, 20:31:59
Das im device setzen und dein notify Triggert nur noch, wenn sich der Wert ändert.

und was hat das mit dem Problem zu tun, um das es hier geht?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: MikeR am 13 Juli 2020, 18:48:19
Also mache ich in dem Notify-Block (ich denke das ist ein Wrapper für eine Funktionsdefinition) sowas wie...

static $LastValue = 0


Wenn das also bei jeder Ausführung des notify auf 0 gesetzt wird, kannst Du Dir den Vergleich einfach sparen, weil er nie das Ergebnis liefern wird, das Du erwartest. Du hast also weniger ein Syntaxproblem, sondern eher ein Verständnisproblen, wie FHEM arbeitet und wie ein notify grundsätzlich funktioniert.

Davon abgesehen: Perl Grundlagen zu vermitteln ist nicht Aufgabe dieses Forums, dafür gibt es genügend und sehr viele Webseiten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

crusader

Zitat von: betateilchen
Wenn das also bei jeder Ausführung des notify auf 0 gesetzt wird, kannst Du Dir den Vergleich einfach sparen, weil er nie das Ergebnis liefern wird, das Du erwartest. Du hast also weniger ein Syntaxproblem, sondern eher ein Verständnisproblen, wie FHEM arbeitet und wie ein notify grundsätzlich funktioniert.

Das Verständnisproblem liegt hier wohl eher bei dir, denn der Sinn von statischen Variablen besteht ja gerade darin, dass sie nur beim ersten Aufruf initialisiert werden.
Das Keyword für statische Variablen in Perl heisst aber "state".

Es wird allerdings in einem notify-Block nix nützen, weil der Perl-Code darin keine sub des Hauptprogramms ist, sondern ein eigenständiges Programm.
Warum der angestrebte Effekt nicht mit einem "event-on-change-reading"-Attribut zu erzielen ist, verstehe ich aber nicht
(,warum harmlose Fragesteller im FHEM-Forum ständig angepflaumt werden, noch viel weniger  :-[ )

MikeR

Zitat von: crusader am 14 Juli 2020, 01:00:12
Das Verständnisproblem liegt hier wohl eher bei dir, denn der Sinn von statischen Variablen besteht ja gerade darin, dass sie nur beim ersten Aufruf initialisiert werden.

Ich wollte auch gerade erklären das eine statische Variable ja irgendwo initialisiert werden muss und die Syntax in dem Zusammenhang bedeutet, dass es nur zur Deklarationszeitpunkt passiert.

Zitat von: crusader am 14 Juli 2020, 01:00:12Das Keyword für statische Variablen in Perl heisst aber "state".

Upps, danke da hab ich wohl einen Fehler gemacht!

Zitat von: crusader am 14 Juli 2020, 01:00:12
Es wird allerdings in einem notify-Block nix nützen, weil der Perl-Code darin keine sub des Hauptprogramms ist, sondern ein eigenständiges Programm.
Warum der angestrebte Effekt nicht mit einem "event-on-change-reading"-Attribut zu erzielen ist, verstehe ich aber nicht

Ich auch nicht  :-[ Ich muss gestehen das ich das noch nicht kannte! Sorry dafür!

Zitat von: crusader am 14 Juli 2020, 01:00:12
(,warum harmlose Fragesteller im FHEM-Forum ständig angepflaumt werden, noch viel weniger  :-[ )

Ich glaube das ist noch nicht mal dem Schreiber persönlich anzukreiden. Das passiert inzwischen in fast allen Foren. Zum einen ist ja der gröbere Umgang bei einer letztendlich doch anonymen Kommunikation immer "straffrei" und zum anderen sind die höfflichen Umgangsformen unserer Altvorderen leider Geschichte. Ich fürchte da kann man kaum noch eine Gegenströmung erzeugen. Wenn man in einem Forum eine Frage stellt, muss man halt ein dickes Fell haben...

Aber zum Schluss nochmal Danke an ALLE, die sich die Mühe gemacht haben um mir bei meinem Problem zu helfen und überhaupt etwas zu schreiben...

betateilchen

Zitat von: crusader am 14 Juli 2020, 01:00:12
Es wird allerdings in einem notify-Block nix nützen, weil der Perl-Code darin keine sub des Hauptprogramms ist, sondern ein eigenständiges Programm.

das bestätigt doch genau die von mir getroffene Aussage:

Zitat von: betateilchen am 13 Juli 2020, 20:53:09
Wenn das also bei jeder Ausführung des notify auf 0 gesetzt wird,

denn der code-Block wird bei jeder Ausführung des notify als eigenständiges Programm erneut ausgeführt.

Und: ja, ich weiß (berufsbedingt), was statische Variablen sind.




Wer hat hier eigentlich wo welchen Fragesteller "angepflaumt"?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

fiedel

Hier mal ein Beispiel, welches dich weiterbringen sollte.
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423