Zweifach-Klingel mit RPi und Fritzbox

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,
    ich habe nach wie vor die Anforderung, meine beiden potentialfreien Klingeltaster über den Rpi und SIP mit der Fritzbox zu verbinden, d.h. Klingeltaster sollen SIP-Call starten und dann unterschiedliche Telefone klingeln lassen. Das funktioniert mit dem Tool spickt einzeln auch ganz gut. Jetzt möchte ich aber bei Klingeln gleichzeitig abfragen (Postboten-Syndrom, klingeln meist parallel), ohne dafür einen separaten Raspberry für die zweite Klingel einsetzen zu müssen. Mein Python-Skript sieht wie unten beschrieben aus, ich dachte dass es mit Thread gehen müsste, aber es wird immer nur die zuerst gedrückte Klingel ausgewertet und abgearbeitet. Hat jemand eine Idee, wie man das mit einem Skript und einem Raspberry hinbekommt?

    Skript:

    #!/usr/bin/python
    import os
    import RPi.GPIO as GPIO
    import time
    import thread

    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
    GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

    Klingelt1 =0
    Klingelt2 =0


    while True:

    if(GPIO.input(23) ==1 and Klingelt1 ==0):
    Klingelt1 = 1
    print "Start Klingel 1"
    thread.start_new_thread(os.system,('./sipcmd -P sip -p5061 -u 623 -c ***** -w fritz.box -x "c**624;w300;h"',))
    #thread.start_new_thread(os.system,('touch test1',))

    if(GPIO.input(23) ==0 and Klingelt1 ==1):
    print "Ende Klingel 1"
    Klingelt1 = 0

    if(GPIO.input(24) ==1 and Klingelt2 ==0):
    Klingelt2 = 1
    print "Start Klingel 2"
    thread.start_new_thread(os.system,('./sipcmd -P sip -p5061 -u 623 -c ***** -w fritz.box -x "c**52;w300;h"',))
    #thread.start_new_thread(os.system,('touch test2',))

    if(GPIO.input(24) ==0 and Klingelt2 ==1):
    print "Ende Klingel 2"
    Klingelt2 = 0

    #print "Sleep 1 sec"
    time.sleep(0.05)

    GPIO.cleanup()

  • Hab ich noch nicht ganz verstanden. Ich habe jetzt mal die beiden Klingeln in zwei separate Skripte aufgeteilt und rufe diese mit & parallel auf. Auch hier wird immer nur ein Ruf abgearbeitet (von der Klingel, die zuerst gedrückt wird). Welche Funktion hat RPiGPIO.add_event_detect in diesem Fall?

  • Aufruf mit & bedeutet: Mach zuerst das eine und danach andere.
    Aufruf mit && bedeutet: Mach zuerst das eine und danach andere, wenn das erste erfolgreich war.

    RPiGPIO.add_event_detect ist eine Möglichkeit die Inputpins Event-gesteuert zu kontrollieren. Ist sowas wie: Wenn Pin was macht, dann rufe callback-Funktion auf und übergebe als Parameter die Pin-Nummer. Wann reagiert werden soll, definiert RPiGPIO.BOTH. Alternativ wäre, glaube ich, FALLING oder RISING.

    Script hab ich nicht getestet, hoffe es läuft trotzdem:

    PS: Ohne Deinen Entwicklungsdrang bremsen zu wollen, ich finde es gut sich den Herausforderungen zu stellen, ist DoorPi nicht genau das, was Du suchst?

  • Es könnte sein, dass DoorPi das wäre was ich suche. Mir kam es aber zu umfangreich vor und aufwändig, mich da einzuarbeiten. Wenn Du mir sagen kannst, wie und wo ich die beiden Klingeltaster definiere und die zu rufenden Nebenstellen, und wie ich es dann starte, dann kann ich das nochmal versuchen. Ich möchte mich wie gesagt nicht durch die ganzen Skripte "quälen", zudem ich auch nicht der Ober-Programmierer bin.
    Mein Skript sollte daher so einfach wie möglich sein...

  • Habe es mal so probiert, da passiert wieder das Gleiche, es klingelt das Telefon was der zuerst betätigten Klingel zugewiesen wurde:

  • Habe statt sipcmd mal die PJSUJA Bibliothek genommen und ein fertiges Skript "Sipcall" aus dem Binerry Projekt. Hier ist das Problem, dass der Call sich nicht unterbrechen lässt, das Telefon klingelt also ständig. Ansonsten würde es sogar laufen. Wie kann ich am Ende den Call terminieren?

  • Das hatte ich auch schon probiert, aber noch nicht geschrieben. Habe einen zweiten SIP-Client an der FB angelegt und mit diesem dann versucht, die zweite Klingel anzurufen. Vergeblich. Wenn die erste aktiv ist, geht der zweite Ruf nicht raus. Es muss doch irgendwie möglich sein, zwei Nebenstellen parallel anzurufen?

  • Ich glaube das wurde noch nicht ganz verstanden. Es sollen nicht beim Drücken von Taster 1 zwei Telefone gleichzeitig klingeln (das würde problemlos gehen), sondern bei Taster 1 die Nebenstelle von Telefon 1 und bei Taster 2 (der annähernd gleichzeitig gedrückt wird) die Nebenstelle von Telefon 2. Es ist also keine 1:n, sondern eine n:m Funktion. Mit meiner bisherigen Funktion (FHEM der Fritzbox und CUL-Stick mit zwei Sendern) läuft das perfekt. Aber FHEM wurde von AVM ja abgeschaltet :( Darum brauche ich jetzt eine adäquate Alternative...

  • Richtig, ich brauche nur INVITE, WAIT, HANGUP. Es muss kein Gespräch geführt werden, weil ich keine Türsprechanlage verwende. Zwei Taster für die Klingel, mit denen ich statt einem klassischen Haustür-Gong die Telefone nutzen möchte. Früher habe ich das mit der ISDN Telefonanlage und einem Klingelmodul gemacht, die Anlage wurde dann ersetzt durch die FritzBox...

  • Okay, hab gerade keinen PC zur Verfügung und kann deshalb keinen ganzen Quellcode schreiben. Nimm als Grundlage z.B. mein Script aus Antwort 4.
    Die callback muss dann einen Anruf aufbauen. Das geht mit curl und der Fritzbox API
    Curl und API nutzen:
    http://wiki.ubuntuusers.de/FritzBox/Skripte

    Passendes Beispiel für bash ist hier:

    Externer Inhalt gist.github.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Anstelle von dem cat sollte dann ein sleep folgen.

    Dann sollte es klappen...

  • Das sieht schon mal ganz gut aus, das Telefon **624 klingelt auch und nach dem Sleep wird beendet. Allerdings kommt der Anruf mit "Gruppenruf DECT/ISDN" und der Rufnummer **50 an, diese Rufnummer habe ich aber gar nicht im Telefonbuch. Ich möchte die entsprechende Nummer der Klingel(n) als Absender nehmen, damit ich das auch beim Klingeln unterscheiden kann. Aber wo wird das konfiguriert?

  • Hi bearberry,

    kannst Du mal beschreiben, wie Du deine Klingel an den raspi angebunden hast?
    Würde meine 2-draht Klingel auch gerne anschließen, habe aber den passenden Thread wohl noch nicht gefunden.

    Gruß,
    Tobi

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!