shrooms-server/humidifier.py

107 lines
2.6 KiB
Python

import numpy as np
import time
from utils import send_update
class Humidifier:
def __init__(self):
self.off_threshold = 0.4
self.on_threshold = 1.9
self.toggle_cooldown = 16
self._on = False
self.history = np.zeros(10)
self.switch_timeout = 0
@property
def on(self):
return self._on
@on.setter
def on(self, nv):
old_on = self._on
self._on = nv
if nv:
print("send hum on")
else:
print("send hum off")
send_update({"status": {"humidifier": nv}})
@property
def off(self):
return not self.on
def update(self, volts):
self.history[1:] = self.history[:-1]
self.history[0] = volts
#print(self.history)
avg = np.sum(self.history)/self.history.shape[0]
if self.on:
if avg < self.off_threshold:
self.on = False
self.switch_timeout = time.time() + 1
else:
if avg > self.on_threshold:
self.on = True
self.switch_timeout = time.time() + 1
def toggle(self, s):
if time.time() > self.switch_timeout:
s.write(b"h")
s.flush()
self.switch_timeout = time.time() + self.toggle_cooldown
# the wiring's a little different so the thresholds for detecting on/off are inverted but hopefully a lot more reliable than the original
class HumidifierV2:
def __init__(self, toggle_cmd=b"i", humidifier_id="humidifier2"):
self.on_threshold = 1.5
self.off_threshold = 2.5
self.toggle_cooldown = 7
self.toggle_command = toggle_cmd
self._on = False
self.history = np.zeros(10)
self.switch_timeout = 0
self.humidifier_id = humidifier_id
@property
def on(self):
return self._on
@on.setter
def on(self, nv):
old_on = self._on
self._on = nv
if nv:
print("send {} on".format(self.humidifier_id))
else:
print("send {} off".format(self.humidifier_id))
send_update({"status": {self.humidifier_id: nv}})
@property
def off(self):
return not self.on
def update(self, volts):
self.history[1:] = self.history[:-1]
self.history[0] = volts
#print(self.history)
avg = np.sum(self.history)/self.history.shape[0]
if self.on:
if avg > self.off_threshold:
self.on = False
self.switch_timeout = time.time() + 3
else:
if avg < self.on_threshold:
self.on = True
self.switch_timeout = time.time() + 3
def toggle(self, s):
if time.time() > self.switch_timeout:
print("toggling {}".format(self.humidifier_id))
s.write(self.toggle_command)
s.flush()
self.switch_timeout = time.time() + self.toggle_cooldown