FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Jojo11 am 16 Juli 2014, 22:10:59

Titel: Verschachteltes at in notify
Beitrag von: Jojo11 am 16 Juli 2014, 22:10:59
Hallo,

ich versuche mich schon seit einer gefühlten Ewigkeit an folgendem notify (Minimalbeispiel)  :-\

define abc notify xyz {\
my $bla="00:10:00";;\
my $bla2="20";;\
fhem ("define AN2 at *$bla set Power on-for-timer $bla2 if(($wday == 0 && Value("AB") eq "on"))");;\
}


Ohne die if-Abfrage im "at" klappt ein solches Konstrukt, aber in der if-Abfrage stören anscheinend die Gänsefüßchen. Was übersehe ich hier?
Kann ich irgendwie innerhalb des fhem("")-Teils manuelle Zeilenumbrüche einfügen, die auch akzeptiert werden? Der Backslash scheint nicht zu funktionieren.

schöne Grüße
Jo
Titel: Antw:Verschachteltes at in notify
Beitrag von: Dietmar63 am 16 Juli 2014, 22:20:56
so
http://forum.fhem.de/index.php/topic,14010.msg176719.html#msg176719 (http://forum.fhem.de/index.php/topic,14010.msg176719.html#msg176719)
findest du es leicht selbst heraus was falsch ist - anfangs ein wenig mehr Arbeit - aber dann leichter zu testen.

Mit der Vermutung, dass die "" Probleme machen könnten wirst du Recht haben. Die "" sind der Anfang und der Beginn von Strings. Deshalb können sie nicht innerhalb eines Strings nochmals einen String wie "on" enthalten. Das Ende des Strings ist mit dem  zweiten " erreicht. bzw. man kann nicht so genau sagen was fhem Module damit machen.

Du könntest in einer 99_utils_funktion den String durch concatenieren zusammenbauen. Immer wenn ein " folgen soll, kannst du es so machen.


$command = '{ fhem("set @ '. $setModifier .' %") if' . $hash->{helper}{CONDITION} . '}';
fhen($command)


Achtung innerhalb von einfachen ' erfolgt keine Ersetzung von Variablen. Dem kann aber leicht aus dem Weg gehen indem man auch sie concateniert.

$command = 'fdfddfd' . $var1 . 'sfdfdfdfdf' . $var2 . '$später_ersetzen'

$später_ersetzen erscheint als $später_ersetzen  in $command.

folgendes geht auch:
$command = chr(34)  . "dggdddsdgf"  chr(34)
so enthält die Variable $command Gaensefuesschen.
siehe:
http://perl.about.com/od/programmingperl/qt/perlordchr.htm (http://perl.about.com/od/programmingperl/qt/perlordchr.htm)
Titel: Antw:Verschachteltes at in notify
Beitrag von: Jojo11 am 17 Juli 2014, 06:37:47
Vielen Dank, das mit dem Auslagern sieht vielversprechend aus. Ich werde mich da mal einlesen.

schöne Grüße
Jo

Titel: Antw:Verschachteltes at in notify
Beitrag von: Jojo11 am 17 Juli 2014, 14:08:47
Hallo,

so, ich habe jetzt mal eine subroutine definiert, die den Befehl entsprechend zusammensetzt. In der fhem.cfg definiere ich das notify:
define KK_Timer notify KKdummy.* {KKStromversorgung()}
Die KKStromversorgung steht in der 99_myUtils.pm. Deren letzte Zeile ist
fhem ($command);
wobei $command so ausschaut:
"define KK_AN at *08:00 {if ($wday == 0) {fhem set KK on-for-timer 60}}"
Leider erhalte ich dann immer diese Fehlermeldung (ohne Zeit und Datum):
sh: 1: Syntax error: "(" unexpected
Ich hatte auch schon den hinteren Teil mit fhem... in Klammern und Semikolons gesetzt, aber ich denke, dass die erste Klammer nach if das Problem ist. Lasse ich aber beide Klammern um die Bedingung weg, erhalte ich eine Meldung, dass eine ")" erwartet wird.
Irgendwie komme ich nicht weiter  :-\

schöne Grüße
Jo
Titel: Antw:Verschachteltes at in notify
Beitrag von: Brockmann am 17 Juli 2014, 14:25:40
Zitat von: Jojo11 am 17 Juli 2014, 14:08:47
wobei $command so ausschaut:
"define KK_AN at *08:00 {if ($wday == 0) {fhem set KK on-for-timer 60}}"
Da fehlen auf alle Fälle die Anführungszeichen beim fhem, aber ob das den Fehler auslöst?
Mach es Dir doch etwas einfacher:
"define KK_AN at *08:00 IF ($wday == 0) (set KK on-for-timer 60)"
(Dabei das IF groß schreiben!)
Bei Deinem ursprüngliche Code (1. Post) fehlten vermutlich nur in der letzten Zeilen geschweifte Klammern um den ganzen if-Ausdruck
Grund: Innerhalb der Anführungszeichen des FHEM verlässt Du die Perl-Ebene und bist in FHEM. Wenn Du da Perl-Code ausführen willst (if), dann musst Du das wieder klammern, damit es als Perl interpretiert wird.
Titel: Antw:Verschachteltes at in notify
Beitrag von: Jojo11 am 17 Juli 2014, 14:43:50
Hallo,

vielen Dank. "IF" möchte ich eigentlich nicht verwenden, da ich mir vorgenommen habe, Perl und FHEM zu verstehen  ::) Es muss ja auch ohne gehen  ;)
Mit diesem (nochmal vereinfachten) string
"define KK_AN at *08:00 {fhem "set KK on-for-timer 60"}"
bekomme ich jetzt die Fehlermeldung
sh: 1: define: not found
...was mich nicht wirklich weiterbringt.
Mit fhem ($command); bin ich doch eigentlich auf der FHEM-Ebene. Da sollte "define" doch bekannt sein?

schöne Grüße
Jo
Titel: Antw:Verschachteltes at in notify
Beitrag von: Jojo11 am 17 Juli 2014, 14:52:39
Seltsam, wenn ich statt
fhem ($command);
den Befehl direkt eingebe, funktioniert es.
fhem("define KK_AN at *08:00 {fhem set KK on-for-timer 60}");
Muss ich mit dem string $command noch irgendwas anderes machen, bevor ich ihn verwenden kann?

Nachtrag: Wenn ich die Gänsefüsschen im $command-string weglasse, scheint es auch zu klappen. Verstehen tue ich das aber nicht.

schöne Grüße
Jo
Titel: Antw:Verschachteltes at in notify
Beitrag von: Dietmar63 am 17 Juli 2014, 16:37:37
$comand sollte so aussehen:
define KK_AN at *08:00 {fhem ("set KK on-for-timer 60")}

die " kann man der Funktion . chr(34) oder . '"' einfügen
Titel: Antw:Verschachteltes at in notify
Beitrag von: Jojo11 am 17 Juli 2014, 19:46:30
Ohne die Anführungszeichen funktioniert es jetzt auch. Das Einzige, was mir nicht recht einleuchtet ist, dass
fhem("define KK_AN at *08:00 {fhem set KK on-for-timer 60}");
funktioniert, während (sinngemäß)
my $command = "define KK_AN at *08:00 {fhem set KK on-for-timer 60}"
fhem ($command);

nicht geht. Wohl aber
my $command = define KK_AN at *08:00 {fhem set KK on-for-timer 60}
fhem ($command);

Mit Anführungszeichen bzw. chr(34) um den ganzen define-Befehl geht es halt nicht, wenn man ihn in $command definiert.

schöne Grüße
Jo
Titel: Antw:Verschachteltes at in notify
Beitrag von: Puschel74 am 17 Juli 2014, 19:51:38
Hallo,

und was wenn du um $command mal die ( und ) weglässt?

my $command = "define KK_AN at *08:00 {fhem set KK on-for-timer 60}"
fhem $command;

oder
my $command = define KK_AN at *08:00 {fhem set KK on-for-timer 60}
fhem $command;


Grüße
Titel: Antw:Verschachteltes at in notify
Beitrag von: Jojo11 am 17 Juli 2014, 19:59:20
Bei der ersten Variante kommt wieder
sh: 1: Syntax error: "(" unexpected
aber die zweite geht ohne Probleme.

schöne Grüße
Jo
Titel: Antw:Verschachteltes at in notify
Beitrag von: Dietmar63 am 17 Juli 2014, 20:09:29
es hängt ein wenig damit zusammen, was Perl als Parameter von fhem(... fhem (...) ) ansieht und dann an fhem weitergibt.

Wenn du nach der Zuweiszung zu $command den Inhalt von $command per Log ausgibst, wirst du vielleicht jeweils besser verstehen, was passiert ist und warum es in der Folge zu dem Fehler kommt. fhem() bekommt jedenfalls nur einen Paramter und das ist ein String.

Die beste Version ist aus meiner Sicht:
my $command =  "define KK_AN at *08:00 {fhem ("  . '"'  . "set KK on-for-timer 60}" . '"';
oder
my $command =  "define KK_AN at *08:00 {fhem ("  . chr(34)  . "set KK on-for-timer 60}" . chr(34);

Die zusätzlichen Klammern sorgen dafür, dass eindeutig klar wird was zusammen gehört.

Wenigstens bekommst du jetzt Fehler, wenn die Syntax nicht stimmt. Die Definitionen in fhem.cfg sind genauso falsch, nur der Compiler meldet sie nicht.
Titel: Antw:Verschachteltes at in notify
Beitrag von: Jojo11 am 17 Juli 2014, 20:43:38
Ok, danke. Ich werde morgen mal weiter testen.

schöne Grüße
Jo

Titel: Antw:Verschachteltes at in notify
Beitrag von: Dietmar63 am 17 Juli 2014, 21:47:31
noch ein Tipp:
Wenn du Stringzuweisungen mit "" machst, werden $variablen ersetzt.

my $command =  "define KK_AN at *$Uhrzeit" ...


Zum Ausprobieren lohnt es sich, eine Perlentwicklungsumgebung zu installieren.
Unter Linux padre, unter Windows ActivePerl mit einem guten Editor: pspad, notepad++ ...

Neben syntax highlighting kann man dann aus der Entwicklungsumgebung heraus Perlscripte starten und testen.
fhem läuft darin allerdings nicht.  Aber Funktionen, die nicht fhem-spezifischen Dinge erledigen sind in jedem Fall einfach zu entwickeln.

Ich habe mir zum Beispiel in solchen Testscripten die Funktion Log ($$) definiert, so dass logging wie in fhem möglich ist:


my $key = 293;


my $bst    = 34;
my $crypt  = $bst ^ $key;
my $uCrypt = $crypt ^ $key;

Log 3, "bst>>>$bst<<<";
Log 3, "crypt>>>$crypt<<<";
Log 3, "uCrypt>>>$uCrypt<<<";

################################################################################
sub Log($$)
{
  my ($ll, $text) = @_;
  print "$text\n";
  return undef;
}

Titel: Antw:Verschachteltes at in notify
Beitrag von: Jojo11 am 17 Juli 2014, 21:52:10
Danke, eine solche Testumgebung oder eine FHEM Testinstallation wäre wirklich hilfreich.

schöne Grüße
Jo