@@ -104,8 +104,7 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry):
104104
105105
106106def 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
216215class 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 ):
0 commit comments