Skip to content

Commit 7b467bf

Browse files
committed
Add retry logic, move mutex
1 parent c7bf808 commit 7b467bf

File tree

2 files changed

+62
-49
lines changed

2 files changed

+62
-49
lines changed

SOFAR-HYD-3PH-AND-G3.json

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
"control": "number",
9696
"value_template": "{{ value_json.battery_config_id | int }}"
9797
},
98-
"refresh": 30
98+
"refresh": 1
9999
},
100100
{
101101
"name": "battery_config_address",
@@ -115,7 +115,7 @@
115115
"control": "number",
116116
"value_template": "{{ value_json.battery_config_address }}"
117117
},
118-
"refresh": 30
118+
"refresh": 1
119119
},
120120
{
121121
"name": "battery_config_protocol",
@@ -155,7 +155,7 @@
155155
],
156156
"control": "select"
157157
},
158-
"refresh": 30
158+
"refresh": 1
159159
},
160160
{
161161
"name": "battery_config_voltage_over",
@@ -177,7 +177,7 @@
177177
"unit_of_measurement": "V",
178178
"value_template": "{{ value_json.battery_config_voltage_over }}"
179179
},
180-
"refresh": 30
180+
"refresh": 1
181181
},
182182
{
183183
"name": "battery_config_voltage_charge",
@@ -199,7 +199,7 @@
199199
"unit_of_measurement": "V",
200200
"value_template": "{{ value_json.battery_config_voltage_charge }}"
201201
},
202-
"refresh": 30
202+
"refresh": 1
203203
},
204204
{
205205
"name": "battery_config_voltage_lack",
@@ -221,7 +221,7 @@
221221
"unit_of_measurement": "V",
222222
"value_template": "{{ value_json.battery_config_voltage_lack }}"
223223
},
224-
"refresh": 30
224+
"refresh": 1
225225
},
226226
{
227227
"name": "battery_config_voltage_discharge_stop",
@@ -243,7 +243,7 @@
243243
"unit_of_measurement": "V",
244244
"value_template": "{{ value_json.battery_config_voltage_discharge_stop }}"
245245
},
246-
"refresh": 30
246+
"refresh": 1
247247
},
248248
{
249249
"name": "battery_config_current_charge_limit",
@@ -265,7 +265,7 @@
265265
"unit_of_measurement": "A",
266266
"value_template": "{{ value_json.battery_config_current_charge_limit }}"
267267
},
268-
"refresh": 30
268+
"refresh": 1
269269
},
270270
{
271271
"name": "battery_config_current_discharge_limit",
@@ -287,7 +287,7 @@
287287
"unit_of_measurement": "A",
288288
"value_template": "{{ value_json.battery_config_current_discharge_limit }}"
289289
},
290-
"refresh": 30
290+
"refresh": 1
291291
},
292292
{
293293
"name": "battery_config_depth_of_discharge",
@@ -310,7 +310,7 @@
310310
"unit_of_measurement": "%",
311311
"value_template": "{{ value_json.battery_config_depth_of_discharge | int }}"
312312
},
313-
"refresh": 30
313+
"refresh": 1
314314
},
315315
{
316316
"name": "battery_config_end_of_discharge",
@@ -329,7 +329,7 @@
329329
"unit_of_measurement": "%",
330330
"value_template": "{{ value_json.battery_config_end_of_discharge }}"
331331
},
332-
"refresh": 30
332+
"refresh": 1
333333
},
334334
{
335335
"name": "battery_config_capacity",
@@ -348,7 +348,7 @@
348348
"unit_of_measurement": "Ah",
349349
"value_template": "{{ value_json.battery_config_capacity }}"
350350
},
351-
"refresh": 30
351+
"refresh": 1
352352
},
353353
{
354354
"name": "battery_config_voltage_nominal",
@@ -370,7 +370,7 @@
370370
"unit_of_measurement": "V",
371371
"value_template": "{{ value_json.battery_config_voltage_nominal }}"
372372
},
373-
"refresh": 30
373+
"refresh": 1
374374
},
375375
{
376376
"name": "battery_config_cell_type",
@@ -398,7 +398,7 @@
398398
"control": "select",
399399
"value_template": "{{ value_json.battery_config_cell_type }}"
400400
},
401-
"refresh": 30
401+
"refresh": 1
402402
},
403403
{
404404
"name": "battery_config_eps_buffer",
@@ -419,7 +419,7 @@
419419
"unit_of_measurement": "%",
420420
"value_template": "{{ value_json.battery_config_eps_buffer }}"
421421
},
422-
"refresh": 30
422+
"refresh": 1
423423
},
424424
{
425425
"name": "battery_config_control",

sofar2mqtt-v2.py

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -440,36 +440,36 @@ def write_register(self, register, value):
440440

441441
def write_registers_with_retry(self, start_register, values):
442442
""" Write values with a retry mechanism """
443-
with self.mutex:
444-
retry = self.write_retry
445-
logging.info(f"Writing {start_register} with {values}")
446-
signed = False
447-
success = False
448-
retries = 0
449-
failed = 0
450-
while retry > 0 and not success:
451-
try:
443+
retry = self.write_retry
444+
logging.info(f"Writing {start_register} with {values}")
445+
signed = False
446+
success = False
447+
retries = 0
448+
failed = 0
449+
while retry > 0 and not success:
450+
try:
451+
with self.mutex:
452452
self.instrument.write_registers(int(start_register,16), values)
453-
except minimalmodbus.NoResponseError:
454-
logging.debug(f"Failed to write_register {start_register} {traceback.format_exc()}")
455-
retry = retry - 1
456-
retries = retries + 1
457-
time.sleep(self.write_retry_delay)
458-
except minimalmodbus.InvalidResponseError:
459-
logging.debug(f"Failed to write_register {start_register} {traceback.format_exc()}")
460-
retry = retry - 1
461-
retries = retries + 1
462-
time.sleep(self.write_retry_delay)
463-
except serial.serialutil.SerialException:
464-
logging.debug(f"Failed to write_register {start_register} {traceback.format_exc()}")
465-
retry = retry - 1
466-
retries = retries + 1
467-
time.sleep(self.write_retry_delay)
468-
success = True
469-
if success:
470-
logging.info('Modbus Write Request: %s successful. Retries: %d', start_register, retries)
471-
else:
472-
logging.error('Modbus Write Request: %s failed. Retry exhausted. Retries: %d', start_register, retries)
453+
except minimalmodbus.NoResponseError:
454+
logging.debug(f"Failed to write_register {start_register} {traceback.format_exc()}")
455+
retry = retry - 1
456+
retries = retries + 1
457+
time.sleep(self.write_retry_delay)
458+
except minimalmodbus.InvalidResponseError:
459+
logging.debug(f"Failed to write_register {start_register} {traceback.format_exc()}")
460+
retry = retry - 1
461+
retries = retries + 1
462+
time.sleep(self.write_retry_delay)
463+
except serial.serialutil.SerialException:
464+
logging.debug(f"Failed to write_register {start_register} {traceback.format_exc()}")
465+
retry = retry - 1
466+
retries = retries + 1
467+
time.sleep(self.write_retry_delay)
468+
success = True
469+
if success:
470+
logging.info('Modbus Write Request: %s successful. Retries: %d', start_register, retries)
471+
else:
472+
logging.error('Modbus Write Request: %s failed. Retry exhausted. Retries: %d', start_register, retries)
473473

474474
def read_register(self, registeraddress, read_type, signed, registers=1):
475475
""" Read value from register with a retry mechanism """
@@ -691,7 +691,7 @@ def convert_value(self, register, value):
691691
return next((k for k, v in register['modes'].items() if v == value), value)
692692
return value
693693

694-
def write_register_block(self, block_name, update_register, value):
694+
def write_register_block(self, block_name, update_register, new_value):
695695
""" Write a specific register block from configuration to Modbus """
696696
block = next((b for b in self.config.get('write_register_blocks', []) if b['name'] == block_name), None)
697697
if not block:
@@ -706,7 +706,7 @@ def write_register_block(self, block_name, update_register, value):
706706
if register_name == update_register:
707707
register = self.get_register(register_name)
708708
if register:
709-
raw_value = self.translate_to_raw_value(register, value)
709+
raw_value = self.translate_to_raw_value(register, new_value)
710710
else:
711711
logging.error(f"Register {register_name} not found in configuration")
712712
continue
@@ -719,13 +719,26 @@ def write_register_block(self, block_name, update_register, value):
719719
if 'append' in block:
720720
for append_item in block['append']:
721721
values.append(append_item)
722-
logging.info(f"Would write {block['start_register']} with {values[:length]}")
722+
#logging.info(f"Would write {block['start_register']} with {values[:length]}")
723723
#logging.info(f"Reference values: {[0, 0, 1, 560, 540, 425, 470, 10000, 10000, 90, 90, 250, 480, 1, 10, 1]}")
724724
# [0, 0, 1, 540, 530, 425, 470, 10000, 10000, 89, 90, 250, 480, 1, 10, 1]
725-
726725
#self.write_registers_with_retry(block['start_register'], [0, 0, 1, 560, 540, 425, 470, 10000, 10000, 90, 90, 250, 480, 1, 10, 1])
727726

728-
self.write_registers_with_retry(block['start_register'], values[:length])
727+
register = self.get_register(update_register)
728+
new_raw_value = self.translate_to_raw_value(register, new_value)
729+
730+
retry = self.write_retry + 10
731+
while retry > 0:
732+
current_raw_value = self.raw_data[update_register]
733+
current_value = self.translate_from_raw_value(register, current_raw_value)
734+
if current_raw_value == new_raw_value:
735+
logging.info(f"Current value for {register['name']}: {current_raw_value} ({current_value}). Matches desired value: {new_raw_value} ({new_value}).")
736+
retry = 0
737+
else:
738+
logging.info(f"Current value for {register['name']}: {current_raw_value} ({current_value}), attempting to set it to: {new_raw_value} ({new_value}). Retries remaining: {retry}")
739+
self.write_registers_with_retry(block['start_register'], values[:length])
740+
time.sleep(self.write_retry_delay)
741+
retry = retry - 1
729742

730743
def get_register(self, register_name):
731744
""" Look up a register from self.config['registers'] """

0 commit comments

Comments
 (0)