DoorPi (VoIP Wechselsprechanlage / Türsprechanlage mit Video-Support)

  • // EDIT am 11.03.2016 \\


    Da die Übersichtlichkeit hier im Forum immer mehr verloren geht (auch ein gutes Zeichen, dass DoorPi wächst) habe ich mich entschlossen ein eigenes Forum zu eröffnen, dass sich nur um das Thema DoorPi dreht. Das neue Forum findet Ihr hier:


    http://board.doorpi.org


    Die hier bestehenden Inhalte werde ich versuchen, stückchenweise ins neue Forum zu übertragen und dort zu sammeln.
    Jeder ist recht herzlich eingeladen, mir dabei zu helfen...


    // EDIT - Ende \\


    Ziel des Projektes DoorPi ist die Steuerung einer Türsprechanlage mittels einem Einplatiniencomputer wie dem Raspberry Pi.


    Dazu sollen Ereignisse (Events) wie "Drücken einer Türklingel" oder "NFC Chip xyz vorgehalten" die Auslöser von Aktionen (Actions) wie "Anruf bei Telefon xyz" oder "E-Mail an xxx" sein.


    Um diese Events zu registrieren werden "DoorPi-Keyboards" genutzt, was z.B.

    • die GPIO-Pins
    • ein PiFace
    • Dateien im Dateisystem des Pi (z.B. für Remote-Befehle über SSH)
    • die serielle Schnittstelle (RDM6300 als NFC Reader)
    • Webservice mit Authentifizierung
    • VoIP-Telefon

    sein können.


    An jedes Event können beliebig viele Actions angefügt werden, die syncron oder asyncron ausgeführt werden. Eine nicht vollständige Liste der Actions ist:

    • VoIP Anruf zu festgelegter Nummer starten
    • VoIP Anruf zu Nummer starten, die aus einer Datei ausgelesen wird
    • Anruf beenden
    • E-Mail versenden
    • Programm ausführen
    • Ausgang schalten
    • Status-Datei schreiben
    • Werte aus IP-Symcon lesen oder zurück schreiben
    • ...


    Durch die Kombination der Events und Actions sind fast alle gewünschten Kombinationen möglich.


    Ein mögliches Szenario ist:

    • Beim Druck eines Klingeltasters wird ein Anruf ausgelöst und gezielt eine Nummer angerufen (z.B. interne FritzBox Nummer **613 aber auch Handynummern).
    • Der Bewohner kann mit der Außenstelle telefonieren und auf Wunsch die Tür remote öffnen, in dem eine definierte Taste (oder Tastenfolge) auf dem Telefon gedrückt wird.
    • Der Bewohner vergisst das auflegen und DoorPi beendet selbst das Gespräch, sobald die Tür wieder geschlossen wurde.
    • DoorPi versendet eine E-Mail, dass es einen Anruf gab, jemand die Tür geöffnet hat und jemand ins Haus gegangen ist.


    Mittlerweile gibt es auch Video-Support, so dass an der Haustür eine Kamera installiert werden kann und das Bild auf den Innenstationen angesehen werden kann, noch bevor das Gespräch angenommen wird.




    Keyboards und Actions können problemlos mit eingebunden werden. Wer selbst programmieren kann, wird sich mit der Grundstruktur schnell zu recht finden. Alle anderen können im Theard nachfragen. Oftmals können Wünsche schnell umgesetzt werden.





    // Original erster Post \\


    Wird bestimmt nicht die erste sein, aber ich habe mich versucht und bin stolz.
    Kritik, positiv und negativ, ist gern gesehen...


    Stand des Projektes:
    Software-seitig zu 90% abgeschlossen
    Hardware-seitig zu 90% abgeschlossen


    https://github.com/motom001/DoorPi
    https://github.com/motom001/DoorPi/wiki (z.B. Installationsanleitung)


    aus der README.md:


    Ziel des Projektes ist die Steuerung einer Türsprechanlage mittels einem Raspberry Pi (Model B) und PiFace. Dazu habe ich das Projekt "door-berry" von "mpodroid" auf github gefunden (https://github.com/mpodroid/door-berry). Seit einiger Zeit findet dort aber keine Entwicklung mehr statt und es ist dort noch recht viel zu tun. Aber als Vorlage war es perfekt.


    Anforderungen an meine Türsprechanlage:


    Betrieb:

    • 24/7 im Hausflur
    • stabil

    Schnittstellen Input:

    • Anschluss der vorhanden Türsprechanlage (3 Taster, Mikrofon, Lautsprecher)
    • Ansteuerung des Türöffners (12V DC) per Tastendruck am Telefon (z.B. #)

    Schnittstellen Output:

    • Kommunikation mittels VoIP (VoIP-Server ist eine AVM FRITZ!BOS 7490)
    • pro Klingel-Taste soll eine andere Rufnummer gewählt werden (können)

    Der Aufbau bei mir ist:

    • Haus mit 3 Etagen - pro Etage ein eigener Mieter
    • im 2. OG: FRITZ!BOS 7490


    • im 1. OG: FRITZ!Powerline 546E Powerline-Adapter

      • als WLAN-Access-Point (per Netzwerkkabel angeschlossen)


    • im EG: FRITZ!BOX 7270

      • als Netzwerk-Switch, DECT-Basis, WLAN-Access-Point
      • sowie als Stromversorger für Raspberry Pi
      • Netzteil der FritzBox ersetzt gegen ein stärkeres (12 DC, 2,5A)
      • Netzkabel gesplittet - einmal für die 7270, einmal an die Relais vom PiFace für den Türöffner sowie Beleuchtung Türsprechanalage
      • Raspberry PI (Model B) mit PiFace im großzügigen Gehäuse
      • USB-Soundkarte EAN: 4016138697902 (http://www.conrad.de/ce/de/product/872300)


  • Dein Projekt klingt genau nach dem was ich machen wollte :danke_ATDE:


    Werde mich jetzt mal daran machen und versuchen deine Lösung umzusetzen wenn du sogar schon die Tür mittels Tastenkomination aufbekommst :)


    Wegen der Überstzung ins englische kann ich dir gern helfen das sollte für mich das kleinere Problem sein als die Installation :D

  • Gibt noch Probleme beim Daemon - die hab ich gestern Abend gelöst und würde heute neue Version hochladen.
    Dann mach ich mich dran die benutzten (Software-)Kompontenen genauer aufzulisten und entsprechende Links zu setzen.
    Danach folgt die Konfigurations-Web-Oberfläche.


    Wenn Wünsche oder Fehler auftreten, dann immer her damit...

  • Hallöle,


    Wird bestimmt nicht die erste sein, aber ich habe mich versucht und bin stolz.
    Kritik, positiv und negativ, ist gern gesehen...
    ...


    sehr schön gemacht :bravo2:
    Da kannst Du wirklich stolz drauf sein ... tja, was soll man da noch groß sagen :s


    ... prima :thumbs1:


    cu,
    -ds-

  • bin ich auch ein wenig - vor allem das ich mich mal wieder zum Programmieren durchringen konnte...


    Hab vorhin wieder nen Update hochgeschubst das Fehler bei ankommenden Anrufen beheben sollte...

  • Super, wäre noch eine Dummy-Anleitung möglich, wie man die Software am RPi installiert und welche Skripte für welche Funktion ausgeführt werden müssen? Habe auch eine Klingel, die ich per SIP über die Fritzbox signalisieren lassen will, also einfach z.B. Invite, Wait, Hangup...Wahrscheinlich brauche ich dafür nur Teile von diesen Skripten.


  • Ist denn das jetzt auch schon zuviel verlangt :fies:


    Ich kann die Antwort voll und ganz verstehen, bin aber noch neu im Forum und habe noch Kraft und Lust mich auch diesen Fragen zu stellen. :D
    Danke aber für die "Verteidigung" :thumbs1:



    Super, wäre noch eine Dummy-Anleitung möglich, wie man die Software am RPi installiert und welche Skripte für welche Funktion ausgeführt werden müssen? Habe auch eine Klingel, die ich per SIP über die Fritzbox signalisieren lassen will, also einfach z.B. Invite, Wait, Hangup...Wahrscheinlich brauche ich dafür nur Teile von diesen Skripten.


    OK, entweder Du wolltest Dich nicht damit beschäftigen oder Du wusstest nicht wie.
    Da ich an das Gute im Menschen glaube, denke ich das Zweite. Eventuell bist Du es auch nicht gewöhnt, dass Leute Ihre Projekte dokumentieren und hast deshalb nicht im Wiki geschaut :)


    Also helfe ich natürlich gerne...
    Eine Installationsanleitung findet man im Wiki auf github:
    https://github.com/motom001/DoorPi/wiki/Installation
    Dort wird auf die drei Installationsdateien eingegangen, die unter /docs/install auf github zu finden sind:
    https://github.com/motom001/DoorPi/tree/master/docs/install


    Speziell zu Deiner Frage:
    Ein ganz einfaches Beispiel findest du hier:
    http://trac.pjsip.org/repos/wiki/Python_SIP/Hello_World#
    ein größeres Beispiel findest Du hier:
    http://trac.pjsip.org/repos/br…c/python/samples/call.py#
    Die Docu der von mir verwendeten SIP-Phone Lib "pjsua (PJSIP)" findet man hier:
    http://www.pjsip.org/python/pjsua.htm


    Die Umsetzung dessen in meinem Projekt findet man in den drei Dateien:
    https://github.com/motom001/Do…orpi/sipphone/by_pjsua.py
    https://github.com/motom001/Do…ipPhoneAccountCallBack.py
    https://github.com/motom001/Do…b/SipPhoneCallCallBack.py


    by_pjsua.py ist das Grundgerüst um die Lib in meinem Projekt zu kapseln - quasi das Interface falls es mal andere SIP-Clients in meinem Projekt gibt. Von hier aus werden die ausgehenden Gespräche gehandelt.


    SipPhoneAccountCallBack.py ist die Anmeldung und Grundeinstellung des SIP-Accounts, also der Anmeldung am SIP-Server. Hier werden auch ankommende Gespräche gehandelt (on_incoming_call).


    SipPhoneCallCallBack.py ist der Handler für ein Gespräch, egal ob ankommend oder ausgehend. Es enthält die Methoden die aufgerufen werden, wenn sich z.B. der Status des des Gespräches ändert (das von Dir angesprochene "Invite, Wait, Hangup").


    Unklar ist mir, warum Du die Welt neu erfinden willst, denn mein Projekt hat genau die von Dir gestellt Aufgabe. Aber warum nicht - Reisende soll man nicht stoppen.
    Eventuell "forkst" Du auch mein Projekt und entwickelst, dann gäbe es die Möglichkeit Deine Änderungen, die eventuell besser sind als mein Quellcode, zu in mein Projekt rein zu "mergen". Gegenseitige Hilfe könnte beiden helfen :)


    // EDIT \\


    Ich hab die Frage einfach mal zum Anlass genommen, die Installationsanleitung auch im Start-Beitrag zu editieren.

  • Perfekt und danke, mehr wollte ich doch gar nicht. Und wenn Du Deinen Beitrag somit vervollständigen konntest - umso besser! Das wird Dich und die anderen Teilnehmer hier vor weiteren dummen Anfragen wie meiner bewahren. Ich programmiere eher selten, obwohl ich ein "breitbandiger" Techniker bin. Somit brauche ich den Support für den Einstieg. Wenn ich dann groß bin werde ich natürlich die Erfahrungen und meine Lösung für alle bereitstellen.

  • Frage per PM:

    Quote

    Kannst du mir noch sagen welche Skripte hier angezogen werden? In der Repository sind einige drin, ich möchte noch verstehen, welche für Konfiguration und welche für das Ausführen zuständig sind.


    OK, ich versuch es in Kurzzusammenfassung.

    die Klasse DoorPi ist die zentrale Dreh- und Angelscheibe und deshalb auch als Singelton realisiert. Es kann also nur ein Objekt von dieser Klasse geben.

    Die Klasse DoorPi ist für die Kommunikation zwischen Input und Output zuständig. Diese Input und Outputschnittstellen sind als Klassen realisiert (teilweise mit "SubKlassen"). Zusätzlich gibt es eine Config-Klasse um nicht jedes mal auf die Config-Datei sebst zugreifen zu müssen (Ram ist schneller als Filesystem und so groß ist die Config-Datei nicht).
    Klasse DoorPi hat somit die Aufgabe alle Schnittstellen zu initialisieren, bereit zustellen und später wieder kontrolliert zu zerstören.

    Klasse Config ist die virtuelle Darstellung der Config-Datei und in der privaten Variable __config der Klasse DoorPi abgelegt.

    Inputschnittstelle ist das Keyboard (private Variable __keyboard in der Klasse DoorPi). DoorPi stellt fest welches KeyBoard installiert ist und lädt die entsprechende Klasse PiFace oder Klasse GPIO.

    Outputschnittstelle ist (neben dem Keyboard, das schon geladen ist) das SipPhone. Es könnte später theoretisch auch ein anderes SipPhone als die aktuelle Klasse Pjsua genutzt werden. Das SipPhone ist in der privaten Variable __sipphone der Klasse DoorPi abgelegt.

    Nun geht der Spaß los, jede Schnittstelle wird geladen und holt sich von DoorPi().get_config() seine entsprechende Config. Somit weiß jeder was er zu tun hat und kann agieren. Zugriff findet immer wieder zentral über DoorPi statt, da diese Singleton-Klasse immer weiß wer wo zu finden ist.

    Eine Unregelmäßigkeit ist noch - Das Öffnen der Tür erfolgt dummerweise von SipPhone (genauer gesagt SipPhoneCallCallBack) über spezielle Methoden von DoorPi.
    Auf der einen Seite ist das der richtige Ansatz um Berechtigungen zu prüfen. Auf der anderen Seite sollte die Klasse DoorPi genau das nicht machen (kein Doing, sondern nur Controlling)

    Speziell das SipPhone setzt sich zusammen aus:
    Klasse Pjsua - Basisklasse für SipPhone mit Pjsua
    Klasse SipPhoneAccountCallBack - z.B. was tun wenn ein Anruf rein kommt
    Klasse SipPhoneCallCallBack - was ist mit einem Anruf zu tun z.B. Media, DTMF, ...

    So halbwegs verständlich?
    [hr]
    Frage per PM:

    Quote

    Wie ist die Config-Datei aufgebaut, bzw. was muss ich dort eintragen?


    OK, ganz am Anfang. Der RPi hat verschiedene Anschlüsse, die auch hier aufgelistet sind.

    Ausgangssituation:
    Du hast ein Türsprechanlage die per Taster an RPi angeschlossen ist.
    Also, von PIN 1 geht ein Kabel zu jedem Taster (Stromversorgung der Taster)

    1. Taster geht zurück auf PIN 11 (GPIO 17)
    2. Taster geht zurück auf PIN 13 (GPIO 27)
    3. Taster geht zurück auf PIN 15 (GPIO 22)

    Türöffner wird an PIN 12 (GPIO 18) angeschlossen.


    Lautsprecher und Mikrofon sind per USB-Soundkarte angeschlossen.


    Die Konfiguration der InputPins wäre also:

    Code
    [InputPins]
    ; singlecall_pin = call:[phonenumber] # make a call to this number
    17 = call:**611
    27 = call:**612
    22 = call:**613



    Damit wird definiert, welche InputPins es gibt und wie die belegt (Aktion beim Drücken der Taster) sind.

    Die Konfiguration der OutputPins wäre:

    Code
    [OutputPins]
    18 = open_door 0



    Damit ist definiert welche Pins es gibt und welchen Namen der Pin trägt (steht dann z.B. in der Log-Datei)

    Nun folgt der Abschnitt was passiert wenn man eine Taste drückt, während ein Gespräch läuft:

    Code
    [DTMF]
    ; "dtmf signal" = out:[output_key],[start_value],[end_value],[timeout]
    "#" = out:18,1,0,3



    Beim Drücken von # wird:
    OutputPin 18 bedient
    Anfangswert 1
    Endewert 0
    Halten für 3 Sekunden

    --> Der Türöffner öffnet also für 3 Sekunden.

    Was hier nicht beachtet wird:
    - Widerstand für die Taster beachten
    - Relais für den Türöffner benutzen

    Aus diesen 2 Gründen hab ich mich für PiFace entschieden. Dort kann ich die Taster direkt anschließen und zwei Relais sind auch enthalten.
    [hr]
    Frage per PM:


    Quote

    Mit meinem Handy (als VOIP Client) kann ich die FB ohne Probleme anrufen, ich scheitere nur vom Pi.


    Grundsätzlich ist 404 ein Fehler der darauf hindeutet, dass etwas nicht gefunden wurde. Welche Gründe das sein können?


    Funktioniert ein Ping von Pi zur IP der Fritzbox?
    Funktioniert ein Ping von Pi zum Namen der Fritzbox?
    Ist der Pi per Kabel angeschlossen (ich hatte Probleme bei WLan und musst auf Kabel ausweichen)?

    Ansonsten hab ich versucht hier ein Beispiel-Test-Script zusammenzuschießen. Allerdings hab ich es jetzt nicht getestet, sondern nur schnell mit Notpad++ zusammengeschustert. Bitte in der Mehode create_AccountConfig Deine Anmeldedaten eintragen. In der Methode create_LogConfig kann das Log-Level konfiguriert werden - die URL dort beachten!


  • Hallo mit Verspätung ...


    Mein ursprüngliches Problem hat sich erledigt, das war ein unfassbar blöder Konfigurationsfehler von mir. Nachdem Ich mit mit pjsua erfolgreich registriert habe, wollte ich einen Call machen. Eine reproduzierbar todsichere Methode meine Fritzbox neu zu starten ... ;)


    Ich habe dein Script ausprobiert, und ein paar Kleinigkeiten geändert damit es startet, allerdings ohne nachhaltigen Erfolg (bitte um Gnade, ich hatte noch nie mit python zu tun).


    Code
    Inhalt entfernt ... War ein Copy/Paste Unfall


    jedenfalls bekomme ich das als Output (Wie es scheint, hab ich noch an ganz anderer Front Probleme)


    Und ich hänge noch eine kleine Frage an: Beim Ausführen des Doorpi.install Scripts stoße ich auf folgendes Problem:

    Code
    * Install DoorPin service
    update-rc.d: using dependency based boot sequencing
    update-rc.d: warning: start runlevel arguments (none) do not match doorpi Default-Start values (2 3 4 5)
    update-rc.d: warning: stop runlevel arguments (none) do not match doorpi Default-Stop values (0 1 6)
    insserv: script doorpi is not an executable regular file, skipped!
    update-rc.d: using dependency based boot sequencing
    update-rc.d: warning: start runlevel arguments (none) do not match doorpi Default-Start values (2 3 4 5)
    update-rc.d: warning: stop runlevel arguments (none) do not match doorpi Default-Stop values (0 1 6)
    insserv: script doorpi is not an executable regular file, skipped!


    Vielen Dank für das tolle Projekt und die gute Doku (Meine Probleme haben andere Ursachen ;) ).
    Und vielen Dank für die Mühe, die du dir bislang mit deinen Antworten gemacht hast


    LG

    Edited once, last by nadann ().

  • Code
    insserv: script doorpi is not an executable regular file, skipped!


    da fehlt wohl ein chmod in der install Datei.
    Ich hab es auf GitHub als Issue aufgenommen und an die entsprechende Stelle eingefügt.


    Sollte jetzt funktionieren.
    [hr]


    Ich habe dein Script ausprobiert, und ein paar Kleinigkeiten geändert damit es startet, allerdings ohne nachhaltigen Erfolg (bitte um Gnade, ich hatte noch nie mit python zu tun).


    Kannst alles gern verändern, aber dann auch richtig :)


    • Zeile 40: wird die Methode set_current_callback wiederholt definiert (vorher Zeile 37)
    • Zeile 41: "BAD_CHARACTER" $ am Zeilenende
    • Zeile 45: "BAD_CHARACTER" $ am Zeilenende
    • Zeile xxx


    Ich hab dann aufgehört zu suchen :P


    Das sollten aber nicht die Fehlermeldung erklären, anscheinend kam es zu einem Copy&Paste Fehler von Deinem PC hier ins Forum.


    Ich muss aber auch zugeben, dass mein Test-Script nicht perfekt war (hatte ich versucht in der Mittags- oder Frühstückspause zu schreiben und ohne Test hier eingestellt) Sorry.


    Hier ein bessere Variante, die ich eben gerade getestet habe:

  • Hallo,


    abgesehen von dem Copy/Paste Unfall waren meine Anpassungen vom Ergebnis betrachtet auch nicht anders ... Hier der Outpot deiner korrigierten Version:
    leider laufe ich wieder in dieses Problem ...


    Ich denke, dass ich meinen PI neu aufsetzen und alles neu installieren werde ...
    Irgendwo ist da etwas gröber schiefgelaufen.


  • Irgendwo ist da etwas gröber schiefgelaufen.


    Auch die Suche nach dieser Fehlermeldung hat keine Ergebnisse gebracht, ich konnte den Fehler auch nicht nachstellen. Ich vermute einen Fehler bei der Installation von pjsua.
    Sag Bescheid, wenn Du wieder so weit bist und ich helfen kann.

  • Ich habe gestern angefangen die Türsprechanlage am Haus zu demontieren und als Teststellung auf meinem Schreibtisch aufzubauen.
    Sind Bilder von diesem Aufbau / der Verkabelung interessant, dann dokumentiere ich das gleich mit. Aktuell funktioniert alles, bis auf das Mikrofon der Türsprechanlage.
    An einer Innenstation der Türsprechanlage angeschlossen funktioniert es, am Mikrofoneingang der Soundkarte nicht. Ein anderes (richtiges) Tisch-Mikrofon funktioniert an der Soundkarte, aber nicht an der Innenstation.
    Hat jemand eine Idee?