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

Add "power outage memory" support for Aqara ceiling light L1-350 #2658

Merged
merged 2 commits into from
Oct 23, 2023
Merged
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
30 changes: 30 additions & 0 deletions tests/test_xiaomi.py
Original file line number Diff line number Diff line change
Expand Up @@ -1509,3 +1509,33 @@ async def test_xiaomi_e1_roller_commands_2(zigpy_device_from_quirk, command, val
assert (
analog_cluster._write_attributes.call_args[0][0][0].value.value == 100 - value
)


def test_aqara_acn003_signature_match(assert_signature_matches_quirk):
signature = {
"node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.FullFunctionDevice|MainsPowered|RxOnWhenIdle|AllocateAddress: 142>, manufacturer_code=4447, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
"endpoints": {
"1": {
"profile_id": 0x0104,
"device_type": "0x0102",
"in_clusters": [
"0x0000",
"0x0003",
"0x0004",
"0x0005",
"0x0006",
"0x0008",
"0x0300",
"0xfcc0",
],
"out_clusters": ["0x000a", "0x0019"],
}
},
"manufacturer": "Aqara",
"model": "lumi.light.acn003",
"class": "aqara_light.LumiLightAcn003",
}

assert_signature_matches_quirk(
zhaquirks.xiaomi.aqara.light_acn.LumiLightAcn003, signature
)
86 changes: 86 additions & 0 deletions zhaquirks/xiaomi/aqara/light_acn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
from zigpy import types as t
from zigpy.profiles import zha
from zigpy.zcl.clusters.general import (
Groups,
Identify,
LevelControl,
OnOff,
Ota,
Scenes,
Time,
)
from zigpy.zcl.clusters.lighting import Color

from zhaquirks.const import (
DEVICE_TYPE,
ENDPOINTS,
INPUT_CLUSTERS,
MODELS_INFO,
OUTPUT_CLUSTERS,
PROFILE_ID,
)
from zhaquirks.xiaomi import BasicCluster, XiaomiAqaraE1Cluster, XiaomiCustomDevice


class OppleClusterLight(XiaomiAqaraE1Cluster):
"""Add Opple cluster for power outage memory attribute."""

attributes = {
0x0201: ("power_outage_memory", t.Bool, True),
}


class LumiLightAcn003(XiaomiCustomDevice):
TheJulianJES marked this conversation as resolved.
Show resolved Hide resolved
"""Quirk for Aqara ceiling light L1-350 also known as Xiaomi ZNXDD01LM.

Provides dimmable light control with color temperature setting.
This quirk adds support for power on behavior by adding the power_outage_memory attribute.
"""

signature = {
MODELS_INFO: [
("Aqara", "lumi.light.acn003"),
],
ENDPOINTS: {
1: {
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.COLOR_DIMMABLE_LIGHT,
INPUT_CLUSTERS: [
BasicCluster.cluster_id, # 0x0000
Identify.cluster_id, # 0x0003
Groups.cluster_id, # 0x0004
Scenes.cluster_id, # 0x0005
OnOff.cluster_id, # 0x0006
LevelControl.cluster_id, # 0x0008
Color.cluster_id, # 0x0300
OppleClusterLight.cluster_id, # 0xFCC0 - manufacturer specific
],
OUTPUT_CLUSTERS: [
Time.cluster_id, # 0x000A
Ota.cluster_id, # 0x0019
],
}
},
}
replacement = {
ENDPOINTS: {
1: {
corvis marked this conversation as resolved.
Show resolved Hide resolved
PROFILE_ID: zha.PROFILE_ID,
DEVICE_TYPE: zha.DeviceType.COLOR_DIMMABLE_LIGHT,
INPUT_CLUSTERS: [
BasicCluster,
Identify.cluster_id, # 0x0003
Groups.cluster_id, # 0x0004
Scenes.cluster_id, # 0x0005
OnOff.cluster_id, # 0x0006
LevelControl.cluster_id, # 0x0008
Color.cluster_id, # 0x0300
OppleClusterLight,
],
OUTPUT_CLUSTERS: [
Time.cluster_id, # 0x000A
Ota.cluster_id, # 0x0019
],
}
}
}
Loading