forked from veles_labs/pyveles
Added configuration detection for IAQ Wired Sensor
This commit is contained in:
parent
d771680ac1
commit
3da00c737e
@ -6,5 +6,5 @@ from .sensor_wired_RHT import SensorWiredRHT
|
||||
# links device identifiers to its class
|
||||
device_identifiers: Final[Dict[int, Device]] = {
|
||||
SensorWiredIAQ.DEVICE_CODE: SensorWiredIAQ,
|
||||
SensorWiredRHT.DEVICE_CODE: SensorWiredRHT
|
||||
SensorWiredRHT.DEVICE_CODE: SensorWiredRHT,
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
"""Module containing classes for generic wired/wireless devices"""
|
||||
from dataclasses import dataclass
|
||||
from typing import Dict, Final, Any, Union
|
||||
from typing import Dict, Final, Any
|
||||
from abc import ABC, abstractmethod
|
||||
import minimalmodbus
|
||||
import serial
|
||||
@ -27,6 +27,12 @@ class ReadoutErrorCounter:
|
||||
no_response: int = 0
|
||||
|
||||
|
||||
class NoResponseException(Exception):
|
||||
"""
|
||||
Raised when device fails to respond
|
||||
"""
|
||||
|
||||
|
||||
class Device(ABC):
|
||||
"""
|
||||
Base class for all devices
|
||||
@ -92,6 +98,12 @@ class ModbusRTUDevice(Device):
|
||||
self.dev: str = dev
|
||||
self.comm_device: minimalmodbus.Instrument = self.__comm_device_init()
|
||||
self.readout_errors: ReadoutErrorCounter = ReadoutErrorCounter()
|
||||
# check if device actually exists on the bus (by reading serial number);
|
||||
# if not, raise NoResponseException
|
||||
try:
|
||||
self.read_register(self.input_registers["SERIAL_NUMBER_1"])
|
||||
except minimalmodbus.NoResponseError as exc:
|
||||
raise NoResponseException from exc
|
||||
|
||||
def read_register(
|
||||
self, register_number: int, signed: bool = False, retries: int = 10
|
||||
@ -190,5 +202,6 @@ class ModbusRTUDevice(Device):
|
||||
|
||||
def get_data(self) -> Dict[str, int]:
|
||||
return {
|
||||
name: self.read_register(number) for name, number in self.input_registers.items()
|
||||
name: self.read_register(number)
|
||||
for name, number in self.input_registers.items()
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
from time import sleep
|
||||
from typing import Dict, Final
|
||||
from minimalmodbus import IllegalRequestError
|
||||
from .generic import ModbusRTUDevice
|
||||
|
||||
|
||||
@ -28,7 +29,7 @@ class SensorWiredIAQ(ModbusRTUDevice):
|
||||
"PMC_NUMBER_2_5": 30015, # 1 / m^3
|
||||
"PMC_NUMBER_4_0": 30016, # 1 / m^3
|
||||
"PMC_NUMBER_10_0": 30017, # 1 / m^3
|
||||
"TYPICAL_PARTICLE_SIZE": 30018, # nm
|
||||
"PMC_TYPICAL_PARTICLE_SIZE": 30018, # nm
|
||||
"READ_ERR_T": 30019, # temperature sensor error code (0 if no error)
|
||||
"READ_ERR_RH": 30020, # humidity sensor error code (0 if no error)
|
||||
"READ_ERR_CO2": 30021, # CO2 sensor error code (0 if no error)
|
||||
@ -74,3 +75,24 @@ class SensorWiredIAQ(ModbusRTUDevice):
|
||||
self.write_register(self.holding_registers["LED_BRIGHTNESS"], value)
|
||||
sleep(0.1)
|
||||
self.write_register(self.holding_registers["LED_ON"], 1)
|
||||
|
||||
def __remove_sensor_from_input_registers(self, sensor: str):
|
||||
"""
|
||||
Remove all items containing "sensor" str from input_registers
|
||||
"""
|
||||
deleted_registers = list(filter(lambda x: sensor in x, self.input_registers))
|
||||
_ = list((self.input_registers.pop(x) for x in deleted_registers))
|
||||
|
||||
def __init__(self, modbus_address, baudrate=19200, dev="/dev/rs485"):
|
||||
super().__init__(modbus_address, baudrate, dev)
|
||||
# detect sensor configuration and modify input_registers accordingly
|
||||
# Check if VOC sensor present
|
||||
try:
|
||||
self.read_register(self.input_registers["VOC_INDEX"])
|
||||
except IllegalRequestError:
|
||||
self.__remove_sensor_from_input_registers("VOC")
|
||||
# Check if PMC sensor present
|
||||
try:
|
||||
self.read_register(self.input_registers["PMC_MASS_1_0"])
|
||||
except IllegalRequestError:
|
||||
self.__remove_sensor_from_input_registers("PMC")
|
||||
|
Loading…
Reference in New Issue
Block a user