diff --git a/config/devices.toml b/config/devices.toml index 3c29e44..9e9a226 100644 --- a/config/devices.toml +++ b/config/devices.toml @@ -18,6 +18,7 @@ signed=true multiplier=1 divisor=1 decimalshiftright=0 +offset=-20 # will be added to the value after the multiplier/divisor and decimalshiftright have been applied, negative offset gets subtracted input=false # true = Input Register false = Holding Register name="Test_Int16" #see https://thin-edge.github.io/thin-edge.io/html/architecture/thin-edge-json.html @@ -33,6 +34,7 @@ signed=false multiplier=1 divisor=1 decimalshiftright=0 +#offset=0 input=false datatype="float" name="Test_Float32" diff --git a/tedge_modbus/operations/c8y_coils.py b/tedge_modbus/operations/c8y_coils.py index 94647ca..d958fde 100644 --- a/tedge_modbus/operations/c8y_coils.py +++ b/tedge_modbus/operations/c8y_coils.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """Cumulocity IoT c8y_Coils operation handler""" + from .context import Context diff --git a/tedge_modbus/operations/c8y_modbus_configuration.py b/tedge_modbus/operations/c8y_modbus_configuration.py index 900b1f7..06522ae 100644 --- a/tedge_modbus/operations/c8y_modbus_configuration.py +++ b/tedge_modbus/operations/c8y_modbus_configuration.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """Cumulocity ModbusConfiguration operation handler""" + import json import logging import toml diff --git a/tedge_modbus/operations/c8y_modbus_device.py b/tedge_modbus/operations/c8y_modbus_device.py index bca503f..1422502 100644 --- a/tedge_modbus/operations/c8y_modbus_device.py +++ b/tedge_modbus/operations/c8y_modbus_device.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """Cumulocity Modbus device operation handler""" + import logging from dataclasses import dataclass import json diff --git a/tedge_modbus/operations/c8y_registers.py b/tedge_modbus/operations/c8y_registers.py index b99f0ec..fd99a69 100644 --- a/tedge_modbus/operations/c8y_registers.py +++ b/tedge_modbus/operations/c8y_registers.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """Cumulocity IoT c8y_Registers operation handler""" + from .context import Context diff --git a/tedge_modbus/operations/c8y_serial_configuration.py b/tedge_modbus/operations/c8y_serial_configuration.py index 0f94ced..76814bd 100644 --- a/tedge_modbus/operations/c8y_serial_configuration.py +++ b/tedge_modbus/operations/c8y_serial_configuration.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """Cumulocity SerialConfiguration operation handler""" + import json import logging import toml diff --git a/tedge_modbus/reader/mapper.py b/tedge_modbus/reader/mapper.py index 5e10da3..32ecd7c 100644 --- a/tedge_modbus/reader/mapper.py +++ b/tedge_modbus/reader/mapper.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """Modbus mapper""" + import json import struct import sys @@ -136,7 +137,7 @@ def map_register( * (register_def.get("multiplier") or 1) * (10 ** (register_def.get("decimalshiftright") or 0)) / (register_def.get("divisor") or 1) - ) + ) + (register_def.get("offset") or 0) on_change = register_def.get("on_change", False) diff --git a/tedge_modbus/reader/reader.py b/tedge_modbus/reader/reader.py index 0157fb6..d4b0253 100644 --- a/tedge_modbus/reader/reader.py +++ b/tedge_modbus/reader/reader.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """Modbus reader""" + import argparse import json import logging @@ -20,7 +21,6 @@ from .mapper import MappedMessage, ModbusMapper from ..operations import set_coil, set_register - DEFAULT_FILE_DIR = "/etc/tedge/plugins/modbus" BASE_CONFIG_NAME = "modbus.toml" DEVICES_CONFIG_NAME = "devices.toml" diff --git a/tests/unit/test_mapper.py b/tests/unit/test_mapper.py index 23da9c0..266c314 100644 --- a/tests/unit/test_mapper.py +++ b/tests/unit/test_mapper.py @@ -340,3 +340,86 @@ def test_event_mapping(self): self.assertEqual(len(messages2), 1) event_data2 = json.loads(messages2[0].data) self.assertEqual(event_data2["text"], "This event tests the event mapping") + + def test_value_scaling_combined(self): + register_def = { + "number": 100, + "startbit": 0, + "nobits": 16, + "multiplier": 3, + "divisor": 4, + "decimalshiftright": 1, + "offset": -20, + "signed": False, + "measurementmapping": {"templatestring": '{"temp": %%}'}, + } + + messages, _ = self.mapper.map_register( + read_register=[20], register_def=register_def + ) + data = json.loads(messages[0].data) + self.assertAlmostEqual(data["temp"], 130.0) + + def test_value_scaling_multiplier(self): + register_def = { + "number": 100, + "startbit": 0, + "nobits": 16, + "multiplier": 3, + "signed": False, + "measurementmapping": {"templatestring": '{"temp": %%}'}, + } + + messages, _ = self.mapper.map_register( + read_register=[20], register_def=register_def + ) + data = json.loads(messages[0].data) + self.assertAlmostEqual(data["temp"], 60.0) + + def test_value_scaling_divisor(self): + register_def = { + "number": 100, + "startbit": 0, + "nobits": 16, + "divisor": 4, + "signed": False, + "measurementmapping": {"templatestring": '{"temp": %%}'}, + } + + messages, _ = self.mapper.map_register( + read_register=[20], register_def=register_def + ) + data = json.loads(messages[0].data) + self.assertAlmostEqual(data["temp"], 5.0) + + def test_value_scaling_decimalshiftright(self): + register_def = { + "number": 100, + "startbit": 0, + "nobits": 16, + "decimalshiftright": 2, + "signed": False, + "measurementmapping": {"templatestring": '{"temp": %%}'}, + } + + messages, _ = self.mapper.map_register( + read_register=[20], register_def=register_def + ) + data = json.loads(messages[0].data) + self.assertAlmostEqual(data["temp"], 2000.0) + + def test_value_scaling_offset(self): + register_def = { + "number": 100, + "startbit": 0, + "nobits": 16, + "offset": 10, + "signed": False, + "measurementmapping": {"templatestring": '{"temp": %%}'}, + } + + messages, _ = self.mapper.map_register( + read_register=[50], register_def=register_def + ) + data = json.loads(messages[0].data) + self.assertAlmostEqual(data["temp"], 60.0)