- 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.
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.
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.
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.
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.
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.
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 | Board |
|---|---|
RTS | RTS |
DTR | DTR |
TX | RX |
RX | TX |
GND | GND |
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.
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.
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.
…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.
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 anfragen30 € 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).