FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: slor am 02 Dezember 2015, 23:41:19

Titel: notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 02 Dezember 2015, 23:41:19
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) ?
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: igami am 03 Dezember 2015, 06:07:55
Das liegt an den singlequotes
http://perlmaven.com/quoted-interpolated-and-escaped-strings-in-perl
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 03 Dezember 2015, 08:52:04
Danke! Heißt ich ersetze Single durch double quotes und alles gut?
Werd ich heute abend mal testen.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: dev0 am 03 Dezember 2015, 10:22:40
Zitat von: slor am 02 Dezember 2015, 23:41:19
Btw, wofür steht das i im RegEx !~ m/ok/i) ?

Groß-/Kleinschreibung ignorieren (https://wiki.selfhtml.org/wiki/Perl/Regul%C3%A4re_Ausdr%C3%BCcke#Modifiers)
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 04 Dezember 2015, 23:05:49
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?
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 06 Dezember 2015, 16:30:09
Kann nur bitte jemand unter die Arme greifen? Ich bekomme einfach nicht hin :-(
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: frank am 06 Dezember 2015, 17:48:21
... ,'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).
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: Dietmar63 am 06 Dezember 2015, 19:04:49
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.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 06 Dezember 2015, 21:16:01
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?
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: Dietmar63 am 07 Dezember 2015, 00:04:24
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:
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: krikan am 07 Dezember 2015, 06:35:31
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

Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 07 Dezember 2015, 12:34:38
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.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: Dietmar63 am 07 Dezember 2015, 19:28:36
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.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 08 Dezember 2015, 15:14:47
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.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: igami am 08 Dezember 2015, 17:05:41
Perl ist case sensitive.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 09 Dezember 2015, 10:16:27
Danke für den Hinweis :-)

Läuft leider trotzdem nicht...

2015.12.09 10:13:44 3: n_batt_chk return value: syntax error at (eval 7803) line 2, near ")
my "
Global symbol "$P1" requires explicit package name at (eval 7803) line 2.
Global symbol "$P1" requires explicit package name at (eval 7803) line 11.
syntax error at (eval 7803) line 14, near "}elsif"

2015.12.09 10:14:30 3: n_batt_chk return value: Undefined subroutine &main::AtthhppllrVal called at (eval 7808) line 2.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: dev0 am 09 Dezember 2015, 10:31:03
Zitat von: slor am 09 Dezember 2015, 10:16:27
Läuft leider trotzdem nicht...
Mitdenken ist in diesem Forum gestattet. Ohne Code nix los.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 09 Dezember 2015, 10:43:13
sorry, dachte es wäre klar.
Code ist weiter unten. Habe nur die Variablen in Großbuchstaben verwandelt.

Habe noch ein wenig weiter "rumprobiert". (Inhalt der Variablen ist erst mal Bogus)
Aktueller Code mit gleicher Fehlermeldung:

.*:[Bb]attery.* {if($EVENT !~ m/ok/i){
   if (AtthhppllrVal("$NAME","comment",0) ne 1) {
      Log 3,"Bat $NAME $EVENT";
      fhem "attr $NAME comment 1";
#{exmail('mail@mail,'FHEM-Batteriewarnung '.$NAME.','Batteriewechsel erforderlich bei '.$NAME.'-> Status:'.$EVENT)});
my $P1 = 'mail@mail';
my $P2 = 'FHEM-Batteriewarnung !!!';
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")}
}


Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 09 Dezember 2015, 10:44:12
oops, grad ne vertippte Zeile entdeckt.


   if (AtthhppllrVal("$NAME","comment",0) ne 1) {


ich korrigier das und meld mich wieder.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 09 Dezember 2015, 10:53:34
So, aktueller Stand:

.*:[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,'FHEM-Batteriewarnung '.$NAME.','Batteriewechsel erforderlich bei '.$NAME.'-> Status:'.$EVENT)});
my $P1 = 'mail@mail';
my $P2 = 'FHEM-Batteriewarnung !!!';
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")}
}


Email kommt wie gewünscht an.
Die Frage ist, wie bekomme ich die Werte jetzt sinnvoll in den Syntax der Variablen. Da hat es bisher immer mit dem Quotes gehapert.
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: dev0 am 09 Dezember 2015, 10:59:46
Diese Seite beschreibt das ganz gut: http://perlmaven.com/quoted-interpolated-and-escaped-strings-in-perl
Titel: Antw:notify für Batteriecheck und Emailversand funktioniert nicht
Beitrag von: slor am 09 Dezember 2015, 14:15:44
Danke, der Link stand schon im 2. Beitrag. Leider konnte ich das nicht auf mein Problem übertragen.

Für folgendes brauche ich eine Lösung:

my $P1 = 'mail@mail';
my $P2 = 'FHEM-Batteriewarnung '.$NAME;
my $P3 = 'Batteriewechsel erforderlich bei '.$NAME.'-> Status:'.$EVENT;


$P1 funktioniert. Nur bei den anderen Beiden ist die Syntax falsch. Ich habe nicht rausfinden können, wie das richtig geht.
Selbst mit Externem Editor ist da nichts aus gegraut etc. Ich komme einfach nicht weiter.