From a6cfda1a321c64f9eb95ed08d24f7755fb53c1ea Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Sat, 8 Oct 2022 14:25:51 -0400 Subject: [PATCH 1/4] 0.11.0.dev0 version bump --- zigpy_zigate/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zigpy_zigate/__init__.py b/zigpy_zigate/__init__.py index 7e03696..68838e0 100644 --- a/zigpy_zigate/__init__.py +++ b/zigpy_zigate/__init__.py @@ -1,5 +1,5 @@ MAJOR_VERSION = 0 -MINOR_VERSION = 10 -PATCH_VERSION = '1' +MINOR_VERSION = 11 +PATCH_VERSION = '0.dev0' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) From 24b4a2a0efe8f0049f675c3f055197f110558cd0 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Sun, 9 Oct 2022 18:02:01 -0400 Subject: [PATCH 2/4] Fix startup version command handling (#137) * Get rid of `async_mock` * Add a unit test --- tests/async_mock.py | 7 ------- tests/test_api.py | 2 +- tests/test_application.py | 20 +++++++++++++++++--- tests/test_uart.py | 2 +- zigpy_zigate/zigbee/application.py | 6 +++--- 5 files changed, 22 insertions(+), 15 deletions(-) delete mode 100644 tests/async_mock.py diff --git a/tests/async_mock.py b/tests/async_mock.py deleted file mode 100644 index 7d6b494..0000000 --- a/tests/async_mock.py +++ /dev/null @@ -1,7 +0,0 @@ -"""Mock utilities that are async aware.""" -import sys - -if sys.version_info[:2] < (3, 8): - from mock import * # noqa -else: - from unittest.mock import * # noqa diff --git a/tests/test_api.py b/tests/test_api.py index 578c46f..cc8a4cb 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -3,7 +3,7 @@ import pytest import serial import serial_asyncio -from .async_mock import AsyncMock, MagicMock, patch, sentinel +from unittest.mock import AsyncMock, MagicMock, patch, sentinel import zigpy_zigate.config as config import zigpy_zigate.uart diff --git a/tests/test_application.py b/tests/test_application.py index e34f92e..025981d 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1,5 +1,4 @@ -from unittest import mock -from .async_mock import AsyncMock, MagicMock, patch, sentinel +from unittest.mock import AsyncMock, MagicMock, patch, sentinel import pytest import logging @@ -28,7 +27,7 @@ def app(): def test_zigpy_ieee(app): - cluster = mock.MagicMock() + cluster = MagicMock() cluster.cluster_id = 0x0000 data = b"\x01\x02\x03\x04\x05\x06\x07\x08" @@ -135,3 +134,18 @@ async def test_disconnect_multiple(app): await app.disconnect() assert app._api is None + + +@pytest.mark.asyncio +@patch("zigpy_zigate.zigbee.application.ZiGate.new") +@pytest.mark.parametrize("version_rsp, expected_version", [ + [((261, 798), 0), "3.1e"], + [((5, 801), 0), "3.21"] +]) +async def test_startup_connect(zigate_new, app, version_rsp, expected_version): + api = zigate_new.return_value + api.version.return_value = version_rsp + + await app.connect() + + assert app.version == expected_version \ No newline at end of file diff --git a/tests/test_uart.py b/tests/test_uart.py index 9d7b19a..1384b6a 100644 --- a/tests/test_uart.py +++ b/tests/test_uart.py @@ -1,4 +1,4 @@ -from .async_mock import MagicMock, AsyncMock +from unittest.mock import MagicMock, AsyncMock import pytest import gpiozero diff --git a/zigpy_zigate/zigbee/application.py b/zigpy_zigate/zigbee/application.py index a903b2b..0686909 100644 --- a/zigpy_zigate/zigbee/application.py +++ b/zigpy_zigate/zigbee/application.py @@ -40,13 +40,13 @@ async def connect(self): api = await ZiGate.new(self._config[CONF_DEVICE], self) await api.set_raw_mode() await api.set_time() - version, lqi = await api.version() - - self._api = api + (_, version), lqi = await api.version() major, minor = version.to_bytes(2, "big") self.version = f"{major:x}.{minor:x}" + self._api = api + if self.version < '3.21': LOGGER.error('Old ZiGate firmware detected, you should upgrade to 3.21 or newer') From 1a39f16652d45090d5d1742423f7841327469364 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Mon, 10 Oct 2022 15:33:36 -0400 Subject: [PATCH 3/4] Fix group request exception (#138) --- tests/test_application.py | 21 ++++++++++++++++----- zigpy_zigate/api.py | 5 ++--- zigpy_zigate/zigbee/application.py | 4 ++-- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/tests/test_application.py b/tests/test_application.py index 025981d..c965217 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -2,11 +2,12 @@ import pytest import logging -import zigpy.types as zigpy_types +import zigpy.types as zigpy_t import zigpy.exceptions -import zigpy_zigate.config as config +import zigpy_zigate.api import zigpy_zigate.types as t +import zigpy_zigate.config as config import zigpy_zigate.zigbee.application APP_CONFIG = zigpy_zigate.zigbee.application.ControllerApplication.SCHEMA( @@ -22,7 +23,7 @@ def app(): a = zigpy_zigate.zigbee.application.ControllerApplication(APP_CONFIG) a.version = FAKE_FIRMWARE_VERSION - a._api = MagicMock() + a._api = MagicMock(spec_set=zigpy_zigate.api.ZiGate) return a @@ -32,7 +33,7 @@ def test_zigpy_ieee(app): data = b"\x01\x02\x03\x04\x05\x06\x07\x08" zigate_ieee, _ = t.EUI64.deserialize(data) - app.state.node_info.ieee = zigpy_types.EUI64(zigate_ieee) + app.state.node_info.ieee = zigpy_t.EUI64(zigate_ieee) dst_addr = app.get_dst_address(cluster) assert dst_addr.serialize() == b"\x03" + data[::-1] + b"\x01" @@ -148,4 +149,14 @@ async def test_startup_connect(zigate_new, app, version_rsp, expected_version): await app.connect() - assert app.version == expected_version \ No newline at end of file + assert app.version == expected_version + + +@pytest.mark.asyncio +async def test_send_group_request(app): + packet = zigpy_t.ZigbeePacket(src=None, src_ep=1, dst=zigpy_t.AddrModeAddress(addr_mode=zigpy_t.AddrMode.Group, address=0x0002), dst_ep=None, source_route=None, extended_timeout=False, tsn=21, profile_id=260, cluster_id=6, data=zigpy_t.SerializableBytes(b'\x01\x15\x00'), tx_options=zigpy_t.TransmitOptions.NONE, radius=0, non_member_radius=3, lqi=None, rssi=None) + + app._api.raw_aps_data_request.return_value = ([t.Status.Success, 0, 1328, b'\x01\xea\x00\x00'], 0) + await app.send_packet(packet) + + app._api.raw_aps_data_request.assert_called_once() diff --git a/zigpy_zigate/api.py b/zigpy_zigate/api.py index 3f0aacc..aff1ace 100644 --- a/zigpy_zigate/api.py +++ b/zigpy_zigate/api.py @@ -290,13 +290,12 @@ def set_application(self, app): self._app = app def data_received(self, cmd, data, lqi): - LOGGER.debug("data received %s %s LQI:%s", hex(cmd), - binascii.hexlify(data), lqi) if cmd not in RESPONSES: - LOGGER.warning('Received unhandled response 0x%04x', cmd) + LOGGER.warning('Received unhandled response 0x%04x: %r', cmd, binascii.hexlify(data)) return cmd = ResponseId(cmd) data, rest = t.deserialize(data, RESPONSES[cmd]) + LOGGER.debug("Response received: %s %s %s (LQI:%s)", cmd, data, rest, lqi) if cmd == ResponseId.STATUS: if data[2] in self._status_awaiting: fut = self._status_awaiting.pop(data[2]) diff --git a/zigpy_zigate/zigbee/application.py b/zigpy_zigate/zigbee/application.py index 0686909..8dedfbd 100644 --- a/zigpy_zigate/zigbee/application.py +++ b/zigpy_zigate/zigbee/application.py @@ -243,8 +243,8 @@ async def send_packet(self, packet): try: (status, tsn, packet_type, _), _ = await self._api.raw_aps_data_request( addr=packet.dst.address, - src_ep=(1 if packet.dst_ep > 0 else 0), # ZiGate only support endpoint 1 - dst_ep=packet.dst_ep, + src_ep=(1 if packet.dst_ep is None or packet.dst_ep > 0 else 0), # ZiGate only support endpoint 1 + dst_ep=packet.dst_ep or 0, profile=packet.profile_id, cluster=packet.cluster_id, payload=packet.data.serialize(), From 9547dca1a0264e52b6f5411ce351da23f8ccf103 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Mon, 10 Oct 2022 11:54:34 -0400 Subject: [PATCH 4/4] 0.10.2 version bump --- zigpy_zigate/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zigpy_zigate/__init__.py b/zigpy_zigate/__init__.py index 68838e0..02e046f 100644 --- a/zigpy_zigate/__init__.py +++ b/zigpy_zigate/__init__.py @@ -1,5 +1,5 @@ MAJOR_VERSION = 0 -MINOR_VERSION = 11 -PATCH_VERSION = '0.dev0' +MINOR_VERSION = 10 +PATCH_VERSION = '2' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION)