iMicknl/python-overkiz-api

Frequently updating device states

Closed this issue · 3 comments

I wrote an overkiz2mqtt script and noticed that the device states are refreshed once every 10 minutes. The Overkiz server allows me to call get_state() every minute but the data is only actually different after 10 minutes. I am mostly interested in io:MiddleWaterTemperatureState from my io:AtlanticDomesticHotWaterProductionV2_CV4E_IOComponent so I tried calling client.execute_command(device.device_url, "refreshMiddleWaterTemperature") which works but seems rate limited. After calling it about 50 times in one session I get:

TooManyRequestsException while executing refreshMiddleWaterTemperature: Too many requests, try again later

Restarting the session after this works but it feels like a hack (and a violation). I was hoping that the fetch_events() would help but this only gives me io:MiddleWaterTemperatureState after I issue a refreshMiddleWaterTemperature command. So even the 10 minute updates are missed using fetch_events().

What is the supported way of retrieving near-real-time state information from Overkiz?

Hi, this repository is not supported by Somfy. The goal of pyoverkiz is to wrap the Overkiz API.
You can have a try on https://github.com/Somfy-Developer/Somfy-TaHoma-Developer-Mode

As a side note, I can confirm that some devices are really painful to understand.

I know this repo is not official code by Somfy. I am just trying to understand how to best use the API.

I did some more experimenting and it seems TooManyRequestsException is a temporary issue on the Overkiz server end that resolves itself after a while. This is probably the reason this repo is using @backoff for all API calls. When max_tries is exceeded and TooManyRequestsException is thrown anyway, trying again a few minutes later works just fine. Which I guess means max_tries=10 it too low for the "atlantic_cozytouch" server these past few days.

@backoff.on_exception(backoff.expo, TooManyExecutionsException, max_tries=10)
@backoff.on_exception(
backoff.expo, NotAuthenticatedException, max_tries=2, on_backoff=relogin
)
async def execute_command(

My previous comment is wrong. TooManyRequestsException is fatal: the server will refuse the API call that receives this as a response for the duration of the session. The only solution is to start a new session (which feels like a hack to bypass rate limiting). Now I understand why this project uses @backoff for TooManyExecutionsException but not for TooManyRequestsException.

I experimentally confirmed that for refreshMiddleWaterTemperature the limit appears to be 50 command executions. It does not matter if I wait 1, 2 or 3 minutes between the calls. Number 51 simply is never allowed in the same session.