Moin! Ich habe heute den ersten Teil meines Projekts „Smarte Klingel“ fertig gestellt und lasse euch hiermit daran teilhaben.
Hintergrund
Vor ziemlich genau einem Jahr habe ich angefangen, meine Wohnung smarter zu machen. Bei mir läuft Home Assistant auf einem Raspberry Pi und bindet ein breites Sammelsurium an smarten Geräten zusammen. Von Homematic IP über Xiaomi und Sonoff bis hin zu ESP-basierenden Eigenkreationen ist alles dabei.
Da die Balkon- bzw. Gartensaison jetzt ja doch bald beginnt, rückt auch die Haustürklingel wieder in den Fokus. Im Garten hört man nichts von der Klingel und selbst auf dem Balkon nur mit Glück. Hier im Haus ist eine Klingelanlage installiert. Eigentlich ganz nett mit Gegensprechanlage, Türöffner, etc. Allerdings ist das System nicht dafür gedacht, einfach mal die Klingel anzuzapfen.
Klingelanlage
Die Klingelanlage ist ein geschlossenes System von TCS. Es gibt eine Basisstation an der Außentür mit den Tastern für die einzelnen Wohnungen und in jeder Wohnung eine Satellitenstation. In jeder Wohnung kommen 2 Drähte an, alle Satelliten sind in Reihe angeschlossen. Über die beiden Drähte kommt zum einen die 24 Volt Versorgungsspannung an, zum anderen wird ein proprietärer Bus aufmoduliert. In der frei verfügbaren Dokumentation findet man nur die Information, dass jede Station eine eindeutige Adresse hat und Nachrichten von jeder Station quittiert werden. Die Satellitenstation hat einen Anschluss für ein Funkmodul, aber auf das müsste als Busteilnehmer angelernt werden. Also ist kreatives Hacken gefragt.
Umsetzung
Hardware
Da es im Internet nicht viel Detailinformation gibt, war der erste Schritt die Spannung mit dem Multimeter zu messen, während geklingelt wird. Das Gerät ist natürlich viel zu langsam um konkrete Aussagen treffen zu können, aber es reichte für die Erkenntnis, dass die Spannung abgesenkt wird, wenn Nachrichten auf dem Bus laufen. Ich musste also einen Bus-Sniffer bauen, um die einzelnen Bits mitlesen zu können. Der Wemos D1 Mini erlaubt am ADC Eingang maximal 3,2 Volt, daher habe ich einen Spannungsteiler aus 1 MΩ zu 147 kΩ zusammengelötet, der die 24 Volt auf knapp unter 3 Volt drückt. Dazu zwei Schraubklemmen und Sockel für den Wemos. Verpackt wird das ganze in ein gelasertes Gehäuse auf MDF.
Software
Die Software auf dem Wemos ist ein Arduino Sketch (Code auf Github). Ich lese die Spannung am A0 ein und skaliere die Digits auf die ursprünglichen 24 Volt. Der nächste Schritt ist die Flankenauswertung. Das TCS Installationshandbuch spricht von 24V +/- 8%, also habe ich als Threshold willkürlich 20 Volt eingetragen. Wenn die Spannung unter diesen Wert fällt, merke ich mir den Zeitpunkt, wenn die Spannung wieder höher steigt, bilde ich die Zeitdifferenz. Das hat auf Anhieb sehr gut funktioniert, allerdings musste ich von Millisekunden auf Mikrosekunden wechseln, um die Bitlängen zuverlässig messen zu können.
Den ursprünglichen Plan, das Busprotokoll zu reverse-engineeren, habe ich schnell verworfen zugunsten einer einfacheren Variante. Da beim Klingeln immer die gleiche Nachricht gesendet wird, muss ich nur genau diese eine Abfolge von Flanken erkennen. Die Sequenz der Bitdauern habe ich schließlich als Array fest ins Programm geschrieben. Bei jeder Flanke wird die Anzahl der Mikrosekunden seit der letzten Flanke mit dem Wert im Array verglichen. Gibt es eine Übereinstimmung wird weitergezählt, andernfalls wird der Sequenzzähler zurückgesetzt. Wenn die Sequenz vollständig durchlaufen wurde, wird eine Nachricht verschickt.
Die Nachricht wird per MQTT an mein Home Assistant geschickt. Da die MQTT Libraries für Arduino anscheinend ein Problem haben, wenn der Client zu oft aufgerufen wird, ist in meinem Standard-Code ein Delay von 10 Millisekunden im Loop eingebaut. Damit würde natürlich die Flankenauswertung nicht mehr funktionieren, also verbinde in diesem Fall den MQTT Client erst dann, wenn eine Nachricht gesendet werden soll und trenne dann sofort die Verbindung wieder.
Ausblick
Der schwierigste Teil des Projekts ist erledigt. Ich erkenne, dass es an meiner Haustür klingelt und melde die Information an mein Smart Home. Jetzt fehlt noch ein System zur Benachrichtigung auf dem Balkon bzw. im Garten. Wahrscheinlich werde ich dort einen weiteren ESP mit LEDs, einem Summer oder etwas ähnliches installieren.
Update
Der zweite ESP zur Benachrichtigung auf dem Balkon ist zwar noch nicht fertig, aber der Adapter ist mittlerweile fest montiert.
Ich möchte eine Gegensprechanlage mit Farbkamera einbauen lassen. Toll zu lesen, dass dies auch kein Problem darstellt. Dies werde ich meinem Mann zeigen.
ich habe Homematic HmIP-FCI1 dem Rufrelais von TCS TRE2-EB. Ist leider kein TCS Hack, aber es funktioniert
Sehr cooles Projekt, bin gerade am überlegen ob ich da auch mit anfangen soll. Eine Frage habe ich, kann man den ESP nicht mit einem Wandler direkt über den Klingel Draht mit Strom versorgen? Dann könnte man sich die stripper sparen oder ist das nicht möglich?
Der esp braucht leider zu viel strom (max 100mA) um vom bus gespeist zu werden.
Falls die P leitung vorhanden ist kann man es damkt versuchen.
Grüsse
Hallo, eine sehr tolle Idee, welche ich gerade Nachbauen will. Ich habe bei mir eine P Leitung vorhanden. Wie kann ich realisieren das ich von dieser den esp mit Strom versorgen kann? Mit einem Step Down Converter? Wie ist es möglich über MQTT die Türe zu öffnen? LG Sebastian
Hi,
bei mir hat es geklappt zwischen GND vom Bus und die P Leitung einen Traco TSR1 2405 zu haengen (https://www.conrad.de/de/p/tracopower-tsr-1-2450-dc-dc-wandler-print-24-v-dc-5-v-dc-1-a-6-w-anzahl-ausgaenge-1-x-156673.html).
Ich habe so ziemlich genau das umgesetzt was du auch vor hast: https://github.com/peteh/doorman
Dankeschön für die Info, werde ich ausprobieren.
Hast du den doorman via arduino auf den esp geflashed?
gerne auch privat.
lg Sebastian
Ich finde nichts um dich privat zu kontaktieren.
Ich benutze zum flashen immer platformio über usb oder danach per platformio ota.
Du kannst auch ein issue im github Projekt aufmachen falls du Fragen hast. Dann können wir das da klären.
Hallo,
ich habe eine Klingel von Comelit, welches ebenfalls ein Bussystem hat.
Kann ich den Code direkt verwenden, oder muss das noch angepasst werden an die Bitfolgen, da dies ein anderer Hersteller ist?
Mir ist zumindestens aufgefallen, dass Comelit 31 Volt benutzt, d.h., hier muesste der Spannungsteiler anders gestaltet werden.
Ich habe jetzt auch meinen D1 Mini damit bespielt. Besteht die Moeglichkeit, dasss ich einen erfolgreichen MQTT-Test durchfuehren kann, ohne die Verkabelung an der Klingelanlage durchzufuehren?
Viele Gruesse
Aydin
Hallo,
von Comelit habe ich bisher noch nichts gehört, daher kann ich dazu gar nichts sagen.
Wenn du meinen Sketch der Version 3 mit Interrupt verwendest, dann solltest du im seriellen Monitor die Rückmeldung sehen, dass er sich mit dem MQTT Broker verbunden hat.
Gruß
Thomas
Habe nun erfolgreich das protokoll bis zum letzten bit decoden können.
Mit den folgenden sketches ist es möglich mit Arduino auf dem bus zu hören und zu senden. Das protokoll wird dabei auf dem Arduino direkt geparst.
Allgemein gesagt gibt es 2byte oder 4byte und ACK protokolle.
Habe hier ein video und auch die sketche bei github dazu hochgeladen: https://youtu.be/xFLoauqj9yA
Viele grüsse
Sehr cool, Aaron!
Das werde ich mir mal anschauen, wenn ich Zeit habe. 🙂
Danke fürs teilen!
Moin, wenn ich das Protokoll bis jetzt richtig entschlüsselt habe ist die Seriennummer von deinem Telefon: 926440
Steht im telefon wenn mans auf macht.
Moin,
Wie ich ja geschrieben hatte, hab ich mir nicht die Mühe gemacht das Protokoll zu entschlüsseln. Daher weiß ich auch meine Seriennummer nicht. 😉
Gruß
Thomas
Alles klar schade, währe mal interessant gewesen ob ich auf der richtigen spur bin.
Habs aber glaub ich. also
Die 6 Ms am anfang ist der start anzeiger,
Dann sind 4ms ein 1 bit und 2ms ein 0 bit.
Hier deins als beispiel:
X 1 0000 1110 0010 0010 1110 0010 1000 0000 1
__________
ist dan 0xE22E2 also die 926440 BigEndian
Viele grüße Aus Stade
Leider mochte wordpress die sonderzeichen nicht,
Hier deins als beispiel:
X 1 0000 1110 0010 0010 1110 0010 1000 0000 1
_________…….5HEX=SerNr……._Function.
ist dan 0xE22E2 also die 926440 BigEndian
Meine Vermutung ist, dass nur ein Teil davon die Seriennummer des Empfängers ist. Und ein Teil das Kommando “klingeln“ verschlüsselt.
Um das wirklich zu reverse-engineeren, müsste man unterschiedliche Nachrichten mitschreiben und vergleichen. Also klingeln bei den Nachbarn, Tür auf, Licht an, etc.
Genau das ist was ich den Tag über heute gemacht habe 😀
Habe eine Anlage bei mir auf dem Schreibtisch aufgebaut mit dem Oszi und Einer Abgewandelten version von deinem Sketch alles durchgespielt.
Auch das Was das Einstellungsinterface am pc sendet / empfäng passt damit überein,
Leider ist die formatierung hier nicht so einfach werde dazu aber noch was veröffentlichen.
Der reine Klingel „Anruf“ ist bei deinem mitschnitt nur bis zu dem ersten 5ms „bit“ diese 5ms wartet das aussenteil auf eine antwort vom Telefon, dort gibt es einen timeout von 22ms. Ab da antwortet das telefon mit spannungsabfällen.
Viel verschlüsselung gibt es garnicht, das system ist ja auch schon etwas älter es kahmen wohl nur immer wieder geräte dazu aber das grundteil bleibt gleich.
Will mich auch nicht aufdrängen 😀
Wünsche nen schönen abend.
Sehr geil! Exakt die selbe Ausgangsbasis habe ich auch und hatte auch vor einiger Zeit mit der selben Idee gestartet, aufgrund fehlender zu wenig Erfahrung in Elektrotechnik aufgegeben. Du hast nicht zufällig einen Schaltplan für die Elektronik bzw. kannst ein paar Infos zu Verkabelung und verwendeten Komponenten machen?
Gruß
Moin Philipp,
ich habe jetzt einen Schaltplan auf Github hinzugefügt. Ausser dem Mikrocontroller braucht man im wesentlichen nur zwei Widerstände: 1MΩ und 147kΩ. Die werden in Reihe zwischen die beiden Leitungen aus der Klingel geschaltet. Damit hast du einen Spannungsteiler und kannst zwischen den beiden Widerständen das Signal für den Mikrocontroller abholen. Wichtig ist den analogen Pin und den GND Pin vor und hinter dem kleinen Widerstand anzuschließen.
Ich hoffe damit kommst du ein bischen weiter.
Gruß
Thomas
Spannendes Projekt. Ich hab bei mir das gleiche vor, hab aber den Vorteil, dass es eine klassische Klingel ist und der Aufwand um das abzugreifen deshalb deutlich geringer sein wird.
Danke fürs Teilen!
Hallo, ich habe die gleiche Klingel und würde diese auch gerne smart machen. Kannst Du mir einen Schaltplan Deiner Lösung zukommen lassen. Danke und Gruß, Peter
Moin Peter,
ich habe den aktuellen Stand meiner Klingel-Anbindung in meinem eigenen Blog beschrieben:
https://blog.syralist.de/posts/smarthome/klingel/
Da ist auch die Schaltung beschrieben.
Gruß
Thomas