Build · Sketch · 433 · 868 · 915 MHz · v1.1.1

The Radio Sensor Listener.

What it does
Hears the weather station and wireless sensors you already own, sends every reading to your endpoint or Home Assistant
Radios
A two-dollar 433 MHz receiver on one pin · or a CC1101 on SPI · or a Heltec V2’s own radio
Heard on our bench
An AcuRite Iris (Build 1); Ecowitt WH31, WH51 and WN34 sensors (Build 5)
License
Source Apache-2.0. The CC1101 images link rtl_433_ESP, so those images are GPL-3.0; the bare-receiver image stays Apache-2.0. Source: the project .zip below and GitHub

The weather station on your fence post has been broadcasting its readings into the air every few seconds since the day you put it up. So has the little tower sensor in the greenhouse, and the soil probe by the tomatoes. They shout to anyone who cares to listen, and until now the only thing listening was the little display on the kitchen counter. This node listens too. An ESP32 you flash from this page, with a two-dollar receiver or a five-dollar radio module beside it, hears them and lands every reading in a place you own: your own endpoint, a broker you run, or straight into Home Assistant. It is the BLE Listener’s sibling, tuned to the bands where the outdoor sensors live.

Until 2026-09-18 this page was called the Weather-Station Listener. It hears soil probes, leak sensors and tank gauges as readily as weather stations, on three bands, so the page has the wider name. The sketch keeps its original name in its source, its firmware and on GitHub (oat-weather-listener), so stream tags and existing links do not change. For every listener by band, Bluetooth included, see Listeners, by band.

Pick your listener.

One sketch, four builds on this page. Which one you flash follows from what you own, because a radio hears one kind of signal at a time and the kind is fixed when the image is built. Choose, and the page shows that build alone. (Build 4, a CC1101 with our own AcuRite decoder, is still on the bench page.)

Not sure which yours is? Find your sensor below: type its name and the table answers with the build.

the four builds, side by side
1 · Two-dollar receiver2 · CC1101, on-off keying3 · CC1101, FSK5 · CC1101, Ecowitt
Radioa bare 433 MHz superheterodyne receiver module, about $2a CC1101 module, about $5 (or a Heltec V2’s own SX1276)the same CC1101, the 868/915 kind for those bandsa CC1101 sold as 868/915
Wiringthree wires, one pineight wires, SPIeight wires, SPIsix wires, SPI
Band433.92, fixed by the modulea setting, 300 to 928; 433.92 by defaulta setting; 915.00 by default, 868.35 in Europe, 433.92 elsewherea setting; 915.00 by default
Hearson-off keyingon-off keyingFSKFSK, framed by the chip
Decodersone, ours: the AcuRite 5-in-1223, the rtl_433 project’s153, the rtl_433 project’sthree families, ours: WH31, WH51, WN34
Signal levelnone; a bare receiver cannot measure itdBm per stationdBm per stationdBm per sensor
Rangetens of metres on our bench, with a poor antennanot yet measured herenot yet measured hereacross a room at −43 to −66 dBm; farther not yet measured
StatusHeard an AcuRite Iris on our bench, 2026-09-07Built and offered as beta; not yet run on our benchBuilt; not yet heard a sensor. Unproven images are on the bench pageHeard a WH31B, two WH51 and a WN34 on our bench, 2026-10-04

Find your sensor.

Type a make or a model. The answer is the build that hears it, the band to set, and how sure we are. Heard on our bench means exactly that. Decoder in the image means a decoder for that device (the rtl_433 project’s, or ours on Build 5) is in the image we ship and we have not yet heard one ourselves. No decoder means nothing open decodes it, and the note says what to do instead.

the devices growers ask about, and the build that hears each
DeviceBuild · band (MHz)State
AcuRite Iris 06004M (5-in-1)The two-dollar receiver
433.92
Heard on our bench, 2026-09-07, Tennessee bench. The reference station. Two message types alternate. The only device this build decodes.
AcuRite Iris (5-in-1), Atlas, 3-in-1, 592TXR tower, 6045 lightning, 899 rainCC1101, on-off keying
433.92
Decoder in the image; not yet heard here. One decoder covers the family.
AcuRite 609TXC, 606TX, 590TX, 00275rm room sensors, 986 refrigerator and freezer probesCC1101, on-off keying
433.92
Decoder in the image; not yet heard here. The cheapest extra streams there are. The 986 is a walk-in cooler probe.
La Crosse TX141 family (TX141-Bv2, TX141TH-Bv2, TX141-Bv3, TX141W, TX145wsdth)CC1101, on-off keying
433.92
Decoder in the image; not yet heard here. Only the TX141 line is on-off keying. La Crosse View (LTV) and the IT+ probes are FSK: see that build.
La Crosse older TX sensors, WS-2310 / WS-3600, WS7000CC1101, on-off keying
433.92
Decoder in the image; not yet heard here.
Oregon Scientific THGR, THN, WGR, PCR, UVN series; SL109H; v1 sensorsCC1101, on-off keying
433.92
Decoder in the image; not yet heard here. Older stations, still everywhere.
Ambient Weather F007TH, TX-8300CC1101, on-off keying
433.92
Decoder in the image; not yet heard here. Ambient’s on-off-keying probes. Its WS-2902 arrays and WH31 probes are FSK.
Fine Offset WH1080 / WH3080, WH1050, WH2 / WH5, WH0530; Ecowitt WH53CC1101, on-off keying
433.92 (868 in Europe)
Decoder in the image; not yet heard here. The on-off-keying ancestors of today’s Ecowitt line, sold under Froggit, Maplin, Watson and a dozen other names.
Soil probes: Homelead HG9901 (Geevon, Dr.Meter, Royal Gardineer), RainPoint soil, Opus XT300, SpringfieldCC1101, on-off keying
433.92
Decoder in the image; not yet heard here. Garden-centre soil probes. Consumer accuracy; the trend is the value.
Rain gauges: AcuRite 896, Baldr / RainPoint, TFA Drop, Cotech 36-7900, EMOS E6016, BiltemaCC1101, on-off keying
433.92
Decoder in the image; not yet heard here.
Europe’s 433 long tail: Nexus, Bresser 3CH, TFA 30.3221 and Twin Plus, Auriol (Lidl), Rubicson, Hideki, EMOS, Solight, Kedsum, PrologueCC1101, on-off keying
433.92
Decoder in the image; not yet heard here. The supermarket and hardware-store sensors of Europe.
Pool, freezer and tank: Rubicson and TFA pool thermometers, ThermoPro TX-2, Watchman Plus oil tankCC1101, on-off keying
433.92
Decoder in the image; not yet heard here. A floating pool thermometer is a stock-tank thermometer.
Govee H5054 water-leak detectorCC1101, on-off keying
433.92
Decoder in the image; not yet heard here.
Ecowitt WN31 (WH31), Ambient WH31E and WH31B temperature-humidity, any of the eight channelsCC1101, Ecowitt (Build 5)
915 heard · 868 · 433 by region
Heard on our bench, 2026-10-04, Tennessee bench, 915 MHz. Ours was a WH31B on channel 1. Its reading matched the Ecowitt gateway hearing the same sensor.
Ecowitt WH51 / WH51L soil moistureCC1101, Ecowitt (Build 5)
915 heard · 868 · 433 by region
Heard on our bench, 2026-10-04, Tennessee bench, 915 MHz, two WH51 probes. Under twenty dollars a probe, one AA a year. Each probe arrives under its own radio id, so swapping channels never swaps histories. The WH51L sends the same frame; not heard here yet.
Ecowitt WN34 S / L / D and WN38 temperature probes (Froggit DP150)CC1101, Ecowitt (Build 5)
915 heard · 868 · 433 by region
Heard on our bench, 2026-10-04, Tennessee bench, 915 MHz, a WN34 (the S and L send the same frame). The WN34D and WN38 send the same frame with a different temperature scale; both are decoded, neither heard here yet.
Ecowitt / Ambient arrays: WS69, WH65 (WS-2902), WH24, and the WH25 / WH32 indoor-outdoor unitsCC1101, FSK
915 · 868 · 433 by region
Decoder in the image; not yet heard here.
Ecowitt WS80, WS85, WS90 ultrasonic arraysCC1101, FSK
915 · 868 · 433 by region
Decoder in the image; not yet heard here. No moving parts. The piezo rain reading wants calibrating against a tipping gauge.
Ecowitt WH52 soil moisture, temperature and ECCC1101, FSK
915 · 868 · 433 by region
Decoder in the image; not yet heard here. On the air the conductivity is just a field; some consoles show it only in the vendor’s cloud.
Ecowitt WH40 rain gauge; WS68 wind and lightCC1101, FSK
915 · 868 · 433 by region
Decoder in the image; not yet heard here. The tipping bucket Ecowitt itself recommends beside a piezo array.
Ecowitt WH55 water-leak sensorCC1101, FSK
915 · 868 · 433 by region
Decoder in the image; not yet heard here.
Ecowitt WH57 lightning (Ambient WH31L)CC1101, FSK
915 · 868 · 433 by region
Decoder in the image; not yet heard here.
Ecowitt WH43 PM2.5, WH45 and WH46 air qualityCC1101, FSK
915 · 868 · 433 by region
Decoder in the image; not yet heard here. The older WH41 is not registered in this library build.
La Crosse View: LTV-TH, LTV-R1 / R3 rain, LTV-W1 / W2 wind, LTV-WR1, Breeze ProCC1101, FSK
915
Decoder in the image; not yet heard here. Decoder linked; the library tunes its FSK receiver for Fine Offset’s bit rate, so reception of other families is untested.
La Crosse IT+: TX29-IT, TX35DTH-IT, TX22U-IT, TX31U-IT, TX34-IT (TFA 30.3159.IT, 30.3155)CC1101, FSK
868 Europe · 915 Americas
Decoder in the image; not yet heard here. Same caution: linked, untested here.
Bresser 5-in-1, 6-in-1 and 7-in-1 weather centres; Bresser soil, leak, lightning and air-quality sensorsCC1101, FSK
868 Europe · 915 Americas
Decoder in the image; not yet heard here. Europe’s most common station family. Same caution: linked, untested here.
TFA 30.3151, 30.3196, 30.390X, Marbella pool; Inkbird ITH-20R; ThermoPro TX-7B; Govee H5059 leak, H5310 poolCC1101, FSK
868 Europe · 915 Americas · 433
Decoder in the image; not yet heard here. Same caution: linked, untested here.
Ecowitt WN30, WN35 leaf wetness, WN36 pool, WH41 PM2.5, WFC01 water valveNo open decoder
—
No decoder. No decoder in this library build. An Ecowitt gateway’s custom-server feed through the gather bridge carries them.
Davis Vantage Vue / Pro2No open decoder
—
No decoder. Frequency-hopping link no open decoder handles reliably. Use WeatherLink Live through the bridge.
WeatherFlow Tempest; Netatmo and other cloud stationsNo open decoder
—
No decoder. Tempest: its hub’s local UDP feed through the bridge. Netatmo: nothing local to hear.

That table is the short list. The long one is not typed by anyone: it is generated from the two registration lists inside the decoder library our images are built against (rtl_433_ESP, commit 236c816, read 2026-09-18), so a device cannot appear under an image that does not link its decoder. The search box above filters these too. Many entries are not weather sensors at all: doorbells, tyre-pressure sensors, remotes. They arrive as raw values; nothing is dropped.

All 223 decoders in the on-off-keying image (Build 2)
  • Amazon Basics Meat Thermometer
  • Acurite 896 Rain Gauge
  • Acurite 609TXC Temperature and Humidity Sensor
  • Acurite 592TXR Temp/Humidity, 592TX Temp, 5n1 Weather Station, 6045 Lightning, 899 Rain, 3N1, Atlas
  • Acurite 986 Refrigerator / Freezer Thermometer
  • Acurite 606TX Temperature Sensor
  • Acurite 00275rm,00276rm Temp/Humidity with optional probe
  • Acurite 590TX Temperature with optional Humidity
  • Acurite Grill/Meat Thermometer 01185M
  • Akhan 100F14 remote keyless entry
  • AlectoV1 Weather Sensor (Alecto WS3500 WS4500 Ventus W155/W044 Oregon)
  • Ambient Weather F007TH, TFA 30.3208.02, SwitchDocLabs F016TH temperature sensor
  • Ambient Weather TX-8300 Temperature/Humidity Sensor
  • Astrostart 2000 Car Remote (-f 372.4M)
  • Atech-WS308 temperature sensor
  • Audiovox PRO-OE3B Car Remote (-f 303.4M)
  • Auriol 4-LD5661/4-LD5972/4-LD6313, Sempre 4-AH0423-4 temperature/rain sensors
  • Auriol AFT 77 B2 temperature sensor
  • Auriol AFW2A1 temperature/humidity sensor
  • Auriol AHFL temperature/humidity sensor
  • Auriol HG02832, HG05124A-DCF, Rubicson 48957 temperature/humidity sensor
  • Auriol HG04641A temperature station
  • Baldr HCS528ARF Pool Thermometer sensor
  • Baldr / RainPoint rain gauge.
  • Baldr E0666TH Thermo-Hygrometer
  • Blyss DC5-UK-WH
  • bm5-v2 12V Battery Monitor
  • Brennenstuhl RCS 2044
  • Bresser Thermo-/Hygro-Sensor 3CH
  • Bresser Thermo-/Hygro-Sensor Explore Scientific ST1005H
  • Biltema rain gauge
  • Burnhard BBQ thermometer
  • Calibeur RF-104 Sensor
  • Cardin S466-TX2
  • Celsia CZC1 Thermostat
  • Chrysler Car Remote (-f 315.1M -s 920k)
  • Chuango Security Technology
  • Clipsal CMR113 Cent-a-meter power meter
  • Code Alarm FRDPC2002 Car Remote
  • Companion WTR001 Temperature Sensor
  • Compustar 1WG3R Car Remote
  • Cotech 36-7900 rain gauge
  • Cotech 36-7959, SwitchDocLabs FT020T wireless weather station with USB
  • Cotech FT0203/18-3676 anemometer
  • Dickert MAHS433-01 garage door remote control
  • Digitech XC-0324 / AmbientWeather FT005TH temp/hum sensor
  • Dish remote 6.3
  • DSC Security Contact
  • DSC Security Contact (WS4945)
  • Ecowitt Wireless Outdoor Thermometer WH53/WH0280/WH0281A
  • Eurochron EFTH-800 temperature and humidity sensor
  • Elro DB286A Doorbell
  • ELV EM 1000
  • ELV WS 2000
  • EMOS E6016 weatherstation with DCF77, EMOS E6018 temperature/humidity sensor
  • EMOS E6016 rain gauge
  • EnOcean ERP1
  • ERT Interval Data Message (IDM)
  • ERT Interval Data Message (IDM) for Net Meters
  • ERT Standard Consumption Message (SCM)
  • ESA1000 / ESA2000 Energy Monitor, GIRA Wetterstation
  • Esperanza EWS
  • Esun EN2053 two-channel BBQ thermometer
  • Eurochron temperature and humidity sensor
  • Fine Offset Electronics, WH2, WH5, Telldus Temperature/Humidity/Rain Sensor
  • Agimex Rosenborg 66796 (collides with Fine Offset Electronics WH5) Temperature/Humidity Sensor
  • Fine Offset Electronics, WH0530 Temperature/Rain Sensor
  • Fine Offset WH1050 Weather Station
  • Fine Offset Electronics WH1080/WH3080 Weather Station
  • Florabest FB-TH-1 BBQ Thermometer
  • Ford Car Key
  • FS20 / FHT
  • FT-004-B Temperature Sensor
  • Funkbus / Instafunk (Berker, Gira, Jung)
  • Gasmate BA1008 meat thermometer
  • Geevon TX16-3 outdoor sensor
  • Geevon TX19-1 outdoor sensor
  • Generic wireless motion sensor
  • Generic Remote SC226x EV1527
  • Generic temperature sensor 1
  • GM ABO1502T Car Remote (-f 314.9M)
  • Govee Water Leak Detector H5054, Door Contact Sensor B5023
  • Govee Water Leak Detector H5054
  • RF-T0912 Grill Thermometer
  • Globaltronics QUIGG GT-TMBBQ-05
  • Globaltronics GT-WT-02 Sensor
  • Globaltronics GT-WT-03 Sensor
  • Microchip HCS200/HCS300 KeeLoq Hopping Encoder based remotes
  • Microchip HCS361 KeeLoq Hopping Encoder based remotes (-f 315.1M) (Sync, 833 bit/s)
  • Microchip HCS361 KeeLoq Hopping Encoder based remotes (-f 315.1M) (Sync, 1667 bit/s)
  • Microchip HCS361 KeeLoq Hopping Encoder based remotes (-f 315.1M) (No Sync, 833 bit/s)
  • Microchip HCS361 KeeLoq Hopping Encoder based remotes (-f 315.1M) (No Sync, 1667 bit/s)
  • Microchip HCS361 KeeLoq Hopping Encoder based remotes (-f 315.1M) (PIWM, 2500 bit/s)
  • Microchip HCS361 KeeLoq Hopping Encoder based remotes (-f 315.1M) (PIWM, 5000 bit/s)
  • Microchip HCS362 KeeLoq PWM
  • Microchip HCS362 KeeLoq MC
  • HIDEKI TS04 Temperature, Humidity, Wind and Rain Sensor
  • Holman Industries iWeather WS5029 weather station (older PWM, OOK), BIOWIN 270208
  • Homelead HG9901 (Geevon, Dr.Meter, Royal Gardineer) soil moisture/temp/light level sensor
  • Honeywell Door/Window Sensor, 2Gig DW10/DW11, RE208 repeater
  • Honeywell ActivLink, Wireless Doorbell
  • HT680 Remote control
  • IBIS beacon
  • inFactory, nor-tec, FreeTec NC-3982-913 temperature humidity sensor
  • Inovalley kw9015b, TFA Dostmann 30.3161 (Rain and temperature sensor)
  • Interlogix GE UTC Security Devices
  • Intertechno 433
  • Jasco/GE Choice Alert Security Devices
  • Kedsum Temperature & Humidity Sensor, Pearl NC-7415
  • Kerui PIR / Contact Sensor
  • Kidde RF-SM-DC wireless-interconnect smoke alarm
  • Klimalogg
  • LaCrosse TX Temperature / Humidity Sensor
  • LaCrosse TX141-Bv2, TX141TH-Bv2, TX141-Bv3, TX141W, TX145wsdth, (TFA, ORIA) sensor
  • LaCrosse Technology TX22U-IT (OOK)
  • LaCrosse/ELV/Conrad WS7000/WS2500 weather sensors
  • LaCrosse WS-2310 / WS-3600 Weather Station
  • LightwaveRF
  • Markisol, E-Motion, BOFU, Rollerhouse, BF-30x, BF-415 curtain remote
  • Martec MPLCD Ceiling Fan Remote
  • Maverick ET73
  • Maverick ET-732/733 BBQ Sensor
  • Mebus 433
  • Linear Megacode Garage/Gate Remotes
  • MIC 6SC2 Car Remote (-f 315.1M)
  • Missil ML0757 weather station
  • Neptune R900 flow meters
  • Template decoder
  • KlikAanKlikUit Wireless Switch
  • Nexa
  • Nexus, FreeTec NC-7345, NX-3980, Solight TE82S, TFA 30.3209 temperature/humidity sensor
  • Nexus, CRX, Prego sauna temperature sensor
  • Nice Flor-s remote control for gates
  • Norgo NGE101
  • Oil Ultrasonic STANDARD ASK
  • Omni Multisensor
  • Opus/Imagintronix XT300 Soil Moisture
  • Oregon Scientific Weather Sensor
  • Oregon Scientific SL109H Remote Thermal Hygro Sensor
  • OSv1 Temperature Sensor
  • Oria WA150KM freezer and fridge thermometer
  • Philips outdoor temperature sensor (type AJ3650)
  • Philips outdoor temperature sensor (type AJ7010)
  • SmartFire Proflame 2 remote control
  • Prologue, FreeTec NC-7104, NC-7159-675 temperature sensor
  • Proove / Nexa / KlikAanKlikUit Wireless Switch
  • Quhwa
  • Radiohead ASK
  • Sensible Living Mini-Plant Moisture Sensor
  • RainPoint soil temperature and moisture sensor
  • RainPoint HCS012ARF Rain Gauge sensor
  • Regency Ceiling Fan Remote (-f 303.75M to 303.96M)
  • Revolt NC-5642 Energy Meter
  • Revolt ZX-7717 power meter
  • RF-tech
  • RfxMeter, RFXPwr
  • Risco 2 Way Agility protocol, Risco PIR/PET Sensor RWX95P
  • Rosstech Digital Control Unit DCU-706/Sundance/Jacuzzi
  • Rubicson, TFA 30.3197 or InFactory PT-310 Temperature Sensor
  • Rubicson 48659 Thermometer
  • Rubicson Pool Thermometer 48942
  • Conrad S3318P, FreeTec NC-5849-913 temperature humidity sensor, ORIA WA50 ST389 temperature sensor
  • Sainlogic SA8, Gevanti SA8 Weather Station
  • Schou 72543 Day Rain Gauge, Motonet MTX Rain, MarQuant Rain Gauge, TFA Dostmann 30.3252.01/47.3006.01 Rain Gauge and Thermometer, ADE WS1907
  • Schrader TPMS
  • Schrader TPMS EG53MA4, Saab, Opel, Vauxhall, Chevrolet
  • Schrader TPMS SMD3MA4 (Subaru)
  • Schrader TPMS MRXNIS315G3, 3039 (Infiniti, Nissan, Renault), aka Redi-Sensor SE10001HP/SE10001HPR
  • Schrader TPMS MRXBC5A4 (BMW)
  • Standard Consumption Message Plus (SCMplus)
  • Security+ (Keyfob)
  • Shenzhen Wale WL-TH6R Temperature & Humidity Sensor
  • Siemens 5WY72XX Car Remote (-f 315.1M)
  • Silvercrest Remote Control
  • SimpliSafe Home Security System (May require disabling automatic gain for KeyPad decodes)
  • Skylink HA-434TL motion sensor
  • Wireless Smoke and Heat Detector GS 558
  • Solight TE44/TE66, EMOS E0107T, NX-6876-917
  • Somfy RTS
  • Springfield Temperature and Soil Moisture
  • Telldus weather station FT0385R sensors
  • TFA Dostmann 30.3221.02 T/H Outdoor Sensor (also 30.3249.02)
  • TFA Drop Rain Gauge 30.3233.01
  • TFA pool temperature sensor
  • TFA-Twin-Plus-30.3049, Conrad KW9010, Ea2 BL999
  • Thermopro TP11 Thermometer
  • ThermoPro TP08/TP12/TP20 thermometer
  • ThermoPro-TX2 temperature sensor
  • ThermoPro TX-2C Thermometer and Humidity sensor
  • Thermor DG950 weather station
  • Thermor A6N 132TX temperature sensor
  • EezTire E618, Carchet TPMS, TST-507 TPMS
  • Gear Hive TPMS sensor
  • GM-Aftermarket TPMS
  • iMars T240 TPMS
  • Jansite TPMS TY-468-eu2 / KKMOON TPMS
  • Schrader Motorcycle TPMS sensor
  • SmarTire TPMS sensor, Aston Martin/Vantage DB9 protocol
  • TRW TPMS OOK OEM and Clone models
  • TyreGuard 400 TPMS
  • TR-502MSV remote smart socket controller
  • TS-FT002 Wireless Ultrasonic Tank Liquid Level Meter With Temperature Sensor
  • Emos TTX201 Temperature Sensor
  • 2GIG-KEY2E-345 encrypted keyfob
  • Universal (Reverseable) 24V Fan Controller
  • Vaillant calorMatic VRT340f Central Heating Control
  • Vauno EN8822C
  • Visonic powercode
  • Vivint Door/Window Sensor, V-DW21R-345/V-DW11-345
  • WallarGe CLTX001 Outdoor Temperature Sensor
  • Kingspan/Watchman Plus (Niveau) oil tank monitor
  • Watts WFHT-RF Thermostat
  • Watts WFHT-RF / WFHC-MASTERH&C-RF underfloor heating thermostat
  • Waveman Switch Transmitter
  • WEC-2103 temperature/humidity sensor
  • WG-PB12V1 Temperature Sensor
  • WS2032 weather station
  • Hyundai WS SENZOR Remote Temperature Sensor
  • WT0124 Pool Thermometer
  • WT450, WT260H, WT405H
  • X10 RF
  • X10 Security
  • Yale HSA (Home Security Alarm), YES-Alarmkit
All 153 decoders in the FSK image (Build 3)
  • Alps FWB1U545 Car Remote
  • Ambient Weather WH31E Thermo-Hygrometer Sensor, EcoWitt WH40/WN20 rain gauge, WS68 weather station
  • ANT and ANT+ devices
  • Apator Metra E-ITN 30 heat cost allocator
  • Apator Metra E-RM 30 water meter
  • Arad/Master Meter Dialog3G water utility meter
  • TBH weather sensor
  • Arexx Multilogger IP-HA90, IP-TH78EXT, TSN-70E
  • Orion Endpoint from Badger Meter, GIF2014W-OSE, water meter, hopping from 904.4 Mhz to 924.6Mhz (-s 1600k)
  • Orion Endpoint from Badger Meter, GIF2020OCECNA, water meter, hopping from 904.4 Mhz to 924.6Mhz (-s 1600k)
  • Badger ORION water meter, 100kbps (-f 916.45M -s 1200k)
  • Bresser Weather Center 5-in-1
  • Bresser Weather Center 6-in-1, 7-in-1 indoor, soil, new 5-in-1, 3-in-1 wind gauge, Froggit WH6000, Ventus C8488A
  • Bresser Weather Center 7-in-1, Air Quality PM2.5/PM10 7009970, CO2 7009977, HCHO/VOC 7009978 sensors
  • Bresser SmartHome Garden soil moisture and water timer valve (Baldr Homgar, RainPoint)
  • Bresser water leakage
  • Bresser lightning
  • Cavius smoke, heat and water detector
  • Cavius Door/Window sensor (-f 868.7M)
  • CED7000 Shot Timer
  • Chamberlain CWPIRC PIR Sensor
  • Continental KR5V2X Car Remote (-f 313.8M -s 1024k)
  • Honda Keyfob KR5V2X/1X (-f 433.6M -s 1024k)
  • Cellular Tracking Technologies LifeTag/PowerTag/HybridTag
  • CurrentCost Current Sensor
  • Danfoss CFR Thermostat
  • DeltaDore X3D devices
  • DirecTV RC66RX Remote Control
  • Eberle Instat 868r1 floor heating thermostat remote
  • Voltcraft EnergyCount 3000 (ec3k)
  • EcoDHOME Smart Socket and MCEE Solar monitor
  • Eco-Eye solar PV/grid current monitor
  • Efergy e2 classic
  • Efergy Optical
  • Elero bidirectional blinds/awning remote (Silent Gliss and others)
  • Elsner Solexa 230V
  • Elster/Honeywell R2S/REXU power meter
  • Elster/Honeywell R2S/REXU power meter, type-2 frames
  • Emax W6, rebrand Altronics x7063/4/x7064A, Optex 990040/50/51, Orium 13093/13123, Infactory FWS-1200, Newentor Q9, Otio 810025, Protmex PT3390A, Jula Marquant 014331/32, TechniSat IMETEO X6 76-4924-00, Weather Station or temperature/humidity sensor
  • emonTx OpenEnergyMonitor
  • EN2058 four probe temperature sensor
  • ESIC EMT7110 power meter
  • Fine Offset Electronics, WH25, WH32, WH32B, WN32B, WH24, WH65, WS69, HP1000, Misol WS2320 Temperature/Humidity/Pressure Sensor
  • Fine Offset Electronics/Ecowitt WH51, WN31, SwitchDoc Labs SM23 Soil Moisture Sensor
  • TFA 30.3151 Weather Station
  • Fine Offset Electronics WH1080/WH3080 Weather Station (FSK)
  • Ambient Weather WH31L (FineOffset WH57) Lightning-Strike sensor
  • Fine Offset Electronics WH43 air quality sensor
  • Fine Offset Electronics WH45 air quality sensor
  • Fine Offset Electronics WH46 air quality sensor
  • Fine Offset Electronics / Ecowitt WH52 Soil Moisture/Temperature/EC Sensor
  • Fine Offset / Ecowitt WH55 water leak sensor
  • Fine Offset Electronics WN34S/L/D, WN38 and Froggit DP150/D35 temperature sensor
  • Fine Offset Electronics WS80 weather station
  • Fine Offset Electronics WS85 weather station
  • Fine Offset Electronics WS90 weather station
  • Flowis flow meters
  • FSL Cricket Scoreboard Controller
  • GE Color Effects
  • GEO minim+ energy monitor
  • Govee Water Leak Detector H5059
  • Govee H5112 Dual-Probe Thermometer
  • Govee Pool/Spa Thermometer H5310
  • Landis & Gyr Gridstream Power Meters 9.6k
  • Landis & Gyr Gridstream Power Meters 19.2k
  • Landis & Gyr Gridstream Power Meters 38.4k
  • Hanwell ML/RL4000-series Radiologger temperature/humidity sensor
  • Microchip HCS200/HCS300 KeeLoq Hopping Encoder based remotes (FSK)
  • AOK Weather Station rebrand Holman Industries iWeather WS5029, Conrad AOK-5056, Optex 990018
  • Holman Industries iWeather WS5029 weather station (older PWM)
  • Honda Car Key
  • Honeywell CM921 Wireless Programmable Room Thermostat
  • Honeywell ActivLink, Wireless Doorbell (FSK)
  • IKEA Sparsnas Energy Meter Monitor
  • Inkbird ITH-20R temperature humidity sensor
  • Insteon
  • LaCrosse Technology View LTV-WSDTH01 Breeze Pro Wind Sensor
  • LaCrosse Technology View LTV-R1, LTV-R3 Rainfall Gauge, LTV-W1/W2 Wind Sensor
  • LaCrosse Technology View LTV-TH Thermo/Hygro Sensor
  • LaCrosse Technology TX22U-IT
  • LaCrosse TX31U-IT, The Weather Channel WS-1910TWC-IT
  • LaCrosse TX34-IT rain gauge
  • LaCrosse TX29IT, TFA Dostmann 30.3159.IT Temperature sensor
  • LaCrosse TX35DTH-IT, TFA Dostmann 30.3155 Temperature/Humidity sensor
  • LaCrosse Technology View LTV-WR1 Multi Sensor
  • LaCrosse WS6868 TX232TH-LCD temperature/humidity sensor
  • LaCrosse WS6868 TX231RW wind/rain sensor
  • Wireless M-Bus, Mode C&T, 100kbps (-f 868.95M -s 1200k)
  • Wireless M-Bus, Mode T, 32.768kbps (-f 868.3M -s 1000k)
  • Wireless M-Bus, Mode S, 32.768kbps (-f 868.3M -s 1000k)
  • Wireless M-Bus, Mode R, 4.8kbps (-f 868.33M)
  • Wireless M-Bus, Mode F, 2.4kbps
  • RADIAN/RADIAN0 meter
  • Marlec Solar iBoost+ sensors
  • Maverick XR-30 BBQ Sensor
  • Maverick XR-50 BBQ Sensor
  • McPower Kinetic battery-less wall switch
  • Mueller Hot Rod water meter
  • NetAtmo temp/hum and wind sensors
  • Nidec Car Remote (-f 313.8M -s 1024k)
  • Oil Ultrasonic SMART FSK
  • Oil Ultrasonic STANDARD FSK
  • Watchman Sonic / Apollo Ultrasonic / Beckett Rocket oil tank monitor
  • Watchman Sonic Advanced / Plus, Tekelek
  • Opel Mokka Car Key
  • Oregon Scientific WMR500 weather station
  • Quinetic
  • RFM69 LowPowerLab Moteino board (-s 1000k)
  • RojaFlex shutter and remote devices
  • Sharp SPC775 weather station
  • Silver Spring Networks mesh endpoint (-s 1600k)
  • SimpliSafe Gen 3 Home Security System
  • Somfy io-homecontrol
  • SRSmith Pool Light Remote Control SRS-2C-TX (-f 915M)
  • Steelmate TPMS
  • TFA Dostmann 14.1504.V2 Radio-controlled grill and meat thermometer
  • TFA Dostmann 30.3196 T/H outdoor sensor
  • TFA Dostmann 30.390X T/H sensors series
  • TFA Marbella Pool Thermometer
  • ThermoPro TP211B Thermometer
  • ThermoPro TP28b Super Long Range Wireless Meat Thermometer for Smoker BBQ Grill
  • ThermoPro Meat Thermometers, TP828B 2 probes with Temp, BBQ Target LO and HI
  • ThermoPro Meat Thermometers, TP829B 4 probes with temp only
  • ThermoPro TempSpike XR TP862b / TP863b Wireless Dual-Probe Meat Thermometer
  • ThermoPro TX-7B Outdoor Thermometer Hygrometer
  • Abarth 124 Spider and Shenzhen EGQ Q85 TPMS
  • Airpuxem TPMS TYH11_EU6_ZQ
  • AVE TPMS
  • BMW Gen4-Gen5 TPMS and Audi TPMS Pressure Alert, multi-brand HUF/Beru, Continental, Schrader/Sensata, Audi
  • BMW Gen2 and Gen3 TPMS
  • Citroen TPMS
  • Elantra2012 TPMS
  • Ford TPMS
  • Honda (TRW PPA-GF33) TPMS
  • Hyundai TPMS (VDO)
  • Jansite TPMS Model TY02S
  • Jansite TPMS Model Solar
  • Jansite TPMS TY588-EU2
  • Jeep TPMS
  • Kia TPMS (-s 1000k)
  • Mercedes Benz Sprinter 4500 TPMS sensor
  • Nissan TPMS
  • PMV-107J (Toyota) TPMS
  • Porsche Boxster/Cayman TPMS
  • Renault TPMS
  • Renault 0435R TPMS
  • Sefis M3 / Careud / Sykik SRTP300 TPMS
  • Toyota TPMS
  • Unbranded SolarTPMS for trucks
  • TRW TPMS FSK OEM and Clone models
  • Typhur Sync Gold meat thermometer probe
  • Vevor Wireless Weather Station 7-in-1
  • Watts Vision thermostat (-f 868.3M)

What it does.

Consumer weather stations are two parts: a sensor array outdoors and a display indoors, joined by a one-way radio link. The array does not know or care what receives it. This node is a second receiver. It hears the same broadcasts, decodes them, and harvests every value each device sends: temperature, humidity, wind speed, gust and direction, rainfall, UV and light, soil moisture, lightning strikes and distance, battery state. Each device becomes its own stream at your endpoint under its own broadcast id, and each reading arrives in canonical units, so a mile-per-hour station and a metre-per-second station look the same to whatever reads them.

Nothing about the station changes. The display keeps working. The station keeps its batteries. No pairing, no app, no account, and the station’s maker never knows. That is the Collect layer applied to hardware you already paid for, and it is the question the Home Assistant forums have asked for years: how do I get my cheap weather station’s data without the vendor’s cloud?

On the CC1101 builds the decoders are not ours, and that is the point. They are the rtl_433 project’s, built up over a decade, ported to the ESP32 as rtl_433_ESP. Our sketch wraps them as a driver on the shared OAT node core and maps what they decode onto the OAT vocabulary. A new station is a decoder upstream, not a sketch release. The bare-receiver build is the deliberate exception: those decoders need a radio that reports signal strength, a bare receiver has none, so that image carries a single hand-written decoder for the AcuRite 5-in-1. Build 5 is the other exception: the CC1101 frames the Ecowitt sensors’ messages itself, and our own decoders check and read them. What each build hears is stated inside that build, below, and nowhere else.

Build 1: the two-dollar receiver.

What it hears.

Build 1 decodes this, and only this
DeviceBand (MHz) · everyWhat it broadcasts · state
AcuRite Iris 06004M (5-in-1)433.92
18 s
Wind speed and direction, rain total, temperature, humidity, battery. Heard on our bench, 2026-09-07, Tennessee bench. The reference station. Two message types alternate. The only device this build decodes.

Why only one? The open rtl_433 decoders find the start and end of a transmission by watching the radio’s signal strength, and a bare receiver has no signal-strength output. So this image does not link them. It runs the sketch’s own pulse decoder instead: AcuRite 5-in-1 only, with rtl_433’s pulse tolerances and its checksum-plus-parity test, so a corrupted frame is dropped instead of being filed as a wild reading. Adding another station to this build means writing its decoder by hand, which is exactly the work Build 2 avoids.

What you need.

Wiring.

VCC to 5 V or 3V3 as the module says, GND to GND, DATA to GPIO 33. Any other board with a bare receiver on a pin builds the same way from source: -DOAT_RX_DATAPIN=<gpio> selects this path.

Flash it.

One button. Plug the board in and press it.

Your browser can't flash devices, use Chrome or Edge on a desktop. This page must be served over HTTPS to flash. a plain three-pin superheterodyne receiver, DATA to GPIO 33 · AcuRite 5-in-1 decoder only · heard an Iris on our bench 2026-09-07 · tested
If the board won't take the flash, or it restarts over and over

Hold the BOOT button down while you plug the USB cable in. Let go once it is plugged in, then press the install button above. That is the whole fix, and it is worth trying first any time a board is being stubborn.

Here is what is going on. A board with no working firmware on it restarts several times a second, forever, because it looks for a program to run and finds nothing. The installer needs the board to hold still long enough to write a megabyte and a half, and it cannot get hold of one that keeps restarting. Holding BOOT as the power arrives puts the chip into the loading mode it was built with, where no program runs at all, so there is nothing to restart and the installer gets a still target.

If you have a serial monitor open, you will know it worked because the scrolling stops. Quiet is what you want.

You may also see invalid header: 0xffffffff repeating in the monitor. That reads like damage and it is not: it is what an empty chip looks like, which is exactly where a board lands if a write was interrupted. The board is fine. Flash it again with BOOT held and it will come back.

If it flashes and runs fine on its own but fails the moment the sensor is connected, suspect whatever sits between them before you suspect either one. A screw-terminal carrier, an adapter board or a breakout is a component too, and a bridged or cracked terminal on one will stop the board booting while the sensor and the ESP32 are both perfectly good. Detaching the sensor is the quickest test: if the board comes back to life, neither it nor the sensor is at fault, and the thing in the middle is where to look. That exact fault cost us most of a night.

Two other things are worth checking before you decide a board is bad. Use a data USB cable, since a charge-only cable carries power but no signal and gives you the same symptoms. And plug straight into the computer rather than through a hub, because a write that browns out part way through leaves the board empty in just this way.

Build 2: CC1101, on-off keying.

What it hears.

Build 2: decoders linked into the on-off-keying image
DeviceBand (MHz) · everyWhat it broadcasts · state
AcuRite Iris (5-in-1), Atlas, 3-in-1, 592TXR tower, 6045 lightning, 899 rain433.92
16 to 18 s
The Iris set; Atlas adds UV, light, and lightning with distance. Decoder in the image; not yet heard here. One decoder covers the family.
AcuRite 609TXC, 606TX, 590TX, 00275rm room sensors, 986 refrigerator and freezer probes433.92
16 to 120 s
Temperature, humidity where fitted. Decoder in the image; not yet heard here. The cheapest extra streams there are. The 986 is a walk-in cooler probe.
La Crosse TX141 family (TX141-Bv2, TX141TH-Bv2, TX141-Bv3, TX141W, TX145wsdth)433.92
about 50 s
Temperature, humidity; wind on the TX141W and TX145. Decoder in the image; not yet heard here. Only the TX141 line is on-off keying. La Crosse View (LTV) and the IT+ probes are FSK: see that build.
La Crosse older TX sensors, WS-2310 / WS-3600, WS7000433.92
varies
Temperature, humidity, wind, rain by model. Decoder in the image; not yet heard here.
Oregon Scientific THGR, THN, WGR, PCR, UVN series; SL109H; v1 sensors433.92
about 40 s
Temperature, humidity, wind, rain, UV by sensor. Decoder in the image; not yet heard here. Older stations, still everywhere.
Ambient Weather F007TH, TX-8300433.92
about 60 s
Temperature, humidity. Decoder in the image; not yet heard here. Ambient’s on-off-keying probes. Its WS-2902 arrays and WH31 probes are FSK.
Fine Offset WH1080 / WH3080, WH1050, WH2 / WH5, WH0530; Ecowitt WH53433.92 (868 in Europe)
48 s
Wind, rain, temperature, humidity. Decoder in the image; not yet heard here. The on-off-keying ancestors of today’s Ecowitt line, sold under Froggit, Maplin, Watson and a dozen other names.
Soil probes: Homelead HG9901 (Geevon, Dr.Meter, Royal Gardineer), RainPoint soil, Opus XT300, Springfield433.92
varies
Soil moisture, soil temperature; light on the HG9901. Decoder in the image; not yet heard here. Garden-centre soil probes. Consumer accuracy; the trend is the value.
Rain gauges: AcuRite 896, Baldr / RainPoint, TFA Drop, Cotech 36-7900, EMOS E6016, Biltema433.92
varies
Rain total. Decoder in the image; not yet heard here.
Europe’s 433 long tail: Nexus, Bresser 3CH, TFA 30.3221 and Twin Plus, Auriol (Lidl), Rubicson, Hideki, EMOS, Solight, Kedsum, Prologue433.92
30 to 60 s
Temperature, humidity; wind and rain on the Hideki. Decoder in the image; not yet heard here. The supermarket and hardware-store sensors of Europe.
Pool, freezer and tank: Rubicson and TFA pool thermometers, ThermoPro TX-2, Watchman Plus oil tank433.92
varies
Water temperature; tank depth. Decoder in the image; not yet heard here. A floating pool thermometer is a stock-tank thermometer.
Govee H5054 water-leak detector433.92
on event
Leak event, battery. Decoder in the image; not yet heard here.

The rest of the 223 are in the full list. Not here: anything FSK. La Crosse View, the La Crosse IT+ probes, Bresser’s 5-in-1 family and every current Ecowitt and Ambient Weather sensor are FSK, whatever band they use; those are Build 3.

What you need.

Wiring the CC1101.

The CC1101 is an SPI device: four data wires, two signal pins, power and ground. The pins below are what each image expects.

Classic ESP32 devkit + CC1101

  • SCK GPIO 18 · MISO GPIO 19 · MOSI GPIO 23
  • CSN GPIO 5
  • GDO0 GPIO 22 · GDO2 GPIO 4
  • VCC 3V3 · GND GND

ESP32-S3 devkit + CC1101

  • SCK GPIO 12 · MISO GPIO 13 · MOSI GPIO 11
  • CSN GPIO 10
  • GDO0 GPIO 9 · GDO2 GPIO 8
  • VCC 3V3 · GND GND

ESP32-C3 + CC1101

  • SCK GPIO 4 · MISO GPIO 5 · MOSI GPIO 6
  • CSN GPIO 7 · GDO0 GPIO 10 · GDO2 GPIO 3
  • VCC 3V3 · GND GND

ESP32-C6 + CC1101

  • SCK GPIO 6 · MISO GPIO 2 · MOSI GPIO 7
  • CSN GPIO 18 · GDO0 GPIO 10 · GDO2 GPIO 11
  • VCC 3V3 · GND GND

Heltec WiFi LoRa 32 V2, nothing to wire

  • The on-board SX1276 does on-off keying. The image uses it.
  • A 433 MHz V2 hears these stations natively; a 915 MHz V2 hears them at reduced sensitivity, because the antenna’s matching network is built for one band.
  • Attach the antenna that came with the board.

Heltec WiFi LoRa 32 V3 + CC1101. Not the V4.

  • The V3’s own SX1262 cannot demodulate on-off keying, so a CC1101 rides its spare header pins.
  • SCK GPIO 5 · MISO GPIO 6 · MOSI GPIO 7
  • CSN GPIO 4 · GDO0 GPIO 3 · GDO2 GPIO 2
  • Do not flash this to a Heltec V4. On a V4, GPIO 2, 5 and 7 control the LoRa amplifier. There is no V4 listener image yet.

ESP32 (classic) + CC1101 on alternate pins

  • For a board whose default SPI pins are already spoken for.
  • SCK GPIO 32 · MOSI GPIO 27 · MISO GPIO 35
  • CSN GPIO 25 · GDO0 GPIO 33 · GDO2 GPIO 36
  • GPIO 35 and 36 are input-only, which is fine: MISO and GDO2 only ever drive into the ESP32.

Every CC1101 build

  • The CC1101 is a 3.3-volt part. Do not feed it 5 V.
  • Keep the wires under 15 cm, and the module’s antenna away from the ESP32’s own Wi-Fi antenna.
  • If the setup page says radio not found: CSN on the wrong pin, MISO and MOSI swapped, a module that has met 5 V, or the wrong button. The installer checks the chip, not the radio.

Flash it.

Find your board and press its button. Every label names the chip and where the radio is wired. These are all on-off-keying images.

Your browser can't flash devices, use Chrome or Edge on a desktop. This page must be served over HTTPS to flash. CC1101 on SCK 18 · MISO 19 · MOSI 23 · CS 5 · GDO0 22 · GDO2 4 · may need a USB driver · beta
CC1101 on SCK 12 · MISO 13 · MOSI 11 · CS 10 · GDO0 9 · GDO2 8 · native USB · beta
CC1101 on SCK 4 · MISO 5 · MOSI 6 · CS 7 · GDO0 10 · GDO2 3 · native USB, the value pick · beta
CC1101 on SCK 6 · MISO 2 · MOSI 7 · CS 18 · GDO0 10 · GDO2 11 · native USB · beta
the board's SX1276 receives; nothing to wire · beta
CC1101 on SCK 5 · MISO 6 · MOSI 7 · CS 4 · GDO0 3 · GDO2 2 · V3 only: on a V4 those pins belong to the LoRa amplifier · beta
CC1101 on SCK 32 · MOSI 27 · MISO 35 · CS 25 · GDO0 33 · GDO2 36 · for boards whose default SPI pins are taken · beta
If the board won't take the flash, or it restarts over and over

Hold the BOOT button down while you plug the USB cable in. Let go once it is plugged in, then press the install button above. That is the whole fix, and it is worth trying first any time a board is being stubborn.

Here is what is going on. A board with no working firmware on it restarts several times a second, forever, because it looks for a program to run and finds nothing. The installer needs the board to hold still long enough to write a megabyte and a half, and it cannot get hold of one that keeps restarting. Holding BOOT as the power arrives puts the chip into the loading mode it was built with, where no program runs at all, so there is nothing to restart and the installer gets a still target.

If you have a serial monitor open, you will know it worked because the scrolling stops. Quiet is what you want.

You may also see invalid header: 0xffffffff repeating in the monitor. That reads like damage and it is not: it is what an empty chip looks like, which is exactly where a board lands if a write was interrupted. The board is fine. Flash it again with BOOT held and it will come back.

If it flashes and runs fine on its own but fails the moment the sensor is connected, suspect whatever sits between them before you suspect either one. A screw-terminal carrier, an adapter board or a breakout is a component too, and a bridged or cracked terminal on one will stop the board booting while the sensor and the ESP32 are both perfectly good. Detaching the sensor is the quickest test: if the board comes back to life, neither it nor the sensor is at fault, and the thing in the middle is where to look. That exact fault cost us most of a night.

Two other things are worth checking before you decide a board is bad. Use a data USB cable, since a charge-only cable carries power but no signal and gives you the same symptoms. And plug straight into the computer rather than through a hub, because a write that browns out part way through leaves the board empty in just this way.

Build 3: CC1101, FSK.

What it will hear.

Build 3: decoders linked into the FSK image
DeviceBand (MHz) · everyWhat it broadcasts · state
Ecowitt / Ambient arrays: WS69, WH65 (WS-2902), WH24, and the WH25 / WH32 indoor-outdoor units915 · 868 · 433 by region
16 s
Wind, gust, direction, rain, temperature, humidity, UV, light; pressure on the WH25. Decoder in the image; not yet heard here.
Ecowitt WS80, WS85, WS90 ultrasonic arrays915 · 868 · 433 by region
4.75 to 8.8 s
Ultrasonic wind, temperature, humidity, light, UV; piezo rain on the WS85 and WS90. Decoder in the image; not yet heard here. No moving parts. The piezo rain reading wants calibrating against a tipping gauge.
Ecowitt WH52 soil moisture, temperature and EC915 · 868 · 433 by region
70 s
Soil moisture, soil temperature, conductivity. Decoder in the image; not yet heard here. On the air the conductivity is just a field; some consoles show it only in the vendor’s cloud.
Ecowitt WH40 rain gauge; WS68 wind and light915 · 868 · 433 by region
49 s
Rain total; wind and light on the WS68. Decoder in the image; not yet heard here. The tipping bucket Ecowitt itself recommends beside a piezo array.
Ecowitt WH55 water-leak sensor915 · 868 · 433 by region
on event and heartbeat
Leak alarm, battery. Decoder in the image; not yet heard here.
Ecowitt WH57 lightning (Ambient WH31L)915 · 868 · 433 by region
on event and heartbeat
Strike count, storm distance. Decoder in the image; not yet heard here.
Ecowitt WH43 PM2.5, WH45 and WH46 air quality915 · 868 · 433 by region
60 s
PM2.5, PM10, CO2, temperature, humidity by model. Decoder in the image; not yet heard here. The older WH41 is not registered in this library build.
La Crosse View: LTV-TH, LTV-R1 / R3 rain, LTV-W1 / W2 wind, LTV-WR1, Breeze Pro915
about 30 s
Temperature, humidity, wind, rain by sensor. Decoder in the image; not yet heard here. Decoder linked; the library tunes its FSK receiver for Fine Offset’s bit rate, so reception of other families is untested.
La Crosse IT+: TX29-IT, TX35DTH-IT, TX22U-IT, TX31U-IT, TX34-IT (TFA 30.3159.IT, 30.3155)868 Europe · 915 Americas
4 to 13 s
Temperature, humidity; wind and rain on the TX22U and TX34. Decoder in the image; not yet heard here. Same caution: linked, untested here.
Bresser 5-in-1, 6-in-1 and 7-in-1 weather centres; Bresser soil, leak, lightning and air-quality sensors868 Europe · 915 Americas
12 s
Wind, rain, temperature, humidity, UV, light; soil moisture; PM and CO2. Decoder in the image; not yet heard here. Europe’s most common station family. Same caution: linked, untested here.
TFA 30.3151, 30.3196, 30.390X, Marbella pool; Inkbird ITH-20R; ThermoPro TX-7B; Govee H5059 leak, H5310 pool868 Europe · 915 Americas · 433
varies
Temperature, humidity; leak; water temperature. Decoder in the image; not yet heard here. Same caution: linked, untested here.

The rest of the 153 are in the full list. One caution we will not hide: the library sets the radio’s FSK receiver to the bit rate the Ecowitt family uses. Other families’ decoders are linked, but whether the radio settings suit them is untested by us, and the table says so row by row.

Frequency is not the question. Modulation is.

An Ecowitt sensor is sold on 915 MHz in the Americas, Australia and New Zealand, on 868 MHz in Europe and the countries that follow its rules, on 920 MHz in Japan, South Korea, Singapore and Malaysia, and on 433 MHz everywhere. It sends the same FSK message on all of them. So buy the version sold for your country, and set the band to match on the setup page. A 433 MHz Ecowitt is still FSK: Builds 1 and 2 will not hear it on any band, and this build hears every version.

The wiring is Build 2’s, pin for pin. Only the image differs.

Open the bench page: the unproven FSK images

Build 5: CC1101, Ecowitt.

What it hears.

Build 5 decodes these, each checked twice
DeviceBand (MHz) · everyWhat it broadcasts · state
Ecowitt WN31 (WH31), Ambient WH31E and WH31B temperature-humidity, any of the eight channels915 heard · 868 · 433 by region
61 s
Temperature, humidity, battery flag. Heard on our bench, 2026-10-04, Tennessee bench, 915 MHz. Ours was a WH31B on channel 1. Its reading matched the Ecowitt gateway hearing the same sensor.
Ecowitt WH51 / WH51L soil moisture915 heard · 868 · 433 by region
70 s; 10 s for a while after a change
Soil moisture, battery voltage. Heard on our bench, 2026-10-04, Tennessee bench, 915 MHz, two WH51 probes. Under twenty dollars a probe, one AA a year. Each probe arrives under its own radio id, so swapping channels never swaps histories. The WH51L sends the same frame; not heard here yet.
Ecowitt WN34 S / L / D and WN38 temperature probes (Froggit DP150)915 heard · 868 · 433 by region
about 50 to 77 s
Temperature (soil, water or air by probe), battery voltage. Heard on our bench, 2026-10-04, Tennessee bench, 915 MHz, a WN34 (the S and L send the same frame). The WN34D and WN38 send the same frame with a different temperature scale; both are decoded, neither heard here yet.

Why a separate build for the same sensors Build 3 lists? Because this one works the radio a different way. Build 3 samples the radio’s output in software and rebuilds every bit, which is how the rtl_433 decoders expect to be fed; on our bench that path found the sensors and could not get their frames past the checksum. Build 5 sets the CC1101 to packet mode: the chip itself recovers the bit clock, waits for the Fine Offset sync word (2d d4) and hands over whole frames with its own signal reading attached. The sketch then checks each frame against the sensor’s own CRC and sum, and drops anything that fails either. Fewer decoders than Build 3, and ours, but every one of them heard on our bench. More of the family is a matter of adding a decoder, not a new radio.

What you need.

Wiring.

classic ESP32 devkit to a CC1101 module, by signal name
CC1101 signalESP32 pinElechouse 10-pin headerNotes
VCC3V3pin 1 or 23.3 V only. The module’s limit is 3.6 V; 5 V or VIN damages it.
GNDGNDpin 9 or 10
SI (MOSI)GPIO 23pin 3
SCLK (SCK)GPIO 18pin 4
SO (MISO)GPIO 19pin 5
CSn (CS)GPIO 5pin 7
GDO0, GDO2not neededpins 8, 6Wire them to GPIO 22 and GPIO 4 if the same board will also run Build 2 or 3.

On the Elechouse board the odd pins (1, 3, 5, 7, 9) run down one row of the header and the even pins down the other; the numbers are printed beside it. On an eight-pin board, match the signal names printed on the board. Keep the wires short and the CC1101’s antenna away from the ESP32’s own Wi-Fi antenna.

Flash it.

Close any serial monitor first: only one program can hold the USB port, and an open console stops the installer writing. If this page has been open in a tab for a while, reload it.

Your browser can't flash devices, use Chrome or Edge on a desktop. This page must be served over HTTPS to flash. CC1101 sold as 868/915 on SCK 18 · MISO 19 · MOSI 23 · CS 5 · 3V3 · GND · heard a WH31B, two WH51 and a WN34 on our bench 2026-10-04 · tested
If the board won't take the flash, or it restarts over and over

Hold the BOOT button down while you plug the USB cable in. Let go once it is plugged in, then press the install button above. That is the whole fix, and it is worth trying first any time a board is being stubborn.

Here is what is going on. A board with no working firmware on it restarts several times a second, forever, because it looks for a program to run and finds nothing. The installer needs the board to hold still long enough to write a megabyte and a half, and it cannot get hold of one that keeps restarting. Holding BOOT as the power arrives puts the chip into the loading mode it was built with, where no program runs at all, so there is nothing to restart and the installer gets a still target.

If you have a serial monitor open, you will know it worked because the scrolling stops. Quiet is what you want.

You may also see invalid header: 0xffffffff repeating in the monitor. That reads like damage and it is not: it is what an empty chip looks like, which is exactly where a board lands if a write was interrupted. The board is fine. Flash it again with BOOT held and it will come back.

If it flashes and runs fine on its own but fails the moment the sensor is connected, suspect whatever sits between them before you suspect either one. A screw-terminal carrier, an adapter board or a breakout is a component too, and a bridged or cracked terminal on one will stop the board booting while the sensor and the ESP32 are both perfectly good. Detaching the sensor is the quickest test: if the board comes back to life, neither it nor the sensor is at fault, and the thing in the middle is where to look. That exact fault cost us most of a night.

Two other things are worth checking before you decide a board is bad. Use a data USB cable, since a charge-only cable carries power but no signal and gives you the same symptoms. And plug straight into the computer rather than through a hub, because a write that browns out part way through leaves the board empty in just this way.

Press the button, choose the port, choose Install and let it erase the board. When the console opens after the flash, the first lines tell you it worked:

OAT-Weather-Listener/1.4.0 booting
[wx] ESP32 + CC1101 915 (Ecowitt, packet mode): CC1101 receiving (version 0x14) at 915.00 MHz, 2-FSK packet mode, ...

If the first line names an older version, the install did not write: close the console and press the button again.

Set it up and watch it hear.

  1. Do the setup steps below: Wi-Fi, your Farm ID, and where the readings go. The band is already 915.00; in Europe set 868.35, on a 433 sensor 433.92.
  2. Within two minutes Stations heard lists each sensor under its own radio id, for example ambientweather-wh31b:175-1, fineoffset-wh51:00c639 and fineoffset-wn34:43747, each with its signal in dBm.
  3. On the USB console, families counts the frames from each sensor family: good means decoded, failed_check means heard but not clean. raw on prints every frame the chip catches, in hex, with its signal and how far off the band the sensor sits.

When it does not hear.

  • Stations heard stays empty and families shows nothing. Check the boot line says CC1101 receiving (version 0x14). NOT RECEIVING means the SPI wiring, 3.3 V, or a module that met 5 V.
  • families shows frames, all failed_check. The sensor is heard and its bits are not clean: a 433 module on 915, a missing antenna, or a band that does not match the sensor.
  • Everything is weak and rssi reads high all the time. Something is transmitting on the same frequency. An OAT LoRa node on 915.0 cost our bench 18 dB until it was switched off.
  • The settings page says “This page isn’t working”. Weak Wi-Fi, not the sketch. The one-minute pushes are small enough to get through a signal the settings page cannot. status shows the signal; below about −80 dBm, move the board closer to the access point, or change settings on the USB console.
  • You also own an Ecowitt gateway. Keep it. They do not interfere: both only receive. The gateway names sensors by slot (soil 1, temp 1), the listener by radio id; match them once by their readings.

How it works.

  1. The station broadcasts, the way it already does. AcuRite every 18 seconds; other makes every 30 to 60 depending on the model.
  2. On a CC1101 build the radio watches the signal level on the band. When it jumps above the noise floor, the library captures the pulse train and hands it to the rtl_433 decoders, which try each protocol until one’s checksum passes. On the bare-receiver build there is no signal level to watch, so the sketch times every pulse itself and waits for the four-pulse sync an AcuRite 5-in-1 sends, then checks the frame’s checksum and parity. On Build 5 the CC1101 does the listening in hardware: it recovers the bits, waits for the Ecowitt sync word and stores the whole frame, and the sketch reads it and checks the sensor’s CRC and sum.
  3. The decoded message names the model, the station’s id, and its readings. This sketch turns the model and id into a stream id, maps each reading onto the OAT vocabulary with the unit converted, and folds it into that stream’s window. A station repeats each message, three times back to back on an AcuRite, so an identical message from the same station within two seconds is counted as a repeat and not folded again; samples counts transmissions.
  4. On a timer, the node core pushes one signed batch to your endpoint, or publishes to your broker, exactly as every OAT gateway does. Every 60 seconds it sends its own heartbeat.

Because a station’s two message types arrive at different moments, and because a windy minute produces more wind readings than a calm one, everything continuous is averaged over the push window and everything cumulative or directional keeps its latest value. Rain arrives as the station’s running total, never as a delta, so a missed broadcast loses nothing and rainfall per hour is a subtraction at your endpoint. Wind direction is never averaged, because the mean of north and north-north-west is not a direction.

One more honest detail. Neither radio is as sensitive as a software-defined-radio dongle with a proper antenna. The library’s authors report about half a dongle’s range for the CC1101; we have not measured it on our bench yet, and the comparison will carry the number when we have. The bare receiver heard our Iris across tens of metres with a poor antenna. For the far pasture, put the listener out there on a LoRa node.

Set it up.

The same one form as every OAT gateway, served by the device itself, plus two fields of its own. The steps are the same on every build.

  1. Power the board from any USB charger. Join the Wi-Fi network OAT-Setup-XXXXXX (open, no password). A setup page opens by itself; if not, visit http://192.168.4.1.
  2. Sign in, fill in a name, your Farm ID, the location, your Wi-Fi, and where the readings should go. Press Save & Connect.
  3. The Band. On Build 1 it is fixed at 433.92 by the receiver module. On Build 2 leave it at 433.92, where AcuRite, La Crosse TX141 and Oregon Scientific broadcast. On Builds 3 and 5 set your region’s band (915.00 is the default). On a CC1101 a change retunes the radio on the spot. The field’s own help text says what the image you flashed decodes.
  4. Watch Stations heard on the same page. Your station appears on its next broadcast with its model, how long ago, and on a CC1101 its signal strength. Give it a minute; a station that only broadcasts every 60 seconds needs one. A station that goes quiet for ten minutes is marked silent and its stream released; it files straight back in when heard again. The table holds 32 rows, and a new station arriving when all are taken takes over the row that has been silent longest.
  5. If the neighbours’ stations show up too, copy your station’s id into the allow-list and save. Only the listed ids are reported from then on; the match is exact, so acurite-5n1:748-A does not also admit acurite-5n1:7480-A.
  6. Open the Status page and press Push now. A green “OK” means your station’s readings just reached your endpoint.

Ready to test it? Enter https://iot-test.openagriculturetechnology.com/ingest as the endpoint URL, then open the Open Agriculture Technology Test Endpoint and pick your farm. The listener appears as a gateway with your station and each sensor listed under it. It keeps about an hour of readings, enough to prove the chain before you point it at an endpoint you keep.

Setup card: Build 1, the receiver (PDF) Setup card: Build 2, CC1101 (PDF) Setup card: Build 5, Ecowitt (PDF)

A three-page field card per build, because what you need on hand and what can go wrong differ: what to have ready, the flash and setup steps, blanks for this node’s settings and ids, the console commands, and the fixes for the usual snags. Print one per node.

What it sends.

Ordinary oat-ods, tagged oat-weather-listener. Each station or sensor is one stream named by its broadcast id, and every quantity it sends is one observation in canonical units with the aggregation stated.

See a batch from an AcuRite Iris and a tower sensor
{
  "schema": "oat-ods/0.3",
  "msg_type": "batch",
  "sent_at": "2026-09-05T15:12:00Z",
  "seq": 2000018,
  "source": { "tier": "oat-weather-listener", "gateway_id": "barn-wx",
              "farm_id": "willow-oaks", "fw": "OAT-Weather-Listener/1.1.0" },
  "messages": [
    { "observed_at": "2026-09-05T15:12:00Z",
      "stream": { "id": "acurite-5n1:2716" },
      "measurement": "wind_speed", "value": 2.34, "unit": "m/s",
      "agg": { "window_s": 60, "samples": 3, "method": "mean" },
      "source": { "physical_id": "acurite-5n1:2716", "brand": "AcuRite", "model": "Acurite-5n1", "rssi": -63 } },
    { "observed_at": "2026-09-05T15:12:00Z",
      "stream": { "id": "acurite-5n1:2716" },
      "measurement": "wind_direction", "value": 225, "unit": "deg",
      "agg": { "window_s": 60, "samples": 3, "method": "last" } },
    { "observed_at": "2026-09-05T15:12:00Z",
      "stream": { "id": "acurite-5n1:2716" },
      "measurement": "rain_total", "value": 128.52, "unit": "mm",
      "agg": { "window_s": 60, "samples": 2, "method": "last" } },
    { "observed_at": "2026-09-05T15:12:00Z",
      "stream": { "id": "acurite-5n1:2716" },
      "measurement": "temperature", "value": 27.4, "unit": "Cel",
      "agg": { "window_s": 60, "samples": 1, "method": "mean" } },
    { "observed_at": "2026-09-05T15:12:00Z",
      "stream": { "id": "acurite-tower:11743-A" },
      "measurement": "humidity", "value": 58, "unit": "%RH",
      "agg": { "window_s": 60, "samples": 4, "method": "mean" },
      "source": { "physical_id": "acurite-tower:11743-A", "brand": "AcuRite", "model": "Acurite-Tower", "rssi": -71 } }
  ]
}
For developers: how rtl_433’s field names map onto the vocabulary

What leaves the listener is oat-ods and nothing else; there is no listener-specific format. The one thing worth knowing is this map, because a field the map does not name arrives raw under rtl_433’s own key (no unit, agg.method: mean) and the status page lists it. Units are converted here so your endpoint never sees a mile-per-hour.

rtl_433 key → oat-ods measurement
rtl_433 keymeasurementunitkindconversion
temperature_C, temperature_F, temperature_1_CtemperatureCelmean°F → °C
humidityhumidity%RHmean
wind_avg_m_s, wind_avg_km_h, wind_avg_mi_h, wind_speed_*wind_speedm/smeankm/h ÷ 3.6 · mph × 0.447
wind_max_m_s, wind_max_km_h, wind_max_mi_h, gust_speed_m_swind_gustm/slastsame
wind_dir_degwind_directiondeglast
rain_mm, rain_inrain_totalmmlast (cumulative)in × 25.4
rain_rate_mm_h, rain_rate_in_hrain_ratemm/hmeanin × 25.4
uv, uviuv_indexmean
light_lux, luxilluminancelxmean
radiation_W_m2solar_radiationW/m2mean
moisturesoil_moisture%mean
conductivitysoil_conductivityuS/cmmean
leafwetness, wetnessleaf_wetness%mean
strike_countlightning_totallast (cumulative)
storm_dist_km, storm_distlightning_distancekmlast
pressure_hPapressurehPamean
pm2_5_ug_m3, pm10_ug_m3, co2_ppmpm25, pm10, co2ug/m3, ppmmean
depth_cmwater_levelcmmean
battery_okbattery_lowstateinverted (ok=1 → 0). The FSK decoders send a level from 0 to 1: strictly between, it becomes the stream’s battery percent and battery_low is set below 0.2
battery_mV, battery_VvoltageVlastmV ÷ 1000
leak, alarmwater_leakstate
ext_powermainsstate
model, id, channel, mic, sequence_num, message_type, rssi, snr, noise, protocol, boost, ad_raw, firmware…identity and radio bookkeeping, not readings from the station. rssi rides in source and is also folded as an rssi gauge on the stream, as the BLE Listener does

The table is the MAP[] in the sketch. Adding a row there is the whole job of naming a new field.

The whole format, every field and the full vocabulary are in the developer reference. If you write endpoints, the section on gateways that carry other sensors is the one that applies: a listener is a gateway pushing readings that are not its own, and the four rules there are all an endpoint needs.

Into Home Assistant.

Choose MQTT as the delivery method on the setup page and point it at the broker Home Assistant already uses (the Mosquitto add-on, usually). The listener then publishes one retained message per reading on a topic named for the listener and the station's own id, oat/<listener>/<station id>/<measurement>, and keeps oat/<listener>/status at online with a Last Will that flips it to offline if the board drops. Home Assistant reads those with its MQTT integration, one small YAML block per reading. The sketches do not send Home Assistant’s discovery announcements, so the entities are yours to declare, which also means you name them once and they never rename themselves.

  1. Install the Mosquitto broker add-on if you have not, and the MQTT integration. Note the broker’s address, user and password.
  2. On the listener’s setup page choose MQTT, enter the broker, user and password, leave the topic prefix at oat. Save.
  3. Add one mqtt: sensor: block per reading to configuration.yaml, using the topics you see under Stations heard. The value is value_json.value; the status topic gives availability. Reload the MQTT entities (or restart) and they appear.
    mqtt:
      sensor:
        - name: "Iris temperature"
          unique_id: barn_wx_acurite_5n1_748_a_temperature
          state_topic: "oat/barn-wx/acurite-5n1:748-A/temperature"
          value_template: "{{ value_json.value }}"
          unit_of_measurement: "°C"
          device_class: temperature
          state_class: measurement
          availability:
            - topic: "oat/barn-wx/status"
              value_template: "{{ value_json.state }}"
              payload_available: "online"
              payload_not_available: "offline"
  4. Put the entities on a dashboard. The agricultural cards page has the wind rose and rain cards; the weather-station guide walks the whole thing with screenshots and the automations that make a station useful, frost warning first.

The same MQTT path feeds anything else that speaks MQTT: Node-RED, Grafana through Telegraf, a spreadsheet through a five-line script. And the webhook path feeds anything with a URL. The Home Assistant guide covers the other two ways a station reaches Home Assistant too, through an Ecowitt or Ambient hub or a Tempest hub, for people who already own one.

As a pod on a LoRa node.

The station is in the far field and there is no Wi-Fi there. Fine. This listener also prints every reading it hears on its USB serial port in the oat-line grammar, whether or not Wi-Fi is configured. Cable that port to the LoRa Field Node’s pod port with three wires, and every station this listener hears rides to the house over LoRa as a cluster of sensors on that node, under the same stream ids. Move the station to the barn later and the same board, with the Wi-Fi form filled in, pushes directly. Same firmware. The difference is configuration.

Why a second board rather than a decoder inside the field node? Because the decoders want a radio to themselves and a processor that is doing nothing else, and the field node is already reading probes and running its own radio. A pod does one job, and any board can be one.

Stations that talk to a hub instead.

Some stations cannot be heard by a build this page offers today: most of the Ecowitt family beyond the WH31, WH51 and WN34 until Build 3 has been benched, and a few models with no open decoder at all. Or you already own the vendor’s hub and it is sitting on your network. Those feeds are still yours, and they arrive at your endpoint through a different door: the gather bridge, a small Python program that runs on the same machine as your endpoint or Home Assistant and turns a hub’s feed into oat-ods. Three sources are built in:

hubs on your network, and how the bridge reads them
Ecowitt GW1100, GW2000, HP2551; Ambient Weather hubsThe hub has a custom server setting. Point it at the bridge’s address and path, protocol Ecowitt, and every report the hub receives, from all its sensors, arrives as a form POST that the bridge maps. The OAT Test Endpoint takes the same post directly, with no bridge, to prove the chain. The hub hides the sensors’ radio ids, so streams are named hub-and-slot, ecowitt:3c71bf94:soil2. The Ecowitt guide has the settings, step by step.
WeatherFlow TempestIts hub broadcasts every observation as JSON over UDP on the local network with nothing to configure. The bridge listens on port 50222. The station’s serial number is the stream id.
Davis WeatherLink LiveA local JSON API on the hub, polled once a minute. Davis stations’ own radio link is a hopping protocol no open decoder handles reliably, so the hub is the honest route for a Vantage Vue or Pro2.

A hub feed needs no ESP32 at all. It is the right choice when the hub is already there. The listener is the right choice when you want the readings without the hub, or the station has no hub, or the station is out of Wi-Fi range.

Honest limits.

  • One kind of signal per image. AcuRite and its kin switch a carrier on and off. Ecowitt and its kin shift a carrier’s frequency. The radio chip demodulates one or the other, and which one is fixed when the image is built. A property with both needs two boards.
  • One band at a time. A CC1101 tunes from 300 to 928 MHz but listens on one frequency. The band is a setting; changing it retunes on the spot.
  • Two builds have been heard on our bench. Build 1, with an AcuRite Iris, and Build 5, with an Ecowitt WH31B, two WH51 and a WN34, both in Tennessee. Build 2 is offered as beta on the strength of the rtl_433 project’s decoders and has not run here yet. Build 3 has not heard a sensor, and its images sit on a separate bench page so nobody mistakes them for a proven build. Every row in the device table says which of those it is.
  • Less range than an SDR dongle. The library’s authors report about half. We have not measured a CC1101 yet. Height and a wire antenna cut to the band buy more than anything in software.
  • Some devices have no open decoder. Among Ecowitt’s: the WN30, the WN35 leaf-wetness sensor, the WN36, the older WH41 and the WFC01 water valve. The table names them so nobody buys one expecting this to hear it; the vendor’s hub through the bridge carries them.
  • Stations that re-roll their id. A few models pick a new id every battery change. The history at your endpoint splits at that point; the endpoint’s map from id to place is where you reconnect it. The AcuRite Iris keeps its id.
  • Davis is not on the list. Its frequency-hopping protocol is reverse-engineered and fragile. Use the WeatherLink Live hub through the bridge.
  • Cloud-only stations. Netatmo and similar talk to their maker’s servers and nothing local. There is nothing here to hear.
  • Near a LoRa node. Our own LoRa field nodes default to 915.0 MHz, the same frequency US Ecowitt sensors use. A listener on Build 3 or 5 beside busy LoRa nodes will lose some sensor frames to them; on our bench a LoRa node a few feet away cost 18 dB of signal until it was switched off. Keep the antennas apart, and move the LoRa plan off 915.0 on a site that runs both.

For makers & trainers.

Frequently asked questions.

How do I get my AcuRite weather station data into Home Assistant without the cloud?

Flash this listener onto an ESP32 and choose MQTT delivery pointed at the broker Home Assistant uses. For an AcuRite Iris (5-in-1), a two-dollar 433 MHz receiver module on one pin is enough, and that build has heard an Iris on our bench. For other AcuRite sensors, wire a CC1101 radio and flash the on-off-keying image, which links the open rtl_433 decoders. The listener publishes each reading as a retained MQTT message on its own topic; in Home Assistant you add one MQTT sensor per reading in YAML. No AcuRite account, hub or cloud is involved, and the station's own display keeps working.

Which build do I need?

It follows what you own. An AcuRite Iris: Build 1, the bare receiver. Any other 433 MHz on-off-keying station or sensor, such as AcuRite towers, La Crosse TX141, Oregon Scientific, Nexus or TFA: Build 2, the CC1101 on-off-keying build. An Ecowitt or Ambient Weather WH31, WH51 or WN34: Build 5, a 915 MHz CC1101 in packet mode, heard on our bench. Other Ecowitt sensors, La Crosse View or the Bresser 5-in-1 family: Build 3, the rtl_433 FSK build, whose images are on a bench page marked unproven; or the vendor gateway, posting to your endpoint.

How do I read Ecowitt sensors without the Ecowitt gateway?

Flash Build 5 of the OAT Radio Sensor Listener onto a classic ESP32 wired to a CC1101 radio sold for 868/915 MHz. The radio hears the WH31 temperature-humidity sensors, the WH51 soil probes and the WN34 and WN38 probes directly, and the listener sends every reading to your own endpoint, an MQTT broker or Home Assistant. On our bench it heard a WH31B, two WH51 and a WN34 on 915 MHz, and every reading matched the Ecowitt gateway hearing the same sensors. The sensors keep working with their gateway or console at the same time.

Can an ESP32 receive Ecowitt WH51 soil moisture sensors?

Yes, with a CC1101 radio module. The WH51 broadcasts its reading on 915, 868 or 433 MHz depending on the country, as FSK. Build 5 of the OAT Radio Sensor Listener sets the CC1101 to receive those frames in hardware and checks each one with the probe's own CRC and checksum; each probe arrives under its own radio id with its moisture percent and battery voltage. Heard on our bench, 2026-10-04.

Which CC1101 module do I need for 915 MHz Ecowitt sensors?

One sold as 868/915 MHz. The CC1101 chip tunes from 300 to 928 MHz, but the module's antenna circuit is built for one band, and a 433 MHz module hears a 915 MHz sensor badly. Power it from 3.3 V only: the module's limit is 3.6 V.

Can one board hear both an AcuRite and an Ecowitt sensor?

No. AcuRite transmits on-off keying and Ecowitt transmits FSK, and the radio chip demodulates one or the other, never both at once. The modulation is fixed by the image you flash; only the band is a setting. A property with both needs two boards, or a software-defined-radio dongle running rtl_433 on a small computer.

Which frequency version of an Ecowitt sensor should I buy?

The one sold for your country: 915 MHz in the Americas, Australia and New Zealand, 868 MHz in Europe, 433 MHz where that is the local band. Every version transmits the same FSK message, so the frequency does not change which listener image decodes it; you set the band to match on the setup page.

Do I need a Raspberry Pi or an SDR dongle to receive 433 MHz sensors?

No. That is the traditional route, and it works, but it means a Linux computer, a USB radio dongle and a service to keep running. An ESP32 with a CC1101 module runs the same decoders on a board that costs less than the dongle alone and is flashed from a web page. The trade is range: the library's authors report about half the range of a dongle with a good antenna, and a dongle hears every modulation at once where this hears one.

Will listening interfere with my weather station's display?

No. The station transmits one way and does not know who is listening. This listener only receives. The display, the station's batteries and any vendor app continue exactly as before.

Can the listener work without Wi-Fi, out in a field?

Yes, as a pod. Even with no Wi-Fi configured it prints every reading on its serial port in a small text format. Cable that port to an OAT LoRa Field Node and the readings travel to the house over LoRa under the same stream ids.

What does the Ecowitt hub's custom server setting do?

Ecowitt and Ambient Weather gateways can send every report to a server you choose, in addition to the vendor's cloud. Set Customized to enabled, protocol Ecowitt, your server's name, path /data/report/ and its port (80 for the OAT Test Endpoint, 8085 for the gather bridge). The OAT Test Endpoint accepts that report directly, and the OAT gather bridge accepts it on your own machine and turns it into oat-ods for your endpoint or Home Assistant. It is the right route when you already own the gateway, and it carries every sensor the gateway hears. The Ecowitt guide on this site has the steps.