FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Wolle02 am 10 Dezember 2013, 17:29:51

Titel: Perl (Syntax?) Problem
Beitrag von: Wolle02 am 10 Dezember 2013, 17:29:51
Hallo zusammen,

FHEM bietet ja für Programmier-DAUs wie mich die tolle Möglichkeit auch komplexere Vorhaben relativ leicht umzusetzen und sich dabei zu fühlen als wenn man der Programmier-Gott wäre.  8)
In Wirklichkeit habe ich von den tieferliegenden programmtechnischen Zusammenhängen, insbesondere der Perlprogrammierung, keine Ahnung. Und wahrscheinlich resultiert hieraus auch mein folgendes Problem:

Ich habe bei mir einen Lichtwecker erstellt. Folgender Code findet Verwendung:
define Lichtwecker_an at *06:30 {if((!$we) && (Value("Urlaubstag") eq "0")) {fhem("set SZ_Nachttischlampen dim75% 1920")}}

Nun habe ich einen Dummy erstellt mit dem ich auswählen kann, ob beide Nachttischlampen oder nur meine Nachttischlame angehen sollen.

define Weckvariable dummy
attr Weckvariable setList state:SZ_Nachttischlampen,SZ_Nachttischlampe_Wolle
attr Weckvariable webCmd state


Dieser Dummy wird durch folgendes Notify ausgelesen:

define Weckcheck_n notify Weckvariable {\
      my $Weckvar=(Value("Weckvariable"));;\
      if (($Weckvar) eq "SZ_Nachttischlampen") {my $Weckstat=("set SZ_Nachttischlampen dim75%% 1920")};;\
      if (($Weckvar) eq "SZ_Nachttischlampe_Wolle") {my $Weckstat=("set SZ_Nachttischlampe_Wolle dim75%% 1920")}\
              }


Der Plan war, dass ich je nach Stellung des Dummys den jeweiligen set-Befehl in die Variable $Weckstat schreiben lasse und diesen dann im Schaltbefehl für den Lichtwecker ausführen lasse:

define Lichtwecker_an at *06:30 {if((!$we) && (Value("Urlaubstag") eq "0")) {fhem("$Weckstat")}}

Leider funktioniert das nicht und ich bekomme im Logfile folgende Fehlermeldung:

Lichtwecker_an: Global symbol "$Weckstat" requires explicit package name at (eval 11817) line 1.

Und jetzt hört es bei mir auf, weil ich keine Ahnung habe, was mir die Fehlermeldung sagen will und wie ich es richtig machen kann.

Die Idee den set-Befehl mit einer Variablen ausführen zu lassen, hatte ich aus meinem Notify für das Modul "Mailcheck". Hier lautet mein Code:

define Mailbefehl_n notify mailcheck {my $Mailbefehl=(ReadingsVal("mailcheck","Subject",""));;fhem ("$Mailbefehl")}

und dieser Code wird völlig fehlerfrei ausgeführt.
Irgendwas muss oben also anders sein. Nur was?

Vielen Dank für eure Hilfe.

Gruß
Wolle
Titel: Antw:Perl (Syntax?) Problem
Beitrag von: bugster_de am 10 Dezember 2013, 18:24:01
Hi,

deine Variable $Weckstat ist nur im Kontext gültig und wird danach wieder abgebaut (umgangssprachlich: gelöscht).

{my $Weckstat=("set SZ_Nachttischlampen dim75%% 1920")};;
der Kontext ist hier die geschweifte Klammer. $Weckstat ist nur gültig, solange der Code innerhalb (!) der geschweiften Klammern ausgeführt wird. Sobald die schliessende Klammer kommt, gibt es $Weckstat nicht mehr. Und genau deshalb geht auch dein Mail beispiel von unten, weil die Variable im Kontext halt noch existiert.
Wenn Du das lösen willst, müsstest Du eine globale Variable in der 99_myUtils.pm definieren. Die ist dann ab Start von FHEM bis zum Shutdown immer da. Oder das Resultat auf einen dummy schreiben.

Desweiteren hat deine Code Zeile oben ein paar Probleme
i.) ich bin mir nicht sicher, ob der Aufruf in der Klammer auch wirklich was tut und ob er überhaupt was zurück gibt. Im prinzip müsstest Du folgendes machen: {my $Weckstat = fhem( "set SZ_Nachttischlampen dim75%% 1920");; }
ii.) dabei siehst Du auch, dass der doppelte Strichpunkt nach dem Funktionsaufruf von fhem kommen muß und innerhalb der geschweiften Klammern liegen sollte

Weitere Hinweise:
Value("Weckvariable"));;[/code
bin mir nicht sicher, ob das so tut. Besser wäre:
[code]ReadingsVal( "Weckvariable", "state", "none" );;

zu nutzen. Schau Dir mal die Doku zu ReadingsVal an.

]
Titel: Antw:Perl (Syntax?) Problem
Beitrag von: Wolle02 am 10 Dezember 2013, 19:15:06
Hallo Bugster,

danke für deine Tips. Jetzt verstehe ich das Problem ein klein wenig mehr.
Ich werde mal versuchen das notify irgendwie umzuschreiben.

Wie erstelle ich denn eine globale Variable in der 99_myUtils.pm?
Titel: Antw:Perl (Syntax?) Problem
Beitrag von: Wolle02 am 10 Dezember 2013, 20:53:44
Manchmal denke ich einfach viel zu kompliziert  ;D Warum mache ich mir eigentlich den Act mit den Variablen? Ich habe jetzt das notify gelöscht und das define für die Lichtwecker wie folgt geändert:
define Lichtwecker_an at *06:30 {if((!$we) && (Value("Urlaubstag") eq "0")) {fhem("set ".(Value("Weckvariable"))." dim75% 1920")}}

Funktioniert perfekt.
Trotzdem vielen Dank für die Erklärungen zu der Perlproblematik.

Gruß
Wolle