diff --git a/pyproject.toml b/pyproject.toml index b5af503..87cec2d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ repository = "https://github.com/puddly/serialx" documentation = "https://puddly.github.io/serialx/" [project.optional-dependencies] -esphome = ["aioesphomeapi>=46.12.0; python_version >= '3.11'"] +esphome = ["aioesphomeapi>=46.21.0; python_version >= '3.11'"] [dependency-groups] dev = [ @@ -49,7 +49,7 @@ dev = [ "types-pywin32>=311.0.0.20260508", "types-setuptools>=82.0.0.20260508", "setuptools-rust>=1.7.0", - "aioesphomeapi>=46.12.0 ; python_version >= '3.11'", + "aioesphomeapi>=46.21.0 ; python_version >= '3.11'", ] docs = [ "sphinx>=7,<8.2.3; python_version < '3.11'", diff --git a/serialx/platforms/serial_esphome.py b/serialx/platforms/serial_esphome.py index f13c6cb..400458b 100644 --- a/serialx/platforms/serial_esphome.py +++ b/serialx/platforms/serial_esphome.py @@ -39,8 +39,15 @@ from aioesphomeapi.client import MIN_VERSION_PROXY_ACK, APIClient from aioesphomeapi.core import ( # type: ignore[attr-defined] APIConnectionError, + ConnectionNotEstablishedAPIError, + HandshakeAPIError, + PingFailedAPIError, PingRequest, PingResponse, + ReadFailedAPIError, + ResolveAPIError, + ResolveTimeoutAPIError, + SocketAPIError, TimeoutAPIError, ) from aioesphomeapi.model import ( @@ -212,9 +219,27 @@ def translate_esphome_errors( async def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _T: try: return await func(*args, **kwargs) - except TimeoutAPIError as exc: + except (TimeoutAPIError, ResolveTimeoutAPIError) as exc: raise TimeoutError(str(exc)) from exc + except ( + ConnectionNotEstablishedAPIError, + SocketAPIError, + ResolveAPIError, + ReadFailedAPIError, + PingFailedAPIError, + ) as exc: + raise ConnectionError(str(exc)) from exc except APIConnectionError as exc: + # A clean disconnect (device reboot, `api.disconnect()`) fails pending + # requests with the bare base class. + if type(exc) is APIConnectionError: + raise ConnectionError(str(exc)) from exc + + # A socket error mid-handshake is wrapped in the bare `HandshakeAPIError`, + # unlike its subclasses, which report encryption misconfiguration. + if type(exc) is HandshakeAPIError and isinstance(exc.__cause__, OSError): + raise ConnectionError(str(exc)) from exc + raise SerialException(str(exc)) from exc return cast(Callable[_P, Coroutine[Any, Any, _T]], wrapper) @@ -1215,7 +1240,7 @@ async def _connect( # Nothing is replayed for a connection that closed while we were setting # up, so the state has to be re-checked once the callback is installed. if not self._serial._api.is_connected: - raise SerialException("ESPHome API connection closed while connecting") + raise ConnectionError("ESPHome API connection closed while connecting") await self._serial._async_configure_port() diff --git a/tests/test_serial_esphome.py b/tests/test_serial_esphome.py index 45b2dae..87d77de 100644 --- a/tests/test_serial_esphome.py +++ b/tests/test_serial_esphome.py @@ -20,6 +20,25 @@ import urllib.parse import warnings +from aioesphomeapi.core import ( + APIConnectionError, + BadMACAddressAPIError, + BadNameAPIError, + ConnectionNotEstablishedAPIError, + EncryptionHelloAPIError, + HandshakeAPIError, + InvalidAuthAPIError, + InvalidEncryptionKeyAPIError, + PingFailedAPIError, + ProtocolAPIError, + ReadFailedAPIError, + RequiresEncryptionAPIError, + ResolveAPIError, + ResolveTimeoutAPIError, + SocketAPIError, + SocketClosedAPIError, + TimeoutAPIError, +) from aioesphomeapi.model import ( APIVersion, DeviceInfo, @@ -44,6 +63,7 @@ async_serial_for_url, create_serial_connection, list_serial_ports, + open_serial_connection, redact_uri, udev_serial_by_id_stem, ) @@ -341,6 +361,131 @@ async def test_connect_timeout_raises_timeout_error() -> None: pass +@pytest.mark.parametrize("connection_exists", [False, True]) +async def test_open_disconnected_api_raises_connection_error( + connection_exists: bool, +) -> None: + """An offline externally managed API is an I/O failure callers can retry.""" + api = APIClient(address="127.0.0.1", port=ESPHOME_DEFAULT_PORT, password=None) + if connection_exists: + await api.start_resolve_host(log_errors=False) + + with pytest.raises( + ConnectionError, match="Not connected|Authenticated connection not ready" + ) as exc_info: + await open_serial_connection( + url=None, + transport_cls=ESPHomeSerialTransport, + api=api, + port_name="test", + baudrate=115200, + ) + + assert isinstance(exc_info.value.__cause__, ConnectionNotEstablishedAPIError) + assert not api.is_connected + + +@pytest.mark.parametrize( + ("error", "expected_type"), + [ + (APIConnectionError("Connection closed"), ConnectionError), + (ConnectionNotEstablishedAPIError("Not ready"), ConnectionError), + (SocketAPIError("Connection refused"), ConnectionError), + (SocketClosedAPIError("Connection closed"), ConnectionError), + (ResolveAPIError("Host unavailable"), ConnectionError), + (ReadFailedAPIError("Read failed"), ConnectionError), + (PingFailedAPIError("Ping failed"), ConnectionError), + (TimeoutAPIError("Connect timed out"), TimeoutError), + (ResolveTimeoutAPIError("Resolve timed out"), TimeoutError), + (InvalidAuthAPIError("Invalid password"), SerialException), + (InvalidEncryptionKeyAPIError("Invalid key"), SerialException), + (HandshakeAPIError("Invalid handshake"), SerialException), + (ProtocolAPIError("Invalid protocol"), SerialException), + (RequiresEncryptionAPIError("Encryption required"), SerialException), + (BadNameAPIError("Wrong device", "other-device"), SerialException), + ( + BadMACAddressAPIError("Wrong device", "other-device", "00:11:22:33:44:55"), + SerialException, + ), + ], +) +async def test_open_api_error_classification( + error: APIConnectionError, expected_type: type[Exception] +) -> None: + """Opening preserves the distinction between transport and protocol failures.""" + with patch.object(APIClient, "connect", side_effect=error): + with pytest.raises(expected_type) as exc_info: + await open_serial_connection( + url="esphome://127.0.0.1:6053?port_name=test", baudrate=115200 + ) + + assert type(exc_info.value) is expected_type + assert exc_info.value.__cause__ is error + + +@pytest.mark.parametrize( + ("error", "cause", "expected_type"), + [ + ( + HandshakeAPIError("Handshake failed"), + ConnectionResetError(), + ConnectionError, + ), + (HandshakeAPIError("Handshake failed"), ValueError(), SerialException), + # aioesphomeapi reports this as a likely encryption mismatch + ( + EncryptionHelloAPIError("Dropped after hello"), + ConnectionResetError(), + SerialException, + ), + ( + InvalidEncryptionKeyAPIError("Invalid key"), + ConnectionResetError(), + SerialException, + ), + ], +) +async def test_open_handshake_error_classification( + error: HandshakeAPIError, cause: Exception, expected_type: type[Exception] +) -> None: + """Only a socket error wrapped in the bare `HandshakeAPIError` is retryable.""" + error.__cause__ = cause + + with patch.object(APIClient, "connect", side_effect=error): + with pytest.raises(expected_type) as exc_info: + await open_serial_connection( + url="esphome://127.0.0.1:6053?port_name=test", baudrate=115200 + ) + + assert type(exc_info.value) is expected_type + assert exc_info.value.__cause__ is error + + +async def test_open_api_disconnect_during_setup() -> None: + """A connection lost before setup completes is still an I/O failure.""" + api = mock_api_client("test") + api.is_connected = True + unsub = MagicMock() + + def disconnect_during_setup(*args: object) -> MagicMock: + api.is_connected = False + return unsub + + api.subscribe_serial_proxy_data.side_effect = disconnect_during_setup + + with pytest.raises(ConnectionError, match="closed while connecting"): + await open_serial_connection( + url=None, + transport_cls=ESPHomeSerialTransport, + api=api, + port_name="test", + baudrate=115200, + ) + + unsub.assert_called_once_with() + api.disconnect.assert_not_called() + + @pytest.mark.skipif(not ESPHOME_HOST_BINARY, reason="esphome host binary not available") async def test_noise_psk_key_alias() -> None: """Test that connecting without encryption to an encrypted server raises.""" @@ -770,6 +915,31 @@ async def subscribe(instance: int, *, timeout: float) -> None: await transport.wait_closed() +async def test_flush_clean_disconnect_raises_connection_error() -> None: + """A device-initiated disconnect (e.g. reboot) fails a pending flush retryably.""" + api = mock_api_client("Zigbee") + error = APIConnectionError("Connection closed") + api.attach_mock(AsyncMock(side_effect=error), "serial_proxy_flush") + + transport, _ = await create_serial_connection( + asyncio.get_running_loop(), + asyncio.Protocol, + url=None, + baudrate=115200, + transport_cls=ESPHomeSerialTransport, + api=api, + port_name="Zigbee", + ) + + with pytest.raises(ConnectionError, match="Connection closed") as exc_info: + await transport.flush() + + assert exc_info.value.__cause__ is error + + transport.close() + await transport.wait_closed() + + async def test_mode_protocol_kwarg_with_external_api() -> None: """The `mode` kwarg is honored when the API client is passed in externally.""" api = mock_api_client("Zigbee") diff --git a/uv.lock b/uv.lock index ca0bf81..f0c2e60 100644 --- a/uv.lock +++ b/uv.lock @@ -27,7 +27,7 @@ wheels = [ [[package]] name = "aioesphomeapi" -version = "46.12.0" +version = "46.21.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -41,81 +41,92 @@ dependencies = [ { name = "tzlocal" }, { name = "zeroconf" }, ] -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/98/fc38096b2557fc3528eba9ec3737171a54a600ac489ab8c735314120ec28/aioesphomeapi-46.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a7c6a28a8ac8e37d60af98a3ffebb49e1317e7262451960131807ecdc4852900", size = 670096, upload-time = "2026-10-14T22:02:58.518Z" }, - { url = "https://files.pythonhosted.org/packages/e8/f2/e5dd9cc8877faa7ddf90bf78cf8da7c49e808746f8aea42d6456127c229b/aioesphomeapi-46.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ad69744b17e92553c9921864608d89cc63404f674505ad9a41ff7e8aae54bfc", size = 652874, upload-time = "2026-10-14T22:03:01.386Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d4/c450553a4efb0fd965d90b3202b33b4c71ecac4891b85ad4ba9ea11711b3/aioesphomeapi-46.12.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4a62d7a443577bbb9d2593188f6bb11980211d97d99f61f9c4531c367a7b63cd", size = 823655, upload-time = "2026-10-14T22:03:03.591Z" }, - { url = "https://files.pythonhosted.org/packages/0b/76/a7d73d11c1b3aae929ad26bd592ef84aaa3164b4ad8804880bc8971c61fa/aioesphomeapi-46.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33fc27719e7d85ae97b3be9b6049cc609f5df3ead32d164015412cfe29d96a59", size = 764794, upload-time = "2026-10-14T22:03:05.54Z" }, - { url = "https://files.pythonhosted.org/packages/c0/57/35d54d17a8c771e9cb1ba0cf7b4ed7580c3e555f803f71b7b287519b36c4/aioesphomeapi-46.12.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1e5e1483018fbb700030f34604a5ebc0026bf5ed89bc21d4fcfd6f8b7a16ae22", size = 733338, upload-time = "2026-10-14T22:03:07.221Z" }, - { url = "https://files.pythonhosted.org/packages/b8/de/52adf2fa7ed17c744ffebcd1691368545ddcf876f709a6d28c5142cb81b5/aioesphomeapi-46.12.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba4865d1035ccedd5a4fe60fcf487d98f1a53dcbc6e2fe594f6b9f2a01f08d33", size = 792562, upload-time = "2026-10-14T22:03:09.118Z" }, - { url = "https://files.pythonhosted.org/packages/d3/49/caec4bf20e00f6984cded448d1c22a1ef4eae2e158002ed9038e8373483c/aioesphomeapi-46.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e19f41740de9ad4cf9d1e24baff3d75f05ed7648212a2f1520a8b29f97bd7ba6", size = 772100, upload-time = "2026-10-14T22:03:11.084Z" }, - { url = "https://files.pythonhosted.org/packages/cb/89/7f9c346762c76f5b67a938a8acd4d521ce4a601970ce8da7ab46ac543744/aioesphomeapi-46.12.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d1b8e01b4853a3fa2657dcc90e7f0c540c0e5ac22e13acad318727a309220d0", size = 732764, upload-time = "2026-10-14T22:03:12.758Z" }, - { url = "https://files.pythonhosted.org/packages/58/8c/7b71a9188901ccc6856a3afa793b07621cce1b0ee450abf2ac6e45cd33a1/aioesphomeapi-46.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:826c36a4b89bfaa9ce43eb7c9a1f7d6e24572e477d9a436e56c2c9c094162996", size = 834399, upload-time = "2026-10-14T22:03:14.513Z" }, - { url = "https://files.pythonhosted.org/packages/c9/a0/d679d7716f7e5cc901fac22db879b5f7d3c5b9c0716356a225b9aad13334/aioesphomeapi-46.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c8329e14d58c68b4686b59ec25194f834694566bbf370e9462a173efab3df889", size = 800168, upload-time = "2026-10-14T22:03:16.63Z" }, - { url = "https://files.pythonhosted.org/packages/a0/a2/4ee653e5a8a654105b8af9d55fa4b71be830cdae7ed658a0dc622cc17c02/aioesphomeapi-46.12.0-cp311-cp311-win32.whl", hash = "sha256:75f9e3df66935c4d3644a6a9bf3ee11d55f66fa83d56f5b6c55e3faea96b83fb", size = 557124, upload-time = "2026-10-14T22:03:18.696Z" }, - { url = "https://files.pythonhosted.org/packages/5a/70/0c85f23f54152bd36004ade9e2050ade536fef179c270cd1f61d028c7c1e/aioesphomeapi-46.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:14e2a668cbb357af3fe14826a84a4679b1d890b35cd3975225569690f70f4d02", size = 622246, upload-time = "2026-10-14T22:03:20.505Z" }, - { url = "https://files.pythonhosted.org/packages/1c/1f/3ff54196458a3b3bf79cc24680328694fcd22d305a025fad4f18f95c22cf/aioesphomeapi-46.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3288ff88a5e3912a57b917eaa474290a1b1f80bb0c69d3999071c20ce6519325", size = 677574, upload-time = "2026-10-14T22:03:22.325Z" }, - { url = "https://files.pythonhosted.org/packages/81/42/8e9adc0f7d8405565d0240df13c03f58096236712c5f38bf2a5d7c0b0b18/aioesphomeapi-46.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ea8b574bad9738ee764717ce7877ed4c37856fe3e89d7b511a2a4fbe7cb96a36", size = 659370, upload-time = "2026-10-14T22:03:24.211Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b8/1d06d8eaab2a8b2eab10d723bab55d53865fcf4b047d50a4cacbc8e1855e/aioesphomeapi-46.12.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:79c5162299e9c917343b45bcf317ca3543d43a9b5aef169c1949af756ee7b9d5", size = 798739, upload-time = "2026-10-14T22:03:25.985Z" }, - { url = "https://files.pythonhosted.org/packages/de/85/d0386dc9b46d227db459280cb1d23d2474b55afe94a8df86c05948143cc4/aioesphomeapi-46.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76546f93d4789f1278d4fbddd0fa744ffbad129eb51d27f03a33f9d35e5c332d", size = 738400, upload-time = "2026-10-14T22:03:28.067Z" }, - { url = "https://files.pythonhosted.org/packages/06/cc/12da52878f92cae4c902f8b556d7e8f465c50424d410d8b6b94332366767/aioesphomeapi-46.12.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c32c807fb2220473ef17de48f21b0f816f1cb443d1eecad52b628ab97490692a", size = 723531, upload-time = "2026-10-14T22:03:30.09Z" }, - { url = "https://files.pythonhosted.org/packages/ae/66/e25bbf4242f0aa18b54f59a64ce7e49e030007bef820bb5a18f19af6b2d5/aioesphomeapi-46.12.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:38f9fbecc867cc8d1782130a6f3ea65b7221444abb10488e02435328e78b2533", size = 772898, upload-time = "2026-10-14T22:03:32.079Z" }, - { url = "https://files.pythonhosted.org/packages/40/51/2dc7b42595e7251997400ca2095b82e58f0d207ea5ecff6b06e727fe2647/aioesphomeapi-46.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc4981c30287d85a718e971661743f19c6163f2550ac3652f4bfca81356abcbc", size = 745593, upload-time = "2026-10-14T22:03:34.165Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ad/38e2e7fdcf556d5626fe234c6cc14132d3bd815c600c25b8cea9975b7332/aioesphomeapi-46.12.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:61736b2fb1dfa7e3560732974369fe1b83740f4761574d6a304a3a01a2b77af6", size = 720662, upload-time = "2026-10-14T22:03:36.134Z" }, - { url = "https://files.pythonhosted.org/packages/0b/c0/5174ccaa0bd07cec54ed0defc8cff4904c6252216d127cdaf4f7c03ec446/aioesphomeapi-46.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e7007bac2584b0bea441594ccd517756183133a42f7a084c18dfa01bcff0c3", size = 809884, upload-time = "2026-10-14T22:03:38.289Z" }, - { url = "https://files.pythonhosted.org/packages/3b/6a/95908b5c4a8054c7c4ead5e485e203a25743b1287b1bdfda73883a7b4e2c/aioesphomeapi-46.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a04b72d48b401450a873e29458d7d4ecd8c3fd0d2b19aa1d993d8f56c8b23a2", size = 779592, upload-time = "2026-10-14T22:03:40.6Z" }, - { url = "https://files.pythonhosted.org/packages/6c/cb/bf2ea1a94c80168a76b2985aa6e01fbd60cc9bbfa55b093bac1e2a138562/aioesphomeapi-46.12.0-cp312-cp312-win32.whl", hash = "sha256:84ba4fb303be785e3b0705ef283f3daab0fdcbfa69ab46c3ba2fba470ed9f4e6", size = 549992, upload-time = "2026-10-14T22:03:42.544Z" }, - { url = "https://files.pythonhosted.org/packages/02/d3/58c4838d25f7babfbed61c22501fa59694e499732b4ffb3d916f9c679edb/aioesphomeapi-46.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:429a50111e9f295de6795ae10bb2c85a4aaf3b7d11fc606301814faf1d1be921", size = 611681, upload-time = "2026-10-14T22:03:44.621Z" }, - { url = "https://files.pythonhosted.org/packages/ca/74/c3e9b64cef26a440828f5244bfaa6b763947de15f8332505db7e34434b46/aioesphomeapi-46.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:23e176f5f33940d2a28a5d23da48909406e75dbd142642c204245c6912302324", size = 673072, upload-time = "2026-10-14T22:03:46.631Z" }, - { url = "https://files.pythonhosted.org/packages/dc/1e/f59651d26e9e4b2a47c42c811855ddec792e2c19c2c5945c3702bf1900b9/aioesphomeapi-46.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1ee97f36c92510fe5df82cee39bddd07900a5c5d9c6c07a93fe94ea947e1117d", size = 654033, upload-time = "2026-10-14T22:03:48.577Z" }, - { url = "https://files.pythonhosted.org/packages/d4/89/e19f9154439730ce094ec32fa91569247e35f269ab4332dff98789d8e32a/aioesphomeapi-46.12.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:27ad1aa63ea9480d5fac71cb6b47e9f185c8aabed2e9b638e794578d215addd1", size = 791542, upload-time = "2026-10-14T22:03:50.569Z" }, - { url = "https://files.pythonhosted.org/packages/0e/2f/0e27256b4e6a2f226af48da581e40895cc7290f98eb8dd5d1f1854b65d40/aioesphomeapi-46.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c550f6a97d7d22c647fd62de67259b10762ac8bc4435e2d234fb041d63f55990", size = 734779, upload-time = "2026-10-14T22:03:52.491Z" }, - { url = "https://files.pythonhosted.org/packages/d8/28/79a484ca613a543d17590bca209758324f6af442e6df7f61e115c06d7302/aioesphomeapi-46.12.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2a930f49c694ed4cbe9c82992aca68a1ce67de6d237cc19503ba42f6cdcc8514", size = 716373, upload-time = "2026-10-14T22:03:54.712Z" }, - { url = "https://files.pythonhosted.org/packages/90/50/f4333706ba9fbce1beed85a6befbcf3983f423e05d2b3485833e6eb40921/aioesphomeapi-46.12.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ab0e5a33ce952db0ab7928daaca3993075fa5317fc6725f8522e26349fed337", size = 766424, upload-time = "2026-10-14T22:03:56.679Z" }, - { url = "https://files.pythonhosted.org/packages/de/30/cbb5673606faa4de7fab5ed8b014ae5d0f509bbe4d8ace6a950ac1dd5e04/aioesphomeapi-46.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3571778cdaa47ec7cb29f012f3c5ca92168d00e9fadc9d38393d9c2c89d7ea08", size = 742843, upload-time = "2026-10-14T22:03:58.557Z" }, - { url = "https://files.pythonhosted.org/packages/f7/77/c43f5de192c57fad5d43a99b77e9be8bd7cf981d41b4070597c31bc9f05b/aioesphomeapi-46.12.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:de4f5b3d747c69bd6e7b28618bb96e8d69f16ff1992483507c13ad42ad9df731", size = 715039, upload-time = "2026-10-14T22:04:00.787Z" }, - { url = "https://files.pythonhosted.org/packages/f3/28/ef7168015b2cc1709735f13d25ae41d7e911e3a9fcc99ee8b2d00f04f60b/aioesphomeapi-46.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d119d0650f43c51e5e131da5896f94113d24cd4552161f5b11909b1a536427d0", size = 802428, upload-time = "2026-10-14T22:04:03.085Z" }, - { url = "https://files.pythonhosted.org/packages/ce/46/1947f7900b1ffc5be3ba15aff361fdf72fb729948c32e9b514d841ac8f13/aioesphomeapi-46.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48a59e106addd93b768b06c287997e1c5479ee7f8f9e759ed3ba9bf371504700", size = 774747, upload-time = "2026-10-14T22:04:05.365Z" }, - { url = "https://files.pythonhosted.org/packages/32/e0/01b0544633cb1476a085565a38a077b53cfe8ee4dc6fb1e11a2966e445c2/aioesphomeapi-46.12.0-cp313-cp313-win32.whl", hash = "sha256:91f7f093bcbe09040d43012c6b5afd08f3f9371e310f25e3544afdd4dab1e08d", size = 547628, upload-time = "2026-10-14T22:04:07.42Z" }, - { url = "https://files.pythonhosted.org/packages/5e/78/6eb3dd156d02f035ab4654068ac6145c39f9b7cff04638be3c2b38bf3406/aioesphomeapi-46.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:63017a95653658e617ea27069e48bcee14b541000dd21da9bd95d1b0c0c3b7bc", size = 607718, upload-time = "2026-10-14T22:04:09.762Z" }, - { url = "https://files.pythonhosted.org/packages/23/d7/3e0322c57c18ea36d982ce2eee89479d0594529c5fafa49219073414ddbe/aioesphomeapi-46.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:43fe983cad5a39d5df1a3e9c161ae77151213220f96516f52f39ba45acf505c9", size = 676917, upload-time = "2026-10-14T22:04:11.986Z" }, - { url = "https://files.pythonhosted.org/packages/28/f4/56a74492f7073303dcfda591ab50059984b65b86a0a59ce3bb851fc07b9c/aioesphomeapi-46.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1989c2182de0ca4262a73319a5aa15b2513849942c444309ff7c70e8759edee", size = 661094, upload-time = "2026-10-14T22:04:14.613Z" }, - { url = "https://files.pythonhosted.org/packages/61/c7/6e665c1deb2a5db5e714cda8d4d2dbf51c90eedce305accf066bbc1b102d/aioesphomeapi-46.12.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0e72201fe48e628c94d6a4e9f36ab3c4a6c34ebe4f98e9f136bcc38ed887a317", size = 793646, upload-time = "2026-10-14T22:04:16.606Z" }, - { url = "https://files.pythonhosted.org/packages/2f/c2/dbd4faf86686bfeedd24fb26b60ed28306b5738d863a4671d769ca34d926/aioesphomeapi-46.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4906e871339d3bb6e299bbb32161d9b795ec22d8fca52c22bd89dc4f7ba64c2", size = 744440, upload-time = "2026-10-14T22:04:18.694Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a4/87ffcba2f2464b324a72fdac17d6b61532b8bf58b7c243eaafdecf06d99f/aioesphomeapi-46.12.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:42aade99687b0b7eda018e0f70db98b97c0c77fa2bd98a75c67b43e8e5b6b889", size = 710123, upload-time = "2026-10-14T22:04:20.87Z" }, - { url = "https://files.pythonhosted.org/packages/b9/17/4f178423ecb165d5d42cdfc1ef0fcbddab63570ca422405880bf3d448bed/aioesphomeapi-46.12.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fe70ec84860bbdc5e8787377c6ba39b8181259459e25f4079501f160329d1ca", size = 769624, upload-time = "2026-10-14T22:04:23.185Z" }, - { url = "https://files.pythonhosted.org/packages/01/d2/f901878e1e1a9795994f2dbf1e6a689bc33fc99d34761612ded20a580222/aioesphomeapi-46.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d6cca07db9dadea8f6b91c4ccbaf14f408489af08bb0f74ec4acd22e80c7ff28", size = 752816, upload-time = "2026-10-14T22:04:25.364Z" }, - { url = "https://files.pythonhosted.org/packages/48/7b/41e049745926bce14501f27af2f519f25ee1d1f074203bedac586b0284a3/aioesphomeapi-46.12.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:77bc4dfd9afc74cbd40c6af57bb6e58dcb756fbc06750255087a2ca5526e090f", size = 706874, upload-time = "2026-10-14T22:04:27.592Z" }, - { url = "https://files.pythonhosted.org/packages/97/65/d2943dfc7e4250ef2db806467fd125dd8b9eff6a525240f93d57f6efd85c/aioesphomeapi-46.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:61ac42e0c6405482f183fb422382bc90714c810c289ded16d7cf953b245d96ef", size = 804899, upload-time = "2026-10-14T22:04:29.893Z" }, - { url = "https://files.pythonhosted.org/packages/09/04/8f83d4cb46b702f331594b8b1c89e5feb5b5d3e912e274f66941ad7eb859/aioesphomeapi-46.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f24c20c69db60123d64083436687b3c5c8bc92d561f763bbe2f584d38bbd5c76", size = 778551, upload-time = "2026-10-14T22:04:32.388Z" }, - { url = "https://files.pythonhosted.org/packages/77/4c/7804ef61912fdc30297723e49aa1964d4822aa31ecb3071b8df52bfb3892/aioesphomeapi-46.12.0-cp314-cp314-win32.whl", hash = "sha256:107366b9094753eb09b250200b6e321b8e7d3a83ce825d4a6e98691344c51263", size = 557882, upload-time = "2026-10-14T22:04:34.477Z" }, - { url = "https://files.pythonhosted.org/packages/0c/a8/b4af55415c83c166da155eb14da36501e231416f0b06870549a402d7296d/aioesphomeapi-46.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:3f79adad054675e0fd46941cdd960fd6af4d73e5df91a75dba9fc76f9c412c1b", size = 621291, upload-time = "2026-10-14T22:04:36.62Z" }, - { url = "https://files.pythonhosted.org/packages/c7/10/ecf2fbd77725e2af32845552940db3c5dad7e2786fd9f69f583d385ff0f8/aioesphomeapi-46.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:84192fbc1163597ea8a55baabb878355a19631e699b3f923e3bf681d5d891e55", size = 712433, upload-time = "2026-10-14T22:04:38.899Z" }, - { url = "https://files.pythonhosted.org/packages/75/c3/fb1eb1ce49658f8ee4e53189369464be4ad217aef82aaeda687c67047608/aioesphomeapi-46.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:698c32ca46abdbe978cd4296b15dade174e89bf3aa9d322a8f2adef605c1dbe8", size = 706797, upload-time = "2026-10-14T22:04:41.168Z" }, - { url = "https://files.pythonhosted.org/packages/2b/5d/6ed26045bf83300a5f65655333946ac78b9637ba6ea40a21ab59545abdc7/aioesphomeapi-46.12.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:baabec6632afe8ab139a1ef993afad270adc30f25d98b8880d2e1ebca1dd66dc", size = 796437, upload-time = "2026-10-14T22:04:43.495Z" }, - { url = "https://files.pythonhosted.org/packages/28/18/e78f5cab3ea50200e9ded3a6b94a526227e9b5568dc6a903ff570c605cb1/aioesphomeapi-46.12.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20ee1770cdf90ce565f79d129a3f4c7c999608f284542e01168b614587018cac", size = 763477, upload-time = "2026-10-14T22:04:46.055Z" }, - { url = "https://files.pythonhosted.org/packages/55/28/64efd33ab9fdbe4de7af71ea645b082df2c545a47d64392f2584384eba3b/aioesphomeapi-46.12.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:868aad5a43ba7984f33dfaae617a225e29a54fd39b215e331475453744e334f1", size = 704526, upload-time = "2026-10-14T22:04:48.507Z" }, - { url = "https://files.pythonhosted.org/packages/89/4a/6484670180d681dbf642567ef4712d363d255873604319911c89f8f32294/aioesphomeapi-46.12.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3eff757a4a29fd4855f41bafd9990fa91eb9dc578f27e65af5a8f8dc041420e9", size = 778327, upload-time = "2026-10-14T22:04:51.037Z" }, - { url = "https://files.pythonhosted.org/packages/76/91/8a0af3757e88bdf1cf30c53c4a5885023e610725478fbc0799e3bea82020/aioesphomeapi-46.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f1e853579a960a16fd62cf217fe12d30b973870223b8a28d77ed63d32504640", size = 772172, upload-time = "2026-10-14T22:04:53.414Z" }, - { url = "https://files.pythonhosted.org/packages/2c/fb/ed5e35a909730508bf166a7fabd145124b3ba9d37628341074e77cfc0290/aioesphomeapi-46.12.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:fd3c5ca82359fc90257315b5d0acc38735e8f00fd5b5c7fbce77fcff7e43708f", size = 723067, upload-time = "2026-10-14T22:04:56.445Z" }, - { url = "https://files.pythonhosted.org/packages/9c/98/3eb9bc9d7c39e880ab1c745b3a36a21a973388badde4970ca269e3a98479/aioesphomeapi-46.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:131f92a5dd144c8339871e06c1e7bc6d057a4853d9d9f6d467aa39c2a9c7f266", size = 809175, upload-time = "2026-10-14T22:04:58.72Z" }, - { url = "https://files.pythonhosted.org/packages/c4/bc/6e62cb505818d8c4473b7840a649fffdf42d3a4cfc13bf0d31bb2bbe1377/aioesphomeapi-46.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15910789297f400ff330557c45d065abc46aa28eb58e8f060c64ba0f7a5066bc", size = 787288, upload-time = "2026-10-14T22:05:01.011Z" }, - { url = "https://files.pythonhosted.org/packages/74/51/35c0ebc5704b9809742d02a509a246cc06fd99c7044e077726f96367aed2/aioesphomeapi-46.12.0-cp314-cp314t-win32.whl", hash = "sha256:29b9448e5932bbf002d51de6f62830a24ae702f019e8127ce9dbda9ef31f5024", size = 602239, upload-time = "2026-10-14T22:05:03.748Z" }, - { url = "https://files.pythonhosted.org/packages/7d/31/5c44bd183fa8b1694f13293d5ac9971ed63392cd72dbcb8a37b6d4f59490/aioesphomeapi-46.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2896a71642b30286033f30515b5adb1cab8b0e3e6eb9bf91a0b935489c1089ea", size = 665947, upload-time = "2026-10-14T22:05:06.105Z" }, - { url = "https://files.pythonhosted.org/packages/d2/66/18f20a2ab84f34b4424c378828eef25127efc4403220eca93be7a04e8b8a/aioesphomeapi-46.12.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:1102724d500c77e0d79a77976ae4d8381e142e21809e20e902e8fccbe1604443", size = 674821, upload-time = "2026-10-14T22:05:08.674Z" }, - { url = "https://files.pythonhosted.org/packages/86/6d/3371473193738b4187425fb2a6990f98712b7c8ffa50161c2066a39fe2c4/aioesphomeapi-46.12.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:663b32a2a39de136f5d5af203063abf894fda6d93d19beaf374aa39fd965940a", size = 658164, upload-time = "2026-10-14T22:05:11.544Z" }, - { url = "https://files.pythonhosted.org/packages/d9/13/9af504e84b12b88d160841c7eacca659f168bf6d10dbd3858f93168f88a9/aioesphomeapi-46.12.0-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:96f786c31b735a111410da89bc476f36cc8bcfc638d95756e356bcfe6d35754a", size = 749226, upload-time = "2026-10-14T22:05:14.071Z" }, - { url = "https://files.pythonhosted.org/packages/27/93/c369ef48a887516ff705a5803739ea0602aae2c8d5b680ec8a17c6488b72/aioesphomeapi-46.12.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d46be3ef748dddac04a2fa5454b7c8b0c82393442c43586871c2880be24d21ff", size = 745352, upload-time = "2026-10-14T22:05:16.799Z" }, - { url = "https://files.pythonhosted.org/packages/a3/66/50e58ba5fa31e01b68076133b7d7ab4939ef63b8a8db007b7c1f9ed7cc89/aioesphomeapi-46.12.0-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4eaa76b96cdeb11715aba516718a4174595071be5816247d52a738d3e54bbab5", size = 750253, upload-time = "2026-10-14T22:05:19.297Z" }, - { url = "https://files.pythonhosted.org/packages/6f/1d/4ade87faf24fda61e056d27fa215cc41584e0a3ac0f248c59361ac04bf03/aioesphomeapi-46.12.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23c7a96b178ead810c893a5f80a85e4551adf686d9e935653b9e30801ad62f62", size = 773387, upload-time = "2026-10-14T22:05:21.911Z" }, - { url = "https://files.pythonhosted.org/packages/83/d9/8676e5eef69b28c01f7f71bd3db7a4c687326eafc8a81521da55103bf103/aioesphomeapi-46.12.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:214e614b8a2b3cac5552c68c6d915b3317ba61ce608d81c3e4b608bb4d4d2680", size = 753711, upload-time = "2026-10-14T22:05:24.396Z" }, - { url = "https://files.pythonhosted.org/packages/50/de/e16c3b6482da06df1982d032946114a250145cf88daf1f40b4df3b31d36d/aioesphomeapi-46.12.0-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:c845de26e17ba26ddc429aa3588de808ad841dbf955592225d175183fb316e95", size = 743566, upload-time = "2026-10-14T22:05:26.889Z" }, - { url = "https://files.pythonhosted.org/packages/b9/9d/ff7364655451517675c6c1335dd17784996397206134f1af7829234c4d95/aioesphomeapi-46.12.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:6e718c570f09dc9a5c65f3628217eb3d2c57d6c27512d303d7b5d8ff6c3fd80f", size = 761203, upload-time = "2026-10-14T22:05:29.351Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ce/d48bdc19f43d9d470fb04c53a0f59cbc92ca72fe9562b8becea561f80542/aioesphomeapi-46.12.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:5aebf0080c6de9304e1e47f29abe6a8df649600ca16dcfded289ca2c27c5ef29", size = 780754, upload-time = "2026-10-14T22:05:32.179Z" }, - { url = "https://files.pythonhosted.org/packages/26/60/c7a47888fbead784d05825d504a20cc4efd4c01ec6a4c3566f14302ad816/aioesphomeapi-46.12.0-cp315-cp315-win32.whl", hash = "sha256:f8ccd49056038b0023ef9112339c7ad2ba2773a58d4be14b28de912a6e52e700", size = 557265, upload-time = "2026-10-14T22:05:34.885Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ce/d1984b672a4aa6ae1f521db09b7afb8348268b34ee99c3002aec90c35ade/aioesphomeapi-46.12.0-cp315-cp315-win_amd64.whl", hash = "sha256:d5cc4d48583a81f02ed8f8ba2f0d6c1190fd8222bb4aebfe06cbab8a7b551a2c", size = 620023, upload-time = "2026-10-14T22:05:37.325Z" }, - { url = "https://files.pythonhosted.org/packages/50/1a/132d90287d5d56036e5673dbc7c9c8264c51a84ca7aebe0b2d1a96c03820/aioesphomeapi-46.12.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:a8aeaaa8b87d45a54465b923a234e055f5248f1d4cd17f708c9b73d1c62cc371", size = 706259, upload-time = "2026-10-14T22:05:39.837Z" }, - { url = "https://files.pythonhosted.org/packages/4d/8b/060ef4acb1eeedbc5d837a677a0eddeab7e61d7c32af2d93cf60bc893f58/aioesphomeapi-46.12.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:7060cc5222c5f33375a6305f44f08799b1d0acb2f197471c311736eaebfbc3bd", size = 701693, upload-time = "2026-10-14T22:05:42.42Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/86/a5/54d58f86f7d59d550f6e8f6dae542d6d95172dcfe98a6df2b54840fa2f31/aioesphomeapi-46.21.0.tar.gz", hash = "sha256:0af7c4d414793719261c252b78a8db1966c304a1c264cbd5473c2666cd46f005", size = 278181, upload-time = "2026-10-22T07:34:21.547Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/84/fb48e6256d27e9400dff4a2b933b538dbfd5e7271a497cc458be80dfa348/aioesphomeapi-46.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:62abd2d951aab9be09bce0214779ebc968b401b3fa014687b58ac9486e8a2979", size = 670803, upload-time = "2026-10-22T07:32:04.273Z" }, + { url = "https://files.pythonhosted.org/packages/7e/f3/b25bdffc1c6d29d3f047f9f88e7d7af650680af7f44c6e1979fd2033855d/aioesphomeapi-46.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef9f3a84ed6deb940fde52be674e0219e3c99ef53503c9fabc570ec29592a6f2", size = 653545, upload-time = "2026-10-22T07:32:06.606Z" }, + { url = "https://files.pythonhosted.org/packages/46/9b/21c77e18fd746be8e6700d2e49eefbd1935aebb3a4083b7289a061c2bc81/aioesphomeapi-46.21.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f03c2426ca68af011704faa0cd6045fa9fa3eca348036922bf97f341ab19ae71", size = 824370, upload-time = "2026-10-22T07:32:08.097Z" }, + { url = "https://files.pythonhosted.org/packages/25/2c/09e520217982d1ebf4477a90c8e8ae84fdbc8368fc8b26227d0a08add7fa/aioesphomeapi-46.21.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc65e1233c0efdaeec7a79b98bd995b643cf2438f2859c9543bec3c1627006ec", size = 765440, upload-time = "2026-10-22T07:32:09.878Z" }, + { url = "https://files.pythonhosted.org/packages/e7/87/57fe18f1577c6e27ba3025ebe9e32dcd061290771bb10a02f5f16937e30b/aioesphomeapi-46.21.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3f06c2d1ea6c12d83d54a04278f439044c36814a33018ecaa3107edf7fd99585", size = 733913, upload-time = "2026-10-22T07:32:11.536Z" }, + { url = "https://files.pythonhosted.org/packages/55/58/4188996c79e84c4fb12b4220bb9cb82b683762be47e59a6cbb2808819890/aioesphomeapi-46.21.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd957163cb54957140df3a100c09ec0fe0d502a740ebe5031b67683123fb036", size = 793171, upload-time = "2026-10-22T07:32:13.245Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a6/298ebba5c66ccd706526b32a30942ad46d833272e60f4c39beb666f0e039/aioesphomeapi-46.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a4606c137e0bf8da0d7171ee29ed7762128bc75e9112a0e95f1a31f59812d1a4", size = 772760, upload-time = "2026-10-22T07:32:14.945Z" }, + { url = "https://files.pythonhosted.org/packages/11/6c/05405c787c17fbf2dca9a7c6c00b4eab02a27c24e278f7332b15436d5343/aioesphomeapi-46.21.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d990a25c5bdba953a9773fae56c1f8a9235b7ff0b483efc645f8f869bdd6d2ea", size = 733387, upload-time = "2026-10-22T07:32:16.464Z" }, + { url = "https://files.pythonhosted.org/packages/dc/08/4e013fd8bfb29562a1f07874f8a20837a9490305a256483487074d065bd0/aioesphomeapi-46.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:85fe64a1d5b68f12f09811c4161df29ef9075a2cd275b7574d47ba8de2d0f799", size = 835113, upload-time = "2026-10-22T07:32:18.224Z" }, + { url = "https://files.pythonhosted.org/packages/f3/33/50c4ab730d3a6847a8b933a7e2e05f9207aa488e5bd5f601bc7f32e6165c/aioesphomeapi-46.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:140aea44438043c5a9f73ffa4c8de8148984ca902401746adb30b594e1a8fce6", size = 800882, upload-time = "2026-10-22T07:32:20.013Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b7/91d7ddf3a330062d6dfc1d017aa8690459c66156d7141c9d9545c5e2442e/aioesphomeapi-46.21.0-cp311-cp311-win32.whl", hash = "sha256:19eec2944f692323568d092e154d0c8b0ed23e713834f5d17175fc3e80e00ea8", size = 557783, upload-time = "2026-10-22T07:32:21.58Z" }, + { url = "https://files.pythonhosted.org/packages/2d/56/0fbdbc474c8e265309c450b977c122058c5ee7598dc5bd905c6e2fd583b0/aioesphomeapi-46.21.0-cp311-cp311-win_amd64.whl", hash = "sha256:83d483abe8de6c0a5c66c3349bec338ed9dc5a7c82073fd740f39875d2f90e66", size = 622868, upload-time = "2026-10-22T07:32:23.197Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c6/f662739bf88cafecc123557a3f5c020b85b6be3e9d32bfb98062e8d7ea39/aioesphomeapi-46.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c9ae6acf95880d65503d9646408fab9c23a1ebf1613269b3e1150fac3c099624", size = 678215, upload-time = "2026-10-22T07:32:24.859Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c5/fab2b00052c315eeb16015a5eed04b6c54b5fc55bc50455754dae06af342/aioesphomeapi-46.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:74b970446f866162a933475f7ddeaa309947acdd0c1fc99f13ddc44c69f2232a", size = 660007, upload-time = "2026-10-22T07:32:26.487Z" }, + { url = "https://files.pythonhosted.org/packages/48/f7/55f70e1fe20bcd90a1573c663888fbf6b498e23ec3162a276b5b990396af/aioesphomeapi-46.21.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9c9827dd61f8f2484822de6a4b17996a4b6e358efe3e1ced4b3c3f5d114d6226", size = 799410, upload-time = "2026-10-22T07:32:28.11Z" }, + { url = "https://files.pythonhosted.org/packages/4b/48/b0b5d81c25c91de2946233f9efb627e7ccfd2b10e9a955d9b707ef3d225d/aioesphomeapi-46.21.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e0c79f0ff7f3ec054658253e53974c82e0d9d2308e0ee58f6d0fae6120e933e", size = 739152, upload-time = "2026-10-22T07:32:29.617Z" }, + { url = "https://files.pythonhosted.org/packages/25/28/73bde1c81fe459e539a4afe62d7734dde54932538ebb8f240af5d87b64ed/aioesphomeapi-46.21.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:15043d1999da17ddfa330c6414d71694bbc857903acb5f81f9f8f904f9ba1d15", size = 724171, upload-time = "2026-10-22T07:32:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/83d3d6df49e59b61dc226e65ae5269a58e9bd2cf604dbaf275a65c6181fe/aioesphomeapi-46.21.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ffaffe835d2543bec74fd773ef5d162ad67b263291f2a0e3bbc85fd082b9b59c", size = 773712, upload-time = "2026-10-22T07:32:32.584Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ce/8b958d190d3da3941b5b399a5d6bcf237e07607f48ad1d45ddff91c39622/aioesphomeapi-46.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0e93ecce27c60d4178774dbc623394070c3d4aeeaff9eb27aae8e7c3a7839235", size = 746349, upload-time = "2026-10-22T07:32:34.071Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e5/53461e689f4f36226bbc69dcece1d703c206c458957a5e19e249e3adbfd4/aioesphomeapi-46.21.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5b82c88470fa25b2979c5dd5f9b9ef89da8fd45e4f515740dd28f6e4f2d59513", size = 721304, upload-time = "2026-10-22T07:32:35.595Z" }, + { url = "https://files.pythonhosted.org/packages/09/66/86565cae9362ed0bfbcf33fd0fa6df731d02255f2fc7299388523ea61865/aioesphomeapi-46.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:1e5c5b2062bfd105f265cd7828aa4e8ee2ac81f11917f31e071d6f80e8c5f43c", size = 810493, upload-time = "2026-10-22T07:32:37.365Z" }, + { url = "https://files.pythonhosted.org/packages/28/6c/d1bb1e403296ded5cf9744fea9b73ec5fde340b9e4ca45672c71d9e955c7/aioesphomeapi-46.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2296fe6db29d5b27b68f192f36803dff61e9ca7c95516b8100b89ead2dc31b28", size = 780402, upload-time = "2026-10-22T07:32:38.92Z" }, + { url = "https://files.pythonhosted.org/packages/3c/41/f1152d0c14867be230f15da1c85a940b8d5689b3610c0c05c64ee786af28/aioesphomeapi-46.21.0-cp312-cp312-win32.whl", hash = "sha256:d419376870415f8f3fe4363064a46661edbc74b929b4bb665f23683e8422f9e9", size = 550623, upload-time = "2026-10-22T07:32:40.855Z" }, + { url = "https://files.pythonhosted.org/packages/ac/c9/d05ea7cb72361f946e0be4a5878c4d9e93686f4aeb009cc49b2b2b001a96/aioesphomeapi-46.21.0-cp312-cp312-win_amd64.whl", hash = "sha256:81333fcba33f3b6c9bedafa64b34972fd86e2d2a6c9069c6bd93f26e4aa60472", size = 612333, upload-time = "2026-10-22T07:32:42.951Z" }, + { url = "https://files.pythonhosted.org/packages/8a/29/3be18eadf29bfea5035eeec80537f3c6c3d2177c98145a2b781c3e486deb/aioesphomeapi-46.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1783d0a089c56b644aad2ede2a4e46acbbc6db77087338f15f33156ed3a79d0a", size = 673717, upload-time = "2026-10-22T07:32:44.528Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2b/2d081c6d345ee18d9e345ed94975f9abd9bfdc315aba568ab38c68c39082/aioesphomeapi-46.21.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b9644569e8b48cc1adb4e0618ab84c63c54e20acb18076461bdafd58a8cbdbe", size = 654687, upload-time = "2026-10-22T07:32:46.275Z" }, + { url = "https://files.pythonhosted.org/packages/81/db/a9a1f4321863f86fb9d59fd300ab5e5c62831011eaf3df72ef46d6b02f9d/aioesphomeapi-46.21.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:774ab4c15aa2efe24c94da686736d50897c7edea69c091a512da1a76763341ff", size = 792188, upload-time = "2026-10-22T07:32:47.88Z" }, + { url = "https://files.pythonhosted.org/packages/b6/a3/cd51e47790a65487494fcc4f0eb1094e904c12281b4c382bde497032d775/aioesphomeapi-46.21.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:43eae9ab7b032e21826c87b884aec852d744d2d25b2a3679b6826c3c20052044", size = 735561, upload-time = "2026-10-22T07:32:49.307Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1d/1d6e9331b6d19f21cd93c19c2817e99d678899613c2f62e2c2c87461f351/aioesphomeapi-46.21.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10aa90050c184bd1cc35786efc373c05edb0fecf0ec8c3ef2c4c9ad3341d0dc2", size = 716967, upload-time = "2026-10-22T07:32:51.041Z" }, + { url = "https://files.pythonhosted.org/packages/8c/fc/ee2c1b488f6a9f2726bb40c9b0158127308b7026a59df561d533e6a6077c/aioesphomeapi-46.21.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19f6741cd369d0eaaecf28b8c5b966a664fb84271dc1296b1b073f45f51500f9", size = 767290, upload-time = "2026-10-22T07:32:52.701Z" }, + { url = "https://files.pythonhosted.org/packages/64/67/e8f4ca5025a59f1fa57974e99810c676a22ecd23dfa13bb290160c31f580/aioesphomeapi-46.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:995bbcee30990c706eccc48f99aa4c7517ca803878ca64cbe71415b8af68bc6a", size = 743597, upload-time = "2026-10-22T07:32:54.224Z" }, + { url = "https://files.pythonhosted.org/packages/51/79/a7e194e5d546cc732cc5ca28a76a9df71057ae491e111ca0b2ec6d34f6c3/aioesphomeapi-46.21.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3185ca4aab15ddf5e3ed94b2c206754cb9fe02e18f4d9c5cc913446365fa2f51", size = 715695, upload-time = "2026-10-22T07:32:55.743Z" }, + { url = "https://files.pythonhosted.org/packages/da/9d/93ed2a4691048f6619c3c640c0f7c2d8d1d851f8f562c52246a8c2c56d13/aioesphomeapi-46.21.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0600870042d802427de67fa8606ac6c0219183788c802118da766cadef57a557", size = 803116, upload-time = "2026-10-22T07:32:57.629Z" }, + { url = "https://files.pythonhosted.org/packages/ee/3d/3ef2706eddefc08bfcbd0fc1893cfda867db02ec376f5f491c7b0440ea59/aioesphomeapi-46.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a2f141bd3c5ad34051bf045265e2a441bd8184e64381d5db57879ee8417d3c88", size = 775561, upload-time = "2026-10-22T07:32:59.462Z" }, + { url = "https://files.pythonhosted.org/packages/8c/00/e0b9b7248c3cf405e83f84f0fded0febdd77f62b5bb706aca4590875d623/aioesphomeapi-46.21.0-cp313-cp313-win32.whl", hash = "sha256:3c1b699492723951a94313a594494040440c1ee8ee0fc0654e30dad8bad31ae8", size = 548306, upload-time = "2026-10-22T07:33:00.973Z" }, + { url = "https://files.pythonhosted.org/packages/11/97/44955fdead34a95c00b9a3c156ec0943843739243d3de11e24ecd363fb4d/aioesphomeapi-46.21.0-cp313-cp313-win_amd64.whl", hash = "sha256:4767f2614fc5befe8408c3ec50c2324cc9ad2c61b7f3cf994d9ea6d2590ed2fb", size = 608353, upload-time = "2026-10-22T07:33:02.399Z" }, + { url = "https://files.pythonhosted.org/packages/5c/5b/ca5eaef2db469846d37e1655ca551eb629cca7cce8d0303f7cd281b9cebc/aioesphomeapi-46.21.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7db1872d8856f8565bebbcc8c32fbae103791e0b7bee3a5912c5d103541a9480", size = 677590, upload-time = "2026-10-22T07:33:04.018Z" }, + { url = "https://files.pythonhosted.org/packages/13/94/5b9fed57ba0251d9a24e51ba25a91762b2ffffe1cbd844a61051a03df04a/aioesphomeapi-46.21.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae25b02c6bc5273287277e415f9d0129d91585ee2ae93baf4854cf68c728a65c", size = 661750, upload-time = "2026-10-22T07:33:05.548Z" }, + { url = "https://files.pythonhosted.org/packages/85/c9/d17850cf8f4530e51a6734772ece6064f9e446e21aa560d63c52d0971b09/aioesphomeapi-46.21.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c98c01f45440ba0ed9979974b1a4ca1459f57b764afb0badae9b40dc4faed5e6", size = 794390, upload-time = "2026-10-22T07:33:06.966Z" }, + { url = "https://files.pythonhosted.org/packages/df/b9/375555a888feb7056ed7cb53575d12a0cb4ca3806f68468225e303b74c23/aioesphomeapi-46.21.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:07a09dd4141c25c707e155887af57ea2bf0cd5cd68ab2d43107e2b79d75ae6a7", size = 745253, upload-time = "2026-10-22T07:33:08.464Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4f/152aade78816888cb1b83a20056da09c049881ba1cd82977b3455d8c5d67/aioesphomeapi-46.21.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bca42ede372e4d50975262b65ad97aa71d31af5c7da2c451652764caae18e92f", size = 710786, upload-time = "2026-10-22T07:33:10.323Z" }, + { url = "https://files.pythonhosted.org/packages/9a/fc/7efbd0b63d791772045308cb065287120cd29d0abfbc46b63dc4c44ceca1/aioesphomeapi-46.21.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95bd4ee57fdbe81a5f8cc0f99e60d138d414ba0f60d3113ccc7c735b46cb84d7", size = 770349, upload-time = "2026-10-22T07:33:11.905Z" }, + { url = "https://files.pythonhosted.org/packages/e5/02/d6f2b59ba97bb09e8bfc6fff02d9718459609d9e95df4ad02248a88f97a9/aioesphomeapi-46.21.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:72cc0e344f5f8385e4be9f5e8d2f72efdd9ffa9295dd7d9630bbd119cbc2d532", size = 753601, upload-time = "2026-10-22T07:33:13.361Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a6/eae2638dd27e617ca488fd6d61ad32359f956581c31a9a5ccbbd26abc7f3/aioesphomeapi-46.21.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5cea45230aeaace29b66aa1184b53a4d481c5a161aa2bb2732db9afdf0557255", size = 707439, upload-time = "2026-10-22T07:33:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/43/b3/956d7a425ecdd9a1bac768b6756a7d81091f0d7369fc04d1cf3a9b91662f/aioesphomeapi-46.21.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:4041b2dc1db4ed6e48b4d01939859fd617795b8b0b0c39180cdcd395a198ea57", size = 805604, upload-time = "2026-10-22T07:33:16.465Z" }, + { url = "https://files.pythonhosted.org/packages/94/01/95689a2a019d3690d0589dabbf56a1b138ed457f925ee22273ed52d56d2f/aioesphomeapi-46.21.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f56bdf8fc53a033938eb5042a61d719db8473c7bb6a0591f918bc7e7c21194d7", size = 779245, upload-time = "2026-10-22T07:33:17.954Z" }, + { url = "https://files.pythonhosted.org/packages/e8/8f/0c7eb53a76de79891a44da8510170c25f09f99a34d27a9f677ca4b6c439a/aioesphomeapi-46.21.0-cp314-cp314-win32.whl", hash = "sha256:53a36f6482ecd04e6c5c33e2b3cab280bc41268e3d1b0f812bf5ed2a321f73f9", size = 558496, upload-time = "2026-10-22T07:33:19.63Z" }, + { url = "https://files.pythonhosted.org/packages/95/fb/7849749709090dee1a585390e1bc9ac4d9650b8a08dd55600da4af81318a/aioesphomeapi-46.21.0-cp314-cp314-win_amd64.whl", hash = "sha256:ce72a1949e2e85c28bbeab3baab33ece34c21cad4007deef0b505198b427f0ca", size = 621877, upload-time = "2026-10-22T07:33:21.064Z" }, + { url = "https://files.pythonhosted.org/packages/3c/11/d89667c9acc9715a3170cd119e16ca792f12c117bdb86972d740e192c378/aioesphomeapi-46.21.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:16a5d6fddc0c18861394d7ac068f25a7de47561d0f6d5e6682e97a23950e2719", size = 713085, upload-time = "2026-10-22T07:33:22.539Z" }, + { url = "https://files.pythonhosted.org/packages/c9/9d/e56ec56433564d1ddcd2480f1fa08e9d0ed7d16d99eac3720efedede36d7/aioesphomeapi-46.21.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff14421af8413a773b7de8ea060789ab9acf625b869e0496c673770c09986699", size = 707476, upload-time = "2026-10-22T07:33:24.072Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/847f2f4fbb2449e00f327a1f694775b54f65257009c530f480ce25be5583/aioesphomeapi-46.21.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4a3abeb2b327dc574fce852847eaa1d0aaee6dc70ced283591230b82cf1aa910", size = 797169, upload-time = "2026-10-22T07:33:25.538Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ac/ce59fbb754549f9837ec3d39680d0443a6d6ccf0abe15518c7b1046e1925/aioesphomeapi-46.21.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a449f970f64f6c463f7b4c347f48710fe845f283c2ce2e58c3f4e7b92c650ef", size = 764167, upload-time = "2026-10-22T07:33:27.188Z" }, + { url = "https://files.pythonhosted.org/packages/57/da/e649f867b6d298c49576bcfb0228f4dcc2bbab05c4ced63c47cb08362b51/aioesphomeapi-46.21.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b470259bbc836dc4304dd848eeda5ba27b0fc95ed0a4b648617deafc45c7ee9a", size = 705199, upload-time = "2026-10-22T07:33:28.766Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9c/77e7b91bf410f36842c3ab0bd38867fc56abb5098b3520048aa43c93dbd9/aioesphomeapi-46.21.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea17d525ccfd9926f12d6b22f6f70736396dc592fc5b6871e2485612f2808c32", size = 779135, upload-time = "2026-10-22T07:33:30.258Z" }, + { url = "https://files.pythonhosted.org/packages/b2/95/de5aa43cfdf62a34fa393c74dd7cf718455f3e2c9e49ee0c442f39c61842/aioesphomeapi-46.21.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:302b87b993b3c7c40852a354844907e06d2744749e417f2766053b3707fdec31", size = 772861, upload-time = "2026-10-22T07:33:31.705Z" }, + { url = "https://files.pythonhosted.org/packages/77/fc/9bfb01989ca39dc4bae1ae9cc49cf8c1c259b80c329a7e614bf52e740887/aioesphomeapi-46.21.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c16b77e7661a3b8cfb7c4967a2bdb8f61ceab077fd3a7d432ac4c299914d3c63", size = 723669, upload-time = "2026-10-22T07:33:33.428Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/ce16da4819486c29fb3c538652a52c393daf4d6ad18482587b190503d482/aioesphomeapi-46.21.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:c745d3d7df6970512015b351c116b3690ae18510d821576849feb64254ffe324", size = 809896, upload-time = "2026-10-22T07:33:34.938Z" }, + { url = "https://files.pythonhosted.org/packages/03/ac/b759c5e05d4fe2366f83e5bde70f6935452220c9c6c704121c3a95da9a93/aioesphomeapi-46.21.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f56b80d17b1dc8eaa68b38e29e067c45805bc1c31681326cddcf3bf19bfcb991", size = 788022, upload-time = "2026-10-22T07:33:37.029Z" }, + { url = "https://files.pythonhosted.org/packages/5d/da/eeea1121fff4e96e4bcdcb253fbff548406f31dca3fca1fd450d15ee3732/aioesphomeapi-46.21.0-cp314-cp314t-win32.whl", hash = "sha256:0ce178d059644808ae28270c320b569c47fb486da187173ce8def6be698c23f8", size = 602854, upload-time = "2026-10-22T07:33:38.511Z" }, + { url = "https://files.pythonhosted.org/packages/c5/63/9293a1895991c5bf7231ace3277eaf7579140ef7cd4634310c4e05e3a19a/aioesphomeapi-46.21.0-cp314-cp314t-win_amd64.whl", hash = "sha256:43784533f04709d99fe982aa0db01c35da81570bfed4e4f4ad6ca0fc42d107b4", size = 666545, upload-time = "2026-10-22T07:33:40.187Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d5/fc7247f26daf14c20e99be39698778793079b7767f817cfc09d91407a5ff/aioesphomeapi-46.21.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:59529f0fec6c22a783df7b73f6696b4b282c5c2ee2259f929c0cca15f49b875a", size = 675476, upload-time = "2026-10-22T07:33:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/bd/da555da544f839fac2a9fb06f8e2c54584882cf03b27c12e707a80bcda5c/aioesphomeapi-46.21.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:79ca0f2187e8be343fe460c3319f5a40970a1cff5fa0c983a0795eec127d624b", size = 658788, upload-time = "2026-10-22T07:33:43.201Z" }, + { url = "https://files.pythonhosted.org/packages/7a/22/196b04c89226de73e5ba62a6a6ce66ded1822c6c8f199a8335f9193e8e7f/aioesphomeapi-46.21.0-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:60e13444de9be49954fc3729a99d99253ffb24f21dd3983946fe2faae6202bcc", size = 750024, upload-time = "2026-10-22T07:33:44.685Z" }, + { url = "https://files.pythonhosted.org/packages/12/4e/f7ad1daae22c757af27d32ef3c811b7a66afd11a858566c90082b1f42507/aioesphomeapi-46.21.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bb947246ce6fa7d7bedc77e2c7fd3dcbb1f08e05ad75f439a232c0475087ebf", size = 746167, upload-time = "2026-10-22T07:33:46.48Z" }, + { url = "https://files.pythonhosted.org/packages/80/05/03a6e28ced09c58c86dc2041621a0abfd0ed266238078a900aef9d96cef9/aioesphomeapi-46.21.0-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:887214e9929db7180d882710a3651d9ee7979419459a6bdc3ff42bc596f36552", size = 750980, upload-time = "2026-10-22T07:33:48.276Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/83b2ee5b93f310e0a5dca502a07a1098671467e3d5b7d9c3daabfdeb1c6b/aioesphomeapi-46.21.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00f2318cf639b0b7b13104b6cabf935618227c5f3a0c78b2e53efff96b8ea9c4", size = 774172, upload-time = "2026-10-22T07:33:49.923Z" }, + { url = "https://files.pythonhosted.org/packages/28/6e/6f55acabd5eedf2bf9f3a907369da70618c34f94d59561a9d823b3177e9d/aioesphomeapi-46.21.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:2c832fe7b090d1bc8150c8783997008c4377b6bdcfaa4302ccc677ecc7ad772a", size = 754448, upload-time = "2026-10-22T07:33:51.604Z" }, + { url = "https://files.pythonhosted.org/packages/cc/06/59f26f343b8acc66119d6502751720195a2e8a4a077c10d56995f1e048f2/aioesphomeapi-46.21.0-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:88f28ec722c0dea2e8d376f9c55c5a2b854181d623331b3a44410111342e1034", size = 744315, upload-time = "2026-10-22T07:33:53.396Z" }, + { url = "https://files.pythonhosted.org/packages/56/6e/83f4278bfde47e7554718aefe0b17628c5735eb371a6c53b477c406fe50d/aioesphomeapi-46.21.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:b71b3457026f52445c828aea73b67252c4b06a8e9a67820240a665e92e4dd7a7", size = 761945, upload-time = "2026-10-22T07:33:54.856Z" }, + { url = "https://files.pythonhosted.org/packages/06/87/74ad26c8993262916bca8521f675bbc2f3b1e7737a4ff73264c496d4fa31/aioesphomeapi-46.21.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:71b585439c88fbeca16d5900da9e76b45cea52c5786c942e008eba0f75f32645", size = 781528, upload-time = "2026-10-22T07:33:56.346Z" }, + { url = "https://files.pythonhosted.org/packages/af/cb/c88efeaea7d1143f369dde2a482fb642b9e909740d8ca927e06689d6198a/aioesphomeapi-46.21.0-cp315-cp315-win32.whl", hash = "sha256:27c7ea9a53b3ca386f763bb5d6dbd63e457d7bcb5b377d90dbedd67856877f01", size = 557891, upload-time = "2026-10-22T07:33:57.982Z" }, + { url = "https://files.pythonhosted.org/packages/27/08/6a0f92ba761ca3b629e542c9cf5e8ca630810403ef8465df19200c8ec324/aioesphomeapi-46.21.0-cp315-cp315-win_amd64.whl", hash = "sha256:c67c94fa786753d64b8dc8f46e2e1d707511f787206eedefb569c868333b9ddb", size = 620623, upload-time = "2026-10-22T07:33:59.434Z" }, + { url = "https://files.pythonhosted.org/packages/93/d2/5f0a5740da056d482ae271497f3611e03438511a3dc7d59842a146d35e1c/aioesphomeapi-46.21.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:4ee6fb0cebc0a1ae1dac83c84f05696bce73a8cfefad6c4a9f551081c17557aa", size = 706900, upload-time = "2026-10-22T07:34:00.904Z" }, + { url = "https://files.pythonhosted.org/packages/70/cc/f17b27aed98ebc0deb2c2ecefc229c2cfccfe5ff9da62b4f55bf0db66f1f/aioesphomeapi-46.21.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:c06889eb4d6fc20686c6384bdd701de75054f0f420c7d8b1cf08e44767cb7dd9", size = 702367, upload-time = "2026-10-22T07:34:02.301Z" }, + { url = "https://files.pythonhosted.org/packages/09/28/d03cfaebf9441293677c9f8296f20664841c3627bbdbd333e4beb88ea9f1/aioesphomeapi-46.21.0-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a09c8458517033d85ff7cd319c4b0e15ac849a7be48b07972bf6483a9a86e247", size = 756404, upload-time = "2026-10-22T07:34:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/94/76/208124921b41b0900565c152b9c2dd6e247bdd909b26d10a3fb08f7b3895/aioesphomeapi-46.21.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1769fa12a97ee0573b7c4042be0b610e4915f07fe1acf4afdc68b22431d8c99d", size = 761065, upload-time = "2026-10-22T07:34:05.926Z" }, + { url = "https://files.pythonhosted.org/packages/ab/50/08b8d986bc93b6afd9b58f0a2f5d8beab45db26f129b9416abd96cfd9478/aioesphomeapi-46.21.0-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e1fb3cafccb22ceaaed43488f64bfd35068f5513d14b674d6939b2b117b9dd1e", size = 737163, upload-time = "2026-10-22T07:34:08.044Z" }, + { url = "https://files.pythonhosted.org/packages/08/bd/74b536d69a7ebc444f80cb258360fdf0e01770234f528820b4c6c75f2815/aioesphomeapi-46.21.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3d052fcce6d2197517108d908d1a1fbad5e7a03492d4847662c1f036f95a1005", size = 777566, upload-time = "2026-10-22T07:34:09.609Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e2/f081ed4bb9654f7483096bc89d14ed282d169e15d7bcd9e4f49d6feb4616/aioesphomeapi-46.21.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:43b3c4b5a63662002ce80819627520b58267bc4b5f7037e528ccc83f05cf1f31", size = 769993, upload-time = "2026-10-22T07:34:11.644Z" }, + { url = "https://files.pythonhosted.org/packages/12/a2/ebbc3e6beb4241a81f35bd7a1588a682669ed5774849a17b057628697adc/aioesphomeapi-46.21.0-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:782dc88ea6e31461a72e5d48fdc6a096a9205a6fd9b474615ea49c63bc93beb4", size = 757910, upload-time = "2026-10-22T07:34:13.427Z" }, + { url = "https://files.pythonhosted.org/packages/d7/dc/50aa30343403e630694eab94accda5b76794c06976ea38de582b69cb1ff4/aioesphomeapi-46.21.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:6012e4ffb87e7bc06302d640ba7d11e21709350efbe1ce0211f82b3845258930", size = 768316, upload-time = "2026-10-22T07:34:15.1Z" }, + { url = "https://files.pythonhosted.org/packages/8f/08/0807b218a652ebce44932d2bab585d2db81c71a7955ccbb9782bbbdcede4/aioesphomeapi-46.21.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:9187598e4cd0c6968b506f60924e8120c5a8125c1191b9983e03f3b40ee70213", size = 786863, upload-time = "2026-10-22T07:34:16.904Z" }, + { url = "https://files.pythonhosted.org/packages/16/09/634fce8237b47a82e697a7e27ef84825c73249f5d40540c27e6729aca812/aioesphomeapi-46.21.0-cp315-cp315t-win32.whl", hash = "sha256:a4ab9646c3f9841449fa358d0bfa0a14027c1337d51f5b4da75767aabc22520e", size = 599810, upload-time = "2026-10-22T07:34:18.478Z" }, + { url = "https://files.pythonhosted.org/packages/b5/c0/cb9cec9decad292663cc6561cc084d0e49e7265243630b6907b1210cb81e/aioesphomeapi-46.21.0-cp315-cp315t-win_amd64.whl", hash = "sha256:f3d9a5cce4acc7bc729f768b1ca6ee62b7da4ca4dbeba43f2aaa4db889b1734e", size = 661094, upload-time = "2026-10-22T07:34:20.176Z" }, ] [[package]] @@ -1986,7 +1997,7 @@ docs = [ [package.metadata] requires-dist = [ - { name = "aioesphomeapi", marker = "python_full_version >= '3.11' and extra == 'esphome'", specifier = ">=46.12.0" }, + { name = "aioesphomeapi", marker = "python_full_version >= '3.11' and extra == 'esphome'", specifier = ">=46.21.0" }, { name = "async-timeout", marker = "python_full_version < '3.11'", specifier = ">=3.0.0" }, { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "typing-extensions", specifier = ">=4.13.0" }, @@ -1995,7 +2006,7 @@ provides-extras = ["esphome"] [package.metadata.requires-dev] dev = [ - { name = "aioesphomeapi", marker = "python_full_version >= '3.11'", specifier = ">=46.12.0" }, + { name = "aioesphomeapi", marker = "python_full_version >= '3.11'", specifier = ">=46.21.0" }, { name = "async-timeout", specifier = ">=5.0.1" }, { name = "codespell", specifier = ">=2.4.2" }, { name = "mypy", specifier = ">=2.1.0" },