Skip to content

Commit 822133f

Browse files
authored
Merge pull request #77 from jwillemsen/jwi-ratelimitrepair
Check and use ratelimit-reset and retry-after from the reply header
2 parents c014bc1 + 6df8324 commit 822133f

File tree

2 files changed

+10
-12
lines changed

2 files changed

+10
-12
lines changed

custom_components/daikin_onecta/coordinator.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,19 @@ def update_settings(self, config_entry: ConfigEntry):
7070

7171
def determine_update_interval(self, hass: HomeAssistant):
7272
# Default of low scan minutes interval
73-
scan_interval = self.options.get("low_scan_interval", 30)
73+
scan_interval = self.options.get("low_scan_interval", 30) * 60
7474
hs = datetime.strptime(self.options.get("high_scan_start", "07:00:00"), "%H:%M:%S").time()
7575
ls = datetime.strptime(self.options.get("low_scan_start", "22:00:00"), "%H:%M:%S").time()
7676
if self.in_between(datetime.now().time(), hs, ls):
77-
scan_interval = self.options.get("high_scan_interval", 10)
77+
scan_interval = self.options.get("high_scan_interval", 10) * 60
7878

79-
# When we hit our daily rate limit we skip the next update because any call which results
80-
# again in just a rate limit error back is counted as call for the limit of next day
79+
# When we hit our daily rate limit we check the retry_after which is the amount of seconds
80+
# we have to wait before we can make a call again
8181
daikin_api = hass.data[DOMAIN][DAIKIN_API]
8282
if daikin_api.rate_limits["remaining_day"] == 0:
83-
scan_interval *= 2
83+
scan_interval = max(daikin_api.rate_limits["retry_after"] + 60, scan_interval)
8484

85-
return timedelta(minutes=scan_interval)
85+
return timedelta(seconds=scan_interval)
8686

8787
def in_between(self, now, start, end):
8888
if start <= end:

custom_components/daikin_onecta/daikin_api.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,7 @@ def __init__(
4040
self._last_patch_call = datetime.min
4141

4242
# Store the limits as member so that we can add these to the diagnostics
43-
self.rate_limits = {
44-
"minute": 0,
45-
"day": 0,
46-
"remaining_minutes": 0,
47-
"remaining_day": 0,
48-
}
43+
self.rate_limits = {"minute": 0, "day": 0, "remaining_minutes": 0, "remaining_day": 0, "retry_after": 0, "ratelimit_reset": 0}
4944

5045
# The following lock is used to serialize http requests to Daikin cloud
5146
# to prevent receiving old settings while a PATCH is ongoing.
@@ -89,6 +84,9 @@ async def doBearerRequest(self, resourceUrl, options=None):
8984
self.rate_limits["day"] = int(res.headers.get("X-RateLimit-Limit-day", 0))
9085
self.rate_limits["remaining_minutes"] = int(res.headers.get("X-RateLimit-Remaining-minute", 0))
9186
self.rate_limits["remaining_day"] = int(res.headers.get("X-RateLimit-Remaining-day", 0))
87+
self.rate_limits["remaining_minutes"] = int(res.headers.get("X-RateLimit-Remaining-minute", 0))
88+
self.rate_limits["retry_after"] = int(res.headers.get("retry-after", 0))
89+
self.rate_limits["ratelimit_reset"] = int(res.headers.get("ratelimit-reset", 0))
9290

9391
if self.rate_limits["remaining_minutes"] > 0:
9492
ir.async_delete_issue(self.hass, DOMAIN, "minute_rate_limit")

0 commit comments

Comments
 (0)