Outdoor Sensing & Telemetry / 2026
The Instrumented Tree
Instrumented a calamondin citrus tree with an outdoor-hardened ESP32 sensor node (air, light, soil moisture, root-zone temperature) streaming into Home Assistant on a self-hosted Proxmox server, with a custom React dashboard that computes plant health from the physics.

The spark
There's a calamondin citrus tree in my front yard: Texas sun, rolling planter, real stakes (I like this tree). Instrumenting it became a full engineering exercise in miniature, with a sun-path analysis at 33°N, an itemized BOM, enclosure thermal design, and a decision log of rejected approaches, including a buried load-cell design vetoed for entombing electronics in wet soil.
The problem
A citrus tree hides water stress until the leaves drop, and by then the damage is done. Consumer plant sensors answer with cloud apps that die when the WiFi does, and none of them survive a Texas summer outdoors.
- Who it affects
- Me and the tree, but the problem generalizes to any outdoor sensing: plants show stress days after the damage is done, and cheap electronics die fast in the field.
- Previous workflow
- Poking the soil and hoping, or consumer plant sensors with phone apps that need the cloud for every reading.
- What it costs
- A dead tree is a $200 lesson; sun-cooked electronics are recurring ones. The sharpest lesson was thermal: a sealed outdoor enclosure in full Texas sun hit 60-70C internally and forced a redesign.
The solution
Instrumented a calamondin citrus tree with an outdoor-hardened ESP32 sensor node (air, light, soil moisture, root-zone temperature) streaming into Home Assistant on a self-hosted Proxmox server, with a custom React dashboard that computes plant health from the physics.
Outcome
Transpiration early-warning from a $13 soil sensor: a least-squares regression over 48 hours of moisture data flags a stressed tree days before visible symptoms. ~$87 total sensor BOM, LAN-only by design.
What I learned
One week of Texas sun teaches more about enclosure design than a month of reading. And the best metric is often computed, not sensed: dropping the planned load-cell scale didn't cost the hero measurement, because the dry-down slope extracts a transpiration signal from a $13 moisture sensor.
Technical decisions
- ESP32 + ESPHome
- YAML-declared sensors with OTA updates; I2C, 1-Wire, and ADC buses on one $10 board
- BME280 + BH1750 + DS18B20 + capacitive soil
- Air, light, root-zone temperature, and moisture for ~$87 all-in
- Home Assistant on Proxmox
- Self-hosted backend for history and alerting, LAN-only by design
- React + TypeScript + Vite
- Custom dashboard subscribed live to sensor entities, with the dry-down regression computed client-side
- Signal processing in TypeScript
- Least-squares slope fitting over the moisture history window, refreshed every 5 minutes
The hard part
Making cheap hardware trustworthy outdoors. A sealed IP65 box in full Texas sun reached 60-70C internally while ambient was 35C, cooking the climate readings. The fix was cartographic-grade instrument discipline: climate sensors moved out of the enclosure onto a vented radiation-shield mast, soil sensors got conformal coating and per-sensor trust flags, and calibration mapped each sensor's raw range to field capacity and refill point. The dashboard only ever shows data the system actually believes.
Next steps
- Pot-weight load-cell scale (designed: four 50kg half-bridge cells + HX711) for direct evapotranspiration measurement
- ESP32-CAM timelapse with a vision-confirmed first-fruit alert
- Evapotranspiration cross-check model from weather data
- LLM-voiced nightly tree diary grounded strictly in the day's real numbers