mirror of
https://github.com/pimoroni/grow-python
synced 2025-10-25 15:19:23 +00:00
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:
46
examples/README.md
Normal file
46
examples/README.md
Normal 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)
|
||||
@@ -30,12 +30,13 @@ class Channel:
|
||||
(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.sensor = Moisture(sensor_channel)
|
||||
self.pump = Pump(pump_channel)
|
||||
self.water_level = water_level
|
||||
self.alarm_level = alarm_level
|
||||
self.auto_water = auto_water
|
||||
self.pump_speed = pump_speed
|
||||
self.pump_time = pump_time
|
||||
self.watering_delay = watering_delay
|
||||
@@ -67,6 +68,7 @@ class Channel:
|
||||
self.alarm_level = config.get("alarm_level", self.alarm_level)
|
||||
self.water_level = config.get("water_level", self.water_level)
|
||||
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)
|
||||
if icon is not None:
|
||||
self.icon = Image.open(icon)
|
||||
@@ -77,12 +79,15 @@ class Channel:
|
||||
return """Channel: {channel}
|
||||
Water level: {water_level}
|
||||
Alarm level: {alarm_level}
|
||||
Auto water: {auto_water}
|
||||
Pump speed: {pump_speed}
|
||||
Pump time: {pump_time}
|
||||
Delay: {watering_delay}
|
||||
""".format(**self.__dict__)
|
||||
|
||||
def water(self):
|
||||
if not self.auto_water:
|
||||
return False
|
||||
if time.time() - self.last_dose > self.watering_delay:
|
||||
self.pump.dose(self.pump_speed, self.pump_time, blocking=False)
|
||||
self.last_dose = time.time()
|
||||
@@ -135,7 +140,7 @@ Delay: {watering_delay}
|
||||
if self.water():
|
||||
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:
|
||||
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
|
||||
|
||||
|
||||
|
||||
@@ -3,17 +3,20 @@ channel1:
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user