Wie eine Türklingel Telefonanrufe auslösen kann

Ein Update hierzu gibt es hier

Ein echtes Vater / Sohn Projekt das echt viel Spaß gemacht hat. Die Löt- und Arduinokenntnisse von meinem Sohn wurden kombiniert mit meine bescheidenen MQTT Kenntnissen und meiner Asterisk Anlage.

Das Problem

Wenn jemand in unserem Haus klingelt und man sich oben in einem der Zimmer mit geschlossener Zimmertür aufhält dann hört man nichts. Das Ziel war das es ein einem bestimmten Zimmer eine Benachrichtigung gibt. Das Zimmer ist auch mit einem Telefon ausgestattet.

Der Wunsch

Schon seit langem wollte ich die Klingel “irgendwie” mit dem LAN verbinden hatte aber noch nicht die richtige Idee.

Dann kam dieser Heise Artikel. Dort sollte zwar eine Fritzbox angeschlossen werden aber es gab auch die Möglichkeit eine MQTT Nachricht zu versenden.

Das Netz für die ganzen IOT Geräte ist vollkommen abgeschottet. Das Netz für Telefonanlage ist ebenfalls abgeschottet darf aber in das IOT Netzwerk. In jedem Netzwerk ist ein RaspberryPi mit einem MQTT Server

Die Bauteile waren meinem Sohn aufgrund seiner Arduino Workshop schon bekannt. Die Kosten waren im 10 Euro Bereich. Der Bauplan war für Ihn recht einfach und sieht gemäß CT so aus

Das ganze wurde noch etwas provisorisch an der Klingel angeschlossen

Das Programm für den ESP8266 ist recht simpel.

  #include <ESP8266WiFi.h>
  #include <PubSubClient.h>
  #define WLAN_SSID "wlan-it"
  #define WLAN_PASSWORD "xxxxxx"
  #define MQTT_HOST "iot-mqtt.yourlan.lcl"
  #define MQTT_USER "doorbell"
  #define MQTT_PASSWORD "geheim"
  #define MQTT_PORT 1883
  #define MQTT_TOPIC "doorbell/ring"
  #define MQTT_MESSAGE "true"

  WiFiClient wifiClient;
  PubSubClient mqtt_client(wifiClient);

  void setup_wifi() {
    WiFi.begin(WLAN_SSID, WLAN_PASSWORD);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
    }
  }

  void connect_mqtt() {
    while (!mqtt_client.connected()) {
      if (mqtt_client.connect("Klingelanlage", MQTT_USER, MQTT_PASSWORD)) {
      } else {
        delay(5000);
      }
    }
  }

  void setup() {
    setup_wifi();
    mqtt_client.setServer(MQTT_HOST, MQTT_PORT);
    if (!mqtt_client.connected()) {
      connect_mqtt();
    }
    mqtt_client.loop();
    mqtt_client.publish(MQTT_TOPIC, MQTT_MESSAGE);
    delay(4000);
    ESP.deepSleep(0);
  }

  void loop() {
  }

Es meldet sich im unsicheren IOT WLAN an und versendet eine MQTT Nachricht an den dortigen MQTT Broker.

Die Asterisk Telefonanlage befindet sich auf einem weiteren Rapsberri Pi. Dort läuft der MQTT-Launcher von jpmens und immer wenn das relevante Topic im IOT VLAN erscheint kopiert dieser eine sogenannte Call Datei in das richtige Verzeichnis für die Telefonanlage. In der Call Datei steht welche Telefonnummer für wie lange angerufen werden soll:

 Channel: SIP/Wunschummer
 Callerid: Pforte
 MaxRetries: 0
 WaitTime: 14
 Context: internercontext
 Extension: Wunschnummer
 Priority: 2

Wenn es also klingelt “wacht” der Doorbellbaustein auf und sendet eine MQTT Nachricht. Der Asteriskserver “hört” das und ruft die richtige Nummer an.

Bis jetzt läuft das die ersten Tage schon recht stabil

Weitere Ideen:

  • V2 Ich möchte im Urlaub benachrichtigt werden wenn jemand klingelt und ein Bild der Videokamera zu gesendet bekommen.
  • V3 die alte Gegensprechanlage wird an Telefon angeschlossen und kann angerufen werden.