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
Auf die Scnelle: du bist schon im perl... also keine geschweiften Klammern um den sub Aufruf. Und die runden Klammern fehlen beim Aufruf.
Probier mal
*10:00:00 { if(($wday == 0) && ($kw_ung == 1)) {HeizungAuto()}}
Die geschweiften Klammern um den Funktionsaufruf kannst Du wahrscheinlich weglassen.
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
aber nur, wenn mehr als eine Anweisung folgt, oder ?
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
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
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
In Perl müsste nach der Anweisung ein Semikolon gesetzt werden, also:
*10:00:00 { if ($wday == 0) && ($kw_ung == 1) { HeizungAuto(); } }
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
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
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
was ist denn $kw_ung?
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
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
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
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