Seit einiger Zeit erhalte ich immer wieder obigen Eintrag im LOG. Ich kann den Fehler nicht richtig identifizieren.
eval: my $EVTPART0='open';my $TYPE='structure';my $SELF='Alarmmeldung';my $EVENT='open';my $NAME='Fenster';{
if (Value("Alarm") eq "on")
{fhem("set Sirene_Sen_01 on-for-timer 120");;
my $offeneFenster = 'Achtung: Es sind folgende Fenster offen:\n\n';;
if (Value("fenster.badu") eq "open") {$offeneFenster = "$offeneFenster".'Bad unten\n'};;
if (Value("fenster.kueche") eq "open") {$offeneFenster = "$offeneFenster".'Kueche\n'};;
if (Value("fenster.schlafzimmer") eq "open") {$offeneFenster = "$offeneFenster".'Schlafzimmer\n'};;
if (Value("fenster.wz") eq "open") {$offeneFenster = "$offeneFenster".'Wohnzimmer\n'};;
if (Value("fenster.wiga") eq "open") {$offeneFenster = "$offeneFenster".'Wintergarten Tür\n'};;
if (Value("fenster.wiga1") eq "open") {$offeneFenster = "$offeneFenster".'Wintergarten Fenster\n'};;
if (Value("fenster.flur") eq "open") {$offeneFenster = "$offeneFenster".'Flurfenster Treppenhaus\n'};;
if (Value("fenster.bado") eq "open") {$offeneFenster = "$offeneFenster".'Bad oben\n'};;
if (Value("fenster.a") eq "open") {$offeneFenster = "$offeneFenster".'Balkontuer a\n'};;
if (Value("fenster.b") eq "open") {$offeneFenster = "$offeneFenster".'b\n'};;
if (Value("fenster.c") eq "open") {$offeneFenster = "$offeneFenster".'c\n'};;
\DebianMail ('xxx@xxx.de','ACHTUNG: Es wird eingebrochen!',"$offeneFenster");;
\DebianMail ('yyy@yyy.de','ACHTUNG: Es wird eingebrochen!',"$offeneFenster");;
}}
Hat jemand eine Idee?
Vielen Dank
Markus
Hallo Markus,
ich kann das nicht erkennen, aber ich würde die beiden letzten Zeilen anders machen:
DebianMail ('xxx@xxx.de,yyy@yyy.de','ACHTUNG: Es wird eingebrochen!',"$offeneFenster");;
Ich verstehe den Backslash am Anfang der Zeile nicht, ich dachte immer der Backslash am Zeilenende verbindet diese mit der Folgezeile als "Text".
Und so ist das eigentlich ein \D und das steht für Charakter Class NonDigit.
Außerdem kann man mehrere Empfänger (https://forum.fhem.de/index.php/topic,55212.msg468862.html#msg468862)in einen Aufruf packen.
Sinngemäß heißt die Meldung ja: unnützer Referenz Konstruktor in leerem Text. Ich weiß nicht welches die reference constructors sind in deinem Code.
Aber wer versteht schon die Logik von Fehlermeldungen ;)
Gruß Otto
Da hast Du natürlich Recht, den Backslash hatte ich aus einem Codeschnipsel - ich dachte, der müßte vor DebianMail stehen - ist natürlich Quatsch. Das mit den multiplen Empfängern wußte ich auch noch gar nicht - wieder was gelernt.
Die Fehlermeldung erklärt dass meines Erachtens trotzdem nicht - ich verwende die Mailfunktion noch an anderer Stelle (allerdings mit nur einem Empfänger) - da kommt keine solche Meldung.
Viele Grüße
Markus
Na wenn Du meinst ... --> https://forum.fhem.de/index.php?topic=28626.0 ;)
Das hatte ich auch gelesen, aber wie gesagt nicht auf meine \Debianmail bezogen. Vielleicht ist mir das ja auch nur nicht aufgefallen.
Vielen Dank und viele Grüße
Markus
Schreib die ganzen "if (Value("fenster..." Zeilen mal um, das tut ja in den Augen weh ;) Vmtl. verschwindet die Fehlermeldung dann auch. Hab es aber nicht getestet.
Alt:
if (Value("fenster.badu") eq "open") {$offeneFenster = "$offeneFenster".'Bad unten\n'};
Neu:
if (Value("fenster.badu") eq "open") { $offeneFenster .= "Bad unten\n" };
Davon abgesehen könntest Du Dir mal devspev2array() und Perl Schleifen ansehen. So ersparst Du Dir die if Orgie...
my $offeneFenster = 'Achtung: Es sind folgende Fenster offen:\n\n';
my @fenster = devspec2array("fenster\..*");
foreach my $fenster (@fenster) {
$offeneFenster .= AttrVal($fenster,"alias",$fenster)."\n" if Value($fenster) eq "open";
}
Das sieht ja sehr elegant aus. Leider reichen meine autodidaktischen PERL-Kenntnisse nicht aus, um es so schön hinzubekommen. Ich bin froh, dass ich so vieles geschafft habe und dass es leidlich so funktioniert, wie es soll. Werde mal versuchen, das umzusetzen. Leider verstehe ich AttrVal($fenster,"alias",$fenster)
nicht so richtig.
Viele Grüße und vielen Dank
Markus
Das sieht ja sehr elegant aus. Leider reichen meine autodidaktischen PERL-Kenntnisse nicht aus, um es so schön hinzubekommen. Ich bin froh, dass ich so vieles geschafft habe und dass es leidlich so funktioniert, wie es soll. Werde mal versuchen, das umzusetzen. Leider verstehe ich AttrVal($fenster,"alias",$fenster)
nicht so richtig.
Viele Grüße und vielen Dank
Markus
AttrVal ist hier beschrieben: http://fhem.de/commandref.html#perl
Aber was bewirkt an der Stelle jetzt das "Alias"?
Viele Grüße
Markus
Der Wert des alias Attributs wird an die skalare Variable $offeneFenster angehangen. Wenn das Attribut nicht gesetzt ist, dann wird der device name benutzt.
Aber an welcher Stelle erfolgt dann jetzt die Abfrage, dass nur die offenen Fenster angehängt werden? Für mich als Laien ist nicht ersichtlich, dass irgendwo eine Statusabfrage des Fenstersensors erfolgt...
Viele Grüße
Markus
Die Abfrage fehlte ;)
Hab's ergänzt.
Zitat von: dev0 am 09 November 2016, 19:22:21
Die Abfrage fehlte ;)
Hab's ergänzt.
Hintenangestelltes if (http://heinz-otto.blogspot.de/2015/01/perl-besonderheit-beim-if.html) - auch eine Perl Spezialität an die man sich erst gewöhnen muss. ;)
Vielen Dank. Das Ganze sieht ja wirklich ganz elegant aus. Und wenn ein neuer Fenstersensor kommt, muss dieser nicht auch noch per if angehängt werden ;-)
Viele Grüße
Markus