Use an ESPHome device as a local rtl_433 receiver and expose selected temperature, humidity, battery, RSSI, stale, and last-updated entities directly in Home Assistant. You start from a checked-in ESPHome YAML file, adjust it for your board and sensors, then install it with ESPHome.
Start from the included rtl433-esphome-heltec-lora-32-v2.yaml file. It is the only profile in the repository today, and it targets a Heltec WiFi LoRa 32 V2-style ESP32 with an SX1278 radio at 433.92 MHz.
Firmware binaries are not published because the YAML contains deployment-specific device names, Home Assistant names, and sensor mappings. Review those values before installing it on your own device.
See YAML Configuration below for details on the options.
-
Copy
rtl433-esphome-heltec-lora-32-v2.yamlinto your ESPHome project or import it into the ESPHome dashboard. -
Update the top-level substitutions:
device_name: the ESPHome node name.friendly_name: the display name shown in Home Assistant.rtl433_esphome_ref: keeplatestunless you want to pin a release tag.
-
Make sure your ESPHome secrets provide
wifi_ssid,wifi_password, andfallback_ap_password. -
Check the hardware settings. If you are using a different ESP32 board, radio module, frequency, or pin wiring, update the board settings and the
rtl433_native.radiosection. -
List the physical sensors you want to track under
esphome.devices. These are the Home Assistant sub-devices, such asGarage FridgeorGarage Freezer. -
List the same logical sensors under
rtl433_native.known_sensors. For each sensor, choose:key: a stable YAML key, such asgarage_fridge.device_id: the matching ID fromesphome.devices.mapping: themodel/channel/idkey for the physical transmitter. If you do not know it yet, leave this top-level value out and addmappingunderentitiesinstead.entities: the readings you want Home Assistant to create.
-
Keep the Home Assistant time source in the YAML:
time: - platform: homeassistant id: homeassistant_time rtl433_native: time_id: homeassistant_time
The custom component requires
time_idfor restored stale-state aging and last-updated timestamps. It intentionally publisheslast_updatedabout 60 seconds in the past so Home Assistant relative-time displays stay on the "ago" side instead of occasionally rendering a small future offset when the device clock runs slightly ahead. -
In the ESPHome dashboard, choose the device and select Install.
-
After the device is online in Home Assistant, turn on Discovery Mode, find each sensor's
model/channel/idkey, and paste that key into the matching mapping text entity.
Use Discovery Mode when you need to identify which rtl_433 packet belongs to which real-world sensor. The most common times to use it are:
- First install, when you are creating your initial
known_sensorsmappings. - Adding another fridge, freezer, weather station, or other 433 MHz transmitter.
- Replacing batteries, if the transmitter comes back with a different ID.
- Troubleshooting a sensor that stopped updating because its mapping no longer matches the packets being received.
Normal operation does not require Discovery Mode. Known sensors keep updating while it is off, and unknown packets are ignored instead of becoming regular Home Assistant entities. Turning Discovery Mode on temporarily gives you a bounded candidate list so you can copy the right model/channel/id key into the mapping for a known sensor.
The names below use the default Heltec profile friendly_name.
- Turn on
rtl433_esphome heltec_lora_32_v2 Discovery Mode. - Press
rtl433_esphome heltec_lora_32_v2 Clear Candidatesso the list starts empty. - Make one physical sensor transmit. For battery-powered sensors, removing and reinserting the batteries is often the easiest way to force a packet.
- Watch
rtl433_esphome heltec_lora_32_v2 Candidate 1throughrtl433_esphome heltec_lora_32_v2 Candidate 10. - Look for the candidate whose temperature, humidity, battery, and RSSI values match the sensor you just triggered.
- Copy the candidate key at the start of the value. It uses
model/channel/idformat. - Paste that key into the matching mapping text entity. Use semicolons to list multiple keys for the same physical sensor.
- Confirm the logical temperature or humidity entity updates.
- Repeat the clear-and-trigger process for each additional sensor.
- Turn off
rtl433_esphome heltec_lora_32_v2 Discovery Mode.
Work through one sensor at a time when possible. Many 433 MHz devices transmit on their own schedule, so clearing the candidate list before each sensor makes it easier to tell which packet belongs to the sensor in your hand.
The checked-in YAML includes one local deployment as an example. Replace or remove these entries for your transmitters.
- Use
model/channel/idkeys from discovery candidates. - Use semicolons when one physical transmitter appears under multiple decoder keys.
- Example:
LaCrosse-TX141THBv2/0/203;TFA-303221/1/203
esphome:
devices:
- id: garage_fridge_device
name: Garage Fridge
time:
- platform: homeassistant
id: homeassistant_time
rtl433_native:
time_id: homeassistant_time
known_sensors:
- key: garage_fridge
device_id: garage_fridge_device
entities:
- humidity
- battery
- rssi
- stale
- last_updated
- mapping- Generated known-sensor entity names are data-point names only, such as
Temperature. Home Assistant combines them with the linked device name for display and entity IDs. device_idassigns generated entities to a per-sensor ESPHome sub-device.- Use
device_idwhen configuring more than one known sensor; without it, generated entities stay on the main ESPHome device and duplicate data-point names are rejected. mappingis optional. Omit it when themodel/channel/idkey is not known yet.- Adding
mappingtoentitiescreates a gateway-local Home Assistant text entity named from the known sensor, such asGarage Fridge Mapping. - If the top-level
mappingvalue is omitted, includemappingunderentitiesso the text entity exists for Discovery Mode to fill in later. - Mapping text entities can start blank and persist across reboots and OTA updates.
temperatureis optional. List only the entity types you want, such ashumidityandmappingfor a humidity-only sensor.- RSSI and last-updated entities are disabled by default.
- Mapping text entities stay on the main ESPHome device even when
device_idis set. time_idis required so restored stale-state aging and last-updated timestamps use a real wall-clock source.
Add only the entities you want for each known sensor:
- temperature
- humidity
- battery
- rssi
- stale
- last_updated
- mapping
mapping creates the Home Assistant text entity used to change the transmitter key without editing YAML after the device is installed.
- last_packet
- packet_count
- known_packet_count
- unknown_packet_count
- Gateway diagnostics are disabled by default.
- Candidate text sensors come from
candidate_limit. - Candidate text sensors are enabled by default but are not part of the primary sensor view.
- Add diagnostic options under
rtl433_nativeonly to override generated settings.
- discovery_mode
- clear_candidates_button
- status_button
Add control options under rtl433_native only to override generated settings.
The Heltec LoRa 32 V2 profile uses these component defaults:
rtl433_native:
led_pin: 25
radio:
module: SX1278
frequency: 433.92
pins:
dio0: 26
dio1: 35
dio2: 34
rst: 14
cs: 18
sck: 5
miso: 19
mosi: 27For different boards or wiring:
- Override any of those values under
rtl433_native. - Use substitutions if you want board-specific values at the top of the file.
substitutions:
led_pin: "25"
rf_module: SX1278
rf_frequency: "433.92"
rf_dio0_pin: "26"
rf_dio1_pin: "35"
rf_dio2_pin: "34"
rf_rst_pin: "14"
rf_cs_pin: "18"
rf_sck_pin: "5"
rf_miso_pin: "19"
rf_mosi_pin: "27"
rtl433_native:
led_pin: ${led_pin}
radio:
module: ${rf_module}
frequency: ${rf_frequency}
pins:
dio0: ${rf_dio0_pin}
dio1: ${rf_dio1_pin}
dio2: ${rf_dio2_pin}
rst: ${rf_rst_pin}
cs: ${rf_cs_pin}
sck: ${rf_sck_pin}
miso: ${rf_miso_pin}
mosi: ${rf_mosi_pin}uv sync --dev
./scripts/build- Validates the ESPHome config.
- Compiles with
PLATFORMIO_BUILD_JOBS=1. - Builds
rtl433-esphome-heltec-lora-32-v2.yamlby default. - Passes
rtl433_esphome_refthrough to ESPHome as the external component Git ref. - Uses the moving
latestGit tag by default.
RTL433_ESPHOME_REF=v0.1.0 ./scripts/buildFIRMWARE_CONFIG=path/to/another-board.yaml ./scripts/build./scripts/build --preflight: regenerate PlatformIO config and repair stale generated platform cache before compiling../scripts/esphome-preflight: run manually before OTA upload after Python, ESPHome, or PlatformIO changes.--update-global: also refresh PlatformIO Core/global packages.