mikrocontroller.net

Forum: Projekte & Code Türklingel per ESP32 (WLAN, SIP) an Fritzbox


Autor: Christian T. (christian_t)
Datum:

Bewertung
7 lesenswert
nicht lesenswert
Hallo zusammen,

jetzt komme ich endlich dazu, mein Projekt hochzuladen:
https://github.com/chrta/sip_call

Funktion
Wenn es an der Tür klingelt, wird eine beliebige Nummer in der lokalen 
Fritzbox angerufen (Rundruf per **9 geht auch).

Firmware
Dabei handelt es sich um ein C/C++ (gemischt) Projekt auf Basis vom 
aktuellen ESP-IDF (also freertos, lwip, mbedtls). Das SIP-Protokoll ist 
selbst implementiert.
Es ist seit ein paar Monaten in Betrieb und scheint zuverlässig zu 
funktionieren.
Alle Einstellungen werden dabei statisch in die Firmware einkompiliert.
Mit "make menuconfig" müssen SSID, WLAN-Passwort, SIP-Zugang etc gesetzt 
werden.

Die Hardware besteht aus einem beliebiges ESP32-Board, getestet mit 
http://www.watterott.com/de/ESP-WROOM32-Breakout, 2 Optokopplern und 2 
Widerständen.
Da ich das ESP32-Board direkt aus dem Klingeltrafo versorge, habe ich 
noch einen Brückengleichrichter, einen dicken Elko und eine kleine 
Schaltreglerplatine im Einsatz.


Das Projekt ist "Work in Progress", aber der aktuelle Stand funktioniert 
an einer Fritzbox 7490.


Gruß,
Christian

: Bearbeitet durch User
Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,
Währe das auch mit einem ESP8266 gegangen ?

LG Christof

Autor: Christian T. (christian_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, das würde auch mit einem ESP8266 funktionieren.
Wahrscheinlich ist nur die Latenz (Klingeln erkennen -> Anruf auslösen) 
etwas größer.

Autor: Joachim B. (jar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian T. schrieb:
> Funktion
> Wenn es an der Tür klingelt, wird eine beliebige Nummer in der lokalen
> Fritzbox angerufen (Rundruf per **9 geht auch).

interessant, mit Clip?
Das man im Telefon sieht die Nummer der Türklingel, bzw. Türklingel im 
Telefon hinterlegen kann zur Nummer?

Autor: Christian T. (christian_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> interessant, mit Clip?
> Das man im Telefon sieht die Nummer der Türklingel, bzw. Türklingel im
> Telefon hinterlegen kann zur Nummer?

Ja, das geht.

In der Anrufnachricht (SIP INVITE) wird zusätzlich eine beliebige 
Zeichenkette übertragen. Per "make menuconfig" kann man die setzen, 
siehe 
https://github.com/chrta/sip_call/blob/master/main...

Bei mir steht zB "Türklingel" im Display, ohne dass man die 
Telefonnummer der Türklingel unter dem Namen im Telefon (oder der 
Fritzbox) abspeichern muss.

: Bearbeitet durch User
Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deinen SIP-Connector muss ich mir mal reinpfeifen ich hoffe ich verstehe 
ihn. Der Umsetzungsansatz hat echt was. Könnte man auch vom Telefon aus 
die Tür öffnen ?

Autor: Christian T. (christian_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen Türöffner anzuschliessen dürfte nicht so schwer sein.

Wenn man den Anruf von dem ESP32 annimmt, kann man danach Tasten auf dem 
Telefon drücken.
Diese werden jetzt schon als SIP INFO-Paket an den ESP32 gesendet. In 
dem Paket steht direkt die gedrückte Taste im Klartext. Das Parsen und 
Auslösen einer Aktion fehlt noch.

Autor: Jörch B. (captainbee)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schomma sehr geil, sowas such ich seit Jahren. Cool, alle Daumen hoch !

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja super gut

Autor: Christian T. (christian_t)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Danke für das Lob :)

Das Drücken einer Taste am Telefon wird jetzt auch erkannt und an einen 
Event-Handler übergeben: 
https://github.com/chrta/sip_call/blob/master/main...

An der Stelle könnte man zB eine PIN parsen und dann das 
Türöffner-Relais ansteuern.

Autor: MicroWolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein tolles Projekt!

Bin ich eigentlich nur drüber gestolpert, weil ich nach boost::sml 
gesucht hatte.

Nun hat mir das als boost::sml Beispiel zwar nix gebracht (kommt da noch 
mehr?), dafür aber trotzdem angeregt, mal nachzuschauen, ob hier noch 
ein ESP32 rumfliegt...

Autor: Christian T. (christian_t)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
MicroWolfgang schrieb:
> Nun hat mir das als boost::sml Beispiel zwar nix gebracht (kommt da noch
> mehr?),

Mein Plan ist es die SIP-Statemachines im SipClient mit boost::sml zu 
machen und diverse switch-case-Blöcke loszuwerden. Das wird wohl noch 
eine Weile dauern.

: Bearbeitet durch User
Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,
Ich sehe du hast gelernt wie man C++ programmiert.
Ich kapituliere um deinen Code zu durchschauen reicht mein C++ Wissen 
nicht.

Autor: Christian T. (christian_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christof Rieger schrieb:
> Ich kapituliere um deinen Code zu durchschauen reicht mein C++ Wissen
> nicht.

Der Code ist auch noch nicht dokumentiert, von daher ist die 
Einstiegsschwelle schon etwas höher, und besonders schön ist er auch 
noch nicht.

Was willst du denn machen? Um einen Türöffner anzusteuern solltest du 
nur den zuletzt hinzugekommenen Eventhändler in der main.cpp verändern 
müssen, also sobald SipClientEvent::Event::BUTTON_PRESS kommt, die 
Tasten merken und bei Bedarf einen GPIO ansteuern.

Autor: Frank K. (fchk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner Tip: Statt zwei PC817 Optokopplern kannst Du auch einen PC814 
einsetzen. Der hat gleich antiparallele LEDs eingebaut und kann mit AC 
in beiden Polaritäten verwendet werden. Damit wird es noch kleiner und 
noch einfacher.

Siehe z.B.

https://www.vishay.com/docs/83523/83523.pdf

fchk

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schaut es denn mit der Überlegung auch noch audio in beide 
richtungen zu Implementieren?

Eigentlich sollte das auch simpel sein; Micro; => 4kHz samplen mit nem 
Timer und 8 bit? das ganze uLaw codieren, was ja quasi kreatives PCM 
ist? und die andere Richtung entweder einen zusätzlichen DA wandler per 
i2s oder auch in weichware aufm PWM pin?
Theoretisch sollte das machbar sein oder?

Autor: Ralf B. (Firma: Scorptech) (mad_scorp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tolles Projekt, alle Achtung.

Autor: Christian T. (christian_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank K. schrieb:
> Kleiner Tip: Statt zwei PC817 Optokopplern kannst Du auch einen PC814
> einsetzen.

Danke, das habe ich jetzt ins Readme geschrieben. Ich hatte nur noch ein 
paar PC817 hier rumfliegen, daher hab ich die benutzt.

Martin schrieb:
> Wie schaut es denn mit der Überlegung auch noch audio in beide
> richtungen zu Implementieren?
>
> Eigentlich sollte das auch simpel sein; Micro; => 4kHz samplen mit nem
> Timer und 8 bit? das ganze uLaw codieren, was ja quasi kreatives PCM
> ist? und die andere Richtung entweder einen zusätzlichen DA wandler per
> i2s oder auch in weichware aufm PWM pin?
> Theoretisch sollte das machbar sein oder?

Audio hab ich nicht auf meiner Liste, aber ich nehme natürlich gerne 
Pull-Requests an :)

Erstmal müsste das SDP-Paket angepasst werden: 
https://github.com/chrta/sip_call/blob/master/comp...

Empfangen werden die Audio-Daten in 
https://github.com/chrta/sip_call/blob/master/comp... 
aber bisher verworfen. Ich denke um Audio zu versenden, könnte man das 
über den bestehenden socket im rtp_task machen.

Autor: Jörch B. (captainbee)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, wie sich das entwickelt. Zum Code : Ja, OK bissi Doku fehlt, aber 
sieht ansonsten schonmal ganz sauber aus.
Schade dass ich grad keine Zeit dafür hab, sonst würd ich gern mit 
einsteigen, weil GENAU SOWAS suche ich schon länger.
Weiter so, gruß

Autor: Jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian T. schrieb:
> Frank K. schrieb:
>> Kleiner Tip: Statt zwei PC817 Optokopplern kannst Du auch einen PC814
>> einsetzen.
>
> Danke, das habe ich jetzt ins Readme geschrieben. Ich hatte nur noch ein
> paar PC817 hier rumfliegen, daher hab ich die benutzt.

Ein einziger PC817 sollte reichen. Dazu eine 1N4148 Diode antiparallel 
verschaltet, damit die maximale Sperrspannung des PC817 nicht 
überschritten wird. Dann bekommt der ESP statt 50 Hz ein 25 Hz Signal.

>> Eigentlich sollte das auch simpel sein; Micro; => 4kHz samplen mit nem
>> Timer und 8 bit? das ganze uLaw codieren, was ja quasi kreatives PCM
>> ist?

In Europa ist eher A-Law üblich, μ-Law in Amerika. Daher klingt A-Law 
für empfindliche europäische Ohren vertrauter. Für unempfindliche Ohren 
ists egal :). Die FritzBox kann beides und ein paar mehr 
https://ch.avm.de/service/fritzbox/fritzbox-7490/w...

Vielleicht hilft https://github.com/deftio/companders






und die andere Richtung entweder einen zusätzlichen DA wandler per
>> i2s oder auch in weichware aufm PWM pin?

>> Theoretisch sollte das machbar sein oder?
>
> Audio hab ich nicht auf meiner Liste, aber ich nehme natürlich gerne
> Pull-Requests an :)
>
> Erstmal müsste das SDP-Paket angepasst werden:
> https://github.com/chrta/sip_call/blob/master/comp...
>
> Empfangen werden die Audio-Daten in
> https://github.com/chrta/sip_call/blob/master/comp...
> aber bisher verworfen. Ich denke um Audio zu versenden, könnte man das
> über den bestehenden socket im rtp_task machen.

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,

erstmal danke für das erstellen und sharen dieses Projekts. Ich hab mich 
jetzt auch mal an die Umsetzung gemacht, wird bei mir hardwareseitig ein 
wenig anspruchsvoller, da ich sehr wenig Power aus meinem 
Handsprechhörer bekomme. Aber da hab ich schon Ideen und denke, ich 
krieg das schon hin.

Leider fehlt mir dafür ein bissel die Softwareseite. Was erstmal nicht 
schlimm ist, da Du ja schon sauber vorgearbeitet hast. Allerdings hab 
ich Dein Programm getestet und dabei klingelt es auf meinem Telefon nach 
dem Auslösen permanent und findet nicht das Ende nach 5000 (ms?). Das 
einzige, was ich dann tun kann, ist auf jedem Mobilteil einzeln auf 
'ablehnen' klicken (oder auf 'annehmen' und anschließend wieder 
auflegen). Danach kriege ich einen dauerhaft durchlaufende Ausgabe (im 
mingw32 Monitorwindow). Nur ein beherzter Druck auf den Hardware-Reset 
beim ESP32 bringt diesen wieder in den Bereitschaftsmodus.

Ist Dir das im Zuge Deiner Entwicklung mal untergekommen und fandest Du 
eine Lösung? Ich habe versucht, mich im Code zurechtzufinden, um ggfs. 
ein paar Print-Statements an den vermeintlich richtigen Stellen 
einzubauen zur Überwachung, aber da bin ich grandios gescheitert.

Danke!

Joe

Autor: Christian T. (christian_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jack,

> Ein einziger PC817 sollte reichen. Dazu eine 1N4148 Diode antiparallel
> verschaltet, damit die maximale Sperrspannung des PC817 nicht
> überschritten wird. Dann bekommt der ESP statt 50 Hz ein 25 Hz Signal.

Ja, danke. Das werde ich noch ändern, sobald ich wieder was daran mache.

Hallo Joe,

du könntest in der Zeile 
https://github.com/chrta/sip_call/blob/master/main... 
eine Ausgabe einfügen. Evtl. steht das Klingelsignal länger am Eingang 
an? Dann wird der Timeout auch immer weiter verlängert.

Die Dauer, die das Telefon max Klingeln sollte ist per "make menuconfig" 
einstellbar, siehe 
https://github.com/chrta/sip_call/blob/master/main...
Der Standardwert ist 7000 Millisekunden.

Autor: Jürgen L. (temp1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In diesem Thread hatte ich mal eine Alternative vorgestellt, die 
deutlich einfacher ausgefallen ist.
Beitrag "Sipdial per ESP8266 an Fritzbox"
Was mir hierbei aufgefallen ist, der esp8266 ist deutlich schneller beim 
WLAN-Verbinden nach dem Tiefschlaf als der ESP32. Der esp8266 speichert 
sich selbst die letzten Verbindungsdaten intern ab. Dieses Vorgehen 
wurde aber beim ESP32 noch nicht implementiert. Bzw. kann auch sein, 
dass ich nicht weiss wie das beim ESP32 geht. Jedenfalls habe ich 0,5 
bis 0,8sec mit dem ESP8266 und knapp 3s mit dem ESP32. Wie sind denn die 
Zeiten bei diesem Projekt hier, was ja eine komplett andere 
Build-Umgebung hat?

Autor: Christian T. (christian_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Deepsleep habe ich noch nicht experimentiert. Aber ich glaube, dass 
es auch so um die 3 bis 5 Sekunden dauert, um sich am AP anzumelden und 
eine IP-Adresse per DHCP zu bekommen.
Ich warte noch, dass Lightsleep(WLAN) für den ESP32 im ESP-IDF 
implementiert wird. Damit sollte es dann genauso wie beim ESP8266 
funktionieren.  Mit dem aktuellen Modemsleep habe ich ca 100mA 
kontinuierlichen Strombedarf bei 240MHz...

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian T. schrieb:

> Hallo Joe,
>
> du könntest in der Zeile
> https://github.com/chrta/sip_call/blob/master/main...
> eine Ausgabe einfügen. Evtl. steht das Klingelsignal länger am Eingang
> an? Dann wird der Timeout auch immer weiter verlängert.
>
> Die Dauer, die das Telefon max Klingeln sollte ist per "make menuconfig"
> einstellbar, siehe
> https://github.com/chrta/sip_call/blob/master/main...
> Der Standardwert ist 7000 Millisekunden.

Hallo Christian,

ich konnte zwar jetzt ein paar Sachen herausfinden, aber richtig voran 
hat es mich nicht gebracht.

Da auch ich die Vermutung habe, dass der Pin falsch ausgelesen wird, 
wollte ich dessen Status ausgeben. Das ist mir aber nicht gelungen, wie 
gesagt, ich habe nur minimale C Erfahrung.

Im Moment habe ich alles erstmal nur auf einem Board aufgebaut und 
simuliere das Klingeln durch ne Drahtverbindung mit der ich den 
Input-Pin kurz auf gnd ziehe, vorher und nachher wird er per Pull up auf 
3.3V gehalten. Wenn das nicht richtig erkannt wird, dann kann das schon 
das Verhalten erklären. Drum würde ich gern den Status des Pins 
erfahren. Nur wo im Code kann ich den abgreifen und ausgeben?

Danke!

VG

Joe

Autor: renne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> die andere Richtung entweder einen zusätzlichen DA wandler per
> i2s oder auch in weichware aufm PWM pin?

siehe 
https://github.com/earlephilhower/ESP8266Audio#sof.... 
Ich empfehle noch einen Tiefpass. ;)

Alternativ geht auch I2S mit einem MAX98357A (siehe 
https://www.adafruit.com/product/3006).

I2S-input wird gerade implementiert (siehe 
https://github.com/esp8266/Arduino/issues/4496, 
https://github.com/joextodd/listener/issues/3)

Das SPH0645LM4H ist eine I2S-Mikrofon (siehe 
https://www.adafruit.com/product/3421).

Autor: Gerhard J. (bobdermeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joe schrieb:
> ...Allerdings hab ich Dein Programm getestet und dabei klingelt es auf meinem 
Telefon nach
> dem Auslösen permanent und findet nicht das Ende nach 5000 (ms?)...

Das Problem hatte ich auch. In 
https://github.com/chrta/sip_call/blob/68cb26ffad0... 
muss statt des * ein / hin, dann passt die Zeit - zumindestens bei mir. 
Andernfalls klingen die Telefone eine gefühlte Ewigkeit und der 
Klingelknopf wird auch erst nach dieser Ewigkeit wieder freigeschaltet.

Ich habe das ganze Projekt geforkt. Neben diesem Bugfix habe ich auch 
mal einen Türöffner implemetiert. Mit Audiogeschichten hab ich 
allerdings noch gar keine Erfahrung und Momentan auch nicht die Zeit 
mich da einzuarbeiten.

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerhard J. schrieb:
> Das Problem hatte ich auch. In
> 
https://github.com/chrta/sip_call/blob/68cb26ffad0...
> muss statt des * ein / hin, dann passt die Zeit - zumindestens bei mir.
> Andernfalls klingen die Telefone eine gefühlte Ewigkeit und der
> Klingelknopf wird auch erst nach dieser Ewigkeit wieder freigeschaltet.

Vielen Dank für diese Lösung, jetzt funzt es bei mir auch!

Wo kann man denn Deinen Fork finden?

VG

Joe

Autor: Gerhard J. (bobdermeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Forks findest du bei GitHub immer oben rechts, lohnt sich meistens da 
mal zu schauen ob schon jemand ein Projekt in eine Richtung 
weiterentwickelt hat die zu zu den eigenen Anforderungen passen. In 
diesem Fall führt dich das zu https://github.com/MeisterBob/sip_call

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.