From baae8bed94932546ee6b41cd63188e8dc80f6bd7 Mon Sep 17 00:00:00 2001 From: "wilbers.lucas" Date: Fri, 6 Feb 2026 10:36:42 +0100 Subject: [PATCH 1/4] Add offset option for scaling measurement values --- config/devices.toml | 2 ++ tedge_modbus/reader/mapper.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) 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/reader/mapper.py b/tedge_modbus/reader/mapper.py index 5e10da3..49d6ed9 100644 --- a/tedge_modbus/reader/mapper.py +++ b/tedge_modbus/reader/mapper.py @@ -136,7 +136,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) From 0ed05c6066c7c4ce7c67eed92311154a0cc730af Mon Sep 17 00:00:00 2001 From: "wilbers.lucas" Date: Fri, 6 Feb 2026 11:16:55 +0100 Subject: [PATCH 2/4] style: format code --- tedge_modbus/operations/c8y_coils.py | 1 + tedge_modbus/operations/c8y_modbus_configuration.py | 1 + tedge_modbus/operations/c8y_modbus_device.py | 1 + tedge_modbus/operations/c8y_registers.py | 1 + tedge_modbus/operations/c8y_serial_configuration.py | 1 + tedge_modbus/reader/mapper.py | 1 + tedge_modbus/reader/reader.py | 2 +- 7 files changed, 7 insertions(+), 1 deletion(-) 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 49d6ed9..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 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" From f554eee8431c795070896176c816ee57f14524b1 Mon Sep 17 00:00:00 2001 From: "wilbers.lucas" Date: Mon, 9 Feb 2026 15:18:09 +0100 Subject: [PATCH 3/4] Add tests for value scaling --- tests/unit/test_mapper.py | 83 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/tests/unit/test_mapper.py b/tests/unit/test_mapper.py index 23da9c0..8c2d940 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) \ No newline at end of file From 848675bbdea2fa02cd7adce93ef1e3cc3c85d7be Mon Sep 17 00:00:00 2001 From: "wilbers.lucas" Date: Mon, 9 Feb 2026 15:24:22 +0100 Subject: [PATCH 4/4] Formating --- tests/unit/test_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_mapper.py b/tests/unit/test_mapper.py index 8c2d940..266c314 100644 --- a/tests/unit/test_mapper.py +++ b/tests/unit/test_mapper.py @@ -422,4 +422,4 @@ def test_value_scaling_offset(self): read_register=[50], register_def=register_def ) data = json.loads(messages[0].data) - self.assertAlmostEqual(data["temp"], 60.0) \ No newline at end of file + self.assertAlmostEqual(data["temp"], 60.0)