FHEM ruft FRITZ!Box

In Sachen Heimautomatisierung setze ich bekanntlich auf Homematic, allerdings habe ich die betagte CCU bereits vor einigen Monaten durch einen Raspberry Pi mit FHEM ersetzt. Der Einarbeitungsaufwand ist recht hoch, aber es lohnt sich: Über FHEM-eigene Funktionen, viele Erweiterungsmodule oder PERL-Scripte ist fast jede Idee realisierbar.

Meine neueste Anforderung: Wenn jemand an der Tür klingelt, sollen alle Telefone in meiner Wohnung läuten und, soweit möglich, den Text „Türklingel“ auf dem Display zeigen. Nach wenigen Sekunden soll der Spuk dann von selbst wieder ein Ende haben.

Update 2015-02-22: Siehe Kommentare – es gibt ein FRITZ!Box Modul bei FHEM, welches diese Aufgabe sehr elegant und verlässlich erledigt. Der Umweg über SIPCMD und Gruppenruf ist nicht notwendig!

Ich lasse den folgenden Artikel stehen, da er gleichermaßen auch für andere Routertypen gilt, die einen internen SIP Registrar anbieten.

Update 2015-12-15: In der aktuellen FRITZ!Box Firmware wird der Telnet Zugang leider nicht mehr unterstützt, weshalb auch das besagte FHEM Modul nicht mehr funktioniert. Der Umweg über SIPCMD ist also wieder aktuell.

Update 2017-02-03: Ab FRITZ!OS 6.80 scheint SIPCMD laut Nutzerberichten nicht mehr zu funktionieren bzw. keinen Ruf mehr absetzen zu können. Es gibt aber mittlerweile ein FHEM Modul namens FB_SIP.pm und eines namens SIP.pm, welche einen SIP Client enthalten und funktionieren. Das Gebastel mit SIPCMD ist somit nicht mehr notwendig.

FRITZ!Box als TK-Anlage

Als Telefonanlage fungiert bei mir eine AVM FRITZ!Box 7490, daran angebunden sind ein IP/SIP-Telefon, zwei DECT-Telefone sowie ein altes analoges Telefon aus der Kommunikations-Steinzeit.

Um nun die Türklingel mit den Telefonen zu verknüpfen, sind zwei Brücken zu schlagen: Zuerst einmal muss die Türklingel an FHEM angebunden werden, damit FHEM überhaupt weitere Ereignisse auslösen kann. Auf die Details hierzu möchte ich an dieser Stelle nicht eingehen, als Hinweis seien die Stichworte Optokoppler und HM-PBI-4-FM genannt. In FHEM wird dabei ein Ereignis generiert, auf welches ich mit einem Notify reagieren kann.

Spannender (und einfacher) ist jedoch der zweite Schritt: Das Auslösen eines Telefonanrufs an der FRITZ!Box durch FHEM auf dem Raspberry Pi. Sowohl die FRITZ!Box als auch der Raspberry Pi hängen am lokalen Netzwerk, also sollte eine Kopplung rein durch Software machbar sein. Und tatsächlich bietet sich dieser Weg an: Die FRITZ!Box unterstützt IP/SIP-Telefone im LAN, und der Raspberry Pi kann mit geeigneter Software (einem SIP-Client) ein IP/SIP-Telefon simulieren, welches einen Anruf absetzt und nach kurzer Zeit wieder auflegt.

Der RasPi spielt Telefon – ein SIP-Client muss her!

SIP-Clients für Linux gibt es einige; allerdings sind viele für Software-Tests entwickelt, um Last zu simulieren und somit einen SIP Server zu testen. Wieder andere arbeiten nur registrierungslos oder verfügen über eine GUI, die als Softphone von einem Menschen zu bedienen ist. Nach langer Suche bin ich schließlich bei sipcmd gelandet, welches von der Liste der Optionen her geeignet scheint: Es kann sich mit Username und Password am Registrar (der FRITZ!Box) authentifizieren, Anrufe absetzen und nach vorgegebener Zeit auch wieder abbrechen.

Nach ersten Tests funktioniert fast alles – nur die Übermittlung des Anzeigenamens kann ich nicht realisieren. sipcmd verfügte laut eingebauter Hilfe zwar über die Option

-a  --alias         username alias

aber alle Versuche, damit etwas zu bewirken, scheitern. Ein Blick in den Quelltext (Open Source sei Dank!) löst das Rätsel schließlich: Der Parameter ist zwar im Hilfetext dokumentiert, aber ansonsten im Quelltext gar nicht implementiert! Also bleiben wieder zwei Optionen: Nach einem anderen SIP-Client suchen oder die vermisste Option im Quelltext hinzufügen. Nach kurzer Recherche in den Dokumentationen der verwendeten Bibliotheken stellt sich das als mit geringem Aufwand machbar heraus, und einige Zeit später funktioniert dann auch die Übermittlung des Anzeigenamens.

sipcmd installieren

Um die ganze Installation so einfach wie möglich zu gestalten, habe ich die nötigen Schritte in einem einfachen Bash-Script verpackt, das zuerst die benötigten Pakete mittels Aptitude nachinstalliert, dann den Quellcode aus GitHub herunterlädt, die schmerzlich vermisste Alias-Option hineinpatcht und schließlich sipcmd compiliert. Herunterzuladen und aufzurufen ist das Script als root auf dem Raspberry Pi wie folgt:

\curl -sSL http://tools.jens-bretschneider.de/setup-sipcmd.sh | bash

Danach steht das sipcmd-Binary im Ordner /opt/sipcmd zur Verfügung.

Wer keinen Raspberry nutzt oder sich das Script nur anschauen möchte, kann es auch einfach herunterladen.

IP-Telefon auf FRITZ!Box einrichten

Um sich an der FRITZ!Box anmelden zu können, ist es nun zu allererst notwendig, in der FRITZ!Box Benutzeroberfläche ein neues IP-Telefon einzurichten. Der genaue Menüpfad hängt vom verwendeten FRITZ!Box-Modell und -Firmware ab, in meinem Fall verläuft die Einrichtung wie folgt:

  • Telefonie → Telefoniegeräte → Neues Gerät einrichten
  • Telefon (mit und ohne Anrufbeantworter)Weiter
  • LAN/WLAN (IP-Telefon) → Internen Namen vergeben – nur zur Dokumentation  → Weiter
  • Registrar und Benutzername notieren – wird später benötigt! → ein (sicheres!) Kennwort vergeben → Weiter
  • Ausgehende Rufnummer wählen → Weiter
  • nur Anrufe für folgende Rufnummern annehmen wählen und alle Häkchen entfernen → Weiter
  • Übernehmen

FRITZ!Box IP-Telefon

Nach Abschluss der Einrichtung sollten einem nun Registrar, Benutzername und Kennwort bekannt sein. Diese Parameter sind später an sipcmd zu übergeben, damit ein Anruf initiiert werden kann.

Gruppenruf einrichten

Damit mehr als ein Telefon gleichzeitig klingelt, muss auf der FRITZ!Box noch ein Gruppenruf eingerichtet werden. Hierzu wird eine neue Kurzwahl in der FRITZ!Box Benutzeroberfläche erstellt, die dann die gewünschten Rufnummern der Nebenstellen (Einsehbar unter TelefonieTelefoniegeräte in der Spalte intern) ruft:

  • TelefonieTelefonbuchNeuer Eintrag
  • Beliebigen Namen vergeben
  • Unter Rufnummern im ersten Feld die Ziffernfolge **1#, gefolgt von den gewünschten internen Telefonnummern, ebenfalls durch # getrennt, eintragen, z.B.**1#2#610#611#620 – hier umfasst der Gruppenruf die Nebenstellen 2, 610, 611 und 620
  • Im Feld Kurzwahl die gewünschte Kurzwahl, z.B. 01, eintragen

FRITZ!Box Gruppenruf

Wird nun die Kurzwahl angewählt (in diesem Beispiel mit **701), klingeln alle hinterlegten internen Rufnummern gleichzeitig. sipcmd wird später diese Kurzwahl der Rufgruppe anwählen und nicht die einzelnen Nebenstellen, um einen Gruppenruf auszulösen.

Der erste Test

Nun wird es Zeit, die Installation (noch ohne FHEM!) zu testen:

Zuerst lösen wir einen Anruf an ein einzelnes Telefon mit der Nummer Nst aus, welches 15 Sekunden klingeln und dann wieder verstummen sollte. Verfügt es über ein alphanumerisches Display, wird es den Text „Türklingel“ anzeigen:

/opt/sipcmd/sipcmd -P sip -u Benutzername -c Kennwort -a Türklingel -w Registrar -x 'c**Nst;w10000;h'

In meinem Fall sieht das ganze wie folgt aus (als Registrar nur eine IPv4-Adresse verwenden, keinen Hostnamen!):

/opt/sipcmd/sipcmd -P sip -u 622 -c GeHeImEsPaSsWoRt -a Türklingel -w 192.168.178.1 -x 'c**1;w10000;h'

Was genau passiert, ist im letzten Abschnitt des Befehls festgelegt. Im Detail bedeutet die Zeichenfolge, deren einzelne Bestandteile durch jeweils ein Semikolon getrennt sind:

c**1: Rufnummer **1, also den Fon1-Anschluss der FRITZ!Box, anrufen (Call)
w10000: Warte 10.000 Millisekunden, dies entspricht 10 Sekunden oder 2 Rufzeichen (Wait)
h: Auflegen (Hangup)

Wenn bis hierhin alles OK ist, können wir den Test mit der zuvor erstellten Rufgruppe wiederholen. In meinem Beispiel hat die Rufgruppe die Rufnummer **701:

/opt/sipcmd/sipcmd -P sip -u 622 -c GeHeImEsPaSsWoRt -a Türklingel -w 192.168.178.1 -x 'c**701;w10000;h

Wenn nun alle in der Rufgruppe genannten Nebenstellen klingeln, ist sipcmd nun einsatzbereit.

 Aufruf durch FHEM

Nun bleibt noch die Einbindung in FHEM. Hierzu definieren wir einfach ein Notify-Objekt, das beim gewünschten Ereignis ausgelöst wird und dann sipcmd aufruft (die doppelten Semikolons sind kein Fehler, sondern notwendig!):

define Name notify Ereignis "/opt/sipcmd/sipcmd -P sip -u Benutzername -c Kennwort -a Türklingel -w Registrar -x 'c**Nst;;w10000;;h'"

In meiner Installation sieht dies ähnlich folgender Definition aus:

define wf_nf_tuerklingel notify wf_wt_tuerspr_klingel "/opt/sipcmd/sipcmd -P sip -u 622 -c GeHeImEsPaSsWoRt -a Türklingel -w 192.168.178.1 -x 'c**701;;w10000;;h'"

Das war’s schon! 🙂

Kein Licht ohne Schatten!

Während meiner Tests bin ich über einige kleinere oder größere Probleme gestolpert, die ich noch nicht gelöst habe – allerdings habe ich auch noch nicht viel Zeit darin investiert…

  • Hohe Latenz
    Es dauert relativ lange, bis nach Auslösen eines Ereignisses die Telefone wirklich zu klingeln beginnen (in meinen Versuchen bis zu 10 Sekunden). Der direkte sipcmd-Aufruf auf der Kommandozeile ist deutlich schneller (ca. 3 Sekunden). Die Trägheit von FHEM zusammen mit der „Performance“ des Raspberry Pi sind hier offenbar der limitierende Faktor.
  • Maximale Rufdauer 10 Sekunden
    Egal welchen Wert ich verwende, die Rufdauer liegt bei mir immer bei 10 Sekunden. Eventuell greift der w-Parameter erst nach erfolgreichem Verbindungsaufbau – die Dokumentation schweigt sich dazu aus.

 

106 Gedanken zu „FHEM ruft FRITZ!Box

  1. Hallo,
    nachdem ich die modifizierte Version (mit Displayanzeige) schon seit einem Jahr gerne benutze, habe ich jetzt mal den RasPi neu aufgesetzt. Leider gelingt es mir jetzt nicht mehr, die Installations-Bash fehlerfrei zu starten.
    Ich starte in der Console ’sudo su‘ und bin damit ja root. Wenn ich dann das Script mit ‚\curl -sSL http://tools.jens-bretschneider.de/setup-sipcmd.sh | bash‘ aufrufe, bekomme ich folgende Fehlermeldungen:

    Klone nach ’sipcmd‘ …
    remote: Enumerating objects: 121, done.
    remote: Total 121 (delta 0), reused 0 (delta 0), pack-reused 121
    Empfange Objekte: 100% (121/121), 614.02 KiB | 855.00 KiB/s, Fertig.
    Löse Unterschiede auf: 100% (52/52), Fertig.
    patching file /opt/sipcmd/src/main.cpp
    Hunk #2 FAILED at 365.
    1 out of 2 hunks FAILED — saving rejects to file /opt/sipcmd/src/main.cpp.rej
    g++ -c -Wall src/main.cpp -o src/main.o -I/usr/include/opal -I/usr/include/ptlib -Isrc/
    In file included from /usr/include/opal/h323/h323.h:39:0,
    from src/includes.h:25,
    from src/main.h:24,
    from src/main.cpp:24:
    /usr/include/opal/h323/h323ep.h:148:30: warning: converting to non-pointer type ‘unsigned int’ from NULL [-Wconversion-null]
    unsigned int options = NULL, ///< options to pass to conneciton
    ^~~~
    src/main.cpp: In member function ‘bool Manager::SendDTMF(const PString&)’:
    src/main.cpp:447:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (; i < dtmf.GetSize() – 1; i++) {
    ~~^~~~~~~~~~~~~~~~~~~~
    src/main.cpp:460:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    ok = (i == dtmf.GetSize() – 1 ? true : false);
    ~~^~~~~~~~~~~~~~~~~~~~~
    g++ -c -Wall src/commands.cpp -o src/commands.o -I/usr/include/opal -I/usr/include/ptlib -Isrc/
    In file included from /usr/include/opal/h323/h323.h:39:0,
    from src/includes.h:25,
    from src/main.h:24,
    from src/state.h:25,
    from src/commands.cpp:29:
    /usr/include/opal/h323/h323ep.h:148:30: warning: converting to non-pointer type ‘unsigned int’ from NULL [-Wconversion-null]
    unsigned int options = NULL, ///< options to pass to conneciton
    ^~~~
    g++ -c -Wall src/channels.cpp -o src/channels.o -I/usr/include/opal -I/usr/include/ptlib -Isrc/
    In file included from /usr/include/opal/h323/h323.h:39:0,
    from src/includes.h:25,
    from src/channels.h:25,
    from src/channels.cpp:27:
    /usr/include/opal/h323/h323ep.h:148:30: warning: converting to non-pointer type ‘unsigned int’ from NULL [-Wconversion-null]
    unsigned int options = NULL, ///< options to pass to conneciton
    ^~~~
    g++ src/main.o src/commands.o src/channels.o -o sipcmd -lopal -lpt

    Leider kenne ich mich mit Linux noch nicht wirklich gut aus und brauche deswegen etwas Hilfe.

    LG
    HermannDerUser

    • Hmmm… da scheint beim Patchen was schief zu gehen. Ich kann hieraus aber nicht ableiten, woran es scheitert. Die letzte Änderung im Repo ist mehr als 3 Jahre alt, „eigentlich“ sollte sich also nichts verändert haben. Leider habe ich gerade keinen Raspi zur Hand, um es nachzustellen, sorry.

  2. Kann es sein, dass mit neuerern FB-Firmware-Versionen das sipcmd nicht mehr geht? SIP-Accounts müssen jetzt länger sein als 3 Zeichen. Ich bekomme folgende Ausgabe:

    # ./sipcmd -P sip -u iptel621 -c iptel621pass -w 192.168.201.254 -o sip.log -x „c**009“
    Starting sipcmd
    Manager
    Init
    initialising SIP endpoint…
    TestChanAudio
    TestChanAudio
    Listening for SIP signalling on 0.0.0.0:5060
    SIP listener up
    registered as sip:iptel621@192.168.201.254
    Created LocalEndPoint
    Main
    ## Call ##
    TestPhone::Main: calling „**009“ using gateway „192.168.201.254“ at Wed Aug 22 12:29:04 2018

    Setting up a call to: sip:**009@192.168.201.254
    LocalEndpoint::MakeConnection
    LocalEndpointCreateConnection
    LocalConnection
    OnIncomingConnection: token=L4c635cf02
    Call setup to sip:**009@192.168.201.254 failed
    Problem running command sequence („c**009“):

    TestPhone::Main: shutting down
    OnReleased: reason: EndedByNoAccept
    OnReleased: reason: EndedByTransportFail
    OnClearedCall
    ~LocalConnection
    TestPhone::Main: exiting…
    Exiting…
    ~Manager

    • Mit der letzten 6er Firmware hat es auf jeden Fall noch funktioniert, mit der 7er habe ich es noch nicht getestet. Mit welcher Box und Firmware scheiterst du denn?

  3. Hallo

    klasse Beispiel, hat auf meinem Raspberry mit iobroker und Node-Red sofort funktioniert.
    Das w-Kommando hat glaub ich eh nichts zu sagen hier. So wie ich die doku von sipcmd verstehen ist das ein Wait NACHDEM die Media Verbindung aufgebaut, also nachdem abgehoben wurde.
    Das sipcmd klingelt bis jemand abnimmt .
    Siehe auch dazu.
    https://github.com/tmakkonen/sipcmd/issues/12

    Das Setting in state.h
    #define DIAL_TIMEOUT 10
    scheint vielleicht deshalb nicht zu gehen, weil der sipcmd mangels media speicherort abstützt.

    /opt/sipcmd/sipcmd -P sip -u 622 -c stef42 -a Klingel -w fritz.box -x ‚c**701;w5000;h‘
    Starting sipcmd
    Manager
    Init
    initialising SIP endpoint…
    Listening for SIP signalling on 0.0.0.0:TestChanAudio
    TestChanAudio
    5060
    SIP listener up
    registered as sip:622@fritz.box
    Created LocalEndPoint
    Main
    ## Call ##
    TestPhone::Main: calling „**701“ using gateway „fritz.box“ at Fri May 19 14:39:22 2017

    Setting up a call to: sip:**701@fritz.box
    LocalEndpoint::MakeConnection
    LocalEndpointCreateConnection
    LocalConnection
    OnIncomingConnection: token=L5a548e582
    connection set up to sip:**701@fritz.box
    TestPhone::Main: calling „sip:**701@fritz.box“ for 0
    TestPhone::Main: calling „sip:**701@fritz.box“ for 1
    TestPhone::Main: calling „sip:**701@fritz.box“ for 1
    OnOpenMediaStream
    recording media from sip
    CreateMediaStream
    TestChannel[ Call[Ca8c6ba961]-EP[L5a548e582] – 0x6de20a98 ]
    OnOpenMediaStream
    streaming media to local
    TestChannel::Write
    Speicherzugriffsfehler

    • Schau‘ mal bitte in den Kommentaren, ich habe da schon eine Version des Scripts verlinkt, die einen Fix für den Speicherzugriffsfehler enthält, damit kann man dann aber laut Feedback keine Medien mehr abspielen. Ich habe leider keine Ahnung von C und Linux und kann das weder fixen noch den Fix bewerten.

  4. Hallo,
    coole Idee. Leider passiert bei mir kein Anruf.

    Hier dazu der Log von der Console:

    ———————————
    ./sipcmd -P sip -u 628 -c xyz -w 192.168.0.1 -x ‚c**31w10000‘
    Starting sipcmd
    Manager
    Init
    initialising SIP endpoint…
    Listening for SIP signalling on 0.0.0.0:TestChanAudio
    TestChanAudio
    5060
    SIP listener up
    registered as sip:628@192.168.0.1
    Created LocalEndPoint
    Main
    ## Call ##
    TestPhone::Main: calling „**31w10000“ using gateway „192.168.0.1“ at Thu Feb 16 19:37:54 2017

    Setting up a call to: sip:**31w10000@192.168.0.1
    LocalEndpoint::MakeConnection
    LocalEndpointCreateConnection
    LocalConnection
    OnIncomingConnection: token=L6a8e5bed2
    connection set up to sip:**31w10000@192.168.0.1
    TestPhone::Main: calling „sip:**31w10000@192.168.0.1“ for 1
    TestPhone::Main: calling „sip:**31w10000@192.168.0.1“ for 1
    OnOpenMediaStream
    recording media from sip
    CreateMediaStream
    TestChannel[ Call[Cea4ef0eb1]-EP[L6a8e5bed2] – 0x6de234a0 ]
    OnOpenMediaStream
    streaming media to local
    TestChannel::Write
    Speicherzugriffsfehler

    —–
    Hat da jemand eine Ahnung?

    Gibt es eine Möglichkiet auf der virtuellen Nebenstelle auch einen Anruf anzunehmen/angezeigt zu bekommen? Unser Türklingelanlage (Auerswald) spricht mit der Fritzbox.

    Grüße und Danke

    • Die Frage mit der virtuellen Nebenstelle verstehe ich leider nicht – was meinst du damit?

      Ansonsten habe ich mal testweise die Patches für den Segmentation Fault Fehler sowie für die Kompatibilität zu FRITZ!OS 6.80, die hier in den Kommentaren erwähnt wurden (vielen Dank an die Autoren!!), integriert.

      Wer mag, testet bitte mal folgendes alternatives Script:

      \curl -sSL http://tools.jens-bretschneider.de/setup-sipcmd2.sh | bash

      und füge

      -m "G.711"

      in den sipcmd-Aufruf ein.

      Funktioniert das?

      • Habe das Problem auch. Mit dem Patch und Option -m „G.711*“ (nur „G.711“ funktioniert nicht) wählt sipcmd zumindest wieder, legt aber nach dem Abheben der Gegenstelle sofort auf. :/

          • Hast du wirklich das neue Script mit der 2 im Namen getestet, wie im Link angegeben? Ich habe es gestern komplett mit meiner F!Box nachgestellt und der Ruf wurde wie gewünscht signalisiert.

          • Ja. 🙂
            Signalisiert wird ja. Es klingelt an der Gegenstelle, aber sobald diese abhebt, legt sipcmd auf. Ich will aber noch eine Ansage abspielen…

      • Hi,

        thx, werde das mal ausprobieren. Mit dem IP-Telefon unter sipcmd (z.B. **626) kann ich ja hoffentlich bald anrufen. Jetzt meine FRage, ob ich meiner Türsprechanlagegruppe auch die **626 zufügen kann und ich das in FHEM/sipcmd irgendwie mitbekomme. Hoffe, dass ich es jetzt besser erklärt habe. 🙂

  5. Hallo,
    ich habe seit 2 Tagen die Fritzbox 7490. Vorher konnte ich mit der alten Box über Telnet ein Klingeln auslösen. Jetzt bin ich auf diesen Beitrag gekommen, der wirklich toll gemacht ist.
    Allerdings klappt es nicht 😀
    Installation hat funktioniert und so wie ich das sehe wählt er auch. Das Telefon klingelt jedoch nicht. Jemand eine Idee woran es liegen könnte?
    Das Telefon (**2) ist korrekt.

    #######
    Starting sipcmd
    Manager
    Init
    initialising SIP endpoint…
    Listening for SIP signalling on 0.0.0.0:TestChanAudio
    TestChanAudio
    5060
    SIP listener up
    registered as sip:620@192.168.178.1
    Created LocalEndPoint
    Main
    ## Call ##
    TestPhone::Main: calling „**2“ using gateway „192.168.178.1“ at Sat Jan 28 09:25:06 2017

    Setting up a call to: sip**2@192.168.178.1
    LocalEndpoint::MakeConnection
    LocalEndpointCreateConnection
    LocalConnection
    OnIncomingConnection: token=L04340d1d2
    connection set up to sip:**2@192.168.178.1
    OnReleased: reason: EndedByQ931Cause
    OnReleased: reason: EndedByQ931Cause
    OnClearedCall
    TestPhone::Main: calling „sip:**2@192.168.178.1“ for 1
    ….. usw.

    Ich versuche die ganze Zeit schon etwas hilfreiches zu „EndedByQ931Cause“ zu finden.
    Vielleicht kann mir ja jemand helfen.

  6. Hallo Jens,

    wie löst du denn den notify in fhem aus? Da ich auf dem Gebiet neu bin, ist mir das nicht ganz klar. Ich habe an der Klingel ein Relaise, was mir die 3,3v von Pin 1 auf den GPIO17 durchschaltet. Ich habe aber Schwierigkeiten damit, das notify auszulösen. Das geht leider nicht bei dir hervor. In der Referenz fhem unter RPI_GPIO wird ja hauptsächlich nur das schalten der GPIO’s erklärt.

    Mfg
    Lars

    • Ich verwende die GPIOs nicht, sondern den im Artikel genannten Homematic Funk-Sensor, der über einen Optokoppler getriggert wird.

      Mittlerweile signalisiere ich auch generell die Türklingel nicht mehr über die FRITZ!Box an den Telefonen, so dass ich dir hier leider nicht weiterhelfen kann.

  7. Bekomme nach Durchlaufen des Scripts folgende Meldungen:

    bash: line 10: git: command not found
    bash: line 13: /opt/sipcmd/src/alias.patch: No such file or directory
    bash: line 36: /opt/sipcmd/src/alias.patch: No such file or directory
    sed: can’t read /opt/sipcmd/Makefile: No such file or directory
    bash: line 42: cd: /opt/sipcmd: No such file or directory
    make: *** No targets specified and no makefile found. Stop.

  8. Hi und Danke für die tolle Anleitung.

    Bei mir funktioniert alles.

    Aber wie kann ich jetzt einen eigenen Klingelton zuweisen?.

    Ich rufe an mit

    /opt/sipcmd/sipcmd -P sip -u 621 -c XXXXXXX -a Haustür -w 192.168.178.1 -x ‚c**610;w2000;h‘

    621 ist auch gleichzeitig die interne Durchwahl des neuen IP-Gerätes. also Habe ich die **621 ins Telefonbuch abgelegt und einen separaten Klingelton zugewiesen.
    Bei Anruf ertönt aber nur der generelle Klingelton.

    Besten Dank und beste Grüße

    Ole

    • Versuch’s mal nur mit 621 statt **621 im Telefonbuch. Ist aber geraten, ich kann’s grad selbst nicht ausprobieren, da ich das selbst nicht mehr im Einsatz habe.

      • Danke für den Tipp. …Werde es testen wenn ich mein anderes Problem gelöst hat: meine kse liefert nicht zuverlässig das on Signal. Manchmal beim klingeln auch nur gleich das off. 🙁

        Was hast du momentan im Einsatz wen man fragen darf?

        • Nichts dergleichen. Ich sende mir eine Push Benachrichtigung auf’s Handy, wenn jemand an der Tür klingelt. Ist leider auch nicht perfekt, weil teilweise stark verzögert.

  9. Hier mal eine reine Python Lösung für Raspberry ohne FHEM.
    Hardware: Beide Drähte von der Klingel (die Klingel kann angeschlossen bleiben) zu einem Kleinrelais (Schließer) mit einer zum Klingeltrafo passenden Spannung führen. Viele Relais haben eine Seite der Spule mit „+“ markiert. Auf dieser Seite wird eine Diode vorgeschaltet in Durchlassrichtung. Der andere Draht geht direkt an die andere Spuhlenseite. Dadurch wird der Strom gleichgerichtet. Nun noch einen kleinen Elko parallel zur Spule, um den Strom zu glätten, damit das Relais nicht brummt. Von den Schaltkontakten wird einer auf einen GND-Pin der GPIO gelegt, der andere auf z.B. GPIO 18.

    Die Klingeldauer kann im Python-Programm angepasst werden, aber nur, wenn man in der state.h den “#define DIAL_TIMEOUT 10″ auf einen HÖHEREN Wert einstellt, als man braucht. anschließend noch neu compilieren. Steht im Thread, wie das geht.

    Unter /etc einen Ordner Klingel anlegen. Damit das unten stehende Python Programm automatisch beim Booten startet die Datei /etc/rc.local so anpassen, das „sudo python /etc/Klingel/klingel.py &“ vor dem exit 0 steht.
    Dann noch den unten stehenden Code in eine Datei /etc/Klingel/klingel.py.
    abgangsnummer,passwort,anzeige,ipfritzbox,zielnummer,dauer anpassen!
    Rebooten. Fertig

    Hoffe der Code bleibt einigermaßen lesbar. Hier gibt es leider keine Möglichkeit formatierten Code einzufügen:

    import os,time
    import RPi.GPIO as GPIO

    def anruf(abgangsnummer,passwort,anzeige,ipfritzbox,zielnummer,dauer):
    try:
    command = „/opt/sipcmd/sipcmd -P sip -u “ + abgangsnummer
    command = command + “ -c “ + passwort
    command = command + “ -a “ + anzeige
    command = command + “ -w “ + ipfritzbox
    command = command + “ -x \’c“ + zielnummer + „\‘ &“
    os.system(command)
    time.sleep(dauer + 2)
    os.system(„sudo killall sipcmd“)
    time.sleep(2)
    os.system(„sudo pkill -9 sipcmd“)
    except:
    pass

    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(18, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    abgangsnummer = „623“
    passwort = „geheim“
    anzeige = „Klingel“
    ipfritzbox = „172.16.0.1“
    zielnummer = „**705“
    dauer = 5
    while 1:
    if GPIO.input(18) == GPIO.LOW:
    anruf(abgangsnummer,passwort,anzeige,ipfritzbox,zielnummer,dauer)
    time.sleep(0.1)

  10. Hallo,
    ich habe es erfolgreich geschafft, meine Klingelanlage mit dem Raspberry so einzurichten, dass das Handy klingelt, wenn jemand die Klingeltaste drückt. Ich habe das mit Python gelöst. Was stört, ist die kurze Klingeldauer, bedingt durch den Bug im Quellcode. In der state.h Datei habe ich folgende Änderung vorgenommen:

    #define DIAL_TIMEOUT 20

    Meine Frage als nicht C-Mensch ist nun, wie genau kann ich das neu kompilieren.
    Evtl. kann ja ein Wissender Hilfestellung geben.

    • Hallo Ostfriese
      Ich habe das gleiche Problem, ich kann einstellen was ich will und es klingelt nur drei mal.
      Habe dann wie du den Wert von
      #define DIAL_TIMEOUT von 10 auf 20 gesetzt
      einen #make clean und danach einen #make gestartet.
      Lief ohne Probleme durch, leider hat es mein Problem nicht gelöst, klingelt immer noch nur 3 mal.
      Für eine Idee woran das noch liegen kann wäre ich sehr dankbar.

      Grüße

      • Versuche mal folgendes: (natürlich auf deine Werte anpassen!)

        Bash
        /opt/sipcmd/sipcmd -P sip -u 623 -c Passwort -a Klingel -w 172.16.0.1 -x ‚c**705‘ &

  11. Bekomme mehrere Fehlermeldungen – mit sudo curl…
    E: Could not open lock file /var/lib/dpkg/lock – open (13: Permission denied)
    E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
    fatal: could not create work tree dir ’sipcmd‘.: Permission denied
    bash: line 13: /opt/sipcmd/src/alias.patch: No such file or directory
    bash: line 36: /opt/sipcmd/src/alias.patch: No such file or directory
    sed: can’t read /opt/sipcmd/Makefile: No such file or directory
    bash: line 42: cd: /opt/sipcmd: No such file or directory
    make: *** No targets specified and no makefile found. Stop.
    Wenn ich das Script einzeln bearbeite und den Patch weglasse fehlt zum mkae die ptlib.h
    Jemand eine Idee?
    Raspberry 3 mit Linux 8/jessie

  12. Hallo!
    Also Ruf nach extern funktioniert, aber das mit der Audio Datei haut nicht hin.
    Laut Doku soll es z. B. wie folgt gehen:
    /opt/sipcmd/sipcmd -P sip -u 620 -c mypwd -w 192.168.3.1 -x „cmy_dest_number;ws500;v/home/pi/test16.wav;h“
    Es ist nach Aufbau der Verbindung leider nichts zu hören.
    Die Datei ist PCM codiert mit 8000 Hz Samplerate, 16Bit mono.
    Hat jemand eine Idee, ob die Audio Datei in einem bestimmten Verzeichnis stehen muss?. Leider gibt das OPAL-Log auch keinerlei verständliche Hinweise auf irgend einen Fehler.
    Vielleicht muss für die Audio Option noch ne Lib dazugebunden werden, keine Ahnung?

  13. Hallo!
    Also recht vielen Dank für die SIP Lösung. Funktioniert auf Anhieb, jedoch möchte ich statt FB internen Ruf eine Verbindung zu einem Handy aufbauen und statt „Es klingelt an der Tür“ soll sowas wie Wasseralarm oder Einbruch aus fhem (auf RPI) heraus abgesetzt werden. Kann man das SIP-Modul dazu überreden?

    • Ein Ruf nach Extern sollte genauso funktionieren, aber eine entsprechende Displayanzeige für den Anruf bekommt man nicht hin. Du könntest das entweder mit einer Audiodatei realisieren, die du beim Abheben abspielst, was ich noch nie realisiert habe, oder dann doch lieber eine Notification an das Handy senden. Bei Android z.B. über das FHEM gcmsend Modul. Das verwende ich, um mich von FHEM auf dem Smartphone informieren zu lassen.

      • Könnte mal jemand das vollständige Skript zu diesem Projekt bereitstellen? Für mich wäre weiterhin die Info wichtig, ob es möglich ist, zwei Klingeln parallel abzugreifen und somit auch zwei Telefone klingeln zu lassen. Vielen Dank!

  14. Hallo Jens,

    auf der Suche nach einer telefonischen Benachrichtigung vom RasPi bin ich auf deinen Beitrag gestoßen und fand ihn sehr gut. Leider kenne ich mich mit Linux / RasPi noch nicht so gut aus und habe beim Abarbeiten deiner Anleitung etwas Probleme. Zuerst hakte es beim Installieren von sipcmd. Fehler:
    bash: Zeile 4: aptitude: Kommando nicht gefunden.
    Ich habe daraufhin die Installation der benötigten Pakete mit:
    apt-get install libopal-dev libpt-dev
    vorgenommen und dann nochmal
    \curl -sSL http://tools.jens-bretschneider.de/setup-sipcmd.sh | bash
    ausgeführt. Dabei erhielt ich folgende Ausgabe:

    Cloning into ’sipcmd’…
    remote: Counting objects: 111, done.
    remote: Total 111 (delta 0), reused 0 (delta 0), pack-reused 111
    Receiving objects: 100% (111/111), 611.75 KiB | 552 KiB/s, done.
    Resolving deltas: 100% (47/47), done.
    patching file /opt/sipcmd/src/main.cpp
    g++ -c -Wall src/main.cpp -o src/main.o -I/usr/include/opal -I/usr/include/ptlib -Isrc/
    src/main.cpp: In member function ‘virtual void TestProcess::Main()’:
    src/main.cpp:180:42: warning: statement has no effect [-Wunused-value]
    src/main.cpp: In member function ‘bool Manager::SendDTMF(const PString&)’:
    src/main.cpp:449:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    src/main.cpp:462:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    g++ -c -Wall src/commands.cpp -o src/commands.o -I/usr/include/opal -I/usr/include/ptlib -Isrc/
    g++ -c -Wall src/channels.cpp -o src/channels.o -I/usr/include/opal -I/usr/include/ptlib -Isrc/
    g++ src/main.o src/commands.o src/channels.o -o sipcmd -lopal -lpt

    Trotz der Warnungen habe ich dann folgende Zeile ausgeführt
    /opt/sipcmd/sipcmd -P sip -u 621 -c MeinPasswort -a Türklingel -w 192.168.178.1 -x ‚c**51;w10000;h‘

    Die Ausgabe lautete dann (ohne das das Telefon geklingelt hätte)
    Starting sipcmd
    Manager
    Init
    initialising SIP endpoint…
    Listening for SIP signalling on 0.0.0.0:TestChanAudio
    TestChanAudio
    5060
    SIP listener up
    registered as sip:621@192.168.178.1
    Created LocalEndPoint
    Main
    ## Call ##
    TestPhone::Main: calling „**51“ using gateway „192.168.178.1“ at Thu Feb 4 22:16:00 2016

    Setting up a call to: sip:**51@192.168.178.1
    LocalEndpoint::MakeConnection
    LocalEndpointCreateConnection
    LocalConnection
    OnIncomingConnection: token=L632e98f42
    connection set up to sip:**51@192.168.178.1
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 1
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 1
    OnOpenMediaStream
    recording media from sip
    CreateMediaStream
    TestChannel[ Call[Ce681e5b71]-EP[L632e98f42] – 0xfd9bc8 ]
    OnOpenMediaStream
    streaming media to local
    TestChannel::Write
    TestChannel::Write
    CreateMediaStream
    TestChannel[ Call[Ce681e5b71]-EP[L632e98f42] – 0xff3ca0 ]
    OnOpenMediaStream
    recording media from local
    OnOpenMediaStream
    streaming media to sip
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 1
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 2
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 3
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 4
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 4
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 4
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 4
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 4
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 4
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 4
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 4
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 4
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 5
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 6
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 7
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 8
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 9
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestPhone::Main: calling „sip:**51@192.168.178.1“ for 10
    TestChannel::Write
    TestChannel::Write
    TestChannel::Write
    Problem running command sequence („c**51;w10000;h“):
    Call: Dial timed out
    TestPhone::Main: shutting down
    Close [ Call[Ce681e5b71]-EP[L632e98f42] – 0xfd9bc8 ]
    TestChanAudio::CloseChannel
    StopAudioPlayback
    StopAudioRecording
    OnClosedMediaStream
    OnClosedMediaStream
    Close [ Call[Ce681e5b71]-EP[L632e98f42] – 0xff3ca0 ]
    TestChanAudio::CloseChannel
    StopAudioPlayback
    StopAudioRecording
    OnClosedMediaStream
    OnClosedMediaStream
    OnReleased: reason: EndedByLocalUser
    OnReleased: reason: EndedByLocalUser
    OnClearedCall
    ~LocalConnection
    TestPhone::Main: exiting…
    Exiting…
    ~Manager

    Leider kann ich mit den Ausgaben überhaupt nichts anfangen und hoffe deshalb auf Hilfe.

    HermannDerUser

      • Ups….

        eigentlich war wirklich das ISDN Telefon gedacht (steht nämlich direkt neben mir auf dem Schreibtisch). Ich habe aber gerade getestet ob das Telefon wirklich klingelt wenn ich es von einer anderen Nebenstelle anwähle, macht es aber komischerweise nicht. Deshalb habe ich jetzt mal mit **611 ein DECT Telefon probiert, und es funktioniert ! 🙂

        Mich hatte nur die Ausgabe
        Problem running command sequence („c**51;w10000;h“):
        irritiert. Die Meldung kommt bei **611 aber auch weiterhin, aber immerhin funktioniert es. SUPER

        • Es könnte sein, dass das ISDN Telefon nicht klingelt, weil es die MSN **51 bzw. 51 nicht kennt. Manche ISDN Telefone klingeln per default bei Ruf auf allen Zielnummern, manche nur auf die einprogrammierten (z.B. alte Hagenuk ISDN Telefone).

          • jo, bei meinem Olympia Telefon musste ich noch die 51 als MSN einstellen. Jetzt klingelt es auch.
            Trotzdem taucht weiterhin in der Ausgabe
            Problem running command sequence (“c**51;w10000;h”):
            auf. Gibt es inzwischen eine Lösung, wie man die Klingelzeit wirklich ändern kann. Das Ändern von w10000 macht auch bei mir keinen Unterschied.

          • Warum er „problem running..“ meldet, kann ich nicht sagen, aber ich denke, das liegt daran, dass der Ruf nicht beantwortet wird. Ich würde das ignorieren.

            Wegen der Klingelzeit schaue bitte mal weiter unten in den Kommentaren, das hat schon jemand herausgefunden, wie man das ändert. Offenbar musst du dazu aber sipcmd neu compilieren.

          • danke für die Antworten.
            Ich habe mir die anderen Beträge angesehen aber das mit dem selber compilieren ist im Moment noch etwas zu hoch für mich 😉

            Zur Zeit lebe ich erstmal mit den vorhandenen Möglichkeiten.

            Vielen Dank nochmal für die Hilfe
            HermannDerUser

  15. Hallo Jens,

    auch von mir ein herzliches Dankeschön für Deine Anleitung, die leicht verständlich und gut aufgebaut ist.
    Und doch habe ich ein Problem: ;(
    Wenn ich den Befehl „\curl -sSL http://tools.jens-bretschneider.de/setup-sipcmd.sh | bash“ erhalte ich eine Fehlermeldung.

    [code]
    pi@raspberrypi ~ $ \curl -sSL http://tools.jens-bretschneider.de/setup-sipcmd.sh | bash
    E: Sperrdatei /var/lib/dpkg/lock konnte nicht ge▒ffnet werden. – open (13: Keine Berechtigung)
    E: Sperren des Administrationsverzeichnisses (/var/lib/dpkg/) nicht m▒glich, sind Sie root?
    fatal: could not create work tree dir ’sipcmd‘.: Keine Berechtigung
    bash: Zeile 13: /opt/sipcmd/src/alias.patch: Datei oder Verzeichnis nicht gefunden
    bash: Zeile 36: /opt/sipcmd/src/alias.patch: Datei oder Verzeichnis nicht gefunden
    sed: kann /opt/sipcmd/Makefile nicht lesen: Datei oder Verzeichnis nicht gefunden
    bash: Zeile 42: cd: /opt/sipcmd: Datei oder Verzeichnis nicht gefunden
    make: *** Keine Targets angegeben und keine ▒make▒-Steuerdatei gefunden. Schluss.“
    [/code]

    Ok. Pi ist kein root, also es mal „sudo \curl -sSL http://tools.jens-bretschneider.de/setup-sipcmd.sh | bash“ versucht.
    Nun antwortet mein RasPi:

    [code]
    E: Sperrdatei /var/lib/dpkg/lock konnte nicht ge▒ffnet werden. – open (13: Keine Berechtigung)
    E: Sperren des Administrationsverzeichnisses (/var/lib/dpkg/) nicht m▒glich, sind Sie root?
    fatal: could not create work tree dir ’sipcmd‘.: Keine Berechtigung
    bash: Zeile 13: /opt/sipcmd/src/alias.patch: Datei oder Verzeichnis nicht gefunden
    bash: Zeile 36: /opt/sipcmd/src/alias.patch: Datei oder Verzeichnis nicht gefunden
    sed: kann /opt/sipcmd/Makefile nicht lesen: Datei oder Verzeichnis nicht gefunden
    bash: Zeile 42: cd: /opt/sipcmd: Datei oder Verzeichnis nicht gefunden
    make: *** Keine Targets angegeben und keine ▒make▒-Steuerdatei gefunden. Schluss.
    [/code]

    Hmmm.
    Die SD-Karte sollte Platz haben. Habe erst nach Weihnachten von 4 auf 32 GB umgesattelt.

    Hast Du, oder jemand anderes, eine Lösung für einen DAU?

    Vielen Dank

    Martin

  16. Hallo Jens, dein Patch bezüglich dem alias gefällt mir ganz gut.
    Ich habe selbst noch 2 Sachen gefunden die uns vielleicht bei dem Problem delay und 10sek call weiterhelfen können. Ich stelle mich aber zu blöd an die main.cpp entsprechend zu patchen, bei mir kommen dann bei compilen error.

    Zum delay: main.cpp line266-270 versuchen die 2000ms zu verkleinern

    Zum 10s Call: main.cpp line356 –>sipep->SetRetryTimeouts(500, 30000); ändern

    Gruß Andre

    • so nachdem ich jetzt hin und her getestet habe konnte ich letztendlich alles so hinbasteln wie gewünscht. Der delay mit 500ms läuft auf meiner Fritzbox super und die Calllänge wie gesagt in der state.h angepasst ist jetzt auch ok.
      Vielleicht kannst du das in deinem script noch anpassen.
      Gruß Andre

  17. Guten Morgen,

    danke für die Anleitung. Ich habe versucht den Türklingelruf per SIPCMD (siehe oben) umzusetzen. Leider klingeln die Telefone bei mir dauernd und hören nicht nach der entsprechenden Zeit auf :-(.

    Falls andere dasselbe Problem haben, oder Jens den Fix mit in sein Script zur Installation einbauen möchte könnt ihre der weiteren Diskussion unter dem folgenden Link folgen: http://www.forum-raspberrypi.de/Thread-pi-fritz-telefonklingeln?pid=194679#pid194679

  18. Hallo,

    ich versuche auch gerade, meine Türklingel per DECT-Telefon an meiner Fritz!Box per folgendem Kommando zu signalisieren:
    [code]/opt/sipcmd/sipcmd -P sip -u 621 -c MeinPasswort -a Türklingel -w 192.168.178.1 -x „c**611;w3000;h“[/code]

    Das gewählte Telefon klingelt auch, aber es hört nicht von allein auf 🙁

    Ich habe es mit einfachen und doppelten Anführungszeichen probiert, daran liegt es nicht.

    Hier die Bildschirmausgabe:
    [code]
    root@raspberrypi:~# /opt/sipcmd/sipcmd -P sip -u 621 -c MeinPasswort -a Türklingel -w 192.168.178.1 -x „c**611;w3000;h“
    Starting sipcmd
    Manager
    Init
    initialising SIP endpoint…
    Listening for SIP signalling on 0.0.0.0:TestChanAudio
    TestChanAudio
    5060
    SIP listener up
    registered as sip:621@192.168.178.1
    Created LocalEndPoint
    Main
    ## Call ##
    TestPhone::Main: calling „**611“ using gateway „192.168.178.1“ at Sun Jan 3 00:24:26 2016

    Setting up a call to: sip:**611@192.168.178.1
    LocalEndpoint::MakeConnection
    LocalEndpointCreateConnection
    LocalConnection
    OnIncomingConnection: token=L22e3d9bf2
    connection set up to sip:**611@192.168.178.1
    TestPhone::Main: calling „sip:**611@192.168.178.1“ for 0
    TestPhone::Main: calling „sip:**611@192.168.178.1“ for 0
    OnOpenMediaStream
    recording media from sip
    CreateMediaStream
    TestChannel[ Call[Cd476cc9e1]-EP[L22e3d9bf2] – 0x1bc6328 ]
    OnOpenMediaStream
    streaming media to local
    TestChannel::Write
    Segmentation fault
    root@raspberrypi:~#
    [/code]

    Hat jemand eine Idee, wo der Fehler liegt?

    Vielen Dank im Voraus

    OwltownAlf

  19. hallo zusammen, bei mir klingelt da nix. hab das nach apt-get update && apt-get upgrade (!!) zwar das so lt. der Anleitung hier installiert bekommen, aber beim telefontest klingelt irgendwie nix. habt ihr eine idee? Diese ausgaben habe ich:
    (**2 ist ein internes telefon)

    root@raspberrypi:/home/pi# /opt/sipcmd/sipcmd -P sip -u 624 -c myxxxPasswortxxx -a Ralf-test -w 192.168.0.101 -x ‚c**2;w10000;h‘
    Starting sipcmd
    Manager
    Init
    unknown option „-a“
    initialising SIP endpoint…
    Listening for SIP signalling on 0.0.0.0:TestChanAudio
    TestChanAudio
    5060
    SIP listener up
    registered as sip:624@624
    Created LocalEndPoint
    Main
    TestPhone::Main: shutting down
    TestPhone::Main: exiting…
    Exiting…
    ~Manager

  20. Sehr schön. Danke.

    Hat wohl etwas gebraucht, bis ich raus hatte, dass ich meine FB mit der vollständigen IP ansprechen muss und nicht mit fritz.box. Könnte vielleicht daran liegen, dass ich zwei FB im Netz habe, die sich dahingegehend stören.

  21. Pingback: [Hausautomation] – fhem auf Fritz!box installieren | Predictor's Blog

  22. Ihr Beitrag beindruckt mich sehr.

    Leider habe ich noch keinen Himbeerkuchen um es zu testen.

    Besteht die Möglichkeit nicht nur einen Anruf sondern noch eine Sprachnachricht über die Fritzbox auf ein Handy abzusetzen?

  23. Hi deine Anleitung ist echt super, jedoch habe ich ein Problem was ich nicht lösen kann. Ich wollte aus FHEM raus mein WLAN ein und ausschalten. Telnet kommt für mich nicht in Frage da sowieso bald abgeschaltet (Firmwareupdate) und das mir zu unsicher ist. Also dachte ich mir das ich anstatt einer Nebenstelle die „Rufnummer“ #96*1* bzw. #96*0* für WLAN ein bzw. aus anrufe. Ich nehme an das diese Codes keine Rufnummern sind und deshalb nicht klappen. In der Anrufliste der Fritzbox sehe ich aber das von dem sipcmd ein Anruf kam. Was mach ich falsch oder geht das prinzipiell nicht?
    Hat wer eine Idee?
    Grüße
    Jochen

    • Ich habe es gerade mal selbst probiert: Einmal vom per DECT angebundenen MT-F Telefon und einmal vom per SIP angebundenen Aastra 6757i Telefon. Es ist leider wie du schreibst: Per DECT werden die Feature Access Codes für WLAN ein/aus problemlos verarbeitet, per SIP allerdings nicht – die FRITZ!Box liefert einfach nur ein „besetzt“ zurück. Das kann leider nur AVM fixen :-(.

      Alternativ lässt sich WLAN sicherlich per TR-064 aktivieren/deaktivieren (http://avm.de/service/schnittstellen/) – das zu implementieren ist aber nicht gerade trivial.

      • Hi Jens,
        hab mich heute nochmal ran gesetzt und herausgefunden das das ein- und ausschalten des WLANs perfekt mit dem Modul FRITZBOX in FHEM gelöst ist.
        Nun wird mein WLAN sowie alle unnötigen elektrischen Verbraucher und Heizungen abgeschaltet bzw. runtergeregelt wenn ich mehr als 10km von zu Hause entfernt bin.
        Grüße Jochen

  24. Hi !

    Ich habe meine Fritzbox vor einer Woche auf die aktuelle Firmware Upgedated und habe seitdem leider kein Telnet mehr auf der Box… Nun bin ich auf der Suche danach, wie mein FHEM wieder Anrufe über meine Fritzbox absetzen kann auf deine Voip Lösung gestossen und würde diese gerne einsetzen. Leider scheint dein kleines Installationsskript mittlerweile nicht mehr zu funktionieren… Wäre echt super, wenn du es wieder ans laufen bringen könntest; ich denke seit dem AVM die Telnet funktion aus der Box entfernt hat, wird deine Lösung für viele FHEM Nutzer wieder interessant werden.

    Gruß
    Mathias Klein

    root@FHEM:/opt# \curl -sSL http://tools.jens-bretschneider.de/setup-sipcmd.sh | bash
    Die folgenden NEUEN Pakete werden zusätzlich installiert:
    libasound2-dev{a} libavahi-client-dev{a} libavahi-common-dev{a} libcaca-dev{a} libcapi20-3{a} libdbus-1-dev{a}
    libdirectfb-dev{a} libdirectfb-extra{a} libelfg0{a} libexpat1-dev{a} libgl1-mesa-dev{a} libglib2.0-bin{a}
    libglib2.0-dev{a} libglu1-mesa-dev{a} libjpeg8-dev{a} libldap2-dev{a} libodbc1{a} libopal-dev libopal-doc{a}
    libopal3.10.4{a} libpcre3-dev{a} libpcrecpp0{a} libpt-dev libpt2.10.4{a} libpthread-stubs0{a}
    libpthread-stubs0-dev{a} libpulse-dev{a} libpulse-mainloop-glib0{a} libsasl2-dev{a} libsdl1.2-dev{a}
    libslang2-dev{a} libspeex-dev{a} libspeexdsp-dev{a} libspeexdsp1{a} libts-dev{a} libx11-dev{a} libx11-doc{a}
    libxau-dev{a} libxcb1-dev{a} libxdmcp-dev{a} libxext-dev{a} mesa-common-dev{a} odbcinst{a} odbcinst1debian2{a}
    unixodbc{a} unixodbc-dev{a} x11proto-core-dev{a} x11proto-input-dev{a} x11proto-kb-dev{a} x11proto-xext-dev{a}
    xorg-sgml-doctools{a} xtrans-dev{a}
    0 Pakete aktualisiert, 52 zusätzlich installiert, 0 werden entfernt und 0 nicht aktualisiert.
    0 B/42,5 MB an Archiven müssen heruntergeladen werden. Nach dem Entpacken werden 187 MB zusätzlich belegt sein.
    Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, line 507.
    Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, line 1313.
    Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, line 1433.
    Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, line 1437.
    Extrahiere Vorlagen aus Paketen: 100%
    Vormals nicht ausgewähltes Paket libdirectfb-extra:armhf wird gewählt.
    dpkg: nicht behebbarer fataler Fehler, Abbruch:
    Dateilisten-Datei des Paketes »iputils-ping« kann nicht geöffnet werden: Eingabe-/Ausgabefehler
    E: Sub-process /usr/bin/dpkg returned an error code (2)
    Ein Paket konnte nicht installiert werden. Versuch, dies zu lösen:

    Cloning into ’sipcmd’…
    remote: Counting objects: 111, done.
    remote: Total 111 (delta 0), reused 0 (delta 0), pack-reused 111
    Receiving objects: 100% (111/111), 611.74 KiB | 431 KiB/s, done.
    Resolving deltas: 100% (47/47), done.
    patching file /opt/sipcmd/src/main.cpp
    g++ -c -Wall src/main.cpp -o src/main.o -I/usr/include/opal -I/usr/include/ptlib -Isrc/
    In file included from src/main.h:24:0,
    from src/main.cpp:24:
    src/includes.h:23:19: fatal error: ptlib.h: Datei oder Verzeichnis nicht gefunden
    compilation terminated.
    Makefile:18: recipe for target ’src/main.o‘ failed
    make: *** [src/main.o] Error 1

    • Hm, da scheint mir eher etwas in der Paketverwaltung des Raspi durcheinander zu sein…

      dpkg: nicht behebbarer fataler Fehler, Abbruch:
      Dateilisten-Datei des Paketes »iputils-ping« kann nicht geöffnet werden: Eingabe-/Ausgabefehler

      Das klingt nicht wirklich gut. Ob der Rest ein Folgefehler davon ist, kann ich so leider nicht einschätzen.

      • Erstmal danke für die schnelle Antwort !!! Ich werde mir am Wochenende mal meinen zweitRaspi schnappen und mit ner frischen Raspbian Installation das Skript nochmal laufen lassen… Ich schreibe dann nochmal, obs sauber durch lief.

        • Habe mein Problem gerade gefunden… Peinlich, peinlich… ich hatte das ganze System auf einer 2GB SD-Karte installiert (war mir mittlerweile entfallen… lief jetzt schon ca. 1 1/2 Jahre). Das passte wohl noch gerade so, bis ich dein Installationsskript ausgeführt habe, was ja doch ein paar Pakete nachinstalliert… ;D Bin gerade dabei das System auf einer größeren SD neu aufzusetzen.

          • Nach erfolgter Neuinstallation des Systems läuft nun alles. Die 10 Sekunden sind allerdings (wie hier bereits beschreiben) wirklich etwas kurz. Schön wäre noch, wenn man nach Rufannahme eine .mp3 oder .wav Datei wiedergeben könnte…

  25. Ich verstehe nicht, warum man an die FBF einen SIP-Client hängt und nicht auf dem RasPi einen Asterisk packt, der als zusätzlicher Provider für die FBF dient.
    Die Methode ist – wenn man nicht gerade ein FBFCable hat, bei der das Einrichten zusätzlicher Provider kniffelig ist – die deutlich flexiblere.
    Ein „Anruf“ wird durch Kopieren eines Callscriptes ins spool-verzeichnis ausgelöst. Das kann durch beliebige externe Programme erfolgen. Man kann „Anrufernummer“ und „Anrufername“ frei setzen und so verschiedene Ereignisse signalisieren. Derartige eingehende Anrufe können auch per Rufumleitung/Parallelruf z.B. aufs Handy weitergeleitet werden. Die Dauer des Anrufs kann beliebig eingestellt werden; der Kontext, mit dem man verbindet, kann eine Sprachnachricht wiedergeben. So kann man z.B. nicht nur verschiedene Klingeln (die dank interner RUL an verschiedenen Endgeräten signalisiert werden) verwenden, sonderwn auch andere Ereignisse signalisieren – z.B. bei einem am RasPi angeschlossenem Kontakt an der Tür des Paketkastens eine Nachricht abgeben, dass ein Paket geliefert wurde.
    Da es sich um „externe“ Anrufe handelt, sind sie in der FBF in der Anrufliste, also auch z.B. bei BoxToGo (pro) auf einem Androiden zu sehen.
    Umgekehrt lässt sich z.B. in der FBF einstellen, dass alle Anrufe, die mit 000 beginnen, über diesen zusätzlichen Account rausgehen sollen. Im Asterisk-Dialplan lässt man dann ein externes Skript mit dem Namen der gewählten Nummer starten. Also z.B. 0001.sh. In das Skript schreibt man dann den Aufruf von FHEM mit der gewünschten Schaltfunktion. So kann man FHEM mit jedem internen – per Callthrough auch jedem externen – Telefon steuern.

    Für Türklingeln drängt sich eine VoIP Türsprechstelle (aus China ca. 100€+Einfuhrumsatzsteuer, aus Deutschland ca. 5-600€) auf. FHEM hat den Vorteil, diese auf beliebig viele Klingeltasten erweitern zu können (Fertiglösungen steigen bei mehr Klingeltasten exorbitant im Preis). Man lässt FHEM dann ein Callfile zwischen TFE und FBF kopieren, dass die entsprechende „Anrufernummer“ setzt und in der FBF nur die jeweiligen Telefone klingeln lässt (wahlregeln).
    Aber auch bei nur einer Klingeltaste hat FHEM seine Berechtigung. Zwar funktioniert klingeln und Sprechen auch ohne FHEM, aber der Asterisk könnte ein Skript aufrufen, das bei Annahme des Türgesprächs das Licht bis zur Tür anschaltet…

  26. Die Parameter w und h (wait und hangup) hinter dem -x werden bei mir nicht berücksichtigt, wobei der Call Befehl einwandfrei umgesetzt wird.
    Rufe ich w und h vor c auf werden dieser berücksichtigt.
    Irgendwie beendet sipcmd die Ausführung nach dem c.
    Irgendwer eine Idee?

    • So siehts aus, der Anruf läuft quasi unendlich.

      pi@raspberrypi /opt/sipcmd $ ./sipcmd -P sip -u 625 -c lotto -a Türklingel -w fritz.box -x ‚c**610;w3000;h‘

      Starting sipcmd
      Manager
      Init
      initialising SIP endpoint…
      Listening for SIP signalling on 0.0.0.0:TestChanAudio
      TestChanAudio
      5060
      SIP listener up
      registered as sip:625@fritz.box
      Created LocalEndPoint
      Main
      ## Call ##
      TestPhone::Main: calling „**610“ using gateway „fritz.box“ at Wed Jul 15 10:16:40 2015

      Setting up a call to: sip:**610@fritz.box
      LocalEndpoint::MakeConnection
      LocalEndpointCreateConnection
      LocalConnection
      OnIncomingConnection: token=L3ee1838c2
      connection set up to sip:**610@fritz.box
      TestPhone::Main: calling „sip:**610@fritz.box“ for 0
      TestPhone::Main: calling „sip:**610@fritz.box“ for 0
      OnOpenMediaStream
      recording media from sip
      CreateMediaStream
      TestChannel[ Call[C360084b31]-EP[L3ee1838c2] – 0x1920da0 ]
      OnOpenMediaStream
      streaming media to local
      TestChannel::Write
      TestPhone::Main: calling „sip:**610@fritz.box“ for 0
      Speicherzugriffsfehler

          • wenn zb dieser Befehl ausgeführt wird:
            /opt/sipcmd/sipcmd -P sip -u Benutzername -c Kennwort -a Türklingel -w Registrar -x ‚c**Nst;w10000;h‘

            Die Verbindung zur Nebenstelle erfolgt, also sie Klingelt. Der Warten und auflegen wird nicht mehr bearbeitet.
            Wenn ich c**Nst mit h ersetzte läuft das script normal durch.

            Müssen die ‚ nicht “ sein?

          • So heute hatte ich ein Raspberry pi B+ zum testen da. Dort läuft alles wie es soll. Also ist sipcmd nicht kompatibel zum Raspberry Pi2, zumindest in der original Version.
            Obst da noch Support gibt…?

          • Hmm… ich habe keine Idee, wo sich das beißen könnte! Und ich habe leider auch nicht gerade das Gefühl, dass Sipcmd noch aktiv gepflegt wird… :-/

      • Ich habe auch das „Speicherzugriffsfehler“ Problem. Beim ersten Start klappt es immer danach irgendwie nicht mehr. Ich kann es selbst nicht nachvollziehen, allerdings programmiere ich auch nicht wirklich. Falls jemand eine Lösung gefunden hat, würde ich mich stark freuen! Eine alternative wäre auch schön!

  27. Auf Raspberry über expect funktioniert soetwas auch!

    ich habe dazu *.expect Scripte geschrieben welche über Fhem gestartet werden und über telnet eine Verbindung zur FritzBox aufbauen:

    vorher auf dem Raspberry folgendes installieren:

    sudo apt-get install telnet
    sudo apt-get install expect

    mit einem Telefon an der Fritzbox den Telnet-Zugang aktivieren (An machen), dazu einfach folgende Nr. mit dem Telefon anrufen #96*7*
    #96*7* = An
    #96*8* = Aus

    Speicherort: /opt/fhem/Intern.expect
    Name: Intern.expect
    für das Script Fhem evtl. Rechte geben
    Script für interenes (alle Telefone **9) klingeln lassen:
    ##################################### Inhalt:
    #!/usr/bin/expect

    spawn telnet fritz.box
    expect „password:“
    send „MEIN_FRITZBOX_PASSWORT1234\n“
    expect „#“
    send „ctlmgr_ctl w telcfg command/Dial **9\n“
    sleep 15;
    send „ctlmgr_ctl w telcfg command/Hangup 1\n“
    expect „#“
    send „exit“
    exit
    #####################################

    Mit sleep kann die Zeit definiert werden wie lange das Script anruft.

    man kann die Nr. **9 auch gegen eine normale Tel.Nr. ändern (z.B. ein Handy) Zeile entsprechend ändern:
    send „ctlmgr_ctl w telcfg command/Dial 01721234567\n“

    In Fhem:

    ##################################### Telefon_Klingel Schalter (Dummy in FHEM)

    define Telefon_Klingel dummy
    attr Telefon_Klingel devStateIcon on:phone_ring@green off:general_aus@red
    attr Telefon_Klingel webCmd on:

    define Telefon_Klingel_Anruf DOIF ([Telefon_Klingel] eq „on“) ({system („/usr/bin/expect /opt/fhem/Intern.expect &“)},define Telefon_Klingel_off at +00:00:20 set Telefon_Klingel off)

    #####################################

    evtl. hilft es jemandem :o)
    Gruß
    Herby

    • Cool, danke!

      Schade nur, dass AVM den Telnet-Zugang im nächsten FRITZ!OS Release deaktivieren wird :-(. In der aktuellen Laborversion ist es schon nicht mehr enthalten.

      • Och neeee,
        schonwieder muss ich umbauen! DANKE für die Info!
        Da muss ich mir zwei mal überlegen das nächste Update zu machen…

        erst hatte ich Fhem auf der FritzBox, bin dann auf Rpi umgezogen.
        Danach haben die auch schon etwas geändert.
        habe vorher mit folgenden Befehlen gewählt:
        send „echo \“ATP 2 ATD**701\“ | nc 127.0.0.1 1011\n“
        send „echo \“ATH0\“ | nc 127.0.0.1 1011\n“

        Nun wieder eine „Sicherheits“änderung… :o(

        Vorteil für mich: mit telnet kann ich W-Lan und Gast-W-Lan aktivieren oder deaktivieren.

        an
        send „ctlmgr_ctl w wlan settings/ap_enabled 1\n“
        aus
        send „ctlmgr_ctl w wlan settings/ap_enabled 0\n“

        Gast an
        send „ctlmgr_ctl w wlan settings/guest_ap_enabled 1\n“
        Gast aus
        send „ctlmgr_ctl w wlan settings/guest_ap_enabled 0\n“

  28. Klingt gut. Würde damit auch mein lang ersehnter Parallelruf funktionieren? Zwei Taster gleichzeitig drücken und zwei unterschiedliche Nebenstellen gleichzeitig klingeln lassen…?

  29. Hi, ich suche nach einer einfachen Möglichkeit die angeschlossenen Telefone der FritzBox klingeln zu lassen – nur OHNE FHEM.
    Wie bekomme ich das von meinem Pi mit Python hin?
    Hört sich interessant an, warum wird der Ansatz nicht weiter verfolgt?

    • Prinzipiell kannst du mit FHEM beide Ansätze und ohne FHEM meinen Ansatz mit dem SIP Client einfach nutzen. Ich habe leider keine Ahnung von Pyhon, aber sobald du rausfindest, wie du damit externe Prozesse starten kannst, kannst du auch den SIP Client darüber starten – ganz so, wie ich es von FHEM aus gemacht habe.

      Für FHEM funktioniert aber definitiv die im Kommentar vorgeschlagene Lösung verlässlicher und „runder“.

  30. Hallo,
    ich möchte genau das Gleiche realisieren und habe verschiedene Varianten getestet. Immer stoße ich auf das Problem, dass Parallel-Rufe nicht möglich sind. Also wenn ich zwei Klingeln habe, die zwei verschiedene Telefone ansteuern sollen, dann geht dies nicht. Es wird immer nur ein Prozess zum Klingeln aufgerufen und erst wenn dieser abgearbeitet ist, könnte man die andere Klingel betätigten. Hat jemand eine Idee, wie man das lösen könnte?

    • Du meinst, ein Taster -> eine Klingel, das ganze zwei Mal? Und beide Taster werden quasi gleichzeitig bzw. direkt nacheinander betätigt? Gute Frage…

  31. Vielen Dank für die hervorragende Anleitung! Ich hatte dieselbe
    Aufgabenstellung (allerdings mit dem FS20_KSE) und konnte
    den Türklingelanrif mittels sipcmd unmittelbar realisieren.
    Auch bei mir waren die Latenzen recht hoch, aber mit 4-5 Sekunden deutlich unter den hier beschriebenen.
    Inzwischen habe ich eine Alternative entdeckt, die das Herunterladen und patchen von sipcmd, das Einrichten eines WLAN-Telefons und einer Kurzwahl überflüssig macht: über den FHEM-Devicetypen „FRITZBOX“ lässt sich per Telnet direkt eine Verbindung zur heimischen Fritzbox herstellen.
    Der FHEM-Befehl „set FritzBox ring 610,621,622 10 show:Türklingel“ lässt dann als Notifier die internen Telefone 610,621 und 633 für 10 Sekunden klingeln. Hat man für das FritzBox-Device das Attribut „ringWithIntern“ gesetzt, erscheint auch die gewünschte Meldung („Türklingel“) auf dem Display der Telefone.
    Dabei liegt die Latenz deutlich unter derjenigen mit sipcmd, und auch die Einstellung der Klingelzeit scheint besser zu funktionieren.

    • Daaaankeschön für den Tipp! 🙂 Über das FRITZBOX Device funktioniert das wirklich 10000x mal besser als über die SIP-Kopplung. Bislang dachte ich immer, alle Module für die FRITZ!Box funktionieren nur, wenn FHEM direkt auf der Box läuft. Hätte ich mal etwas besser hinschauen sollen ;-).

      Habe meine Installation mal direkt entsprechend deinem Vorschlag umgebaut und bin begeistert!

      Das benötigte CPAN Modul lässt sich unter Raspbian via „apt-get install libnet-telnet-perl“ bzw. „aptitude install libnet-telnet-perl“ nachinstallieren, ohne sich mit CPAN rumschlagen zu müssen.

    • Klingt gut. Würde damit auch mein lang ersehnter Parallelruf funktionieren? Zwei Taster gleichzeitig drücken und zwei unterschiedliche Nebenstellen gleichzeitig klingeln lassen…?
      Was muss am Raspberry installiert werden, damit FHEM läuft?

    • Der FHEM-Befehl “set FritzBox ring 610,621,622 10 show:Türklingel” lässt dann als Notifier die internen Telefone 610,621 und 633 für 10 Sekunden klingeln. Hat man für das FritzBox-Device das Attribut “ringWithIntern” gesetzt, erscheint auch die gewünschte Meldung (“Türklingel”) auf dem Display der Telefone.
      -> Ich habe dies versucht, alle Telefone klingeln, doch der Text wird nur am ersten Telefon hier 610 angzeigt, aber nicht auf den beiden anderen ? Ich benutze Siemens Gigaset Dect keine Fritzfons

Schreibe einen Kommentar zu Alix Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert