Smarte Türklingel – Integration in FHEM

Da es bei unserer Wohnung öfters der Fall war, dass sich jemand einen Scherz erlaubte und mitten in der Nacht die Klingel betätigte, habe ich mich dazu entschlossen unsere analoge Klingel zu modernisieren. Konkret wird diese nun über Funk an meinem FHEM-Server angebunden und um eine Alexa Sprachausgabe und Push Benachrichtigung über die Alexa App erweitert. Die bestehenden Schalter an den Türen bleiben unverändert, es wird lediglich die Glocke entfernt und durch mein DIY-Sendemodul ersetzt. Die große Herausforderung in diesem Projekt bestand darin, dass an dem Ort wo mein Glocke montiert ist, keine weitere Spannungsquelle zur Verfügung steht.
Bei Betätigung der Klingel wird mithilfe eines 433 MHz Transmitter und einem Attiny84 eine Nachricht abgesetzt. Diese wird von einem 433 MHz Receiver an anderer Stelle empfangen und von einem weiteren Attiny84 verarbeitet und liefert somit den nötigen Input für meinem FHEM-Server.

Verwendete Bauteile

Folgende Bauteile wurden in diesem Projekt verwendet:

Bestandsaufnahme – Status Quo

Meine analoge Klingel ist klassisch aus Spule, Anker, Klöppel, usw. aufgebaut. Durch Anklemmen eines Multimeter konnte ich feststellen, dass bei Betätigten der Tasters eine Wechselspannung anliegt. Da eine Frequenz von 50Hz und eine Spannung von 14VAC gemessen wurde, war klar, dass ein Klingeltrafo verwendet wird.

Konzept

ESP8266 – FAIL

Am Anfang dachte ich mir, dass ich die Wechselspannung einfach gleichrichte und damit einen ESP8266 versorge, welcher sich in mein W-LAN einwählt und eine Meldung an FHEM absetzte. Leider wird bei kurzem Betätigten der Klingel so wenig Energie zur Vergnügung gestellt, dass dieser Vorgang selten erfolgreich durchgeführt wurde. Etwas schnelleres muss her…

Arduino mit 433 MHz Modul – Success

…ein Mikrokontroller, welcher mit Spannung versorgt wird, startet innerhalb weniger Millisekunden und führt sofort seinen Code aus. In Kombination mit einem 433 MHz Transmitter kann so an eine weiter entfernte Station eine Nachricht gesendet werden. Ein Einwählen in das eigene Netzwerk entfällt. Ein einphasiger Brückengleichrichter in Kombination mit einem linearen Spannungsregler wird genutzt, um 5V für den Attiny84 und den Transmitter zu erzeugen. Auch ein noch so kurzes Betätigen des Tasters führt zu einer Detektion.

Design

Blockschaltbild Smarte Klingel

Sendemodul

Das Sendemodul besteht aus einer Gleichrichtung, Linearregler und einem Mikrokontroller Attiny84 mit angeschlossenem 433 MHz Transmitter.

Sendemodul – Schaltungsdesign: Gleichrichtung und Erzeugung von 5V

Die Gleichrichtung erfolgt über vier Dioden und der 100uF Kondensator C1 dient zur Glättung. Ein Linearregler L7805 erzeugt die gewünschten 5V Gleichspannung. Ein weiterer Kondensator C2 am Ausgang dient zur Pufferung und Stabilität. An diesem Punkt erfolgt die Versorgung des Mikrokontrollers.

Gleichrichtung der vom Klingeltrafo gelieferten Wechselspannung mit Regelung auf 5V

Sendemodul – Schaltungsdesign: Attiny84 mit 433MHz Transmitter

Zum Einsatz kommt ein Attiny84, da dieser für unter 1€ erhältlich ist und für diese einfache Aufgabe mehr als ausreichend ist. Die externe Beschaltung wird auf ein Minimum reduziert. So wird auf einen externen Quarzoszillator verzichtet und der interne Clock mit maximal 8MHz verwendet. Lediglich ein 1uF Keramikkondensator wird zur Pufferung verwendet.

Attiny84 mit FS1000A Transmitter

Um die Reichweite zu verbessern kann an dem Pin ANT ein Antenne angeschlossen werden. Die einfachste Antenne in diesem Fall ist ein Stück Draht mit der Länge von ca. 17cm. Diese Länge entspricht ein Viertel der Wellenlänge von 433MHz, welche in diesem Fall 692mm ist und sollte eine Monopolantenne darstellen. Somit schaffte ich die gewünschte Reichweite von fünf Metern und auch durch eine dicke Wand. Die tatsächliche Reichweite habe ich nicht getestet und wird wahrscheinlich auch deutlich darüber liegen.

FS1000A Transmitter mit Antenne

Sendemodul – Burn Bootloader: Attiny84

Da ein komplett neuer Attiny84 zum Einsatz kommt, wird als erstes auf diesen ein Bootloader mittels eines Ardunio Mega 2560 gebrannt. Dies ermöglicht auch das Setzen des Internal Clock auf 8 MHz. Somit entfällt ein externer Quarzoszillator.
Im ersten Schritt muss auf den Arduino Mega 2560 der Sketch ArdunioISP geladen werden. Port und Board müssen entsprechend unter Tools ausgewählt werden.

Sketch ArdunioISP

Im nächsten Schritt ist es notwendig den Attiny84 in der Arduino IDE als Board zu hinterlegen.
Unter File > Preferences wird unter Additional Boards Manager URLs folgender Link hinzugefügt: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

Arduino, File > Preferences > Additional Boards Manager URLs

Anschließend wird unter Tools > Board > Boards Manager nach attiny gesucht und folgendes Package installiert:

Installieren des Boards mit Boards Manager

Nun kann der Bootloader auf den Attiny84 gebrannt werden. Nachfolgende Parameter sind entsprechend zu setzen. In meinem Fall handelt es sich um einen Attiny84, welcher mit dem Internal 8 MHz Clock läuft. Als Programmer ist Ardunio as ISP zu wählen.

Parameter Auswahl um Bootloader zu brennen

Die Verkabelung zwischen Ardunio Mega 2560 und Attiny sieht wie folgt aus:

Ardunio Mega 2560 zum Brennen des Bootloaders auf Attiny84

Wichtig ist hierbei der Kondensator mit 1uF zwischen RESET und GND am Arudnio Mega 2560 anzubringen.

Sendemodul – Upload Programm: Attiny84 mit 433MHz Transmitter

Um nun den Transmitter verwenden zu können, benötigt man noch die Library RCswitch, welche sich unter Sketch > Include Library > Manage Libraries mit dem Stichwort rc-switch finden lässt:

RCswitch Library

Der Code, welcher auf den Ardunio geflasht wird, ist denkbar einfach. Der Aufbau aus dem vorigen Kapitel bleibt gleich, geflasht wird über den Ardunio Mega 2560.

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
int sendValue = 111;

void setup()
{
  mySwitch.enableTransmit(1);
}
void loop()
{
  mySwitch.send(sendValue, 24);
  delay(500);
}

In meinem Fall verwende ich bei enableTransmit Arduino Pin 1, welcher dem physischem Pin 12 am Attiny84 entspricht. In diesem Beispiel sende ich den Wert 111 mit dem Befehl send und lege danach eine Pause von 200 ms ein. Der Wert kann natürlich nach den eigenen Bedürfnissen verändert werden und sollte etwas komplexer ausfallen.

Empfangsmodul

Das Empfangsmodul besteht wiederum aus einem Attiny84 und dem 433 MHz Receiver XD-RF-5V. Die Spannungsversorgung von 5V kommt aber in diesem Fall von einem anderen Gerät. In meinem Fall erfolgt es über meinen Wifi Temperatur Sensor (ESP8266+BME280) der Messwerte an meinem FHEM-Server schickt. Dieser liest auch gleich die Informationen ein, welche vom Attiny84 ausgegeben werden. Es könnte auch ein Pin am Raspberry Pi verwendet werden und darüber auch die Versorgung mit 5V erfolgen.

Empfangsmodul – Schaltungsdesign: Attiny84 mit 433MHz Receiver

Der Pin INT0, welcher dem physischen Pin 5 entspricht, wird verwendet um die Daten aus dem Receiver zu verarbeiten. Es handelt sich um einen Digital Pin, welcher Interrupt unterstützt (mehr Infos: ardunio.cc). Der physische Pin 12 wird als Ausgang genutzt und geht von LOW auf HIGH, sobald ein passendes Signal empfangen wird. Ein Spannungsteiler wird genutzt um den Pegel von 5V auf 3.3V für den nachfolgenden ESP8266 zu senken.

Attiny84 Pinbelegung
Attiny84 mit XD-RF-5V Receiver

Empfangsmodul – Burn Bootloader: Attiny84

Das Brennen des Bootloaders erfolgt gleich wie im Kapitel Sendemodul – Burn Bootloader: Attiny84.

Empfangsmodul – Upload Programm: Attiny84 mit 433MHz Transmitter

Wird der korrekte Wert empfangen, so wird für 500ms der physische Pin 12 auf HIGH gesetzt, welcher unter Arduino Pin 1 ist. Der korrekte Wert wird unter der Variable targetValue definiert. Mit enableReceive wird hier der Interrupt Pin 0 verwendet.

#include <RCSwitch.h>

RCSwitch receiver = RCSwitch();
int outputBellPin = 1; // Arduino Pin1 = Pin12 on Chip
int inputReceivePin = 0; // Interrupt-Pin 0 = Pin5 on Chip
int targetValue = 111;
int receivedValue = 0;

void setup()
{  
  receiver.enableReceive(inputReceivePin);  
  pinMode(outputBellPin, OUTPUT);
}

void loop() {
  if (receiver.available())
  {
    receivedValue = receiver.getReceivedValue();
    if (receivedValue == targetValue)
    {
      digitalWrite(outputBellPin, HIGH);
      delay(500);
      digitalWrite(outputBellPin, LOW);
      delay(500);
    }
    receiver.resetAvailable();
  }
}

Empfangsmodul – Integration in FHEM

Für diesen Abschnitt wird vorausgesetzt, dass die ESPEasy Bridge über FHEM korrekt eingerichtet ist (weiterführende Infos sind hier und hier zu finden). Damit in FHEM nun erkannt wird ob die Klingel betätigt wurde, muss zunächst mein WiFi Temperatursensor das digitale Signal DigiOut einlesen. Da auf dem Sensor ESP Easy läuft, erfolgt eine entsprechende Parametrierung über dessen Webinterface. Unter Devices wird mittels Edit ein neues Device Switch input – Switch angelegt. In meinem Fall handelt sich um Task 4.

ESP Easy – Neues Device hinzufügen

Die Parametrierung sieht in meinem Fall wie folgt aus. Ich nutze GPIO15/ D8 und der Rest sind Default Werte.

ESP Easy – Switch Input Parameter

Dadurch, dass Send to Controller aktiviert ist, sollten beim betätigen der Klingel ein neues Device unter FHEM erstellt worden sein. Vorausgesetzt, dass autocreate aktiviert wurde. Die Parameter des neuen Device sehen wie folgt aus und wurden von meiner Seite nicht weiter angepasst:

define ESPEasy_ESP_Easy_Kueche_Klingel ESPEasy 192.168.1.117 80 espBridge ESP_Easy_Kueche_Klingel
attr ESPEasy_ESP_Easy_Kueche_Klingel Interval 300
attr ESPEasy_ESP_Easy_Kueche_Klingel group ESPEasy Device
attr ESPEasy_ESP_Easy_Kueche_Klingel presenceCheck 1
attr ESPEasy_ESP_Easy_Kueche_Klingel readingSwitchText 1
attr ESPEasy_ESP_Easy_Kueche_Klingel room ESPEasy
attr ESPEasy_ESP_Easy_Kueche_Klingel setState 3

Um nun die gewünschte Push Benachrichtigung und Sprachausgabe via Alexa zu erhalten, nutze ich das Modul DOIF. Damit dies nur zwischen 07:00 und 22:00 passiert, habe ich eine zusätzliche Bedingung hinzugefügt. Ist nun der Wert on unter dem Device ESPEasy_ESP_Easy_Kueche_Klingel zu finden und die zeitliche Bedingung erfüllt, erfolgt eine Sprachausgabe via Alexa mit den Worten „Ding Dong„. Zusätzlich wird eine Push Benachrichtigung mit dem Inhalt „Es hat geklingelt. Jemand ist an der Tür!“ an die Nutzer des hinterlegten Amazon Account gesendet.

define di_Msg_Klingel DOIF ([07:00-22:00] and [ESPEasy_ESP_Easy_Kueche_Klingel:"on"]) (set ECHO_G000XXXXXXX speak Ding Dong, set echo mobilmessage Es hat geklingelt. Jemand ist an der Tür!)

attr di_Msg_Klingel cmdpause 10
attr di_Msg_Klingel do always
attr di_Msg_Klingel group Klingel
attr di_Msg_Klingel room ElektroGeraete

Zusammenfassung

Es wirkte am Anfang als wäre es ein schnelles Projekt. Leider lag der Teufel im Detail. So waren nicht alle Sende und Empfangsmodule aus meiner Bestellung funktionsfähig. Falls das Senden/Empfangen nicht klappt einfach ein neues Modul anschließen. Zum Glück waren in meiner Bestellung jeweils drei Einheiten.
Auch wenn man nicht zuhause ist, erfährt man sofort mittels Push Benachrichtigung ob es geklingelt hat.

About Michael Aicher

Check Also

Serial Data Logging mit Putty, Auswerten durch Octave

In diesem Beitrag möchte ich euch zeigen wie man Daten, welche über die seriellen Schnittstelle …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.