Alarmanruf von Funksensoren auslösen - mit Fritzbox bzw. SIP/VoIP

  • Hallo liebe Raspberry-Gemeinde..
    Hatte öfters das böse Erlebnis, dass meine Tochter morgens den Kühlschrank so doll zugehauen hat, dass dieser wieder einen kleinen spalt aufgesprungen ist und ich es leider erst um 18:00 gemerkt habe als alle wieder im Haus waren..
    Habe mir dann einen Funksensor nach meigrafd's Anleitung gebastelt welcher die Kühlschranktemperatur überwacht und mich anruft sobald ein bestimmter Wert überschritten wird, so kann ich schnell nochmal umdrehen und den Kühlschrank vernünftig schließen..


    Deswegen habe ich mich mal schnell hingesetzt und die Funktion zum Anruf auslösen von den Sensoren gebastelt.. Ich zeige euch wie ihr mit den Funksensoren aus meigrafd's Thread einen Alarmanruf starten könnt wo euch per Sprachnachricht gesagt wird warum der Alarm ausgelöst wurde und euch per Pushnachricht zusätzlich eine Textnachricht aufs Handy senden lassen könnt.
    Voraussetzung in meinem Fall ist eine Fritzbox in dem wir ein IP/LAN Telefon angelegt haben. Es funktioniert aber auch mit jedem anderen SIP Account.
    Desweiteren muss euer Raspberry auf Port 80 bzw. der Webserver aus dem Internet erreichbar sein um die Warnungen zurückzusetzen.


    Vorweg: Ich arbeite immer mit dem Benutzer "root" und nicht mit "pi" damit ich mich nicht immer mit dem "sudo" befehl rumschlagen muss. Falls ihr also nicht als "root" User arbeitet, ist vor jeden Befehl das Prefix "sudo" zu stellen um sicher zu gehen dass die erforderlichen Rechte vorliegen.


    Als erstes erstellen wir das Verzeichnis sip-tools im Ordner Root

    Code
    mkdir -p /root/sip-tools


    und laden ein PERL-Script namens Speak.pl von Github herunter, welches einen Text als mp3 Datei von der Google-Translate homepage runterlädt.

    Code
    git clone https://gist.github.com/michalfapso/3110049 /root/sip-tools


    Danach wechseln wir in das Verzeichnis sip-tools welches wir gerade erstellt haben...

    Code
    cd sip-tools


    ..und machen das gerade runtergeladene Script ausführbar.

    Code
    chmod +x speak.pl


    Als nächstes versuchen wir das Script aufzurufen mit dem Befehl

    Code
    ./speak.pl


    .. Bekommt ihr ein "Usage: ./speak.pl LANGUAGE IN.txt OUT.mp3" Hinweis angezeigt? Gut! Dann könnt ihr die Schritte Perlmodule installieren überspringen und weiter unten bei "Nach dem installieren der Perlmodule" weitermachen.


    Perlmodule Installieren:
    Bei mir kam beim ersten versuch speak.pl auszuführen eine Fehlermeldung "Can't locate HTTP/Cookies.pm ....." das bedeutet, dass ein Perlmodul, in diesem Fall HTTP::Cookies nicht installiert ist.


    Wir installieren das Perlmodul mit

    Code
    cpan HTTP::Cookies


    Falls noch nie mit "cpan" gearbeitet wurde dann kommt eine Meldung dass CPAN erst konfiguriert werden muss. Wir geben "yes" ein und drücken Enter.
    Jetzt erscheint die Frage ob CPAN automatisch Mirrors für die runterzuladenden Module festelegen soll. Wir geben "yes" ein und drücken Enter.
    Ihr habt jetzt kurz Zeit für eine Zigarette..


    Jetzt versuchen wir nochmal das Script auszuführen..

    Code
    ./speak.pl


    Bei mir wurde jetzt das WWW::Mechanize Modul nicht gefunden.
    Also fix nochmal installieren mit

    Code
    cpan WWW::Mechanize


    .. jetzt habt ihr Zeit für einen Kaffee..


    Nach dem installieren der Perlmodule installieren wir uns das Paket "sox", welches für uns die MP3 Dateien behandelt die im Script speak.pl erzeugt werden.

    Code
    apt-get install sox


    und installieren gleich hinterher das Paket für Sox welches mit MP3 umgehen kann..

    Code
    apt-get install libsox-fmt-mp3


    Als nächstes installieren wir uns das Paket "asterisk" mit welchem man bei Bedarf eine komplette Telefonanlage aufsetzen kann.. Aber das wollen wir in diesem Fall nicht.

    Code
    apt-get install asterisk


    Jetzt bearbeiten wir die Asterisk Konfigurationen entsprechend unserer Fritzbox in dessen Webinterface wir unter dem Punkt "Telefongeräte" ein IP Telefon angelegt haben. -Dazu gehe ich hier nicht weiter ein. -


    Die Asterisk Dateien finden wir im Verzeichnis /etc/asterisk/
    Die Datei sip.conf sieht bei mir folgendermaßen aus (Heimnetz läuft unter 192.168.1.0 und die Fritzbox ist unter 192.168.1.1 erreichbar.
    Mein User für das IP Telefon in der Fritzbox ist 621 .. Beachtet in der Konfiguration, dass ihr die beiden Einträge <<EUER PASSWORT>> mit eurem Passwort das ihr in der Fritzbox für das IP Telefon festgelegt habt ersetzt. Ung gegebenenfalls auch den Benutzernamen in den Zeilen.


    Sip.conf


    Wir laden jetzt die Pushbullet App auf unser Handy runter um zusätzlich zum Anruf eine Pushbenachrichtigung in Textform zu erhalten.
    Wenn die App runtergeladen ist und man sich registriert hat, ruft man über die Homepage pushbullet.com den Account auf und generiert sich einen
    "Accesstoken" unter "Account settings". Diesen Accesstoken brauchen wir im nächsten Schritt.


    Ich habe mir jetzt ein kleines Bash-script erstellt, über welches man die zu sprechenden Nachricht + Telefonnummer übergeben kann.
    Dieses Script im Verzeichnis /root/sip-tools/ als Datei anruf.sh speichern und dabei den Pushbullet Accesstoken in Zeile 18 vor dem : einfügen sowie die IP/Webadresse von der eure Raspberry aus dem Internet erreichbar ist.


    anruf.sh


    Wir befinden uns aktuell im Verzeichnis /root/sip-tools/ und machen jetzt das gerade erstellte Bashscript ausführbar

    Code
    chmod +x anruf.sh


    Jetzt könnt ihr schonmal ein Testanruf machen..
    Dazu führen wir das Bashscript aus welches wir gerade als Anruf.sh gespeichert haben.

    Code
    ./anruf.sh 040123456 Dies ist eine Testnachricht


    Es würde jetzt an Anruf an die Nummer 040123456 gehen, mit der Nachricht "Dies ist eine Testnachricht" und gleichzeitig müsste diese Nachricht auch als Textnachricht auf eurem Handy erscheinen.
    Jetzt müssen wir ein Reset machen, um zu bestätigen dass die Warnung zurückgesetzt werden kann und wir neue Warnungen empfangen wollen

    Code
    ./anruf.sh reset


    Damit wir eine Warnung erhalten von den Funksensoren aus meigrafd's Thread, müssen wir die add.php Datei im Verzeichnis /var/www/Sensor/ ändern
    und zwar ändern wir das Ende der Datei

    Code
    }
            $db = db_con($DBfile);
            $insert = db_query($SQL);
        }
    }
    
    
    ?>


    folgendermaßen ab:


    Dies bewirkt, dass Sobald die Temperatur von NodeID 1 (wie in der config.php der Funksensoren festgelegt) über 20° steigt, ein Anruf an die Nummer 040123456 abgesetzt wird.
    Leider gibt es in der Textnachricht aufs Handy Probleme mit Umlauten (ä,ö,ü).
    Deswegen habe ich ä durch ae ersetzt. Aber die Sprachnachricht wird natürlich trotzdem korrekt ausgegeben. :)


    Nun erstellen wir noch eine reset.php Datei im Verzeichnis /www/Sensor/ die von außerhalb aufgerufen werden kann, damit man nicht alle 5 Minuten die gleiche Meldung erhält.
    Dazu muss in eurer Firewall/Router der Port 80 von eurem Raspberry freigegeben werden für den Zugriff von außerhalb, desweiteren solltet ihr eine DynDNS Adresse einrichten um den Raspberry immer von außerhalb zu erreichen.
    reset.php

    PHP
    <?php
    shell_exec("sudo /root/sip-tools/anruf.sh reset");
    echo "Fertig";
    ?>


    Als letzten Schritt fügen wir den User www-data über den Befehl

    Code
    visudo


    in die Datei ein die sich automatisch öffnet und sagen, dass www-data das Script /root/sip-tools/anruf.sh mit Rootrechten ausführen darf.
    Dafür fügen wir am Ende eine neue Zeile ein:

    Code
    www-data ALL=(ALL) NOPASSWD: /root/sip-tools/anruf.sh


    und speichern die Datei mit STRG+X und Y als bestätigung.


    Das wars. Jetzt einmal

    Code
    reboot


    und euer Raspberry ist bereit zum Telefonieren.
    Hier noch ein kleines Video (leider habe ich beim Anruf zu spät den Lautsprecher aktiviert, deswegen ist die Ansage am Anfang nicht vollständig im Video zu hören..):

    External Content www.youtube.com
    Content embedded from external sources will not be displayed without your consent.
    Through the activation of external content, you agree that personal data may be transferred to third party platforms. We have provided more information on this in our privacy policy.


    Dies ist mein erstes Tutorial. Kritik und Verbesserungsvorschläge werden gerne angenommen.. :)


    Gruß


    Änderungen:
    20.07.14: Funktion zum übergeben der Rufnummer im Script hinzugefügt. z.B.: ./anruf.sh 040123456 Testnachricht ... Um die Änderungen zu übernehmen: anruf.sh und add.php bearbeiten wie in meiner Anleitung oben.


    20.07.14: Damit wir nicht alle 5 Minuten einen Anruf bekommen, habe ich eine Reset Funktion eingebaut. Man muss einen Reset ausführen nachdem man einen Anruf bekommen hat, solange dieser Reset nicht durchgeführt wurde.. ERHÄLT MAN KEINEN NEUEN ANRUF!! Um die Änderungen zu übernehmen: anruf.sh neu schreiben und reset.php wie in meiner Anleitung hinzufügen.

    Edited 2 times, last by BuZZy ().

  • Das ist eine gute Frage, ich denke man könnte da mit einem USB Modem arbeiten. Aber habe jetzt auf die schnelle im Netz nichts dazu gefunden und kenne mich selber zu wenig mit Modemtechnik aus.

  • Hallo Alex, push Nachricht wird geschickt aber ich bekomme das leider nicht mit den Anruf hin. Habe in der Fritzbox 7390 und habe IP Telefon eingerichtet aber irgend was scheint nicht zu stimmen.
    Muss ich noch etwas beachten in der FritzBox?
    Gruß chris

  • Hi Chris,
    laufen die Scripts alle mit root rechten?


    Verbinde dich mal mit deinem Raspberry über SSH und gib den befehl "asterisk -vvvvvr" ein.
    Somit kommst du in das Asterisk Commandlineinterface.
    Dann schreibst du "sip show registry".
    Wird dir jetzt deine Fritzbox mit dem Status "registered" angezeigt?
    Wie man in dem Screenshot unten sieht, sagt mir Asterisk hier das eine Verbindung mit 192.168.1.1 (meine Fritzbox) mit dem Username "621" besteht.


    Mit dem Befehl "exit" verlässt du das Asterisk CLI wieder und befindest dich wieder normal auf deinem Raspberry.

  • HuHu,


    vielen Dank BuZZy für das Tutorial!
    Ich hatte jetzt vor, einen Teil daraus zu verwenden:
    Bei eingehenden Anrufen soll der Pi einfach ein Script ausführen, das z. B. die Musik auf lautlos stellt.


    Asterisk habe ich installiert und deine Beispieldatei sip.conf dementsprechend abgeändert.
    Speak.pl und sox brauche ich ja eigentlich für meinen Zweck nicht?
    Bei dir wird das Script ja bei erreichen einer Temperatur ausgeführt, bei mir soll es bei ankommendem Anruf ausgeführt werden, ich weiß aber leider nicht wie ich das bewerkstelligen kann.


    Und muss ich Asterisk immer erst irgendwie starten, oder startet das automatisch mit und loggt sich als IP-Telefon ein? Habe asterisk heute zum ersten mal installiert, also noch absolut keine Erfahrung damit, scheint ja doch relativ kompliziert zu sein, deshalb hoffe ich das mein Anliegen leicht zu lösen ist...


    Vielen Dank, simi-chan

    Edited once, last by simanuel ().

  • Hi simi-chan,


    der Part wo der Anruf ausgelöst wird ist dieser hier im Script:
    Ich schreibe die Nummer die angerufen werden soll und die Anweisung was passieren soll (Playback Data /var/lib.....) in eine Datei.

    Code
    echo -e "Channel: SIP/localphone/$Nummer\nApplication: Playback\nData:  /var/lib/asterisk/sounds/custom/play" >> /root/sip-tools/anruf.call


    Wenn alles fertig ist wird diese Datei verschoben in einen Ordner der von Asterisk überwacht wird. Sobald dort eine Datei erstellt wird in dem Order liest Asterisk diese Datei und befolgt die Anweisungen aus der Datei.

    Code
    mv /root/sip-tools/anruf.call /var/spool/asterisk/outgoing/


    Sobald du also eine .call Datei im Order /var/spool/asterisk/outgoing/ erstellst, wird diese sofort von Asterisk ausgeführt.


    Speak und sox benötigst du nicht für eingehende Anrufe.


    Asterisk startet sich automatisch wenn du den Raspberry hochfährst.


    Um eingehende Anrufe zu "verarbeiten" musst du dir die Datei /etc/asterisk/extensions.conf vornehmen.
    um ein Script auszuführen wenn das Telefon klingelt, müsste die Datei zum Beispiel so aussehen:

    Code
    [incoming]
    
    
    exten => 621,1,System(/pfad/zum/script.sh)


    Wobei hier wieder 621 der Username von dem Telefon ist den du konfiguriert hast.


    Wenn die extensions.conf zum Beispiel so aussieht, wird der Anruf angenommen, 10 Sekunden lang "stille" gespielt und dann aufgelegt.

    Code
    [incoming]
    
    
    exten => 621,1,Answer()
    exten => 621,2,Background(silence/10)
    exten => 621,3,Hangup()


    Wenn anruf von Extern kommt auf Telefon 621 als erstes "Answer()" danach "Background(silence/10)" und als drittes wieder Auflegen mit "Hangup()"
    Bitte nicht vergessen die Rechte für das Script welches ausgeführt werden soll entsprechend auf 777 zu setzen, da das Script vom Benutzer "asterisk" ausgeführt wird. :)


    Wie gesagt, wichtig der Anruf kommt von Extern. Also am besten vom Handy versuchen. ;)


    Gruß,
    Alex..

    Edited once, last by BuZZy ().

  • Wow, vielen Dank für deine schnelle Hilfe!


    Code
    [incoming]
    exten => 620,1,System(sh /home/pi/anruf.sh)


    Funktioniert 1A! Und wenn man weiß wie es geht sogar supereinfach... Bin begeistert :D


    Danke Danke Danke :D

  • Naja, zu heftig? Warum? Funktioniert und scheint jetzt auch nicht so sehr ressourcen-hungrig.


    Habe die Zeile in der extensions.conf noch etwas abgeändert:

    Code
    [incoming]
    exten => 620,1,System(sh /home/pi/anruf.sh ${CALLERID(num)})


    Damit hat man in dem Script in der Variabel $1 auch gleich die Nummer, die Anruft. Finde ich ziemlich genial, so geht nicht nur hier die Musik leise oder der Film/die Serie auf Pause wenn jemand auf dem Festnetz anruft, sondern ich bekomme über Pushbullet auch unterwegs die Mitteilung und kann darin auf die Nummer klicken, wenn die Nummer nicht unterdrückt wurde sehen wer angerufen hat und wenn ich mag vom Handy aus zurückrufen.


    LG simi-chan

  • Viel Glück mit sipcmd.. Habe über eine Woche versucht damit einen Anruf + Ansage durchzuführen.. :D
    Mal war es still mal wurde der Anruf nach der Ansage nicht beendet und und und.. Deswegen bin ich zu asterisk gewechselt. ;)


    simanuel
    Die Fritzbox (zumindest meine 6360 kann das von Haus aus, eine eMail schicken wenn ein Anruf zuhause verpasst wurde. Habe die Fritzbox so konfiguriert, dass wenn jemand eine Nachricht auf dem Anrufbeantworter hinterlässt, dass diese Nachricht gleich als Audiodatei mit der eMail mit gesendet wird.. :)


    Gruß

    Edited once, last by BuZZy ().

  • Ja, Sprachnachrichten bekomme ich dann auch per E-Mail, aber nur, wenn auch jemand auf den AB gesprochen hat. Finde es als Pushbullet-Nachricht schöner, kommt sofort wenn das Telefon noch klingelt, außerdem hab ich für die Nachrichten dann einen anderen Ton als bei der E-Mail, obwohl man das bei der Mail natürlich auch einstellen könnte...

  • Hallo Leute,
    ich habe Probiert, nach deiner Anleitung vorzugehen, jedoch fehlt auch bei mir dieses WWW::Mechanize.
    versuche ich, es nach deiner Anleitung zu installieren, erhalte ich immer folgende Fehlermeldung:



    Hat jemand eine Idee, was das sein kann?


    Danke und LG,
    C4

  • Erstmal herzlichen Dank an BuZZy.


    Genau so etwas habe ich gesucht. Ich möchte eine Hausautomation bauen, die mich informiert, wenn das Rückstauventil im Abwasserkanal geschlossen ist.


    Nur habe ich dass Problem, ein Linux-Neuling zu sein und habe schon Probleme bei der Installation des Perl-Moduls, es werden folgende Fehler-Meldungen vom PI ausgeworfen, mit denen ich nichts anfangen kann:



    Ich nutze das Raspbian Wheezy vom 05.05.15.


    Kann mir jemand Hilfestellung geben?

  • bevor ich mir das hier alles installiere, funktioniert das noch?
    Würde auch gerne bei Alarm einen Anruf erhalten, habe bisher ein paar andere Sachen ausprobiert, funktioniert aber nicht.


    Geht das auch mit SIP-Daten der Telekom (IP-Anschluss)?

  • Hi danke habe ein Teil installiert. Das Anrufen funktioniert.
    Wollte die Sache ein wenig abwandeln.
    Bei einem Alarm soll ich ein Anruf bekommen. --> hat funktion.
    Wie kann ich das Zeittechnisch reseten?? Nach 10 sekunden oder so??
    Ich wollte auch eine Alarmmeldung mit aufs Telefon schicken.... Alarmtext von einen anderen Pc im Netzwerk ??
    soll eine Art ip alarmanlage werden.


    Sorry bin neu hier... Danke Daniel

  • Hallo an alle!
    Nach viel passivem Lesen (was mir immer sehr geholfen hat) muss ich mich nun doch mal anmelden und selbst eine Frage loswerden.


    Erstmal vielen Dank an BuZZy für diee Anleitung :bravo2: . Bei mir funktioniert alles bestens und auch mit meinen nicht ganz ausgereiften Scripting-Künsten gelang es mir das ganze auf meine Bedürfnisse anzupassen (z.B. ohne Pushbullet). Das speak.pl scheint auch nicht mehr zu funktionieren - habe ich durch lokales espeak mit MBROLA ersetzt.
    Meine Frage geht vll. ein wenig am Thema vorbei, da ich mich aber 1:1 an diese Anleitung gehalten habe und damit soweit alles funktioniert frage ich mal hier. Ich habe eine Fritzbox 7490 mit neumodischem Telekom-ex-analog-nun-Voip-Anschluss. Wie kann ich verhindern, dass beim Anruf die Nummer übertragen wird? Oder ist es gar möglich die Nummer die beim gegenüber angezeigt wird komplett frei zu wählen? Ich habe diesbezüglich lange gegoogelt, komme aber leider auf keinen grünen Zweig. Vielversprechend klingt z.B. dieser Thread: http://www.ip-phone-forum.de/showthread.php?t=258788. Leider scheinen sich dort Profis zu unterhalten. Ich hingegen komme gerade zu ersten mal mit Asterisk in Kontakt. An welche Stelle (in der hier vorgestellten Konfiguration) würde man denn z.B. die jeweiligen Zeilen in die sip.conf und extensions.conf einfügen? Ich habe versucht mir das mit den "Contexten" anzulesen aber ehrlich gesagt nicht wirklich verstanden :s


    Grüße und Danke schonmal!
    Jan

  • Guten Morgen,
    auch von meiner Seite her ein herzlichen Dank an die super ausführliche Anleitung.
    Doch wie es immer mit der Zeit ist gibt es wohl hin und wieder Probleme.
    Ich habe die Anleitung nun ein vielfaches überprüft und geschaut ob ich einen Fehler gemacht habe. Doch ich finde ihn nicht.
    Ich bekomme eine Push-Up Nachricht auf mein Handy. Das funktioniert auch klasse.
    Aber ein Anruf wird leider nicht getätigt.


    Über Asterisk kann ich eine SIP Registrierung erkennen. Das scheint wohl alles zu funktionieren.


    Habt ihr auch die gleichen Probleme oder gibt es ein Update?


    Es wird keine MP3 erstellt und somit wird der Anruf auch nicht getätigt. Ich konnte gerade eine MP3 von mir mal hochladen und der Anruf funktionierte


    Habt ihr eine Alternative zu speak.pl?

    Edited once, last by eingabe ().