mirror of https://github.com/home-assistant/core
142 lines
4.1 KiB
Python
142 lines
4.1 KiB
Python
"""Test KNX button."""
|
|
|
|
from datetime import timedelta
|
|
import logging
|
|
|
|
from freezegun.api import FrozenDateTimeFactory
|
|
import pytest
|
|
|
|
from homeassistant.components.knx.const import (
|
|
CONF_PAYLOAD_LENGTH,
|
|
KNX_ADDRESS,
|
|
KNX_MODULE_KEY,
|
|
)
|
|
from homeassistant.components.knx.schema import ButtonSchema
|
|
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(
|
|
{
|
|
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(
|
|
{
|
|
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(
|
|
{
|
|
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(KNX_MODULE_KEY) is None
|