Problem
Today a user observed their Pixie zone showing 89% moisture in Indigo while the Netro mobile app showed 24% for the same zone. Investigation confirmed:
/moistures.json returns Netro's smart-model daily prediction (model assumes saturation post-irrigation and decays over days) — for this zone today, 89%.
- The Whisperer sensor paired to that zone shows the actual soil reading, ~22–31% throughout the day, currently 24%.
- Netro's mobile app renders the Whisperer reading on the zone tile when a Whisperer is paired in the account. The public API doesn't expose this pairing.
Confirmed by comparing yesterday's data on the same zone:
- Whisperer sensor range for 2026-04-21: 19–29% (24 readings, hourly)
/moistures.json row for same zone, same date: 89%
So /moistures.json is not the sensor reading — it's a model prediction that can be dramatically different from ground truth. Plugin reads both correctly, but they surface on different Indigo devices with no linkage.
Proposed solution
Add a per-zone Whisperer pairing in device config UI (Devices.xml + ConfigUI callback):
- On the zone device config, add a dropdown
linkedWhispererDeviceId populated with this plugin's Whisperer devices + an "(unpaired)" option.
- In
_update_zone_devices / process_zone_moisture, when a Whisperer is paired: write the Whisperer's latest soilMoisture / sensorValue into the zone's moisture state instead of (or in addition to) the daily forecast row.
- Add a separate state
moistureForecast on the zone so the daily /moistures.json value is still observable (useful for comparing model vs reality, tuning schedules, etc.).
- No auto-pairing — explicit config only, to avoid brittle name-matching.
Out of scope
Documentation follow-up
docs/API_NOTES.md §6 currently says moisture "can be 12–24 hours old" — update to clarify it's a model prediction, not a sampled sensor value, and can diverge significantly from a paired Whisperer's actual reading.
Acceptance
Problem
Today a user observed their Pixie zone showing 89% moisture in Indigo while the Netro mobile app showed 24% for the same zone. Investigation confirmed:
/moistures.jsonreturns Netro's smart-model daily prediction (model assumes saturation post-irrigation and decays over days) — for this zone today, 89%.Confirmed by comparing yesterday's data on the same zone:
/moistures.jsonrow for same zone, same date: 89%So
/moistures.jsonis not the sensor reading — it's a model prediction that can be dramatically different from ground truth. Plugin reads both correctly, but they surface on different Indigo devices with no linkage.Proposed solution
Add a per-zone Whisperer pairing in device config UI (
Devices.xml+ ConfigUI callback):linkedWhispererDeviceIdpopulated with this plugin's Whisperer devices + an "(unpaired)" option._update_zone_devices/process_zone_moisture, when a Whisperer is paired: write the Whisperer's latestsoilMoisture/sensorValueinto the zone'smoisturestate instead of (or in addition to) the daily forecast row.moistureForecaston the zone so the daily/moistures.jsonvalue is still observable (useful for comparing model vs reality, tuning schedules, etc.).Out of scope
Documentation follow-up
docs/API_NOTES.md§6 currently says moisture "can be 12–24 hours old" — update to clarify it's a model prediction, not a sampled sensor value, and can diverge significantly from a paired Whisperer's actual reading.Acceptance
moisturestate mirrors Whisperer's current readingmoistureForecaststate exposes the/moistures.jsondaily valueAPI_NOTES.mdupdated to describe/moistures.jsonas predicted, not observed