Skip to content

Commit de5c698

Browse files
marq24marq24
authored andcommitted
request refresh after 10 sec after data-write
1 parent 0fc16da commit de5c698

2 files changed

Lines changed: 35 additions & 27 deletions

File tree

custom_components/goecharger_api2/__init__.py

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,7 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry):
104104

105105

106106
def check_unload_services(hass: HomeAssistant):
107-
active_integration_configs = hass.config_entries.async_entries(domain=DOMAIN, include_disabled=False,
108-
include_ignore=False)
107+
active_integration_configs = hass.config_entries.async_entries(domain=DOMAIN, include_disabled=False, include_ignore=False)
109108
if active_integration_configs is not None and len(active_integration_configs) > 0:
110109
return False
111110
else:
@@ -214,6 +213,9 @@ async def check_device_registry(hass: HomeAssistant):
214213

215214

216215
class GoeChargerDataUpdateCoordinator(DataUpdateCoordinator):
216+
217+
_debounced_update_task: asyncio.Task | None = None
218+
217219
def __init__(self, hass: HomeAssistant, config_entry):
218220
lang = hass.config.language.lower()
219221
self._hass = hass
@@ -259,6 +261,7 @@ def __init__(self, hass: HomeAssistant, config_entry):
259261
self._CLIENT_COMMUNICATION_ERROR_TS = 0
260262
self._CLIENT_COMMUNICATION_ERROR_COUNT = 0
261263
self._RESTART_TRIGGERED = False
264+
self._debounced_update_task = None
262265
super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=SCAN_INTERVAL)
263266

264267
# Callable[[Event], Any]
@@ -272,6 +275,7 @@ def clear_data(self):
272275
self._CLIENT_COMMUNICATION_ERROR_TS = 0
273276
self._CLIENT_COMMUNICATION_ERROR_COUNT = 0
274277
self._RESTART_TRIGGERED = False
278+
self._debounced_update_task = None
275279

276280
async def trigger_restart_delayed(self) -> None:
277281
# Generate a random sleep time between 5 and 10 minutes (300 and 600 seconds)
@@ -284,6 +288,7 @@ async def trigger_restart_delayed(self) -> None:
284288

285289
async def _async_update_data(self) -> dict:
286290
"""Update data via library."""
291+
_LOGGER.debug(f"_async_update_data(): CALLED")
287292
if self._CLIENT_COMMUNICATION_ERROR_TS + 3600 > time():
288293
_LOGGER.info(f"_async_update_data(): skipping update due to client communication error for the next {3600 - (time() - self._CLIENT_COMMUNICATION_ERROR_TS)} seconds")
289294
return self.data
@@ -333,46 +338,45 @@ async def _async_update_data(self) -> dict:
333338
# ret = await self.bridge.async_write_values(kv_pairs)
334339
# return ret
335340

336-
async def async_write_key(self, key: str, value, entity: Entity = None) -> dict:
337-
"""Update single data"""
338-
result = await self.bridge.write_value_to_key(key, value)
339-
_LOGGER.debug(f"write result: {result}")
341+
def _request_update_in_sec(self, seconds: int):
342+
if self._debounced_update_task is not None and not self._debounced_update_task.done():
343+
self._debounced_update_task.cancel()
344+
self._debounced_update_task = asyncio.create_task(self._debounce_coordinator_update(seconds))
345+
346+
async def _debounce_coordinator_update(self, seconds: int):
347+
await asyncio.sleep(seconds)
348+
if self.bridge is not None:
349+
self.bridge.reset_stored_update_ts()
350+
await self.async_refresh()
340351

352+
def handle_write_resut(self, a_type, value, key, result, entity):
353+
_LOGGER.debug(f"write {a_type} result: {result}")
341354
if key in result:
342355
self.data[key] = result[key]
343356
else:
344-
_LOGGER.error(f"could not write value: '{value}' to: {key} result was: {result}")
345-
346-
if entity is not None:
347-
entity.async_schedule_update_ha_state(force_refresh=True)
357+
_LOGGER.error(f"could not write {a_type} value: '{value}' to: {key} result was: {result}")
348358

359+
do_refresh = True
349360
if self.intg_type == INTG_TYPE.CHARGER.value:
350361
# since we do not force an update when setting PV surplus data, we 'patch' internally our values
351362
if key == Tag.IDS.key:
352363
self.data = self.bridge._versions | self.bridge._states | self.bridge._config
353364
self.async_update_listeners()
365+
do_refresh = False
354366

367+
if do_refresh:
368+
if entity is not None:
369+
entity.async_schedule_update_ha_state(force_refresh=True)
370+
self._request_update_in_sec(10)
371+
372+
async def async_write_key(self, key: str, value, entity: Entity = None) -> dict:
373+
result = await self.bridge.write_value_to_key(key, value)
374+
self.handle_write_resut("single", value, key, result, entity)
355375
return result
356376

357377
async def async_write_multiple_keys(self, attr:dict, key: str, value, entity: Entity = None) -> dict:
358-
"""Update single data"""
359378
result = await self.bridge._write_values_int(attr, key, value)
360-
_LOGGER.debug(f"write multiple result: {result}")
361-
362-
if key in result:
363-
self.data[key] = result[key]
364-
else:
365-
_LOGGER.error(f"could not write multiple value: '{value}' to: {key} result was: {result}")
366-
367-
if entity is not None:
368-
entity.async_schedule_update_ha_state(force_refresh=True)
369-
370-
if self.intg_type == INTG_TYPE.CHARGER.value:
371-
# since we do not force an update when setting PV surplus data, we 'patch' internally our values
372-
if key == Tag.IDS.key:
373-
self.data = self.bridge._versions | self.bridge._states | self.bridge._config
374-
self.async_update_listeners()
375-
379+
self.handle_write_resut("multiple", value, key, result, entity)
376380
return result
377381

378382
async def read_versions(self):

custom_components/goecharger_api2/pygoecharger_ha/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ def clear_data(self):
9999
self._states = {}
100100
self._config = {}
101101

102+
def reset_stored_update_ts(self):
103+
self._LAST_CONFIG_UPDATE_TS = 0
104+
self._LAST_FULL_STATE_UPDATE_TS = 0
105+
102106
async def read_system(self) -> dict:
103107
return await self._read_filtered_data(filters=self._FILTER_SYSTEMS, log_info="read_system")
104108

0 commit comments

Comments
 (0)