Silent Doorbell

Da ich grundsätzlich die Glocke der Gegensprechanlage abgedreht habe, war dennoch die Überlegung zu loggen, wenn und wann jemand anleutet.

Um dies weiter auszubauen war angedacht dies auch zu visualisieren. Somit könnte ich trotzdem reagieren, ohne den schrecklichen Ton der Glocke hören zu müssen (den im übrigen auch die Person hört die anleutet).

Zunächst war es nötig die Gegensprechanlage zu analysieren. Glücklicherweise fand ich einen Schaltplan, wie diese verkabelt ist. Diesen habe ich bereits benötigt um den Türöffner mit einer 433 MHz Fernbedienung zu schalten und um die Glocke zu unterbrechen. Den Schaltplan gibt es hier.

Nun war die Idee, die Klingel auf einen Input eines ESP8266 zu legen. Sobald dort eine Pegeländerung erkannt wird, soll der ESP sein Programm ausführen. Hierfür steuer ich einen Ledstreifen im WZ an, welcher mit WLED läuft. WLED unterstützt eine HTTP Request API. Somit muss der ESP nur ein paar Befehle per http an den Controller mit WLED senden. Zusätzlich ist es nice to have, dass man am Handy eine Benachrichtigung bekommt. So kann man sicher sein, ob z.B. der Zustelldienst angeleutet hat oder nicht. Deshalb habe ich noch den CallMeBot für Whatsapp hinzugefügt. Dieser Dienst sendet mir eine Whatsapp Nachricht an mein Smartphone, sobald die Klingel gedrückt wurde.

Da die Klingel mit Wechselspannung versorgt wird, musste ich noch einen Brückengleichrichter und ein Relais hinzufügen, um 1. die Pegeländerung mit dem Relais zu realisieren, 2. von der Gegensprechanlage galvanisch getrennt zu sein und 3. das Gleichspannungsrelais bei Tastendruck korrekt zu versorgen.

#include 

const char* ssid = "WLAN Name";
const char* password = "WLAN Passwort";
const char* host = "192.168.0.6";        //IP von WLED
const char* host2 = "api.callmebot.com"; // Domain vom callmebot

const int buttonPin = D6;           //Pin am ESP wo der Taster mit 10k gegen Maße geschalten ist
int buttonState = LOW;              //Pin ist zu Begin LOW
int lastButtonState = LOW;          //Variable lastButtonState ist zu Begin LOW

unsigned long lastDebounceTime = 0; // last toggle
unsigned long debounceDelay = 50;   // debounce time

void setup() {
  Serial.begin(115200);
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  IPAddress local_IP(192, 168, 0, 50); // Fixe IP Adresse des ESP
  IPAddress gateway(192, 168, 0, 1);   // Gateway(IP des Modems / Routers)
  IPAddress subnet(255, 255, 255, 0);    // Subnetzmaske für den ESP
  WiFi.config(local_IP, gateway, subnet);
}

int vartest = 0;   //Variable um das Licht ein paar mal auf und abzudrehen siehe while Schleife

void loop() {
  int reading = digitalRead(buttonPin); //read

  if (reading != lastButtonState) // If the switch changed
  {
    lastDebounceTime = millis();  // reset the debouncing
  }
  //check if debounce time > 50ms
  if ((millis() - lastDebounceTime) > debounceDelay)
  { if (reading != buttonState)
    { buttonState = reading;
      if (buttonState == LOW)
      {
        Serial.println("button pressed");
        SendDispatch();
      }
    }
  }
  lastButtonState = reading;       // save the reading
  vartest = 0;
}


void SendDispatch() {
  WiFiClient client;
  const int httpPort = 80;

  if (!client.connect(host2, httpPort)) {
    return;
  }

  String url2 = "/whatsapp.php?phone=+436641234567&text=...knock,%20knock,%20knock&apikey=111111";	// Telefonnummer; Textnachricht und API Key ändern
  client.print(String("GET ") + url2 + " HTTP/1.1\r\n" + "Host: " + host2 + "\r\n" + "Connection: close\r\n\r\n");
  unsigned long timeout = millis();

  while (vartest < 10) {  //10 durchläufe, also 5x aufdrehen, 5x abdrehen
    delay(1000);
    WiFiClient client;
    const int httpPort = 80;

    if (!client.connect(host, httpPort)) {
      return;
    }

    String url = "win&T=2";
    client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
    unsigned long timeout = millis();

    vartest++;
  }
}