My RTL_433 Setup

My RTL_433 Setup
One of many sensors I monitor with rtl_433 and home assistant

In my ever expanding home automation quest, I've amassed a small suite of 433mhz sensors - I opt for hardwired esphome/other wifi type iot sensors and controllers whenever I can (easy to troubleshoot, no batteries) but there are lower criticality areas I'd like to monitor without power nearby. This is where 433mhz sensors really shine - they are simple, often very cheap, and have long runtimes on battery (up to a year).

In this writeup I'll be going through my setup in detail, from the raw "hub" and sensors to my specific use cases and automations for each of them.

As of right now, I am using...

The hardware heart of this setup is an RTL-SDR, a little software defined radio that can pickup signals anywhere in the 27MHz-1700MHz range. I'm using a Nooelec unit, based on the realtek RTL2832U chipset. There are many different units all based on this particular chipset that are highly recommended - I have been running this Nooelec unit 24/7 for over 2 years without issue. I have it plugged in via a USB hub to my large proxmox host, passed through via usb to my home assistant VM.

The software heart of the setup is rtl_433, a nice software package that decodes data from over 200 common sensors in the 315MHz, 433MHz, 915MHz, and several other frequencies. Github user deviantintegral wrapped RTL433 into a home assistant add on, and this is how I run it. This add on uses the realtek hardware radio to listen for the devices and then outputs the data to an MQTT server. For MQTT broker duties, I run mosquitto as a home assistant add-on.

I also run deviantintegral's rtl433-mqtt-autodiscovery add on - this connects to the MQTT broker and creates home assistant entities for most devices that rtl_433 picks up.

Mosquitto, RTL_433, and RTL_433 MQTT Auto Discovery Add ons

The rtl433 add on repository provides two options - regular rtl_433, based on a stable build of rtl_433 from mid 2023, and and rtl_433 (next), based on the latest build. There have been ~ 60 protocols for devices added to rtl_433 in the past year, some of which I'm interested in (BMW TPMS sensors!) so I run the "next" variant.

Defining rtl_433 conf file location in the add on configuration

Initial configuration of the add on is fairly simple - you create an rtl_433.conf file, choose how you want to output the data (MQTT server), and choose which protocols you'd like to listen for, and which frequencies you want to listen on (not all protocols supported by rtl433 are at 433MHz). I started with the example.conf file in the rtl433 docs and made edits from there. I chose to enable all protocols (we live in the woods far from other homes) - if you lived in an urban area you may want to pair this down by commenting out protocols you don't plan on using.

Below I've included the relevant portions I modified.

Output:

output mqtt://x.x.x.x:1883,user=xxx,pass=xxxxxx,retain=1,devices=rtl_433/17069798-rtl433/devices[/type][/model][/subtype][/channel][/id],events=rtl_433/17069798-rtl433/events,states=rtl_433/17069798-rtl433/states

Output line, sending data to my mqtt broker (mosquitto, running as a home assistant add-on) - I have modified the output of the "next" add on to match the original - when I switched, this kept the same topic names, as mentioned here: https://github.com/pbkhrv/rtl_433-hass-addons/blob/main/rtl_433-next/README.md

Frequency:

# as command line option:
#   [-f <frequency>] [-f...] Receive frequency(s) (default: 433920000 Hz)
# default is "433.92M", other reasonable values are 315M, 345M, 915M and 868M
frequency     433.92M
frequency     315M
frequency     915M

Including all 3 frequencies of the sensors I'm interested in - 915M to pickup my soil moisture sensor + weather station and 315M to try and pickup TPMS sensors

Hop interval:

# as command line option:
#   [-H <seconds>] Hop interval for polling of multiple frequencies (default: 600 seconds)
# default is "600" seconds, only used when multiple frequencies are given
hop_interval  30

This option rotates through each of the 3 frequencies I'm listening on every 30s

Typically, to setup a device for the first time, I confirm I have it on the list of devices to listen for in my rtl_433.conf (almost always do as I have almost all protocols enabled). Then, I fire up mqtt explorer, connect to mosquitto, and watch for my new device. These devices usually have semi-unique IDs - I take and write this ID on the device in sharpie for future reference. If I don't see the device here, I'll go into the rtl433 add on logs and make sure I'm seeing data populate.

An acurite tower sensor with ID written on it - this one monitors my unconditioned attic space temperature (in the process of finishing it, want to make sure conditions are warm enough for mud/paint)

After that, I open home assistant, go to integrations -> mqtt and search for the semi unique ID of the sensor I'm looking for - usually, the rtl_433-autodiscovery add on has the sensor built and ready to use. I'll rename the individual entities to something human readable that describes their use case.

Sensor built in home assistant - renamed to "upstairs" humidity and temperature

That describes the majority of the technical setup - now, on to the use cases!

Fridge and Freezer Acurite Sensors

I monitor temperature in our fridge/freezer and a large upright freezer in the basement. I have these displayed for a quick glance as badges under my "kitchen" entities card.

Kitchen fridge/freezer temperature

I have simple automations setup for each of these to send alerts to our phones if freezer temperature gets above 10F for 5 minutes or if fridge temperature gets above 40F for 5 minutes.

alias: Basement Freezer Temperature Notification
description: ""
triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.acurite_tower_a_3475_temperature
    for:
      hours: 0
      minutes: 5
      seconds: 0
    above: 10
conditions: []
actions:
  - action: notify.mobile_app_jay_s24
    metadata: {}
    data:
      message: Basement Freezer Hot
  - action: notify.mobile_app_sm_s928u
    metadata: {}
    data:
      message: Basement Freezer Hot
mode: single

Automation for my basement freezer

Generic Acurite Temperature Sensors

I use these to keep tabs on basement, attic, and chicken + goose coop temperature and humidity.

Ecowitt WS90 Weather Station

Right now, I'm actually using the ecowitt integration with the ecowitt GW2000 gateway to pickup data from my weather station, but the outdoor unit transmits at 915MHz and is picked up by my Noolec SDR. I may transition to using the MQTT entities instead at some point in the future.

Ecowitt integration - the ws90 is an excellent little weather station
WS90 data in mqtt explorer, picked up by the noolec SDR

Govee Leak Detectors

These Govee leak detectors sit under all my sinks, toilets, and appliances that have water lines. I also have one under my well pump pressure tank - pretty much anywhere a water leak is likely to occur. I have a automation configured that sends an alert to our phones that a water leak is detected. These have an audible alarm so they are easy to find when you get that notification. A few weeks ago, we had 4" of rain and I had mild flooding in my basement near the door (leaks under the seal, have some grading work to do) - the sensors alerted me right away.

Govee leak detector underneath my well pressure tank

rtl_433_autodiscovery doesn't automatically create entities for these guys, so I had to build them out by defining binary sensors (leak on/off) in my home assistant configuration file. There are a couple of good write ups out there on setting this up and I forget which I copied but it may have been this one.

#Govee Leak Detectors
mqtt:
    binary_sensor:

    - state_topic: "rtl_433/17069798-rtl433/devices/Govee-Water/13936/event"
      payload_on: "Water Leak"
      payload_off: "Button Press"
      device_class: moisture
      unique_id: 13936_govee_water
      name: Guest Sink Right Water Leak
      value_template: "{{value_json.event}}"

    - state_topic: "rtl_433/17069798-rtl433/devices/Govee-Water/14178/event"
      payload_on: "Water Leak"
      payload_off: "Button Press"
      device_class: moisture
      unique_id: 14178_govee_water
      name: Furnace Water Leak
      value_template: "{{value_json.event}}"
      
    - state_topic: "rtl_433/17069798-rtl433/devices/Govee-Water/13485/event"
      payload_on: "Water Leak"
      payload_off: "Button Press"
      device_class: moisture
      unique_id: 13485_govee_water
      name: Master Bath Sink Water Leak
      value_template: "{{value_json.event}}"

    - state_topic: "rtl_433/17069798-rtl433/devices/Govee-Water/14016/event"
      payload_on: "Water Leak"
      payload_off: "Button Press"
      device_class: moisture
      unique_id: 14016_govee_water
      name: Master Bath Toilet Water Leak
      value_template: "{{value_json.event}}"
      
    - state_topic: "rtl_433/17069798-rtl433/devices/Govee-Water/13937/event"
      payload_on: "Water Leak"
      payload_off: "Button Press"
      device_class: moisture
      unique_id: 13937_govee_water
      name: Guest Bath Toilet Water Leak
      value_template: "{{value_json.event}}"

    - state_topic: "rtl_433/17069798-rtl433/devices/Govee-Water/13491/event"
      payload_on: "Water Leak"
      payload_off: "Button Press"
      device_class: moisture
      unique_id: 13491_govee_water
      name: Kitchen Sink Water Leak
      value_template: "{{value_json.event}}"
      
    - state_topic: "rtl_433/17069798-rtl433/devices/Govee-Water/13443/event"
      payload_on: "Water Leak"
      payload_off: "Button Press"
      device_class: moisture
      unique_id: 13443_govee_water
      name: Washing Machine Water Leak
      value_template: "{{value_json.event}}"
      

    - state_topic: "rtl_433/17069798-rtl433/devices/Govee-Water/13559/event"
      payload_on: "Water Leak"
      payload_off: "Button Press"
      device_class: moisture
      unique_id: 13559_govee_water
      name: Well Pump Water Leak
      value_template: "{{value_json.event}}"
      
    - state_topic: "rtl_433/17069798-rtl433/devices/Govee-Water/13936/event"
      payload_on: "Water Leak"
      payload_off: "Button Press"
      device_class: moisture
      unique_id: 13946_govee_water
      name: Fridge Water Leak
      value_template: "{{value_json.event}}"
      

Home assistant conf file establishing binary sensors for each leak detector

alias: Water leak notification
description: ""
triggers:
  - entity_id:
      - binary_sensor.washing_machine_water_leak
      - binary_sensor.guest_sink_left_water_leak
      - binary_sensor.kitchen_sink_water_leak
      - binary_sensor.well_pump_water_leak
      - binary_sensor.guest_sink_right_water_leak
      - sensor.guest_sink_left_water_leak_battery
      - binary_sensor.master_bath_sink_water_leak
      - binary_sensor.guest_bath_toilet_water_leak
      - binary_sensor.master_bath_toilet_water_leak
    to: "on"
    trigger: state
conditions: []
actions:
  - action: notify.mobile_app_sm_s928u
    metadata: {}
    data:
      message: Water Leak Detected
  - action: notify.mobile_app_jay_s24
    metadata: {}
    data:
      message: Water Leak Detected
mode: single

Water leak notification

Soil Moisture

We used this sensor to keep tabs on our garden when we lived in SC - it broadcasts at 915MHz. I had an esp8266 relay board setup to trigger garden hose valves that fed drip waterers in our raised beds. This was a great way to get feedback and adjust drip waterer runtime for optimal soil moisture. I packed it away when we moved and haven't set it up for our Maine garden but plan to next growing season. We were rushed and didn't have any sort of auxiliary watering system (plus a MUCH larger garden, visible from space on google maps), so it was up to the weather to keep our garden healthy this year.

Sensor as seen in mqtt explorer

TPMS Sensors

I've tried to pickup TPMS sensors from my two BMWs (support for gen3 and gen4/5 decoders has been added to RTL_433 in the past year) and Ford F250 - I've gotten a couple of TPMS signals but they may be from guest vehicles. This is an active work in progress but monitoring pressures in home assistant would be a huge leg up over the vehicle - the TPMS system in the BMWs just indicates high/low and if one TPMS sensor is not functional, the TPMS light stays on and I get no readings on the dash. It's not clear to me exactly when TPMS sensors broadcast (may only be on a change in pressure or at a certain wheel speed). My SDR is in the basement so a weak transmit signal also may not reach the unit. When the weather gets warm again, I plan to take the SDR out with my laptop and do some more troubleshooting. This write up inspired me.

Last TPMS reading

RF sensors with an SDR make a great complement to the more traditional zigbee/wifi sensors and will definitely have a place in my automation toolbelt moving forward.