Catch missing/unavailable response from modbus (#49632)

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
jan iversen 2021-04-29 15:59:17 +02:00 committed by GitHub
parent 02764c2f46
commit 5b6d2edb48
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 6 deletions

View file

@ -620,6 +620,7 @@ omit =
homeassistant/components/mochad/* homeassistant/components/mochad/*
homeassistant/components/modbus/climate.py homeassistant/components/modbus/climate.py
homeassistant/components/modbus/cover.py homeassistant/components/modbus/cover.py
homeassistant/components/modbus/modbus.py
homeassistant/components/modbus/switch.py homeassistant/components/modbus/switch.py
homeassistant/components/modem_callerid/sensor.py homeassistant/components/modem_callerid/sensor.py
homeassistant/components/motion_blinds/__init__.py homeassistant/components/motion_blinds/__init__.py

View file

@ -5,6 +5,7 @@ import threading
from pymodbus.client.sync import ModbusSerialClient, ModbusTcpClient, ModbusUdpClient from pymodbus.client.sync import ModbusSerialClient, ModbusTcpClient, ModbusUdpClient
from pymodbus.constants import Defaults from pymodbus.constants import Defaults
from pymodbus.exceptions import ModbusException from pymodbus.exceptions import ModbusException
from pymodbus.pdu import ExceptionResponse, IllegalFunctionRequest
from pymodbus.transaction import ModbusRtuFramer from pymodbus.transaction import ModbusRtuFramer
from homeassistant.const import ( from homeassistant.const import (
@ -161,10 +162,11 @@ class ModbusHub:
return self._config_name return self._config_name
def _log_error(self, exception_error: ModbusException, error_state=True): def _log_error(self, exception_error: ModbusException, error_state=True):
log_text = "Pymodbus: " + str(exception_error)
if self._in_error: if self._in_error:
_LOGGER.debug(str(exception_error)) _LOGGER.debug(log_text)
else: else:
_LOGGER.error(str(exception_error)) _LOGGER.error(log_text)
self._in_error = error_state self._in_error = error_state
def setup(self): def setup(self):
@ -236,6 +238,9 @@ class ModbusHub:
except ModbusException as exception_error: except ModbusException as exception_error:
self._log_error(exception_error) self._log_error(exception_error)
return None return None
if isinstance(result, (ExceptionResponse, IllegalFunctionRequest)):
self._log_error(result)
return None
self._in_error = False self._in_error = False
return result return result
@ -248,6 +253,9 @@ class ModbusHub:
except ModbusException as exception_error: except ModbusException as exception_error:
self._log_error(exception_error) self._log_error(exception_error)
return None return None
if isinstance(result, (ExceptionResponse, IllegalFunctionRequest)):
self._log_error(result)
return None
self._in_error = False self._in_error = False
return result return result
@ -260,6 +268,9 @@ class ModbusHub:
except ModbusException as exception_error: except ModbusException as exception_error:
self._log_error(exception_error) self._log_error(exception_error)
return None return None
if isinstance(result, (ExceptionResponse, IllegalFunctionRequest)):
self._log_error(result)
return None
self._in_error = False self._in_error = False
return result return result
@ -272,6 +283,9 @@ class ModbusHub:
except ModbusException as exception_error: except ModbusException as exception_error:
self._log_error(exception_error) self._log_error(exception_error)
return None return None
if isinstance(result, (ExceptionResponse, IllegalFunctionRequest)):
self._log_error(result)
return None
self._in_error = False self._in_error = False
return result return result
@ -280,10 +294,13 @@ class ModbusHub:
with self._lock: with self._lock:
kwargs = {"unit": unit} if unit else {} kwargs = {"unit": unit} if unit else {}
try: try:
self._client.write_coil(address, value, **kwargs) result = self._client.write_coil(address, value, **kwargs)
except ModbusException as exception_error: except ModbusException as exception_error:
self._log_error(exception_error) self._log_error(exception_error)
return False return False
if isinstance(result, (ExceptionResponse, IllegalFunctionRequest)):
self._log_error(result)
return False
self._in_error = False self._in_error = False
return True return True
@ -292,10 +309,13 @@ class ModbusHub:
with self._lock: with self._lock:
kwargs = {"unit": unit} if unit else {} kwargs = {"unit": unit} if unit else {}
try: try:
self._client.write_coils(address, values, **kwargs) result = self._client.write_coils(address, values, **kwargs)
except ModbusException as exception_error: except ModbusException as exception_error:
self._log_error(exception_error) self._log_error(exception_error)
return False return False
if isinstance(result, (ExceptionResponse, IllegalFunctionRequest)):
self._log_error(result)
return False
self._in_error = False self._in_error = False
return True return True
@ -304,10 +324,13 @@ class ModbusHub:
with self._lock: with self._lock:
kwargs = {"unit": unit} if unit else {} kwargs = {"unit": unit} if unit else {}
try: try:
self._client.write_register(address, value, **kwargs) result = self._client.write_register(address, value, **kwargs)
except ModbusException as exception_error: except ModbusException as exception_error:
self._log_error(exception_error) self._log_error(exception_error)
return False return False
if isinstance(result, (ExceptionResponse, IllegalFunctionRequest)):
self._log_error(result)
return False
self._in_error = False self._in_error = False
return True return True
@ -316,9 +339,12 @@ class ModbusHub:
with self._lock: with self._lock:
kwargs = {"unit": unit} if unit else {} kwargs = {"unit": unit} if unit else {}
try: try:
self._client.write_registers(address, values, **kwargs) result = self._client.write_registers(address, values, **kwargs)
except ModbusException as exception_error: except ModbusException as exception_error:
self._log_error(exception_error) self._log_error(exception_error)
return False return False
if isinstance(result, (ExceptionResponse, IllegalFunctionRequest)):
self._log_error(result)
return False
self._in_error = False self._in_error = False
return True return True