Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions config/devices.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -33,6 +34,7 @@ signed=false
multiplier=1
divisor=1
decimalshiftright=0
#offset=0
input=false
datatype="float"
name="Test_Float32"
Expand Down
1 change: 1 addition & 0 deletions tedge_modbus/operations/c8y_coils.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
"""Cumulocity IoT c8y_Coils operation handler"""

from .context import Context


Expand Down
1 change: 1 addition & 0 deletions tedge_modbus/operations/c8y_modbus_configuration.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
"""Cumulocity ModbusConfiguration operation handler"""

import json
import logging
import toml
Expand Down
1 change: 1 addition & 0 deletions tedge_modbus/operations/c8y_modbus_device.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
"""Cumulocity Modbus device operation handler"""

import logging
from dataclasses import dataclass
import json
Expand Down
1 change: 1 addition & 0 deletions tedge_modbus/operations/c8y_registers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
"""Cumulocity IoT c8y_Registers operation handler"""

from .context import Context


Expand Down
1 change: 1 addition & 0 deletions tedge_modbus/operations/c8y_serial_configuration.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
"""Cumulocity SerialConfiguration operation handler"""

import json
import logging
import toml
Expand Down
3 changes: 2 additions & 1 deletion tedge_modbus/reader/mapper.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
"""Modbus mapper"""

import json
import struct
import sys
Expand Down Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion tedge_modbus/reader/reader.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
"""Modbus reader"""

import argparse
import json
import logging
Expand All @@ -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"
Expand Down
83 changes: 83 additions & 0 deletions tests/unit/test_mapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)