notify für Batteriecheck und Emailversand funktioniert nicht

Begonnen von slor, 02 Dezember 2015, 23:41:19

Vorheriges Thema - Nächstes Thema

slor

Guten Abend,

ich habe das Beispiel von Icinger übernommen, nur hapert es bei mir beim Versand der Nachricht via Exim:

Aus der DEF meines Notify's:


.*:[Bb]attery:.* {if($EVENT !~ m/ok/i) {
   if (AttrVal("$NAME","comment",0) ne 1) {
      Log 3,"Bat $NAME $EVENT";
      fhem "attr $NAME comment 1";
      {exmail('mail@mail.de','FHEM-Batteriewarnung $NAME', 'Batteriewechsel erforderlich bei $NAME -> Status: $EVENT')};
   }
}elsif($EVENT =~ m/ok/i) {fhem("setreading $NAME lastBatChange ".localtime)}
elsif (AttrVal("$NAME","comment",0) eq 1) {fhem("deleteattr $NAME comment")}
}


Die Mail kommt an, allerdings wird $Name und $Event im Betreff und Body nicht aufgelöst, sondern so direkt versendet.
Log und Attribut werden korrekt ausgegeben.
Was habe ich übersehen?

Btw, wofür steht das i im RegEx !~ m/ok/i) ?

igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

slor

Danke! Heißt ich ersetze Single durch double quotes und alles gut?
Werd ich heute abend mal testen.


slor

Ich habe ein wenig gelesen, versteh es aber nicht so recht :-( Jetzt bekomme ich keine Mail mehr nur Fehlermeldungen


.*:[Bb]attery.* {if($EVENT !~ m/ok/i) {
   if (AttrVal("$NAME","comment",0) ne 1) {
      Log 3,"Bat $NAME $EVENT";
      fhem "attr $NAME comment 1";
      {exmail('mail@mail.com','FHEM-Batteriewarnung '.$NAME.','Batteriewechsel erforderlich bei '.$NAME.'-> Status:'.$EVENT)};
   }
}elsif($EVENT =~ m/ok/i) {fhem("setreading $NAME lastBatChange ".localtime)}
elsif (AttrVal("$NAME","comment",0) eq 1) {fhem("deleteattr $NAME comment")}
}


Fehlermeldungen im Log:

2015.12.04 22:53:08 1: PERL WARNING: String found where operator expected at (eval 66206) line 5, near "bei '.$NAME.'"
2015.12.04 22:53:08 3: eval: my $SELF='n_batt_chk';my $EVTPART1='low';my $EVENT='Battery low';my $NAME='n_batt_chk';my $TYPE='notify';my $EVTPART0='Battery';{if($EVENT !~ m/ok/i) {
   if (AttrVal("$NAME","comment",0) ne 1) {
      Log 3,"Bat $NAME $EVENT";
      fhem "attr $NAME comment 1";
      {exmail('mail@mail.com','FHEM-Batteriewarnung '.$NAME.','Batteriewechsel erforderlich bei '.$NAME.'-> Status:'.$EVENT.)};
   }
}elsif($EVENT =~ m/ok/i) {fhem("setreading $NAME lastBatChange ".localtime)}
elsif (AttrVal("$NAME","comment",0) eq 1) {fhem("deleteattr $NAME comment")}
}
2015.12.04 22:53:08 3: n_batt_chk return value: Can't find string terminator "'" anywhere before EOF at (eval 66206) line 5.


Ich bin verwirrt. Evtl. etwas spät :-(
Wo ist der Fehler?

slor

Kann nur bitte jemand unter die Arme greifen? Ich bekomme einfach nicht hin :-(

frank

... ,'FHEM-Batteriewarnung '.$NAME.', ...
richtig wäre => 'string1'.$variable.'string2'
dein 2. string ist nicht vollständig. ein vollständiger string hat 2 quotes.
der punkt ist hier ein operator zum "verbinden" von strings (concatenation).
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Dietmar63

WennWenn du es langfristig einfacher haben willst, verschiebe den Perl-Code in die 99_Utils und greife per externem Editor darauf zu. Dann bekommst dudu die Fehler sofort angezeigt.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

slor

Danke für die Hinweise... ich bin mit der einen Zeile ja schon überfordert :-(
Wie mach ich dass denn mit dem Verschieben in 99_utils?

Dietmar63

fhem.cfg
.*:[Bb]attery.* {batteryWarning ("$NAME", "$EVENT") }

99_utils.pm

########################################################################
sub batteryWarning ($$) {
   my ($NAME, $EVENT) = @_;

   if($EVENT !~ m/ok/i) {
     if (AttrVal("$NAME","comment",0) ne 1) {
        Log 3,"Bat $NAME $EVENT";
        fhem "attr $NAME comment 1";
        {exmail('mail@mail.com','FHEM-Batteriewarnung '.$NAME.'Batteriewechsel erforderlich bei '.$NAME.'-> Status:'.$EVENT)};
     }
   }elsif($EVENT =~ m/ok/i) {
      fhem("setreading $NAME lastBatChange ".localtime) {
   }elsif (AttrVal("$NAME","comment",0) eq 1)
      fhem("deleteattr $NAME comment")
   }
}


man muss aus dem Code ein kleines Modul umbauen und aus dem define heraus aufrufen.

Den Fehler habe ich schnell gefunden, nachdem ich enen Editor mit Syntaxhighting genutzt habe. - sie Anhänge - nach dem Fehler ist der code ausgegraut:
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

krikan

Zitat[..] greife per externem Editor darauf zu. Dann bekommst dudu die Fehler sofort angezeigt.
Zitat
Den Fehler habe ich schnell gefunden, nachdem ich einen Editor mit Syntaxhighting genutzt habe. - sie Anhänge - nach dem Fehler ist der code ausgegraut:
Am Rande:

FHEM hat eingebaute Syntaxhervorhebungs-, Befehlsauswahl- und Befehlsvervollständigungsfunktionen für den integrierten Editor und die Objektdetails (DEF,..). Dies (codemirror) muss man nur aktivieren; dann sieht man auch direkt in FHEM auf einen Blick, wo das Problem liegt (siehe Anhang - nach Fehler ausgegrünt). Dazu braucht man nicht zwingend einen externen Editor. Wie das zu aktivieren ist steht u.a. mit Optionen hier: http://www.fhemwiki.de/wiki/Konfiguration#Syntaxhervorhebung .

Empfehlung: Bitte den ganzen Wiki-Artikel http://www.fhemwiki.de/wiki/Konfiguration lesen, da dort Unterschiede zwischen integrierten und externen Editor angeführt sind.

Persönlich brauche ich keinen externen Editor, sondern nutze den integrierten, da ich dann unter kompletter Kontrolle von FHEM stehe.

Gruß, Christian


slor

Das mit dem Editor umstellen ist ja mal echt cool! Wieder was gelernt. Danke!

Ich bin mir nicht sicher, ob die von Euch vorgeschlagenen Lösungen bei mir funktionieren.
Exim erwartet jeweils durch Komma getrennt drei Strings: Mailadresse, Betreff und Body.

Somit müssen die Kommas da irgendwie drin bleiben und die Strings müssen drum herum "gequoted" werden.
Das hat bisher noch mit keiner Kombination aus Quotes, Kommas und Punkten funktioniert.

Muss ich die Kommas besonders behandeln, damit die sauber übergeben werden?

Bei einem anderen Notify funktioniert folgendes ohne Probleme:
({exmail('mail@mail.com','Haus Tür auf!','Haustür wurde geöffnet')})
Allerdings auch keine Variablen mit drin.

Dietmar63

du kannst die drei Parameter separat aufbauen:


my $p1 = 'mail@mail.com';
my $p2 = 'Haus Tür auf!';
my $p3 = 'Haustür wurde geöffnet'

{exmail($P1,$P2,$P3)}


und ist besser lesbar - auch besser wenn man den Code in die 99_utils auslagert.

@kirkan:
bleibe bei meiner "externer Editor" Lösung.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

slor

Ich habe das jetzt mal Spaßeshalber umgestellt.


.*:[Bb]attery.* {if($EVENT !~ m/ok/i) {
   if (AtthhppllrVal("$NAME","comment",0) ne 1) {
      Log 3,"Bat $NAME $EVENT";
      fhem "attr $NAME comment 1";
my $p1 = 'mail@mail.com';
my $p2 = 'Haus Tür auf!';
my $p3 = 'Haustür wurde geöffnet';

{exmail($P1,$P2,$P3)}
 
  }
}elsif($EVENT =~ m/ok/i) {fhem("setreading $NAME lastBatChange ".localtime)}
elsif (AttrVal("$NAME","comment",0) eq 1) {fhem("deleteattr $NAME comment")}
}


Nun bekomme ich folgende Fehler:

2015.12.08 14:53:57 3: n_batt_chk return value: Global symbol "$P1" requires explicit package name at (eval 725) line 9.
Global symbol "$P2" requires explicit package name at (eval 725) line 9.
Global symbol "$P3" requires explicit package name at (eval 725) line 9.

igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED