Source code for libs.sensor

"""Access the values of each sensor.

+-----------------+-----------+-------------------------------------+
|sensor name      |i2c_address| dataset name                        |
+=================+===========+=====================================+
|"MOUNTED TSL2572"|0x39       |"ILLUMINANCE"                        |
+-----------------+-----------+-------------------------------------+
|"EXTERNAL BME280"|0x76       |"TEMPERATURE", "HUMIDITY", "PRESSURE"|
+-----------------+-----------+-------------------------------------+
|"MOUNTED BMD280" |0x77       |"TEMPERATURE", "HUMIDITY", "PRESSURE"|
+-----------------+-----------+-------------------------------------+
"""

from typing import List
from dataclasses import dataclass, field
from cgsensor import BME280, TSL2572
from datetime import datetime

_SENSOR = {0x39: "MOUNTED TSL2572", 0x76: "EXTERNAL BME280", 0x77: "MOUNTED BME280"}


[docs] @dataclass class DataSet: """Observations and their information.""" name: str = "" #: name date_time: datetime = datetime.now() #: datetime when the value was obtained data: float = 0.0 #: observed value
[docs] @dataclass class Sensor: """Sensor name and i2c address.""" name: str = "" #: sensor name i2c_address: int = 0x00 #: i2c address of sensor def __post_init__(self): self.name = _SENSOR[self.i2c_address]
[docs] @classmethod def list_i2c_address(cls) -> List[int]: """List of valid sensors for the node. :returns: List of valid sensor i2c addresses """ result: List[int] = [] for i2c_address in _SENSOR.keys(): try: match i2c_address: case 0x39: if TSL2572().check_id(): result.append(i2c_address) case 0x76 | 0x77: if BME280(i2c_address).check_id(): result.append(i2c_address) except OSError: pass return result
[docs] @dataclass class Amedas: """Get the measurement results of the indoor environment.""" sensor: Sensor #: sensor list_dataset: List[DataSet] = field(default_factory=list) #: List of dataset def __post_init__(self): match self.sensor.i2c_address: case 0x39: device = TSL2572() if device.single_auto_measure(): self.list_dataset.append( DataSet( name="ILLUMINANCE", date_time=datetime.now(), data=device.illuminance, ) ) case 0x76 | 0x77: device = BME280(self.sensor.i2c_address) if device.forced(): self.list_dataset.append( DataSet( name="TEMPERATURE", date_time=datetime.now(), data=device.temperature, ) ) self.list_dataset.append( DataSet( name="HUMIDITY", date_time=datetime.now(), data=device.humidity, ) ) self.list_dataset.append( DataSet( name="PRESSURE", date_time=datetime.now(), data=device.pressure, ) )
if __name__ == "__main__": print(__file__)