Hallo,
habe heute nach mehrmaligem Aufsetzen endlich die Anbindung der Türklingel an die Fritzbox geschafft. Jetzt klingeln bei Betätigung der Klingel alle Telefone. Die Telefone C4/6 zeigen auch ein Bild einer Webcam.
Der iobroker läuft bei uns nur parallel zur Hausautomation mit EIB/KNX um einige unabhängige übergeordnete Funktionen zu übernehmen. Eingebunden ist u.a. KNX über den entsprechenden Adapter.
Es gibt unterschiedliche Methoden/Anleitungen, um Klingelsignale an die Fritz!box zu übermitteln, z.B. einen a/b Adapter (KlingelPaul), Anbindung über WLAN (ESP 8266, ct-Artikel) oder eine spezifizierte Türsprechstelle (DoorPI).
Da das Betätigen der Türklingel aber auf den Haus-Bus übertragen übertragen wird, sollte auch eine reine Software-Lösung möglich sein.
Über den Adapter TR-064 habe ich eine Realisierung nicht hinbekommen.
Als Alternative bot sich eine Anbindung als SIP-Türsprechstelle (Telefon) an. Hierfür eignet sich der Adapter Asterisk. Nach/Vor dessen Installation im iobroker muss noch das Programm installiert werden.
Asterisk installieren
sudo apt-get install lame
sudo apt-get install sox
sudo apt-get install libsox-fmt-mp3
sudo apt-get install ffmpeg
sudo apt-get install asterisk
Im Adapter (Instanz) in iobroker dann noch anpassen:
-
Seite
Server (dieser)
127.0.0.1
Nutzerdaten so lassen
"Create Asterisk config files (once)" anklicken.
-
Seite
Zugangsdaten Fritzbox (SIP) (merken, um sie nachher in der Fritzbox einzugeben).
Dann Speichern und die vom Adapter erstellten Konfigurationsdateien zum Asterisk verschieben:
sudo mv /tmp/extensions.ael /etc/asterisk/extensions.ael
sudo mv /tmp/manager.conf /etc/asterisk/manager.conf
sudo mv /tmp/pjsip_fritzbox.conf /etc/asterisk/pjsip.conf
sudo mv /tmp/sip_fritzbox.conf /etc/asterisk/sip.conf
sudo mv /tmp/rtp.conf /etc/asterisk/rtp.conf
Bei Auswahl von pjsip anstelle sip ist es eine andere Konfigurationsdatei. Ggf. im Verzeichnis /tmp nachschauen.
Asterisk neu starten mit
sudo /etc/init.d/asterisk restart
Mit
sudo asterisk -vvvr
kann man die Ausgabe des Asterisk nachverfolgen (z.B. Restart der Instanz im iobroker). Hier werden Fehler angezeigt.
Ich hatte das Problem, dass der Asterisk keine Verbindung bei parallel installiertem TR-064 Adapter hatte. Außerdem hatte ich zwei Fehlermeldungen.
Die Ursache eines Verbindungsfehler vom Asterisk zum iobroker lag an einer falschen Konfiguration (der Raspberry läuft bei uns mit Raspbee Image). Änderung in der Konfigurationsdatei oder Ergänzung "iobroker 127.0.0.1" in der host Datei.
In der Fritzbox muss man dann eine Türsprechstelle einrichten:
Telefonie > Telefoniegeräte> Neues Gerät einrichten >Türsprechstelle
LAN/WLAN (IP) auswählen
Auf der folgenden Seite
Klingeltaste 1 / 11 / alle Telefone / Eigener 1 (ein eigener Klingelton kann in einem der DECT-Telefone - s. dort - hochgeladen werden).
Name z.B. tuerklingel
Live Bild: Aktuelles Bild der Webcam.
Alternativer Klingelton
Nicht alle Webcams bieten ein Einzelbild zum Download an. Instar Kameras können dies zum Beispiel.
Auf dem zweiten Tab unter Anmeldedaten dann die Daten aus der iobroker-Asterisk-Instanz (von der zweiten Seite in der, s.o.) eingeben.
Im iobroker kann man dann die Verbindung testen.
In Objekte callerid (11), telnr (**9) und nachricht ("Es klingelt an der Haustür") eintragen und Aufbau mit call testen. **9 geht an alle Telefone der Fritzbox.
Wenn es nicht funktioniert, kann, wie oben geschrieben mit parallel laufendem
sudo asterisk -vvvr
die (Fehler-) Ausgabe von Asterisk beobachtet werden.
Nun noch ein Skript.
Definiert wird hier das Telegramm der Klingel (knx), bei pos. Signal das Skript Klingeln gestartet, hier wird ein Anruf initiert und danach die Tasteingabe alle 0,5 Sekunden kontrolliert. Wenn die 5 am Telefon eingegeben wird, könnte ein Türöffner getriggert werden (haben wir nicht).
var Klingel = "knx.0.hier.unten.Klingel",
Klingelval;
on({id: Klingel, change: "any"}, function (obj) {
Klingelval = getState(Klingel).val;
if (Klingelval ==true) {
Klingeln();
}
console.log('Result: ' + Klingelval);
})
function Klingeln() {
// call telephone nummber and play text message as audio
var number = "**9";
var callerid = '11'; // optional, if not set anonymous call
var msg = "Es klingelt an der Tür! ";
sendTo('asterisk.0', "dial", { telnr: number, callerid: callerid, text: msg, timeout: 15000}, (res) => {
setState("asterisk.0.dialout.dtmf", "");
console.log('Result: ' + JSON.stringify(res));
var i;
dtmf_callback();
});
}
function Sleep(milliseconds) {
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
async function dtmf_callback() {
for (i = 0; i < 30; i++) {
await Sleep(500);
var dtmf = JSON.stringify(getState("asterisk.0.dialout.dtmf").val);
if (dtmf.length>2) {
if (dtmf.substring(dtmf.length - 1, dtmf.length)=="5") {
console.log("Türöffner");
} else {
console.log(dtmf);
}
setState("asterisk.0.dialout.dtmf", "");
}
}
}