Fehler im Notify

Begonnen von raspklaus, 07 März 2016, 13:15:24

Vorheriges Thema - Nächstes Thema

raspklaus

Hallo zusammen,

ich nutze das folgende notify für die Soundausgabe über Sonos. Das funktioniert auch einwandfrei. Da das at bei einem Ereignis aber nur im Raum everything angezeigt wird, hatte ich die Idee einen Dummy wasteansage für die grafische Benachrichtigung einzurichten.

Removal4Sonos {
my $message = "Removal";
if (ReadingsVal("RemovalBlack", "state", "") eq "on") {$message .= "Black"};
if (ReadingsVal("RemovalBrown", "state", "") eq "on") {$message .= "Brown"};
if (ReadingsVal("RemovalBlue", "state", "") eq "on") {$message .= "Blue"};
if (ReadingsVal("RemovalYellow", "state", "") eq "on") {$message .= "Yellow"};
if (ReadingsVal("RemovalToxic", "state", "") eq "on") {$message .= "Toxic"};
if (ReadingsVal("RemovalPaper", "state", "") eq "on") {$message .= "Paper"};
if (ReadingsVal("RemovalGreen", "state", "") eq "on") {$message .= "Green"};
if ($message ne "Removal")
   {Log 1, $message}
   {fhem("define SonosRemoval at 19:30:00 set Sonos_Buero,Sonos_Wohnzimmer PlayURITemp \\\\192.200.100.95\\SonosSpeak\\$message.mp3 50")}
   {fhem("set wasteansage on")}
}


Ich habe nun das Problem dass bei jedem trigger des Notify die wasteanzeige auf on geschaltet wird. Zur Kontrolle wollte ich einen Logeintrag um zu sehen was in $message steht, aber da kommt kein Logeintrag.

Leider stehe ich bei diesem Problem total auf dem Schlauch. Vielleicht weiss einer von Euch da weiter.

Jetzt schon vielen Dank

Klaus


rudolfkoenig

Perl Lektion 17: Es reicht nicht etwas einzuruecken, um es von einem if abhaengig zu machen. Zu diesem Zweck ist {} da.
Und man sollte nicht {} statt ; verwenden, das irritiert, auch wenn es funktioniert. Vorschlag #1:
if(...) {
  Log 1, $message;
  fhem("define...");
  fhem("set wasteansage on");
}
Vorschlag #2: Perl Buch lesen :)

raspklaus

Danke,

wieder was dazugelernt. Habe es jetzt so abgeändert:

Removal4Sonos {
my $message = "Removal";
if (ReadingsVal("RemovalBlack", "state", "") eq "on") {$message .= "Black"};
if (ReadingsVal("RemovalBrown", "state", "") eq "on") {$message .= "Brown"};
if (ReadingsVal("RemovalBlue", "state", "") eq "on") {$message .= "Blue"};
if (ReadingsVal("RemovalYellow", "state", "") eq "on") {$message .= "Yellow"};
if (ReadingsVal("RemovalToxic", "state", "") eq "on") {$message .= "Toxic"};
if (ReadingsVal("RemovalPaper", "state", "") eq "on") {$message .= "Paper"};
if (ReadingsVal("RemovalGreen", "state", "") eq "on") {$message .= "Green"};
if ($message ne "Removal"){
   Log 1, $message;
   fhem("defmod SonosRemoval at 19:30:00 set Sonos_Buero,Sonos_Wohnzimmer PlayURITemp \\\\192.200.100.95\\SonosSpeak\\$message.mp3 50");
   fhem("set wasteansage on");
}
}


Was ich allerdings nicht verstehe, auf welchen teil bezieht sich :

Und man sollte nicht {} statt ; verwenden, das irritiert, auch wenn es funktioniert.


rudolfkoenig

Irgendwer hier im Forum oder Wiki hat damit angefangen, Perl Befehle so zu trennen:
{Befehl1}{Befehl2}{Befehl3}
statt wie ueblich
Befehl1;Befehl2;Befehl3;
Das "loest" das Problem mit ; vs. ;; und funktioniert auch in manchen Faellen, irritiert mich aber sehr.

raspklaus

#4
wenn ich nun um 19:30 nach der Ansage den Dummy ausschalten will, kann ich das mit ;; an das schon vorhandene at anhängen oder muss ich ein zusätzliches at definieren ?

rudolfkoenig

Anhaengen mit ;; sollte gehen.

Alternative: ein notify mit sich selbst als regexp zu definieren, welches die beiden Befehe (mit ;; getrennt) ausfuehrt, und dieses notify im at um 19:30 mit "trigger notifyName" aktivieren. Vorteil: man kann die Ausfuehrung vorher mit dem erwaehnten "trigger notifyName" testen.