mirror of
https://github.com/home-assistant/core.git
synced 2025-07-17 02:07:09 +00:00
Adding ZWave CentralScene activation handler. (#9178)
* Adding ZWave CentralScene activation handler. * Migrated CentralScene logic to node_entity.py Removed extraneous logging Modified scene_activated event to send the scene_id and scene_data separately * Adding unit test for ZWave central scene activation * Removed return to allow node statistics to update after central scene message is received
This commit is contained in:
parent
8797932f80
commit
639eb81aef
@ -10,6 +10,7 @@ ATTR_VALUE_ID = "value_id"
|
|||||||
ATTR_OBJECT_ID = "object_id"
|
ATTR_OBJECT_ID = "object_id"
|
||||||
ATTR_NAME = "name"
|
ATTR_NAME = "name"
|
||||||
ATTR_SCENE_ID = "scene_id"
|
ATTR_SCENE_ID = "scene_id"
|
||||||
|
ATTR_SCENE_DATA = "scene_data"
|
||||||
ATTR_BASIC_LEVEL = "basic_level"
|
ATTR_BASIC_LEVEL = "basic_level"
|
||||||
ATTR_CONFIG_PARAMETER = "parameter"
|
ATTR_CONFIG_PARAMETER = "parameter"
|
||||||
ATTR_CONFIG_SIZE = "size"
|
ATTR_CONFIG_SIZE = "size"
|
||||||
|
@ -7,8 +7,9 @@ from homeassistant.helpers.entity import Entity
|
|||||||
from homeassistant.util import slugify
|
from homeassistant.util import slugify
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
ATTR_NODE_ID, COMMAND_CLASS_WAKE_UP, ATTR_SCENE_ID, ATTR_BASIC_LEVEL,
|
ATTR_NODE_ID, COMMAND_CLASS_WAKE_UP, ATTR_SCENE_ID, ATTR_SCENE_DATA,
|
||||||
EVENT_NODE_EVENT, EVENT_SCENE_ACTIVATED, DOMAIN)
|
ATTR_BASIC_LEVEL, EVENT_NODE_EVENT, EVENT_SCENE_ACTIVATED, DOMAIN,
|
||||||
|
COMMAND_CLASS_CENTRAL_SCENE)
|
||||||
from .util import node_name
|
from .util import node_name
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -107,13 +108,19 @@ class ZWaveNodeEntity(ZWaveBaseEntity):
|
|||||||
dispatcher.connect(
|
dispatcher.connect(
|
||||||
self.network_scene_activated, ZWaveNetwork.SIGNAL_SCENE_EVENT)
|
self.network_scene_activated, ZWaveNetwork.SIGNAL_SCENE_EVENT)
|
||||||
|
|
||||||
def network_node_changed(self, node=None, args=None):
|
def network_node_changed(self, node=None, value=None, args=None):
|
||||||
"""Handle a changed node on the network."""
|
"""Handle a changed node on the network."""
|
||||||
if node and node.node_id != self.node_id:
|
if node and node.node_id != self.node_id:
|
||||||
return
|
return
|
||||||
if args is not None and 'nodeId' in args and \
|
if args is not None and 'nodeId' in args and \
|
||||||
args['nodeId'] != self.node_id:
|
args['nodeId'] != self.node_id:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Process central scene activation
|
||||||
|
if (value is not None and
|
||||||
|
value.command_class == COMMAND_CLASS_CENTRAL_SCENE):
|
||||||
|
self.central_scene_activated(value.index, value.data)
|
||||||
|
|
||||||
self.node_changed()
|
self.node_changed()
|
||||||
|
|
||||||
def get_node_statistics(self):
|
def get_node_statistics(self):
|
||||||
@ -177,6 +184,18 @@ class ZWaveNodeEntity(ZWaveBaseEntity):
|
|||||||
ATTR_SCENE_ID: scene_id
|
ATTR_SCENE_ID: scene_id
|
||||||
})
|
})
|
||||||
|
|
||||||
|
def central_scene_activated(self, scene_id, scene_data):
|
||||||
|
"""Handle an activated central scene for this node."""
|
||||||
|
if self.hass is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.hass.bus.fire(EVENT_SCENE_ACTIVATED, {
|
||||||
|
ATTR_ENTITY_ID: self.entity_id,
|
||||||
|
ATTR_NODE_ID: self.node_id,
|
||||||
|
ATTR_SCENE_ID: scene_id,
|
||||||
|
ATTR_SCENE_DATA: scene_data
|
||||||
|
})
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def state(self):
|
def state(self):
|
||||||
"""Return the state."""
|
"""Return the state."""
|
||||||
|
@ -117,6 +117,60 @@ def test_scene_activated(hass, mock_openzwave):
|
|||||||
assert events[0].data[const.ATTR_SCENE_ID] == scene_id
|
assert events[0].data[const.ATTR_SCENE_ID] == scene_id
|
||||||
|
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def test_central_scene_activated(hass, mock_openzwave):
|
||||||
|
"""Test central scene activated event."""
|
||||||
|
mock_receivers = []
|
||||||
|
|
||||||
|
def mock_connect(receiver, signal, *args, **kwargs):
|
||||||
|
if signal == mock_zwave.MockNetwork.SIGNAL_VALUE_CHANGED:
|
||||||
|
mock_receivers.append(receiver)
|
||||||
|
|
||||||
|
node = mock_zwave.MockNode(node_id=11)
|
||||||
|
|
||||||
|
with patch('pydispatch.dispatcher.connect', new=mock_connect):
|
||||||
|
entity = node_entity.ZWaveNodeEntity(node, mock_openzwave, True)
|
||||||
|
|
||||||
|
assert len(mock_receivers) == 1
|
||||||
|
|
||||||
|
events = []
|
||||||
|
|
||||||
|
def listener(event):
|
||||||
|
events.append(event)
|
||||||
|
|
||||||
|
hass.bus.async_listen(const.EVENT_SCENE_ACTIVATED, listener)
|
||||||
|
|
||||||
|
# Test event before entity added to hass
|
||||||
|
scene_id = 1
|
||||||
|
scene_data = 3
|
||||||
|
value = mock_zwave.MockValue(
|
||||||
|
command_class=const.COMMAND_CLASS_CENTRAL_SCENE,
|
||||||
|
index=scene_id,
|
||||||
|
data=scene_data)
|
||||||
|
hass.async_add_job(mock_receivers[0], node, value)
|
||||||
|
yield from hass.async_block_till_done()
|
||||||
|
assert len(events) == 0
|
||||||
|
|
||||||
|
# Add entity to hass
|
||||||
|
entity.hass = hass
|
||||||
|
entity.entity_id = 'zwave.mock_node'
|
||||||
|
|
||||||
|
scene_id = 1
|
||||||
|
scene_data = 3
|
||||||
|
value = mock_zwave.MockValue(
|
||||||
|
command_class=const.COMMAND_CLASS_CENTRAL_SCENE,
|
||||||
|
index=scene_id,
|
||||||
|
data=scene_data)
|
||||||
|
hass.async_add_job(mock_receivers[0], node, value)
|
||||||
|
yield from hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert len(events) == 1
|
||||||
|
assert events[0].data[ATTR_ENTITY_ID] == "zwave.mock_node"
|
||||||
|
assert events[0].data[const.ATTR_NODE_ID] == 11
|
||||||
|
assert events[0].data[const.ATTR_SCENE_ID] == scene_id
|
||||||
|
assert events[0].data[const.ATTR_SCENE_DATA] == scene_data
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures('mock_openzwave')
|
@pytest.mark.usefixtures('mock_openzwave')
|
||||||
class TestZWaveNodeEntity(unittest.TestCase):
|
class TestZWaveNodeEntity(unittest.TestCase):
|
||||||
"""Class to test ZWaveNodeEntity."""
|
"""Class to test ZWaveNodeEntity."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user