diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0b6fb95..71bc647 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,9 @@ concurrency: permissions: contents: read +env: + ESPHOME_VERSION: "2026.9.0b3" + jobs: prepare-base: name: Prepare base dependencies @@ -188,7 +191,7 @@ jobs: with: path: tests/esphome/.esphome/build/serialx-host-daemon/.pioenvs/serialx-host-daemon/program key: >- - 2-esphome-daemon-${{ hashFiles('tests/esphome/host_daemon.yaml', 'tests/esphome/external_components/**') }} + 2-esphome-daemon-${{ env.ESPHOME_VERSION }}-${{ hashFiles('tests/esphome/host_daemon.yaml', 'tests/esphome/external_components/**') }} - name: Set up Python 3.13 if: steps.cache-esphome.outputs.cache-hit != 'true' uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 @@ -202,7 +205,7 @@ jobs: curl -LsSf https://astral.sh/uv/install.sh | sh uv venv esphome-venv . esphome-venv/bin/activate - uv pip install 'esphome>=2026.3.2' + uv pip install --prerelease=allow "esphome>=${ESPHOME_VERSION}" esphome compile tests/esphome/host_daemon.yaml - name: Cache ESPHome binary if: steps.cache-esphome.outputs.cache-hit != 'true' @@ -245,7 +248,7 @@ jobs: with: path: tests/esphome/.esphome/build/serialx-host-daemon/.pioenvs/serialx-host-daemon/program key: >- - 2-esphome-daemon-${{ hashFiles('tests/esphome/host_daemon.yaml', 'tests/esphome/external_components/**') }} + 2-esphome-daemon-${{ env.ESPHOME_VERSION }}-${{ hashFiles('tests/esphome/host_daemon.yaml', 'tests/esphome/external_components/**') }} - name: Restore cached ser2net binary uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 with: diff --git a/pyproject.toml b/pyproject.toml index f3ac3dc..e59a57f 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.0.0; python_version >= '3.11'"] +esphome = ["aioesphomeapi>=46.3.0; python_version >= '3.11'"] dev = [ "uv>=0.11.14", "ruff>=0.14.6", @@ -44,7 +44,7 @@ dev = [ "types-psutil>=7.2.2.20260508", "types-pywin32>=311.0.0.20260508", "types-setuptools>=82.0.0.20260508", - "aioesphomeapi>=46.0.0 ; python_version >= '3.11'", + "aioesphomeapi>=46.3.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 e98fddc..be1dd04 100644 --- a/serialx/platforms/serial_esphome.py +++ b/serialx/platforms/serial_esphome.py @@ -34,7 +34,7 @@ import urllib.parse import warnings -from aioesphomeapi.client import APIClient +from aioesphomeapi.client import MIN_VERSION_PROXY_ACK, APIClient from aioesphomeapi.core import ( # type: ignore[attr-defined] APIConnectionError, PingRequest, @@ -46,6 +46,8 @@ DisconnectReason, SerialProxyDataReceived, SerialProxyParity, + SerialProxyRequestResponse, + SerialProxyStatus, ) from typing_extensions import Buffer, Unpack @@ -63,6 +65,7 @@ ) _T = TypeVar("_T") +_S = TypeVar("_S", bound=SerialProxyRequestResponse | None) _P = ParamSpec("_P") LOGGER = logging.getLogger(__name__) @@ -80,6 +83,25 @@ StopBits.TWO: 2, } +STATUS_TO_ERROR_MAP: dict[ + SerialProxyStatus, None | Callable[[str], SerialException | OSError] +] = { + SerialProxyStatus.OK: None, + SerialProxyStatus.ASSUMED_SUCCESS: None, + SerialProxyStatus.TIMEOUT: lambda msg: SerialException( + f"Operation timed out: {msg}" + ), + SerialProxyStatus.NOT_SUPPORTED: lambda msg: SerialException( + f"Operation is not supported: {msg}" + ), + SerialProxyStatus.PORT_IN_USE: lambda msg: OSError( + errno.EBUSY, f"Serial proxy port is already in use: {msg}" + ), + SerialProxyStatus.INVALID_ARGUMENT: lambda msg: SerialException( + f"Operation is invalid: {msg}" + ), +} + class InvalidSettingsError(SerialException): """Raised when the provided settings are invalid.""" @@ -205,7 +227,7 @@ def __init__( self._closed_unsub: Callable[[], None] | None = None self._instance_subscribed = False - self._last_line_state = LineStateFlag(0) + self._last_line_states = LineStateFlag(0) def _in_event_loop(self) -> bool: """Check if we are currently running in the event loop.""" @@ -242,6 +264,26 @@ async def _call_on_client_loop(self, coro: Coroutine[Any, Any, _T]) -> _T: asyncio.run_coroutine_threadsafe(coro, client_loop) ) + async def _call_on_client_loop_validated(self, coro: Coroutine[Any, Any, _S]) -> _S: + """Await a serial proxy `coro` on the `APIClient`'s loop, bridging if needed.""" + result = await self._call_on_client_loop(coro) + + # Earlier ESPHome versions did not provide responses for many serial proxy + # requests. To work around this, we enqueue a request with a response + # immediately after and wait for _that_ to finish. + assert self._api is not None + version = self._api.api_version + + if version is None or version < MIN_VERSION_PROXY_ACK: + await self._ping(timeout=self._connect_timeout) + + if result is not None and result.status is not None: + error_factory = STATUS_TO_ERROR_MAP.get(result.status) + if error_factory is not None: + raise error_factory(result.error_message) + + return result + def _schedule_on_client_loop( self, fn: Callable[_P, Any], @@ -476,13 +518,10 @@ async def _subscribe_instance(self) -> None: await self._resolve_instance_id() assert self._instance_id is not None - self._schedule_on_client_loop( - self._api.serial_proxy_subscribe, self._instance_id + await self._call_on_client_loop_validated( + self._api.serial_proxy_subscribe_await_response(self._instance_id) ) - # Ping to ensure the daemon has processed the subscribe - await self._ping(timeout=self._connect_timeout) - self._instance_subscribed = True def _unsubscribe_instance(self) -> None: @@ -508,28 +547,24 @@ async def _async_configure_port(self) -> None: assert self._api is not None await self._resolve_instance_id() assert self._instance_id is not None - self._schedule_on_client_loop( - self._api.serial_proxy_configure, - instance=self._instance_id, - baudrate=self._baudrate, - flow_control=self._rtscts, - parity=PARITY_MAP[self._parity], - stop_bits=STOP_BITS_MAP[self._stopbits], - data_size=self._byte_size, - ) - # Ping to ensure the daemon has processed the configure - await self._ping(timeout=self._connect_timeout) + await self._call_on_client_loop_validated( + self._api.serial_proxy_configure_await_response( + instance=self._instance_id, + baudrate=self._baudrate, + flow_control=self._rtscts, + parity=PARITY_MAP[self._parity], + stop_bits=STOP_BITS_MAP[self._stopbits], + data_size=self._byte_size, + ) + ) # Subscribe after configure has landed so we don't stream bytes # under stale UART settings. Idempotent on reconfigure. await self._subscribe_instance() - def _send_set_modem_pins(self, modem_pins: ModemPins) -> None: - """Send a signal to set modem control bits, without waiting for a response.""" - assert self._api is not None - assert self._instance_id is not None - line_states = self._last_line_state + def _compute_line_states(self, modem_pins: ModemPins) -> LineStateFlag: + line_states = self._last_line_states if modem_pins.rts is PinState.HIGH: line_states |= LineStateFlag.RTS @@ -541,13 +576,26 @@ def _send_set_modem_pins(self, modem_pins: ModemPins) -> None: elif modem_pins.dtr is PinState.LOW: line_states &= ~LineStateFlag.DTR - self._last_line_state = line_states - self._schedule_on_client_loop( - self._api.serial_proxy_set_modem_pins, - instance=self._instance_id, - line_states=line_states, + self._last_line_states = line_states + + return line_states + + @translate_esphome_errors + async def _async_set_modem_pins(self, modem_pins: ModemPins) -> None: + """Send a signal to set modem control bits, without waiting for a response.""" + assert self._api is not None + assert self._instance_id is not None + + line_states = self._compute_line_states(modem_pins) + await self._call_on_client_loop_validated( + self._api.serial_proxy_set_modem_pins_await_response( + instance=self._instance_id, + line_states=line_states, + ) ) + await self._async_get_modem_pins() + def _set_modem_pins(self, modem_pins: ModemPins) -> None: """Set modem control bits.""" assert self._loop is not None @@ -560,17 +608,19 @@ def _set_modem_pins(self, modem_pins: ModemPins) -> None: DeprecationWarning, stacklevel=2, ) - self._send_set_modem_pins(modem_pins) - return - self._call_on_loop(self._async_set_modem_pins(modem_pins)) + assert self._api is not None + assert self._instance_id is not None - @translate_esphome_errors - async def _async_set_modem_pins(self, modem_pins: ModemPins) -> None: - assert self._api is not None - self._send_set_modem_pins(modem_pins) + line_states = self._compute_line_states(modem_pins) + self._schedule_on_client_loop( + self._api.serial_proxy_set_modem_pins, + instance=self._instance_id, + line_states=line_states, + ) + return - await self._async_get_modem_pins() + self._call_on_loop(self._async_set_modem_pins(modem_pins)) def _get_modem_pins(self) -> ModemPins: return self._call_on_loop(self._async_get_modem_pins()) @@ -582,7 +632,7 @@ async def _async_get_modem_pins(self) -> ModemPins: rsp = await self._call_on_client_loop( self._api.serial_proxy_get_modem_pins(instance=self._instance_id) ) - self._last_line_state = LineStateFlag(rsp.line_states) + self._last_line_states = LineStateFlag(rsp.line_states) return ModemPins( dtr=PinState.convert(bool(rsp.line_states & LineStateFlag.DTR)), diff --git a/tests/esphome/external_components/serialx_host_overrides/serialx_host_overrides.cpp b/tests/esphome/external_components/serialx_host_overrides/serialx_host_overrides.cpp index 634bb0f..02c451e 100644 --- a/tests/esphome/external_components/serialx_host_overrides/serialx_host_overrides.cpp +++ b/tests/esphome/external_components/serialx_host_overrides/serialx_host_overrides.cpp @@ -62,9 +62,15 @@ void SerialxHostOverridesComponent::setup() { } else { // Base64-encoded PSK auto decoded = base64_decode(noise_psk_value); +#ifdef USE_NOISE + // NoiseContext stores the pointer instead of copying, so the PSK must outlive setup() + std::copy_n(decoded.begin(), std::min(decoded.size(), this->noise_psk_.size()), this->noise_psk_.begin()); + api::global_api_server->set_noise_psk(this->noise_psk_.data()); +#else api::psk_t psk{}; std::copy_n(decoded.begin(), std::min(decoded.size(), psk.size()), psk.begin()); api::global_api_server->set_noise_psk(psk); +#endif ESP_LOGI(TAG, "Overrode noise PSK from %s", this->noise_psk_env_.c_str()); } } diff --git a/tests/esphome/external_components/serialx_host_overrides/serialx_host_overrides.h b/tests/esphome/external_components/serialx_host_overrides/serialx_host_overrides.h index 4d8a158..bbee2d4 100644 --- a/tests/esphome/external_components/serialx_host_overrides/serialx_host_overrides.h +++ b/tests/esphome/external_components/serialx_host_overrides/serialx_host_overrides.h @@ -4,6 +4,11 @@ #include "esphome/components/uart/uart_component_host.h" #include "esphome/core/component.h" +#include "esphome/core/defines.h" + +#ifdef USE_NOISE +#include "esphome/components/noise/noise.h" +#endif #include @@ -29,6 +34,9 @@ class SerialxHostOverridesComponent : public Component { std::string right_uart_env_; std::string api_port_env_; std::string noise_psk_env_; +#ifdef USE_NOISE + noise::psk_t noise_psk_{}; +#endif bool ready_printed_{false}; }; diff --git a/tests/test_async_transports.py b/tests/test_async_transports.py index 3eb602f..3e0373b 100644 --- a/tests/test_async_transports.py +++ b/tests/test_async_transports.py @@ -433,6 +433,9 @@ async def test_async_rtscts_setting(serial_pair: SerialPair, rtscts: bool) -> No if rtscts and serial_pair.uri_scheme == "posix://": pytest.xfail("Strict POSIX backend does not support RTS/CTS flow control") + if rtscts and SerialBackend.ESPHOME_HOST in serial_pair.backends: + pytest.xfail("ESPHome host does not support RTS/CTS flow control") + async with serialx.async_serial_for_url(serial_pair.right, baudrate=115200): async with serialx.async_serial_for_url( serial_pair.left, baudrate=115200, rtscts=rtscts diff --git a/tests/test_sync_transports.py b/tests/test_sync_transports.py index 2d71769..4626f77 100644 --- a/tests/test_sync_transports.py +++ b/tests/test_sync_transports.py @@ -424,6 +424,9 @@ def test_sync_rtscts_setting(serial_pair: SerialPair, rtscts: bool) -> None: if rtscts and serial_pair.uri_scheme == "posix://": pytest.xfail("Strict POSIX backend does not support RTS/CTS flow control") + if rtscts and SerialBackend.ESPHOME_HOST in serial_pair.backends: + pytest.xfail("ESPHome host does not support RTS/CTS flow control") + # Open both sides: on com0com, opening right asserts DTR which raises CTS on left with Serial.from_url(serial_pair.right, baudrate=115200): with Serial.from_url(serial_pair.left, baudrate=115200, rtscts=rtscts) as left: @@ -463,6 +466,9 @@ def test_sync_exclusive_disabled(serial_pair: SerialPair) -> None: if SerialBackend.SER2NET in serial_pair.backends: pytest.skip("ser2net only allows one connection per port") + if SerialBackend.ESPHOME_HOST in serial_pair.backends: + pytest.skip("ESPHome Host only allows one connection per port") + with Serial.from_url(serial_pair.left, baudrate=115200, exclusive=False) as serial1: assert serial1.exclusive is False diff --git a/uv.lock b/uv.lock index f38c10c..d2aac50 100644 --- a/uv.lock +++ b/uv.lock @@ -25,7 +25,7 @@ wheels = [ [[package]] name = "aioesphomeapi" -version = "46.0.0" +version = "46.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs", marker = "python_full_version >= '3.11'" }, @@ -38,92 +38,92 @@ dependencies = [ { name = "tzlocal", marker = "python_full_version >= '3.11'" }, { name = "zeroconf", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/5a/d26670c6d2b7d2d2d59a5c29c6b148ac0ce9c482655c1d4e05a2a4b3d87a/aioesphomeapi-46.0.0.tar.gz", hash = "sha256:b256097cb3e8ea6b4f7e10cce07e5b4ce396477cf732451700948ba4bb825d21", size = 244252, upload-time = "2026-08-23T15:51:21.258Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/6f/62e8fc5bfd5439eec16d1433836b89c2b9cb4030f0069689cc7ba096ca08/aioesphomeapi-46.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3949d9557da4cf9e07c85615a021edb839a9b5c9d3f48569d52bbaf82c6390ae", size = 643904, upload-time = "2026-08-23T15:48:35.8Z" }, - { url = "https://files.pythonhosted.org/packages/89/e5/480b13a92481f9c1d937690c1576de721b68d38a83bedce2d18505ad8236/aioesphomeapi-46.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:616ebd7518b74ee6effa032cec8a4c6a0ab8750c366c718d15adf894ff770a43", size = 627840, upload-time = "2026-08-23T15:48:37.9Z" }, - { url = "https://files.pythonhosted.org/packages/5f/28/9c6505cf3b6ddc207a58f851567937ed706712b5d7e7b873bd5ab02224a9/aioesphomeapi-46.0.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5617d1a1c32cb270b3b4b87c558804ccfc833310513a0c3d36d5ef2e46c1502c", size = 795568, upload-time = "2026-08-23T15:48:39.511Z" }, - { url = "https://files.pythonhosted.org/packages/f4/20/7197464bee28b53f9e02cadc44de927d226180537c50dfe32052c2ea41e9/aioesphomeapi-46.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e594802ae01bc1fe52fc09630b2b830ff77f95ece95b6868b5e0f9fadced393", size = 738449, upload-time = "2026-08-23T15:48:40.903Z" }, - { url = "https://files.pythonhosted.org/packages/7f/66/743a99ac5852d7cd01cd59cf101bc972be6818a06e82751fda5f2498f8a8/aioesphomeapi-46.0.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aca5b832c2ec63fc715f3c4f15665ef057f3414022a26d1f66e3dd54a53fa34a", size = 705524, upload-time = "2026-08-23T15:48:42.335Z" }, - { url = "https://files.pythonhosted.org/packages/9a/27/bfa683ede9f6f3999b606a8b3c71c160d32ed6e680d7ea62c66150d10259/aioesphomeapi-46.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:155dfe758520749b32c9b25f613b61460098b7c7b9ac9d27930aacce00617295", size = 764398, upload-time = "2026-08-23T15:48:43.993Z" }, - { url = "https://files.pythonhosted.org/packages/7f/4a/1f24d00b722440ed1d826788d6409933f6af396cf92c6360722cf356de0f/aioesphomeapi-46.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e3102672019466de8dc777766169e1421e5beec7991e28398b9d8586d93a236a", size = 744367, upload-time = "2026-08-23T15:48:45.652Z" }, - { url = "https://files.pythonhosted.org/packages/35/ce/8556c1aa661279d290539f3d6c494a44846996538d6748e6f726c1b3da16/aioesphomeapi-46.0.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:baa351fee0679b518e12e250512787b8a9d274fbd9f477850cd76f30516ccc8a", size = 706714, upload-time = "2026-08-23T15:48:47.291Z" }, - { url = "https://files.pythonhosted.org/packages/d9/4f/59d87d2dada6bedcdd0735d10df4b672f3d81ecc74180280d0ab5a7126ad/aioesphomeapi-46.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bd61ff50cd82cc4acf405d5f0c526e0a7bf1dcd4a04893be7edb796ebe0530b7", size = 806711, upload-time = "2026-08-23T15:48:48.954Z" }, - { url = "https://files.pythonhosted.org/packages/11/93/b459bb44e10eecc6f40685b243ab55bcc13105e3774bc4391be3ff446465/aioesphomeapi-46.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c2d12a76e02c3ef76d7a4ca4b53ec80932474676c643586eacffdd380d681db5", size = 771908, upload-time = "2026-08-23T15:48:50.904Z" }, - { url = "https://files.pythonhosted.org/packages/28/86/26a5937b887336d7a9ef8c4465aae378b14c0c67e082879377d9e5318f09/aioesphomeapi-46.0.0-cp311-cp311-win32.whl", hash = "sha256:dea08890575f4fc335c3b87b20fd7eac8110cc778b7eff5a12aa1a01861f055d", size = 533601, upload-time = "2026-08-23T15:48:52.604Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e1/a0288e1fac77f908a7bf348fee9302923ed556b9c851ca3e10dcb8e19472/aioesphomeapi-46.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:7febcb7b55957678ab5b795335e08c0b380120a7e228b2ae729dfa7c1897a783", size = 597462, upload-time = "2026-08-23T15:48:54.106Z" }, - { url = "https://files.pythonhosted.org/packages/6b/3c/0164b6b04d2bd756202b27f1f050c54328d212f8b8c6e0ca824eff6f2fd3/aioesphomeapi-46.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e252fc40c68b95e66960c6b71dce6ee6271a46b4cf6139c9c2bc93c87894cd", size = 651258, upload-time = "2026-08-23T15:48:55.608Z" }, - { url = "https://files.pythonhosted.org/packages/d3/32/45b0e44283b3aa9f1502051e0736170a9681e04733f5f2d88a07c4a363ff/aioesphomeapi-46.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48bd258ed03ee6c7396c21de82406c00d03798c6ab88889f3c95ee1988544a1d", size = 634127, upload-time = "2026-08-23T15:48:57.137Z" }, - { url = "https://files.pythonhosted.org/packages/da/76/d41c0f65ae90b19081c9659f054befd61dc74accb9765394afdffafd7bfd/aioesphomeapi-46.0.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfd9d2b9662aa6224c5df3428088ccd0f6681fecd68975d90519f7497d7d1345", size = 772843, upload-time = "2026-08-23T15:48:58.759Z" }, - { url = "https://files.pythonhosted.org/packages/fa/12/2eb369c14cf00d655174ec3d22f873906887af09ef9465dcca20342cde7c/aioesphomeapi-46.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1753ee556746f90f3b4608db2be2a74b90eabbd13f1e6192e12678c840a7830c", size = 712704, upload-time = "2026-08-23T15:49:00.733Z" }, - { url = "https://files.pythonhosted.org/packages/1e/ec/0523466c515c3f94d86c1e48789c27fee46e573b5630414e0578bf57bc6d/aioesphomeapi-46.0.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:635b9a9aa23868eadc93025cbbdb3ec774bfabb0ae2fe7555f4b0ba3cc677cc4", size = 698793, upload-time = "2026-08-23T15:49:02.531Z" }, - { url = "https://files.pythonhosted.org/packages/ab/d5/97fe01ae517199d4d73f1b1332c5f56208695175b05e1adfc8e9c10da411/aioesphomeapi-46.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bcc3ba6162cf8c47f88c149fa0daf04bc35b9b0248c091e6dc03b249859485c1", size = 745459, upload-time = "2026-08-23T15:49:04.214Z" }, - { url = "https://files.pythonhosted.org/packages/76/f7/3f719001c0766a90131e6ed56f601cbc79b310ba0425205fc1a7aa38bea0/aioesphomeapi-46.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c0010ec9a0568407345260e72557ce21db8b006aa0d683e102cf1fbf28c276b", size = 719456, upload-time = "2026-08-23T15:49:05.948Z" }, - { url = "https://files.pythonhosted.org/packages/bb/0b/ad2b2aae5d0ddeecf27f0f06bc592e6cb45f582a8525b8d582f5c60779c8/aioesphomeapi-46.0.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3bc7a449f62339cec43980ba722809fde239450b13599d981bb62d6bee9bb73b", size = 695482, upload-time = "2026-08-23T15:49:07.78Z" }, - { url = "https://files.pythonhosted.org/packages/0a/f9/f2a2a745e55f3d395c03238f69a72474b9ac2aaeff343d431ec22b5a0736/aioesphomeapi-46.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bc5ed615833d77f577b6731a487b78c75d000cede76385e9c84a3cb101e4777d", size = 782449, upload-time = "2026-08-23T15:49:09.443Z" }, - { url = "https://files.pythonhosted.org/packages/80/8d/f2d02c09f9784d1177a7f7a976db16909b2162eaba54f02d060fa01c2e43/aioesphomeapi-46.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:769bff4c81ad7cb7df793d571ade81e85772ff5ee5688d02d47d7a7478c5456b", size = 752856, upload-time = "2026-08-23T15:49:11.115Z" }, - { url = "https://files.pythonhosted.org/packages/ab/90/db3cda2ed6deb814f00a70f3e7b6368fa2ece10e762804f657347b686e48/aioesphomeapi-46.0.0-cp312-cp312-win32.whl", hash = "sha256:712d232c0866e5d061a91db7a881d7feb605f6284ff166278cff0470b89277b7", size = 527246, upload-time = "2026-08-23T15:49:12.946Z" }, - { url = "https://files.pythonhosted.org/packages/2f/2d/6008d151a07611f038d0aeccb4b4cfaeb5a1bc52be95831b009a27d44ed0/aioesphomeapi-46.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:b8eaa5d280ed1b713e1c6b3f6a12d94b0e78c34ded405d532cc226a70d3ca752", size = 587287, upload-time = "2026-08-23T15:49:14.611Z" }, - { url = "https://files.pythonhosted.org/packages/2b/90/308b491c59e4781f5635e3fd45cd20138cd601d1d6dd731eed00a084bac0/aioesphomeapi-46.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9de4889f35aadffa0b165d0aecea61b9e690d81e3a11ee99fe7ae303165df177", size = 646231, upload-time = "2026-08-23T15:49:16.376Z" }, - { url = "https://files.pythonhosted.org/packages/79/a4/5fce7f821f831251fa2ff25363f88c059d0772f2919fb6cc80278dbaf270/aioesphomeapi-46.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f966a99a696cb57319488942b9d1386b9cfa6e3d03c1b75b09844864645bf93e", size = 628419, upload-time = "2026-08-23T15:49:18.268Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ff/d86fd6a0b537c19e836f864e2ba7b1182d473b52bbb80c332b878086b98c/aioesphomeapi-46.0.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6f3aad66e8198394af5f382442d1af597b4a21d7151d9339d1825bd94b2f8744", size = 766177, upload-time = "2026-08-23T15:49:19.898Z" }, - { url = "https://files.pythonhosted.org/packages/80/63/275c7337f61bdee390816719321560397f65a0236fd5880212125b77c815/aioesphomeapi-46.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50ec37ff62c8757f07ec1cf6b7db6e44b61d9c0cfd7830d5a27c107cfaad96f4", size = 709551, upload-time = "2026-08-23T15:49:21.541Z" }, - { url = "https://files.pythonhosted.org/packages/a0/dc/c03fdb1a136bd3e4d220303be52d5b04cca820cc243b8886fbf18502b0e3/aioesphomeapi-46.0.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:85de83038e5b9ea0b2cdf91b730f4d5430b7f837ef1f0eb92456afad57729878", size = 692024, upload-time = "2026-08-23T15:49:23.351Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9b/9de2f1a5bc9079b4d0efdb52ceb009ee7f832fc5b6519d92e09edd5324e9/aioesphomeapi-46.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:094cf5936d2e56ca998b3764639cd1cd93643a54f14f20f08289d8da120abce2", size = 739741, upload-time = "2026-08-23T15:49:25.015Z" }, - { url = "https://files.pythonhosted.org/packages/06/df/c4837c8bf8f718da571047a46683ce867becf800e6e8988c84e6cccddd55/aioesphomeapi-46.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6519fe83c24ed06081cfbafe2ab0fe41941aa90719cd4fb1c6d675e916c8a729", size = 716727, upload-time = "2026-08-23T15:49:26.726Z" }, - { url = "https://files.pythonhosted.org/packages/19/8d/01dd4175e4fb1eb5e2ffe59c7b6b044e7a72e35a04b51919c194e6756f94/aioesphomeapi-46.0.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a3d6f0e40f2eb057383ef722bfcca3cf106b3e012000e1a5791d9449d580f2f8", size = 690196, upload-time = "2026-08-23T15:49:28.463Z" }, - { url = "https://files.pythonhosted.org/packages/89/fd/83ccfb8c5bf55f77be71e6e6c3807b49c45a93f58e9931b4f26544ce82f4/aioesphomeapi-46.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c06d934248792a208fe5d858797247d46c74d442c0777ecf742d8fd750e06a51", size = 776547, upload-time = "2026-08-23T15:49:30.329Z" }, - { url = "https://files.pythonhosted.org/packages/04/22/f5e832b834c3d1bc9300cac5b0d04d50f687986d586b3c8fdffc3d10d0c0/aioesphomeapi-46.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:389b6215214c0192ced8972f73a465735a65c7ffa324698e3615d954daa7919e", size = 748909, upload-time = "2026-08-23T15:49:32.143Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1d/5208c44384bf950636d9c678004cbf9bc30cc13d2396e008daacfc4109cc/aioesphomeapi-46.0.0-cp313-cp313-win32.whl", hash = "sha256:5833d294d82475c17f4e0e3dc28d05e102e8b8f7f6cbfdd5dc143e13d1a61b27", size = 524965, upload-time = "2026-08-23T15:49:34.259Z" }, - { url = "https://files.pythonhosted.org/packages/5b/50/7be1d78451e1be8bdfa587efc352cf92d5f03bc609b3f7fe3ce051d97fa2/aioesphomeapi-46.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:89777c2338abf397089a56c901fdb511671345b30de207905e0a402c08fb9df7", size = 583291, upload-time = "2026-08-23T15:49:36.105Z" }, - { url = "https://files.pythonhosted.org/packages/5c/f3/840e48d7b284b3e161ac613075e3113858fd9699b3077901e65a7195412d/aioesphomeapi-46.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:b90b77f7823d1300c08911a014dc3763eb7a7f5debbe26e994da6f3edeedb8ef", size = 650380, upload-time = "2026-08-23T15:49:37.903Z" }, - { url = "https://files.pythonhosted.org/packages/09/72/dbe46f4270480f87635d41b5b29028388fabe2040420fd63a14c24eaab23/aioesphomeapi-46.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:35f74d916fd4153ffa15b5aaec2d14db0ad977501ed7efef43cdb7ebcaf09d30", size = 635235, upload-time = "2026-08-23T15:49:40.214Z" }, - { url = "https://files.pythonhosted.org/packages/6d/3f/038f23d802f20b9651adec50a64965b6f9702f46c37623e753c0007d741b/aioesphomeapi-46.0.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0cfc53170e37e0fb22bf6b02438914cff793c4fe3fd96402e1eb5ba7ea686111", size = 767624, upload-time = "2026-08-23T15:49:42.133Z" }, - { url = "https://files.pythonhosted.org/packages/34/50/0ff49de661a900b3e0657783c4343035186f39cf829041421154a9acda21/aioesphomeapi-46.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1639664e178e04a45a234a26e88a2030f4bee2f918fe5d1bdee11022103421f5", size = 718432, upload-time = "2026-08-23T15:49:44.176Z" }, - { url = "https://files.pythonhosted.org/packages/6b/29/ab8f033091a4a6d6a7da7784852d86d234afd8d06cbc150b2ef0547de302/aioesphomeapi-46.0.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:930288d9626097e6d416c44ea4c02c0cdbd1ef3eeed35d2e77c381ab0806543e", size = 685326, upload-time = "2026-08-23T15:49:46.029Z" }, - { url = "https://files.pythonhosted.org/packages/41/f2/8cc099c84601b2e6f3fc739b9c68e73b22328db86db28575aa0b161b8c21/aioesphomeapi-46.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d2a5ab9aa001cd637edd26e0bc75c3a7f192e51e9e992013fafc613ff05e624d", size = 743983, upload-time = "2026-08-23T15:49:47.888Z" }, - { url = "https://files.pythonhosted.org/packages/ec/f2/94d0a00dd22812e6f68c6edcb8528baf86e0707b19d7919a9eb08addee07/aioesphomeapi-46.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5d81d9fc6033719ffddea1cb95afaecdcd0284585f2b90b0f8bc75882e8b613a", size = 725913, upload-time = "2026-08-23T15:49:49.75Z" }, - { url = "https://files.pythonhosted.org/packages/a5/03/4af5f0417312908ceb16d4750afca2539433e461623c6015e68787179318/aioesphomeapi-46.0.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:b4799626f185d1c82a8e9efbf73d77b87f9678436643d15961194682ffeba903", size = 682616, upload-time = "2026-08-23T15:49:51.722Z" }, - { url = "https://files.pythonhosted.org/packages/b2/2d/4a9de2bcde4188319f5abc958d130d927989d4ee534f741b73fb13eef708/aioesphomeapi-46.0.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:b71452d93028396130ffa896bb15a4f50f5dd177b67d6926dbdef98d44884458", size = 778272, upload-time = "2026-08-23T15:49:53.713Z" }, - { url = "https://files.pythonhosted.org/packages/90/cd/4f0ddc7dfc0cf7ccb72a7e1826711b852606c1e313c9a2d26942210eefd3/aioesphomeapi-46.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:fb848fdef64ecdbb0b9f5306cbc282c18636cb3e0da5bb933d2af0a17fc48979", size = 751468, upload-time = "2026-08-23T15:49:55.534Z" }, - { url = "https://files.pythonhosted.org/packages/14/d9/7ac390e8c92e0a963caed56124d84d886b009592dd3a1e302b558f483a7a/aioesphomeapi-46.0.0-cp314-cp314-win32.whl", hash = "sha256:8a28abc55f5607a3ad2f106fd1e0e669baf1b986a2cf3d69db7356ece768d7c5", size = 533979, upload-time = "2026-08-23T15:49:57.456Z" }, - { url = "https://files.pythonhosted.org/packages/07/a1/481bae3332590e360b1755f181fc55162a9b4d06d8366b97da4256473d64/aioesphomeapi-46.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:001f391edc1db54f0d14beb6dc85e156ccba697e4f7b7daac2ead5ee47c58e85", size = 596745, upload-time = "2026-08-23T15:49:59.289Z" }, - { url = "https://files.pythonhosted.org/packages/49/f3/398466f52337c31664c00ad2f84819b199aa98a6e009f92a9c752a1f5bf7/aioesphomeapi-46.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ebdfa5bf223a2fad293ed8c6fc9463310e5bd39596153abf855c5493e9828ee9", size = 685501, upload-time = "2026-08-23T15:50:01.189Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b7/501608fc2ec3319ab6d19c64f4411d0479bff5d65871c6cb4723f2127dad/aioesphomeapi-46.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f7621bdcc3ebdcd14ad1aa3f372aa98e15ed82ea51323acb2a54203c4e2180f", size = 681159, upload-time = "2026-08-23T15:50:03.089Z" }, - { url = "https://files.pythonhosted.org/packages/c7/52/613be9fadbe9345b22201503015e4e5debde6c537c9c7cfb2eaee0dcbd46/aioesphomeapi-46.0.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:55ef299f9a53044e38a27b19f96ecf6234f4d13d1b34cd2937184bb25242a6a8", size = 768712, upload-time = "2026-08-23T15:50:05.224Z" }, - { url = "https://files.pythonhosted.org/packages/6e/5f/6fdbdeefa462a91aae1eb1c53046e89c64078feb4141afc3af56e0c31920/aioesphomeapi-46.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:316a85c6276adbc2e9f3712b46da2aeea8bf31aa78440703e03e34cf2cb0cf3e", size = 737215, upload-time = "2026-08-23T15:50:07.359Z" }, - { url = "https://files.pythonhosted.org/packages/b4/19/f58208b86be53281aebbedc55846e9cdf2cea7442a151622480448346719/aioesphomeapi-46.0.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4d261abe007eed7fccfc4195d453cce3e60d548827ebeb9bab358e22b78a4dd", size = 679099, upload-time = "2026-08-23T15:50:09.419Z" }, - { url = "https://files.pythonhosted.org/packages/3a/64/d8d171dd3effb0131bdcbf0174e7c7dabea4d2b64d2891b9c975316ed897/aioesphomeapi-46.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617bfc3229e90f9e6d64346b1ba6966bb7f6e697b0d9e3570311029b7f0bdede", size = 752104, upload-time = "2026-08-23T15:50:11.665Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f3/f572c8796419a9a285fa9943ed5abb4c3553690d3a8e49e21103fe934418/aioesphomeapi-46.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78f1418c1dcb3115d178405538e672be21c07410f3d5e325115d80bb21be2ffc", size = 745544, upload-time = "2026-08-23T15:50:13.822Z" }, - { url = "https://files.pythonhosted.org/packages/d3/b9/2c875f77528b19d5aaa154d2ccfba400f9956f080ca288355f7ebe0f7e63/aioesphomeapi-46.0.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:09eb1dba8576acb2bad151d8c0120916e914330cf8dff2ab01195a6aa1c42e97", size = 696632, upload-time = "2026-08-23T15:50:16.039Z" }, - { url = "https://files.pythonhosted.org/packages/e3/0a/c5934ec325028221c029d2000f97d8f1edebe3d6d67dfd705adb3b219e98/aioesphomeapi-46.0.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9cb4f10a091f852523dcae28da4dbdadf72b6a8ca5fc887a699c644b0f158132", size = 782188, upload-time = "2026-08-23T15:50:18.124Z" }, - { url = "https://files.pythonhosted.org/packages/1e/50/93ec90b69972155e9e7d46ffcacf4adb04b2bfb66d7801963d277e4bf5ee/aioesphomeapi-46.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:692e1ccccc6e7dd969527768da61752985f08c5a06cb307cc33cc8e6cecbb149", size = 761058, upload-time = "2026-08-23T15:50:20.358Z" }, - { url = "https://files.pythonhosted.org/packages/27/dc/9970503cb2ced3b26a5d71469073bc5debeabed4e7bd6216800fd75cb8e2/aioesphomeapi-46.0.0-cp314-cp314t-win32.whl", hash = "sha256:5ba7b69e44e13a4a97c893d6d2d81609ee38be713612b93d38c33edf2b762ff0", size = 578246, upload-time = "2026-08-23T15:50:22.413Z" }, - { url = "https://files.pythonhosted.org/packages/3b/39/769db7115501da2d8c73a1e3e7a4185e1204e8e2b8acc1aa8fb61176372a/aioesphomeapi-46.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:35fb78e02a1dc732fb826cc411d307c4b3c14e571fd038b4ef0bad7a6313d448", size = 640368, upload-time = "2026-08-23T15:50:24.485Z" }, - { url = "https://files.pythonhosted.org/packages/7c/56/81730e6e4f8fdf7a4f12d84f400b3fc38106779778c23b7945fee11043a6/aioesphomeapi-46.0.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:b11ddf9d11ff52a73e9d78a01498649c6a6cff5c6b75d9ec44a223ab24031d69", size = 648241, upload-time = "2026-08-23T15:50:26.554Z" }, - { url = "https://files.pythonhosted.org/packages/7c/e3/3616a656b317c5f50be5668c975274b562824d69cfe5099b04b0c60b1916/aioesphomeapi-46.0.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:40ce50977d1b387f81c043685c0f67c5172f9578753a7315439e93d4cc5cf96f", size = 632111, upload-time = "2026-08-23T15:50:28.736Z" }, - { url = "https://files.pythonhosted.org/packages/2e/b6/14a3682aa497c41898f56ae4f8c732df31710ed6df234bb02656f2e25b4a/aioesphomeapi-46.0.0-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8c42fc75fcd330c65e7cd44098246197943bb7513ec9949a4ee34fc7fff14bf7", size = 722436, upload-time = "2026-08-23T15:50:30.855Z" }, - { url = "https://files.pythonhosted.org/packages/6b/91/c3c84c0d83567064260328f0a7afac064e3c86b93e54c4348a7efdb4936e/aioesphomeapi-46.0.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9585f63135f75892d7545274dcfba4258d7ed5f64627573e30074fb40cb32efc", size = 718575, upload-time = "2026-08-23T15:50:32.91Z" }, - { url = "https://files.pythonhosted.org/packages/a8/67/0f4b20ae51c059da7a9caf190b3b60ed15150c67cad2b55031364f75b8ae/aioesphomeapi-46.0.0-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:58a363e04451f9828c6619d7e12558f150f253c29aa423696874244d81a4a2d5", size = 725197, upload-time = "2026-08-23T15:50:35.451Z" }, - { url = "https://files.pythonhosted.org/packages/81/3a/e8c58d5241567f3b3e8fa0a18201540a37d19c554ffd2f399a855490cc5c/aioesphomeapi-46.0.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1f53c00e258e0724c8cd860ef78119566e120d5c3aa517a78eede312ce73d16", size = 748503, upload-time = "2026-08-23T15:50:37.472Z" }, - { url = "https://files.pythonhosted.org/packages/15/5e/81b7f262ddfc99277083174bf866d125ad3a74616861206e75e5109f957f/aioesphomeapi-46.0.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:0d1f3e5afb8ec147a420a24d5d258ab35dd09f2b72f688ce7297be725201a61e", size = 726452, upload-time = "2026-08-23T15:50:39.688Z" }, - { url = "https://files.pythonhosted.org/packages/6e/25/3eb6d9ea3d425d586fccbed0bda545c3622cfb7bbdf2993c19ec41ce2536/aioesphomeapi-46.0.0-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:0bbf98c8260ac18bb270f6a84da7f2f111ceffe868f4171e8999207fb46ecb06", size = 718082, upload-time = "2026-08-23T15:50:41.806Z" }, - { url = "https://files.pythonhosted.org/packages/0c/80/c8cd9abce880cfe1179e07a1c9b96e00e510f3a2da2cc97a202c45239f0e/aioesphomeapi-46.0.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:2872d474110d2917011c8b38f6e8edf399212c0bfbd800a6ab124be5340ce4b1", size = 734885, upload-time = "2026-08-23T15:50:43.916Z" }, - { url = "https://files.pythonhosted.org/packages/73/50/d393e2a896f8764b2befcd61f7561f49bb77eca4b85f04c6967f19b57b85/aioesphomeapi-46.0.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:4310bbd7e7d7928e522e038d27b4934a7bdd963440e98c37fb21b7017d47f54a", size = 755816, upload-time = "2026-08-23T15:50:45.995Z" }, - { url = "https://files.pythonhosted.org/packages/91/09/2c02a23b89307fd70b0db83ae81ac3a0d8222c932a7bf59f0ddeb0c92a58/aioesphomeapi-46.0.0-cp315-cp315-win32.whl", hash = "sha256:8d47d8f39d47ed6128cc1b8abf803f21a6ab6de34ee327d2af8ce157d9692943", size = 533264, upload-time = "2026-08-23T15:50:48.21Z" }, - { url = "https://files.pythonhosted.org/packages/49/53/99b5ba9b0acc5aa8e246c1287c71a494c206118f80678b7b6592c3c9dbf7/aioesphomeapi-46.0.0-cp315-cp315-win_amd64.whl", hash = "sha256:4adb496f7cda314af307aed3bfbf796e9db75424e6633de192a99bc0dbaefd08", size = 595781, upload-time = "2026-08-23T15:50:50.739Z" }, - { url = "https://files.pythonhosted.org/packages/04/b4/d6c44425a1c353f4e98566beeb0f555eda985df72d8455b0e5759d15ef85/aioesphomeapi-46.0.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:06ccb5dba82a725bfb37364741f2a32c85247bbe44f3ba6bc2702bed878f1ca3", size = 679369, upload-time = "2026-08-23T15:50:52.994Z" }, - { url = "https://files.pythonhosted.org/packages/eb/92/04aaa6c5d625b421762a1557ca3c471b645179e33f74e9ca0c12331d314e/aioesphomeapi-46.0.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:e686eb8da4048adca7e90c10db054384fcbe2c14973d3539d1e6f04dca8bd414", size = 675737, upload-time = "2026-08-23T15:50:55.148Z" }, - { url = "https://files.pythonhosted.org/packages/f4/34/42ef80f0f8fb13cfe60c78af142a83893a5828e6659cd64f7470d7558e91/aioesphomeapi-46.0.0-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0f10006abe6ec944a50510acef1cf13b4f86eb0a54db3b68a361bcfce5ffd1b5", size = 728016, upload-time = "2026-08-23T15:50:57.312Z" }, - { url = "https://files.pythonhosted.org/packages/a1/81/d8f545bfe8e9d42697844b2676d54012426c5dcf95170afd3e8cd6af5ccb/aioesphomeapi-46.0.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c222f2d04cb19e261db6354e243ba09650e7a79cd7755c176e681dc7783086d4", size = 734127, upload-time = "2026-08-23T15:50:59.715Z" }, - { url = "https://files.pythonhosted.org/packages/70/50/1e466c08592b719ef5f35d9223b773d6730a18ff4d881493c4ca5da403e6/aioesphomeapi-46.0.0-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:cf6686f51717a270b08f9bdde9e1e228dcabcb4f02e2fa0d4d0093d9439acd1f", size = 710511, upload-time = "2026-08-23T15:51:01.875Z" }, - { url = "https://files.pythonhosted.org/packages/78/4c/c42d88c4859ab45dd2365fedc1ef41d16eadbf8a27c0f1356b818df020a6/aioesphomeapi-46.0.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b239fb0cf06fdc6c6fd1dd9b4eb3bb2531392afb7964a30b93d46bbbe62cf667", size = 750214, upload-time = "2026-08-23T15:51:04.374Z" }, - { url = "https://files.pythonhosted.org/packages/32/aa/e7f17952d526d1baf90bbff9e42562d60ef9b9d3be140a26f87fef3dad39/aioesphomeapi-46.0.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:1f496a29e38b43af01650a210d31b798118d08369fd8ba31516a1f0b11bad93a", size = 743169, upload-time = "2026-08-23T15:51:06.774Z" }, - { url = "https://files.pythonhosted.org/packages/75/af/9fa458d92446eb714775babf34385d2022be53fa60c42ea7d97a039fee56/aioesphomeapi-46.0.0-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:8f1a49a28d8f8d7975bffa867341292866bf58f33041d0e550baea32fd85a2ae", size = 731061, upload-time = "2026-08-23T15:51:09.035Z" }, - { url = "https://files.pythonhosted.org/packages/f2/5c/2887969f36d80e5ca87a28e976c2f1f2efc26fb4e16df290d10ee42fa886/aioesphomeapi-46.0.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:f171819e8c129fc07feb81953a6b9180dcba8291ca7d0e4f39779d12a0add3e7", size = 740805, upload-time = "2026-08-23T15:51:11.365Z" }, - { url = "https://files.pythonhosted.org/packages/36/9b/a976882e596beca78e458fc790f2c7b9446e81651c80538b62a32441bdec/aioesphomeapi-46.0.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:c16ed745186f46c82ff4da1b5fe761dceec2ac59cbb807eaa388ef2db7c389ed", size = 759682, upload-time = "2026-08-23T15:51:13.857Z" }, - { url = "https://files.pythonhosted.org/packages/71/d9/6d34cd095737bc131b3f3942b766b8ff9c9092b6d7e82395740eae53ad1a/aioesphomeapi-46.0.0-cp315-cp315t-win32.whl", hash = "sha256:25489440df496d1a99a4cda2f77bc3b3dd42f681bc85da934268dcf7a75b2143", size = 575182, upload-time = "2026-08-23T15:51:16.299Z" }, - { url = "https://files.pythonhosted.org/packages/f9/2c/99d82016bb12e865450f3cb2828d6b33d31753c55caaa3be21b56c6a3970/aioesphomeapi-46.0.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8ccbe1e1d40f76c391e670b6286d5075dde34b837a832f9714cddfd561bb8aa5", size = 634973, upload-time = "2026-08-23T15:51:18.906Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/54/af/ecdf53e8b4e09e4851124e1bf4a5fb41121469d04a7935f4e0740a67ffb4/aioesphomeapi-46.3.0.tar.gz", hash = "sha256:574be92b1c38d60b011107ed8ecf56b26fc10751ebc86f8b4188a0133e5b92c6", size = 247715, upload-time = "2026-08-30T17:06:11.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/f0/3fe8f8f6f0086e358f02dc6f2d6eab2bc683d3833afe998d019461485b8e/aioesphomeapi-46.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fa7a61ae21d63b7433503f5b2d130ce2e5c69656f174466b8f83841c0803264b", size = 645759, upload-time = "2026-08-30T17:03:28.794Z" }, + { url = "https://files.pythonhosted.org/packages/ed/80/92d7641eef1c7385f590aa875377294f425ac5c29a8dad5c89007b02ffa7/aioesphomeapi-46.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87d05bd012c1c3f328902556cb9bf361f59a447182f20574e2c4556852026310", size = 629664, upload-time = "2026-08-30T17:03:31.326Z" }, + { url = "https://files.pythonhosted.org/packages/c6/6c/700c91f9ca69c5cc27b69545b6e83023cb2a43eea9c99f8425e360768d45/aioesphomeapi-46.3.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3528998f4959249c3a50ea5bf0944f72dca40d7536364c23ca3c9cf469c8635a", size = 797502, upload-time = "2026-08-30T17:03:33.169Z" }, + { url = "https://files.pythonhosted.org/packages/e1/18/92d1bd10f683b21a1f9612c63fcfec85bea663ec3aebc8c08c1951dbcb15/aioesphomeapi-46.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99bf9e95709573de6c26c0981845607c18a2e97f611107ea478522eaeda3365c", size = 740330, upload-time = "2026-08-30T17:03:34.702Z" }, + { url = "https://files.pythonhosted.org/packages/2c/16/26402f7fb092441194d3338baccdcb1968b3cf27670c3c747fdd76a66365/aioesphomeapi-46.3.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4284a628fa20f7c7d332644e1145ba6bbc07504cc2090c826c7603e100aff8c7", size = 707224, upload-time = "2026-08-30T17:03:36.208Z" }, + { url = "https://files.pythonhosted.org/packages/a8/8a/64a54b577d419c60b27644a1d67a5117343f0ba187512d28bf5fdbf6d78d/aioesphomeapi-46.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:71bf448569a1f0a5cec1c264854054d853f16c23fa635ccf6add49b20f0ac497", size = 766295, upload-time = "2026-08-30T17:03:37.947Z" }, + { url = "https://files.pythonhosted.org/packages/5e/43/67609aecc2bb594d2498b0a66e524cf4088ac67bad49d536324a3b6fb785/aioesphomeapi-46.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:52a75952c6105f241bd3586ad72910df7f65e7d64758137db60f7a15b18b4f4f", size = 746252, upload-time = "2026-08-30T17:03:39.544Z" }, + { url = "https://files.pythonhosted.org/packages/80/73/bf9c0cdb3056f616c12d9d6abd6901ece28a301ccb2e62db24fb5139b60a/aioesphomeapi-46.3.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2a83c3342e9296b58bb82d97a00274fee128b10c1a44c50dc66e541cc24815cc", size = 708545, upload-time = "2026-08-30T17:03:41.237Z" }, + { url = "https://files.pythonhosted.org/packages/39/a0/6d212f495a77aa52a7dc523b0ba94f885896e1f78e08fea702bb4db7b439/aioesphomeapi-46.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fe50b5b2d110651a6f005a55987f5609ef1fa8363e693094f1fc5faa047a321f", size = 808521, upload-time = "2026-08-30T17:03:43.033Z" }, + { url = "https://files.pythonhosted.org/packages/47/b3/363cd15b8ac85ca9b408f3e36e00ae4165953ad856fef361e07508512e06/aioesphomeapi-46.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a0dae117faead1d7119c7c558d7713b51436e8c651caba018d3fdbc1c4a05c7", size = 773766, upload-time = "2026-08-30T17:03:44.509Z" }, + { url = "https://files.pythonhosted.org/packages/6d/39/af91af6326d880a1ae1cad59e5fdb4f07bff28d2adc37a4f6e5196b1ae89/aioesphomeapi-46.3.0-cp311-cp311-win32.whl", hash = "sha256:1423cfd16473c8947f4a3e7890f2d5d09866f32477d3d4fc2933fab57541b2a6", size = 535467, upload-time = "2026-08-30T17:03:46.377Z" }, + { url = "https://files.pythonhosted.org/packages/70/e5/ad13b80dc892988c658a0090b92b3440d258e63ca0032538259e9b2e39a7/aioesphomeapi-46.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:c2784b1b1779a518fd7611cbe74af96d9c41f88081917e94f219dae77d42834c", size = 599310, upload-time = "2026-08-30T17:03:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/2f/ec/57d934acc794ceb8661b5bfcd3491b765676f240630164f7691ddfa4c3f4/aioesphomeapi-46.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2b3adb23e3f4552fb9c1ed4188878f796daee4a2ca4469694a0bc4c53ca13f9", size = 653135, upload-time = "2026-08-30T17:03:49.803Z" }, + { url = "https://files.pythonhosted.org/packages/32/88/e8d12789735219af66cd771fad98e6ddd4f60fac058f334ef1233df38cf0/aioesphomeapi-46.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:941c14e28f514245da0807d1f683be6010fac7cc4606feb6588c3087b8f8aa31", size = 635982, upload-time = "2026-08-30T17:03:51.478Z" }, + { url = "https://files.pythonhosted.org/packages/39/19/21f7bd3fec4aa52812d3150be4543600e8171039978c6aec39e96eeff599/aioesphomeapi-46.3.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:98b7fd0f336a97857c7d980f3a3d3330fb3d95fb7d58fb62ea1e9039c53ea1ec", size = 774681, upload-time = "2026-08-30T17:03:53.18Z" }, + { url = "https://files.pythonhosted.org/packages/63/44/0b7213c22ff849dbe3703e04cf9f2e5793ab854b58ec39d05d59f9593008/aioesphomeapi-46.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7a438a5085786562f2201229a6a1409d3f5ff4fbf3cbce2e201bb28f2a18551", size = 714595, upload-time = "2026-08-30T17:03:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/4e/44/b35a2e55cca78e0189347732276bb38f20f6b37227bb2f46771558e30764/aioesphomeapi-46.3.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:32ef378cff0a4303d6d85c5bf0ecd0561a87e6e8c476f3619b2158b1351f85a7", size = 700900, upload-time = "2026-08-30T17:03:56.072Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fd/d44bd4efe72dded9efa14bdb8f6ffed4f400e9e1074fdf3fad9f3db4bedb/aioesphomeapi-46.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2681fd297fd2632b4b63850e0aa28bf6d29f900802503b8a3b5b6618444b6dbb", size = 747325, upload-time = "2026-08-30T17:03:57.696Z" }, + { url = "https://files.pythonhosted.org/packages/c9/22/8042c3f5b918a88662c6ef11e5174e59b215d67ecebddc3c9075fd003aeb/aioesphomeapi-46.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ebfc484b909f4020f27ebc50edf15cc8139fec5f648f242514b267f79e289c9a", size = 721342, upload-time = "2026-08-30T17:03:59.576Z" }, + { url = "https://files.pythonhosted.org/packages/e2/35/bfbc6d15d31a4d510600acef90b84ec9c661331109a06365b6935fb0921d/aioesphomeapi-46.3.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:945d2b593c582bdf6427e431f31abb1b58271fc07a59fd4c16e0eeb1b8260eea", size = 697331, upload-time = "2026-08-30T17:04:01.273Z" }, + { url = "https://files.pythonhosted.org/packages/dd/13/f28981b8c9fc26a990bd461c49caa2391cd6cd778fe91bf48ef77da6447e/aioesphomeapi-46.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:70eb70d9b561dbd075bf103813c213f51b2ce0b1dc9b71dc3755ef3f9d3ac4b1", size = 784211, upload-time = "2026-08-30T17:04:02.862Z" }, + { url = "https://files.pythonhosted.org/packages/a5/c0/e57d024c8630fe8faf278af7980ee15a6c36ef0049bad334f851cb6bf80b/aioesphomeapi-46.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:025763b89f65574ecc84a60b1c06c13a4cc096b310301b772065f8c56730f7de", size = 754744, upload-time = "2026-08-30T17:04:04.477Z" }, + { url = "https://files.pythonhosted.org/packages/ac/fd/e0b4dce97cf33f6c15a44989fb511cfecda3a8068fd1cd24079b38abbad5/aioesphomeapi-46.3.0-cp312-cp312-win32.whl", hash = "sha256:8799ee56a6dddf5b1ef6fe16b7dc2e841099c8e4bcb9f2bb71872841f470014a", size = 529093, upload-time = "2026-08-30T17:04:06.015Z" }, + { url = "https://files.pythonhosted.org/packages/cb/fe/7a74368ec8d83a9a4dc11a84408e8055a414309461cb6403b8de03879ff4/aioesphomeapi-46.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ad1acfada9da60bb224dba61c51cacdd409c3cb2ef448996bbb2aa93ca05248", size = 589142, upload-time = "2026-08-30T17:04:07.715Z" }, + { url = "https://files.pythonhosted.org/packages/51/c0/c68750e5d024f64a93459f415919d4f37198dce875fbddd6654f27639eae/aioesphomeapi-46.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bb5a54f98a12add88f5c5b017457650a77c803075e75150e540a392c9fb02ce0", size = 648070, upload-time = "2026-08-30T17:04:09.398Z" }, + { url = "https://files.pythonhosted.org/packages/03/f6/bc6a8f449757f1e74c89c847acd3516a95bf9bc986772f59434b75172b72/aioesphomeapi-46.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04687a737359a0cb78aaa3a9a0c6d2eb53375de96508a6d80c9c723286a784e1", size = 630302, upload-time = "2026-08-30T17:04:11.006Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b4/bb0986916aab372c3da5d93a6dd8b27e86e6aecd8aa362b3a7e8445797e3/aioesphomeapi-46.3.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:54066d02d7fed1350e65f3f7d338f9db7aeac96bf57ae34538c7ed2a30eac325", size = 768040, upload-time = "2026-08-30T17:04:12.716Z" }, + { url = "https://files.pythonhosted.org/packages/2f/b3/e6d8c408ad10eb48e83feec73c0ee1711ca319765723449bbdaeabb551bb/aioesphomeapi-46.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03b6b15be028a807f6c985847f61a3d8c8ce2d99c9e4a704a8eb04ef69544cc5", size = 711445, upload-time = "2026-08-30T17:04:14.467Z" }, + { url = "https://files.pythonhosted.org/packages/1c/08/9e2c21616a3d0fe3ba93e285359d394d827449e1db73bd210c011025fc10/aioesphomeapi-46.3.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a1466108734f9602d4d7059339450c319907d7cd60963f868f5f4000d8ec0f49", size = 694180, upload-time = "2026-08-30T17:04:16.239Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/9c20f3f891470a88305b143c7ed7fda077fe21198f0451e1b4b4f537f994/aioesphomeapi-46.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcf3cffba34921a3f33d43269dda32d51bc8625c8369d362617bf721026ee526", size = 741602, upload-time = "2026-08-30T17:04:17.812Z" }, + { url = "https://files.pythonhosted.org/packages/46/40/559eeeee8be9788996f401f938ab98d52d02d40dd524d73cba8f7686461e/aioesphomeapi-46.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c1e7c8f8215ca12d5ff2a280a9924b636ab97f4c356e69b17ed65c43d18727eb", size = 718622, upload-time = "2026-08-30T17:04:19.649Z" }, + { url = "https://files.pythonhosted.org/packages/ee/33/714850499699a71b4cf77d98a348e2f5ea95f8abc5721250c7e37d6e9cd4/aioesphomeapi-46.3.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:1a079d46283d43c4706cbfbb07d601a505fe905900b2ed93243e87aa6809fa15", size = 692048, upload-time = "2026-08-30T17:04:21.232Z" }, + { url = "https://files.pythonhosted.org/packages/d3/84/08af58d7f12a90b0f670782f4d18b61c93e901f3bb184c2dd8016b80e2d8/aioesphomeapi-46.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:389dce51a91766755e775dc6a9799ad71cda11f600a220e512ecea6ebe8f93c6", size = 778388, upload-time = "2026-08-30T17:04:22.909Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3f/b925052ae38fd19e8318daaa191fe458f2916aa9747b7144e47e0bcf66ce/aioesphomeapi-46.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fbfbf522a32217cebd25d45096e78baca90cbd03f1cb072df3128e953a5b2eb2", size = 750778, upload-time = "2026-08-30T17:04:24.716Z" }, + { url = "https://files.pythonhosted.org/packages/63/5c/08e3e63df7d57f59fed278fdd593e4b0ab50c11fce14b9820ea861e317d0/aioesphomeapi-46.3.0-cp313-cp313-win32.whl", hash = "sha256:032bf22f3415ab690aaa59b6d47f1ab75a7a65fa6747d987733031592a22b714", size = 526819, upload-time = "2026-08-30T17:04:26.788Z" }, + { url = "https://files.pythonhosted.org/packages/13/bd/4550edfd950089d5a8298ea19a8a98b161dbb94a093ff74e81291edeb7d8/aioesphomeapi-46.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:e0b15d81842615ee83e147588147a46f5c5bd8a1d7b101b2125b2a4454b9078a", size = 585166, upload-time = "2026-08-30T17:04:28.513Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e4/bdc759447e48f9c5d2c42d4e2e0feff8d88a71f96681a8b43fd0aed69d98/aioesphomeapi-46.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9c788dd3ccb9c137bb4b6decff7889fede91f3d302c49816d3dfa5f65627cc89", size = 652221, upload-time = "2026-08-30T17:04:30.432Z" }, + { url = "https://files.pythonhosted.org/packages/60/b1/e11ac32a6a0af92e06407e2694a5e02e4bf871836ac6baae194a2b39adc7/aioesphomeapi-46.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e0e18829403acb740c683ef56afa3e4c68f8290b541c1ae5b19b34ee665cb53e", size = 637085, upload-time = "2026-08-30T17:04:32.329Z" }, + { url = "https://files.pythonhosted.org/packages/ee/e4/d8da44fb4dbb69eccafe19e367b7e4c0f043d33c9e829a177b639b41b818/aioesphomeapi-46.3.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:36521ef444c5abe72d8991fb156126b9e8e37571d8cc1ff6450f2186f57aceb9", size = 769461, upload-time = "2026-08-30T17:04:33.968Z" }, + { url = "https://files.pythonhosted.org/packages/8d/3c/f84b1c8ffef5e4f2a7e15b8d0c85c34b4bfc766a2bbf393a3f86aca2e77b/aioesphomeapi-46.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:844bea34c0acbd1db837d3fdc38f92ca4a933770bbcde8518378ca21e2faebe9", size = 720317, upload-time = "2026-08-30T17:04:35.79Z" }, + { url = "https://files.pythonhosted.org/packages/8a/02/17dc502b736d36d43dbf32a32b49b3a97cff206f5244d70f54a06b6345c7/aioesphomeapi-46.3.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b0b73dff7bf25e580b93f193e7fe0b114ec5ec22203351833940f91ca845600f", size = 687583, upload-time = "2026-08-30T17:04:37.967Z" }, + { url = "https://files.pythonhosted.org/packages/30/60/cf29f6ddf90d894cdd2b0bf8c2d3b062033327c2115308b1fbec8d2537de/aioesphomeapi-46.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cae2da40b6a5f9c6769821131fafb0564c53b6612b9dbe20986d35c1943755c0", size = 745825, upload-time = "2026-08-30T17:04:40.099Z" }, + { url = "https://files.pythonhosted.org/packages/08/4e/98550985a0c2f1a6a2e130f641c817f20fbb03908bbffb8a55401aa207a4/aioesphomeapi-46.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:094931aace52d77495c7fb22f05560233f608590cc60778b9ff2b2be0e47a9f0", size = 727791, upload-time = "2026-08-30T17:04:41.95Z" }, + { url = "https://files.pythonhosted.org/packages/65/68/1ad8031c2e28c79f7005f68655ea3e618bf782fe78ba630d5bc1853b7978/aioesphomeapi-46.3.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:e7e33678b49618aaf38ebd2078a18af2b897842ef697427203e1312515b2a855", size = 684494, upload-time = "2026-08-30T17:04:43.798Z" }, + { url = "https://files.pythonhosted.org/packages/bc/25/601d814dbbb2d2e78d688aba99c71bd7922e19018e47b2ca4890f9f5fafe/aioesphomeapi-46.3.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a7ed526d22cd4a1035e6f0371bb4237b676aeeb2458c766d53b5340d0865d924", size = 780069, upload-time = "2026-08-30T17:04:45.728Z" }, + { url = "https://files.pythonhosted.org/packages/c0/53/1399e29d3bc3d0cae9c28c84bb3c8d49f2b2ee72330c9af96e62cbca46e0/aioesphomeapi-46.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7874d18b9ac60f7586137f281d299cfa2c60010723b55c45c77876f71f9af479", size = 753361, upload-time = "2026-08-30T17:04:47.618Z" }, + { url = "https://files.pythonhosted.org/packages/36/61/5f5bb406e7eb76a7f591ef64c9ecd7f1bcff3b0ccaa9e758eb438b7ff79c/aioesphomeapi-46.3.0-cp314-cp314-win32.whl", hash = "sha256:789ac9ef4c8e8bf3c05aac0b6a5aa436ca0f7b4874cb2a6b376d21f5a228127b", size = 535779, upload-time = "2026-08-30T17:04:49.375Z" }, + { url = "https://files.pythonhosted.org/packages/be/ba/f4f1002c742474a497af1b1289ef0621460f6293d1d36c13e75499b07f2a/aioesphomeapi-46.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:74c9728cbd9b7a1f10e7b89709d29f84ff4a9604d99c7bff024d85f7ca7c08f0", size = 598562, upload-time = "2026-08-30T17:04:51.135Z" }, + { url = "https://files.pythonhosted.org/packages/86/c6/aa7afbc68a93fc70aa6197c1e0172a9f5275c36834675a944e5fcdd554a3/aioesphomeapi-46.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d40129eba86f73e699fa83e888c90ecfd790238f1d923fbc0e3aa071abb329b0", size = 687337, upload-time = "2026-08-30T17:04:53.121Z" }, + { url = "https://files.pythonhosted.org/packages/73/0a/8f4ab9b7f31148bada9c86da9d2b0b06752ec3b84d1c73ecbe7af2d68145/aioesphomeapi-46.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cc987e25789ba3974faba74c47a6ef3b1f1f5b9bec5c41cd657614ed219f443a", size = 683021, upload-time = "2026-08-30T17:04:55.321Z" }, + { url = "https://files.pythonhosted.org/packages/03/ba/c0a375db66bf46441cb7a163d68f9cba2e539350eb61321d8ce33680b9d2/aioesphomeapi-46.3.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:07c9c909c8a01371bd6272014e1a06b4b068f9f5711e5938084b9d71056cb0f3", size = 770562, upload-time = "2026-08-30T17:04:57.457Z" }, + { url = "https://files.pythonhosted.org/packages/51/f8/619cb5bd94e41945c9e5c459e3bb25aad00861458d7cbc0238df582f8cdf/aioesphomeapi-46.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a32fb32a3fc4cd201b1df5dbfad3e69a087c95892f06f641dd653796cec5b16c", size = 739089, upload-time = "2026-08-30T17:04:59.356Z" }, + { url = "https://files.pythonhosted.org/packages/7c/72/974e4bf3ca191edd2a178c99027645f0f336dcce3b6ed543cd8a937033da/aioesphomeapi-46.3.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1139fa23a1ce1b42694d43000b57d076b17b1c3c5889dde98f733aa745c93e5e", size = 680939, upload-time = "2026-08-30T17:05:01.386Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a6/54192de8a902ef036b9baa3182a107e0d7d5dd3f75b43afa80b72e0134c4/aioesphomeapi-46.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35840f75c0eee4ec92d86dfcec377b7a2f64b5bf433041796daa841b9cdf430", size = 753980, upload-time = "2026-08-30T17:05:03.37Z" }, + { url = "https://files.pythonhosted.org/packages/63/e0/21cf962d31234844c14cfa9556d2ee6769cedd3486bb686b612865d46588/aioesphomeapi-46.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ff076cb8b5ddc7c491c489866a328db3de780f494dfd60cc086b8c83e19650f0", size = 747419, upload-time = "2026-08-30T17:05:05.247Z" }, + { url = "https://files.pythonhosted.org/packages/38/c4/a4993069eaa3b3d6b8c286ba5b12e12da66d17612dedb98cddd782e58baa/aioesphomeapi-46.3.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:9f56631626e49d9b5b014eaaac61b524737526b6827f4680ca42631046aac517", size = 698497, upload-time = "2026-08-30T17:05:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/3e/59/50628e25218440b4591ae2304363565809eff6287b4d387c917437883ee0/aioesphomeapi-46.3.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:1813bf2454a6baf071664585f2827a45fe15f5504dd103910c3aa14dbdc23685", size = 784055, upload-time = "2026-08-30T17:05:09.083Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b0/4ae0bfa51d05988d100bc6eb7e40c9817d7a1101c602cf6bf95a621990ba/aioesphomeapi-46.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d073089f7d92c53e5bf4be6d59f4ca65ba005c5510494691cd07a02ffa43ca7c", size = 762921, upload-time = "2026-08-30T17:05:11.294Z" }, + { url = "https://files.pythonhosted.org/packages/52/fb/40a245e219c4ea0bf506f86fc184ea0540c558cf85a2a98a270fc8431805/aioesphomeapi-46.3.0-cp314-cp314t-win32.whl", hash = "sha256:9d66008cae81c2e934890c85ee477d65038deeced60be65a9b40cd533faa5471", size = 580076, upload-time = "2026-08-30T17:05:13.418Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ed/2245b50845e2662c81bb0868c9da506381bd77384d94badc9a2ceb5c51b0/aioesphomeapi-46.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4506afa00db83bd40846a9b94d733485056605f20086c09e377cc56d9e8bf493", size = 642205, upload-time = "2026-08-30T17:05:15.427Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ef/98c65b3168694562c94c8d7edd3ddfc3f4e4747800bc251fbc95df3c07da/aioesphomeapi-46.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:5efb03b9a4444c58a860c4d18e5750ebc062da7dda11f58a7f98d08a8e35ec0e", size = 650069, upload-time = "2026-08-30T17:05:17.534Z" }, + { url = "https://files.pythonhosted.org/packages/4f/10/4086d2d756b0f92980a67579e0187ca3c24002245c7bc5ace5f99cc98bcf/aioesphomeapi-46.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:0329b369fb5be19cd2c49e746cadc85ddcda544702f7b3ef5f5b6350ae90ef31", size = 633946, upload-time = "2026-08-30T17:05:19.563Z" }, + { url = "https://files.pythonhosted.org/packages/25/4f/6d7c7edde64fc8c06573365aa39730e748524c59d68e9af6dd4ef513bd71/aioesphomeapi-46.3.0-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6331a2203ec684728fb76e4dc64ec9e96211c7f8267da21238944ddfe891bc20", size = 724385, upload-time = "2026-08-30T17:05:21.524Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ad/0c2a45b2f2aefe7d8a0cee7c53856fd027e03bf42f60bbca6dd5e70fb583/aioesphomeapi-46.3.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:42c448337faa2ea1012907cb2bb3dd244c00f4b28189d7371b9cfbbcdefa7200", size = 720463, upload-time = "2026-08-30T17:05:23.672Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ae/d7adbf136c46c25be76272d5098fe469dd777cff5160e2c9fcdefd1e2914/aioesphomeapi-46.3.0-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c58ff085e6adaa38f554fad92aba4ccd729191efd4522ff2e99fcc59fd7ca336", size = 726957, upload-time = "2026-08-30T17:05:25.981Z" }, + { url = "https://files.pythonhosted.org/packages/3c/84/f2ab557ab9b681ca3f8fafe1b1916898d2242dd15e6190cb958bea09ab66/aioesphomeapi-46.3.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9c9098d71a0e1a8f95e1d394eaf00ae921f68aaac756dd5ee18316b7ada3f06", size = 750369, upload-time = "2026-08-30T17:05:28.203Z" }, + { url = "https://files.pythonhosted.org/packages/83/e5/a22539d5b778c224c947176a5fc1f210f0e49f8d1a98da686bb939e1eb3c/aioesphomeapi-46.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:b5213da9bca30f2bcb5e1eed5c57d7ab4e77877a054771215c66a37bcbeb7e93", size = 728327, upload-time = "2026-08-30T17:05:30.262Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a1/bb5de33e3a3309ed66175e6a7fe4126661123ddc0030efd4eb1db89a5d8b/aioesphomeapi-46.3.0-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:7770721b41cbb6761550752812d58718d0a0f22059c4d31e263b0e99aeeb0784", size = 719886, upload-time = "2026-08-30T17:05:32.33Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9e/9a4776ac56faf096705e0dd26ba4d5fc05bcc1e7852af39a810af7305b0b/aioesphomeapi-46.3.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:d50a23d2bba99711514b8507a9dd731c0dfc26486588b9327891e9e8603ecd4e", size = 736847, upload-time = "2026-08-30T17:05:34.489Z" }, + { url = "https://files.pythonhosted.org/packages/f5/12/6017520496dd06337906c58da6600eb08877833692a76740fff191508a4c/aioesphomeapi-46.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cfd71c4f497cc8d2b2afb4e3c93c60c426f539948c570e6f75b1224a5987f6a2", size = 757667, upload-time = "2026-08-30T17:05:36.547Z" }, + { url = "https://files.pythonhosted.org/packages/d1/3a/0a4825173277a0d372b14cdf93a73aa2108c348e669c064d1e77e5acaeca/aioesphomeapi-46.3.0-cp315-cp315-win32.whl", hash = "sha256:7d9f3fecc2f4f15b2e19e3fac36d71c7e6ac17baa72ff3340c43e463c612b801", size = 535081, upload-time = "2026-08-30T17:05:38.738Z" }, + { url = "https://files.pythonhosted.org/packages/65/f7/37a3e1d263525de1ec8f61625c5bdc433f25cd6963c018cfa068f5f5dd0d/aioesphomeapi-46.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:7cbd8ee2e7fab2dd3a331ebd99781a7e8490ea05926f98ca7d5f962859610162", size = 597637, upload-time = "2026-08-30T17:05:40.871Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8b/176fa2554c256973896b197a8a8d57fa1dd7842fbb2ffde7493feacbf93b/aioesphomeapi-46.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:1ed605aa9988295a4fe3d6b2e16d52fbd272cb539689f7a8fb2e92dbc5206639", size = 681270, upload-time = "2026-08-30T17:05:43.1Z" }, + { url = "https://files.pythonhosted.org/packages/80/0d/f60efa86e4e667514844c6221b94f994a5b4f50c75bbc6198cbffb4c8d87/aioesphomeapi-46.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:d107cb1a900ce2b589ca52eea8d0cca2138135f4bf5ddcc733852398a2293106", size = 677580, upload-time = "2026-08-30T17:05:45.392Z" }, + { url = "https://files.pythonhosted.org/packages/0a/36/c822919499a569a2e2c46f7a13d3e8775f6dfcea67295cacbbbe903f33a2/aioesphomeapi-46.3.0-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:76736bd345987a4f297a8e1ac48ec91951beae5656273e35eb5b52878d3893bd", size = 729884, upload-time = "2026-08-30T17:05:47.555Z" }, + { url = "https://files.pythonhosted.org/packages/3e/00/bd63518c01ecb3ec30dc2f2e0fc45c935c54c1c67fac464b13c2430b475e/aioesphomeapi-46.3.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1db41279e916ce9c7dce1d0f045d09d5b66169a0f263754109fc3a586ba765ff", size = 735994, upload-time = "2026-08-30T17:05:49.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/00/121ec8131a2e376fe1cc1eaac0c3f1703278b7186b14b8746854f9570dbf/aioesphomeapi-46.3.0-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:331e8c639a637af80235ef953faef6967b5437b613678c8aa79572c807473e1b", size = 712396, upload-time = "2026-08-30T17:05:52.365Z" }, + { url = "https://files.pythonhosted.org/packages/e9/bd/5668e3f421e4b828016d04d1ae85384a7c816250ad6d7509d255d0a37a54/aioesphomeapi-46.3.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:badf5e5b4f839494f0e24a7339e867cd5477490babd6d614486240641dca765e", size = 752087, upload-time = "2026-08-30T17:05:54.657Z" }, + { url = "https://files.pythonhosted.org/packages/cd/47/4a658b5a850e9572bbed8eb17a67e5f141a869a67fa8025480e97dc8ac30/aioesphomeapi-46.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:07612cd5d64be6c913fd44e04f4afbd89a27dd8cf8fe00e4d7d5aafd0afc7343", size = 745035, upload-time = "2026-08-30T17:05:57.494Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5b/f9bc29686bcf22cca25333bbf7789f793b062e368c4599522d1444ff53c0/aioesphomeapi-46.3.0-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:33fd3f29486f0c5281442410102b8604177cabbaad78cd7191ef61b9b7a74e97", size = 732940, upload-time = "2026-08-30T17:05:59.754Z" }, + { url = "https://files.pythonhosted.org/packages/c6/46/64c566383db2ebc34ad615094ce2efd29637efebcefa248625850068a4c5/aioesphomeapi-46.3.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:d07cd3109a8fc7220c8a00628f31ef8efb8571cd18da1ae2b2ce222cbea252ed", size = 742662, upload-time = "2026-08-30T17:06:02.088Z" }, + { url = "https://files.pythonhosted.org/packages/07/e5/b25fc20b4a6d6c99be44323fb7e7493fe796b73ff819c8285533e8f79ebe/aioesphomeapi-46.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:107b6f12888c1c36992e93d2d85187318ae187572e9321c7dc16067cf722fa75", size = 761522, upload-time = "2026-08-30T17:06:04.506Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ff/80dbcb6733255cdccc8a086d9a4a6c45f2b08c8dcc2413037479d61954ef/aioesphomeapi-46.3.0-cp315-cp315t-win32.whl", hash = "sha256:942a9b2b5db185fe65a977a0dab53e05d90221341053c2afbbb1387ab77fdcd1", size = 577009, upload-time = "2026-08-30T17:06:06.765Z" }, + { url = "https://files.pythonhosted.org/packages/1b/3d/3ebb5b47d969be4fc062a2ed68a945e4efde4bc54944962d2be743674ad2/aioesphomeapi-46.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:4cc02107a670172a6a8d95b79a3b3d7be9ba798cf0906c31b7a6fb7c82646cef", size = 636788, upload-time = "2026-08-30T17:06:09.102Z" }, ] [[package]] @@ -1438,8 +1438,8 @@ esphome = [ [package.metadata] requires-dist = [ - { name = "aioesphomeapi", marker = "python_full_version >= '3.11' and extra == 'dev'", specifier = ">=46.0.0" }, - { name = "aioesphomeapi", marker = "python_full_version >= '3.11' and extra == 'esphome'", specifier = ">=46.0.0" }, + { name = "aioesphomeapi", marker = "python_full_version >= '3.11' and extra == 'dev'", specifier = ">=46.3.0" }, + { name = "aioesphomeapi", marker = "python_full_version >= '3.11' and extra == 'esphome'", specifier = ">=46.3.0" }, { name = "async-timeout", marker = "python_full_version < '3.11'", specifier = ">=3.0.0" }, { name = "async-timeout", marker = "extra == 'dev'", specifier = ">=5.0.1" }, { name = "codespell", marker = "extra == 'dev'", specifier = ">=2.4.2" },