garagentorgpioraspberry-pihome-assistant

Garagentor in Home Assistant: Handsender per GPIO anzapfen

/Veröffentlicht am/Aktualisiert am

Das Garagentor war die letzte Baustelle. Alles andere im Haus hing irgendwann in Home Assistant — Licht, Rollläden, Strom, Auto. Nur die Einfahrt nicht. Und das lag an einem sehr banalen Umstand: die einzige Schnittstelle zum Tor ist ein Handsender. Kein Cloud-Dienst, keine App, keine Klemmleiste, an die ich rankomme, ohne den Antrieb aufzuschrauben. Ein Belfox-Handsender auf 868 MHz, Batterie drin, zwei Tasten. Das ist die ganze API.

Die naheliegende Idee ist: Dann nehme ich den Funk halt auf und spiele ihn ab. Ich habe das ehrlich versucht. Wochen. Es hat nicht funktioniert. Was funktioniert, und was heute alle drei Tore bei mir schaltet, ist deutlich unspektakulärer: Der Raspberry Pi drückt elektrisch den Taster im Original-Handsender.

Warum der Funkweg bei mir gescheitert ist

Kurz zur Einordnung, damit du das nicht nachbaust. Mein Handsender ist ein Belfox 7834-E-M, und der sendet keinen Rolling Code — im Gegensatz zu meinen SOMFY-Rollläden. Damit ist Aufnehmen und Abspielen theoretisch machbar. Genau deshalb bin ich so tief in das Thema rein: Fixed Code, eigenes Tor, eine Schublade voll Funkspielzeug. Was soll da schon schiefgehen.

Was ich durchprobiert habe:

  • RTL-SDR-Mitschnitt auf 868,300 MHz. Rohes IQ-Material bekam ich, saubere Aufnahmen von mehreren Tastendrücken auch.
  • OpenMQTTGateway mit CC1101 auf einem ESP32. Der Broker lief, das Gerät meldete sich sauber, Frequenz durchgestimmt von 868,20 bis 868,40 MHz — und trotzdem kam kein einziges brauchbares Empfangsevent für diesen Sender rein.
  • rpitx auf dem Pi. Das war der aufwendigste Teil: librpitx neu bauen, weil die alte -lbcm_host-Abhängigkeit auf aktuellem Pi OS nicht mehr linkt, dann sendook und sendiq selbst kompilieren. Danach habe ich über GPIO 4 — das ist der Pin, auf dem rpitx den Träger ausgibt, physisch Pin 7 — Kandidaten- Timings rausgeblasen. Der Pi meldete brav Message successfuly transmitted.

Und das Tor? Hat sich kein einziges Mal bewegt.

Das ist der frustrierendste Zustand überhaupt: Der Sendeweg funktioniert nachweislich, aber der Empfänger reagiert nicht. Irgendwo zwischen Timing, Modulation, Preamble-Länge und Wiederholungszahl stimmt etwas nicht, und ohne sauberen Empfang hast du keine Referenz, gegen die du debuggen kannst. Du rätst. Ich habe wochenlang geraten — mit wachsendem Ehrgeiz und einer Trefferquote von exakt null.

Der Schnitt: nicht das Signal nachbauen, sondern den Finger ersetzen

Der Gedanke, der alles gedreht hat: Ich brauche gar nicht den Funk. Ich brauche den Tastendruck. Der Handsender kann das Protokoll bereits perfekt — er ist ja angelernt, er hat die richtige Frequenz, die richtige Codierung, den richtigen Sendepegel. Das einzige, was fehlt, ist ein Finger.

Also: Handsender aufschrauben, an die beiden Lötpads des Tasters zwei Drähte, und der Pi schließt diesen Kontakt kurz für ein paar hundert Millisekunden. Genau das ist die Taster-Emulation. Der Handsender bleibt elektrisch vollständig intakt und läuft weiter auf seiner eigenen Batterie.

Der letzte Punkt ist wichtiger, als er klingt. Wenn du den Sender aus dem Pi speist, hast du plötzlich eine gemeinsame Masse zwischen einem 3,3-V-Rechner und einer 3-V-Knopfzellenschaltung, deren Massebezug du nicht kennst. Das ist der Klassiker für Masseschleifen, Pegelprobleme und im schlimmsten Fall einen toten GPIO-Pin.

Die goldene Regel: 3,3 V, und nichts Unbekanntes direkt an den Pi

Das ist der Teil, den ich nicht oft genug schreiben kann:

Raspberry-Pi-GPIOs sind 3,3-V-Pins. Nicht 5 V. Nicht “irgendwas”. Ein unbekanntes Signal aus einer fremden Platine gehört niemals direkt an einen GPIO.

Dasselbe gilt übrigens für die verbreiteten 868-MHz-Module wie das QIACHIP RX480E-868, falls du diesen Weg doch gehen willst: Im Sendebetrieb sind dessen D0–D3 active-low Eingänge, die du nicht ohne Transistor, MOSFET oder Optokoppler direkt aus dem Pi treiben solltest. Im Empfangsbetrieb musst du auf 3,3 V pegelwandeln, bevor irgendetwas an den Pi geht. Beides ist kein “kann man auch weglassen”.

Transistor oder Optokoppler?

Beides funktioniert prinzipiell. Ich empfehle dir trotzdem klar den Optokoppler.

Ein NPN-Transistor (Standardtypen wie BC547 oder 2N2222, mit einem Basiswiderstand in der typischen Größenordnung von 1 kΩ) ist billiger und schneller aufgebaut — setzt aber voraus, dass die Masse des Handsenders und die Masse des Pi verbunden sind und dass du weißt, welche Seite des Tasters gegen Masse liegt. Bei einem fremden Sender weißt du das oft nicht sicher. Manche Taster schalten nicht gegen GND, sondern liegen in einer Weckschaltung.

Der Optokoppler — ein PC817 tut es völlig — löst das Problem durch galvanische Trennung: Pi-Seite und Handsender-Seite haben keinerlei elektrische Verbindung. Der Ausgang ist ein potentialfreier Kontakt. Damit ist es egal, wie die Sender-Platine intern verdrahtet ist, und ein Fehler auf der einen Seite kann die andere nicht mitreißen.

Ich habe ein Optokoppler PC817 Sortiment* hier liegen, weil man diese Dinger irgendwann ständig braucht. Dazu ein Lötkolben mit feiner Spitze — die Pads im Handsender sind klein — und ein paar Dupont-Kabel* zum Pi.

Verstehe die Werte als typische, übliche Größenordnungen, nicht als geprüfte Stückliste für deinen Sender. Miss nach, bevor du lötest.

Die Verkabelung im Prinzip

Pi-Seite (Eingang des Optokopplers):

  • GPIO → Vorwiderstand (bei 3,3 V üblicherweise ~330 Ω für einen PC817) → Anode LED
  • Kathode LED → Pi-GND

Handsender-Seite (Ausgang, Transistor des Optokopplers):

  • Collector und Emitter parallel zum vorhandenen Taster, polrichtig
  • Sonst nichts. Keine gemeinsame Masse, keine Stromversorgung aus dem Pi. Die Batterie bleibt drin.

Wenn du bei der Polarität auf der Senderseite falsch liegst, passiert schlicht nichts — kein Schaden, einfach umdrehen. Das ist der zweite Grund für den Optokoppler: Er ist fehlerverzeihend.

Wichtig: ein Impuls, kein Dauerkontakt

Ein Tor-Handsender kennt nur Tastendruck. Wenn du den Kontakt dauerhaft schließt, ist das für den Sender ein endlos gedrückter Knopf: Er sendet permanent, die Batterie ist in Stunden leer, und der Empfänger sieht je nach Modus Unsinn.

Also: Impuls von 300–500 ms, dann wieder los.

In Python mit gpiozero sieht das so aus:

#!/usr/bin/env python3
"""Kurzer Impuls auf den Optokoppler = ein Tastendruck am Handsender."""
from gpiozero import DigitalOutputDevice
from time import sleep

# GPIO 4 (BCM) = physischer Pin 7
TOR = DigitalOutputDevice(4, active_high=True, initial_value=False)

def taste_druecken(dauer: float = 0.4) -> None:
    TOR.on()
    sleep(dauer)      # 300-500 ms sind ein realistischer Tastendruck
    TOR.off()

if __name__ == "__main__":
    taste_druecken()

initial_value=False ist kein Detail: Ohne das kann der Pin beim Booten kurz undefiniert sein — und ein Tor, das beim Neustart des Pi aufgeht, willst du nicht.

In Home Assistant selbst nutze ich dafür einen ESP-basierten Aktor, weil der näher am Tor sitzt. Die ESPHome-Konfiguration für einen sauberen Impuls-Ausgang:

switch:
  - platform: gpio
    pin: GPIO4
    id: tor_kontakt
    restore_mode: ALWAYS_OFF

button:
  - platform: template
    name: "Einfahrt Tor Impuls"
    id: tor_impuls
    on_press:
      - switch.turn_on: tor_kontakt
      - delay: 400ms
      - switch.turn_off: tor_kontakt

cover:
  - platform: template
    name: "Einfahrtstor"
    device_class: gate
    open_action:
      - button.press: tor_impuls
    close_action:
      - button.press: tor_impuls
    stop_action:
      - button.press: tor_impuls
    optimistic: true

restore_mode: ALWAYS_OFF ist aus demselben Grund gesetzt wie oben. Und optimistic: true deshalb, weil der Handsender dir keinerlei Rückmeldung gibt. Der Sender ist einseitig. Home Assistant weiß nicht, ob das Tor offen ist — es weiß nur, dass es einen Impuls geschickt hat. Wenn du echten Status willst, brauchst du zusätzlich einen Reedkontakt oder Endlagenschalter am Tor selbst. Das ist ein eigenes Projekt, aber es lohnt sich.

Die drei Optionen im Vergleich

Funk-Replay / Interception GPIO-Taster-Emulation Kommerzielles Tor-Modul (Shelly & Co.)
Kosten ~10–40 € (CC1101/RTL-SDR), Pi vorhanden ~2 € pro Tor + Ersatz-Handsender ~25–50 € pro Tor
Aufwand sehr hoch, offener Ausgang mittel, Löten nötig gering
Zuverlässigkeit bei mir: 0 % hoch, seit Monaten stabil hoch
Rückbaubar ja, nichts angefasst nur mit Ersatz-Handsender nein, Eingriff am Antrieb
Garantie Antrieb bleibt bleibt oft weg
Braucht Torzugang nein nein ja, Klemmleiste am Motor

Der große, unterschätzte Vorteil der Taster-Emulation: Du fasst den Antrieb nicht an. Keine Klemme am Motor, keine Leiter, keine Garantiefrage am teuren Teil. Du opferst einen Handsender für ~20 € — und den kaufst du dir vorher als Zweitgerät und lernst ihn an, dann bleibt dein Original unangetastet.

Drei Tore skalieren

Ich habe drei Tore. Zwei Wege sind sinnvoll:

  1. Ein Handsender mit mehreren Tasten — je Taste ein Optokoppler, je Optokoppler ein eigener GPIO. Günstig, kompakt. Funktioniert nur, wenn ein Sender wirklich alle Tore kann.
  2. Ein Handsender pro Tor — jeder auf eigener Batterie, jeder galvanisch getrennt am Pi. Das ist mein Setup. Etwas mehr Kabelsalat, dafür null Wechselwirkung: kein gemeinsamer Massebezug, kein Sender, der den anderen stört, und wenn einer stirbt, laufen die anderen weiter.

Weil jeder Sender auf seiner eigenen Batterie bleibt, gibt es keine Masseschleife zwischen den Kanälen. Genau das macht diese Lösung so langweilig stabil. Bei Batterien: Setz dir eine Erinnerung. Ein Sender, der ein Jahr lang täglich per Automation “gedrückt” wird, hält nicht so lange wie einer in der Jackentasche.

Sicherheit — und das ist kein Kleingedrucktes

Ein motorisiertes Tor ist eine Quetschgefahr. Es hat genug Kraft, um einem Kind ernsthaft weh zu tun.

  • Automatisiere niemals eine Torbewegung ohne Sichtkontakt. Keine “Tor schließt um 22 Uhr”-Automation, wenn du nicht davorstehst oder eine funktionierende Lichtschranke bzw. Sicherheitskontaktleiste hast.
  • Bestehende Sicherheitseinrichtungen bleiben, wie sie sind. Lichtschranke, Kraftabschaltung, Schließkantensicherung — nichts davon wird umgangen. Deine Bastelei sitzt vor dem Antrieb, nicht dazwischen.
  • Das Öffnen des Handsenders kostet dessen Garantie. Nimm den Zweitsender.
  • In manchen Ländern hat der unbeaufsichtigte Fernbetrieb eines Tores versicherungs- und haftungsrechtliche Konsequenzen. Wenn du auf Nummer sicher gehen willst: kurz bei deiner Versicherung nachfragen, bevor du das Tor vollautomatisch fährst.
  • Zur Funk-Frage: Senden auf 868 MHz ist reguliert. Einen Fixed-Code-Sender zu klonen, der dir gehört und an deinem eigenen Tor hängt, ist in der Regel unproblematisch — beliebige Signale in dieses Band zu blasen ist es nicht. Ein weiterer Grund, warum ich mit der Taster-Emulation deutlich besser schlafe: Es sendet weiterhin ausschließlich das zugelassene Originalgerät.

Fazit

Wenn dein einziger Zugang zum Tor der Handsender ist, versuch nicht als Erstes, sein Funkprotokoll nachzubauen. Ich habe das gemacht, ich habe rpitx zum Laufen gebracht, ich habe nachweislich gesendet — und das Tor blieb zu.

Zwei Euro Optokoppler, zehn Minuten Löten und ein 400-ms-Impuls haben das erledigt, woran wochenlanges Reverse Engineering gescheitert ist. Der Kleine hat’s drauf. Es ist nicht die elegante Lösung. Es ist die, die seit Monaten jeden Tag funktioniert.

Ich bin René, CTO aus Pasching bei Linz. Wenn dein Problem größer ist als ein Rollladen — Streaming, Cloud, lokale LLMs, Technikführung — dann steht hier, was ich beruflich mache.