hass-core/tests/components/knx/test_button.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

138 lines
4.1 KiB
Python
Raw Normal View History

"""Test KNX button."""
from datetime import timedelta
import logging
from freezegun.api import FrozenDateTimeFactory
import pytest
2023-12-13 17:05:37 +01:00
from homeassistant.components.knx.const import CONF_PAYLOAD_LENGTH, DOMAIN, KNX_ADDRESS
from homeassistant.components.knx.schema import ButtonSchema
2023-12-13 17:05:37 +01:00
from homeassistant.const import CONF_NAME, CONF_PAYLOAD, CONF_TYPE
from homeassistant.core import HomeAssistant
from .conftest import KNXTestKit
from tests.common import async_capture_events, async_fire_time_changed
async def test_button_simple(
hass: HomeAssistant, knx: KNXTestKit, freezer: FrozenDateTimeFactory
) -> None:
"""Test KNX button with default payload."""
await knx.setup_integration(
{
2021-12-03 18:29:38 +01:00
ButtonSchema.PLATFORM: {
CONF_NAME: "test",
KNX_ADDRESS: "1/2/3",
}
}
)
events = async_capture_events(hass, "state_changed")
# press button
await hass.services.async_call(
"button", "press", {"entity_id": "button.test"}, blocking=True
)
await knx.assert_write("1/2/3", True)
assert len(events) == 1
events.pop()
# received telegrams on button GA are ignored by the entity
old_state = hass.states.get("button.test")
freezer.tick(timedelta(seconds=3))
async_fire_time_changed(hass)
await knx.receive_write("1/2/3", False)
await knx.receive_write("1/2/3", True)
new_state = hass.states.get("button.test")
assert old_state == new_state
assert len(events) == 0
# button does not respond to read
await knx.receive_read("1/2/3")
await knx.assert_telegram_count(0)
async def test_button_raw(hass: HomeAssistant, knx: KNXTestKit) -> None:
"""Test KNX button with raw payload."""
await knx.setup_integration(
{
2021-12-03 18:29:38 +01:00
ButtonSchema.PLATFORM: {
CONF_NAME: "test",
KNX_ADDRESS: "1/2/3",
CONF_PAYLOAD: False,
CONF_PAYLOAD_LENGTH: 0,
}
}
)
# press button
await hass.services.async_call(
"button", "press", {"entity_id": "button.test"}, blocking=True
)
await knx.assert_write("1/2/3", False)
async def test_button_type(hass: HomeAssistant, knx: KNXTestKit) -> None:
"""Test KNX button with encoded payload."""
await knx.setup_integration(
{
2021-12-03 18:29:38 +01:00
ButtonSchema.PLATFORM: {
CONF_NAME: "test",
KNX_ADDRESS: "1/2/3",
ButtonSchema.CONF_VALUE: 21.5,
CONF_TYPE: "2byte_float",
}
}
)
# press button
await hass.services.async_call(
"button", "press", {"entity_id": "button.test"}, blocking=True
)
await knx.assert_write("1/2/3", (0x0C, 0x33))
@pytest.mark.parametrize(
("conf_type", "conf_value", "error_msg"),
[
(
"2byte_float",
"not_valid",
"'payload: not_valid' not valid for 'type: 2byte_float'",
),
(
"not_valid",
3,
"type 'not_valid' is not a valid DPT identifier",
),
],
)
async def test_button_invalid(
hass: HomeAssistant,
caplog: pytest.LogCaptureFixture,
knx: KNXTestKit,
conf_type: str,
conf_value: str,
error_msg: str,
) -> None:
"""Test KNX button with configured payload that can't be encoded."""
with caplog.at_level(logging.ERROR):
await knx.setup_integration(
{
ButtonSchema.PLATFORM: {
CONF_NAME: "test",
KNX_ADDRESS: "1/2/3",
ButtonSchema.CONF_VALUE: conf_value,
CONF_TYPE: conf_type,
}
}
)
assert len(caplog.messages) == 2
record = caplog.records[0]
assert record.levelname == "ERROR"
assert f"Invalid config for 'knx': {error_msg}" in record.message
record = caplog.records[1]
assert record.levelname == "ERROR"
assert "Setup failed for 'knx': Invalid config." in record.message
assert hass.states.get("button.test") is None
assert hass.data.get(DOMAIN) is None