From 0d1da9f5cbfdae5d5397df28a69992514b6b3961 Mon Sep 17 00:00:00 2001 From: FrengerH Date: Mon, 6 Jan 2020 12:34:27 +0100 Subject: [PATCH] deCONZ - Rotation support for Xiaomi magic cube (#30472) * Added rotation to deconz magic cube event * Device trigger support --- .../components/deconz/.translations/en.json | 6 + homeassistant/components/deconz/const.py | 2 + .../components/deconz/deconz_event.py | 4 +- .../components/deconz/device_trigger.py | 284 +++++++++--------- tests/components/deconz/test_deconz_event.py | 52 +++- 5 files changed, 209 insertions(+), 139 deletions(-) diff --git a/homeassistant/components/deconz/.translations/en.json b/homeassistant/components/deconz/.translations/en.json index edc18d11af4..06bfc4f6585 100644 --- a/homeassistant/components/deconz/.translations/en.json +++ b/homeassistant/components/deconz/.translations/en.json @@ -80,6 +80,12 @@ "remote_falling": "Device in free fall", "remote_gyro_activated": "Device shaken", "remote_moved": "Device moved with \"{subtype}\" up", + "remote_flip_90_degrees": "Device flipped 90 degrees", + "remote_flip_180_degrees": "Device flipped 180 degrees", + "remote_moved_any_side": "Device moved with any side up", + "remote_double_tap_any_side": "Device double tapped on any side", + "remote_turned_clockwise": "Device turned clockwise", + "remote_turned_counter_clockwise": "Device turned counter clockwise", "remote_rotate_from_side_1": "Device rotated from \"side 1\" to \"{subtype}\"", "remote_rotate_from_side_2": "Device rotated from \"side 2\" to \"{subtype}\"", "remote_rotate_from_side_3": "Device rotated from \"side 3\" to \"{subtype}\"", diff --git a/homeassistant/components/deconz/const.py b/homeassistant/components/deconz/const.py index 47975750de9..41ef80b367f 100644 --- a/homeassistant/components/deconz/const.py +++ b/homeassistant/components/deconz/const.py @@ -49,3 +49,5 @@ COVER_TYPES = DAMPERS + WINDOW_COVERS POWER_PLUGS = ["On/Off plug-in unit", "Smart plug"] SIRENS = ["Warning device"] SWITCH_TYPES = POWER_PLUGS + SIRENS + +CONF_GESTURE = "gesture" diff --git a/homeassistant/components/deconz/deconz_event.py b/homeassistant/components/deconz/deconz_event.py index 31588db1f23..3c2442994a5 100644 --- a/homeassistant/components/deconz/deconz_event.py +++ b/homeassistant/components/deconz/deconz_event.py @@ -3,7 +3,7 @@ from homeassistant.const import CONF_EVENT, CONF_ID from homeassistant.core import callback from homeassistant.util import slugify -from .const import _LOGGER +from .const import _LOGGER, CONF_GESTURE from .deconz_device import DeconzBase CONF_DECONZ_EVENT = "deconz_event" @@ -47,6 +47,8 @@ class DeconzEvent(DeconzBase): CONF_UNIQUE_ID: self.serial, CONF_EVENT: self._device.state, } + if self._device.gesture: + data[CONF_GESTURE] = self._device.gesture self.gateway.hass.bus.async_fire(CONF_DECONZ_EVENT, data) async def async_update_device_registry(self): diff --git a/homeassistant/components/deconz/device_trigger.py b/homeassistant/components/deconz/device_trigger.py index 9bdfa70b7de..c5eda42bebc 100644 --- a/homeassistant/components/deconz/device_trigger.py +++ b/homeassistant/components/deconz/device_trigger.py @@ -15,7 +15,7 @@ from homeassistant.const import ( ) from . import DOMAIN -from .deconz_event import CONF_DECONZ_EVENT, CONF_UNIQUE_ID +from .deconz_event import CONF_DECONZ_EVENT, CONF_GESTURE, CONF_UNIQUE_ID CONF_SUBTYPE = "subtype" @@ -34,6 +34,12 @@ CONF_MOVE = "remote_moved" CONF_DOUBLE_TAP = "remote_double_tap" CONF_SHAKE = "remote_gyro_activated" CONF_FREE_FALL = "remote_falling" +CONF_FLIP_90 = "remote_flip_90_degrees" +CONF_FLIP_180 = "remote_flip_180_degrees" +CONF_MOVE_ANY = "remote_moved_any_side" +CONF_DOUBLE_TAP_ANY = "remote_double_tap_any_side" +CONF_TURN_CW = "remote_turned_clockwise" +CONF_TURN_CCW = "remote_turned_counter_clockwise" CONF_ROTATE_FROM_SIDE_1 = "remote_rotate_from_side_1" CONF_ROTATE_FROM_SIDE_2 = "remote_rotate_from_side_2" CONF_ROTATE_FROM_SIDE_3 = "remote_rotate_from_side_3" @@ -65,197 +71,203 @@ CONF_SIDE_6 = "side_6" HUE_DIMMER_REMOTE_MODEL_GEN1 = "RWL020" HUE_DIMMER_REMOTE_MODEL_GEN2 = "RWL021" HUE_DIMMER_REMOTE = { - (CONF_SHORT_PRESS, CONF_TURN_ON): 1000, - (CONF_SHORT_RELEASE, CONF_TURN_ON): 1002, - (CONF_LONG_PRESS, CONF_TURN_ON): 1001, - (CONF_LONG_RELEASE, CONF_TURN_ON): 1003, - (CONF_SHORT_PRESS, CONF_DIM_UP): 2000, - (CONF_SHORT_RELEASE, CONF_DIM_UP): 2002, - (CONF_LONG_PRESS, CONF_DIM_UP): 2001, - (CONF_LONG_RELEASE, CONF_DIM_UP): 2003, - (CONF_SHORT_PRESS, CONF_DIM_DOWN): 3000, - (CONF_SHORT_RELEASE, CONF_DIM_DOWN): 3002, - (CONF_LONG_PRESS, CONF_DIM_DOWN): 3001, - (CONF_LONG_RELEASE, CONF_DIM_DOWN): 3003, - (CONF_SHORT_PRESS, CONF_TURN_OFF): 4000, - (CONF_SHORT_RELEASE, CONF_TURN_OFF): 4002, - (CONF_LONG_PRESS, CONF_TURN_OFF): 4001, - (CONF_LONG_RELEASE, CONF_TURN_OFF): 4003, + (CONF_SHORT_PRESS, CONF_TURN_ON): {CONF_EVENT: 1000}, + (CONF_SHORT_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1002}, + (CONF_LONG_PRESS, CONF_TURN_ON): {CONF_EVENT: 1001}, + (CONF_LONG_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1003}, + (CONF_SHORT_PRESS, CONF_DIM_UP): {CONF_EVENT: 2000}, + (CONF_SHORT_RELEASE, CONF_DIM_UP): {CONF_EVENT: 2002}, + (CONF_LONG_PRESS, CONF_DIM_UP): {CONF_EVENT: 2001}, + (CONF_LONG_RELEASE, CONF_DIM_UP): {CONF_EVENT: 2003}, + (CONF_SHORT_PRESS, CONF_DIM_DOWN): {CONF_EVENT: 3000}, + (CONF_SHORT_RELEASE, CONF_DIM_DOWN): {CONF_EVENT: 3002}, + (CONF_LONG_PRESS, CONF_DIM_DOWN): {CONF_EVENT: 3001}, + (CONF_LONG_RELEASE, CONF_DIM_DOWN): {CONF_EVENT: 3003}, + (CONF_SHORT_PRESS, CONF_TURN_OFF): {CONF_EVENT: 4000}, + (CONF_SHORT_RELEASE, CONF_TURN_OFF): {CONF_EVENT: 4002}, + (CONF_LONG_PRESS, CONF_TURN_OFF): {CONF_EVENT: 4001}, + (CONF_LONG_RELEASE, CONF_TURN_OFF): {CONF_EVENT: 4003}, } HUE_TAP_REMOTE_MODEL = "ZGPSWITCH" HUE_TAP_REMOTE = { - (CONF_SHORT_PRESS, CONF_BUTTON_1): 34, - (CONF_SHORT_PRESS, CONF_BUTTON_2): 16, - (CONF_SHORT_PRESS, CONF_BUTTON_3): 17, - (CONF_SHORT_PRESS, CONF_BUTTON_4): 18, + (CONF_SHORT_PRESS, CONF_BUTTON_1): {CONF_EVENT: 34}, + (CONF_SHORT_PRESS, CONF_BUTTON_2): {CONF_EVENT: 16}, + (CONF_SHORT_PRESS, CONF_BUTTON_3): {CONF_EVENT: 17}, + (CONF_SHORT_PRESS, CONF_BUTTON_4): {CONF_EVENT: 18}, } SYMFONISK_SOUND_CONTROLLER_MODEL = "SYMFONISK Sound Controller" SYMFONISK_SOUND_CONTROLLER = { - (CONF_SHORT_PRESS, CONF_TURN_ON): 1002, - (CONF_DOUBLE_PRESS, CONF_TURN_ON): 1004, - (CONF_TRIPLE_PRESS, CONF_TURN_ON): 1005, - (CONF_ROTATED, CONF_LEFT): 2001, - (CONF_ROTATION_STOPPED, CONF_LEFT): 2003, - (CONF_ROTATED, CONF_RIGHT): 3001, - (CONF_ROTATION_STOPPED, CONF_RIGHT): 3003, + (CONF_SHORT_PRESS, CONF_TURN_ON): {CONF_EVENT: 1002}, + (CONF_DOUBLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1004}, + (CONF_TRIPLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1005}, + (CONF_ROTATED, CONF_LEFT): {CONF_EVENT: 2001}, + (CONF_ROTATION_STOPPED, CONF_LEFT): {CONF_EVENT: 2003}, + (CONF_ROTATED, CONF_RIGHT): {CONF_EVENT: 3001}, + (CONF_ROTATION_STOPPED, CONF_RIGHT): {CONF_EVENT: 3003}, } TRADFRI_ON_OFF_SWITCH_MODEL = "TRADFRI on/off switch" TRADFRI_ON_OFF_SWITCH = { - (CONF_SHORT_PRESS, CONF_TURN_ON): 1002, - (CONF_LONG_PRESS, CONF_TURN_ON): 1001, - (CONF_LONG_RELEASE, CONF_TURN_ON): 1003, - (CONF_SHORT_PRESS, CONF_TURN_OFF): 2002, - (CONF_LONG_PRESS, CONF_TURN_OFF): 2001, - (CONF_LONG_RELEASE, CONF_TURN_OFF): 2003, + (CONF_SHORT_PRESS, CONF_TURN_ON): {CONF_EVENT: 1002}, + (CONF_LONG_PRESS, CONF_TURN_ON): {CONF_EVENT: 1001}, + (CONF_LONG_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1003}, + (CONF_SHORT_PRESS, CONF_TURN_OFF): {CONF_EVENT: 2002}, + (CONF_LONG_PRESS, CONF_TURN_OFF): {CONF_EVENT: 2001}, + (CONF_LONG_RELEASE, CONF_TURN_OFF): {CONF_EVENT: 2003}, } TRADFRI_OPEN_CLOSE_REMOTE_MODEL = "TRADFRI open/close remote" TRADFRI_OPEN_CLOSE_REMOTE = { - (CONF_SHORT_PRESS, CONF_OPEN): 1002, - (CONF_LONG_PRESS, CONF_OPEN): 1003, - (CONF_SHORT_PRESS, CONF_CLOSE): 2002, - (CONF_LONG_PRESS, CONF_CLOSE): 2003, + (CONF_SHORT_PRESS, CONF_OPEN): {CONF_EVENT: 1002}, + (CONF_LONG_PRESS, CONF_OPEN): {CONF_EVENT: 1003}, + (CONF_SHORT_PRESS, CONF_CLOSE): {CONF_EVENT: 2002}, + (CONF_LONG_PRESS, CONF_CLOSE): {CONF_EVENT: 2003}, } TRADFRI_REMOTE_MODEL = "TRADFRI remote control" TRADFRI_REMOTE = { - (CONF_SHORT_PRESS, CONF_TURN_ON): 1002, - (CONF_LONG_PRESS, CONF_TURN_ON): 1001, - (CONF_SHORT_PRESS, CONF_DIM_UP): 2002, - (CONF_LONG_PRESS, CONF_DIM_UP): 2001, - (CONF_LONG_RELEASE, CONF_DIM_UP): 2003, - (CONF_SHORT_PRESS, CONF_DIM_DOWN): 3002, - (CONF_LONG_PRESS, CONF_DIM_DOWN): 3001, - (CONF_LONG_RELEASE, CONF_DIM_DOWN): 3003, - (CONF_SHORT_PRESS, CONF_LEFT): 4002, - (CONF_LONG_PRESS, CONF_LEFT): 4001, - (CONF_LONG_RELEASE, CONF_LEFT): 4003, - (CONF_SHORT_PRESS, CONF_RIGHT): 5002, - (CONF_LONG_PRESS, CONF_RIGHT): 5001, - (CONF_LONG_RELEASE, CONF_RIGHT): 5003, + (CONF_SHORT_PRESS, CONF_TURN_ON): {CONF_EVENT: 1002}, + (CONF_LONG_PRESS, CONF_TURN_ON): {CONF_EVENT: 1001}, + (CONF_SHORT_PRESS, CONF_DIM_UP): {CONF_EVENT: 2002}, + (CONF_LONG_PRESS, CONF_DIM_UP): {CONF_EVENT: 2001}, + (CONF_LONG_RELEASE, CONF_DIM_UP): {CONF_EVENT: 2003}, + (CONF_SHORT_PRESS, CONF_DIM_DOWN): {CONF_EVENT: 3002}, + (CONF_LONG_PRESS, CONF_DIM_DOWN): {CONF_EVENT: 3001}, + (CONF_LONG_RELEASE, CONF_DIM_DOWN): {CONF_EVENT: 3003}, + (CONF_SHORT_PRESS, CONF_LEFT): {CONF_EVENT: 4002}, + (CONF_LONG_PRESS, CONF_LEFT): {CONF_EVENT: 4001}, + (CONF_LONG_RELEASE, CONF_LEFT): {CONF_EVENT: 4003}, + (CONF_SHORT_PRESS, CONF_RIGHT): {CONF_EVENT: 5002}, + (CONF_LONG_PRESS, CONF_RIGHT): {CONF_EVENT: 5001}, + (CONF_LONG_RELEASE, CONF_RIGHT): {CONF_EVENT: 5003}, } TRADFRI_WIRELESS_DIMMER_MODEL = "TRADFRI wireless dimmer" TRADFRI_WIRELESS_DIMMER = { - (CONF_ROTATED, CONF_LEFT): 3002, - (CONF_ROTATED, CONF_RIGHT): 2002, + (CONF_ROTATED, CONF_LEFT): {CONF_EVENT: 3002}, + (CONF_ROTATED, CONF_RIGHT): {CONF_EVENT: 2002}, } AQARA_CUBE_MODEL = "lumi.sensor_cube" AQARA_CUBE_MODEL_ALT1 = "lumi.sensor_cube.aqgl01" AQARA_CUBE = { - (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_2): 6002, - (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_3): 3002, - (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_4): 4002, - (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_5): 1002, - (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_6): 5002, - (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_1): 2006, - (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_3): 3006, - (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_4): 4006, - (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_5): 1006, - (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_6): 5006, - (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_1): 2003, - (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_2): 6003, - (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_4): 4003, - (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_5): 1003, - (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_6): 5003, - (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_1): 2004, - (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_2): 6004, - (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_3): 3004, - (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_5): 1004, - (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_6): 5004, - (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_1): 2001, - (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_2): 6001, - (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_3): 3001, - (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_4): 4001, - (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_6): 5001, - (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_1): 2005, - (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_2): 6005, - (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_3): 3005, - (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_4): 4005, - (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_5): 1005, - (CONF_MOVE, CONF_SIDE_1): 2000, - (CONF_MOVE, CONF_SIDE_2): 6000, - (CONF_MOVE, CONF_SIDE_3): 3000, - (CONF_MOVE, CONF_SIDE_4): 4000, - (CONF_MOVE, CONF_SIDE_5): 1000, - (CONF_MOVE, CONF_SIDE_6): 5000, - (CONF_DOUBLE_TAP, CONF_SIDE_1): 2002, - (CONF_DOUBLE_TAP, CONF_SIDE_2): 6002, - (CONF_DOUBLE_TAP, CONF_SIDE_3): 3003, - (CONF_DOUBLE_TAP, CONF_SIDE_4): 4004, - (CONF_DOUBLE_TAP, CONF_SIDE_5): 1001, - (CONF_DOUBLE_TAP, CONF_SIDE_6): 5005, - (CONF_AWAKE, ""): 7000, - (CONF_FREE_FALL, ""): 7008, - (CONF_SHAKE, ""): 7007, + (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_2): {CONF_EVENT: 6002}, + (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_3): {CONF_EVENT: 3002}, + (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_4): {CONF_EVENT: 4002}, + (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_5): {CONF_EVENT: 1002}, + (CONF_ROTATE_FROM_SIDE_1, CONF_SIDE_6): {CONF_EVENT: 5002}, + (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_1): {CONF_EVENT: 2006}, + (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_3): {CONF_EVENT: 3006}, + (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_4): {CONF_EVENT: 4006}, + (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_5): {CONF_EVENT: 1006}, + (CONF_ROTATE_FROM_SIDE_2, CONF_SIDE_6): {CONF_EVENT: 5006}, + (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_1): {CONF_EVENT: 2003}, + (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_2): {CONF_EVENT: 6003}, + (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_4): {CONF_EVENT: 4003}, + (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_5): {CONF_EVENT: 1003}, + (CONF_ROTATE_FROM_SIDE_3, CONF_SIDE_6): {CONF_EVENT: 5003}, + (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_1): {CONF_EVENT: 2004}, + (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_2): {CONF_EVENT: 6004}, + (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_3): {CONF_EVENT: 3004}, + (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_5): {CONF_EVENT: 1004}, + (CONF_ROTATE_FROM_SIDE_4, CONF_SIDE_6): {CONF_EVENT: 5004}, + (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_1): {CONF_EVENT: 2001}, + (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_2): {CONF_EVENT: 6001}, + (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_3): {CONF_EVENT: 3001}, + (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_4): {CONF_EVENT: 4001}, + (CONF_ROTATE_FROM_SIDE_5, CONF_SIDE_6): {CONF_EVENT: 5001}, + (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_1): {CONF_EVENT: 2005}, + (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_2): {CONF_EVENT: 6005}, + (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_3): {CONF_EVENT: 3005}, + (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_4): {CONF_EVENT: 4005}, + (CONF_ROTATE_FROM_SIDE_6, CONF_SIDE_5): {CONF_EVENT: 1005}, + (CONF_MOVE, CONF_SIDE_1): {CONF_EVENT: 2000}, + (CONF_MOVE, CONF_SIDE_2): {CONF_EVENT: 6000}, + (CONF_MOVE, CONF_SIDE_3): {CONF_EVENT: 3000}, + (CONF_MOVE, CONF_SIDE_4): {CONF_EVENT: 4000}, + (CONF_MOVE, CONF_SIDE_5): {CONF_EVENT: 1000}, + (CONF_MOVE, CONF_SIDE_6): {CONF_EVENT: 5000}, + (CONF_DOUBLE_TAP, CONF_SIDE_1): {CONF_EVENT: 2002}, + (CONF_DOUBLE_TAP, CONF_SIDE_2): {CONF_EVENT: 6002}, + (CONF_DOUBLE_TAP, CONF_SIDE_3): {CONF_EVENT: 3003}, + (CONF_DOUBLE_TAP, CONF_SIDE_4): {CONF_EVENT: 4004}, + (CONF_DOUBLE_TAP, CONF_SIDE_5): {CONF_EVENT: 1001}, + (CONF_DOUBLE_TAP, CONF_SIDE_6): {CONF_EVENT: 5005}, + (CONF_AWAKE, ""): {CONF_GESTURE: 0}, + (CONF_SHAKE, ""): {CONF_GESTURE: 1}, + (CONF_FREE_FALL, ""): {CONF_GESTURE: 2}, + (CONF_FLIP_90, ""): {CONF_GESTURE: 3}, + (CONF_FLIP_180, ""): {CONF_GESTURE: 4}, + (CONF_MOVE_ANY, ""): {CONF_GESTURE: 5}, + (CONF_DOUBLE_TAP_ANY, ""): {CONF_GESTURE: 6}, + (CONF_TURN_CW, ""): {CONF_GESTURE: 7}, + (CONF_TURN_CCW, ""): {CONF_GESTURE: 8}, } AQARA_DOUBLE_WALL_SWITCH_MODEL = "lumi.remote.b286acn01" AQARA_DOUBLE_WALL_SWITCH = { - (CONF_SHORT_PRESS, CONF_LEFT): 1002, - (CONF_LONG_PRESS, CONF_LEFT): 1001, - (CONF_DOUBLE_PRESS, CONF_LEFT): 1004, - (CONF_SHORT_PRESS, CONF_RIGHT): 2002, - (CONF_LONG_PRESS, CONF_RIGHT): 2001, - (CONF_DOUBLE_PRESS, CONF_RIGHT): 2004, - (CONF_SHORT_PRESS, CONF_BOTH_BUTTONS): 3002, - (CONF_LONG_PRESS, CONF_BOTH_BUTTONS): 3001, - (CONF_DOUBLE_PRESS, CONF_BOTH_BUTTONS): 3004, + (CONF_SHORT_PRESS, CONF_LEFT): {CONF_EVENT: 1002}, + (CONF_LONG_PRESS, CONF_LEFT): {CONF_EVENT: 1001}, + (CONF_DOUBLE_PRESS, CONF_LEFT): {CONF_EVENT: 1004}, + (CONF_SHORT_PRESS, CONF_RIGHT): {CONF_EVENT: 2002}, + (CONF_LONG_PRESS, CONF_RIGHT): {CONF_EVENT: 2001}, + (CONF_DOUBLE_PRESS, CONF_RIGHT): {CONF_EVENT: 2004}, + (CONF_SHORT_PRESS, CONF_BOTH_BUTTONS): {CONF_EVENT: 3002}, + (CONF_LONG_PRESS, CONF_BOTH_BUTTONS): {CONF_EVENT: 3001}, + (CONF_DOUBLE_PRESS, CONF_BOTH_BUTTONS): {CONF_EVENT: 3004}, } AQARA_DOUBLE_WALL_SWITCH_WXKG02LM_MODEL = "lumi.sensor_86sw2" AQARA_DOUBLE_WALL_SWITCH_WXKG02LM = { - (CONF_SHORT_PRESS, CONF_LEFT): 1002, - (CONF_SHORT_PRESS, CONF_RIGHT): 2002, - (CONF_SHORT_PRESS, CONF_BOTH_BUTTONS): 3002, + (CONF_SHORT_PRESS, CONF_LEFT): {CONF_EVENT: 1002}, + (CONF_SHORT_PRESS, CONF_RIGHT): {CONF_EVENT: 2002}, + (CONF_SHORT_PRESS, CONF_BOTH_BUTTONS): {CONF_EVENT: 3002}, } AQARA_SINGLE_WALL_SWITCH_WXKG03LM_MODEL = "lumi.remote.b186acn01" AQARA_SINGLE_WALL_SWITCH_WXKG03LM = { - (CONF_SHORT_PRESS, CONF_TURN_ON): 1002, - (CONF_LONG_PRESS, CONF_TURN_ON): 1001, - (CONF_DOUBLE_PRESS, CONF_TURN_ON): 1004, + (CONF_SHORT_PRESS, CONF_TURN_ON): {CONF_EVENT: 1002}, + (CONF_LONG_PRESS, CONF_TURN_ON): {CONF_EVENT: 1001}, + (CONF_DOUBLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1004}, } AQARA_MINI_SWITCH_MODEL = "lumi.remote.b1acn01" AQARA_MINI_SWITCH = { - (CONF_SHORT_PRESS, CONF_TURN_ON): 1002, - (CONF_DOUBLE_PRESS, CONF_TURN_ON): 1004, - (CONF_LONG_PRESS, CONF_TURN_ON): 1001, - (CONF_LONG_RELEASE, CONF_TURN_ON): 1003, + (CONF_SHORT_PRESS, CONF_TURN_ON): {CONF_EVENT: 1002}, + (CONF_DOUBLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1004}, + (CONF_LONG_PRESS, CONF_TURN_ON): {CONF_EVENT: 1001}, + (CONF_LONG_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1003}, } AQARA_ROUND_SWITCH_MODEL = "lumi.sensor_switch" AQARA_ROUND_SWITCH = { - (CONF_SHORT_PRESS, CONF_TURN_ON): 1000, - (CONF_SHORT_RELEASE, CONF_TURN_ON): 1002, - (CONF_DOUBLE_PRESS, CONF_TURN_ON): 1004, - (CONF_TRIPLE_PRESS, CONF_TURN_ON): 1005, - (CONF_QUADRUPLE_PRESS, CONF_TURN_ON): 1006, - (CONF_QUINTUPLE_PRESS, CONF_TURN_ON): 1010, - (CONF_LONG_PRESS, CONF_TURN_ON): 1001, - (CONF_LONG_RELEASE, CONF_TURN_ON): 1003, + (CONF_SHORT_PRESS, CONF_TURN_ON): {CONF_EVENT: 1000}, + (CONF_SHORT_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1002}, + (CONF_DOUBLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1004}, + (CONF_TRIPLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1005}, + (CONF_QUADRUPLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1006}, + (CONF_QUINTUPLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1010}, + (CONF_LONG_PRESS, CONF_TURN_ON): {CONF_EVENT: 1001}, + (CONF_LONG_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1003}, } AQARA_SQUARE_SWITCH_MODEL = "lumi.sensor_switch.aq3" AQARA_SQUARE_SWITCH = { - (CONF_SHORT_PRESS, CONF_TURN_ON): 1002, - (CONF_DOUBLE_PRESS, CONF_TURN_ON): 1004, - (CONF_LONG_PRESS, CONF_TURN_ON): 1001, - (CONF_LONG_RELEASE, CONF_TURN_ON): 1003, - (CONF_SHAKE, ""): 1007, + (CONF_SHORT_PRESS, CONF_TURN_ON): {CONF_EVENT: 1002}, + (CONF_DOUBLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1004}, + (CONF_LONG_PRESS, CONF_TURN_ON): {CONF_EVENT: 1001}, + (CONF_LONG_RELEASE, CONF_TURN_ON): {CONF_EVENT: 1003}, + (CONF_SHAKE, ""): {CONF_EVENT: 1007}, } AQARA_SQUARE_SWITCH_WXKG11LM_2016_MODEL = "lumi.sensor_switch.aq2" AQARA_SQUARE_SWITCH_WXKG11LM_2016 = { - (CONF_SHORT_PRESS, CONF_TURN_ON): 1002, - (CONF_DOUBLE_PRESS, CONF_TURN_ON): 1004, - (CONF_TRIPLE_PRESS, CONF_TURN_ON): 1005, - (CONF_QUADRUPLE_PRESS, CONF_TURN_ON): 1006, + (CONF_SHORT_PRESS, CONF_TURN_ON): {CONF_EVENT: 1002}, + (CONF_DOUBLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1004}, + (CONF_TRIPLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1005}, + (CONF_QUADRUPLE_PRESS, CONF_TURN_ON): {CONF_EVENT: 1006}, } REMOTES = { @@ -332,7 +344,7 @@ async def async_attach_trigger(hass, config, action, automation_info): event_config = { event.CONF_PLATFORM: "event", event.CONF_EVENT_TYPE: CONF_DECONZ_EVENT, - event.CONF_EVENT_DATA: {CONF_UNIQUE_ID: event_id, CONF_EVENT: trigger}, + event.CONF_EVENT_DATA: {CONF_UNIQUE_ID: event_id, **trigger}, } event_config = event.TRIGGER_SCHEMA(event_config) diff --git a/tests/components/deconz/test_deconz_event.py b/tests/components/deconz/test_deconz_event.py index ce339345a03..69584f630d6 100644 --- a/tests/components/deconz/test_deconz_event.py +++ b/tests/components/deconz/test_deconz_event.py @@ -24,6 +24,22 @@ SENSORS = { "config": {"battery": 100}, "uniqueid": "00:00:00:00:00:00:00:02-00", }, + "3": { + "id": "Switch 3 id", + "name": "Switch 3", + "type": "ZHASwitch", + "state": {"buttonevent": 1000, "gesture": 1}, + "config": {"battery": 100}, + "uniqueid": "00:00:00:00:00:00:00:03-00", + }, + "4": { + "id": "Switch 4 id", + "name": "Switch 4", + "type": "ZHASwitch", + "state": {"buttonevent": 1000, "gesture": 1}, + "config": {"battery": 100}, + "uniqueid": "00:00:00:00:00:00:00:04-00", + }, } @@ -36,8 +52,8 @@ async def test_deconz_events(hass): assert "sensor.switch_1_battery_level" not in gateway.deconz_ids assert "sensor.switch_2" not in gateway.deconz_ids assert "sensor.switch_2_battery_level" in gateway.deconz_ids - assert len(hass.states.async_all()) == 1 - assert len(gateway.events) == 2 + assert len(hass.states.async_all()) == 3 + assert len(gateway.events) == 4 switch_1 = hass.states.get("sensor.switch_1") assert switch_1 is None @@ -66,6 +82,38 @@ async def test_deconz_events(hass): unsub() + mock_listener = Mock() + unsub = hass.bus.async_listen(CONF_DECONZ_EVENT, mock_listener) + + gateway.api.sensors["3"].async_update({"state": {"buttonevent": 2000}}) + await hass.async_block_till_done() + + assert len(mock_listener.mock_calls) == 1 + assert mock_listener.mock_calls[0][1][0].data == { + "id": "switch_3", + "unique_id": "00:00:00:00:00:00:00:03", + "event": 2000, + "gesture": 1, + } + + unsub() + + mock_listener = Mock() + unsub = hass.bus.async_listen(CONF_DECONZ_EVENT, mock_listener) + + gateway.api.sensors["4"].async_update({"state": {"gesture": 2}}) + await hass.async_block_till_done() + + assert len(mock_listener.mock_calls) == 1 + assert mock_listener.mock_calls[0][1][0].data == { + "id": "switch_4", + "unique_id": "00:00:00:00:00:00:00:04", + "event": 1000, + "gesture": 2, + } + + unsub() + await gateway.async_reset() assert len(hass.states.async_all()) == 0