Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify the button private cluster and delete the unnecessary contents in the test file #3919

Open
wants to merge 6 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 14 additions & 13 deletions tests/test_quirks.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import zigpy.endpoint
import zigpy.profiles
import zigpy.quirks as zq
from zigpy.quirks import CustomDevice, DeviceRegistry
from zigpy.quirks import CustomDevice
from zigpy.quirks.v2 import QuirkBuilder
import zigpy.types
from zigpy.zcl import foundation
Expand Down Expand Up @@ -60,7 +60,7 @@
zhaquirks.setup()

ALL_QUIRK_CLASSES = []
for manufacturer in zq.DEVICE_REGISTRY.registry_v1.values():
for manufacturer in zq._DEVICE_REGISTRY.registry_v1.values():
for model_quirk_list in manufacturer.values():
for quirk in model_quirk_list:
if quirk in ALL_QUIRK_CLASSES:
Expand Down Expand Up @@ -309,7 +309,15 @@ def test_quirk_quickinit(quirk: zigpy.quirks.CustomDevice) -> None:

@pytest.mark.parametrize(
"quirk",
ALL_QUIRK_CLASSES,
[
quirk_cls
for quirk_cls in ALL_QUIRK_CLASSES
if quirk_cls
not in (
# Some devices have empty model info:
# zhaquirks.tuya.ty0201.TuyaTempHumiditySensorNoModel,
)
],
)
def test_signature(quirk: CustomDevice) -> None:
"""Make sure signature look sane for all custom devices."""
Expand Down Expand Up @@ -661,12 +669,6 @@ def test_migrated_lighting_automation_triggers(quirk: CustomDevice) -> None:
(const.LONG_RELEASE, const.BUTTON_4),
],
],
zhaquirks.thirdreality.button.Button: [
[
(const.LONG_PRESS, const.LONG_PRESS),
(const.LONG_RELEASE, const.LONG_RELEASE),
]
],
}


Expand Down Expand Up @@ -837,9 +839,8 @@ def check_for_duplicate_cluster_ids(clusters) -> None:
check_for_duplicate_cluster_ids(ep_data.get(OUTPUT_CLUSTERS, []))


async def test_local_data_cluster(device_mock) -> None:
async def test_local_data_cluster(zigpy_device_from_v2_quirk) -> None:
"""Ensure reading attributes from a LocalDataCluster works as expected."""
registry = DeviceRegistry()

class TestLocalCluster(zhaquirks.LocalDataCluster):
"""Test cluster."""
Expand All @@ -849,11 +850,11 @@ class TestLocalCluster(zhaquirks.LocalDataCluster):
_VALID_ATTRIBUTES = [2]

(
QuirkBuilder(device_mock.manufacturer, device_mock.model, registry=registry)
QuirkBuilder("manufacturer-local-test", "model")
.adds(TestLocalCluster)
.add_to_registry()
)
device = registry.get_device(device_mock)
device = zigpy_device_from_v2_quirk("manufacturer-local-test", "model")
assert isinstance(device.endpoints[1].in_clusters[0x1234], TestLocalCluster)

# reading invalid attribute return unsupported attribute
Expand Down
99 changes: 41 additions & 58 deletions zhaquirks/thirdreality/button.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
"""Third Reality button devices."""

from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import Basic, LevelControl, MultistateInput, OnOff, Ota
from typing import Final

from zigpy.quirks.v2 import QuirkBuilder
import zigpy.types as t
from zigpy.zcl.clusters.general import MultistateInput
from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef

from zhaquirks import CustomCluster, PowerConfigurationCluster
from zhaquirks.const import (
Expand All @@ -11,21 +14,13 @@
COMMAND_HOLD,
COMMAND_RELEASE,
COMMAND_SINGLE,
DEVICE_TYPE,
DOUBLE_PRESS,
ENDPOINTS,
INPUT_CLUSTERS,
LONG_PRESS,
LONG_RELEASE,
MODELS_INFO,
OUTPUT_CLUSTERS,
PROFILE_ID,
SHORT_PRESS,
SKIP_CONFIGURATION,
VALUE,
ZHA_SEND_EVENT,
)
from zhaquirks.thirdreality import THIRD_REALITY


class CustomPowerConfigurationCluster(PowerConfigurationCluster):
Expand Down Expand Up @@ -63,50 +58,38 @@ def _update_attribute(self, attrid, value):
super()._update_attribute(0, action)


class Button(CustomDevice):
"""thirdreality button device - alternate version."""

signature = {
MODELS_INFO: [(THIRD_REALITY, "3RSB22BZ")],
ENDPOINTS: {
1: {
PROFILE_ID: 0x0104,
DEVICE_TYPE: 0x0006,
INPUT_CLUSTERS: [
Basic.cluster_id,
MultistateInput.cluster_id,
CustomPowerConfigurationCluster.cluster_id,
],
OUTPUT_CLUSTERS: [
OnOff.cluster_id,
LevelControl.cluster_id,
Ota.cluster_id,
],
}
},
}
replacement = {
SKIP_CONFIGURATION: True,
ENDPOINTS: {
1: {
DEVICE_TYPE: zha.DeviceType.REMOTE_CONTROL,
INPUT_CLUSTERS: [
Basic.cluster_id,
CustomPowerConfigurationCluster,
MultistateInputCluster,
],
OUTPUT_CLUSTERS: [
OnOff.cluster_id,
LevelControl.cluster_id,
Ota.cluster_id,
],
}
},
}

device_automation_triggers = {
(DOUBLE_PRESS, DOUBLE_PRESS): {COMMAND: COMMAND_DOUBLE},
(SHORT_PRESS, SHORT_PRESS): {COMMAND: COMMAND_SINGLE},
(LONG_PRESS, LONG_PRESS): {COMMAND: COMMAND_HOLD},
(LONG_RELEASE, LONG_RELEASE): {COMMAND: COMMAND_RELEASE},
}
class ThirdRealityButtonCluster(CustomCluster):
"""ThirdReality Button Cluster."""

cluster_id = 0xFF01

class AttributeDefs(BaseAttributeDefs):
"""Attribute definitions."""

Cancel_Double_Button: Final = ZCLAttributeDef(
id=0x0000,
type=t.uint8_t,
is_manufacturer_specific=True,
)


(
QuirkBuilder("Third Reality, Inc", "3RSB22BZ")
.replaces(MultistateInputCluster)
.replaces(ThirdRealityButtonCluster)
.device_automation_triggers(
{
(DOUBLE_PRESS, DOUBLE_PRESS): {COMMAND: COMMAND_DOUBLE},
(SHORT_PRESS, SHORT_PRESS): {COMMAND: COMMAND_SINGLE},
(LONG_PRESS, LONG_PRESS): {COMMAND: COMMAND_HOLD},
(LONG_RELEASE, LONG_RELEASE): {COMMAND: COMMAND_HOLD},
}
)
.switch(
attribute_name=ThirdRealityButtonCluster.AttributeDefs.Cancel_Double_Button.name,
cluster_id=ThirdRealityButtonCluster.cluster_id,
translation_key="cancel_Double_Button",
fallback_name="Cancel Double Button",
)
.add_to_registry()
)
Loading