107 lines
2.6 KiB
Python
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
|
|
|
|
|