Various tweaks
This commit is contained in:
parent
df4d3b130d
commit
ad2b15d49e
|
@ -1,3 +1,4 @@
|
|||
shroom_server
|
||||
shrooms.db
|
||||
auth_secret
|
||||
__pycache__/
|
||||
|
|
|
@ -1,7 +1,15 @@
|
|||
import numpy as np
|
||||
import time
|
||||
|
||||
from utils import send_update
|
||||
|
||||
from humidifier import Humidifier, HumidifierV2
|
||||
from humidifier_v3 import HumidifierV3
|
||||
|
||||
class Controller:
|
||||
def __init__(self, humidifiers):
|
||||
self.target_lower = 85
|
||||
self.target_upper = 90
|
||||
self.target_lower = 83
|
||||
self.target_upper = 87
|
||||
self.feedforward_coeff = 50
|
||||
self.last_toggle = 0
|
||||
|
||||
|
@ -25,13 +33,14 @@ class Controller:
|
|||
|
||||
def set_checked(self, s, humidifier, on):
|
||||
if time.time() - self.last_toggle > 0.8:
|
||||
if humidifier is HumidifierV3:
|
||||
print("setting {} to {}".format(humidifier, on))
|
||||
if isinstance(humidifier, HumidifierV3):
|
||||
humidifier.set(s, on)
|
||||
else:
|
||||
elif isinstance(humidifier, Humidifier) or isinstance(humidifier, HumidifierV2):
|
||||
humidifier.toggle(s)
|
||||
self.last_toggle = time.time()
|
||||
|
||||
def update(self, humidity):
|
||||
def update(self, s, humidity):
|
||||
if self.first_sample:
|
||||
self.humidifier_history[:] = humidity
|
||||
self.first_sample = False
|
||||
|
@ -49,16 +58,16 @@ class Controller:
|
|||
|
||||
if self.manual_mode:
|
||||
for humidifier in self.humidifiers:
|
||||
if humidifier.off and self.manual_on:
|
||||
if not humidifier.on and self.manual_on:
|
||||
self.set_checked(s, humidifier, True)
|
||||
elif humidifier.on and not self.manual_on:
|
||||
elif not humidifier.off and not self.manual_on:
|
||||
self.set_checked(s, humidifier, False)
|
||||
else:
|
||||
if comp_humidity < self.target_lower:
|
||||
for humidifier in self.humidifiers:
|
||||
if humidifier.off:
|
||||
if not humidifier.on:
|
||||
self.set_checked(s, humidifier, True)
|
||||
elif comp_humidity > self.target_upper:
|
||||
for humidifier in self.humidifiers:
|
||||
if humidifier.on:
|
||||
if not humidifier.off:
|
||||
self.set_checked(s, humidifier, False)
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
import numpy as np
|
||||
import time
|
||||
|
||||
from utils import send_update
|
||||
|
||||
class Humidifier:
|
||||
def __init__(self):
|
||||
self.off_threshold = 0.4
|
||||
|
|
|
@ -53,33 +53,14 @@ void setup()
|
|||
//sht20.checkSHT20(); // Check SHT20 Sensor
|
||||
}
|
||||
|
||||
// relay 4
|
||||
void toggle() {
|
||||
digitalWrite(4, HIGH);
|
||||
delay(100);
|
||||
digitalWrite(4, LOW);
|
||||
}
|
||||
|
||||
// relay 3
|
||||
void toggle2() {
|
||||
digitalWrite(5, HIGH);
|
||||
delay(100);
|
||||
digitalWrite(5, LOW);
|
||||
}
|
||||
|
||||
void toggle_test(int p) {
|
||||
digitalWrite(p, HIGH);
|
||||
delay(100);
|
||||
digitalWrite(p, LOW);
|
||||
}
|
||||
|
||||
const int PIN_RELAY4 = 4;
|
||||
const int PIN_RELAY3 = 5;
|
||||
|
||||
void loop()
|
||||
{
|
||||
while (Serial.available()) {
|
||||
const int c = Serial.read();
|
||||
if (c == 's') {
|
||||
// TODO dump the current status
|
||||
#ifdef USE_SHT30
|
||||
sht30.read();
|
||||
float humd = sht30.getHumidity();
|
||||
|
@ -88,28 +69,17 @@ void loop()
|
|||
float humd = sht20.readHumidity(); // Read Humidity
|
||||
float temp = sht20.readTemperature(); // Read Temperature
|
||||
#endif
|
||||
const int NUM_AVG = 64;
|
||||
float volts = 0.0f;
|
||||
float volts2 = 0.0f;
|
||||
for (int i = 0; i < NUM_AVG; i++) {
|
||||
volts += (5.0f/1024.0f)*analogRead(A2);
|
||||
volts2 += (5.0f/1024.0f)*analogRead(A0);
|
||||
}
|
||||
volts *= 1.0f/NUM_AVG;
|
||||
volts2 *= 1.0f/NUM_AVG;
|
||||
Serial.print(humd);
|
||||
Serial.print(",");
|
||||
Serial.print(temp);
|
||||
Serial.print(",");
|
||||
Serial.print(volts);
|
||||
Serial.print(",");
|
||||
Serial.println(volts2);
|
||||
} else if (c == 'h') {
|
||||
toggle();
|
||||
} else if (c == 'i') {
|
||||
toggle2();
|
||||
} else if (c >= 'A' && c <= 'Z') {
|
||||
toggle_test(c - 'A');
|
||||
//Serial.print(",");
|
||||
//Serial.print(volts);
|
||||
//Serial.print(",");
|
||||
//Serial.println(volts2);
|
||||
Serial.println("");
|
||||
} else if (c == 'z' || c == 'Z') {
|
||||
if (c == 'z') digitalWrite(PIN_RELAY4, LOW);
|
||||
if (c == 'Z') digitalWrite(PIN_RELAY4, HIGH);
|
||||
}
|
||||
}
|
||||
delay(1);
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
import time
|
||||
|
||||
from utils import send_update
|
||||
|
||||
# this is driving a SSR that's powering a AC-powered humidifier
|
||||
# we don't need voltage readings for this one
|
||||
class HumidifierV3:
|
||||
def __init__(self):
|
||||
def __init__(self, humidifier_id="humidifier"):
|
||||
self.last_toggle = 0
|
||||
self.last_state = False
|
||||
self.last_state = None
|
||||
self.cooldown = 5
|
||||
self.humidifier_id = humidifier_id
|
||||
|
||||
def set(self, s, on):
|
||||
if on != self.last_state:
|
||||
|
@ -20,4 +23,22 @@ class HumidifierV3:
|
|||
s.flush()
|
||||
if self.last_state != on:
|
||||
self.last_toggle = time.time()
|
||||
if on:
|
||||
print("send {} on".format(self.humidifier_id))
|
||||
else:
|
||||
print("send {} off".format(self.humidifier_id))
|
||||
send_update({"status": {self.humidifier_id: on}})
|
||||
|
||||
self.last_state = on
|
||||
|
||||
# TODO: read this from Arduino to verify the pin state
|
||||
def update(self, val):
|
||||
self.last_state = (val != 0)
|
||||
|
||||
@property
|
||||
def on(self):
|
||||
return self.last_state is not None and self.last_state
|
||||
|
||||
@property
|
||||
def off(self):
|
||||
return self.last_state is not None and not self.last_state
|
||||
|
|
|
@ -11,6 +11,9 @@ from humidifier import Humidifier, HumidifierV2
|
|||
from humidifier_v3 import HumidifierV3
|
||||
from controller import Controller
|
||||
|
||||
import utils
|
||||
from utils import start_process, send_update
|
||||
|
||||
SERIAL_PATH = "/dev/ttyACM0"
|
||||
SERIAL_BAUD = 115200
|
||||
|
||||
|
@ -23,21 +26,8 @@ except KeyError:
|
|||
is_mock = False
|
||||
|
||||
print("controller start")
|
||||
process = None
|
||||
def start_process():
|
||||
global process
|
||||
if is_mock:
|
||||
process = subprocess.Popen(["/usr/bin/env", "python", "/home/kelvin/src/shroom-server/shroom_pipe.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
else:
|
||||
#process = subprocess.Popen(["ssh", "shrooms@threefortiethofonehamster.com", "/usr/bin/env", "python3", "/home/shrooms/shrooms-server/shroom_pipe.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
process = subprocess.Popen(["ssh", "shrooms@35.211.7.97", "/usr/bin/env", "python3", "/home/shrooms/shrooms-server/shroom_pipe.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
start_process()
|
||||
|
||||
def send_update(msg):
|
||||
global process
|
||||
process.stdin.write(bytes(json.dumps(msg) + "\n", "utf8"))
|
||||
process.stdin.flush()
|
||||
|
||||
if is_mock:
|
||||
import mock_serial
|
||||
s = mock_serial.MockSerial()
|
||||
|
@ -62,7 +52,7 @@ exiting = False
|
|||
def stdout_loop():
|
||||
global process, controller, humidifier, humidifier2
|
||||
while not exiting:
|
||||
msg = process.stdout.readline()
|
||||
msg = utils.process.stdout.readline()
|
||||
if len(msg) <= 1:
|
||||
continue
|
||||
print("got message ", msg)
|
||||
|
@ -151,7 +141,7 @@ try:
|
|||
#print(parts)
|
||||
|
||||
try:
|
||||
controller.update(humidity)
|
||||
controller.update(s, humidity)
|
||||
|
||||
if frame_num == 0:
|
||||
#print(humidity, temp, volts)
|
||||
|
@ -161,7 +151,7 @@ try:
|
|||
"temp": temp,
|
||||
"hum": humidity,
|
||||
"hv": 1 if humidifier.on else 0,
|
||||
#"hv2": volts2,
|
||||
"hv2": 1 if humidifier.on else 0,
|
||||
}
|
||||
}
|
||||
send_update(update)
|
||||
|
@ -170,7 +160,7 @@ try:
|
|||
print("pipe errored out, restarting: ", e)
|
||||
# restart the process I guess
|
||||
exiting = True
|
||||
process.kill()
|
||||
utils.process.kill()
|
||||
time.sleep(0.1)
|
||||
stdout_thread.join()
|
||||
exiting = False
|
||||
|
@ -183,5 +173,5 @@ try:
|
|||
finally:
|
||||
# kill ssh connection
|
||||
exiting = True
|
||||
process.kill()
|
||||
utils.process.kill()
|
||||
stdout_thread.join()
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
import subprocess
|
||||
import os
|
||||
import json
|
||||
|
||||
process = None
|
||||
def start_process():
|
||||
global process
|
||||
|
||||
try:
|
||||
is_mock = os.environ['MOCK']
|
||||
except KeyError:
|
||||
is_mock = False
|
||||
if is_mock:
|
||||
process = subprocess.Popen(["/usr/bin/env", "python", "/home/kelvin/src/shroom-server/shroom_pipe.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
else:
|
||||
#process = subprocess.Popen(["ssh", "shrooms@threefortiethofonehamster.com", "/usr/bin/env", "python3", "/home/shrooms/shrooms-server/shroom_pipe.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
process = subprocess.Popen(["ssh", "shrooms@35.211.7.97", "/usr/bin/env", "python3", "/home/shrooms/shrooms-server/shroom_pipe.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
|
||||
def send_update(msg):
|
||||
global process
|
||||
process.stdin.write(bytes(json.dumps(msg) + "\n", "utf8"))
|
||||
process.stdin.flush()
|
||||
|
||||
|
Loading…
Reference in New Issue