Meine neue smarte Klingel

Veröffentlicht von am 31. Mai 2019 in Mitgliederblog

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.

Schreibe einen Kommentar zu Tobias Peters Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

  1. 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

  2. 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.

    • Thomas Helmke sagt:

      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

        • Thomas Helmke sagt:

          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.

  3. Philipp sagt:

    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ß

    • Thomas Helmke sagt:

      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

  4. Tobias Peters sagt:

    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!