import numpy as np import time class MockSerial: def __init__(self): self.humidity = np.zeros(100) self.humidifier_on = False self.humidity[:] = 80 self.humidity[-1] = 20 self.humidity[0] = 20 def flush(self): pass def write(self, msg): if msg == b'h': print("mock hum toggle") self.humidifier_on = not self.humidifier_on def read(self, _): t = time.time() temp = 25 + np.sin(0.01*2*np.pi*t) + 0.5*np.sin(0.0001*2*np.pi*t + 7) # very janky model of humidity diffusion # fix end conditions for _ in range(20): self.humidity[-1] = 0.2*20 + 0.8*self.humidity[-2] self.humidity[0] = 20 if self.humidifier_on: self.humidity[20] = 2 # use the gradient to determine the change in humidity avg = 0.5*(self.humidity[:-2] + self.humidity[2:]) self.humidity[1:-1] += 0.10*(avg - self.humidity[1:-1]) #print(self.humidity) humidity = self.humidity[60] + np.random.random()*0.003 if self.humidifier_on: hv = 3.3 else: hv = 0.0 return bytes("{},{},{}\n".format(humidity, temp, hv), "utf8")