From d771680ac19617ed5eb447a1bb9a2f3709245113 Mon Sep 17 00:00:00 2001 From: Jan Mrna Date: Mon, 15 Aug 2022 22:00:17 +0200 Subject: [PATCH] Fixed several issues --- src/veles/device/find.py | 6 +++--- src/veles/device/generic.py | 27 +++++++++++++++++++++++---- src/veles/device/sensor_wired_IAQ.py | 11 ++++++----- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/veles/device/find.py b/src/veles/device/find.py index dee502e..a115eb4 100644 --- a/src/veles/device/find.py +++ b/src/veles/device/find.py @@ -5,6 +5,6 @@ from .sensor_wired_RHT import SensorWiredRHT # links device identifiers to its class device_identifiers: Final[Dict[int, Device]] = { - SensorWiredIAQ.IDENTIFIER: SensorWiredIAQ, - SensorWiredRHT.IDENTIFIER: SensorWiredRHT -} \ No newline at end of file + SensorWiredIAQ.DEVICE_CODE: SensorWiredIAQ, + SensorWiredRHT.DEVICE_CODE: SensorWiredRHT +} diff --git a/src/veles/device/generic.py b/src/veles/device/generic.py index 2d2793e..99e0e6b 100644 --- a/src/veles/device/generic.py +++ b/src/veles/device/generic.py @@ -1,6 +1,6 @@ """Module containing classes for generic wired/wireless devices""" from dataclasses import dataclass -from typing import Dict, Final, Any +from typing import Dict, Final, Any, Union from abc import ABC, abstractmethod import minimalmodbus import serial @@ -14,8 +14,8 @@ class Modbus: INPUT_REGISTER_START = 30001 INPUT_REGISTER_END = 39999 # ranges for testing if address is in address range - input_register_range = range(INPUT_REGISTER_START, INPUT_REGISTER_END) - holding_register_range = range(HOLDING_REGISTER_START, HOLDING_REGISTER_END) + input_register_range = range(INPUT_REGISTER_START, INPUT_REGISTER_END + 1) + holding_register_range = range(HOLDING_REGISTER_START, HOLDING_REGISTER_END + 1) @dataclass(slots=True) @@ -39,6 +39,20 @@ class Device(ABC): used for logging purposes """ + @property + @abstractmethod + def device_code(self) -> int: + """ + Return device code (device type) + """ + + @property + @abstractmethod + def serial_number(self) -> int: + """ + Return serial number, unique for each device + """ + class ModbusRTUDevice(Device): """ @@ -148,7 +162,7 @@ class ModbusRTUDevice(Device): """ try: self.write_register( - ModbusRTUDevice.holding_registers["RESET"], + ModbusRTUDevice.holding_registers["RESET_DEVICE"], ModbusRTUDevice.MAGIC_RESET_CONSTANT, ) return False # got answer => failed to reset @@ -173,3 +187,8 @@ class ModbusRTUDevice(Device): self.read_register(self.input_registers["SERIAL_NUMBER_2"]) ) return (serial_number_1 << 16) + serial_number_2 + + def get_data(self) -> Dict[str, int]: + return { + name: self.read_register(number) for name, number in self.input_registers.items() + } diff --git a/src/veles/device/sensor_wired_IAQ.py b/src/veles/device/sensor_wired_IAQ.py index 606c142..a3696a1 100644 --- a/src/veles/device/sensor_wired_IAQ.py +++ b/src/veles/device/sensor_wired_IAQ.py @@ -29,9 +29,11 @@ class SensorWiredIAQ(ModbusRTUDevice): "PMC_NUMBER_4_0": 30016, # 1 / m^3 "PMC_NUMBER_10_0": 30017, # 1 / m^3 "TYPICAL_PARTICLE_SIZE": 30018, # nm - "T_SCD4x": 30019, # deg C - "T_SCD4x_F": 30020, # deg F - "RH_SCD4x": 30021 # % + "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) + "READ_ERR_VOC": 30022, # VOC sensor error code (0 if no error) + "READ_ERR_PMC": 30023, # PMC sensor error code (0 if no error) } | ModbusRTUDevice.input_registers holding_registers: Dict[str, int] = { "MODBUS_ADDR": 40001, @@ -41,7 +43,7 @@ class SensorWiredIAQ(ModbusRTUDevice): "LED_SMOOTH": 40005, "CO2_ALERT_LIMIT1": 40006, "CO2_ALERT_LIMIT2": 40007, - "SCD4x_T_OFFSET": 40008 + "SCD4x_T_OFFSET": 40008, } | ModbusRTUDevice.holding_registers @property @@ -72,4 +74,3 @@ class SensorWiredIAQ(ModbusRTUDevice): self.write_register(self.holding_registers["LED_BRIGHTNESS"], value) sleep(0.1) self.write_register(self.holding_registers["LED_ON"], 1) -