FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Chris8888 am 12 Februar 2017, 21:35:44

Titel: AT mit Aufruf einer Sub
Beitrag von: Chris8888 am 12 Februar 2017, 21:35:44
Hallo,

ich versuche in einem AT-Kommando eine Sub-Routine aufzurufen.

AT-DEF: *10:00:00 { if($wday == 0) && ($kw_ung == 1) {HeizungAuto}}

Sub aus der myUtils:
sub HeizungAuto() {
fhem("set HM_Thermostat_Badkl datapoint 1.SET_POINT_MODE 0");
fhem("set HM_Thermostat_xy datapoint 1.SET_POINT_MODE 0");
fhem("set HM_Thermostat_yx datapoint 1.SET_POINT_MODE 0");
}

Aus dem Log bei Aufruf des ATs: Unknown command {, try help.

Wäre super, wenn mir jemand auf die Sprünge helfen könnte.

Besten Dank vorab!

VG
Christian
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: KernSani am 12 Februar 2017, 21:42:32
Auf die Scnelle: du bist schon im perl... also keine geschweiften Klammern um den sub Aufruf. Und die runden Klammern fehlen beim Aufruf.
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: KölnSolar am 12 Februar 2017, 21:57:12
Probier mal
*10:00:00 { if(($wday == 0) && ($kw_ung == 1)) {HeizungAuto()}}
Die geschweiften Klammern um den Funktionsaufruf kannst Du wahrscheinlich weglassen.
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: Thorsten Pferdekaemper am 12 Februar 2017, 23:09:42
Zitat von: KernSani am 12 Februar 2017, 21:42:32
Auf die Scnelle: du bist schon im perl... also keine geschweiften Klammern um den sub Aufruf.
Doch, die braucht Perl nach dem if.
Gruß,
   Thorsten
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: KölnSolar am 12 Februar 2017, 23:34:38
aber nur, wenn mehr als eine Anweisung folgt, oder ?
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: KernSani am 13 Februar 2017, 06:11:25
Zitat von: Thorsten Pferdekaemper am 12 Februar 2017, 23:09:42
Doch, die braucht Perl nach dem if.
Gruß,
   Thorsten
Shame on me! Ich sollte nicht so oft DOIF verwenden :-S (und nicht "auf die Schnelle" antworten). Gelobe Besserung. Schönen Start in die Woche!
Oli
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: Thorsten Pferdekaemper am 13 Februar 2017, 07:40:16
Zitat von: KölnSolar am 12 Februar 2017, 23:34:38
aber nur, wenn mehr als eine Anweisung folgt, oder ?
Probier's aus. Vielleicht gibt's ja verschiedene Perls. Bei meinem kann man die einzelne Anweisung dann vor das if stellen, aber wenn die Anweisung danach kommt, braucht man die {}. Das ist in C-ähnlichen Sprachen anders.
Gruß,
   Thorsten
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: Chris8888 am 13 Februar 2017, 08:25:20
Hallo zusammen,

leider keine Änderung.
Versucht habe ich:
*10:00:00 { if ($wday == 0) && ($kw_ung == 1) HeizungAuto()}
*10:00:00 { if ($wday == 0) && ($kw_ung == 1) {HeizungAuto()}}
*10:00:00 if ($wday == 0) && ($kw_ung == 1) HeizungAuto()

Die Fehlermeldung ändert sich leider nicht.

Habt ihr noch eine Idee?

Viele Grüße
Christian
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: mahowi am 13 Februar 2017, 08:33:41
In Perl müsste nach der Anweisung ein Semikolon gesetzt werden, also:

*10:00:00 { if ($wday == 0) && ($kw_ung == 1) { HeizungAuto(); } }
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: Thorsten Pferdekaemper am 13 Februar 2017, 08:38:31
Zitat von: Chris8888 am 13 Februar 2017, 08:25:20*10:00:00 { if ($wday == 0) && ($kw_ung == 1) HeizungAuto()}
*10:00:00 { if ($wday == 0) && ($kw_ung == 1) {HeizungAuto()}}
*10:00:00 if ($wday == 0) && ($kw_ung == 1) HeizungAuto()
Na, so richtig genau schaust Du nicht hin, oder?

*10:00:00 { if(($wday == 0) && ($kw_ung == 1)) {HeizungAuto()}}

Alles, was in der Bedingung steht, muss in einer Klammer eingeschlossen sein. Die äußeren () sind wichtig, die inneren nicht. Es müsste also auch das gehen:

*10:00:00 { if($wday == 0 && $kw_ung == 1) {HeizungAuto()}}

Gruß,
   Thorsten
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: DeeSPe am 13 Februar 2017, 08:49:00
Zitat von: Thorsten Pferdekaemper am 13 Februar 2017, 08:38:31

*10:00:00 { if($wday == 0 && $kw_ung == 1) {HeizungAuto()}}


Wie Thorsten bereits geschrieben hat sollte genau das funktionieren.
Und wie er auch schon bemerkte kann man die {} weglassen wenn man es umdreht:

*10:00:00 { HeizungAuto() if($wday == 0 && $kw_ung == 1)}


Wenn einer Funktion nichts übergeben werden soll, sollte es auch ohne die () gehen:

*10:00:00 { HeizungAuto if($wday == 0 && $kw_ung == 1)}


Gruß
Dan
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: Chris8888 am 13 Februar 2017, 09:20:19
Hllo zusammen,

vielen Dank für eure Unterstützung! Klasse!

Zumindest ändert sich jetzt die Fehlermeldung:
Mit { if($wday == 0 && $kw_ung == 1) {HeizungAuto()}}
->
ERROR evaluating my $DEV='HeizungaufAuto';{ if($wday == 0 && $kw_ung == 1) {HeizungAuto()}}: Global symbol "$kw_ung" requires explicit package name at (eval 171891) line 1.

Habt ihr dazu eine Idee? Ansonsten versuche ich das heute Abend besser zu verstehen....

VG und einen guten Start in die Woche
Christian
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: igami am 13 Februar 2017, 09:22:33
was ist denn $kw_ung?
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: Chris8888 am 13 Februar 2017, 09:25:19
Hi,

das ist eine Variable aus einer anderen Sub-Routine:
sub gerade_ungerade_kw() {
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
my $donthisweek = $yday+5-$wday;
my $donfirst    = ($donthisweek % 7) + 1;
my $kw          = floor(($donthisweek - $donfirst)/7);
   $kw += ($wday == 0) ? 0:1;
my $kw_ung      = $kw % 2; # KW ist gerade: 0 ; KW ist ungerade: 1
Log 1, " KW:$kw | KW ung.:$kw_ung | WDay:$wday" ; # Testausgabe
}

Damit errechne ich immer ob eine Woche gerade oder ungerade ist.

Der Aufruf erfolgt immer um 00:01 per AT-Kommando.

VG
Christian
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: igami am 13 Februar 2017, 09:27:37
und woher soll das at wissen, dass es das in einer anderen sub gibt?
füg der sub noch ein return hinzu welches du auswerten kannst. z.B. 1 für ungerade 0 für gerade
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: Thorsten Pferdekaemper am 13 Februar 2017, 09:31:27
Hi,
na so geht das nicht. Du kannst nicht einfach lokale Variablen außerhalb der Funktion ("sub") verwenden. Die Routine  gerade_ungerade_kw() hat bis auf die Log-Ausgabe und dass sie CPU braucht gar keinen Effekt.
Also so:

sub gerade_ungerade_kw() {
...
my $kw_ung      = $kw % 2; # KW ist gerade: 0 ; KW ist ungerade: 1
Log 1, " KW:$kw | KW ung.:$kw_ung | WDay:$wday" ; # Testausgabe
return $kw_ung;
}

Dann die Verwendung:

if($wday == 0 && gerade_ungerade_kw()  == 1)

...dann noch das at löschen und im Forum alles sauber in code-Tags verpacken.
Gruß,
    Thorsten
Titel: Antw:AT mit Aufruf einer Sub
Beitrag von: Chris8888 am 13 Februar 2017, 09:41:09
Hallo,

jetzt geht mir ein Licht auf! :-)

Ich dachte immer die Variablen wären dann "global" verfügbar.
AT ist gelöscht, CodeTags sind eingefügt, DEF habe ich umgestellt und die Fehlermeldungen sind weg.

DANKE!

VG
Christian