From b9cb8ea5c40b20ff64e3ac4eca464e5a3dec03b6 Mon Sep 17 00:00:00 2001 From: Michael Arthur Date: Wed, 16 Sep 2026 14:02:18 +1200 Subject: [PATCH 1/2] release 0.7.1 --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 47e8194..2b54f00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "evnex" -version = "0.7.0" +version = "0.7.1" description = "A Python wrapper for the EVNEX Cloud API" authors = [{ name = "Brian Thorne", email = "brian@hardbyte.nz" }] readme = "README.md" diff --git a/uv.lock b/uv.lock index 913bc63..f27945a 100644 --- a/uv.lock +++ b/uv.lock @@ -384,7 +384,7 @@ wheels = [ [[package]] name = "evnex" -version = "0.7.0" +version = "0.7.1" source = { editable = "." } dependencies = [ { name = "boto3" }, From def96df401bb90f4a52a51669518ec8084d4d1fe Mon Sep 17 00:00:00 2001 From: Michael Arthur Date: Wed, 16 Sep 2026 14:15:57 +1200 Subject: [PATCH 2/2] fix timeout issues in home assistant --- evnex/api.py | 6 +++--- examples/get_org_chargepoints.py | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 examples/get_org_chargepoints.py diff --git a/evnex/api.py b/evnex/api.py index e81a44a..de6b93b 100644 --- a/evnex/api.py +++ b/evnex/api.py @@ -120,13 +120,14 @@ def _common_headers(self): "User-Agent": f"python-evnex/{self.version}", } - async def _request(self, method: str, path: str, **kwargs) -> Response: + async def _request(self, method: str, path: str, timeout=30, **kwargs) -> Response: """Single request path: base URL, headers, auth, and 401 recovery.""" return await self.httpx_client.request( method, f"{self._base_url}{path}", headers=self._common_headers, auth=self._httpx_auth, + timeout=timeout, **kwargs, ) @@ -352,7 +353,7 @@ async def get_charge_point_status( @api_retry(ReadTimeout) async def get_charge_point_energy_meter_reading( - self, charge_point_id: str, timeout: float = 30 + self, charge_point_id: str ) -> EvnexChargePointEnergyMeterReadingResponse: """ :param charge_point_id: @@ -361,7 +362,6 @@ async def get_charge_point_energy_meter_reading( r = await self._request( "POST", f"/charge-points/{charge_point_id}/commands/get-energy-meter-reading", - timeout=timeout, ) json_data = await self._check_api_response(r) diff --git a/examples/get_org_chargepoints.py b/examples/get_org_chargepoints.py new file mode 100644 index 0000000..f8cd11a --- /dev/null +++ b/examples/get_org_chargepoints.py @@ -0,0 +1,34 @@ +import asyncio +import os + +from evnex.api import Evnex +from evnex.auth import EvnexAuth + + +async def main(): + auth = EvnexAuth() + await auth.start_authentication( + os.environ["EVNEX_CLIENT_USERNAME"], os.environ["EVNEX_CLIENT_PASSWORD"] + ) + evnex = Evnex(auth=auth) + + user_data = await evnex.get_user_detail() + + print("User:", user_data.name, user_data.email, user_data.id) + + user_data = await evnex.get_org_charge_points(evnex.org_id) + + for chargepoint in user_data: + # print("Global connector statuses") + # status = await evnex.get_org_summary_status(org_id=org.slug) + # print(status) + print(chargepoint.id) + if chargepoint.connectors: + for connector in chargepoint.connectors: + print(connector.connectorType) + print(connector.status) + print(connector.evseId) + + +if __name__ == "__main__": + asyncio.run(main())