mirror of
https://github.com/home-assistant/core.git
synced 2025-07-22 20:57:21 +00:00
Poll Nissan servers for battery updates (#44826)
This commit is contained in:
parent
d1f3c20079
commit
ee52706f03
@ -45,7 +45,7 @@ DEFAULT_CLIMATE_INTERVAL = timedelta(minutes=5)
|
|||||||
RESTRICTED_BATTERY = 2
|
RESTRICTED_BATTERY = 2
|
||||||
RESTRICTED_INTERVAL = timedelta(hours=12)
|
RESTRICTED_INTERVAL = timedelta(hours=12)
|
||||||
|
|
||||||
MAX_RESPONSE_ATTEMPTS = 10
|
MAX_RESPONSE_ATTEMPTS = 3
|
||||||
|
|
||||||
PYCARWINGS2_SLEEP = 30
|
PYCARWINGS2_SLEEP = 30
|
||||||
|
|
||||||
@ -194,6 +194,14 @@ def setup(hass, config):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def _extract_start_date(battery_info):
|
||||||
|
"""Extract the server date from the battery response."""
|
||||||
|
try:
|
||||||
|
return battery_info.answer["BatteryStatusRecords"]["OperationDateAndTime"]
|
||||||
|
except KeyError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class LeafDataStore:
|
class LeafDataStore:
|
||||||
"""Nissan Leaf Data Store."""
|
"""Nissan Leaf Data Store."""
|
||||||
|
|
||||||
@ -324,19 +332,24 @@ class LeafDataStore:
|
|||||||
self.request_in_progress = False
|
self.request_in_progress = False
|
||||||
async_dispatcher_send(self.hass, SIGNAL_UPDATE_LEAF)
|
async_dispatcher_send(self.hass, SIGNAL_UPDATE_LEAF)
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _extract_start_date(battery_info):
|
|
||||||
"""Extract the server date from the battery response."""
|
|
||||||
try:
|
|
||||||
return battery_info.answer["BatteryStatusRecords"]["OperationDateAndTime"]
|
|
||||||
except KeyError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
async def async_get_battery(self):
|
async def async_get_battery(self):
|
||||||
"""Request battery update from Nissan servers."""
|
"""Request battery update from Nissan servers."""
|
||||||
try:
|
try:
|
||||||
# Request battery update from the car
|
# Request battery update from the car
|
||||||
_LOGGER.debug("Requesting battery update, %s", self.leaf.vin)
|
_LOGGER.debug("Requesting battery update, %s", self.leaf.vin)
|
||||||
|
start_date = None
|
||||||
|
try:
|
||||||
|
start_server_info = await self.hass.async_add_executor_job(
|
||||||
|
self.leaf.get_latest_battery_status
|
||||||
|
)
|
||||||
|
except TypeError: # pycarwings2 can fail if Nissan returns nothing
|
||||||
|
_LOGGER.debug("Battery status check returned nothing")
|
||||||
|
else:
|
||||||
|
if not start_server_info:
|
||||||
|
_LOGGER.debug("Battery status check failed")
|
||||||
|
else:
|
||||||
|
start_date = _extract_start_date(start_server_info)
|
||||||
|
await asyncio.sleep(1) # Critical sleep
|
||||||
request = await self.hass.async_add_executor_job(self.leaf.request_update)
|
request = await self.hass.async_add_executor_job(self.leaf.request_update)
|
||||||
if not request:
|
if not request:
|
||||||
_LOGGER.error("Battery update request failed")
|
_LOGGER.error("Battery update request failed")
|
||||||
@ -364,7 +377,19 @@ class LeafDataStore:
|
|||||||
server_info = await self.hass.async_add_executor_job(
|
server_info = await self.hass.async_add_executor_job(
|
||||||
self.leaf.get_latest_battery_status
|
self.leaf.get_latest_battery_status
|
||||||
)
|
)
|
||||||
return server_info
|
if not start_date or (
|
||||||
|
server_info and start_date != _extract_start_date(server_info)
|
||||||
|
):
|
||||||
|
return server_info
|
||||||
|
# get_status_from_update returned {"resultFlag": "1"}
|
||||||
|
# but the data didn't change, make a fresh request.
|
||||||
|
await asyncio.sleep(1) # Critical sleep
|
||||||
|
request = await self.hass.async_add_executor_job(
|
||||||
|
self.leaf.request_update
|
||||||
|
)
|
||||||
|
if not request:
|
||||||
|
_LOGGER.error("Battery update request failed")
|
||||||
|
return None
|
||||||
|
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"%s attempts exceeded return latest data from server",
|
"%s attempts exceeded return latest data from server",
|
||||||
@ -379,7 +404,7 @@ class LeafDataStore:
|
|||||||
except CarwingsError:
|
except CarwingsError:
|
||||||
_LOGGER.error("An error occurred getting battery status")
|
_LOGGER.error("An error occurred getting battery status")
|
||||||
return None
|
return None
|
||||||
except KeyError:
|
except (KeyError, TypeError):
|
||||||
_LOGGER.error("An error occurred parsing response from server")
|
_LOGGER.error("An error occurred parsing response from server")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user