core/tests/components/knx/test_switch.py

174 lines
5.0 KiB
Python
Raw Normal View History

2021-07-21 22:04:14 +00:00
"""Test KNX switch."""
2021-07-21 22:04:14 +00:00
from homeassistant.components.knx.const import (
CONF_RESPOND_TO_READ,
CONF_STATE_ADDRESS,
KNX_ADDRESS,
)
from homeassistant.components.knx.schema import SwitchSchema
Create, update and delete KNX entities from UI / WS-commands (#104079) * knx entity CRUD - initial commit - switch * platform dependent schema * coerce empty GA-lists to None * read entity configuration from WS * use entity_id instead of unique_id for lookup * Add device support * Rename KNXEntityStore to KNXConfigStore * fix test after rename * Send schema options for creating / editing entities * Return entity_id after entity creation * remove device_class config in favour of more-info-dialog settings * refactor group address schema for custom selector * Rename GA keys and remove invalid keys from schema * fix rebase * Fix deleting devices and their entities * Validate entity schema in extra step - return validation infos * Use exception to signal validation error; return validated data * Forward validation result when editing entities * Get proper validation error message for optional GAs * Add entity validation only WS command * use ulid instead of uuid * Fix error handling for edit unknown entity * Remove unused optional group address sets from validated schema * Add optional dpt field for ga_schema * Move knx config things to sub-key * Add light platform * async_forward_entry_setups only once * Test crate and remove devices * Test removing entities of a removed device * Test entity creation and storage * Test deleting entities * Test unsuccessful entity creation * Test updating entity data * Test get entity config * Test validate entity * Update entity data by entity_id instead of unique_id * Remove unnecessary uid unique check * remove schema_options * test fixture for entity creation * clean up group address schema class can be used to add custom serializer later * Revert: Add light platfrom * remove unused optional_ga_schema * Test GASelector * lint tests * Review * group entities before adding * fix / ignore mypy * always has_entity_name * Entity name: check for empty string when no device * use constants instead of strings in schema * Fix mypy errors for voluptuous schemas --------- Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
2024-07-21 18:01:48 +00:00
from homeassistant.const import CONF_NAME, STATE_OFF, STATE_ON, Platform
2021-07-24 12:03:04 +00:00
from homeassistant.core import HomeAssistant, State
2021-07-21 22:04:14 +00:00
Create, update and delete KNX entities from UI / WS-commands (#104079) * knx entity CRUD - initial commit - switch * platform dependent schema * coerce empty GA-lists to None * read entity configuration from WS * use entity_id instead of unique_id for lookup * Add device support * Rename KNXEntityStore to KNXConfigStore * fix test after rename * Send schema options for creating / editing entities * Return entity_id after entity creation * remove device_class config in favour of more-info-dialog settings * refactor group address schema for custom selector * Rename GA keys and remove invalid keys from schema * fix rebase * Fix deleting devices and their entities * Validate entity schema in extra step - return validation infos * Use exception to signal validation error; return validated data * Forward validation result when editing entities * Get proper validation error message for optional GAs * Add entity validation only WS command * use ulid instead of uuid * Fix error handling for edit unknown entity * Remove unused optional group address sets from validated schema * Add optional dpt field for ga_schema * Move knx config things to sub-key * Add light platform * async_forward_entry_setups only once * Test crate and remove devices * Test removing entities of a removed device * Test entity creation and storage * Test deleting entities * Test unsuccessful entity creation * Test updating entity data * Test get entity config * Test validate entity * Update entity data by entity_id instead of unique_id * Remove unnecessary uid unique check * remove schema_options * test fixture for entity creation * clean up group address schema class can be used to add custom serializer later * Revert: Add light platfrom * remove unused optional_ga_schema * Test GASelector * lint tests * Review * group entities before adding * fix / ignore mypy * always has_entity_name * Entity name: check for empty string when no device * use constants instead of strings in schema * Fix mypy errors for voluptuous schemas --------- Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
2024-07-21 18:01:48 +00:00
from . import KnxEntityGenerator
2021-07-24 12:03:04 +00:00
from .conftest import KNXTestKit
2021-07-21 22:04:14 +00:00
from tests.common import mock_restore_cache
2021-07-24 12:03:04 +00:00
async def test_switch_simple(hass: HomeAssistant, knx: KNXTestKit) -> None:
2021-07-21 22:04:14 +00:00
"""Test simple KNX switch."""
await knx.setup_integration(
{
2021-12-03 17:29:38 +00:00
SwitchSchema.PLATFORM: {
2021-07-21 22:04:14 +00:00
CONF_NAME: "test",
KNX_ADDRESS: "1/2/3",
}
}
)
# turn on switch
await hass.services.async_call(
"switch", "turn_on", {"entity_id": "switch.test"}, blocking=True
)
await knx.assert_write("1/2/3", True)
# turn off switch
await hass.services.async_call(
"switch", "turn_off", {"entity_id": "switch.test"}, blocking=True
)
await knx.assert_write("1/2/3", False)
# receive ON telegram
await knx.receive_write("1/2/3", True)
state = hass.states.get("switch.test")
assert state.state is STATE_ON
# receive OFF telegram
await knx.receive_write("1/2/3", False)
state = hass.states.get("switch.test")
assert state.state is STATE_OFF
# switch does not respond to read by default
await knx.receive_read("1/2/3")
await knx.assert_telegram_count(0)
async def test_switch_state(hass: HomeAssistant, knx: KNXTestKit) -> None:
2021-07-21 22:04:14 +00:00
"""Test KNX switch with state_address."""
_ADDRESS = "1/1/1"
_STATE_ADDRESS = "2/2/2"
await knx.setup_integration(
{
2021-12-03 17:29:38 +00:00
SwitchSchema.PLATFORM: {
2021-07-21 22:04:14 +00:00
CONF_NAME: "test",
KNX_ADDRESS: _ADDRESS,
CONF_STATE_ADDRESS: _STATE_ADDRESS,
},
}
)
# StateUpdater initialize state
await knx.assert_read(_STATE_ADDRESS)
await knx.receive_response(_STATE_ADDRESS, True)
state = hass.states.get("switch.test")
assert state.state is STATE_ON
# receive OFF telegram at `address`
await knx.receive_write(_ADDRESS, False)
state = hass.states.get("switch.test")
assert state.state is STATE_OFF
# receive ON telegram at `address`
await knx.receive_write(_ADDRESS, True)
state = hass.states.get("switch.test")
assert state.state is STATE_ON
# receive OFF telegram at `state_address`
await knx.receive_write(_STATE_ADDRESS, False)
state = hass.states.get("switch.test")
assert state.state is STATE_OFF
# receive ON telegram at `state_address`
await knx.receive_write(_STATE_ADDRESS, True)
state = hass.states.get("switch.test")
assert state.state is STATE_ON
# turn off switch
await hass.services.async_call(
"switch", "turn_off", {"entity_id": "switch.test"}, blocking=True
)
await knx.assert_write(_ADDRESS, False)
# turn on switch
await hass.services.async_call(
"switch", "turn_on", {"entity_id": "switch.test"}, blocking=True
)
await knx.assert_write(_ADDRESS, True)
# switch does not respond to read by default
await knx.receive_read(_ADDRESS)
await knx.assert_telegram_count(0)
async def test_switch_restore_and_respond(hass: HomeAssistant, knx) -> None:
2021-07-21 22:04:14 +00:00
"""Test restoring KNX switch state and respond to read."""
_ADDRESS = "1/1/1"
fake_state = State("switch.test", "on")
mock_restore_cache(hass, (fake_state,))
2021-07-21 22:04:14 +00:00
await knx.setup_integration(
{
SwitchSchema.PLATFORM: {
CONF_NAME: "test",
KNX_ADDRESS: _ADDRESS,
CONF_RESPOND_TO_READ: True,
},
}
)
2021-07-21 22:04:14 +00:00
# restored state - doesn't send telegram
state = hass.states.get("switch.test")
assert state.state == STATE_ON
await knx.assert_telegram_count(0)
# respond to restored state
await knx.receive_read(_ADDRESS)
await knx.assert_response(_ADDRESS, True)
# turn off switch
await hass.services.async_call(
"switch", "turn_off", {"entity_id": "switch.test"}, blocking=True
)
await knx.assert_write(_ADDRESS, False)
state = hass.states.get("switch.test")
assert state.state == STATE_OFF
# respond to new state
await knx.receive_read(_ADDRESS)
await knx.assert_response(_ADDRESS, False)
Create, update and delete KNX entities from UI / WS-commands (#104079) * knx entity CRUD - initial commit - switch * platform dependent schema * coerce empty GA-lists to None * read entity configuration from WS * use entity_id instead of unique_id for lookup * Add device support * Rename KNXEntityStore to KNXConfigStore * fix test after rename * Send schema options for creating / editing entities * Return entity_id after entity creation * remove device_class config in favour of more-info-dialog settings * refactor group address schema for custom selector * Rename GA keys and remove invalid keys from schema * fix rebase * Fix deleting devices and their entities * Validate entity schema in extra step - return validation infos * Use exception to signal validation error; return validated data * Forward validation result when editing entities * Get proper validation error message for optional GAs * Add entity validation only WS command * use ulid instead of uuid * Fix error handling for edit unknown entity * Remove unused optional group address sets from validated schema * Add optional dpt field for ga_schema * Move knx config things to sub-key * Add light platform * async_forward_entry_setups only once * Test crate and remove devices * Test removing entities of a removed device * Test entity creation and storage * Test deleting entities * Test unsuccessful entity creation * Test updating entity data * Test get entity config * Test validate entity * Update entity data by entity_id instead of unique_id * Remove unnecessary uid unique check * remove schema_options * test fixture for entity creation * clean up group address schema class can be used to add custom serializer later * Revert: Add light platfrom * remove unused optional_ga_schema * Test GASelector * lint tests * Review * group entities before adding * fix / ignore mypy * always has_entity_name * Entity name: check for empty string when no device * use constants instead of strings in schema * Fix mypy errors for voluptuous schemas --------- Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
2024-07-21 18:01:48 +00:00
async def test_switch_ui_create(
hass: HomeAssistant,
knx: KNXTestKit,
create_ui_entity: KnxEntityGenerator,
) -> None:
"""Test creating a switch."""
await knx.setup_integration({})
await create_ui_entity(
platform=Platform.SWITCH,
entity_data={"name": "test"},
knx_data={
"ga_switch": {"write": "1/1/1", "state": "2/2/2"},
"respond_to_read": True,
"sync_state": True,
"invert": False,
},
)
# created entity sends read-request to KNX bus
await knx.assert_read("2/2/2")
await knx.receive_response("2/2/2", True)
state = hass.states.get("switch.test")
assert state.state is STATE_ON