Source code for caspia.gateway.services.sensors.carbondioxide.s300

from caspia.gateway.services import GatewayService
from caspia.meadow.client import characteristic_read_handler
from caspia.meadow.errors import SensorFailureError
from caspia.meadow.services import CarbonDioxideSensorBase
from caspia.node.components.sensors.s300 import S300Sensor


[docs]class S300CarbonDioxideSensor(GatewayService, CarbonDioxideSensorBase): auto_discovery = False
[docs] def configure(self): self.s300_c = self.network.get_configured_component(self.get_node(), S300Sensor, self.config['s300'])
@property def is_updated_periodically(self): return self.config['s300'].interval != 0 @property def dependant_components(self): return {self.s300_c}
[docs] async def on_component_event(self, component, event): if self.s300_c == component and isinstance(event, S300Sensor.MeasurementEvent): if not event.error: value = int(event.co2) else: value = SensorFailureError('sensor reported an error') await self.notify(self.level, value)
[docs] @characteristic_read_handler('level') async def level_read(self, **kwargs): if self.is_updated_periodically and self.s300_c.state: co2, error = self.s300_c.state.co2, self.s300_c.state.error else: co2 = await self.s300_c.measure() error = co2 is None if error: raise SensorFailureError('CO2 level not available') return int(co2)