Problem
When a user manually triggers a zone watering run from Indigo (which invokes sprinklerStart on the controller device), Indigo's built-in sprinkler device updates its activeZone state immediately — so the controller visually shows "running". However, the zone device is a custom device type; its isIrrigating state only updates when the plugin next polls Netro's /schedules.json. That's up to 30 min on the default schedulesInterval, or the minimum 10 min if tightened. During that window the controller shows running but the zone does not.
Observed on 2026-04-24 after triggering a manual run in Indigo client — noticed mismatched UI state between controller and zone. Not a regression — it's pre-existing behaviour exposed by dogfooding the Whisperer-pairing PR (#55) on live hardware.
Proposed fix
In startZoneWithDelay (plugin.py around line 1917), after a successful start_watering API response, force self._next_schedules_update = now (and/or self._next_device_info_update = now) so the next runConcurrentThread iteration picks up fresh state within MINIMUM_POLLING_INTERVAL_MINUTES (~3 min) instead of waiting for the full interval.
Same treatment probably warranted for:
stopWatering / "all zones off" actions.
setMoisture action (already writes state optimistically, but a schedule re-poll would confirm Netro applied it).
noWater / rain-delay actions.
Acceptance
Out of scope
- Adding optimistic UI state writes to the zone from the action handler (higher risk; current approach keeps Netro as source of truth).
- Eliminating the schedule-poll lag entirely (that would mean maintaining local state based on action side-effects, which drifts).
Context
Surfaced during PR #55 dogfooding. See plugin.py runConcurrentThread (line 1112) for the polling loop and _next_schedules_update semantics.
Problem
When a user manually triggers a zone watering run from Indigo (which invokes
sprinklerStarton the controller device), Indigo's built-in sprinkler device updates itsactiveZonestate immediately — so the controller visually shows "running". However, the zone device is a custom device type; itsisIrrigatingstate only updates when the plugin next polls Netro's/schedules.json. That's up to 30 min on the defaultschedulesInterval, or the minimum 10 min if tightened. During that window the controller shows running but the zone does not.Observed on 2026-04-24 after triggering a manual run in Indigo client — noticed mismatched UI state between controller and zone. Not a regression — it's pre-existing behaviour exposed by dogfooding the Whisperer-pairing PR (#55) on live hardware.
Proposed fix
In
startZoneWithDelay(plugin.pyaround line 1917), after a successfulstart_wateringAPI response, forceself._next_schedules_update = now(and/orself._next_device_info_update = now) so the nextrunConcurrentThreaditeration picks up fresh state withinMINIMUM_POLLING_INTERVAL_MINUTES(~3 min) instead of waiting for the full interval.Same treatment probably warranted for:
stopWatering/ "all zones off" actions.setMoistureaction (already writes state optimistically, but a schedule re-poll would confirm Netro applied it).noWater/ rain-delay actions.Acceptance
isIrrigatingreflects truth within ~3 min (onerunConcurrentThreadtick)._next_schedules_updatereset; failed start → timer unchanged.Out of scope
Context
Surfaced during PR #55 dogfooding. See plugin.py
runConcurrentThread(line 1112) for the polling loop and_next_schedules_updatesemantics.