From 22db14bb4cda186d4588cf167cfde24cd39d8c51 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 15 Sep 2024 16:18:27 +0200 Subject: [PATCH] Modbus: always assume RTU for serial devices (#16134) --- meter/mbmd.go | 5 +++-- util/modbus/modbus.go | 2 +- util/modbus/modbus_test.go | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/meter/mbmd.go b/meter/mbmd.go index 29876ea5e..a0497ebc4 100644 --- a/meter/mbmd.go +++ b/meter/mbmd.go @@ -53,8 +53,9 @@ func NewModbusMbmdFromConfig(other map[string]interface{}) (api.Meter, error) { // assume RTU if not set and this is a known RS485 meter model if cc.RTU == nil { - b := modbus.IsRS485(cc.Model) - cc.RTU = &b + if rtu := modbus.IsRS485(cc.Model); rtu { + cc.RTU = &rtu + } } modbus.Lock() diff --git a/util/modbus/modbus.go b/util/modbus/modbus.go index 2448418e9..3514db37d 100644 --- a/util/modbus/modbus.go +++ b/util/modbus/modbus.go @@ -47,7 +47,7 @@ func (s Settings) Protocol() Protocol { switch { case s.UDP: return Udp - case s.RTU != nil && *s.RTU: + case s.Device != "" || s.RTU != nil && *s.RTU: return Rtu default: return Tcp diff --git a/util/modbus/modbus_test.go b/util/modbus/modbus_test.go index 70a18082e..4ee4b0434 100644 --- a/util/modbus/modbus_test.go +++ b/util/modbus/modbus_test.go @@ -3,6 +3,7 @@ package modbus import ( "testing" + "github.com/samber/lo" "github.com/stretchr/testify/require" ) @@ -23,3 +24,20 @@ func TestParsePoint(t *testing.T) { require.Equal(t, tc.ops, ops) } } + +func TestSettingsProtocol(t *testing.T) { + tc := []struct { + Settings + res Protocol + }{ + {Settings{UDP: true}, Udp}, + {Settings{RTU: lo.ToPtr(true)}, Rtu}, + {Settings{Device: "foo"}, Rtu}, + {Settings{URI: "foo"}, Tcp}, + {Settings{}, Tcp}, + } + + for _, tc := range tc { + require.Equal(t, tc.res, tc.Protocol(), tc) + } +}