Whats your Sprinkler Timer Algorithms : show em

Dead of winter, what better time to think about smart sprinkler algos! Trying to piece some ideas together. This is what Ive got

Weather API

  • chanceOfRain: % chance of rain
  • forecastRainLevel: Amount of rain predicted
  • rainLevelYesterday: How much it rained yesterday

Constants

  • desiredLevel: level (inches) of amount of water per cycle
  • applicationRate: measure rate of sprinkler flow (inches/second) (you have to doink around with times/measurements to get this)

Run Time Variables

  • runTime: How long the sprinklers are run (seconds)

Persistent Variables

  • lastRun: timestamp of the last scheduled run
  • levelApplied: the amount of water applied during scheduled run (calculated based on applicationRate * runTime)
  • levelYesterday: Amount of water applied added with the amount of rain reported

Assumptions

  • A scheduled run completes and provides the proper water level
  • Water every other day, pending day-before/day-of rain
  • Weather API current day rain level is accurate

Process
// right before midnight
- grab current days rainLevel
- add rainLevel to any watering level done via sprinklers
- levelYesterday = rainLevelToday + levelApplied

// at scheduled time in AM 
if `levelYesterday` < `desiredLevel`:
  // either no watering or not enough rain

  `rainLevel` = `forecastedRainLevel`
  if `chanceOfRain` < 60:
    // roll the dice that it wont rain
    `rainLevel` = 0
  end

  `levelNeeded` = `desiredLevel` - `rainLevel`
  `waterTime` = `levelNeeded` * `applicationRate`
  // run sprinklers for waterTime (s)
else:
  // do nothing yesterday met requirements
end

Problems

  • What if levelYesterday was jus slightly less than desiredLevel
  • Maybe need a 2 day running total? Because in theory, the desiredLevel is over two days?
  • This hurts my brain

Would love some others perspective. Its things like this that I also wonder, isnt it easier to just click a button the night before that tells the system "Run the sprinklers in the AM" .. but making logic is fun

1 Like

Ive changed it now so there is now a dailyLevelMin and as long as its over that amount it wont trigger a sprinkler run, and keep delaying a run until its under that amount. I think this should work

// at scheduled time in AM 
if `levelYesterday` < `dailyLevelMin`:

If I had a real yard and a real system :wink: