@@ -212,10 +212,14 @@ async def async_refresh_modbus_data(self, _now: Optional[int] = None) -> None:
212
212
if not self ._sensors :
213
213
return
214
214
215
+ if not self ._check_and_reconnect ():
216
+ #if not connected, skip
217
+ return
218
+
215
219
try :
216
220
update_result = self .read_modbus_data ()
217
221
except Exception as e :
218
- _LOGGER .exception ("Error reading modbus data" )
222
+ _LOGGER .exception ("Error reading modbus data" , exc_info = True )
219
223
update_result = False
220
224
221
225
if update_result :
@@ -232,10 +236,27 @@ def close(self):
232
236
with self ._lock :
233
237
self ._client .close ()
234
238
239
+ def _check_and_reconnect (self ):
240
+ if not self ._client .connected :
241
+ _LOGGER .info ("modbus client is not connected, trying to reconnect" )
242
+ return self .connect ()
243
+
244
+ return self ._client .connected
245
+
235
246
def connect (self ):
236
247
"""Connect client."""
248
+ result = False
237
249
with self ._lock :
238
- self ._client .connect ()
250
+ result = self ._client .connect ()
251
+
252
+ if result :
253
+ _LOGGER .info ("successfully connected to %s:%s" ,
254
+ self ._client .comm_params .host , self ._client .comm_params .port )
255
+ else :
256
+ _LOGGER .warning ("not able to connect to %s:%s" ,
257
+ self ._client .comm_params .host , self ._client .comm_params .port )
258
+ return result
259
+
239
260
240
261
@property
241
262
def power_control_enabled (self ):
@@ -305,7 +326,7 @@ def read_modbus_data_meter(self, meter_prefix, start_address):
305
326
return False
306
327
307
328
decoder = BinaryPayloadDecoder .fromRegisters (
308
- meter_data .registers , byteorder = Endian .Big
329
+ meter_data .registers , byteorder = Endian .BIG
309
330
)
310
331
accurrent = decoder .decode_16bit_int ()
311
332
accurrenta = decoder .decode_16bit_int ()
@@ -564,7 +585,7 @@ def read_modbus_data_inverter(self):
564
585
return False
565
586
566
587
decoder = BinaryPayloadDecoder .fromRegisters (
567
- inverter_data .registers , byteorder = Endian .Big
588
+ inverter_data .registers , byteorder = Endian .BIG
568
589
)
569
590
accurrent = decoder .decode_16bit_uint ()
570
591
accurrenta = decoder .decode_16bit_uint ()
@@ -695,7 +716,7 @@ def read_modbus_power_limit(self):
695
716
return True
696
717
697
718
decoder = BinaryPayloadDecoder .fromRegisters (
698
- inverter_data .registers , byteorder = Endian .Big , wordorder = Endian .Little
719
+ inverter_data .registers , byteorder = Endian .BIG , wordorder = Endian .LITTLE
699
720
)
700
721
# 0xF001 - 1 - Active Power Limit
701
722
self .data ["nominal_active_power_limit" ] = decoder .decode_16bit_uint ()
@@ -715,7 +736,7 @@ def read_modbus_data_storage(self):
715
736
)
716
737
if not storage_data .isError ():
717
738
decoder = BinaryPayloadDecoder .fromRegisters (
718
- storage_data .registers , byteorder = Endian .Big , wordorder = Endian .Little
739
+ storage_data .registers , byteorder = Endian .BIG , wordorder = Endian .LITTLE
719
740
)
720
741
721
742
# 0xE000 - 1 - Export control mode
@@ -824,8 +845,8 @@ def read_modbus_data_battery(self, battery_prefix, start_address):
824
845
if not battery_data .isError ():
825
846
decoder = BinaryPayloadDecoder .fromRegisters (
826
847
battery_data .registers ,
827
- byteorder = Endian .Big ,
828
- wordorder = Endian .Little ,
848
+ byteorder = Endian .BIG ,
849
+ wordorder = Endian .LITTLE ,
829
850
)
830
851
831
852
def decode_string (decoder ):
@@ -881,7 +902,7 @@ def decode_string(decoder):
881
902
return False
882
903
883
904
decoder = BinaryPayloadDecoder .fromRegisters (
884
- storage_data .registers , byteorder = Endian .Big , wordorder = Endian .Little
905
+ storage_data .registers , byteorder = Endian .BIG , wordorder = Endian .LITTLE
885
906
)
886
907
887
908
# 0x6C - 2 - avg temp C
0 commit comments