From: 
Subject: Debian changes

The Debian packaging of python-aioesphomeapi is maintained in git, using a workflow
similar to the one described in dgit-maint-merge(7).
The Debian delta is represented by this one combined patch; there isn't a
patch queue that can be represented as a quilt series.

A detailed breakdown of the changes is available from their canonical
representation -- git commits in the packaging repository.
For example, to see the changes made by the Debian maintainer in the first
upload of upstream version 1.2.3, you could use:

    % git clone https://git.dgit.debian.org/python-aioesphomeapi
    % cd python-aioesphomeapi
    % git log --oneline 1.2.3..debian/1.2.3-1 -- . ':!debian'

(If you have dgit, use `dgit clone python-aioesphomeapi`, rather than plain `git clone`.)

We don't use debian/source/options single-debian-patch because it has bugs.
Therefore, NMUs etc. may nevertheless have made additional patches.

---

diff --git a/aioesphomeapi/_frame_helper/noise.py b/aioesphomeapi/_frame_helper/noise.py
index 76ff31b..c94693f 100644
--- a/aioesphomeapi/_frame_helper/noise.py
+++ b/aioesphomeapi/_frame_helper/noise.py
@@ -5,7 +5,7 @@ import logging
 from typing import TYPE_CHECKING
 
 from cryptography.exceptions import InvalidTag
-from noise.connection import NoiseConnection
+from noiseprotocol.connection import NoiseConnection
 
 from .._sanitize import MAX_EXPLANATION_LEN, MAX_MAC_LEN, MAX_NAME_LEN, safe_label_str
 from ..core import (
diff --git a/aioesphomeapi/_frame_helper/noise_encryption.py b/aioesphomeapi/_frame_helper/noise_encryption.py
index 166f6a2..5c08e23 100644
--- a/aioesphomeapi/_frame_helper/noise_encryption.py
+++ b/aioesphomeapi/_frame_helper/noise_encryption.py
@@ -5,11 +5,11 @@ from struct import Struct
 from typing import TYPE_CHECKING, Any
 
 from chacha20poly1305_reuseable import ChaCha20Poly1305Reusable
-from noise.backends.default import DefaultNoiseBackend
-from noise.backends.default.ciphers import ChaCha20Cipher, CryptographyCipher
+from noiseprotocol.backends.default import DefaultNoiseBackend
+from noiseprotocol.backends.default.ciphers import ChaCha20Cipher, CryptographyCipher
 
 if TYPE_CHECKING:
-    from noise.state import CipherState
+    from noiseprotocol.state import CipherState
 
 _bytes = bytes
 _int = int
diff --git a/aioesphomeapi/api_options_pb2.py b/aioesphomeapi/api_options_pb2.py
index 1d8ece2..e824f34 100644
--- a/aioesphomeapi/api_options_pb2.py
+++ b/aioesphomeapi/api_options_pb2.py
@@ -7,17 +7,8 @@
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import runtime_version as _runtime_version
 from google.protobuf import symbol_database as _symbol_database
 from google.protobuf.internal import builder as _builder
-_runtime_version.ValidateProtobufRuntimeVersion(
-    _runtime_version.Domain.PUBLIC,
-    6,
-    30,
-    0,
-    '',
-    'api_options.proto'
-)
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
diff --git a/aioesphomeapi/api_pb2.py b/aioesphomeapi/api_pb2.py
index 0de3897..ff1bc44 100644
--- a/aioesphomeapi/api_pb2.py
+++ b/aioesphomeapi/api_pb2.py
@@ -7,17 +7,8 @@
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import runtime_version as _runtime_version
 from google.protobuf import symbol_database as _symbol_database
 from google.protobuf.internal import builder as _builder
-_runtime_version.ValidateProtobufRuntimeVersion(
-    _runtime_version.Domain.PUBLIC,
-    6,
-    30,
-    0,
-    '',
-    'api.proto'
-)
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
diff --git a/aioesphomeapi/timezone.py b/aioesphomeapi/timezone.py
index c14a215..c9015dd 100644
--- a/aioesphomeapi/timezone.py
+++ b/aioesphomeapi/timezone.py
@@ -6,6 +6,8 @@ import asyncio
 from functools import cache, lru_cache
 from importlib import resources
 import logging
+from pathlib import Path
+from zoneinfo import TZPATH
 
 import tzlocal
 
@@ -14,6 +16,26 @@ from .singleton import singleton
 _LOGGER = logging.getLogger(__name__)
 
 
+def _load_system_tzdata(iana_key: str) -> bytes | None:
+    """Load timezone data from the system zoneinfo database."""
+    if iana_key.startswith("/") or ".." in iana_key.split("/"):
+        return None
+
+    for tzpath in TZPATH:
+        zoneinfo_root = Path(tzpath)
+        zoneinfo_path = (zoneinfo_root / iana_key).resolve()
+        try:
+            zoneinfo_path.relative_to(zoneinfo_root)
+        except ValueError:
+            continue
+
+        try:
+            return zoneinfo_path.read_bytes()
+        except (FileNotFoundError, IsADirectoryError):
+            continue
+    return None
+
+
 def _load_tzdata(iana_key: str) -> bytes | None:
     """Load timezone data from tzdata package."""
     if not iana_key:
@@ -29,7 +51,9 @@ def _load_tzdata(iana_key: str) -> bytes | None:
 
     try:
         return (resources.files(package) / resource).read_bytes()
-    except (FileNotFoundError, ModuleNotFoundError, IsADirectoryError):
+    except ModuleNotFoundError:
+        return _load_system_tzdata(iana_key)
+    except (FileNotFoundError, IsADirectoryError):
         return None
 
 
diff --git a/requirements/base.txt b/requirements/base.txt
index 64d70be..e0d8024 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -1,6 +1,6 @@
 aiohappyeyeballs>=2.6.2
 async-interrupt>=1.2.2
-protobuf>=6,<8
+protobuf>=3.20.0,<8
 tzdata>=2026.2
 tzlocal>=5.3.1,<6
 zeroconf>=0.150.0,<2.0
diff --git a/tests/common.py b/tests/common.py
index df633f6..6ea49b9 100644
--- a/tests/common.py
+++ b/tests/common.py
@@ -7,7 +7,7 @@ import time
 from typing import TYPE_CHECKING, Any
 from unittest.mock import AsyncMock, MagicMock, patch
 
-from noise.connection import NoiseConnection  # type: ignore[import-untyped]
+from noiseprotocol.connection import NoiseConnection  # type: ignore[import-untyped]
 from zeroconf import Zeroconf
 from zeroconf.asyncio import AsyncZeroconf
 
diff --git a/tests/test_lazy_imports.py b/tests/test_lazy_imports.py
index 2662a9d..90d9068 100644
--- a/tests/test_lazy_imports.py
+++ b/tests/test_lazy_imports.py
@@ -14,8 +14,8 @@ from aioesphomeapi._frame_helper.noise import APINoiseFrameHelper
 
 # Modules that must only load for encrypted (noise) connections.
 DEFERRED_MODULES = (
-    "noise",
-    "noise.connection",
+    "noiseprotocol",
+    "noiseprotocol.connection",
     "chacha20poly1305_reuseable",
     "cryptography.hazmat.primitives.ciphers.aead",
     "aioesphomeapi._frame_helper.noise",
