@@ 81,6 81,10 @@ class EH800:
self._client = AsyncClient()
+ self._request_query = "request?"
+ for value in VALUES:
+ self._request_query += f"{value.register};"
+
self.data = {}
async def _refresh_login(self) -> bool:
@@ 97,12 101,30 @@ class EH800:
_LOGGER.error("Login error")
return False
- async def _request_value(self, register) -> str:
- """Request a value from the API."""
- r = await self._client.get(f"{self._uri}/request?{register}")
- eq_index = r.text.find("=")
- sc_index = r.text.find(";")
- return r.text[eq_index + 1 : sc_index]
+ async def _request_values(self) -> bool:
+ """
+ Request values from the API.
+ """
+ r = await self._client.get(f"{self._uri}/{self._request_query}")
+ if r.status_code != 200:
+ _LOGGER.error("unexpected return code %s", r.status_code)
+ return False
+
+ # Remove suffix and prefix so we end up with key=val pairs separated by
+ # semicolons: key=val;key2=val;key3=val
+ text = r.text.removeprefix("request?").removesuffix("\x00").removesuffix(";")
+ pairs = text.split(";")
+ for pair in pairs:
+ kv = pair.split("=")
+ # Only process those that returned something
+ if len(kv) == 2:
+ # Find the data key for the register
+ data_key = [value.key for value in VALUES if value.register == kv[0]][0]
+ self.data[data_key] = kv[1]
+ else:
+ _LOGGER.warning("register %s didn't return a value", str(kv[0]))
+
+ return True
async def _update_value(self, value: Value, new_value) -> None:
"""
@@ 127,8 149,8 @@ class EH800:
if not await self._refresh_login():
return False
- for value in VALUES:
- self.data[value.key] = await self._request_value(value.register)
+ if not await self._request_values():
+ return False
return True