Hallo,
trotz intensiver Forums- und Google-Suche bin ich nicht fündig geworden.
Ich möchte mit einem define um xx:xx ein weiteres define aufrufen, das fortan alle 15 Sekunden den Status eines Dummies prüft.
Dies klappt einfach nicht (Code kopiert aus der DEF-Editier-Funktion, also nicht aus der fhem.cfg):
*22:21:30 {
fhem("define ZufallWatchdogAlle5Min at +*{3}00:00:15 {
if (Value('Zufall1ChkBox') eq 'on') {
if (Value('Zufall1Zustand') eq 'on') {
Log 1, 'Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig'
}
else {
set Zufall1Zustand on
}
}
else {
Log 1, 'Zufall1ChkBox ist AUS, daher kein Zufallslicht'
}
};;
attr ZufallWatchdogAlle5Min room Zufallslicht")
}
Und das steht im Log:
2014.05.02 22:20:00 3: ZufallWatchdog: syntax error at (eval 2102) line 8, near "set Zufall1Zustand "
Danke für eure Antworten.
Viele Grüße,
Heiko
ich vermute das:
elsif {
set Zufall1Zustand on
}
Cheers
elsif (ohne e!) kannte ich noch nicht - funktioniert aber auch nicht oder ich verwende es falsch.
*10:47:00 {
fhem("define ZufallWatchdogAlle5Min at +*{3}00:00:05 {
if (Value('Zufall1ChkBox') eq 'on') {
if (Value('Zufall1Zustand') eq 'on') {
Log 1, 'Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig'
}
elsif {
set Zufall1Zustand on;;
Log 1, 'Zufall1 wurde eingeschaltet';;
}
}
else {
Log 1, 'Zufall1ChkBox ist AUS, daher kein Zufallslicht'
}
};;
attr ZufallWatchdogAlle5Min room Zufallslicht")
}
Eigentlich ist es doch auch egal, wie wieviele ifs ich ineinander schachtele, wenn ich diese wieder korrekt zu mache?
Es ist auch nicht das Problem, weil wenn ich
set Zufall1Zustand on
austausche mit
Log 1, 'Test'
==> Dann wird das Log geschrieben.
Ich vermute eher, dass es mit dem Wrapping von Perl-Code bzw. FHEM-Befehlen zusammenhängt, wenn man ein define innerhalb eines defines aufruft.
Aber wie macht man es richtig?
Viele Grüße,
Heiko
So funktioniert es jetzt!
Es hing glaube ich tatsächlich mit dem Wrapping und Verdopplung von ; zusammen etc.
*10:57:40 {
fhem("define ZufallWatchdogAlle5Min at +*{3}00:00:05 {
if (Value('Zufall1ChkBox') eq 'on') {
if (Value('Zufall1Zustand') eq 'on') {
Log 1, 'Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig'
}
else {
Log 1, 'Zufall1 wurde eingeschaltet';;;;
Log 1, 'Noch eine Zeile für die Log-Datei';;;;
fhem('set Zufall1Zustand on');;;;
}
}
else {
Log 1, 'Zufall1ChkBox ist AUS, daher kein Zufallslicht'
}
};;
attr ZufallWatchdogAlle5Min room Zufallslicht")
}
Oder so, und du brauchst ein paar Semikolons weniger ;)
*10:57:40 define ZufallWatchdogAlle5Min at +*{3}00:00:05 IF ([Zufall1ChkBox] eq "on") (
IF ([Zufall1Zustand] eq "on") ({Log 1, "Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig"})
ELSE ({Log 1, "Zufall1 wurde eingeschaltet"},{Log 1, "Noch eine Zeile für die Log-Datei"},set Zufall1Zustand on)
) ELSE ({Log 1, "Zufall1ChkBox ist AUS, daher kein Zufallslicht"})
;;attr ZufallWatchdogAlle5Min room Zufallslicht
Gruß
Damian
Zitat von: Damian am 03 Mai 2014, 11:53:53
Oder so, und du brauchst ein paar Semikolons weniger ;)
Danke schön!!
Das ist sehr schön und übersichtlich!
Was bei mir noch immer für Verwirrung sorgt:
Erstelle ich mit einem define ein weiteres define, dann muss man statt Anführungsstrichen "" nur noch Hochkommata verwenden ' '.
Dies wäre ja auch in deinem Codebeispiel nötig.
Also das funktioniert, aber ein echtes Problem habe ich noch.
Ich habe deinen Vorschlag einmal selbst eingegeben und einmal kopiert, bearbeitet jeweils mit Notepad++.
Deine Version funktioniert:
*13:49:50 define ZufallWatchdogAlle5Min at +*{3}00:00:05 IF ([Zufall1ChkBox] eq "on") (
IF ([Zufall1Zustand] eq "on") ({Log 1, "Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig"})
ELSE ({Log 1, "Zufall1 wurde eingeschaltet"},set Zufall1Zustand on)
) ELSE ({Log 1, "Zufall1ChkBox ist AUS, daher kein Zufallslicht"})
;;attr ZufallWatchdogAlle5Min room Zufallslicht
Und meine geht nicht:
*13:53:20 define ZufallWatchdogAlle5Min at +*{3}00:00:05 IF ([Zufall1ChkBox] eq 'on') (
IF ([Zufall1Zustand] eq 'on') ({Log 1, "Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig"})
ELSE ({Log 1, "Zufall1 wurde eingeschaltet"},set Zufall1Zustand on)
) ELSE ({Log 1, "Zufall1ChkBox ist AUS, daher kein Zufallslicht"})
;;attr ZufallWatchdogAlle5Min room Zufallslicht
Im Log steht folgendes:
2014.05.03 13:51:30 3: ZufallWatchdogAlle5Min: Bad name after on' at (eval 2327) line 1.
Für mich sind beide absolut identisch, auch die Einrückung wird von Notepad++ identisch markiert.
Habe mit TAB eingerückt.
Muss man hier bei PERL noch irgendwas spezielles beachten?
Bislang habe ich einfach mit 2 Leerzeichen für jeden neuen Absatz eingerückt...
Viele Grüße,
Heiko
Ich würde dir empfehlen deine at's im DEF Editor zu bearbeiten. Dann sparst du dir das gemurkse mit den zu beachtenden \ und ;;
Das mache ich bereits.
Trotzdem gilt für das define innerhalb des defines, dass nicht mehr Anführungszeichen zu verwenden sind, sondern nur noch Hochkomma.
Das wusste ich nicht.
Zitat von: heikoh81 am 03 Mai 2014, 14:15:19
Das mache ich bereits.
Trotzdem gilt für das define innerhalb des defines, dass nicht mehr Anführungszeichen zu verwenden sind, sondern nur noch Hochkomma.
Das wusste ich nicht.
Beim IF-Befehl kannst du nur Anführungszeichen angeben, weil Hochkomma intern benutzt wird - das hat weniger etwas mit defines zu tun.
Gruß
Damian