diff --git a/main.py b/main.py index 919947c..982168f 100644 --- a/main.py +++ b/main.py @@ -81,6 +81,8 @@ class Sensor(): bad_keys = [] last_update = None update_period = None + skip_if_hasnt_changed = False + skip_cooldown = 1.0 def __init__(self, id_, name): self.id_ = id_ @@ -103,7 +105,15 @@ class Sensor(): return str(before) != str(after) def log(self): - if not self.value or not self.changed(): + if not self.value: + return + + if not self.changed() and self.skip_if_hasnt_changed: + logging.debug('Skipping writing %s, data hasn\'t changed', self) + return + + if self.last_update and self.skip_cooldown and time.time() - self.last_update < self.skip_cooldown: + logging.debug('Skipping writing %s, cooldown limit', self) return data = self.value.copy() @@ -146,10 +156,10 @@ class Sensor(): self.last_update = time.time() def update(self, data): - self.last_update = time.time() self.prev_value = self.value self.value = data self.log() + self.last_update = time.time() async def poll(self): return @@ -168,6 +178,7 @@ class ThermostatSensor(Sensor): 'dehum_setpoint' ] update_period = 300 + skip_if_hasnt_changed = True def __init__(self, id_, ip, name): self.id_ = id_ @@ -200,6 +211,7 @@ class OwnTracksSensor(Sensor): 'created_at', ] update_period = 90 + skip_cooldown = False class DustSensor(Sensor): type_ = 'dust' @@ -237,6 +249,18 @@ class SleepSensor(Sensor): except TypeError: pass +class SoilSensor(Sensor): + type_ = 'soil' + update_period = 90 + + def transform(self, data): + for key, value in data.items(): + # what happens if you do this to a timestamp? + try: + data[key] = float(round(value, 1)) + except TypeError: + pass + class SolarSensor(Sensor): type_ = 'solar' @@ -434,6 +458,9 @@ async def history(request): elif measurement == 'air': client = sensors_client q = 'select max("pm10") as max_p10, max("pm25") as max_p25, max("co2") as max_co2, max("voc_idx") as max_voc from air where "name" = \'{}\' and time >= {}s and time < {}s group by time({}) fill(linear)'.format(name, start, end, window) + elif measurement == 'soil': + client = sensors_client + q = 'select mean("soil") as soil from soil where "name" = \'{}\' and time >= {}s and time < {}s group by time({}) fill(linear)'.format(name, start, end, window) elif measurement == 'lux': client = sensors_client q = 'select mean("lux") as lux from air where "name" = \'{}\' and time >= {}s and time < {}s group by time({}) fill(linear)'.format(name, start, end, window) @@ -515,6 +542,8 @@ if __name__ == '__main__': sensors.add(ERTSCMSensor('78628180', 'Gas')) sensors.add(OwnTracksSensor('owntracks1', 'OwnTracks')) sensors.add(AirSensor('air1', 'Living Room')) + sensors.add(AirSensor('air2', 'Bedroom')) + sensors.add(AirSensor('air3', 'Kitchen')) sensors.add(Acurite606TX('185', 'Outside', 0.0)) sensors.add(AcuRite6002RM('999999', 'Seeds', 0.0)) # A sensors.add(AcuRite6002RM('999998', 'Misc', 0.7, -1.0)) # A @@ -523,6 +552,7 @@ if __name__ == '__main__': sensors.add(AcuRite6002RM('11087', 'Bedroom', -0.7, 1.0)) # C sensors.add(SleepSensor('sleep1', 'Bedroom')) sensors.add(SolarSensor('solar', 'Solar')) + sensors.add(SoilSensor('soil1', 'Dumb Cane')) sensors.add(QotMotionSensor('qot_dc3c', 'Bedroom')) sensors.add(QotMotionSensor('qot_88c3', 'Lower Stairs Hi'))