FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: fhem024 am 05 Oktober 2024, 06:08:09

Titel: Programmieren in defmod - Erstellen und Verwenden von Funktionen
Beitrag von: fhem024 am 05 Oktober 2024, 06:08:09
Hallo zusammen,
evtl. trivial - aber ich stehe gerade auf dem Schlauch.

Im Rahmen eines notify soll ein at angelegt werden - so weit so gut:
fhem("defmod autoAnhebenStart at *05:58:00 {
    fhem(\"set Heizung Direkter_Heizkreis_direktes_Warmwasser.65.Sollwertkorrektur.K 2.0\");;
    fhem(\"get Heizung GetAllData\");;
    }");

Die Sollwertkorrektur soll nun aber nicht statisch sein, sondern abhängig von der Außentemperatur. Daher würde ich gerne so etwas machen:

fhem("defmod autoAnhebenStart at *05:58:00 {
    my $aTemp=ReadingsVal('Heizung', 'Systembedienmodul.54.O.Aussentemperatur.C', -2);;
    my $swk=get();;
    fhem(\"set Heizung Direkter_Heizkreis_direktes_Warmwasser.65.Sollwertkorrektur.K $swk\");;
    fhem(\"get Heizung GetAllData\");;

    sub get() {
        return "0.5" if ($aTemp <  -1.5);;
        return "2"   if ($aTemp >=  7.5);;
        return "1.5" if ($aTemp >=  1.5);;
        return  "1"  if ($aTemp >= -1.5);;
        };;
    }");
Macht man das so, beklagt sich der Compiler über "Global symbol "$aTemp" requires explicit package name" - obwohl es mit my deklariert ist. Wie sollte da die Syntax genau aussehen? V.a., wie sollte die Funktion aussehen?

Danke!
fhem024
Titel: Aw: Programmieren in defmod - Erstellen und Verwenden von Funktionen
Beitrag von: Nobbynews am 05 Oktober 2024, 08:45:34
Perl ist jetzt nicht so meins, aber die Fehlermeldung dürfte aus der sub kommen.
Dort ist $aTemp halt unbekannt.
Die sub solltest Du zum Probieren mal so ergänzen:
sub get()
my $aTemp=shift;
...

Und der Funktionsaufruf im oberen Teil müsste dann so aussehen:
my $swk=get($aTemp);
So würde ich es jetzt erst einmal probieren. Könnte natürlich auf völlig daneben liegen.
Titel: Aw: Programmieren in defmod - Erstellen und Verwenden von Funktionen
Beitrag von: fhem024 am 05 Oktober 2024, 15:10:37
Hallo @Nobbynews,
Danke für Deinen Tip!

Ich habe es nun so gelöst:


fhem("defmod autoAnhebenStart at *05:58:00 {
    no warnings qw{ redefine };;

    my \$aTemp=ReadingsVal('Heizung', 'Systembedienmodul.54.O.Aussentemperatur.C', -2);;
    my \$swk=&my_notify_get();;
    Log 1, \"SWK ist \$swk \";;

    fhem(\"set Heizung Direkter_Heizkreis_direktes_Warmwasser.65.Sollwertkorrektur.K \$swk\");;
    sleep 0.5;;
    fhem(\"get Heizung GetAllData\");;

    sub my_notify_get {
       return 0.5 if (\$aTemp <  -1.5);;
       return 2   if (\$aTemp >=  7.5);;
       return 1.5 if (\$aTemp >=  1.5);;
       return  1  if (\$aTemp >= -1.5);;
       }
}

- Das Problem war, dass die $ ohne Escape alle entsorgt wurden.
- Die Variable $aTemp ist eine globale Variable - wird also auch in der Funktion gesehen.
- Eine Redefined Warnung habe ich unterdrückt

Insgesamt macht das Script, was es soll. Woher die "Subroutine my_notify_get redefined" Warnung kommt, ist mir nicht ganz klar - redefined ist da ja für mich nichts erkennbar. Vielleicht hat jemand eine Idee, wie man das noch korrekt schreibt, so dass das Unterdrücken der Warnung hier nicht mehr nötig ist.
Titel: Aw: Programmieren in defmod - Erstellen und Verwenden von Funktionen
Beitrag von: Prof. Dr. Peter Henning am 08 Oktober 2024, 21:52:26
Ich halte das für schlechte Praxis, auch wenn es funktioniert. Das "at" sollte immer vorhanden sein, lediglich aktiv oder nicht aktiv. Und die Parameterwahl sollte auch in eine externe Perl-Routine.

LG

pah
Titel: Aw: Programmieren in defmod - Erstellen und Verwenden von Funktionen
Beitrag von: fhem024 am 11 Oktober 2024, 19:55:37
Hallo pah,
ja, at mit active / inactive steuern vereinfacht die Sache tatsächlich. Habe ich jetzt angepasst. Die Funktion lasse ich aber doch lieber drin - ist am Ende in soweit übersichtlicher, als dass man alles an einem Fleck hat. Solange sie so klein und übersichtlich ist. Ich habe andere Funktionen, die größer sind - die sind dann tatsächlich im Module ausgelagert.
Dass ich die Funktion nicht ins Module schreibe, hat auch noch einen anderen Grund: das Module habe ich rechtetechnisch so geschützt, dass ich es via Web nicht schreiben kann. Das müsste ich dann schon auf der Büchse machen - da komme ich aber nicht immer dran.

Danke!
Gruß
fhem024