ESP32 with CC1101 - RF Proxy stays unknown in HA

Hi all,

I've been trying to get an RF Proxy working using Googling and asking supposedly intelligent algorithms and I think I'm close but cannot get the last step to work. I have seen data popping up when using the remote_receiver. The entry "RF Proxy" shows up in Home Assistant but the state always end up being unknown and trying to onboard the Novy Cooker Hood results in the message "No radio frequency transmitters are available. Please set up a transmitter first."

Can someone please help me point out where I'm going wrong?

Pinout ESP32 and CC1101. First two columns are on the RF Module.

| CC1101 | PIN | ESP32  | Color  |
| ------ | --- | ------ | ------ |
| VCC    | 2   | 3.3V   | Red    |
| GND    | 1   | GND    | Black  |
| SCK    | 5   | GPIO18 | Orange |
| MISO   | 7   | GPIO19 | Yellow |
| MOSI   | 6   | GPIO23 | Purple |
| CSN    | 4   | GPIO21 | Green  |
| GDO0   | 3   | GPIO16 | Blue   |
| GDO2   | 8   | GPIO22 | Brown  |

Relevant part of my configuration:

# SPI bus
spi:
 clk_pin: GPIO18
 miso_pin: GPIO19
 mosi_pin: GPIO23

# CC1101
cc1101:
 cs_pin: GPIO21
 gdo0_pin: GPIO16
 frequency: 433.92MHz
 modulation_type: ASK/OOK
 output_power: 10
 symbol_rate: 5000

# RF transmitter
remote_transmitter:
 id: rf_tx
 pin: GPIO16  # Changed from GPIO17 to match CC1101 GDO0 (table)
 carrier_duty_percent: 100%
 non_blocking: true

# RF receiver
# remote_receiver:
#   id: rf_rx
#   pin: GPIO22  # Uncommented to match CC1101 GDO2 (table)
#   dump: all
#   tolerance: 25%
#   filter: 250us
#   idle: 4ms
#   buffer_size: 2kb

# Infrared
infrared:
 - platform: ir_rf_proxy
   id: rf_proxy
   name: RF Proxy
   frequency: 433.92MHz  #Docs state: frequency: 433 MHz
   remote_transmitter_id: rf_tx

Why are you using infrared instead of RF?
Also, remove the gdo0_pin from cc1101:

As far as I worked out reading the documentation (IR/RF Proxy - ESPHome - Smart Home Made Simple) this is the way to create the proxy element.

Removing that line does not change the state of the RF Proxy :frowning:

Edit: I had a look at the component api and you are right, it's configured as infrared:
Doesnt make sense, but it's on experimental state so...

There is an example config for the M5 Stack device that uses radio_frequency not infrared...

Yeah, I found that to but that component cannot be found. So maybe this is something that will appear in the next release but for now infrared seems to be the correct component. I could not find any usable information searching GitHub repostories...

Interesting. I can't find it on docs, neither on api. Do you have further info about that?

Unfortunately, no. I found that while trying to help on an earlier post... it seems like maybe there's been a miscommunication between either HA v. ESPHome or the docs v. API.
:man_shrugging:


I see this in the web interface of the ESP. Do I need to investigate ESP any further or is the issue in HA?

Interesting how it offers you 38kHz carrier even if you set all up as RF transmitter.
Did you try if it works?

You need to wait for the next major release of esphome (2026.5.0) to get radio_frequency to work with CC1101:

2 Likes

i was going crazy these days following the documentation, here to ask and found your reply... so, thank you!

For those not wanting to build their own hardware interface, is there any off-the-shelf modules that can do the job?

The blogpost mentions Broadlink RM4 Pro, but that only works on 433MHz. The ESP32 world seemed unprepared for this feature release. I don't find much that doesn't require a breadboard and a solding iron except for M5Stack. A CoreS3 and Stack CC1101 modules snap together easily, cost $60 plus shipping and tax. It's expensive because it includes unnecessary features for a simple RF proxy solution.

M5Stack CC1101 Module (855-925MHz)– m5stack-store
M5Stack CoreS3 SE IoT Controller without Battery Bottom– m5stack-store

Am I missing another supplier that has an off-the-shelf solution offering multiple frequencies? Or best to wait until the market catches up and offers such a product?

@mdehaas can you post your full config pls, i have a problem :frowning:

esphome:
  name: jarolift-cc1101
  friendly_name: jarolift-cc1101

web_server:
  port: 80  
  
esp32:
  variant: ESP32C6
logger:

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

ota:
  - platform: esphome
    password: "xxxxx0"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password  

spi:
  clk_pin: GPIO18
  mosi_pin: GPIO23
  miso_pin: GPIO19

cc1101:
  id: cc1101_radio
  cs_pin: GPIO5
  frequency: 433.92MHz
  modulation_type: ASK/OOK
  output_power: 10
  
remote_transmitter:
  id: rf_tx
  pin: GPIO21
  carrier_duty_percent: 100
  on_transmit:
    then:
      - cc1101.begin_tx: cc1101_radio
  on_complete:
    then:
      - cc1101.begin_rx: cc1101_radio

remote_receiver:
  id: rf_rx
  pin: GPIO22
  
radio_frequency:
  - platform: ir_rf_proxy
    id: rf_proxy_cc1101_tx
    name: "CC1101 RF Transmitter"
    frequency: 433.92MHz
    remote_transmitter_id: rf_tx
    # Optional: retune the CC1101 per-transmit when the API request specifies a
    # different carrier frequency.  Demonstrates the on_control trigger.
    on_control:
      then:
        - if:
            condition:
              lambda: "return x.get_frequency().has_value() && *x.get_frequency() > 0;"
            then:
              - cc1101.set_frequency:
                  id: cc1101_radio
                  value: !lambda "return *x.get_frequency();"
  - platform: ir_rf_proxy
    id: rf_proxy_cc1101_rx
    name: "CC1101 RF Receiver"
    frequency: 433.92MHz
    remote_receiver_id: rf_rx```

I got it to work for my Novy hood, with this code (running ESPHome 2026.5)

esphome:
  name: dampkap
  friendly_name: dampkap

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

# Enable logging
logger:

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

ota:
  - platform: esphome
    password: "..."

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Dampkap Fallback Hotspot"
    password: "..."

captive_portal:
    
spi:
  clk_pin: GPIO18
  miso_pin: GPIO19
  mosi_pin: GPIO23

cc1101:
  id: cc1101_radio
  cs_pin: GPIO21
  frequency: 433.92MHz
  modulation_type: ASK/OOK
  output_power: 10
  symbol_rate: 5000

remote_transmitter:
  id: rf_tx
  pin: GPIO17
  carrier_duty_percent: 100%
  non_blocking: true
  on_transmit:
    then:
      - cc1101.begin_tx: cc1101_radio
  on_complete:
    then:
      - cc1101.begin_rx: cc1101_radio

radio_frequency:
 - platform: ir_rf_proxy
   id: rf_proxy
   name: RF Proxy
   frequency: 433.92MHz 
   remote_transmitter_id: rf_tx

Hi all,

got it working now with the following code:

#-------------------------------
# Pinout ESP32 and CC1101
#-------------------------------
# CC1101 | PIN | ESP32  | Color
# -------+-----+--------+------
# VCC    | 2   | 3.3V   | Red
# GND    | 1   | GND    | Black
# SCK    | 5   | GPIO18 | Orange
# MISO   | 7   | GPIO19 | Yellow
# MOSI   | 6   | GPIO23 | Purple
# CSN    | 4   | GPIO21 | Green
# GDO0   | 3   | GPIO4  | Blue
# GDO2   | 8   | GPIO22 | Brown
#-------------------------------

spi:
  clk_pin: GPIO18
  miso_pin: GPIO19
  mosi_pin: GPIO23

cc1101:
  id: cc1101_radio
  cs_pin: GPIO21

# CC1101 GDO0 wired to one GPIO pin
remote_transmitter:
  id: rf_tx
  pin: GPIO4
  carrier_duty_percent: 100
  on_transmit:
    then:
      - cc1101.begin_tx: cc1101_radio
  on_complete:
    then:
      - cc1101.begin_rx: cc1101_radio

# CC1101 GDO2 wired to a second GPIO pin
remote_receiver:
  id: rf_rx
  pin: GPIO22

radio_frequency:
  - platform: ir_rf_proxy
    name: RF Proxy Transmitter
    frequency: 433.92MHz
    remote_transmitter_id: rf_tx
    # Optional: retune the CC1101 when an API request specifies a different
    # carrier frequency.  `x` is the radio_frequency call object.
    on_control:
      then:
        - if:
            condition:
              lambda: "return x.get_frequency().has_value() && *x.get_frequency() > 0;"
            then:
              - cc1101.set_frequency:
                  id: cc1101_radio
                  value: !lambda "return *x.get_frequency();"
  - platform: ir_rf_proxy
    name: RF Proxy Receiver
    frequency: 433.92MHz
    remote_receiver_id: rf_rx