Doorline / Türklingel / Fritzbox

Begonnen von plin, 29 Januar 2017, 18:47:23

Vorheriges Thema - Nächstes Thema

plin

Wer auch immer eine Doorline als Türsprechanlage an einer Fritzbox betreibt und die Doorline auf "Direktannahme" eingestellt hat, kennt vermutlich das Problem der 30 Sekunden lang klingelnden Telefone.

Die Idee
Wenn jemand an der Tür klingelt, klingeln die in der Fritzbox definierten Telefone und

  • entweder gehe ich ans Telefon und höre wer da ist oder
  • ich gehe zur Tür und die Telefone hören auf zu klingeln.
Das setzt voraus, dass es einen Türkontakt an der Haustür (bei mir Device HaustuerStatus) gibt.

Problem

Der Fritzbox Callmonitor sieht keine internen Anrufe. Die Betätigung der Türklingel geht also an FHEM vorbei. Ich habe versucht das Modul 96_SIP.pm zu nutzen (siehe https://forum.fhem.de/index.php/topic,40219.msg556323/topicseen.html#msg556323), der SIP Client ist aber nicht in der Lage einen eingehenden Anruf an FHEM weiterzuleiten. Viel probiert, ohne Erfolg, also braucht man einen anderen Ansatz: Asterisk.

Erster Schritt
Asterisk installieren

Fritzbox

In der Fritzbox muss ein neues Telefoniegerät vom Typ LAN/WLAN angelegt und ein Passwort vergeben werden. Das erzeugt ein neues internes Device im Bereich **62x, bei mir war's die 624.

Asterisk

Der Pfad für die Config-Files ist z.B. /etc/asterisk

sip.conf (innerhalb der [general] Section) folgendes einfügen:


context=fritzbox
register => 624:passwort@192.168.0.1


624 ist die Nebenstelle
passwort das in der Fritzbox vergebene Passwort
192.168.0.1 die IP-Adresse der Fritzbox

Am Ende der extensions.conf folgendes einfügen:


[fritzbox]
exten => s,1,Wait(1)                    ; Wait a second, just for fun
exten => s,n,Verbose(2,call from ${CALLERID(num)})
exten => s,n,System(/opt/bin/fhemsetring.pl ${CALLERID(num)})
exten => s,n,Wait(100)                  ; Wait a second, just for fun
exten => h,1,Log(VERBOSE,Caller ${CALLERID(all)} hung up.)
exten => h,n,System(/opt/bin/fhemsetring.pl none)
exten => h,n,Hangup()


/opt/bin/ ist mein Standard-Verzeichnis für Scripte

Testen kann man mit

asterisk -vvvc

Da kommt man nur mit <ctrl>C raus. Wenn asterisk als deamon gestartet ist kann man sich mittels rasterisk konnektieren. Dann geht auch 'exit'.

Im Verzeichnis /opt/bin/ die Script fhemsetring.pl anlegen:


#!/usr/bin/perl -w
# in FHEM den Status der Tuerklingel auf 'ring' setzen

# Always use strict and warnings
use strict;
use warnings;
use Net::Telnet ();

# Declare all
my $callerid = shift;
my $machinename = "192.168.0.10";
my $t_net;
my @Result;
my $cmd;

# Start Code
$t_net = new Net::Telnet (Timeout => 60, Port => 7072 ) or die "Failed to create Telnet instance!";
$t_net->open($machinename);
$cmd = "";
if ( $callerid eq "none" ) {
   $cmd = $cmd."set AsteriskCall624 listen; ";
} else {
   $cmd = $cmd."set AsteriskCall624 ring; ";
}
   $cmd = $cmd."setreading AsteriskCall624 caller $callerid; ";
$cmd = $cmd."exit";
@Result = $t_net->cmd($cmd);


Meine FHEM-Instanz ist unter der 192.168.0.10 zu erreichen.

In FHEM ein Dummy-Device anlegen.

define AsteriskCall624 dummy

Der von der Script gesetzte state dieses Decices ist entweder 'ring' oder 'listen'; das Reading 'caller' ist die Nummer des Anrufers (intern oder extern).

Die Rufkette für die Türklingel wird in der Fritzbox um das neue Telefon erweitert, damit der Call erkannt wird..

Damit ist die Fritzbox nun grundsätzlich in der Lage den internen Anruf zu erkennen.

Telefonat heranholen

Das Modul 96_SIP.pm kann zwar den eingehenden Anruf nicht erkennen, kann aber sehr wohl einen Anruf absetzen und ein Audio-File abspielen. Das geht z.B mit
set FritzSipClient  call *09 5 /opt/fhem/www/images/Gong.wav
Also wird das Modul runtergeladen (siehe Seite 6 des Threads https://forum.fhem.de/index.php/topic,61071.0.html). Dort findet man auch Hinweise zur Erzeugung von Audio-Files im erforderlichen Codec. Das runtergeladene Modul nach /op/fhem/FHEM kopieren und in FHEM mittels relaod 96_sip.pm laden.

Für diesen SIP-Client wieder ein LAN/WLAN-Telefon in der Fritzbox einrichten. Ergab bei mir die Nebenstelle 620.
Dann in FHEM definieren

define FritzSipClient SIP 192.168.0.1 620 password

620 ist die Nebenstelle in der Fritzbox, password ist das in der Fritzbox für die 620 eingerichtete. Die restlichen Attribute müsst ihr prüfen und für Euer Umfeld setzen, sonst gibt's evtl. Probleme. Und das passende AudioFile muss angelegt werden: bei mir  /opt/fhem/www/images/Gong.wav.

Jetzt fehlen noch ein paar Einträge in FHEM

define HaustuerStatusVar dummy

'HaustuerStatus' ist der Türkontakt der Haustür. **11 die Nebenstelle der Doorline.

define TuerklingelAus DOIF (([HaustuerStatus:state] eq "closed") and ([AsteriskCall624:state] eq "ring") and ([AsteriskCall624:caller] eq "**11"))
(set HaustuerStatusVar ring)
DOELSEIF
(([HaustuerStatus:state] eq "open") and ([HaustuerStatusVar:state] eq "ring"))
(set FritzSipClient  call *09 5 /opt/fhem/www/images/Gong.wav; set HaustuerStatusVar on)
DOELSEIF
(([HaustuerStatus:state] eq "closed") and ([HaustuerStatusVar:state] eq "on"))
(set HaustuerStatusVar off)

Das war's.
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

hdiessner

Hallo plin,

danke Dir für die Doku - ich habe es versucht nachzuvollziehen. Einrichtung in Fritzbox und Asterisk-Installation auf dem PI erfolgreich absolviert.
Beim Testlauf des Asterisk bekomme ich jedoch eine Meldung zur Deinem Skript im log, wenn ich von einem internen Telefon den Astersik anrufe (bei Dir **624):
pattern match read eof at /opt/fhem/fhemsetring.pl line 27

Ist das ein erwartetes Verhalten oder fehlt da noch etwas am Ende Deines Skriptes?
Die Readings des Dummys werden jedoch korrekt gesetzt.
Damit werde ich folgende Funktion realisieren: Bei Türklingeln wird ein Bild von der IP Cam an der Haustüre gemacht und per Push Nachricht an mich (Smartphone / Tablet / Brower Plug-in) geschickt.

Dazu gleich noch eine Frage zur Funktion bzw Einsatzmöglichkeit:
Ich würde gerne die Apothekerschaltung der Doorline automatisch aktivieren bzw. deaktivieren, abhängig vom Homestatus.
Laut Handbuch muss man die Doorline anrufen (zB **1 für den FON1 Anschluss an der Fritzbox) und nach dem Quittungston #11 eingeben und dann auflegen.
Deaktivieren: **1 -beep- #10 -auflegen-

Ist dies mit Asterisk und dem Dummy irgendwie realisierbar?
Meine Versuche mit FB_SIP.pm und SIP.pm schlugen leider fehl (Im Prinzip hab ich versucht mit SIP.pm folgendes zu wählen: **1,,#11 bzw. **1,,#10 - allerdings klappte dann zB das Auflegen nicht und im Ergebnis wurde die Schaltung nicht vorgenommen).

Danke und viele Grüße
Herwig

plin

Hallo Herwig,

ja, die pattern match Meldung taucht bei mir auch auf. Googlen führte zu folgender Lösung


...
$cmd = $cmd."exit";
$t_net->prompt("//");
@Result = $t_net->cmd($cmd);


Der zusätzliche Prompt-Command löst das Problem.


>Ist dies mit Asterisk und dem Dummy irgendwie realisierbar?
Mit Asterisk-Makros kann man einiges anstellen und man hat mehr Möglichkeiten als beim 96_SIP. Die Frage ist nur wie man den Trigger gestaltet. Google mal nach asterisk cli make call. Wenn du die Doorline über die Asterisk CLI umprogrammiert kriegst kann man schauen wie man die Brücke FHEM->Asterisk hinkriegt.

>... allerdings klappte dann zB das Auflegen nicht
Hast du beim Call die Anrufdauer mit angebeben?

VG plin
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

hdiessner

Hallo plin,

danke Dir! Das Skript läuft jetzt ohne Meldung. Damit hab ich bei Türklingeln jetzt immer das aktuelle Bild der IP Kamera vor der Haustüre auf dem Display meines Fritz!Fons.

Bei der Apothekerschaltung bin ich noch nicht weitergekommen, außer dass bei erfolgreichem Anruf (zB auf dem FritzFon) die Tonwahl-Töne für die Zeichenfolge #11 nicht zu hören sind - klar, dass sie dann auch die Doorline nicht umstellen. Aber auch da erfolgt kein Trennen der Verbindung, auch wenn in FHEM der STATE "call done" erscheint.

plin

UPDATE

Das neue SIP-Modul ist soweit gediehen, dass ich Asterisk deaktivieren konnte.

Die neue Lösung findet Ihr im Wiki unter https://wiki.fhem.de/wiki/SIP-Client#Fritzbox_.2B_Doorline_-_Telefonklingeln_beenden
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

sunshineh

Hallo,
ich bin so froh, dass ich diesen Post gefunden habe. Das klingt ja alles ziemlich professionell und ich hoffe, dass ihr mir mit meiner - dagegen einfachen Frage - weiterhelfen könnt.

Bei meinen Eltern habe ich einen Klingel-Knopf über den Raspberry (als SIP / IP / Registar) an meine Fritzbox angeschlossen. Das funktioniert bereits. Ich kann also aktuell den Klingelknopf drücken und die angeschlossenen Telefone signalisieren, das jemand an der Haustür ist.

Ich verwende aktuell Asterisk und habe meine Login-Daten für die Fritzbox als LAN/WLAN Gerät eingetragen.


Nun wollte ich noch zwei Dinge versuchen:


1)Das man den Raspberry (bzw. den SIP-Client) anrufen kann, dass dieser dann abnimmt und man dann am Telefon von dem man dann den Raspberry anruft z.B. die 25 (oder einen anderen Code) wählt, und der Raspberry dann z.B. ein angeschlossenes Relais schaltet.

2)Ebenso möchte ich den Raspberry nun als "Tuersprechanlage (LAN/WLAN)" - diese Option gibt es in der Fritzbox - dort einrichten. Durch diese Option hat man zudem die Möglichkeit, mehrere Klingeltaster einzustellen, so dass z.B. Klingeltaster1 die "Rufnummer 11" hat und Klingeltaster2 die "12" hat.

Ich stelle mir das so vor, dass der Raspberry (dessen SIP-Client) die Fritzbox bzw. deren interne IP-Türsprechanlagenfunktion anruft, und das die Fritzbox dann diesen Ruf entgegennimmt. Dann merkt der Raspberry, sein Ruf wurde angenommen und er sendet z.B. die Zeichenfolge "11", so dass die Türsprechanlagenfunktion der Fritzbox ihrerseits bestimmte Telefone klingeln lassen kann.

Wie kann ich diese Funktionalität mit Asterisk umsetzen? Bisher rufe ich ja nur als SIP-Client (Raspberry) die angeschlossenen Telefone an der Fritzbox an, sobald jemand den Klingelknopf drückt und der Raspberry das erkennt. Nun müsste er die Fritzbox-Tuersprechanlagenfunktion anrufen, dann nimmt diese den Ruf entgegen, der Raspberry müsste das merken und dann die "11" wählen , da diese in der Fritzbox Türsprechanlagenfunktion als Klingeltaste1 definiert ist.