Hallo,
ich bin jetzt seit gut einer Stunde dran den blöden Syntax-Fehler zu finden und kriege es nicht hin.
im DEF-Bereich:
Sonos_Schlafzimmer:SleepTimer.*off
{
if (Value("ReduceVolumeLater") ne "")
{fhem ("delete ReduceVolumeLater")}
{fhem ("set Sonos_Schlafzimmer Stop")}
{fhem ("set Sonos_Schlafzimmer RemoveMember Sonos_Wohnzimmer")}
hat was mit dem perl Code zu tun. wenn ich dn perl-Code und die Abfrage auf delete ReduceVolumeLater weglasse, geht es. Wo zum Teufel steckt der Fehler!
Sinn soll sein, das ReduceVolumeLater zu löschen, wenn der SleepTimer abgebrochen wird, denn dann gibt es ein "Sonos_Schlafzimmer.SleepTimer.*off"- Notify
..ich habe schon alle Klammer und Semikolon.Varianten durch, es klappt einfach nicht!
djhans
Hallo,
wäre es vielleicht möglich einen etwas aussagekräftigeren Titel hinzubekommen?
Warum?
Hilfe! wird niemand als Suchbegriff verwenden.
siehe hier:
http://www.tty1.net/smart-questions_de.html#intro (http://www.tty1.net/smart-questions_de.html#intro)
oder auch hier:
http://forum.fhem.de/index.php/topic,16311.0.html (http://forum.fhem.de/index.php/topic,16311.0.html)
Danke
Grüße
Edith:
Zitates klappt einfach nicht!
ist auch eine ausführliche Beschreibung von dem WAS du willst und von dem WAS du versucht hast.
Aber ich versuch mal mein bestes 8) was ob der Frage schon etwas dürftig ausfallen dürfte ;)
Versuch mal
Sonos_Schlafzimmer:SleepTimer.*off {
fhem ("delete ReduceVolumeLater") if (Value("ReduceVolumeLater") ne "");
fhem ("set Sonos_Schlafzimmer Stop");
fhem ("set Sonos_Schlafzimmer RemoveMember Sonos_Wohnzimmer");
}
Warum du im Code mit { und } um dich wirfst ist mir auch ein Rätsel - aber ich muss ja nicht alles wissen :o
Hi Puschel,
danke, das geht!
Jetzt sagt mir doch mal bitte, wo der Unterschied ist. Wieso steht das if hinter dem "delete" Befehl. Wieso funzt das nicht mit der klassischen Art?
if <bedingung erfüllt>
lösche device
und das mit den Klammern habe ich mir von anderem Code abgeguckt.
z.B. funzt das hier ganz prima. Wenn ich Klammern lösche, klappt es wieder nicht... Ich habe die Perl-Syntax noch nicht wirklich gerafft!
*22:00:00
{fhem("set Sonos_Schlafzimmer Volume 2 1")}
{fhem("set Sonos_Bad Volume 7 1")}
{
if (($wday == 5) ||
($wday == 6) ||
(fhem("get NRW tomorrow") !~ m/none/))
{
{fhem ("define ReduceVolumeLater at +01:30:00 trigger ReduceVolume")}
{fhem ("set Sonos_Schlafzimmer SleepTimer 02:30:00")}
}
else
{
{fhem ("define ReduceVolumeLater at +01:00:00 trigger ReduceVolume")}
{fhem ("set Sonos_Schlafzimmer SleepTimer 01:45:00")}
}
}
demnach kann man hier wahrscheinlich auch die Hälfte der Klammern weglassen :-( Und das mit den Leerzeichen ist auch nicht wirklich einfach.
Wenn man hinter das *22:00:00 das Leerzeichen vergisst, dann klappt es nicht. Ich glaube nun zu verstehen, warum die Profis die Klammer nun dahinter setzten. Also *22:00:00 { und nicht in die nächste Zeile...
djhans.
Hallo,
ZitatJetzt sagt mir doch mal bitte, wo der Unterschied ist.
Würd ich gern - aber kann ich nicht.
Ich mach das immer schon so seitdem ich fhem verwende.
Grüße
Hi,
Hm! Das ist schade!
Djhans
Hallo,
wobei der Titel immer noch etwas "dürftig" ist ;D
Oder würdest du bei einer (DEINER) Frage als Suchbegriff Hilfe! Syntax Problem mit perl eingeben?
Ja ok, ein besserer Titel fällt mir auch nicht ein.
Wenn di Frage aber gelöst ist dann bitte den ersten Beitrag bearbeiten und ein (Gelöst) vor den Titel stellen.
Danke
Grüße
...und was ist mit dem Titel?
---aber ich vestehe immer noch n icht den Unterschied und wann man wo welche Klammern und Semikolons setzt. die {-Klammer ist für perl Code, die ;; muss man im perl-Code verdoppeln, aber mehr habe ich noch nicht durchschaut....
Christian
Dafür, dass du die ; doppelt schreiben willst, sind in dem Codebeispiel mit den vielen { } erstaunlich wenig ; drin, meinst du nicht? ;)
Hi,
Ja,das stimmt! Aber ist erstaunlich, dass es auch ohne geht!
Ne, mal Spass bei Seite! Wie muss das denn richtig sein. konnte das Thema mal jemand aufgreifen und erklären, Irgendwie habe ich noch nicht den richtigen Link gefunden, wo das ausführlich beschrieben wird.... Das Perl-Buch habe ich mir zugelegt, aber der Def-Bereich ist halt fhem spezifisch. Das fhem-pdf geht sehr stark auf die Konfigurationen von Devices ein, aber die Syntax der Befehle wird nur am Rande beschrieben. Speziell vermisse ich die Regeln für die Satzzeichen in diesen Dokus.
Mal schreibt jemand fhem("set xxxx") und mal einfach nur fhem "set ....." mal kommt ein Komma, mal ein Semikolon , mal zwei Semikolons( auch in reinem fhem Code ) und mal steht es im Perl-Code vor der geschweiften Klammer und mal dahinter... das hat sicherlich irgendeinen Sinn, aber ich kann da keine eindeutige Regel ableiten......
DJ Hans
Moin,
in perl gibt es zwei Syntax-Varianten für if:
1. if (Bedingung) {wenn wahr} [else {wenn falsch}]; #die eckigen Klammern nicht schreiben, sie sollen hier zeigen, dass dieser Teil optional ist
2. {wenn wahr} if (Bedingung);
Variante 2 geht nur für Einzeiler und hat keinen Else-Fall.
{} muss man für Codeblöcke setzen wie oben beschrieben um der Syntax des if-Befehls Genüge zu tun, also zu Beginn und Ende zB des {wenn wahr}. Innerhalb eines solchen codeblocks reichen ; um Befehle zu trennen.
=8-)
Wenn ich sehe, wie du dich hier quälst und alle dir "gute" Tipps geben ohne dir den richtigen Code zu verraten, will ich dich von deiner Qual befreien (die Eingaben erfolgen im DEF-Editor):
entweder:
*22:00:00
set Sonos_Schlafzimmer Volume 2 1;
set Sonos_Bad Volume 7 1;
{
if (($wday == 5) ||
($wday == 6) ||
(fhem("get NRW tomorrow") !~ m/none/))
{
fhem ("define ReduceVolumeLater at +01:30:00 trigger ReduceVolume;;set Sonos_Schlafzimmer SleepTimer 02:30:00")
}
else
{
fhem ("define ReduceVolumeLater at +01:00:00 trigger ReduceVolume;;set Sonos_Schlafzimmer SleepTimer 01:45:00")
}
}
oder:
*22:00:00
set Sonos_Schlafzimmer Volume 2 1;
set Sonos_Bad Volume 7 1;
IF (($wday == 5) || ($wday == 6) || (fhem("get NRW tomorrow") !~ m/none/))
(define ReduceVolumeLater at +01:30:00 trigger ReduceVolume,set Sonos_Schlafzimmer SleepTimer 02:30:00)
ELSE
(define ReduceVolumeLater at +01:00:00 trigger ReduceVolume,set Sonos_Schlafzimmer SleepTimer 01:45:00)
Das Thema mit IF hatten wir ja bereits. Komma als Trennzeichen darfst du nur in Verbindung mit IF benutzen.
Suche dir die für dich einfachere Lösung heraus.
Gruß
Damian
Hallo an alle,
herlzichen Dank für die Ausführungen. Ich werde das jetzt mal studieren und dann alle Varianten austesten....
@ Damian
ja das hatten wir schon, aber ich wollte es halt auch mit der klassischen Lösung ausprobieren. Wenn man hier im Forum Code-Blöcke liest, dann wird i.d.R. der reine Perl-Code mit "if" verwendet.
Einfacher und verständlicher finde ich die Lösung mit "IF" und das ist mir persönlich auch sympatischer, aber wie gesagt, ich will erst einmal grundsätzlich verstehen, was da abgeht, bevor ich hier irgendetwas im haus automatisiere und dann plötzlich nix mehr geht. Deshalb spiele ich jetzt seit einigen Wochen mit fhem und Sonos rum, da kann man nix kaputt machen :-)
Danke und Gruß,
Christian
Danke Damian und Uli,
jetzt weiß ich auch wie es richtig geht :)