Verständnisfragen zur fhem und perl Syntax

Begonnen von djhans, 14 Februar 2014, 18:10:11

Vorheriges Thema - Nächstes Thema

djhans

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

Puschel74

#1
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
oder auch hier:
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  ;)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

djhans

#3
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.

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

djhans


Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

djhans

...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

Rince

Dafür, dass du die ; doppelt schreiben willst, sind in dem Codebeispiel mit den vielen { } erstaunlich wenig ; drin, meinst du nicht? ;)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

djhans

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


UliM

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-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Damian

#11
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

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

djhans

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

Rince

Danke Damian und Uli,
jetzt weiß ich auch wie es richtig geht :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)