RF433-Fernbedienungen in Home Assistant einbinden (MQTT + Lern-UI)

Servus
Ich habe genau das gerade hinter mir:

Aufgabe: Original Fernbedienung in HA/ESPHome einlernen um die Befehle dann später per HA Button wieder zu senden.
Wie beschrieben war es kein Honiglecken und gespickt mit Fallstricken. Ohne ständige Kontrolle der Protokolls per Oszilloscope hätte ich es nie geschafft.
Hier mein ESPHome code als Referenz: Die gesendeten Daten und das Timing wird bei dir natürlich nicht passen, aber evtl. hilft es dir als Ausgangsbasis

esphome:
  name: esp-dachfenster
  friendly_name: ESP_Dachfenster

esp32:
  board: esp32dev
  framework:
    type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "123"

ota:
  - platform: esphome
    password: "123"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 10.0.0.157
    gateway: 10.0.0.138
    subnet: 255.255.255.0
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp-Dachfenster Fallback Hotspot"
    password: "123"

captive_portal:

script:
  - id: sende_raw_paket
    mode: parallel
    parameters:
      bits: string # Das Skript erwartet jetzt nur noch den 41-Bit Text!
    then:
      - remote_transmitter.transmit_raw:
          carrier_frequency: 38kHz
          code: !lambda |-
            std::vector<long int> raw_signal;
            for (int i = 0; i < 10; i++) {
                raw_signal.push_back(1650); raw_signal.push_back(-350); 
                size_t bit_index = 0;
                for (char b : bits) {
                    bit_index++;
                    bool is_last_bit = (bit_index == bits.length());
                    if (b == '1') {
                        raw_signal.push_back(705); raw_signal.push_back(is_last_bit ? -705 : -305);
                    } else if (b == '0') {
                        raw_signal.push_back(305); raw_signal.push_back(-705);
                    }
                }
                raw_signal.push_back(5000); raw_signal.push_back(-2500);
            }
            return raw_signal;


spi:
  clk_pin: GPIO18
  mosi_pin: GPIO23
  miso_pin: GPIO19

cc1101:
  id: my_cc1101
  cs_pin: GPIO05
  frequency: 433.92MHz

remote_receiver:
  pin: GPIO02
  tolerance: 50%
  filter: 250us
  idle: 60ms
  buffer_size: 10kb    # Drastisch erhöht von der Standardgröße (erlaubt riesige Telegramme)
  dump:
    - rc_switch

remote_transmitter:
  pin: GPIO04
  carrier_duty_percent: 100%
  on_transmit:
    then:
      - cc1101.begin_tx
  on_complete:
    then:
      - cc1101.begin_rx

button:
  - platform: template
    name: "Dachfenster Rechts Auf"
    icon: "mdi:window-maximize"
    on_press:
      - script.execute:
          id: sende_raw_paket
          bits: "10010111111010101000100010000000111101011"

  - platform: template
    name: "Dachfenster Rechts Stop"
    icon: "mdi:window-maximize"
    on_press:
      - script.execute:
          id: sende_raw_paket
          bits: "10010111111010101000101010000000111101101"
  
  - platform: template
    name: "Dachfenster Rechts Zu"
    icon: "mdi:window-maximize"
    on_press:
      - script.execute:
          id: sende_raw_paket
          bits: "10010111111010101000001110000000111111111"