Add auto-water setting and disable by default

Adds a new setting - auto_water - and disables by default to reflect the basic Grow kit being monitor-only.

Adds documentation for the settings file.
This commit is contained in:
Phil Howard
2020-07-27 17:08:37 +01:00
parent de3816f917
commit 03658f84ac
3 changed files with 56 additions and 2 deletions

46
examples/README.md Normal file
View File

@@ -0,0 +1,46 @@
# Watering Settings
The `grow-monitor-and-water.py` example can monitor and, optionally, automatically water all three Grow channels.
It's configured using a settings file - `water.yml` - that looks like the following:
```yaml
channel1:
water_level: 0.8
warn_level: 0.2
pump_speed: 0.7
pump_time: 0.7
auto_water: False
icon: icons/flat-4.png
channel2:
water_level: 0.8
warn_level: 0.2
pump_speed: 0.7
pump_time: 0.7
auto_water: False
channel3:
water_level: 0.8
warn_level: 0.2
pump_speed: 0.7
pump_time: 0.7
auto_water: False
general:
alarm_enable: True
alarm_interval: 1.0
```
By default auto-watering is disabled and an alarm will sound every 1s if the `warn_level` is reached.
## Channel Settings
* `water_level` - The level at which auto-watering should be triggered (soil saturation from 0.0 to 1.0)
* `warn_level` - The level at which the alarm should be triggered (soil saturation from 0.0 to 1.0)
* `pump_speed` - The speed at which the pump should be run (from 0.0 low speed to 1.0 full speed)
* `pump_time` - The time that the pump should run for (in seconds)
* `auto_water` - Whether to run the attached pump (True to auto-water, False for manual watering)
* `icon` - Optional icon image for the channel, see the icons directory for images.
## General Settings
* `alarm_enable` - Whether to enable the alarm
* `alarm_interval` - The interval at which the alarm should beep (in seconds)

View File

@@ -30,12 +30,13 @@ class Channel:
(254, 82, 82), # Red (254, 82, 82), # Red
] ]
def __init__(self, display_channel, sensor_channel, pump_channel, water_level=0.5, alarm_level=0.5, pump_speed=0.7, pump_time=0.7, watering_delay=30, icon=None): def __init__(self, display_channel, sensor_channel, pump_channel, water_level=0.5, alarm_level=0.5, pump_speed=0.7, pump_time=0.7, watering_delay=30, icon=None, auto_water=False):
self.channel = display_channel self.channel = display_channel
self.sensor = Moisture(sensor_channel) self.sensor = Moisture(sensor_channel)
self.pump = Pump(pump_channel) self.pump = Pump(pump_channel)
self.water_level = water_level self.water_level = water_level
self.alarm_level = alarm_level self.alarm_level = alarm_level
self.auto_water = auto_water
self.pump_speed = pump_speed self.pump_speed = pump_speed
self.pump_time = pump_time self.pump_time = pump_time
self.watering_delay = watering_delay self.watering_delay = watering_delay
@@ -67,6 +68,7 @@ class Channel:
self.alarm_level = config.get("alarm_level", self.alarm_level) self.alarm_level = config.get("alarm_level", self.alarm_level)
self.water_level = config.get("water_level", self.water_level) self.water_level = config.get("water_level", self.water_level)
self.watering_delay = config.get("watering_delay", self.watering_delay) self.watering_delay = config.get("watering_delay", self.watering_delay)
self.auto_water = config.get("auto_water", self.auto_water)
icon = config.get("icon", None) icon = config.get("icon", None)
if icon is not None: if icon is not None:
self.icon = Image.open(icon) self.icon = Image.open(icon)
@@ -77,12 +79,15 @@ class Channel:
return """Channel: {channel} return """Channel: {channel}
Water level: {water_level} Water level: {water_level}
Alarm level: {alarm_level} Alarm level: {alarm_level}
Auto water: {auto_water}
Pump speed: {pump_speed} Pump speed: {pump_speed}
Pump time: {pump_time} Pump time: {pump_time}
Delay: {watering_delay} Delay: {watering_delay}
""".format(**self.__dict__) """.format(**self.__dict__)
def water(self): def water(self):
if not self.auto_water:
return False
if time.time() - self.last_dose > self.watering_delay: if time.time() - self.last_dose > self.watering_delay:
self.pump.dose(self.pump_speed, self.pump_time, blocking=False) self.pump.dose(self.pump_speed, self.pump_time, blocking=False)
self.last_dose = time.time() self.last_dose = time.time()
@@ -135,7 +140,7 @@ Delay: {watering_delay}
if self.water(): if self.water():
logging.info("Watering Channel: {} - rate {:.2f} for {:.2f}sec".format(self.channel, self.pump_speed, self.pump_time)) logging.info("Watering Channel: {} - rate {:.2f} for {:.2f}sec".format(self.channel, self.pump_speed, self.pump_time))
if sat < self.alarm_level and not self.alarm: if sat < self.alarm_level and not self.alarm:
logging.warning("Alarm on Channel: {} - saturation is {:.2f} (warn level {:.2f}".format(self.channel, sat, self.alarm_level)) logging.warning("Alarm on Channel: {} - saturation is {:.2f} (warn level {:.2f})".format(self.channel, sat, self.alarm_level))
self.alarm = True self.alarm = True

View File

@@ -3,17 +3,20 @@ channel1:
warn_level: 0.2 warn_level: 0.2
pump_speed: 0.7 pump_speed: 0.7
pump_time: 0.7 pump_time: 0.7
auto_water: False
icon: icons/flat-4.png icon: icons/flat-4.png
channel2: channel2:
water_level: 0.8 water_level: 0.8
warn_level: 0.2 warn_level: 0.2
pump_speed: 0.7 pump_speed: 0.7
pump_time: 0.7 pump_time: 0.7
auto_water: False
channel3: channel3:
water_level: 0.8 water_level: 0.8
warn_level: 0.2 warn_level: 0.2
pump_speed: 0.7 pump_speed: 0.7
pump_time: 0.7 pump_time: 0.7
auto_water: False
general: general:
alarm_enable: True alarm_enable: True
alarm_interval: 1.0 alarm_interval: 1.0