Add soil sensors, cooldown skipping, make dupe skipping optional
This commit is contained in:
parent
54e169bdd2
commit
ecd1dab005
34
main.py
34
main.py
|
@ -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'))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user