[gelöst] Undefined subroutine &main::fb_mail

Begonnen von Alex76, 23 Juli 2019, 09:09:28

Vorheriges Thema - Nächstes Thema

Alex76

Hallo,

ich weiß man sollte im Forum zuerst suchen, da oft so eine Antwort kommt, aber aufgrund der anderen Threads bin ich leider nicht weiter gekommen und zwar habe ich oben beschriebene Fehlermeldung.

Meine FHEM Instanz läuft auf einem nacktem Debian 9 in einer Hyper-V VM.

,,Undefined subroutine &main::FB_mail"

ERROR evaluating my $TYPE='CUL_HM';my $EVTPART1='low';my $EVENT='battery: low';my $EVTPART0='battery:';my $SELF='n_batt_chk';my $NAME='HM_4CF3F5';{ if($EVENT !~ m/ok/) {
  { fb_mail('xxxxxx@xxx.xx', 'FHEM Batteriewarnung', $NAME.': '.$EVENT)};
   Log 3, "$NAME: Batteriewarnung $EVENT";
  }
}: Undefined subroutine &main::fb_mail called at (eval 462) line 2.

2019.07.23 09:01:23 3: n_batt_chk return value: Undefined subroutine &main::fb_mail called at (eval 462) line 2.


Da das Wiki teilweise fehler hat, weil man sendmail nun mal nicht sendemail (ein e zuviel) unter debian schreibt, habe ich das schon mal bei mir ausgebessert.

Der Test über die Konsole funktioniert auch.

in der 99_myUtils.pm habe ich folgende eingefügt, damit die subroutine auch gleich heißt:

# Enter you functions below _this_ line.
sub fb_mail {
        my $rcpt = shift;
        my $subject = shift;
        my $text = shift;
        my $ret = "";
        my $error;
        $ret .= qx(sendemail -f 'fhem@xxx.xx' -t 'xxxx@xxxx.xx' -u '$subject' -m '$text' -s 'xx.xx.xx.xx:587' -o tls=auto -o message-charset=utf-8);
        $ret =~ s,[\r\n]*,,g;    # remove CR from return-string
        Log 1, "sendemail returned: $ret";
}


mein Alert für die Batteriemeldung sieht nun wie folgt aus: (fhem.cfg)

define n_batt_chk notify .*:[Bb]attery:.* { if($EVENT !~ m/ok/) { \
  { fb_mail('xxx@xxxx.xx', 'FHEM Batteriewarnung', $NAME.': '.$EVENT)};; \
   Log 3, "$NAME: Batteriewarnung $EVENT";; \
  } \
}


Irgendwie komm ich da jetzt nicht mehr weiter. Vielleicht hat jemand einen guten Tipp

Nachtrag bzw. Lösung:

die @ Zeichen müssen Escaped werden: (im Wiki Fall kommen die Werte ja aus einer anderen Datei und deswegen wird's dann nicht der gleiche Fehler sein.)


Mit TLS:
$ret .= qx(sendemail -f 'fhem\@xxx.xx' -t 'xxxx\@xxxx.xx' -u '$subject' -m '$text' -s 'xx.xx.xx.xx:587' -o tls=auto -o message-charset=utf-8);

Im Falle von einem Zertifikatsfehler (zb ERROR => TLS setup failed: SSL connect attempt failed error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed) im Klartext schicken:

Klartext:
$ret .= qx(sendemail -f 'fhem\@xxx.xx' -t 'xxxx\@xxxx.xx' -u '$subject' -m '$text' -s 'xx.xx.xx.xx:25' -o tls=no -o message-charset=utf-8);

CoolTux

Zitat von: Alex76 am 23 Juli 2019, 09:09:28
Hallo,

ich weiß man sollte im Forum zuerst suchen, da oft so eine Antwort kommt, aber aufgrund der anderen Threads bin ich leider nicht weiter gekommen und zwar habe ich oben beschriebene Fehlermeldung.

,,Undefined subroutine &main::FB_mail"

ERROR evaluating my $TYPE='CUL_HM';my $EVTPART1='low';my $EVENT='battery: low';my $EVTPART0='battery:';my $SELF='n_batt_chk';my $NAME='HM_4CF3F5';{ if($EVENT !~ m/ok/) {
  { fb_mail('xxxxxx@xxx.xx', 'FHEM Batteriewarnung', $NAME.': '.$EVENT)};
   Log 3, "$NAME: Batteriewarnung $EVENT";
  }
}: Undefined subroutine &main::fb_mail called at (eval 462) line 2.

2019.07.23 09:01:23 3: n_batt_chk return value: Undefined subroutine &main::fb_mail called at (eval 462) line 2.


Da das Wiki teilweise fehler hat, weil man sendmail nun mal nicht sendemail (ein e zuviel) unter debian schreibt, habe ich das schon mal bei mir ausgebessert.

in der 99_Utils.pm habe ich folgende eingefügt, damit die subroutine auch gleich heißt:

# Enter you functions below _this_ line.
sub fb_mail {
        my $rcpt = shift;
        my $subject = shift;
        my $text = shift;
        my $ret = "";
        my $error;
        $ret .= qx(sendmail -f 'fhem@xxx.xx' -t 'xxxx@xxxx.xx' -u '$subject' -m '$text' -s 'xx.xx.xx.xx:587' -o tls=auto -o message-charset=utf-8);
        $ret =~ s,[\r\n]*,,g;    # remove CR from return-string
        Log 1, "sendemail returned: $ret";
}

1. Du schreibst das nicht in 99_Utils sondern sollst es in 99_myUtils schreiben. Ich denke da war das Wiki eindeutig.
2. Irgendwo rufst Du FB_mail auf aber Deine Sub heißt fb_mail


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Alex76

#2
Danke für deine schnelle Antwort, ja du hast Recht, steht auch in der 99_myUtils.pm


Ich hab das inzwischen alles auf klein geändert und bekomme die Meldung weiterhin, ist wohl im Betreff noch falsch drinnen. Hab mir das auch am Anfang gedacht und es natürlich ausgebessert. Siehe Code 1. Thread.

Nur inzwischen könnte es nur an Dingen wie falsche Parameteranzahl liegen - in Java und .Net gibts sowas ja, aber in Perl?

Hier noch mal die genaue Fehlermeldung:

2019.07.23 09:14:22 1: ERROR evaluating my $TYPE='CUL_HM';my $NAME='HM_4CF3F5';my $SELF='n_batt_chk';my $EVTPART0='battery:';my $EVENT='battery: low';my $EVTPART1='low';{ if($EVENT !~ m/ok/) {
  { fb_mail('xxx@xxx.xx', 'FHEM Batteriewarnung', $NAME.': '.$EVENT)};
   Log 3, "$NAME: Batteriewarnung $EVENT";
  }
}: Undefined subroutine &main::fb_mail called at (eval 720) line 2.

2019.07.23 09:14:22 3: n_batt_chk return value: Undefined subroutine &main::fb_mail called at (eval 720) line 2.

CoolTux

Zitat von: Alex76 am 23 Juli 2019, 09:17:14
Danke für deine schnelle Antwort, ja du hast Recht, steht auch in der 99_myUtils.pm


Ich hab das inzwischen alles auf klein geändert und bekomme die Meldung weiterhin, ist wohl im Betreff noch falsch drinnen. Hab mir das auch am Anfang gedacht und es natürlich ausgebessert. Siehe Code 1. Thread.

Nur inzwischen könnte es nur an Dingen wie falsche Parameteranzahl liegen - in Java und .Net gibts sowas ja, aber in Perl?

Hast Du nach der Änderung auch die Moduldatei neu geladen oder FHEM neu gestartet?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Alex76

Ja, hab nach jeder Änderung fhem stop und fhem start gemacht und im ps -aux geschaut, dass kein Perl prozess mehr läuft.

Beta-User

Ergänzend vielleicht vorab mal lesen:
https://tty1.net/smart-questions_de.html#dontclaimbug

Zitat von: Alex76 am 23 Juli 2019, 09:09:28
Da das Wiki teilweise fehler hat, weil man sendmail nun mal nicht sendemail (ein e zuviel) unter debian schreibt, habe ich das schon mal bei mir ausgebessert.
https://packages.debian.org/de/buster/sendemail

Ich kann im Moment nicht erkennen, dass das Paket sendemail ausgemustert oder umbenannt worden wäre (Jessie und stretch kennen dasselbe Paket auch schon)...

(Wenn dem so wäre: bitte korrekte Anleitung für Buster liefern und nicht einfach so mal "rummaulen"; das verdirbt denen, die sich Mühe geben, das korrekt darzustellen eventuell die Laune >:( ).



In der Sache: Paßt die Initialisierungsroutine in der 99_myUtils.pm?
Ansonsten: Wenn du die Datei über FHEMWEB (edit files) änderst bzw. dann speichert, wird sie automatisch neu geladen. Nix Neustart usw.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Alex76

Ich hab hier nicht rumgemaunzt sondern nur festgestellt, dass sendmail seit Jahren der Name des sendmails unter Linux ist und mein System sendemail nicht kennt und man dies aber anscheinden nachinstallieren kann. Wobei es auch mit dem Standard Sendmail über die Console im Test läuft.

Da ich selbst keine Authentifizierung benötige, was wohl der Grund für ein anderes Paket sein wird und mir das neue Paket nicht bekannt ist, war das nur ein Hinweis auf mein Fehlerbild. Kann ja sein, dass die Doku nicht ganz aktuell ist. Aber danke für den Hinweis - wieder etwas gelernt.

CoolTux

Ok dann machen wir es mal konkret.
Ich gehe davon aus das die Fehlermeldung noch die selbe ist wie oben? Also kann die Sub nicht finden?

Dann ein list vom Device welches die Sub aufruft. Gehe von Notify aus.
Dann noch mal die gesamte aktuelle Sub hier posten.
Das alles bitte in Code Tags damit ich mir nicht die Augen kaputt mache.

@Jörg
Magst Du den User bitte weiter unter die Arme greifen. Bin nachher im Urlaub  ;D



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Alex76

Kein Problem:
/opt/fhem/FHEM/99_myUtils.pm

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
sub fb_mail {
        #my $rcpt = $_[0];
        #my $subject = $_[1];
        #my $text = $_[2];
        #system("echo \"$text\" > fhem_nachricht.txt");
        #system("mailer send -i 'fhem_nachricht.txt' -s \"$subject\" -t \"$rcpt\"");
        #system("rm fhem_nachricht.txt");
        #system("echo '$text' `date` | mail -s \"$subject | cut -d'(' -f2 | cut -d')' -f1`\" $rcpt ");
        my $rcpt = shift;
        my $subject = shift;
        my $text = shift;
        ´#my $attach = shift;
        my $ret = "";
        my $error;
        $ret .= qx(sendmail -f 'fhem@xxxx.xx' -t 'xxxx@xxx.xx' -u '$subject' -m '$text' -s 'xx.xx.xx.xx:587' -o tls=auto -o message-charset=utf-8);
        $ret =~ s,[\r\n]*,,g;    # remove CR from return-string
        Log 1, "sendemail returned: $ret";
}


Dann noch das notify aus der fhem.cfg

define SVG_FileLog_BewegungsmelderEingang_3 SVG FileLog_BewegungsmelderEingang:SVG_FileLog_BewegungsmelderEingang_3:CURRENT
setuuid SVG_FileLog_BewegungsmelderEingang_3 5cc36bf3-f33f-7f88-1d27-ce67fe1ebb9221ef
attr SVG_FileLog_BewegungsmelderEingang_3 room Garten,Terasse

define n_batt_chk notify .*:[Bb]attery:.* { if($EVENT !~ m/ok/) { \
  { fb_mail('xxxx@xxxx.xxx', 'FHEM Batteriewarnung', $NAME.': '.$EVENT)};; \
   Log 3, "$NAME: Batteriewarnung $EVENT";; \
  } \
}
setuuid n_batt_chk 5cc36bf3-f33f-7f88-2ac4-f5d39e4d345f690a

CoolTux

Du hast entweder nicht die ganze myUtils gepostet oder es fehlt in der Tat am Ende der gesamten Datei ein 1;
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Alex76

Stimmt, das ist bei allen anderen da, hab das nun hinzu gefügt, aber gleiche Fehlermeldung nach dem Neustart von FHEM.

hab auf das eine ' beim kommentar entfernt, dass dort sicher nicht hin gehört, nun sieht die Datei wie folgt aus:

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
sub fb_mail {
        #my $rcpt = $_[0];
        #my $subject = $_[1];
        #my $text = $_[2];
        #system("echo \"$text\" > fhem_nachricht.txt");
        #system("mailer send -i 'fhem_nachricht.txt' -s \"$subject\" -t \"$rcpt\"");
        #system("rm fhem_nachricht.txt");
        #system("echo '$text' `date` | mail -s \"$subject | cut -d'(' -f2 | cut -d')' -f1`\" $rcpt ");
        my $rcpt = shift;
        my $subject = shift;
        my $text = shift;
        #my $attach = shift;
        my $ret = "";
        my $error;
        $ret .= qx(sendmail -f 'fhem@xx.xx' -t 'xxxx@xxxx.xx' -u '$subject' -m '$text' -s 'xx.xx.xx.xx:587' -o tls=auto -o message-charset=utf-8);
        $ret =~ s,[\r\n]*,,g;    # remove CR from return-string
        Log 1, "sendemail returned: $ret";
}

1;

Alex76

gerade eben bin ich auf den Fehler drauf gekommen und zwar:

$ret .= qx(sendmail -f 'fhem@xx.xx' -t 'xxxx@xxxx.xx' -u '$subject' -m '$text' -s 'xx.xx.xx.xx:587' -o tls=auto -o message-charset=utf-8);

ist der Fehler, schreibt man die E-Mail dort direkt rein muss man sich um das @ kümmern und das Escapen

$ret .= qx(sendmail -f 'fhem\@xx.xx' -t 'xxxx\@xxxx.xx' -u '$subject' -m '$text' -s 'xx.xx.xx.xx:587' -o tls=auto -o message-charset=utf-8);

Das war echt ein dumme Fehler und komisch, dass man das in keinem Log findet.

CoolTux

Mach bitte in der FHEMWEB Kommandozeile ein
reload 99_myUtils

Und dann schaue in das FHEM Log in es Fehler gibt. Wenn nicht noch mal die sub aufrufen, kann man auch mit über die FHEMWEB Kommandozeile machen, und die Fehlermeldung hier posten.[/s]

Dann geht es nun also?
Und ich bezweifel das deswegen die selbe Fehlermeldung wie oben gekommen ist.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

#13
Zitat von: Alex76 am 23 Juli 2019, 09:09:28

Da das Wiki teilweise fehler hat, weil man sendmail nun mal nicht sendemail (ein e zuviel) unter debian schreibt, habe ich das schon mal bei mir ausgebessert.
Das ist schlicht Unsinn. Es gibt sendmail und es gibt sendemail (sendEmail) und im Wiki Artikel https://wiki.fhem.de/wiki/E-Mail_senden geht es ausschließlich um sendemail!

BTW keines meiner debian Systeme kennt sendmail. Muss man also genauso nachinstallieren.
sendmail ist mWn ein kompletter Mailserver.
sendemail ist ein Mailclient und damit aus meiner Sicht geeigneter für die Aufgabe: Ich will mal eine Mail senden.  ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

JoWiemann

Hm,

ich frage mich, warum du fb_mail genommen hast. fb steht für FritzBox und wurde für Fhem, das auf einer Fritte läuft entwickelt.

Besser wäre DebianMail, siehe auch Wiki: https://wiki.fhem.de/wiki/E-Mail_senden, gewesen.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM