Rauchmelder Problem

Begonnen von Blebbens, 06 Juni 2014, 21:41:12

Vorheriges Thema - Nächstes Thema

Blebbens

Ich habe in der 99_Utils.pm genau folgendes stehen:

######## DebianMail  Mail auf dem RPi versenden ############
sub
DebianMail
{
my $rcpt = shift;
my $subject = shift;
my $text = shift;
my $ret = "";
my $sender = "test\@gmail.com";
my $konto = "test\@gmail.com";
my $passwrd = "test";
my $provider = "smtp.provider.de"; #OHNE PORT
Log 1, "sendEmail RCP: $rcpt";
Log 1, "sendEmail Subject: $subject";
Log 1, "sendEmail Text: $text";

$ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=yes -o message-charset=utf-8);
$ret =~ s,[\r\n]*,,g;    # remove CR from return-string
Log 1, "sendEmail returned: $ret";
}


Dabei ist TLS eingeschaltet worden und der Port hinter smtp weggelassen. Und 99_Utils.pm wird automatisch geladen ?

marc2

Ich werde nie verstehen, warum man sendEmail überhaupt in FHEM nutzen sollen  :o

  • Kennworte in Skripten sind mehr als unschön
  • Wenn der Provider ein Problem hat, bleibt FHEM je nach Fehlerbild komplett stehen, da versucht wird, die Mail synchron an den Provider zu senden (hatte letzteres als mein FHEM noch auf der Fritzbox lief und der "mailer" der Fritzox genutzt wurde)
Besser ist es, sich einen kleinen lokalen MTA (Postfix, oder was auch immer) zu installieren (auf Raspi, BBB, etc. kein Problem) und für seinen Provider zu konfigurieren (hierzu existieren unzählige Anleitungen).  FHEM kann die Mails dann z.B. einfach über "MIME::Lite" an den MTA schicken. Hat der Provider ein Problem, hat dies keine Auswirkungen auf FHEM, da der lokale MTAs die Mails annimmt und weiterleitet, bzw. in die Queue stellt, wenn es ein Problem gibt ....


use MIME::Lite;
use File::Basename;

sub my_mail {
        my ($rcpt, $subject, $text, $attachment) = @_;
        my $msg = MIME::Lite->new (
                          From    => 'FHEM <fhem@meine-domain.de>',

        if ($attachment ne "") {
                $msg->attach(Path     => $attachment,
                             Filename => basename($attachment),
                             Disposition => 'attachment'
                );
        }

        if ($text ne "") {
                 $msg->attach(Type    =>'TEXT',
                              Data    => $text
                 );
        }

        $msg->send;
        Log 3, "Mail sent to $rcpt";
}



Gruß, Marc 

Blebbens

Dann werde ich mal Postfix als Satellitensystem aufsetzen.

Und dann setzte ich Deinen Code in die 99_Utils.pm?
Und anschliessend nutze ich welchen Code, um den NoBattery-Check zu senden?

marc2

Hi !

Hier das passende Notify:

define Battery_Check notify .*[Bb]attery:.* {\
if("%" !~ m/ok/) {\
{ my_mail('<MAIL ACCOUNT>@@<DOMAIN>',"Battery warning", "@ %","")};;\
    Log 3, "@ Battery warning: %";;\
}\
}


Gruß, Marc

Blebbens

#49
So... ich habe PostFix aufgesetzt per apt-get install postfix als "Satellitensystem".

Als Relay-Server habe ich smpt.gmail.com:465 eingegeben.

Die Datei main.cf habe ich wie folgt geändert:
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noplaintext noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
sender_canonical_maps = hash:/etc/postfix/sender_canonical


In der Datei sasl_password habe ich eingefügt "smpt.gmail.com fhem.test@gmail.com:Passwort".
Danach habe ich die Rechte angepasst mit chmod 600 /etc/postfix/sasl_password.
Und in die Datenbank übernommen mit postmap hash:/etc/postfix/sasl_password.

In die Datei "sendet_canonical" habe ich eingetragen:
root status@example.com
www-data www@example.com
Und in die Datenbank übernommen mit postmap /etc/postfix/sender_canonical.

Abschließend erfolgte:
update-rc.d postfix defaults
service postfix restart

Aber mein Test:
(
>    echo "Subject: Testnachricht"
>    echo " "
>    echo "Dies ist ein Test"
>    echo " "
> ) | /usr/bin/mail -s "Testnachricht" empfaenger@example.com


... wir beantwortet mit:
send-mail: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol
postdrop: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol


Warum antwortet sendmail und was habe ich bei der Konfiguration von Postfix falsch angestellt ?
Kann jemand da helfen ?
Muss ich sendmail removen ?

Trigger ich einen Rauchmelder mit einem Battery:low, so steht im logfile:
Battery_Check return value: Undefined subroutine &main::my_mail called at (eval 164) line 3.
Heisst doch, mit my_mail kann nichts angefangen werden. Müsste dort nicht postfix hin?

Dabei habe ich obigen Code in fhem.cfg eingefügt:
define Battery_Check notify .*[Bb]attery:.* {\
if("%" !~ m/ok/) {\
{ my_mail('fhem.test@@gmail.com',"Battery warning", "@ %","")};;\
    Log 3, "@ Battery warning: %";;\
}\
}


Dabei bin ich mir bei obigen Codes nicht sicher, wo ich smtp.gmail.com und wo smtp.gmail.com:465 eingeben solte.

Letztlich möchte ich nur erreichen, dass fhem eine Mail an mich schickt bei leeren Batterien oder Alarmen.

marc2

Moin !

Zitatsend-mail: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol
postdrop: warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol

Dein System kann keine IPv6 aber Postfix versucht es nutzen. Das ist nur eine Warnmeldung, aber man kann  IPv6 in der 
main.cf auch abschalten indem man inet_protocols auf ipv4 setzt:

inet_protocols = ipv4

Zu welchem RPM gehört Dein "/usr/bin/mail" ? Es wird grundsätzlich nicht benötigt, Du kannst Die Mail direkt nach /usr/lib/sendmail pipen.
Letzteres gehört nicht zu sendmail sondern zu Postfix. Sendmail (nicht zu verwechseln mit dem sendEmail !!), war lange Zeit der
defakto Standard auf allen UNIX Systemen. Entsprechend stellt Postfix eine sendmail-konforme API zur Verfügung, und daher gibt
es auch nach wie vor ein /usr/lib/sendmail.

ZitatBattery_Check return value: Undefined subroutine &main::my_mail called at (eval 164) line 3.

Du hast die Funktion my_mail entweder nicht in Dein 99_myUtils.pm aufgenommen oder den "reload  99_myUtils.pm" vergessen.
Wichtg ist auch, dass Du die beiden Includes in 99_myUtils aufnimmst !

Gruß, Marc

Blebbens

#51
Naja, ich habe in meiner /opt/fhem/FHEM/99_Utils.pm deinen Code eingefügt:
use MIME::Lite;
use File::Basename;

sub my_mail {
        my ($rcpt, $subject, $text, $attachment) = @_;
        my $msg = MIME::Lite->new (
                          From    => 'FHEM <fhem@meine-domain.de>',

        if ($attachment ne "") {
                $msg->attach(Path     => $attachment,
                             Filename => basename($attachment),
                             Disposition => 'attachment'
                );
        }

        if ($text ne "") {
                 $msg->attach(Type    =>'TEXT',
                              Data    => $text
                 );
        }

        $msg->send;
        Log 3, "Mail sent to $rcpt";
}


Damit ist doch die Funktion my_mail und die includes eingetragen, oder ?

ZitatZu welchem RPM gehört Dein "/usr/bin/mail" ? Es wird grundsätzlich nicht benötigt, Du kannst Die Mail direkt nach /usr/lib/sendmail pipen.
Letzteres gehört nicht zu sendmail sondern zu Postfix. Sendmail (nicht zu verwechseln mit dem sendEmail !!), war lange Zeit der
defakto Standard auf allen UNIX Systemen. Entsprechend stellt Postfix eine sendmail-konforme API zur Verfügung, und daher gibt
es auch nach wie vor ein /usr/lib/sendmail.

Das verstehe ich nicht ganz. Wie pipe ich die Mail direkt nach /usr/lib/sendmail und wie geht diese dann tatsächlich auf die Reise zu meinem Smartphone ?

Auch nach dem reload der 99_Utils mit dem Code weiterhin drin wirft er obigen Fehler raus.

In der /var/log/mail.log steht:
Jul  6 16:55:52 rpi postfix/smtp[4443]: 5C0D25E5F6: to=<empfaenger@example.com>, relay=smtp.gmail.com[74.125.136.108]:465, delay=71202, delays=70601/0.36/600/0, dsn=4.4.2, status=deferred (conversation with smtp.gmail.com[74.125.136.108] timed out while receiving the initial server greeting)
Jul  6 17:46:18 rpi postfix/pickup[4413]: 4C5DA5E601: uid=1000 from=<pi>
Jul  6 17:46:18 rpi postfix/cleanup[4519]: 4C5DA5E601: message-id=<20140706154618.4C5DA5E601@rpi>
Jul  6 17:46:18 rpi postfix/qmgr[2940]: 4C5DA5E601: from=<pi@rpi>, size=446, nrcpt=1 (queue active)
Jul  6 17:46:18 rpi postfix/smtp[4521]: CLIENT wrappermode (port smtps/465) is unimplemented
Jul  6 17:46:18 rpi postfix/smtp[4521]: instead, send to (port submission/587) with STARTTLS

marc2

Hi !

Zitat von: Blebbens am 06 Juli 2014, 17:43:40
Naja, ich habe in meiner /opt/fhem/FHEM/99_Utils.pm deinen Code eingefügt:
Das kann eigentlich nicht sein. Werden andere Funktionen in Deiner 99_Utils.pm gefunden ?

Zitat von: Blebbens am 06 Juli 2014, 17:43:40
Das verstehe ich nicht ganz. Wie pipe ich die Mail direkt nach /usr/lib/sendmail und wie geht diese dann tatsächlich auf die Reise zu meinem Smartphone ?

echo Testmail |  /usr/lib/sendmail mein@mailaccount.de

Zitat von: Blebbens am 06 Juli 2014, 17:43:40
Auch nach dem reload der 99_Utils mit dem Code weiterhin drin wirft er obigen Fehler raus.

In der /var/log/mail.log steht:
Jul  6 16:55:52 rpi postfix/smtp[4443]: 5C0D25E5F6: to=<empfaenger@example.com>, relay=smtp.gmail.com[74.125.136.108]:465, delay=71202, delays=70601/0.36/600/0, dsn=4.4.2, status=deferred (conversation with smtp.gmail.com[74.125.136.108] timed out while receiving the initial server greeting)
Jul  6 17:46:18 rpi postfix/pickup[4413]: 4C5DA5E601: uid=1000 from=<pi>
Jul  6 17:46:18 rpi postfix/cleanup[4519]: 4C5DA5E601: message-id=<20140706154618.4C5DA5E601@rpi>
Jul  6 17:46:18 rpi postfix/qmgr[2940]: 4C5DA5E601: from=<pi@rpi>, size=446, nrcpt=1 (queue active)
Jul  6 17:46:18 rpi postfix/smtp[4521]: CLIENT wrappermode (port smtps/465) is unimplemented
Jul  6 17:46:18 rpi postfix/smtp[4521]: instead, send to (port submission/587) with STARTTLS

[/code]

Ich würde mal behaupten, dass Deine Postfix Konfiguration nicht stimmt. Schau Dir mal das folgende Rezept an:

http://blog.mx17.net/2012/11/05/postfix-with-gmail-as-relay-on-debian-squeeze/

Gruß, Marc

Blebbens

#53
Danke für die Anleitung, beim letzten Schritt hapert es:
"sudo cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem >> /etc/postfix/cacert.pem"
Führt zu: "-bash: /etc/postfix/cacert.pem: Keine Berechtigung"

Der Restart von Postfix via "/etc/init.d/postfix restart" führt zu:
[....] Stopping Postfix Mail Transport Agent: postfixsed: kann /var/spool/postfix/pid/master.pid nicht lesen: Keine Berechtigung

Reicht ein chmod 777 auf /var/spool/postfix/pid/master.pid ? Und wie ist die Berechtigung oben anzupassen ?

Daraufhin folgt nämlich:
[ ok ] Stopping Postfix Mail Transport Agent: postfix.
[....] Starting Postfix Mail Transport Agent: postfixrm: Entfernen von ?etc/localtime? nicht m?glich: Keine Berechtigung
chmod: Beim Setzen der Zugriffsrechte f?r ?etc/localtime?: Die Operation ist nicht erlaubt

marc2

Als welcher User arbeitest Du ? Das muss als root erfolgen !

Gruß, Marc

Blebbens

Arbeite als User Pi.
Einfach Pi per su zum Super user benennen?

no_Legend

Wenn es raspbian ist einfach for jedem befehlt ein sudo stellen.
Docker FHEM immer aktuell,4x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
Homematic, Shelly, Tasmota, MQTT, Unifi Network usw.

Blebbens

Ich hatte allen Befehlen bereits sudo vorangestellt...

Auf "sudo cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem >> /etc/postfix/cacert.pem"
folgt "-bash: /etc/postfix/cacert.pem: Keine Berechtigung"

In 99_Utils.pm ist auch ganz sicher die Subroutine eingebaut... wie kann ich denn sicherstellen, dass fhem die 99_Utils überhaupt nutzt/einliest ?

Puschel74

Hallo,

Zitatwie kann ich denn sicherstellen, dass fhem die 99_Utils überhaupt nutzt/einliest ?
Alles was mit 99 anfängt wird automatisch bei einem fhem-start eingelesen.
Die 99_Utils.pm würde ich persönlich meiden weil diese bei einem update überschrieben werden kann - besser auf eine 99_myUtils.pm ausweichen, siehe Wiki.

Zitatfolgt "-bash: /etc/postfix/cacert.pem: Keine Berechtigung"
Schaut für mich nach einem Rechteproblem aus - wie auch schon dabei steht "Keine Berechtigung".

Du hast ein Linux-System?
Dann mach dich mal mit Linux vertraut  ;)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Blebbens

#59
Naja, ich stelle den Befehlen "sudo" voran, was doch im Grunde root-Rechten entspricht.

Die 99_Utils enthält ja nun den code für Postfix, was installiert wurde.
Triggere ich nun "leere Batterien", so steht im Logfile:
"Battery_Check return value: Undefined subroutine &main::my_mail called at (eval 5962) line 3."

Es muss doch ein Fehler in der fhem.cfg vorhanden sein:

define Battery_Check notify .*[Bb]attery:.* {\
        if("%" !~ m/ok/) {\
                { my_mail('test.fhem@@gmail.com',"Battery warning", "@ %","")};;\
                  Log 3, "@ Battery warning: %";;\
        }\
}


Oder eben in 99_myUtils.pm:
use MIME::Lite;
use File::Basename;

sub my_mail {
        my ($rcpt, $subject, $text, $attachment) = @_;
        my $msg = MIME::Lite->new (
                          From    => 'FHEM <fhem@xxx-dyndns.org>',

        if ($attachment ne "") {
                $msg->attach(Path     => $attachment,
                             Filename => basename($attachment),
                             Disposition => 'attachment'
                );
        }

        if ($text ne "") {
                 $msg->attach(Type    =>'TEXT',
                              Data    => $text
                 );
        }

        $msg->send;
        Log 3, "Mail sent to $rcpt";
}


Allzu leicht scheint dieser Fehler ja nicht - für mich Anfänger zumindest - durch Foren etc zu lösen sein.