Skip to content

Commit

Permalink
Set TuyaData.dp_type automatically
Browse files Browse the repository at this point in the history
  • Loading branch information
Shulyaka committed Dec 17, 2022
1 parent cb4882e commit 3974127
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 101 deletions.
25 changes: 25 additions & 0 deletions zhaquirks/tuya/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""Tuya devices."""
import dataclasses
import datetime
import enum
import logging
from typing import Any, Callable, Dict, List, Optional, Tuple, Union

Expand Down Expand Up @@ -228,6 +229,30 @@ def payload(self, value):
else:
raise ValueError(f"Unknown {self.dp_type} datapoint type")

def __new__(cls, *args, **kwargs):
"""Disable copy constrctor."""
return super().__new__(cls)

def __init__(self, value=None, function=0, *args, **kwargs):
"""Convert from a zigpy typed value to a tuya data payload."""
if value is None:
return
elif isinstance(value, (t.bitmap8, t.bitmap16, t.bitmap32)):
self.dp_type = TuyaDPType.BITMAP
elif isinstance(value, (bool, t.Bool)):
self.dp_type = TuyaDPType.BOOL
elif isinstance(value, enum.Enum):
self.dp_type = TuyaDPType.ENUM
elif isinstance(value, int):
self.dp_type = TuyaDPType.VALUE
elif isinstance(value, str):
self.dp_type = TuyaDPType.STRING
elif isinstance(value, t.Struct):
self.dp_type = TuyaDPType.RAW

self.function = function
self.payload = value


class Data(t.List, item_type=t.uint8_t):
"""list of uint8_t."""
Expand Down
32 changes: 2 additions & 30 deletions zhaquirks/tuya/mcu/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@
NoManufacturerCluster,
PowerOnState,
TuyaCommand,
TuyaData,
TuyaDatapointData,
TuyaDPType,
TuyaLocalCluster,
TuyaNewManufCluster,
TuyaTimePayload,
Expand All @@ -36,7 +34,6 @@ class DPToAttributeMapping:

ep_attribute: str
attribute_name: Union[str, tuple]
dp_type: TuyaDPType
converter: Optional[
Callable[
[
Expand Down Expand Up @@ -196,7 +193,6 @@ def from_cluster_data(self, data: TuyaClusterData) -> Optional[TuyaCommand]:
cmd_payload.status = 0
cmd_payload.tsn = self.endpoint.device.application.get_sequence()

datapoint_type = mapping.dp_type
val = data.attr_value
if mapping.dp_converter:
args = []
Expand All @@ -214,11 +210,7 @@ def from_cluster_data(self, data: TuyaClusterData) -> Optional[TuyaCommand]:
val = mapping.dp_converter(*args)
self.debug("converted: %s", val)

tuya_data = TuyaData()
tuya_data.dp_type = datapoint_type
tuya_data.function = 0
tuya_data.payload = val
dpd = TuyaDatapointData(dp, tuya_data)
dpd = TuyaDatapointData(dp, val)
cmd_payload.datapoints = [dpd]

tuya_commands.append(cmd_payload)
Expand Down Expand Up @@ -334,7 +326,7 @@ async def command(
cluster_data = TuyaClusterData(
endpoint_id=self.endpoint.endpoint_id,
cluster_attr="on_off",
attr_value=command_id,
attr_value=bool(command_id),
expect_reply=expect_reply,
manufacturer=manufacturer,
)
Expand Down Expand Up @@ -363,36 +355,30 @@ class TuyaOnOffManufCluster(TuyaMCUCluster):
1: DPToAttributeMapping(
TuyaOnOff.ep_attribute,
"on_off",
dp_type=TuyaDPType.BOOL,
),
2: DPToAttributeMapping(
TuyaOnOff.ep_attribute,
"on_off",
dp_type=TuyaDPType.BOOL,
endpoint_id=2,
),
3: DPToAttributeMapping(
TuyaOnOff.ep_attribute,
"on_off",
dp_type=TuyaDPType.BOOL,
endpoint_id=3,
),
4: DPToAttributeMapping(
TuyaOnOff.ep_attribute,
"on_off",
dp_type=TuyaDPType.BOOL,
endpoint_id=4,
),
5: DPToAttributeMapping(
TuyaOnOff.ep_attribute,
"on_off",
dp_type=TuyaDPType.BOOL,
endpoint_id=5,
),
6: DPToAttributeMapping(
TuyaOnOff.ep_attribute,
"on_off",
dp_type=TuyaDPType.BOOL,
endpoint_id=6,
),
}
Expand Down Expand Up @@ -426,7 +412,6 @@ class MoesSwitchManufCluster(TuyaOnOffManufCluster):
14: DPToAttributeMapping(
TuyaMCUCluster.ep_attribute,
"power_on_state",
dp_type=TuyaDPType.ENUM,
converter=lambda x: PowerOnState(x),
)
}
Expand All @@ -436,7 +421,6 @@ class MoesSwitchManufCluster(TuyaOnOffManufCluster):
15: DPToAttributeMapping(
TuyaMCUCluster.ep_attribute,
"backlight_mode",
dp_type=TuyaDPType.ENUM,
converter=lambda x: MoesBacklight(x),
),
}
Expand Down Expand Up @@ -534,81 +518,69 @@ class TuyaLevelControlManufCluster(TuyaMCUCluster):
1: DPToAttributeMapping(
TuyaOnOff.ep_attribute,
"on_off",
dp_type=TuyaDPType.BOOL,
),
2: DPToAttributeMapping(
TuyaLevelControl.ep_attribute,
"current_level",
dp_type=TuyaDPType.VALUE,
converter=lambda x: (x * 255) // 1000,
dp_converter=lambda x: (x * 1000) // 255,
),
3: DPToAttributeMapping(
TuyaLevelControl.ep_attribute,
"minimum_level",
dp_type=TuyaDPType.VALUE,
converter=lambda x: (x * 255) // 1000,
dp_converter=lambda x: (x * 1000) // 255,
),
4: DPToAttributeMapping(
TuyaLevelControl.ep_attribute,
"bulb_type",
dp_type=TuyaDPType.ENUM,
),
7: DPToAttributeMapping(
TuyaOnOff.ep_attribute,
"on_off",
dp_type=TuyaDPType.BOOL,
endpoint_id=2,
),
8: DPToAttributeMapping(
TuyaLevelControl.ep_attribute,
"current_level",
dp_type=TuyaDPType.VALUE,
converter=lambda x: (x * 255) // 1000,
dp_converter=lambda x: (x * 1000) // 255,
endpoint_id=2,
),
9: DPToAttributeMapping(
TuyaLevelControl.ep_attribute,
"minimum_level",
dp_type=TuyaDPType.VALUE,
converter=lambda x: (x * 255) // 1000,
dp_converter=lambda x: (x * 1000) // 255,
endpoint_id=2,
),
10: DPToAttributeMapping(
TuyaLevelControl.ep_attribute,
"bulb_type",
dp_type=TuyaDPType.ENUM,
endpoint_id=2,
),
15: DPToAttributeMapping(
TuyaOnOff.ep_attribute,
"on_off",
dp_type=TuyaDPType.BOOL,
endpoint_id=3,
),
16: DPToAttributeMapping(
TuyaLevelControl.ep_attribute,
"current_level",
dp_type=TuyaDPType.VALUE,
converter=lambda x: (x * 255) // 1000,
dp_converter=lambda x: (x * 1000) // 255,
endpoint_id=3,
),
17: DPToAttributeMapping(
TuyaLevelControl.ep_attribute,
"minimum_level",
dp_type=TuyaDPType.VALUE,
converter=lambda x: (x * 255) // 1000,
dp_converter=lambda x: (x * 1000) // 255,
endpoint_id=3,
),
18: DPToAttributeMapping(
TuyaLevelControl.ep_attribute,
"bulb_type",
dp_type=TuyaDPType.ENUM,
endpoint_id=3,
),
}
Expand Down
4 changes: 1 addition & 3 deletions zhaquirks/tuya/ts0601_illuminance.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
PROFILE_ID,
)
from zhaquirks.tuya import TuyaLocalCluster
from zhaquirks.tuya.mcu import DPToAttributeMapping, TuyaDPType, TuyaMCUCluster
from zhaquirks.tuya.mcu import DPToAttributeMapping, TuyaMCUCluster

TUYA_BRIGHTNESS_LEVEL_DP = 0x01 # 0-2 "Low, Medium, High"
TUYA_ILLUMINANCE_DP = 0x02 # [0, 0, 3, 232] illuminance
Expand Down Expand Up @@ -50,13 +50,11 @@ class TuyaIlluminanceCluster(TuyaMCUCluster):
TUYA_BRIGHTNESS_LEVEL_DP: DPToAttributeMapping(
TuyaIlluminanceMeasurement.ep_attribute,
"manufacturer_brightness_level",
dp_type=TuyaDPType.ENUM,
converter=lambda x: BrightnessLevel(x),
),
TUYA_ILLUMINANCE_DP: DPToAttributeMapping(
TuyaIlluminanceMeasurement.ep_attribute,
"measured_value",
dp_type=TuyaDPType.VALUE,
converter=lambda x: (10000.0 * math.log10(x) + 1.0 if x != 0 else 0),
),
}
Expand Down
Loading

0 comments on commit 3974127

Please sign in to comment.