Add ZHA binary sensor tests (#20711)

* add sensor tests

* add binary sensor tests

* add comments

* fix coveragerc after rebase
pull/20737/head
David F. Mulcahey 2019-02-04 06:51:13 -05:00 committed by GitHub
parent 07b5b68a51
commit b9d108284b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 149 additions and 0 deletions

View File

@ -0,0 +1,149 @@
"""Test zha binary sensor."""
from homeassistant.components.binary_sensor import DOMAIN
from homeassistant.const import STATE_ON, STATE_OFF
from .common import (
async_init_zigpy_device, make_attribute, make_entity_id,
async_test_device_join
)
async def test_binary_sensor(hass, config_entry, zha_gateway):
"""Test zha binary_sensor platform."""
from zigpy.zcl.clusters.security import IasZone
from zigpy.zcl.clusters.measurement import OccupancySensing
from zigpy.zcl.clusters.general import OnOff, LevelControl
from zigpy.profiles.zha import DeviceType
# create zigpy devices
zigpy_device_zone = await async_init_zigpy_device(
hass,
[IasZone.cluster_id],
[],
None,
zha_gateway
)
zigpy_device_remote = await async_init_zigpy_device(
hass,
[],
[OnOff.cluster_id, LevelControl.cluster_id],
DeviceType.LEVEL_CONTROL_SWITCH,
zha_gateway,
ieee="00:0d:6f:11:0a:90:69:e7",
manufacturer="FakeManufacturer",
model="FakeRemoteModel"
)
zigpy_device_occupancy = await async_init_zigpy_device(
hass,
[OccupancySensing.cluster_id],
[],
None,
zha_gateway,
ieee="00:0d:6f:11:9a:90:69:e7",
manufacturer="FakeOccupancy",
model="FakeOccupancyModel"
)
# load up binary_sensor domain
await hass.config_entries.async_forward_entry_setup(
config_entry, DOMAIN)
await hass.async_block_till_done()
# on off binary_sensor
zone_cluster = zigpy_device_zone.endpoints.get(
1).ias_zone
zone_entity_id = make_entity_id(DOMAIN, zigpy_device_zone, zone_cluster)
# occupancy binary_sensor
occupancy_cluster = zigpy_device_occupancy.endpoints.get(
1).occupancy
occupancy_entity_id = make_entity_id(
DOMAIN, zigpy_device_occupancy, occupancy_cluster)
# dimmable binary_sensor
remote_on_off_cluster = zigpy_device_remote.endpoints.get(
1).out_clusters[OnOff.cluster_id]
remote_level_cluster = zigpy_device_remote.endpoints.get(
1).out_clusters[LevelControl.cluster_id]
remote_entity_id = make_entity_id(DOMAIN, zigpy_device_remote,
remote_on_off_cluster,
use_suffix=False)
# test that the sensors exist and are in the off state
assert hass.states.get(zone_entity_id).state == STATE_OFF
assert hass.states.get(remote_entity_id).state == STATE_OFF
assert hass.states.get(occupancy_entity_id).state == STATE_OFF
# test getting messages that trigger and reset the sensors
await async_test_binary_sensor_on_off(hass, occupancy_cluster,
occupancy_entity_id)
await async_test_binary_sensor_on_off(hass, remote_on_off_cluster,
remote_entity_id)
# test changing the level attribute for dimming remotes
await async_test_remote_level(
hass, remote_level_cluster, remote_entity_id, 150, STATE_ON)
await async_test_remote_level(
hass, remote_level_cluster, remote_entity_id, 0, STATE_OFF)
await async_test_remote_level(
hass, remote_level_cluster, remote_entity_id, 255, STATE_ON)
await async_test_remote_move_level(
hass, remote_level_cluster, remote_entity_id, 20, STATE_ON)
# test IASZone binary sensors
await async_test_iaszone_on_off(hass, zone_cluster, zone_entity_id)
# test new sensor join
await async_test_device_join(
hass, zha_gateway, OccupancySensing.cluster_id, DOMAIN,
expected_state=STATE_OFF)
async def async_test_binary_sensor_on_off(hass, cluster, entity_id):
"""Test getting on and off messages for binary sensors."""
# binary sensor on
attr = make_attribute(0, 1)
cluster.handle_message(False, 1, 0x0a, [[attr]])
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == STATE_ON
# binary sensor off
attr.value.value = 0
cluster.handle_message(False, 0, 0x0a, [[attr]])
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == STATE_OFF
async def async_test_remote_level(hass, cluster, entity_id, level,
expected_state):
"""Test dimmer functionality from the remote."""
attr = make_attribute(0, level)
cluster.handle_message(False, 1, 0x0a, [[attr]])
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == expected_state
assert hass.states.get(entity_id).attributes.get('level') == level
async def async_test_remote_move_level(hass, cluster, entity_id, change,
expected_state):
"""Test move to level command."""
level = hass.states.get(entity_id).attributes.get('level')
cluster.listener_event('cluster_command', 1, 1, [1, change])
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == expected_state
assert hass.states.get(entity_id).attributes.get('level') == level - change
async def async_test_iaszone_on_off(hass, cluster, entity_id):
"""Test getting on and off messages for iaszone binary sensors."""
# binary sensor on
cluster.listener_event('cluster_command', 1, 0, [1])
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == STATE_ON
# binary sensor off
cluster.listener_event('cluster_command', 1, 0, [0])
await hass.async_block_till_done()
assert hass.states.get(entity_id).state == STATE_OFF