Add soil sensors, cooldown skipping, make dupe skipping optional

This commit is contained in:
Tanner Collin 2025-06-20 16:58:21 +00:00
parent 54e169bdd2
commit ecd1dab005

34
main.py
View File

@ -81,6 +81,8 @@ class Sensor():
bad_keys = [] bad_keys = []
last_update = None last_update = None
update_period = None update_period = None
skip_if_hasnt_changed = False
skip_cooldown = 1.0
def __init__(self, id_, name): def __init__(self, id_, name):
self.id_ = id_ self.id_ = id_
@ -103,7 +105,15 @@ class Sensor():
return str(before) != str(after) return str(before) != str(after)
def log(self): 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 return
data = self.value.copy() data = self.value.copy()
@ -146,10 +156,10 @@ class Sensor():
self.last_update = time.time() self.last_update = time.time()
def update(self, data): def update(self, data):
self.last_update = time.time()
self.prev_value = self.value self.prev_value = self.value
self.value = data self.value = data
self.log() self.log()
self.last_update = time.time()
async def poll(self): async def poll(self):
return return
@ -168,6 +178,7 @@ class ThermostatSensor(Sensor):
'dehum_setpoint' 'dehum_setpoint'
] ]
update_period = 300 update_period = 300
skip_if_hasnt_changed = True
def __init__(self, id_, ip, name): def __init__(self, id_, ip, name):
self.id_ = id_ self.id_ = id_
@ -200,6 +211,7 @@ class OwnTracksSensor(Sensor):
'created_at', 'created_at',
] ]
update_period = 90 update_period = 90
skip_cooldown = False
class DustSensor(Sensor): class DustSensor(Sensor):
type_ = 'dust' type_ = 'dust'
@ -237,6 +249,18 @@ class SleepSensor(Sensor):
except TypeError: except TypeError:
pass 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): class SolarSensor(Sensor):
type_ = 'solar' type_ = 'solar'
@ -434,6 +458,9 @@ async def history(request):
elif measurement == 'air': elif measurement == 'air':
client = sensors_client 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) 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': elif measurement == 'lux':
client = sensors_client 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) 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(ERTSCMSensor('78628180', 'Gas'))
sensors.add(OwnTracksSensor('owntracks1', 'OwnTracks')) sensors.add(OwnTracksSensor('owntracks1', 'OwnTracks'))
sensors.add(AirSensor('air1', 'Living Room')) 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(Acurite606TX('185', 'Outside', 0.0))
sensors.add(AcuRite6002RM('999999', 'Seeds', 0.0)) # A sensors.add(AcuRite6002RM('999999', 'Seeds', 0.0)) # A
sensors.add(AcuRite6002RM('999998', 'Misc', 0.7, -1.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(AcuRite6002RM('11087', 'Bedroom', -0.7, 1.0)) # C
sensors.add(SleepSensor('sleep1', 'Bedroom')) sensors.add(SleepSensor('sleep1', 'Bedroom'))
sensors.add(SolarSensor('solar', 'Solar')) sensors.add(SolarSensor('solar', 'Solar'))
sensors.add(SoilSensor('soil1', 'Dumb Cane'))
sensors.add(QotMotionSensor('qot_dc3c', 'Bedroom')) sensors.add(QotMotionSensor('qot_dc3c', 'Bedroom'))
sensors.add(QotMotionSensor('qot_88c3', 'Lower Stairs Hi')) sensors.add(QotMotionSensor('qot_88c3', 'Lower Stairs Hi'))