Bump ZHA quirks and associated changes (#81587)
This commit is contained in:
parent
9860b06913
commit
d1fd141e8c
7 changed files with 67 additions and 58 deletions
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
||||||
import logging
|
import logging
|
||||||
from typing import TYPE_CHECKING, Any
|
from typing import TYPE_CHECKING, Any
|
||||||
|
|
||||||
from zigpy import types
|
from zhaquirks.inovelli.types import AllLEDEffectType, SingleLEDEffectType
|
||||||
from zigpy.exceptions import ZigbeeException
|
from zigpy.exceptions import ZigbeeException
|
||||||
import zigpy.zcl
|
import zigpy.zcl
|
||||||
|
|
||||||
|
@ -183,59 +183,47 @@ class InovelliNotificationChannel(ClientChannel):
|
||||||
class InovelliConfigEntityChannel(ZigbeeChannel):
|
class InovelliConfigEntityChannel(ZigbeeChannel):
|
||||||
"""Inovelli Configuration Entity channel."""
|
"""Inovelli Configuration Entity channel."""
|
||||||
|
|
||||||
class LEDEffectType(types.enum8):
|
|
||||||
"""Effect type for Inovelli Blue Series switch."""
|
|
||||||
|
|
||||||
Off = 0x00
|
|
||||||
Solid = 0x01
|
|
||||||
Fast_Blink = 0x02
|
|
||||||
Slow_Blink = 0x03
|
|
||||||
Pulse = 0x04
|
|
||||||
Chase = 0x05
|
|
||||||
Open_Close = 0x06
|
|
||||||
Small_To_Big = 0x07
|
|
||||||
Clear = 0xFF
|
|
||||||
|
|
||||||
REPORT_CONFIG = ()
|
REPORT_CONFIG = ()
|
||||||
ZCL_INIT_ATTRS = {
|
ZCL_INIT_ATTRS = {
|
||||||
"dimming_speed_up_remote": False,
|
"dimming_speed_up_remote": True,
|
||||||
"dimming_speed_up_local": False,
|
"dimming_speed_up_local": True,
|
||||||
"ramp_rate_off_to_on_local": False,
|
"ramp_rate_off_to_on_local": True,
|
||||||
"ramp_rate_off_to_on_remote": False,
|
"ramp_rate_off_to_on_remote": True,
|
||||||
"dimming_speed_down_remote": False,
|
"dimming_speed_down_remote": True,
|
||||||
"dimming_speed_down_local": False,
|
"dimming_speed_down_local": True,
|
||||||
"ramp_rate_on_to_off_local": False,
|
"ramp_rate_on_to_off_local": True,
|
||||||
"ramp_rate_on_to_off_remote": False,
|
"ramp_rate_on_to_off_remote": True,
|
||||||
"minimum_level": False,
|
"minimum_level": True,
|
||||||
"maximum_level": False,
|
"maximum_level": True,
|
||||||
"invert_switch": False,
|
"invert_switch": True,
|
||||||
"auto_off_timer": False,
|
"auto_off_timer": True,
|
||||||
"default_level_local": False,
|
"default_level_local": True,
|
||||||
"default_level_remote": False,
|
"default_level_remote": True,
|
||||||
"state_after_power_restored": False,
|
"state_after_power_restored": True,
|
||||||
"load_level_indicator_timeout": False,
|
"load_level_indicator_timeout": True,
|
||||||
"active_power_reports": False,
|
"active_power_reports": True,
|
||||||
"periodic_power_and_energy_reports": False,
|
"periodic_power_and_energy_reports": True,
|
||||||
"active_energy_reports": False,
|
"active_energy_reports": True,
|
||||||
"power_type": False,
|
"power_type": False,
|
||||||
"switch_type": False,
|
"switch_type": False,
|
||||||
"button_delay": False,
|
"button_delay": False,
|
||||||
"smart_bulb_mode": False,
|
"smart_bulb_mode": False,
|
||||||
"double_tap_up_for_full_brightness": False,
|
"double_tap_up_for_full_brightness": True,
|
||||||
"led_color_when_on": False,
|
"led_color_when_on": True,
|
||||||
"led_color_when_off": False,
|
"led_color_when_off": True,
|
||||||
"led_intensity_when_on": False,
|
"led_intensity_when_on": True,
|
||||||
"led_intensity_when_off": False,
|
"led_intensity_when_off": True,
|
||||||
"local_protection": False,
|
"local_protection": False,
|
||||||
"output_mode": False,
|
"output_mode": False,
|
||||||
"on_off_led_mode": False,
|
"on_off_led_mode": True,
|
||||||
"firmware_progress_led": False,
|
"firmware_progress_led": True,
|
||||||
"relay_click_in_on_off_mode": False,
|
"relay_click_in_on_off_mode": True,
|
||||||
|
"disable_clear_notifications_double_tap": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
async def issue_all_led_effect(
|
async def issue_all_led_effect(
|
||||||
self,
|
self,
|
||||||
effect_type: LEDEffectType | int = LEDEffectType.Fast_Blink,
|
effect_type: AllLEDEffectType | int = AllLEDEffectType.Fast_Blink,
|
||||||
color: int = 200,
|
color: int = 200,
|
||||||
level: int = 100,
|
level: int = 100,
|
||||||
duration: int = 3,
|
duration: int = 3,
|
||||||
|
@ -251,7 +239,7 @@ class InovelliConfigEntityChannel(ZigbeeChannel):
|
||||||
async def issue_individual_led_effect(
|
async def issue_individual_led_effect(
|
||||||
self,
|
self,
|
||||||
led_number: int = 1,
|
led_number: int = 1,
|
||||||
effect_type: LEDEffectType | int = LEDEffectType.Fast_Blink,
|
effect_type: SingleLEDEffectType | int = SingleLEDEffectType.Fast_Blink,
|
||||||
color: int = 200,
|
color: int = 200,
|
||||||
level: int = 100,
|
level: int = 100,
|
||||||
duration: int = 3,
|
duration: int = 3,
|
||||||
|
|
|
@ -13,7 +13,7 @@ from homeassistant.helpers.typing import ConfigType, TemplateVarsType
|
||||||
|
|
||||||
from . import DOMAIN
|
from . import DOMAIN
|
||||||
from .api import SERVICE_WARNING_DEVICE_SQUAWK, SERVICE_WARNING_DEVICE_WARN
|
from .api import SERVICE_WARNING_DEVICE_SQUAWK, SERVICE_WARNING_DEVICE_WARN
|
||||||
from .core.channels.manufacturerspecific import InovelliConfigEntityChannel
|
from .core.channels.manufacturerspecific import AllLEDEffectType, SingleLEDEffectType
|
||||||
from .core.const import CHANNEL_IAS_WD, CHANNEL_INOVELLI
|
from .core.const import CHANNEL_IAS_WD, CHANNEL_INOVELLI
|
||||||
from .core.helpers import async_get_zha_device
|
from .core.helpers import async_get_zha_device
|
||||||
|
|
||||||
|
@ -40,9 +40,7 @@ INOVELLI_ALL_LED_EFFECT_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend(
|
||||||
{
|
{
|
||||||
vol.Required(CONF_TYPE): INOVELLI_ALL_LED_EFFECT,
|
vol.Required(CONF_TYPE): INOVELLI_ALL_LED_EFFECT,
|
||||||
vol.Required(CONF_DOMAIN): DOMAIN,
|
vol.Required(CONF_DOMAIN): DOMAIN,
|
||||||
vol.Required(
|
vol.Required("effect_type"): AllLEDEffectType.__getitem__,
|
||||||
"effect_type"
|
|
||||||
): InovelliConfigEntityChannel.LEDEffectType.__getitem__,
|
|
||||||
vol.Required("color"): vol.All(vol.Coerce(int), vol.Range(0, 255)),
|
vol.Required("color"): vol.All(vol.Coerce(int), vol.Range(0, 255)),
|
||||||
vol.Required("level"): vol.All(vol.Coerce(int), vol.Range(0, 100)),
|
vol.Required("level"): vol.All(vol.Coerce(int), vol.Range(0, 100)),
|
||||||
vol.Required("duration"): vol.All(vol.Coerce(int), vol.Range(1, 255)),
|
vol.Required("duration"): vol.All(vol.Coerce(int), vol.Range(1, 255)),
|
||||||
|
@ -52,10 +50,16 @@ INOVELLI_ALL_LED_EFFECT_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend(
|
||||||
INOVELLI_INDIVIDUAL_LED_EFFECT_SCHEMA = INOVELLI_ALL_LED_EFFECT_SCHEMA.extend(
|
INOVELLI_INDIVIDUAL_LED_EFFECT_SCHEMA = INOVELLI_ALL_LED_EFFECT_SCHEMA.extend(
|
||||||
{
|
{
|
||||||
vol.Required(CONF_TYPE): INOVELLI_INDIVIDUAL_LED_EFFECT,
|
vol.Required(CONF_TYPE): INOVELLI_INDIVIDUAL_LED_EFFECT,
|
||||||
vol.Required("led_number"): vol.All(vol.Coerce(int), vol.Range(1, 7)),
|
vol.Required("effect_type"): SingleLEDEffectType.__getitem__,
|
||||||
|
vol.Required("led_number"): vol.All(vol.Coerce(int), vol.Range(0, 6)),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ACTION_SCHEMA_MAP = {
|
||||||
|
INOVELLI_ALL_LED_EFFECT: INOVELLI_ALL_LED_EFFECT_SCHEMA,
|
||||||
|
INOVELLI_INDIVIDUAL_LED_EFFECT: INOVELLI_INDIVIDUAL_LED_EFFECT_SCHEMA,
|
||||||
|
}
|
||||||
|
|
||||||
ACTION_SCHEMA = vol.Any(
|
ACTION_SCHEMA = vol.Any(
|
||||||
INOVELLI_ALL_LED_EFFECT_SCHEMA,
|
INOVELLI_ALL_LED_EFFECT_SCHEMA,
|
||||||
INOVELLI_INDIVIDUAL_LED_EFFECT_SCHEMA,
|
INOVELLI_INDIVIDUAL_LED_EFFECT_SCHEMA,
|
||||||
|
@ -83,9 +87,7 @@ DEVICE_ACTION_TYPES = {
|
||||||
DEVICE_ACTION_SCHEMAS = {
|
DEVICE_ACTION_SCHEMAS = {
|
||||||
INOVELLI_ALL_LED_EFFECT: vol.Schema(
|
INOVELLI_ALL_LED_EFFECT: vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Required("effect_type"): vol.In(
|
vol.Required("effect_type"): vol.In(AllLEDEffectType.__members__.keys()),
|
||||||
InovelliConfigEntityChannel.LEDEffectType.__members__.keys()
|
|
||||||
),
|
|
||||||
vol.Required("color"): vol.All(vol.Coerce(int), vol.Range(0, 255)),
|
vol.Required("color"): vol.All(vol.Coerce(int), vol.Range(0, 255)),
|
||||||
vol.Required("level"): vol.All(vol.Coerce(int), vol.Range(0, 100)),
|
vol.Required("level"): vol.All(vol.Coerce(int), vol.Range(0, 100)),
|
||||||
vol.Required("duration"): vol.All(vol.Coerce(int), vol.Range(1, 255)),
|
vol.Required("duration"): vol.All(vol.Coerce(int), vol.Range(1, 255)),
|
||||||
|
@ -94,9 +96,7 @@ DEVICE_ACTION_SCHEMAS = {
|
||||||
INOVELLI_INDIVIDUAL_LED_EFFECT: vol.Schema(
|
INOVELLI_INDIVIDUAL_LED_EFFECT: vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Required("led_number"): vol.All(vol.Coerce(int), vol.Range(0, 6)),
|
vol.Required("led_number"): vol.All(vol.Coerce(int), vol.Range(0, 6)),
|
||||||
vol.Required("effect_type"): vol.In(
|
vol.Required("effect_type"): vol.In(SingleLEDEffectType.__members__.keys()),
|
||||||
InovelliConfigEntityChannel.LEDEffectType.__members__.keys()
|
|
||||||
),
|
|
||||||
vol.Required("color"): vol.All(vol.Coerce(int), vol.Range(0, 255)),
|
vol.Required("color"): vol.All(vol.Coerce(int), vol.Range(0, 255)),
|
||||||
vol.Required("level"): vol.All(vol.Coerce(int), vol.Range(0, 100)),
|
vol.Required("level"): vol.All(vol.Coerce(int), vol.Range(0, 100)),
|
||||||
vol.Required("duration"): vol.All(vol.Coerce(int), vol.Range(1, 255)),
|
vol.Required("duration"): vol.All(vol.Coerce(int), vol.Range(1, 255)),
|
||||||
|
@ -127,6 +127,15 @@ async def async_call_action_from_config(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def async_validate_action_config(
|
||||||
|
hass: HomeAssistant, config: ConfigType
|
||||||
|
) -> ConfigType:
|
||||||
|
"""Validate config."""
|
||||||
|
schema = ACTION_SCHEMA_MAP.get(config[CONF_TYPE], DEFAULT_ACTION_SCHEMA)
|
||||||
|
config = schema(config)
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
async def async_get_actions(
|
async def async_get_actions(
|
||||||
hass: HomeAssistant, device_id: str
|
hass: HomeAssistant, device_id: str
|
||||||
) -> list[dict[str, str]]:
|
) -> list[dict[str, str]]:
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
"bellows==0.34.2",
|
"bellows==0.34.2",
|
||||||
"pyserial==3.5",
|
"pyserial==3.5",
|
||||||
"pyserial-asyncio==0.6",
|
"pyserial-asyncio==0.6",
|
||||||
"zha-quirks==0.0.84",
|
"zha-quirks==0.0.85",
|
||||||
"zigpy-deconz==0.19.0",
|
"zigpy-deconz==0.19.0",
|
||||||
"zigpy==0.51.5",
|
"zigpy==0.51.5",
|
||||||
"zigpy-xbee==0.16.2",
|
"zigpy-xbee==0.16.2",
|
||||||
|
|
|
@ -418,3 +418,15 @@ class InovelliRelayClickInOnOffMode(
|
||||||
|
|
||||||
_zcl_attribute: str = "relay_click_in_on_off_mode"
|
_zcl_attribute: str = "relay_click_in_on_off_mode"
|
||||||
_attr_name: str = "Disable relay click in on off mode"
|
_attr_name: str = "Disable relay click in on off mode"
|
||||||
|
|
||||||
|
|
||||||
|
@CONFIG_DIAGNOSTIC_MATCH(
|
||||||
|
channel_names=CHANNEL_INOVELLI,
|
||||||
|
)
|
||||||
|
class InovelliDisableDoubleTapClearNotificationsMode(
|
||||||
|
ZHASwitchConfigurationEntity, id_suffix="disable_clear_notifications_double_tap"
|
||||||
|
):
|
||||||
|
"""Inovelli disable clear notifications double tap control."""
|
||||||
|
|
||||||
|
_zcl_attribute: str = "disable_clear_notifications_double_tap"
|
||||||
|
_attr_name: str = "Disable config 2x tap to clear notifications"
|
||||||
|
|
|
@ -2616,7 +2616,7 @@ zengge==0.2
|
||||||
zeroconf==0.39.4
|
zeroconf==0.39.4
|
||||||
|
|
||||||
# homeassistant.components.zha
|
# homeassistant.components.zha
|
||||||
zha-quirks==0.0.84
|
zha-quirks==0.0.85
|
||||||
|
|
||||||
# homeassistant.components.zhong_hong
|
# homeassistant.components.zhong_hong
|
||||||
zhong_hong_hvac==1.0.9
|
zhong_hong_hvac==1.0.9
|
||||||
|
|
|
@ -1817,7 +1817,7 @@ zamg==0.1.1
|
||||||
zeroconf==0.39.4
|
zeroconf==0.39.4
|
||||||
|
|
||||||
# homeassistant.components.zha
|
# homeassistant.components.zha
|
||||||
zha-quirks==0.0.84
|
zha-quirks==0.0.85
|
||||||
|
|
||||||
# homeassistant.components.zha
|
# homeassistant.components.zha
|
||||||
zigpy-deconz==0.19.0
|
zigpy-deconz==0.19.0
|
||||||
|
|
|
@ -290,7 +290,7 @@ async def test_action(hass, device_ias, device_inovelli):
|
||||||
"domain": DOMAIN,
|
"domain": DOMAIN,
|
||||||
"device_id": inovelli_reg_device.id,
|
"device_id": inovelli_reg_device.id,
|
||||||
"type": "issue_individual_led_effect",
|
"type": "issue_individual_led_effect",
|
||||||
"effect_type": "Open_Close",
|
"effect_type": "Falling",
|
||||||
"led_number": 1,
|
"led_number": 1,
|
||||||
"duration": 5,
|
"duration": 5,
|
||||||
"level": 10,
|
"level": 10,
|
||||||
|
|
Loading…
Add table
Reference in a new issue