Skip to content

Commit fe24881

Browse files
committed
Feature release 2023.10.4-2
1 parent dfbaa26 commit fe24881

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

modbus2mqtt.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,7 @@ def on_connect(self, client, userdata, flags, rc):
6969
log.error(flags)
7070

7171
def on_message(self, client, userdata, message):
72-
log.debug("message received '", str(message.payload.decode("utf-8")),
73-
"' via topic '", message.topic, "' (retained=", message.retain, ").")
74-
75-
subscriber = self.subscribers.get(message.topic, None)
72+
subscriber = self.subscribers.get(message.topic.lower(), None)
7673
if subscriber is not None:
7774
data = None
7875
try:
@@ -99,17 +96,19 @@ def publish(self, topic: str, value: str):
9996
def rpc_subscribe(self, src):
10097
t = src.topic_prefix
10198
if self.topic_prefix is not None:
102-
t = self.topic_prefix + '/' + t + '/rpc'
103-
self.subscribers[t] = src
104-
self.client.subscribe(t, 0)
99+
t = self.topic_prefix + '/' + t
100+
self.subscribers[t.lower() + '/rpc'] = src
101+
log.info(f"Subscribing to rpc topic {t}/rpc.")
102+
self.client.subscribe(t + '/rpc', 0)
105103

106104
def rpc_unsubscribe(self, src):
107105
t = src.topic_prefix
108106
if self.topic_prefix is not None:
109-
t = self.topic_prefix + '/' + t + '/rpc'
110-
if self.subscribers.get(t, None) is not None:
111-
self.client.unsubscribe(t)
112-
del self.subscribers[t]
107+
t = self.topic_prefix + '/' + t
108+
if self.subscribers.get(t.lower() + '/rpc', None) is not None:
109+
log.info(f"Unsubscribing from rpc topic {t}/rpc.")
110+
self.client.unsubscribe(t + '/rpc')
111+
del self.subscribers[t.lower() + '/rpc']
113112

114113

115114
class Register:
@@ -206,21 +205,24 @@ def set_value(self, src, params):
206205
for c in self.coils:
207206
name = re.sub(r'/\s\s+/g', '_', str(c["name"]).strip())
208207
if cname == name or cname == str(c["name"]):
209-
if 'w' in c["mode"]:
208+
if 'w' not in c["mode"]:
210209
# Can't write to this coil
210+
log.info("Could not write becaue coil mode is set to read-only.")
211211
return False
212212
coil = c
213213
break
214214

215215
if coil is None:
216216
return False
217217

218-
if value == c["on_value"] or bool(value):
218+
if value == c["on_value"] or (not isinstance(value, str) and bool(value) is True):
219219
value = True
220220
else:
221221
value = False
222222

223-
rr = src.client.write_coil(self.start + int(coil["bit"]), value, slave=unitid)
223+
addr = self.start + int(coil["bit"]) - 1
224+
log.debug(f"Writing coil at address {addr} with value {value}.")
225+
rr = src.client.write_coil(addr, value, slave=unitid)
224226
if not rr:
225227
raise ModbusException("Received empty modbus respone.")
226228
if rr.isError():
@@ -349,8 +351,8 @@ def poller_thread(self):
349351
if not msg:
350352
continue
351353

352-
name = msg.get("target", "None")
353-
if not name:
354+
name = msg.get("target", None)
355+
if name is None:
354356
continue
355357

356358
# Find the target
@@ -360,6 +362,10 @@ def poller_thread(self):
360362
target = r
361363
break
362364

365+
if target is None:
366+
log.info(f"Could not find rpc message target {name}")
367+
continue
368+
363369
match msg.get("method", "invalid"):
364370

365371
case "set":

0 commit comments

Comments
 (0)