Weather stations to recommend#
Which weather stations a farm on fieldmesh should be pointed to, and the ideas around them: what to measure, where to put it, how to check it, and how it gets into the log. Soil probes have a note of their own: soil sensors. Nothing here has been run on a real station yet (UNTESTED).
What a farm's station is for#
-
Watering by the weather. In the lawn study, adjusting the timer by reference evapotranspiration (ET) was the best single add-on: a third less water, no dry hours. ET needs four things:
- air temperature;
- humidity;
- sunshine;
- wind, at 2 m.
These come from the farm's own station, or from a forecast (Q26). The irrigation note found the probe-less advisory waiting on exactly this: humidity is collected already, sunshine is not.
-
Rain. It tells the soil advisory that rain arrived, and it is the rain sensor a controller can skip on.
-
Frost. The frost watch is scored against a station's air temperature (forecasts), and a farm's own low spot is colder than any forecast grid.
FAO-56 wants the measurements "at 2 m above an extensive surface of grass or short crop". Neither a roof nor a fence by the barn will do.
What makes a station worth recommending#
- The data stays on the farm. A local API, or a radio anyone can decode, rather than a vendor's cloud the farm reads back from. This is fieldmesh's first principle, and it also keeps the station working when the internet is down.
- It measures sunshine properly. Solar radiation is the largest term in ET, and the
weakest sensor on cheap stations. Some measure light (lux) and convert it to W/m² with
a fixed factor. Fine Offset's WH24 and WH65B send
light_lux(rtl_433's decoder,src/devices/fineoffset.c), and their app shows it as W/m². A pyranometer measures the energy itself. - Parts can be replaced: cups, bearings, the rain funnel, the humidity element.
- It speaks an open protocol, or is open hardware.
The candidates#
| what it is | measures | reaches fieldmesh | open? | caveat | |
|---|---|---|---|---|---|
| Build it: ESPHome | An ESP32 with a cup anemometer, vane and tipping bucket, such as SparkFun's Weather Meter Kit: passive reed switches, 0.2794 mm per tip. Add a temperature and humidity sensor in a radiation shield. | wind, rain, temperature, humidity; sunshine only with a pyranometer added | Today, through the MQTT bridge's ESPHome profile | firmware and wiring yours | you calibrate and maintain it; the shield matters |
| Build it: 3D-PAWS | UCAR and the National Weather Service's international office's 3D-printed station, built locally for a few hundred dollars, with "open-source electronics", used by weather services in many countries | wind, wind direction, rain, temperature, humidity, pressure; no solar sensor in the typical build | Through MQTT or its own outputs (to build) | open designs | a project to build, not a product to buy |
| Ready-made, cheap: the Fine Offset family | Sold as Ecowitt, Ambient, Misol and others, read through an Ecowitt gateway (GW1100, GW2000 and others, which serve a local HTTP API with no cloud account) or straight off the air by rtl_433 |
temperature, humidity, wind, rain, light/UV; some models add more | Today: off the air through rtl_433 and the bridge's rtl_433 profile, or through Home Assistant's MQTT state stream |
protocols decoded openly (rtl_433, GPL-2.0, 386 device protocols) |
sunshine from a light sensor; plastic mechanics |
| Ready-made: WeatherFlow Tempest | One unit, no moving parts; the hub broadcasts each minute's observation on the local network (UDP port 50222) | temperature, humidity, pressure, wind, rain by impact, solar radiation | Today: its UDP broadcast through sdk/station_adapters.py, or Home Assistant |
documented local broadcast | the maker calls the local broadcast a backup to its cloud |
| Ready-made, durable: Davis Vantage Pro2 with WeatherLink Live | A long-serving station whose WeatherLink Live unit serves current conditions over local HTTP and broadcasts wind and rain over UDP, both documented | temperature, humidity, wind, rain; solar with the optional sensor | Today: its local API polled by sdk/station_adapters.py, or Home Assistant |
documented local API | Davis's AirLink is an air-quality monitor, not this |
| Research grade: METER ATMOS 41 Gen 2 | All-in-one, no moving parts, SDI-12 or Modbus RTU over RS-485 on enabled units, with its registers documented | solar radiation (±5%), temperature (±0.2 °C at 25 °C), humidity, pressure, wind, rain, lightning | Through fieldmesh's Modbus RTU driver, which reads holding and input registers; the register binding is to build | documented protocol | the most to buy; the way to a pilot's reference station |
Software that sits between.
- WeeWX (GPL-3.0) drives more than fifty kinds of station and can publish to MQTT through an extension.
rtl_433decodes 433, 868 and 915 MHz stations through a cheap USB radio dongle (an RTL2832 TV stick) and publishes JSON to MQTT.
Either can feed fieldmesh's MQTT bridge, once the bridge has a profile for its topics.
What I'd recommend:
| for | station | why |
|---|---|---|
| a farm that builds | ESPHome, with a silicon pyranometer | it works with fieldmesh now |
| a farm that buys cheaply | the Fine Offset family through an Ecowitt gateway | the data stays local |
| a pilot's reference station | ATMOS 41 Gen 2 on Modbus | its sunshine and temperature are what scores everything else |
| a community or school network | 3D-PAWS | it is open, local and built to be maintained |
Ideas worth doing whatever the station#
-
Site it for the question. For ET, put it 2 m up over grass, away from buildings and pavement. For frost, add one cheap temperature node in the farm's lowest, coldest spot: that is where frost starts, and the station on the mast will not see it first.
-
Put a manual rain gauge beside the electronic one. A standard 4-inch gauge is what CoCoRaHS volunteers read each morning; the network does not accept electronic gauges. It checks the tipping bucket, and a farm can join CoCoRaHS with it.
-
Add rain gauges where the rain differs. One station gives ET for the whole farm; rain varies more over a farm than ET does. A tipping bucket on an ESPHome or Meshtastic node per field is cheap.
-
Check the sunshine against the sky. On a clear day, measured solar radiation should come close to FAO-56's clear-sky value,
Rso = (0.75 + 2×10⁻⁵ z) Ra(eq. 37), and never far above it. A reading far above that is wrong. A clear-day ratio sliding down over weeks is a dirty or ageing sensor. This is a quality check fieldmesh can run from the site's latitude and elevation alone, like its siting check. -
When there is no sunshine sensor, estimate it. FAO-56's Hargreaves formula,
Rs = 0.16 √(Tmax − Tmin) Ra(eq. 50; 0.19 near the coast), estimates it from the day's temperature range. A pyranometer beats it. -
Measure wind at 2 m, or convert it. FAO-56's eq. 47,
u₂ = u_z · 4.87 / ln(67.8 z − 5.42), brings a mast's reading down. A roof-mounted anemometer reads the roof. -
Share, if the farmer wants to.
- The Citizen Weather Observer Program passes stations' data to NOAA's MADIS, which checks it and gives quality feedback back.
- CoCoRaHS maps manual rain reports.
fieldmesh's grants (§7.6) are how a farm would say yes to either, for a stated span, and no to anything else.
-
Avoid a station that only uploads to its maker's cloud. If the maker goes, the station goes with it, and the farm's data was never the farm's.
What fieldmesh would build next#
In the order I'd do them:
-
The clear-sky check on solar radiation, beside the range and flatline checks. Built 2026-10-11 (
sdk/checks.clear_sky,sdk/sun.py). On a year of NOAA's reference station at Crossville, Tennessee, it raised nothing on healthy readings. With faults put in (tools/clear_sky_scan.py):- a clock on local time read as UTC was caught on 363 of 366 days;
- a clock an hour out, on 219;
- lux sent as watts, every day;
- a sensor 30% high, on only 46. The check is a ceiling, not a calibration; the clear-day ratio over weeks is still to build.
-
An
rtl_433profile in the MQTT bridge. It reaches every cheap station on 433/868/915 MHz without a vendor's gateway or Home Assistant in between. Built 2026-10-11:- it reads
rtl_433's events topic under the decoder's own field names; - it takes
-M time:unixepoch seconds as the reading's time; - it reports a station whose id changed with its batteries as unbound, by its new name.
It has been tested against the decoder's source, not yet a station on the air.
- it reads
-
A Modbus binding for the ATMOS 41 Gen 2, for a pilot's reference station. Built 2026-10-11: sdk/modbus_collector.py polls it from its register map.
- It reads input registers 3001–3044 in one burst, as the guide asks, because a read resets the station's accumulators.
- Each reading records the span it covers.
- Writing the decoder against the guide found a slip in it: its example of the float byte order prints 0x471F2000 for 123456.0, which is 0x47F12000.
Tested with a fake station answering over a pseudo-terminal, not yet a real one.
-
ET from the farm's own station into the soil advisory, for beds without a probe and for watering by the weather. Built 2026-10-11 (
sdk/eto.py; by the weather). With no probe, on the virtual farm's 2013 and 2012, it used 225 and 347 mm, against the probe's 208 and 319, with no stressed hour (the simulator of 2026-10-16; the balance counts the crop's use a fifth over FAO-56's estimate, its margin). -
Ecowitt's local API, Tempest's broadcast and WeatherLink Live's HTTP API as direct adapters (§10), for farms without Home Assistant. Built 2026-10-11 (sdk/station_adapters.py). Each station's own messages are parsed and written by the MQTT bridge's bindings and rules.
- Tempest: its hub's
obs_stUDP broadcast, field by field as WeatherFlow's UDP reference lays it out. - WeatherLink Live: its
current_conditions, rain left as counts of the gauge's own size for a calibration to turn into millimetres. - Ecowitt: the gateway's customized upload, rather than its less documented polling API. It is plain HTTP on the farm's network, so it takes only bound PASSKEYs and will not start without the gateway's address.
Tested over real sockets on loopback with the makers' documented messages, not yet with a station.
- Tempest: its hub's
Sources#
- FAO-56, R. G. Allen et al., 1998, chapter 3 (eqs. 37, 47, 48, 50; station siting). FAO
- 3D-PAWS: UCAR COMET, the station, UCAR RAL ("$200 to $400" to print, at the time).
rtl_433: github.com/merbanan/rtl_433.- WeeWX: github.com/weewx/weewx; MQTT extension weewx-mqtt.
- Ecowitt's local integration: github.com/Ecowitt/ha-ecowitt-iot (MIT).
- WeatherFlow Tempest UDP broadcast: apidocs.tempestwx.com.
- Davis WeatherLink Live local API: weatherlink.github.io; accessing data from WLL.
- METER ATMOS 41 Gen 2 Integrator Guide, rev. 05, 2026. PDF
- SparkFun Weather Meter Kit: sparkfun.com.
- Fine Offset's light sensor:
rtl_433's fineoffset.c; openHAB Fine Offset binding discussion. rtl_433's MQTT output and time options: OPERATION.md.- CWOP: NOAA MADIS; CoCoRaHS: NWS, cocorahs.org.