Setup.
Blog
  • Home Assistant
  • ESPHome
  • ESP32
  • Busch-Jaeger

Bauanleitung · 12 Min Lesezeit

So machst du deine Busch-Jaeger- / ABB-Welcome-Gegensprechanlage smart

Der komplette Aufbau, Schritt für Schritt: ein ESP32 auf Mat931s Open-Source-Board, ESPHome und Home Assistant.

Die ESP32-Platine wird über einen USB-Seriell-Adapter auf dem Schreibtisch geflasht.
Flashen über USB. „Coffee" auf der Tasse durchgestrichen, es wurde Tee.

Ich wohne in einer Wohnung mit einer verkabelten Busch-Jaeger-Türsprechanlage (ein ABB-Welcome-Bussystem). Wie viele wollte ich die naheliegenden Komfortfunktionen: eine Push-Benachrichtigung aufs Handy, wenn jemand klingelt, und die Möglichkeit, die Tür zu öffnen, ohne zum Hörer zu laufen. Also hab ich nach einer Ring, einer Nest-Türklingel, einem Aqara gesucht, irgendwas von der Stange eben.

Nichts davon funktioniert. Diese Produkte gehen davon aus, dass du einen simplen verkabelten Taster oder eine eigenständige Türklingel ersetzt. Eine Gebäude-Gegensprechanlage auf einem proprietären 2-Draht-Bus ist etwas völlig anderes: Es gibt keine Leitung, die du einfach abgreifen kannst, und nichts, woran du eine Ring-Klingel schrauben könntest. Wenn du eine Busch-Jaeger- / ABB-Welcome-Anlage hast und gegen dieselbe Wand gelaufen bist, ist dieser Beitrag für dich.

Davor hatte ich den faulen Weg probiert: ein kleines schallaktiviertes Kästchen (ein m-e „Sound-Active"), an den Hörer geklemmt, das den Gong weiterleiten soll. Es war grässlich. Es verpasste Klingeln hinter geschlossener Tür, löste bei jedem lauten Knall fälschlich aus und blieb manchmal still, während die Anlage munter klingelte. Also doch der ordentliche Weg.

Eine Busch-Jaeger-Sprechstelle an der Wand mit einem weißen m-e-Sound-Active-Kästchen darüber.
Der alte Hack: ein m-e-„Sound-Active"-Kästchen, das auf den Gong lauschte. In jede Richtung unzuverlässig.

Was mein Setup heute kann

Eine Push-Benachrichtigung, sobald jemand klingelt, auch wenn ich nicht zu Hause bin.

Meine Lichter blinken, wenn es klingelt, damit ich es auch mit Kopfhörern nie verpasse.

Ein Knopf auf meinem Schreibtisch öffnet die Haustür mit einem Druck. Dieselbe kleine Box blinkt und spielt einen Ton, wenn jemand klingelt.

Das Ganze läuft über Home Assistant, selbst gehostet, ohne Cloud-Abo, ohne monatliche Gebühr.

Der KernDas Open-Source-Board, das es möglich macht

Der Schlüssel ist ein Open-Source-Projekt von Mat931: das ESP32 Doorbell Bus Interface.

Es ist eine kleine Platine mit einem ESP32, der das ABB-Welcome- / Busch-Jaeger-Busprotokoll direkt spricht. Sobald sie am Bus hängt, kann sie Busereignisse sehen (z. B. „jemand hat geklingelt") und Befehle senden (z. B. „Tür öffnen"). Aus Sicht von Home Assistant taucht sie einfach als Gerät mit einem Klingel-Sensor und einem Türöffner-Schalter auf. Riesiges Dankeschön an Mat931 fürs Reverse Engineering und dafür, das kostenlos zu teilen. Ohne diese Arbeit ist der ganze Rest nicht möglich.

Rückseite der Platine mit Pin-Beschriftung, GPIO25 Bus RX, GPIO26 Bus TX, dem Open-Source-Hardware-Logo und Mat931s CERN-OHL-Lizenz.
Die Rückseite sagt alles: Open-Source-Hardware, Mat931s Design und die Pads BUS+ (A) / BUS- (B).

Der AufbauWie die Teile zusammenspielen

  • Die Interface-Platine sitzt am Bus der Gegensprechanlage. Wird geklingelt, erkennt sie das Busereignis und meldet es an Home Assistant.
  • Eine Home-Assistant-Automatisierung reagiert darauf. Bei mir macht sie drei Dinge gleichzeitig: schickt eine Push-Nachricht über die Home-Assistant-Companion-App, lässt die Lichter ein paar Mal blinken und zeigt (optional) einen „Tür öffnen"-Button direkt in der Benachrichtigung an.
  • Das Türöffnen ist dann nur noch Home Assistant, das der Platine sagt, sie soll den Unlock-Frame zurück auf den Bus schicken. Ausgelöst wird das über einen kleinen M5 Atom Echo auf meinem Schreibtisch: ein Druck auf dessen Knopf, und die Haustür geht auf. Derselbe Atom Echo blinkt außerdem rot und spielt einen Ton, sobald jemand klingelt, ist also gleichzeitig meine Schreibtisch-Klingel.
Die Interface-Platine beim Testen mit Jumper-Kabeln verkabelt, Status-LEDs leuchten.
Aufbau auf dem Basteltisch, Status-LEDs an, kommuniziert mit dem Bus.

Kurz zum Einbau, fast schon unspektakulär: Die Platine ist winzig und verschwindet einfach in der Kabelbüchse hinter der Innenstation (eine Busch-Jaeger 83205). Ihre zwei Bus-Adern kommen in dieselbe a/b-Schraubklemme, die die Gegensprechanlage schon nutzt. Mehr ist die Verkabelung nicht.

Die ESP32-Platine in der a/b-Schraubklemme in der Kabelbüchse hinter der Innenstation.
Zwei Adern in dieselbe a/b-Klemme, Platine in der Büchse hinter der Anlage.
Die ESP32-Platine in der Kabelbüchse hinter dem Busch-Jaeger-83205-Gehäuse.
Und weg ist sie: die ganze Platine passt in die Kabelbüchse hinter dem Gehäuse, nichts zu sehen.

Der DIY-WegWenn du das selbst bauen willst

Mat931 hat den harten Teil schon erledigt: Schaltpläne, Board-Dateien und klare Anleitungen liegen alle im Repo. Seine how to order-Anleitung führt dich durch die Fertigung der Platine bei einem Fertiger wie JLCPCB. Das ist der komplette DIY-Weg und wirklich gut dokumentiert.

Ein Hinweis aus Erfahrung: Die Fertiger verlangen meist eine Mindestbestellung von 5 Platinen, und als ich bestellt habe, waren die ESP32-Module teils nicht lieferbar, plan das also mit ein.

Ehrlich gesagtDer eine Haken: das Flashen

Ich beschönige nichts. Die Firmware das erste Mal auf die Platine zu bekommen, war der Teil, der bei mir am längsten gedauert hat. Wenn du mit ESPHome oder ESP-IDF vertraut bist, ist es Routine. Wenn du noch nie einen ESP32 geflasht hast, plan einen Abend ein und folge Mat931s Doku genau. Einmal geflasht und eingerichtet läuft es aber einfach, und du vergisst, dass es da ist.

Bei mir wurde aus „einem Abend" ein Mehrfaches. Die Auto-Reset-Schaltung wollte das Board partout nicht in den Download-Modus bringen, esptool zeigte ewig „Connecting…". Drei Dinge haben es endlich gelöst: ein Jumper-Draht am RTS-Pad, damit ich das Boot-/Reset-Timing von Hand treffen konnte, die externe Stromversorgung über den Bus statt über den USB-Adapter (der lieferte zu wenig Strom), und der Wechsel auf ein ordentliches Datenkabel, denn ein reines Ladekabel versorgt den Adapter zwar, überträgt aber keine Daten. Das Factory-Image an Offset 0x0 zu schreiben war das letzte Puzzleteil.

Ein roter FT232RL-USB-Seriell-Adapter mit einem orangen Jumper-Draht am RTS-Pad.
Der Adapter, der es endlich tat. Der orange Draht am RTS-Pad war der Retter.

VerkabelungWas ich womit verbunden habe

Geflasht wird über einen einfachen 3,3 V USB-Seriell-Adapter (ich hatte einen roten FT232RL). Das Board hat eine Auto-Reset-Schaltung an Bord, also kein GPIO0-Halten oder Tastendrücken. Ich habe vier Signalleitungen an den Programmier-Header des Boards gelegt, TX und RX wie üblich gekreuzt:

FT232RL ↔ Programmier-Header des Boards
FT232RLBoard
RTSRTS
DTRDTR
TXRX
RXTX
GNDGND

Für den Strom habe ich die 3V3-Leitung des Adapters weggelassen und das Board über ein 15 V-Netzteil an BUS+ / BUS- gespeist (dort nimmt das Board 12-30 V DC, ein nackter FT232RL liefert zum Flashen oft nicht genug Strom). Masse zwischen Adapter und Board gemeinsam halten.

Die ABB-Welcome-Seite musst du nicht verdrahten: auf Mat931s Platine nutzt der ESP32 GPIO26 zum Senden auf dem Bus, GPIO25 zum Empfangen und GPIO2 für die Status-LED. In der Wohnung sitzt das Board einfach auf den zwei Busadern, BUS+ und BUS- (Busspannung ca. 20-30 V; es gibt Verpolungsschutz und eine rücksetzbare Sicherung).

WorkflowFlashen, verbinden und Logs auslesen

Der allererste Flash muss über USB laufen, nach Mat931s how_to_flash-Anleitung. Danach läuft alles über WLAN. Die Befehle, die ich tatsächlich genutzt habe:

# 1) Erster Flash über USB (die Demo-/Factory-Firmware)
esphome compile abb-welcome-factory.yaml
esphome run abb-welcome-factory.yaml --device /dev/cu.usbserial-A5069RR4

# wenn der Auto-Reset versagt und esptool nur "Connecting........" zeigt:
python3 -m esptool --chip esp32 --port /dev/cu.usbserial-A5069RR4 --baud 115200 erase_flash
python3 -m esptool --chip esp32 --port /dev/cu.usbserial-A5069RR4 --baud 115200 \
  write_flash -z 0x0 .esphome/build/abb-welcome-demo/.pioenvs/abb-welcome-demo/firmware.factory.bin
# dann RESET am Board drücken, während "Connecting........" läuft

# 2) WLAN, ohne App: ins eigene Access-Point des Boards einwählen
#    SSID: abb-welcome-demo-XXXXXX   Passwort: 12345678   ->  http://192.168.4.1
#    dein WLAN eintragen, das Board rebootet und verbindet sich

# 3) Sobald es im WLAN ist, läuft alles übers Netz, kein USB:
esphome logs Klingel-esp32.yaml --device 192.168.178.11   # Live-Bus-Frames ansehen
esphome run  Klingel-esp32.yaml --device 192.168.178.11   # OTA: neue Firmware flashen

In Home Assistant taucht das Board von allein unter Einstellungen → Geräte & Dienste → ESPHome auf; wenn du es dort hinzufügst, bekommst du den Debug-Textsensor (meiner heißt Doorbell Intercom) und kannst die Frames live im Dashboard verfolgen, ganz ohne CLI. Genau damit habe ich die Adressen unten ausgelesen.

AnpassenMeine Adressen finden, und zwei Stolperfallen

Jede ABB-Welcome-Installation ist anders, die Platine weiß also nicht von allein, welches Piepsen deine Klingel ist. Das liest man vom Bus ab. Mit offenem Debug-Sensor sieht jeder Frame so aus:

[1017 > 3001]  Type: 11   Klingeln an der Innenstation
[2001 > 1017]  Type: 01   Klingeln an der Außenstation
[1017 > 4001]  Type: 0D   Data: XX XX XX   Tür öffnen (Code geschwärzt)
[4001 > 1017]  Type: 8D   Data: XX XX XX   Türöffner-Bestätigung

Du drückst einen Knopf, schaust auf die Zeile, die sich wiederholt, und notierst Quelle, Ziel, Typ und Daten. So kamen meine vier Adressen zusammen: Innenstation 0x1017, Außenstation 0x2001, das Gateway 0x3001 und der Türcontroller 0x4001. Nettes Detail: die letzten beiden Stellen der Innenstations-Adresse sind die Wohnungsnummer, eingestellt über die kleinen Drehräder auf der Rückseite, in Hex.

Das geöffnete Busch-Jaeger-Innenstations-Board mit a1/b1-Klemmen und den drei Adress-Drehrädern unten links.
Im Inneren der Innenstation: die drei Drehräder oben links stellen die Adresse ein, a1/b1 sind die Klemmen, an die die Platine andockt.

Zwei Dinge haben mich einen Abend gekostet. Erstens hängt eine zweite Innenstation am Bus (ein Nachbar), eine naive „Außen-Klingel"-Regel feuerte also auch bei dessen Tür. Die Lösung: jede Bedingung strikt auf meine eigene Adresse festnageln. Zweitens, und das hat mir eine KI gefunden: ich hatte die Checks mit and: verknüpft, aber ein einzelner Frame kann nicht gleichzeitig Typ 0x11 und 0x91 sein, der Sensor feuerte also nie. Es muss or: sein. Im Nachhinein offensichtlich, um Mitternacht unsichtbar.

Für die mühsamen Teile habe ich ChatGPT genutzt: das rohe Hex entschlüsseln, entscheiden, welche Frames zuverlässig sind, und aus der generischen Beispiel-Config meine eigene machen. Mat931s how to customize-Anleitung ist dafür die Referenz. Nach dem allerersten Flashen per USB lief alles Weitere über WLAN.

ESPHomeDie Config, die alles verbindet

Das ganze „Gehirn" ist eine einzige ESPHome-YAML. Zwei Dinge solltest du vorher wissen: die ABB-Welcome-Komponente braucht das ESP-IDF-Framework (nicht Arduino), und die Klingel-Bedingungen müssen mit or: verknüpft werden. Hier das Herzstück, gekürzt, mit geschwärztem Türcode:

esphome:
  name: klingel-esp32

esp32:
  board: esp32dev
  framework:
    type: esp-idf          # die ABB-Welcome-Komponente braucht ESP-IDF

# 2-Draht-Bus an GPIO25 lesen, an GPIO26 senden
remote_receiver:
  pin: { number: GPIO25, mode: { input: true } }
  dump: [abbwelcome]
  on_abbwelcome:
    then:
      # Klingeln innen: zwei Nachrichtentypen, mit OR verknüpft (nicht AND!)
      - if:
          condition:
            or:
              - lambda: 'return x.get_message_type()==0x11 && x.get_source_address()==0x1017;'
              - lambda: 'return x.get_message_type()==0x91 && x.get_destination_address()==0x1017;'
          then:
            - binary_sensor.template.publish: { id: doorbell_indoor, state: ON }
            - binary_sensor.template.publish: { id: doorbell_indoor, state: OFF }

lock:
  - platform: template
    name: "Front Door"
    id: front_door
    unlock_action:
      - remote_transmitter.transmit_abbwelcome:
          source_address: 0x1017       # meine Innenstation
          destination_address: 0x4001  # Türcontroller
          message_type: 0x0d           # öffnen
          data: [0x??, 0x??, 0x??]     # dein Türcode, aus dem Log ablesen

Die Platine erscheint in Home Assistant dann als binary_sensor fürs Klingeln und als lock-Entität für die Tür. Nach dem ersten USB-Flash laufen Updates über WLAN mit esphome run … --device <board-ip>.

Home AssistantDie Automatisierung hinter der Benachrichtigung

Auf der Home-Assistant-Seite verknüpft eine Automatisierung den doorbell_indoor-Sensor der Platine mit allem, was passieren soll: der Schreibtisch-Atom-Echo blinkt und spielt einen Ton, eine Push geht raus, und die Flurlichter blinken und springen danach wieder auf ihren vorherigen Zustand. Der Snapshot-und-Wiederherstellen-Trick ist das Schöne daran.

alias: DOORBELL Indoor
triggers:
  - trigger: state
    entity_id: binary_sensor.klingel_doorbell_indoor   # kommt vom ESP32
    to: "on"
actions:
  # Schreibtisch-Atom-Echo: rotes Blinken + Ton
  - action: light.turn_on
    target: { entity_id: light.klingel_repeater_atom_echo_led }
    data: { effect: Blink Red, brightness: 255 }
  - action: media_player.play_media
    target: { entity_id: media_player.klingel_repeater_atom_echo_speaker }
    data:
      media_content_id: http://homeassistant.local:8123/local/doorbell-indoor.mp3
      media_content_type: music
  # Handy-Push (Pushbullet)
  - action: notify.pushbullet
    data: { title: Klingel, message: "Jemand ist an der Tür (oben)!" }
  # Flurlichter blinken, dann vorherigen Zustand wiederherstellen
  - action: scene.create
    data:
      scene_id: doorbell_pre_blink_snapshot
      snapshot_entities: "{{ doorbell_blink_lights }}"
  - repeat:
      count: 3
      sequence:
        - action: light.turn_off
          target: { entity_id: "{{ doorbell_blink_lights }}" }
        - delay: "00:00:01"
        - action: light.turn_on
          target: { entity_id: "{{ doorbell_blink_lights }}" }
        - delay: "00:00:01"
  - action: scene.turn_on
    target: { entity_id: scene.doorbell_pre_blink_snapshot }

BenachrichtigungenDer ehrliche Kompromiss bei Handy-Benachrichtigungen

Etwas, das die Tutorials verschweigen: Die Home-Assistant-Companion-App liefert wirklich sofortige Push-Benachrichtigungen, aber auf Android bedeutet das eine dauerhafte Hintergrundverbindung, und die hat meinen Akku leergesaugt. Auf dem Handy bin ich deshalb auf Pushbullet umgestiegen: leicht und zuverlässig. Der Haken: Pushbullet kann keine Action-Buttons, ich kann die Tür also nicht direkt aus der Handy-Benachrichtigung öffnen.

Das ist okay, denn das Gerät, zu dem ich ohnehin greife, steht direkt neben meinem PC: der M5 Atom Echo. Er blinkt, spielt einen Ton und öffnet die Tür per Knopf, daheim hole ich dafür also nie das Handy raus. Die Push-Nachricht sagt mir nur, dass jemand geklingelt hat, wenn ich in einem anderen Zimmer bin.

Android-Benachrichtigung: Klingel, Jemand ist an der Tür (unten)!, mit einem Tür-öffnen-Button.
Die Companion-App kann der Benachrichtigung sogar einen „Tür öffnen"-Button verpassen. Praktisch, aber eben der akkuhungrige Weg.
Benachrichtigung mit Titel BzZzzz und dem Text Tür geöffnet vom Repeater.
Und die Bestätigung, wenn der Schreibtisch-Knopf die Tür geöffnet hat.

KompatibilitätFunktioniert das mit deiner Anlage?

Wenn deine ABB-Welcome- / Busch-Welcome-Station mit zwei Adern (meist a und b) angeschlossen ist, ist sie sehr wahrscheinlich kompatibel. Bisher bestätigt sind u. a. die Busch-Jaeger 83205 AP-6 (meine), 83220 AP-624 und 83222 U-611 sowie ABB M22002-W-02, M2231, M2234, M22403-W und WLI501B / M22401-W. Manche ABB-Stationen nutzen 3-Byte-Adressen, dann setzt du three_byte_address: true. Die aktuelle Liste steht im Wiki, und die Platine ist auch im ESPHome-Devices-Register.

Ein großer Haufen grüner PCB-Nutzenstege, übrig nach dem Vereinzeln von 30 Boards.
Beim Vorflashen von 30 Stück bleibt so ein Haufen Nutzenstege übrig.
30 € + Versand

…oder spar dir Bestellen und Flashen

Die ehrliche Vorgeschichte: Ich hab mir eine für mich selbst gebaut und eine Charge von fünf bestellt (die Mindestmenge beim Fertiger), dann vier davon an Leute verkauft, die den GitHub-Thread gefunden haben. Das lief gut genug, dass ich 30 bestellt habe, in der Hoffnung auf großes Interesse bei den Nachbarn im Haus. Bei über 900 Wohnparteien haben sich genau zwei gemeldet. :( Seitdem sind über den Thread noch etliche weggegangen, es liegt also noch ein ordentlicher Stapel hier.

Noch 22 von 30 Platinen 8 schon weg

Sie sind vorgeflasht und einrichtungsbereit, jede mit ESP32-Modul drauf. Du sparst dir also die 5er-Mindestbestellung und die ganze Einarbeitung ins Flashen. Wenn dir das Ärger erspart, schnapp dir eine:

Board anfragen

30 € pro Platine plus versicherter DHL-Versand mit Sendungsverfolgung. Aus Deutschland, überall in die EU.

Kein Shop, kein Geschäft. Ich gebe nur die Reste an Leute weiter, die sie wirklich nutzen. Wer zuerst kommt, mahlt zuerst, und wenn sie weg sind, sind sie weg (ich bestelle nicht nach).