python-izone 1.3.9__tar.gz → 1.3.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_izone-1.3.9 → python_izone-1.3.10}/PKG-INFO +3 -3
- python_izone-1.3.10/docs/release-notes/v1.3.10.md +15 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/controller.py +47 -2
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/discovery.py +2 -4
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/version.py +2 -2
- {python_izone-1.3.9 → python_izone-1.3.10}/pyproject.toml +1 -1
- {python_izone-1.3.9 → python_izone-1.3.10}/scripts/izone_v1_probe.py +5 -5
- python_izone-1.3.10/tests/test_control_zone.py +66 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/uv.lock +44 -44
- {python_izone-1.3.9 → python_izone-1.3.10}/.gitattributes +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/.github/workflows/main.yml +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/.gitignore +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/.pre-commit-config.yaml +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/.python-version +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/.vscode/.ropeproject/config.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/.vscode/extensions.json +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/.vscode/launch.json +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/.vscode/settings.json +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/README.md +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/api_docs/AC-DOC-1401-11_iZoneEthernetInterface.pdf +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/api_docs/iPower_JSON_datastrings_Out.h +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/api_docs/iZone_JSON_datastrings.h +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/docs/release-notes/v1.3.4.md +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/docs/release-notes/v1.3.5.md +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/docs/release-notes/v1.3.6.md +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/docs/release-notes/v1.3.7.md +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/docs/release-notes/v1.3.8.md +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/docs/release-notes/v1.3.9.md +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/licence.txt +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/__init__.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/const.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/exceptions.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/power.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/py.typed +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/types.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/pizone/zone.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/scripts/check +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/scripts/coverage +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/__init__.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/conftest.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/http_fakes.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/power_data.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/resources.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/test_controller.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/test_discovery.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/test_discovery_api.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/test_dump_state.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/test_fullstack.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/test_http.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/test_power.py +0 -0
- {python_izone-1.3.9 → python_izone-1.3.10}/tests/test_zone.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: python-izone
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.10
|
|
4
4
|
Summary: A python interface to the iZone airconditioner controller
|
|
5
5
|
Project-URL: Homepage, https://github.com/Swamp-Ig/pizone
|
|
6
6
|
Author-email: Penny Wood <pypl@ninjateaparty.com>
|
|
@@ -15,7 +15,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
15
15
|
Classifier: Topic :: Home Automation
|
|
16
16
|
Classifier: Topic :: System :: Hardware
|
|
17
17
|
Requires-Python: >=3.14
|
|
18
|
-
Requires-Dist: aiohttp>=3.14.
|
|
18
|
+
Requires-Dist: aiohttp>=3.14.3
|
|
19
19
|
Requires-Dist: ifaddr>=0.2.0
|
|
20
20
|
Provides-Extra: test
|
|
21
21
|
Requires-Dist: pytest-aio; extra == 'test'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Release notes — v1.3.10
|
|
2
|
+
|
|
3
|
+
**Compare range:** https://github.com/Swamp-Ig/pizone/compare/v1.3.9...v1.3.10
|
|
4
|
+
|
|
5
|
+
## Since v1.3.9
|
|
6
|
+
|
|
7
|
+
### Control setpoint (new)
|
|
8
|
+
|
|
9
|
+
- `Controller.control_setpoint_owner` — the controller, the matching zone, or `None` for who owns the unit target. RAS mode, master with CtrlZone past the configured zone count, or a missing AUTO CTS selects the controller. CONST/OPCL `Temp:0` does not.
|
|
10
|
+
- `Controller.control_setpoint` — that owner's setpoint (°C)
|
|
11
|
+
|
|
12
|
+
### Fixes / hardening
|
|
13
|
+
|
|
14
|
+
- Drop the `Connection: close` / `force_close` HTTP keepalive workaround (core#176536)
|
|
15
|
+
- Require `aiohttp>=3.14.3` for CVE-2026-69244
|
|
@@ -659,9 +659,11 @@ class Controller:
|
|
|
659
659
|
|
|
660
660
|
@property
|
|
661
661
|
def zone_ctrl(self) -> int:
|
|
662
|
-
"""Zone that currently controls the AC unit.
|
|
662
|
+
"""Zone index that currently controls the AC unit.
|
|
663
663
|
|
|
664
664
|
Value is interpreted in combination with :attr:`ras_mode`.
|
|
665
|
+
See :attr:`control_setpoint_owner` for the controller or zone that
|
|
666
|
+
owns the unit target.
|
|
665
667
|
|
|
666
668
|
Raises:
|
|
667
669
|
TypeError: If the cached value is missing or not numeric.
|
|
@@ -669,6 +671,50 @@ class Controller:
|
|
|
669
671
|
"""
|
|
670
672
|
return int(self._get_system_state("CtrlZone"))
|
|
671
673
|
|
|
674
|
+
@property
|
|
675
|
+
def control_setpoint_owner(self) -> Self | Zone | None:
|
|
676
|
+
"""Controller or zone that currently owns the unit setpoint.
|
|
677
|
+
|
|
678
|
+
Returns this controller when RAS mode is ``RAS``, when RAS mode is
|
|
679
|
+
``master`` and :attr:`zone_ctrl` is past :attr:`zones_total` (the
|
|
680
|
+
indoor unit itself), or when any AUTO zone has no room sensor.
|
|
681
|
+
Otherwise the zone matching :attr:`zone_ctrl`, or ``None`` if that
|
|
682
|
+
index does not match a zone.
|
|
683
|
+
|
|
684
|
+
CONST/OPCL zones never have a room sensor; only a missing AUTO CTS
|
|
685
|
+
forces unit control.
|
|
686
|
+
"""
|
|
687
|
+
if (
|
|
688
|
+
self.ras_mode == "RAS"
|
|
689
|
+
or (self.ras_mode == "master" and self.zone_ctrl > self.zones_total)
|
|
690
|
+
or any(
|
|
691
|
+
zone.type is Zone.Type.AUTO and zone.temp_current is None
|
|
692
|
+
for zone in self.zones
|
|
693
|
+
)
|
|
694
|
+
):
|
|
695
|
+
return self
|
|
696
|
+
return next(
|
|
697
|
+
(zone for zone in self.zones if zone.index == self.zone_ctrl),
|
|
698
|
+
None,
|
|
699
|
+
)
|
|
700
|
+
|
|
701
|
+
@property
|
|
702
|
+
def control_setpoint(self) -> float | None:
|
|
703
|
+
"""Setpoint of whoever currently owns the unit target.
|
|
704
|
+
|
|
705
|
+
:attr:`temp_setpoint` when the controller owns the unit target,
|
|
706
|
+
otherwise the controlling AUTO zone's setpoint. ``None`` when there
|
|
707
|
+
is no matching zone or that zone is not AUTO.
|
|
708
|
+
"""
|
|
709
|
+
owner = self.control_setpoint_owner
|
|
710
|
+
if owner is None:
|
|
711
|
+
return None
|
|
712
|
+
if not isinstance(owner, Zone):
|
|
713
|
+
return self.temp_setpoint
|
|
714
|
+
if owner.type is not Zone.Type.AUTO:
|
|
715
|
+
return None
|
|
716
|
+
return owner.temp_setpoint
|
|
717
|
+
|
|
672
718
|
@property
|
|
673
719
|
def zones_total(self) -> int:
|
|
674
720
|
"""Number of zones the system is configured for.
|
|
@@ -1024,7 +1070,6 @@ class Controller:
|
|
|
1024
1070
|
lock,
|
|
1025
1071
|
session.get(
|
|
1026
1072
|
f"http://{self.device_ip}/{resource}",
|
|
1027
|
-
headers={"Connection": "close"},
|
|
1028
1073
|
timeout=aiohttp.ClientTimeout(total=Controller.REQUEST_TIMEOUT),
|
|
1029
1074
|
) as response,
|
|
1030
1075
|
):
|
|
@@ -22,7 +22,7 @@ from types import TracebackType
|
|
|
22
22
|
from typing import Any, Self, cast
|
|
23
23
|
|
|
24
24
|
import aiohttp
|
|
25
|
-
from aiohttp import ClientSession
|
|
25
|
+
from aiohttp import ClientSession
|
|
26
26
|
import ifaddr
|
|
27
27
|
|
|
28
28
|
from .const import PLACEHOLDER_DEVICE_UID
|
|
@@ -301,8 +301,7 @@ class DiscoveryService:
|
|
|
301
301
|
|
|
302
302
|
"""
|
|
303
303
|
if self._own_session:
|
|
304
|
-
|
|
305
|
-
self._session = ClientSession(connector=TCPConnector(force_close=True))
|
|
304
|
+
self._session = ClientSession()
|
|
306
305
|
|
|
307
306
|
_svc = self
|
|
308
307
|
|
|
@@ -680,7 +679,6 @@ class DiscoveryService:
|
|
|
680
679
|
try:
|
|
681
680
|
async with session.get(
|
|
682
681
|
f"http://{host}/SystemSettings",
|
|
683
|
-
headers={"Connection": "close"},
|
|
684
682
|
timeout=aiohttp.ClientTimeout(total=Controller.REQUEST_TIMEOUT),
|
|
685
683
|
) as response:
|
|
686
684
|
if response.status >= 400:
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.3.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 3,
|
|
21
|
+
__version__ = version = '1.3.10'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 3, 10)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -102,14 +102,14 @@ def _req(
|
|
|
102
102
|
*,
|
|
103
103
|
content_type: bool,
|
|
104
104
|
) -> tuple[int | None, str, float, str | None]:
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
if body is None:
|
|
106
|
+
request = urllib.request.Request(url, method=method)
|
|
107
|
+
else:
|
|
108
108
|
data = json.dumps(body).encode("latin_1")
|
|
109
|
-
headers
|
|
109
|
+
headers = {"Content-Length": str(len(data))}
|
|
110
110
|
if content_type:
|
|
111
111
|
headers["Content-Type"] = "application/json"
|
|
112
|
-
|
|
112
|
+
request = urllib.request.Request(url, data=data, headers=headers, method=method)
|
|
113
113
|
t0 = time.monotonic()
|
|
114
114
|
try:
|
|
115
115
|
with urllib.request.urlopen(request, timeout=TIMEOUT) as resp:
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Tests for controller control-zone setpoint ownership."""
|
|
2
|
+
|
|
3
|
+
from typing import cast
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from pizone import Zone
|
|
8
|
+
|
|
9
|
+
from .conftest import MockController, MockDiscoveryService
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pytest.mark.asyncio
|
|
13
|
+
async def test_zones_mode_uses_ctrlzone_despite_const_temp_zero(
|
|
14
|
+
service: MockDiscoveryService,
|
|
15
|
+
) -> None:
|
|
16
|
+
"""CONST/OPCL Temp:0 must not steal control from AUTO zones."""
|
|
17
|
+
controller = cast(MockController, service._controllers["000000001"])
|
|
18
|
+
spill = controller.zones[7]
|
|
19
|
+
|
|
20
|
+
assert spill.type is Zone.Type.CONST
|
|
21
|
+
assert spill.temp_current is None
|
|
22
|
+
assert controller.ras_mode == "zones"
|
|
23
|
+
assert controller.zone_ctrl == 1
|
|
24
|
+
assert controller.control_setpoint_owner is controller.zones[1]
|
|
25
|
+
assert controller.zones[1].name == "LOUNGE"
|
|
26
|
+
assert controller.control_setpoint == pytest.approx(23.5)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@pytest.mark.parametrize(
|
|
30
|
+
("ras_mode", "zone_ctrl", "clear_auto_temp", "owner", "setpoint"),
|
|
31
|
+
[
|
|
32
|
+
pytest.param("RAS", 1, False, "self", 23.5, id="ras"),
|
|
33
|
+
pytest.param("master", 13, False, "self", 23.5, id="master_unit"),
|
|
34
|
+
pytest.param("master", 1, False, 1, 23.5, id="master_zone"),
|
|
35
|
+
pytest.param("zones", 1, True, "self", 23.5, id="auto_missing_cts"),
|
|
36
|
+
pytest.param("zones", 99, False, None, None, id="unmatched_zone"),
|
|
37
|
+
pytest.param("zones", 7, False, 7, None, id="const_ctrlzone"),
|
|
38
|
+
],
|
|
39
|
+
)
|
|
40
|
+
@pytest.mark.asyncio
|
|
41
|
+
async def test_control_zone_ownership(
|
|
42
|
+
service: MockDiscoveryService,
|
|
43
|
+
ras_mode: str,
|
|
44
|
+
zone_ctrl: int,
|
|
45
|
+
clear_auto_temp: bool,
|
|
46
|
+
owner: int | str | None,
|
|
47
|
+
setpoint: float | None,
|
|
48
|
+
) -> None:
|
|
49
|
+
controller = cast(MockController, service._controllers["000000001"])
|
|
50
|
+
controller._system_settings["RAS"] = ras_mode
|
|
51
|
+
controller._system_settings["CtrlZone"] = zone_ctrl
|
|
52
|
+
if clear_auto_temp:
|
|
53
|
+
for zone in controller.zones:
|
|
54
|
+
if zone.type is Zone.Type.AUTO:
|
|
55
|
+
zone._zone_data["Temp"] = 0
|
|
56
|
+
|
|
57
|
+
if owner is None:
|
|
58
|
+
assert controller.control_setpoint_owner is None
|
|
59
|
+
elif owner == "self":
|
|
60
|
+
assert controller.control_setpoint_owner is controller
|
|
61
|
+
else:
|
|
62
|
+
assert controller.control_setpoint_owner is controller.zones[owner]
|
|
63
|
+
if setpoint is None:
|
|
64
|
+
assert controller.control_setpoint is None
|
|
65
|
+
else:
|
|
66
|
+
assert controller.control_setpoint == pytest.approx(setpoint)
|
|
@@ -17,7 +17,7 @@ wheels = [
|
|
|
17
17
|
|
|
18
18
|
[[package]]
|
|
19
19
|
name = "aiohttp"
|
|
20
|
-
version = "3.14.
|
|
20
|
+
version = "3.14.3"
|
|
21
21
|
source = { registry = "https://pypi.org/simple" }
|
|
22
22
|
dependencies = [
|
|
23
23
|
{ name = "aiohappyeyeballs" },
|
|
@@ -28,49 +28,49 @@ dependencies = [
|
|
|
28
28
|
{ name = "propcache" },
|
|
29
29
|
{ name = "yarl" },
|
|
30
30
|
]
|
|
31
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
31
|
+
sdist = { url = "https://files.pythonhosted.org/packages/58/d9/22ce5786ac0c1653ae8b6c23bded02c1686d11f0dbb45b31ce128e0df985/aiohttp-3.14.3.tar.gz", hash = "sha256:9491196535a88924a60afd5b5f434b5b203b6cc616250878dbdb223a8f7844bc", size = 7971213, upload-time = "2026-07-23T01:57:27.037Z" }
|
|
32
32
|
wheels = [
|
|
33
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
34
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
35
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
36
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
37
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
38
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
39
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
40
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
41
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
42
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
43
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
44
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
45
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
46
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
47
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
48
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
49
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
50
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
51
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
52
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
53
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
54
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
55
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
56
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
57
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
58
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
59
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
60
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
61
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
62
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
63
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
64
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
65
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
66
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
67
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
68
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
69
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
70
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
71
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
72
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
73
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
33
|
+
{ url = "https://files.pythonhosted.org/packages/c8/20/887fdcf832326571b370ffc347b3e70abe101096f3720126aac161b1d872/aiohttp-3.14.3-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:49f7325beb0f85ef4aef5f48f490269575f83e6e2acad00a1d80b807eb027062", size = 509067, upload-time = "2026-07-23T01:55:42.618Z" },
|
|
34
|
+
{ url = "https://files.pythonhosted.org/packages/ad/a3/92cec936f78cc4bf0fa5554ebe593b73459d94e3c62303e1902a4cccb6f7/aiohttp-3.14.3-cp314-cp314-android_24_x86_64.whl", hash = "sha256:e3be98a7c30b8c25d573dafba7171d66dfb05ee6a9070fc46535464ff97700a6", size = 514774, upload-time = "2026-07-23T01:55:44.937Z" },
|
|
35
|
+
{ url = "https://files.pythonhosted.org/packages/29/ba/2a0c38df3fc557620b6a5acd98364af050053b6285b4dc7ee74100c63c18/aiohttp-3.14.3-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:614c61d478b83953e261d02bb2df750f17227cd33ef8002945bf5aebbde21919", size = 488134, upload-time = "2026-07-23T01:55:47.135Z" },
|
|
36
|
+
{ url = "https://files.pythonhosted.org/packages/48/d6/d51b7d4bf309af3693940d8ffd2b9ed0b682434ef85959b7c9c137f60cf8/aiohttp-3.14.3-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:1caa7b0d05f3e3a36f87788c59e970a7ee1cefcfcbb924a9f138c4a6551c9cb7", size = 494201, upload-time = "2026-07-23T01:55:49.451Z" },
|
|
37
|
+
{ url = "https://files.pythonhosted.org/packages/3f/5a/8f624384e5f1efabb5229b94157eb966b021e97bdb188c62860c2ae243c2/aiohttp-3.14.3-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:dfa68deb2a443bdaa3ea5297b0699c1464f08aef3812b486d1348eee61b07dc0", size = 502766, upload-time = "2026-07-23T01:55:51.656Z" },
|
|
38
|
+
{ url = "https://files.pythonhosted.org/packages/a6/26/4ff0164370deec18fb19254ee4ab10b7a73304ac0c860b13f5f84663759b/aiohttp-3.14.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:e72ee89e28d907a18f46959b4eb0bb06701cc7f8cf4366e00029e2ccfaaf5924", size = 756557, upload-time = "2026-07-23T01:55:53.964Z" },
|
|
39
|
+
{ url = "https://files.pythonhosted.org/packages/97/a3/7056b86dc0d9ec709ea9777eae3b0161428f943372f8b98c01c11593b682/aiohttp-3.14.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ad4c8b7488d745d2ca4838ebd8ae5ba9b56341d30b1da43640e4ce87f9f49646", size = 510168, upload-time = "2026-07-23T01:55:56.22Z" },
|
|
40
|
+
{ url = "https://files.pythonhosted.org/packages/85/ed/0357a015892fd68058bf2d39d3fd1958e459b997a7db30aaa6aaa434ae96/aiohttp-3.14.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:db332af25642007330fca8be5c4d194caf2bea7a7fc84415aff3497af5dfee6b", size = 512957, upload-time = "2026-07-23T01:55:58.437Z" },
|
|
41
|
+
{ url = "https://files.pythonhosted.org/packages/47/d1/8aba53f15ccb2238405f5e9d30e2a8ca44f93878c26e7165ade00d374b1c/aiohttp-3.14.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25bd2708db6bdf6a6630dd37bdcdfcb47c4434d22ac69c64665b802910140b30", size = 1750149, upload-time = "2026-07-23T01:56:00.856Z" },
|
|
42
|
+
{ url = "https://files.pythonhosted.org/packages/49/bd/40c3fee327529284375c6701cbb0fa4600cc2e8432af1378f897e2ef7d3a/aiohttp-3.14.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:cef89a58e628c4efcac3275c2d68083f82426dcdc89c1492a6f654f9f7ea6ab9", size = 1707685, upload-time = "2026-07-23T01:56:03.371Z" },
|
|
43
|
+
{ url = "https://files.pythonhosted.org/packages/2a/a3/ca0cc6724cca8114b05694abd916060758c79894c3aa5b012cdadc1bc28e/aiohttp-3.14.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c23ec8ee9d5ab2f5421f9c7fffce208435607af27fd46d4a44e031954352838f", size = 1803911, upload-time = "2026-07-23T01:56:05.817Z" },
|
|
44
|
+
{ url = "https://files.pythonhosted.org/packages/95/b5/85b099c299c3ffd38ad9b3e43694c8a346934e4a30c88c4fd5a841234f77/aiohttp-3.14.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e2667f0bbe7eb6c74eae5e9691441ad186e5845ca3cff63230fc09c4e7514f5d", size = 1876929, upload-time = "2026-07-23T01:56:08.413Z" },
|
|
45
|
+
{ url = "https://files.pythonhosted.org/packages/d5/b7/1da684a04175473fa4cddbf9a2f572e79514c3fd27a74597f43057d4f3da/aiohttp-3.14.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18cb43369747b2ae007bd2655fb8e63a099c2ff1d207962943636dac989b3147", size = 1761112, upload-time = "2026-07-23T01:56:10.918Z" },
|
|
46
|
+
{ url = "https://files.pythonhosted.org/packages/d1/16/bc4b55e3e5cb175fd69c53c90d60d2f47797cb343da5106e23863dc4dba4/aiohttp-3.14.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d77640cc618c1d99fc4f8589c0f24a730adfa54eb1e57ef7bf0c8dfb78da898c", size = 1583500, upload-time = "2026-07-23T01:56:13.613Z" },
|
|
47
|
+
{ url = "https://files.pythonhosted.org/packages/2a/e8/13a9d957a1ee40837f46aa30f0f4c657e673ad86a2e6362a9f9be20d26d9/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:53e5179d8abb5710f8e83ba207c41c8d1261fcffd4616500e15ca2b7a33be10a", size = 1713940, upload-time = "2026-07-23T01:56:15.969Z" },
|
|
48
|
+
{ url = "https://files.pythonhosted.org/packages/38/05/d33c680c1bcf1c7e130f9cbfc1fc02fe8bb0c4af2a94a53dd5fb56131e5c/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:cd817772b2fcf2b8c0905795318485f9ec16eae60b29feb7f4c77085311637f0", size = 1724413, upload-time = "2026-07-23T01:56:18.591Z" },
|
|
49
|
+
{ url = "https://files.pythonhosted.org/packages/85/1d/af798d306f7a74b6a632dbcabcf62a4c91391b7582d2a8c6d7712e2cc54e/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4e3ac92d90e92773b2362d506068e9a948192bd553e743c5b2429e28527c8661", size = 1770748, upload-time = "2026-07-23T01:56:21.074Z" },
|
|
50
|
+
{ url = "https://files.pythonhosted.org/packages/a8/92/ad720d472556a995049206867765e9410969684f86ee09423ff9969044c1/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3f42e9b78301f11c8f861746175d8b9c1ccef713fcad9eab396e2f6db8ed4a22", size = 1577564, upload-time = "2026-07-23T01:56:23.475Z" },
|
|
51
|
+
{ url = "https://files.pythonhosted.org/packages/60/ad/0ed7586cbef7a884e23a752fa2bb987a122e6a5dd50dab109258d0a95193/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9d9edccfe496b476db5f398d97b865e9a6752bcf8aec4eef8390ce20fb64bb41", size = 1782080, upload-time = "2026-07-23T01:56:25.994Z" },
|
|
52
|
+
{ url = "https://files.pythonhosted.org/packages/97/ea/dbaed0d73e8a69aad653b045dab451c67c2454bb731a37b45a86593e9422/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c5ec8fb1bcc31a8466f74aaf26c345d5c386fa4bd08a3f0eb9c7a4a3fe8b5bf", size = 1745813, upload-time = "2026-07-23T01:56:28.604Z" },
|
|
53
|
+
{ url = "https://files.pythonhosted.org/packages/81/1b/6893d4bc57e434fc93a6c9217c637d967a0b651d989f6e3265179375754a/aiohttp-3.14.3-cp314-cp314-win32.whl", hash = "sha256:38901a84da3ce22249f6e860bf8f90d141bcab7da090cc398f8bb58c0e44b7da", size = 455872, upload-time = "2026-07-23T01:56:31.031Z" },
|
|
54
|
+
{ url = "https://files.pythonhosted.org/packages/f5/8b/c7baa1ba1eda4db6989baefe5de6d99834921b84ebd7918624febcb9f290/aiohttp-3.14.3-cp314-cp314-win_amd64.whl", hash = "sha256:8b3b60de05f3dcb6f6a00f818bb2ec781cee4de0645f59ccaf99b1d1823b6100", size = 481030, upload-time = "2026-07-23T01:56:33.365Z" },
|
|
55
|
+
{ url = "https://files.pythonhosted.org/packages/22/8c/c29d067df825a2df88ca432db848aa2fe8199598359cc06c12b09320cac9/aiohttp-3.14.3-cp314-cp314-win_arm64.whl", hash = "sha256:1576145bdceeb92382d899751e12743a3a5b8e460a841e3e50543859e54864dc", size = 453669, upload-time = "2026-07-23T01:56:35.731Z" },
|
|
56
|
+
{ url = "https://files.pythonhosted.org/packages/6a/a4/9c033beb355d39b6147980597ec9645e4729243f686ee4dc73945de72030/aiohttp-3.14.3-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:8800c996b01c2772a783e3e46f3e1abd5823029adca0df54231960de9bfefa5b", size = 791403, upload-time = "2026-07-23T01:56:37.972Z" },
|
|
57
|
+
{ url = "https://files.pythonhosted.org/packages/80/ca/87c32a0a7704583cfc49660bd817889bae5b830bf53b5dcb4e92145ac2da/aiohttp-3.14.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ebe8e504f058fe91223351cecd2d9d6946c9d241bb0250d898ffbdf584cc72b0", size = 526413, upload-time = "2026-07-23T01:56:40.523Z" },
|
|
58
|
+
{ url = "https://files.pythonhosted.org/packages/9e/d8/8ec0e471248c500acdce2be3f46db8fb62b5eb60efef072529cc85ee1d26/aiohttp-3.14.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30402d03a7c0ff52bce290b57e564e9079fd9d0cb545c8aba73f86a103162d2e", size = 532135, upload-time = "2026-07-23T01:56:42.876Z" },
|
|
59
|
+
{ url = "https://files.pythonhosted.org/packages/fe/45/f8919fd936e8b79fcd9bda7b6d8e62613462a713f4f17987fd7c34399142/aiohttp-3.14.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9fc7b5bfec6573f3ae844f457fdde5adeb713f8b8e4a81ad64fc207b49383716", size = 1922742, upload-time = "2026-07-23T01:56:45.528Z" },
|
|
60
|
+
{ url = "https://files.pythonhosted.org/packages/f6/ec/9ca76b28a27525b0cc53e20842e0228b022f301ce1f436b7d814b4aaf2df/aiohttp-3.14.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8a5fd34f7f7410d1730d5c2ba873cacb2eed3fede366feb268a70ba22581ed8f", size = 1787371, upload-time = "2026-07-23T01:56:48.045Z" },
|
|
61
|
+
{ url = "https://files.pythonhosted.org/packages/b1/04/6acdbf17315f7b55f1937e3387acb89a3cddeb4995689553d064af8e92ab/aiohttp-3.14.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:270d3dace9ca2f10f0da5d8ebe519b7a310fc6112ed916e32df5866df0888553", size = 1912623, upload-time = "2026-07-23T01:56:50.605Z" },
|
|
62
|
+
{ url = "https://files.pythonhosted.org/packages/86/e6/438b0c79ca6f45eb9fd9817dd4c01a91919a38c0de5ee9e05e2b4dc0ece7/aiohttp-3.14.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3ae5b3a59436d089b5395d910121a390feed4d00578eb95a0fd1a329fe963100", size = 2005515, upload-time = "2026-07-23T01:56:53.153Z" },
|
|
63
|
+
{ url = "https://files.pythonhosted.org/packages/bb/6b/62cbd6577758699525f5c712d1ddef57d9875fbab0ae8d5f5a202fd598f8/aiohttp-3.14.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2498f0fe69ead802f9675beca44a7c21c62fdaa4ec5145ea1c3ad6edbee29f85", size = 1879906, upload-time = "2026-07-23T01:56:55.818Z" },
|
|
64
|
+
{ url = "https://files.pythonhosted.org/packages/00/95/18bcbf830a21dc3aae24d8f6b6feaf3db1d2090242d00a7868db2ffb0b67/aiohttp-3.14.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a0dc483c00da8b673abbb367eb6f8d8f4bcec30eb58529ea13cb42e7fd2dfa33", size = 1675849, upload-time = "2026-07-23T01:56:58.861Z" },
|
|
65
|
+
{ url = "https://files.pythonhosted.org/packages/a9/19/47f4968659c5e23606c3790c80fc624e691c153d036148449ee84d31b287/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c7d3a97c678d34fc5b59da671ee9cd630096ddc643e7b5a30d54a2a6f3574d3f", size = 1843496, upload-time = "2026-07-23T01:57:01.591Z" },
|
|
66
|
+
{ url = "https://files.pythonhosted.org/packages/64/af/38c33c4dd82fddcb4e56c4653b6f1072a8edbc6b7fa15809f14932c41e2d/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f8fb78a83c9e5f741ca3a68cfb455c1f5bb83b4e7249a3848b3cd78d0a8563b0", size = 1827746, upload-time = "2026-07-23T01:57:05.131Z" },
|
|
67
|
+
{ url = "https://files.pythonhosted.org/packages/a1/9d/0537cda4885ac8f5b7053d164dd06312f4c483a4edcb8ee5b8aaf2a989bf/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:74ab5b6a9fb13e873e5a90946588baecaf488745e1db1a4a5c433f971f035098", size = 1853810, upload-time = "2026-07-23T01:57:08.043Z" },
|
|
68
|
+
{ url = "https://files.pythonhosted.org/packages/19/fe/26f9c5e6458385aa86497836b0dea6fb2f027827d63f37c7856cce9286ee/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:bd52f811e65f6fb634b1047159657c98f52b407f8efec907bcfc09da9a4c0a25", size = 1668895, upload-time = "2026-07-23T01:57:10.837Z" },
|
|
69
|
+
{ url = "https://files.pythonhosted.org/packages/ec/4c/618b1db9b9ba079b8875d2cdf78e7c4a3bf72903bd5850fee7dd9544600a/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:f0f177d1b195b9e06376cfd7d308d8a1b920909a609d03ac82a8c73bbb16d3b9", size = 1883833, upload-time = "2026-07-23T01:57:13.672Z" },
|
|
70
|
+
{ url = "https://files.pythonhosted.org/packages/94/c6/bd959bd1e4771f9fd944e9e436224c48c77b018b73b519b5aad346335bcc/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:498c6c623134f8e09a3c4e60bcd607a0b4590dd7dbf08dd40851b27cbb520ccb", size = 1844251, upload-time = "2026-07-23T01:57:16.593Z" },
|
|
71
|
+
{ url = "https://files.pythonhosted.org/packages/5e/19/08d41839658bdd44a0ed2480f3891705ecb487ce28c0dde62c9040c997e0/aiohttp-3.14.3-cp314-cp314t-win32.whl", hash = "sha256:b304db572b4368edd8dda8a2274f73156fe15558fca4a917cb8a09fc47af5963", size = 474180, upload-time = "2026-07-23T01:57:19.306Z" },
|
|
72
|
+
{ url = "https://files.pythonhosted.org/packages/99/5d/3cd6ef0a2b2851f7ab913b5b079334781bd50ff56a323e4454063377a080/aiohttp-3.14.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b20032766aedf6261c7a566585a40867d092ac03a0d81592d5370ef9b054f99b", size = 500528, upload-time = "2026-07-23T01:57:21.762Z" },
|
|
73
|
+
{ url = "https://files.pythonhosted.org/packages/a4/37/cfd1ed540a4d318da025590d96b728e63713c09e9377950fc655dadeb856/aiohttp-3.14.3-cp314-cp314t-win_arm64.whl", hash = "sha256:2e1161602f45a54de2ce0905243a95f58cb42dcd378402f3697f5e0b21e9d2e7", size = 469280, upload-time = "2026-07-23T01:57:24.241Z" },
|
|
74
74
|
]
|
|
75
75
|
|
|
76
76
|
[[package]]
|
|
@@ -576,7 +576,7 @@ test = [
|
|
|
576
576
|
|
|
577
577
|
[package.metadata]
|
|
578
578
|
requires-dist = [
|
|
579
|
-
{ name = "aiohttp", specifier = ">=3.14.
|
|
579
|
+
{ name = "aiohttp", specifier = ">=3.14.3" },
|
|
580
580
|
{ name = "ifaddr", specifier = ">=0.2.0" },
|
|
581
581
|
{ name = "pytest", marker = "extra == 'test'", specifier = ">=6.2.2" },
|
|
582
582
|
{ name = "pytest-aio", marker = "extra == 'test'" },
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_izone-1.3.9 → python_izone-1.3.10}/api_docs/AC-DOC-1401-11_iZoneEthernetInterface.pdf
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|