Build · Sketch · v1.0.2

The Weather-Station Listener.

What it does
Hears the weather station and outdoor sensors you already own, sends every reading to your endpoint or Home Assistant
Boards
Any ESP32 + a CC1101 · Heltec V2 on its own radio
License
Open. The decoders are the rtl_433 project’s, GPL

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 soil probe under the tomatoes, if it came from Ecowitt or Ambient Weather, and the leaf-wetness sensor, and the lightning detector. They shout on 433 or 915 MHz 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. A five-dollar radio module and an ESP32 you flash from this page hear every one of those devices and land 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 band where the outdoor sensors live.

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 with the same open decoders the rtl_433 project has built up over a decade for more than two hundred device types, and harvests every value each device sends: temperature, humidity, wind speed, gust and direction, rainfall, solar radiation, UV, soil moisture, leaf wetness, lightning strikes and distance, particulates, water leaks, 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? This is the answer, in one flash.

The decoders are not ours, and that is the point. They are the rtl_433 project’s, 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 one exception is deliberate: a board with a bare receiver on a pin cannot run those decoders, so that image carries a single hand-written one for the AcuRite 5-in-1, and the wiring section says exactly what that costs.

What it hears.

Two bands, one radio, one setting. In North America the AcuRite, La Crosse and Oregon Scientific families broadcast on 433.92 MHz; the Fine Offset family sold as Ecowitt and Ambient Weather broadcasts on 915 MHz. The radio hears one band at a time; the band is a setting on the setup page.

stations and sensors this listener decodes, by band
DeviceBand (US)What it broadcastsNotes
AcuRite Iris 06004M (5-in-1)433.92wind speed and direction, rain total, temperature, humidity, batteryTwo message types alternate every 18 s. Still sold; the reference station for this sketch.
AcuRite Atlas433.92the Iris set plus UV, light, and lightning with distanceThe lightning module is optional on the station.
AcuRite Notos, tower and refrigerator sensors433.92temperature, humidityThe little indoor/outdoor probes: cheap extra streams.
La Crosse TX141, TX29, LTV series433.92temperature, humidity; wind and rain on the LTV arrays
Oregon Scientific THGR, WGR, PCR series433.92temperature, humidity, wind, rainOlder stations; still everywhere.
Ecowitt / Ambient WH65B, WS-2902 arrays915wind, rain, temperature, humidity, solar radiation, UV, lightThe common seven-in-one array.
Ecowitt WH51 soil moisture915soil moisture, raw reading, battery voltsUnder $20. Eight of them on one listener is a soil map.
Ecowitt WN30 / WN34 temperature probes, WH31 / WN31 T&H915temperature, humiditySealed probes for compost, water, a walk-in.
Ecowitt WN35 leaf wetness915leaf wetnessThe disease-pressure instrument.
Ecowitt WH57 lightning915strike count, distance
Ecowitt WH41 / WH43 particulates915PM2.5Smoke season.
Ecowitt WH55 leak915water detectedA float on a reservoir, a puddle under a pump.
Bresser, TFA, Nexus, Prologue and ~200 others433.92temperature, humidity, and whatever else they sendThe long tail. If rtl_433 decodes it, this hears it.

The shipped images decode on-off keying, which is how everything in the table transmits. The newest Ecowitt ultrasonic arrays, the WS80 and WS90, use FSK instead. The same radio can hear them, but not at the same time as the on-off stations, so that is a source build with one flag changed rather than a button on this page.

Every station heard is reported unless you say otherwise. On a shared band that includes the neighbours’ stations. If you want only yours, the allow-list on the setup page takes the ids you see under Stations heard and reports those alone.

Flash it.

Plug your board in, find it below, and press its button. The images differ by where the radio is wired, so pick the row that matches your build; the installer checks the chip matches before it writes anything.

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
its own SX1276 receives; nothing to wire · beta
CC1101 on SCK 5 · MISO 6 · MOSI 7 · CS 4 · GDO0 3 · GDO2 2 · beta
a plain superheterodyne receiver, DATA to GPIO 33 · AcuRite 5-in-1 decoder only · tested
CC1101 on SCK 32 · MOSI 27 · MISO 35 · CS 25 · GDO0 33 · GDO2 36 · for boards whose default SPI pins are taken · beta

Same firmware on every button; they differ only in which chip and where the radio is wired. The first four are plain devkits with a CC1101 on that chip’s default SPI pins. See wiring.

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.

Prefer the source? Browse it on GitHub: the full project, openly licensed, ready to build yourself.

What you need.

Under fifteen dollars if you already own the station:

What you do not need: a software-defined-radio dongle, a Raspberry Pi running rtl_433, a Linux box, or any of the vendor’s hubs. Those are the routes the forums usually end up on. This is one board and one module.

Wiring the radio.

The CC1101 is an SPI device: four data wires, two signal pins, power and ground. The pins below are what each image expects. On the Heltec V2 there is nothing to wire; the board’s own LoRa chip receives on-off keying and the image uses it.

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 V3 + CC1101

  • 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
  • VCC 3V3 · GND GND

Heltec WiFi LoRa 32 V2, nothing to wire

  • The on-board SX1276 does on-off keying and FSK. The image uses it.
  • A 915 MHz V2 hears the Ecowitt family natively and AcuRite at reduced sensitivity; a 433 MHz V2 the reverse. The antenna’s matching network is built for one band.
  • Attach the antenna that came with the board.

ESP32 (classic), a bare 433 MHz receiver on GPIO 33

  • The two-dollar superheterodyne receiver modules (three pins: VCC, GND, DATA). VCC to 5 V or 3V3 as the module says, GND to GND, DATA to GPIO 33.
  • A bare receiver has no signal-level readout, which the rtl_433 decoders need to gate on, so this image runs the sketch’s own pulse decoder instead: AcuRite 5-in-1 (Iris) only, with rtl_433’s pulse tolerances.
  • Right for a board you already built around one of these receivers. For anything else, the CC1101 costs three dollars more and hears everything.

ESP32 (classic) + CC1101 on alternate pins

  • For a board whose default SPI pins are already spoken for. The full decoder set, wired to pins that a typical sensor board leaves free:
  • 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.

Any other board with a bare receiver on a pin builds the same way from source: -DOAT_RX_DATAPIN=<gpio> selects the pulse-decoder path. It hears the AcuRite 5-in-1 today; adding another on-off-keying station to that path means writing its decoder by hand, which is exactly the work the CC1101 route avoids.

The CC1101 is a 3.3-volt part. Do not feed it 5 V. Keep the wires short, under 15 cm, since SPI at the module’s clock does not like long jumpers, and keep the module and its antenna away from the ESP32’s own Wi-Fi antenna where the board allows it. If the setup page says radio not found, it is one of: CSN on the wrong pin, MISO and MOSI swapped, or a module powered from 5 V that has already said goodbye.

How it works.

  1. The station broadcasts, the way it already does. AcuRite every 18 seconds, Ecowitt every 16 to 64 depending on the sensor.
  2. 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.
  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.
  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. The receiver on a five-dollar module is not as sensitive as a software-defined-radio dongle with a proper antenna; expect about half the range. For a station within a hundred metres and line of sight, that is no limit at all. 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.

  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. Set the Band: 433.92 for AcuRite, La Crosse and Oregon Scientific; 915.00 for Ecowitt and Ambient Weather in the US. The radio retunes on the spot.
  4. Watch Stations heard on the same page. Your station appears on its next broadcast with its model, signal strength, and how long ago. 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.
  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.
  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.

Open the printable setup card (PDF)

A three-page field card: what to have on hand, 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 an Ecowitt soil probe
{
  "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.0.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": "fineoffset-wh51:0a3f" },
      "measurement": "soil_moisture", "value": 41, "unit": "%",
      "agg": { "window_s": 60, "samples": 1, "method": "mean" },
      "source": { "physical_id": "fineoffset-wh51:0a3f", "brand": "Fine Offset (Ecowitt / Ambient)", "model": "Fineoffset-WH51", "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
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)
battery_mV, battery_VvoltageVlastmV ÷ 1000
leak, alarmwater_leakstate
model, id, channel, mic, sequence_num, message_type, rssi, snr, noise, protocol…identity and radio bookkeeping, never a measurement; rssi rides in source instead

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.

This is the part people have been asking for. Choose MQTT as the delivery method on the setup page, point it at the broker Home Assistant already uses (the Mosquitto add-on, usually), and the listener publishes every stream with MQTT discovery messages. Home Assistant creates the entities by itself: one device per station, one sensor entity per reading, with the right device class and unit, so temperature shows as temperature and wind speed as wind speed with no YAML. Your AcuRite becomes a Home Assistant device within a minute of the first broadcast.

  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. In Home Assistant open Settings, Devices & Services, MQTT. The station is there, named by its id, with its sensors beneath it. Rename it to something human; the id stays underneath.
  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 do not broadcast to the air in a way this listener can use, 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 hub hides the sensors’ radio ids, so streams are named hub-and-slot, ecowitt:3c71bf94:soil2.
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.

Range, bands and honest limits.

  • One band at a time. A farm with an AcuRite on 433 and Ecowitt soil probes on 915 needs two listeners, or one listener switched between bands. The radio cannot hear both at once.
  • On-off keying or FSK, not both. The shipped images are on-off keying, which covers everything in the table. The Ecowitt WS80 and WS90 ultrasonic arrays are FSK and need the source build with the modulation flag changed.
  • About half the range of an SDR dongle. A hundred metres with line of sight is comfortable; a metal barn between the station and the listener is not. Height and a wire antenna cut to the band buy more than anything in software.
  • 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. Most models, including the AcuRite Iris and the Ecowitt family, keep their 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.

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 with a five-dollar CC1101 radio, set the band to 433.92 MHz, and choose MQTT delivery pointed at the broker Home Assistant uses. The listener hears the station's broadcasts directly, decodes them with the open rtl_433 decoders, and publishes each reading with MQTT discovery, so Home Assistant creates the device and its sensor entities by itself. No AcuRite account, hub, or cloud is involved, and the station's own display keeps working.

Can one receiver hear both 433 MHz and 915 MHz sensors?

Not at the same time. The CC1101 and SX1276 radios tune across both bands, but a receiver demodulates one frequency at a time. A property with an AcuRite station on 433 MHz and Ecowitt soil probes on 915 MHz needs two listeners, or one listener switched between bands on its setup page. Two boards cost less than one hub.

Which weather stations can an ESP32 with a CC1101 decode?

Anything the rtl_433 project decodes with on-off keying, which is more than two hundred device types: AcuRite Iris, Atlas, Notos and tower sensors; La Crosse; Oregon Scientific; Bresser; TFA; and the Fine Offset family sold as Ecowitt and Ambient Weather, including the WH65 and WS-2902 arrays, WH51 soil probes, WN30 and WN34 temperature probes, WN35 leaf wetness, WH57 lightning, WH41 particulates and WH55 leak sensors. Ecowitt's WS80 and WS90 ultrasonic arrays use FSK and need the alternate build. Davis stations are not decoded; use their hub.

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, needs no operating system, and is flashed from a web page. The trade is range: the module hears about half as far as a dongle with a good antenna.

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. Several receivers can hear the same station at once.

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. When the station moves within Wi-Fi range, fill in the Wi-Fi form on the same board and it pushes directly.

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

Ecowitt and Ambient Weather hubs can send every report to a URL you choose, in addition to or instead of the vendor's cloud. The OAT gather bridge accepts that report 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 hub. This listener is the route when you would rather not need one.