11
11
12
12
import serial
13
13
from homeassistant .core import HomeAssistant
14
- from pymodbus .client import ModbusSerialClient
15
- from pymodbus .client import ModbusUdpClient
16
- from pymodbus .framer import FramerType
17
- from pymodbus .pdu import ModbusPDU
18
- from pymodbus .pdu .register_read_message import ReadHoldingRegistersResponse
19
- from pymodbus .pdu .register_read_message import ReadInputRegistersResponse
20
- from pymodbus .pdu .register_write_message import WriteMultipleRegistersResponse
21
- from pymodbus .pdu .register_write_message import WriteSingleRegisterResponse
22
14
23
15
from .. import client
24
16
from ..common .types import ConnectionType
28
20
from ..const import TCP
29
21
from ..const import UDP
30
22
from ..inverter_adapters import InverterAdapter
23
+ from ..vendor .pymodbus import ModbusResponse
24
+ from ..vendor .pymodbus import ModbusRtuFramer
25
+ from ..vendor .pymodbus import ModbusSerialClient
26
+ from ..vendor .pymodbus import ModbusSocketFramer
27
+ from ..vendor .pymodbus import ModbusUdpClient
28
+ from ..vendor .pymodbus import ReadHoldingRegistersResponse
29
+ from ..vendor .pymodbus import ReadInputRegistersResponse
30
+ from ..vendor .pymodbus import WriteMultipleRegistersResponse
31
+ from ..vendor .pymodbus import WriteSingleRegisterResponse
31
32
from .custom_modbus_tcp_client import CustomModbusTcpClient
32
33
33
34
_LOGGER = logging .getLogger (__name__ )
38
39
_CLIENTS : dict [str , dict [str , Any ]] = {
39
40
SERIAL : {
40
41
"client" : ModbusSerialClient ,
41
- "framer" : FramerType . RTU ,
42
+ "framer" : ModbusRtuFramer ,
42
43
},
43
44
TCP : {
44
45
"client" : CustomModbusTcpClient ,
45
- "framer" : FramerType . SOCKET ,
46
+ "framer" : ModbusSocketFramer ,
46
47
},
47
48
UDP : {
48
49
"client" : ModbusUdpClient ,
49
- "framer" : FramerType . SOCKET ,
50
+ "framer" : ModbusSocketFramer ,
50
51
},
51
52
RTU_OVER_TCP : {
52
53
"client" : CustomModbusTcpClient ,
53
- "framer" : FramerType . RTU ,
54
+ "framer" : ModbusRtuFramer ,
54
55
},
55
56
}
56
57
@@ -69,16 +70,14 @@ def __init__(self, hass: HomeAssistant, protocol: str, adapter: InverterAdapter,
69
70
70
71
client = _CLIENTS [protocol ]
71
72
73
+ # Delaying for a second after establishing a connection seems to help the inverter stability,
74
+ # see https://github.com/nathanmarlor/foxess_modbus/discussions/132
72
75
config = {
73
76
** config ,
74
77
"framer" : client ["framer" ],
78
+ "delay_on_connect" : 1 if adapter .connection_type == ConnectionType .LAN else None ,
75
79
}
76
80
77
- # Delaying for a second after establishing a connection seems to help the inverter stability,
78
- # see https://github.com/nathanmarlor/foxess_modbus/discussions/132
79
- if adapter .connection_type == ConnectionType .LAN :
80
- config ["delay_on_connect" ] = 1
81
-
82
81
# If our custom PosixPollSerial hack is supported, use that. This uses poll rather than select, which means we
83
82
# don't break when there are more than 1024 fds. See #457.
84
83
# Only supported on posix, see https://github.com/pyserial/pyserial/blob/7aeea35429d15f3eefed10bbb659674638903e3a/serial/__init__.py#L31
@@ -225,7 +224,7 @@ def __str__(self) -> str:
225
224
class ModbusClientFailedError (Exception ):
226
225
"""Raised when the ModbusClient fails to read/write"""
227
226
228
- def __init__ (self , message : str , client : ModbusClient , response : ModbusPDU | Exception ) -> None :
227
+ def __init__ (self , message : str , client : ModbusClient , response : ModbusResponse | Exception ) -> None :
229
228
super ().__init__ (f"{ message } from { client } : { response } " )
230
229
self .message = message
231
230
self .client = client
0 commit comments