mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Add binary_sensor to homeworks (#112418)
* Add binary_sensor to homeworks * Update tests
This commit is contained in:
parent
b670066c00
commit
2cdf6b9937
@ -546,6 +546,7 @@ omit =
|
|||||||
homeassistant/components/homematic/sensor.py
|
homeassistant/components/homematic/sensor.py
|
||||||
homeassistant/components/homematic/switch.py
|
homeassistant/components/homematic/switch.py
|
||||||
homeassistant/components/homeworks/__init__.py
|
homeassistant/components/homeworks/__init__.py
|
||||||
|
homeassistant/components/homeworks/binary_sensor.py
|
||||||
homeassistant/components/homeworks/button.py
|
homeassistant/components/homeworks/button.py
|
||||||
homeassistant/components/homeworks/light.py
|
homeassistant/components/homeworks/light.py
|
||||||
homeassistant/components/horizon/media_player.py
|
homeassistant/components/horizon/media_player.py
|
||||||
|
@ -21,6 +21,7 @@ from homeassistant.const import (
|
|||||||
from homeassistant.core import Event, HomeAssistant, callback
|
from homeassistant.core import Event, HomeAssistant, callback
|
||||||
from homeassistant.exceptions import ConfigEntryNotReady
|
from homeassistant.exceptions import ConfigEntryNotReady
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.helpers.debounce import Debouncer
|
||||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect, dispatcher_send
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect, dispatcher_send
|
||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.helpers.entity import Entity
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
@ -37,13 +38,14 @@ from .const import (
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
PLATFORMS: list[Platform] = [Platform.BUTTON, Platform.LIGHT]
|
PLATFORMS: list[Platform] = [Platform.BINARY_SENSOR, Platform.BUTTON, Platform.LIGHT]
|
||||||
|
|
||||||
EVENT_BUTTON_PRESS = "homeworks_button_press"
|
EVENT_BUTTON_PRESS = "homeworks_button_press"
|
||||||
EVENT_BUTTON_RELEASE = "homeworks_button_release"
|
EVENT_BUTTON_RELEASE = "homeworks_button_release"
|
||||||
|
|
||||||
DEFAULT_FADE_RATE = 1.0
|
DEFAULT_FADE_RATE = 1.0
|
||||||
|
|
||||||
|
KEYPAD_LEDSTATE_POLL_COOLDOWN = 1.0
|
||||||
|
|
||||||
CV_FADE_RATE = vol.All(vol.Coerce(float), vol.Range(min=0, max=20))
|
CV_FADE_RATE = vol.All(vol.Coerce(float), vol.Range(min=0, max=20))
|
||||||
|
|
||||||
@ -208,6 +210,13 @@ class HomeworksKeypad:
|
|||||||
"""Register callback that will be used for signals."""
|
"""Register callback that will be used for signals."""
|
||||||
self._addr = addr
|
self._addr = addr
|
||||||
self._controller = controller
|
self._controller = controller
|
||||||
|
self._debouncer = Debouncer(
|
||||||
|
hass,
|
||||||
|
_LOGGER,
|
||||||
|
cooldown=KEYPAD_LEDSTATE_POLL_COOLDOWN,
|
||||||
|
immediate=False,
|
||||||
|
function=self._request_keypad_led_states,
|
||||||
|
)
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
self._name = name
|
self._name = name
|
||||||
self._id = slugify(self._name)
|
self._id = slugify(self._name)
|
||||||
@ -229,3 +238,15 @@ class HomeworksKeypad:
|
|||||||
return
|
return
|
||||||
data = {CONF_ID: self._id, CONF_NAME: self._name, "button": values[1]}
|
data = {CONF_ID: self._id, CONF_NAME: self._name, "button": values[1]}
|
||||||
self._hass.bus.async_fire(event, data)
|
self._hass.bus.async_fire(event, data)
|
||||||
|
|
||||||
|
def _request_keypad_led_states(self) -> None:
|
||||||
|
"""Query keypad led state."""
|
||||||
|
# pylint: disable-next=protected-access
|
||||||
|
self._controller._send(f"RKLS, {self._addr}")
|
||||||
|
|
||||||
|
async def request_keypad_led_states(self) -> None:
|
||||||
|
"""Query keypad led state.
|
||||||
|
|
||||||
|
Debounced to not storm the controller during setup.
|
||||||
|
"""
|
||||||
|
await self._debouncer.async_call()
|
||||||
|
93
homeassistant/components/homeworks/binary_sensor.py
Normal file
93
homeassistant/components/homeworks/binary_sensor.py
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
"""Support for Lutron Homeworks binary sensors."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from pyhomeworks.pyhomeworks import HW_KEYPAD_LED_CHANGED, Homeworks
|
||||||
|
|
||||||
|
from homeassistant.components.binary_sensor import BinarySensorEntity
|
||||||
|
from homeassistant.config_entries import ConfigEntry
|
||||||
|
from homeassistant.const import CONF_NAME
|
||||||
|
from homeassistant.core import HomeAssistant, callback
|
||||||
|
from homeassistant.helpers.device_registry import DeviceInfo
|
||||||
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||||
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
|
||||||
|
from . import HomeworksData, HomeworksEntity, HomeworksKeypad
|
||||||
|
from .const import (
|
||||||
|
CONF_ADDR,
|
||||||
|
CONF_BUTTONS,
|
||||||
|
CONF_CONTROLLER_ID,
|
||||||
|
CONF_KEYPADS,
|
||||||
|
CONF_LED,
|
||||||
|
CONF_NUMBER,
|
||||||
|
DOMAIN,
|
||||||
|
)
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
async def async_setup_entry(
|
||||||
|
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
||||||
|
) -> None:
|
||||||
|
"""Set up Homeworks binary sensors."""
|
||||||
|
data: HomeworksData = hass.data[DOMAIN][entry.entry_id]
|
||||||
|
controller = data.controller
|
||||||
|
controller_id = entry.options[CONF_CONTROLLER_ID]
|
||||||
|
devs = []
|
||||||
|
for keypad in entry.options.get(CONF_KEYPADS, []):
|
||||||
|
for button in keypad[CONF_BUTTONS]:
|
||||||
|
if not button[CONF_LED]:
|
||||||
|
continue
|
||||||
|
dev = HomeworksBinarySensor(
|
||||||
|
controller,
|
||||||
|
data.keypads[keypad[CONF_ADDR]],
|
||||||
|
controller_id,
|
||||||
|
keypad[CONF_ADDR],
|
||||||
|
keypad[CONF_NAME],
|
||||||
|
button[CONF_NAME],
|
||||||
|
button[CONF_NUMBER],
|
||||||
|
)
|
||||||
|
devs.append(dev)
|
||||||
|
async_add_entities(devs, True)
|
||||||
|
|
||||||
|
|
||||||
|
class HomeworksBinarySensor(HomeworksEntity, BinarySensorEntity):
|
||||||
|
"""Homeworks Binary Sensor."""
|
||||||
|
|
||||||
|
_attr_has_entity_name = True
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
controller: Homeworks,
|
||||||
|
keypad: HomeworksKeypad,
|
||||||
|
controller_id: str,
|
||||||
|
addr: str,
|
||||||
|
keypad_name: str,
|
||||||
|
button_name: str,
|
||||||
|
led_number: int,
|
||||||
|
) -> None:
|
||||||
|
"""Create device with Addr, name, and rate."""
|
||||||
|
super().__init__(controller, controller_id, addr, led_number, button_name)
|
||||||
|
self._attr_device_info = DeviceInfo(
|
||||||
|
identifiers={(DOMAIN, f"{controller_id}.{addr}")}, name=keypad_name
|
||||||
|
)
|
||||||
|
self._keypad = keypad
|
||||||
|
|
||||||
|
async def async_added_to_hass(self) -> None:
|
||||||
|
"""Call when entity is added to hass."""
|
||||||
|
signal = f"homeworks_entity_{self._controller_id}_{self._addr}"
|
||||||
|
_LOGGER.debug("connecting %s", signal)
|
||||||
|
self.async_on_remove(
|
||||||
|
async_dispatcher_connect(self.hass, signal, self._update_callback)
|
||||||
|
)
|
||||||
|
await self._keypad.request_keypad_led_states()
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def _update_callback(self, msg_type: str, values: list[Any]) -> None:
|
||||||
|
"""Process device specific messages."""
|
||||||
|
if msg_type != HW_KEYPAD_LED_CHANGED or len(values[1]) < self._idx:
|
||||||
|
return
|
||||||
|
self._attr_is_on = bool(values[1][self._idx - 1])
|
||||||
|
self.async_write_ha_state()
|
@ -9,6 +9,7 @@ from typing import Any
|
|||||||
from pyhomeworks.pyhomeworks import Homeworks
|
from pyhomeworks.pyhomeworks import Homeworks
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
|
||||||
from homeassistant.components.button import DOMAIN as BUTTON_DOMAIN
|
from homeassistant.components.button import DOMAIN as BUTTON_DOMAIN
|
||||||
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
|
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
|
||||||
from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult
|
from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult
|
||||||
@ -44,6 +45,7 @@ from .const import (
|
|||||||
CONF_DIMMERS,
|
CONF_DIMMERS,
|
||||||
CONF_INDEX,
|
CONF_INDEX,
|
||||||
CONF_KEYPADS,
|
CONF_KEYPADS,
|
||||||
|
CONF_LED,
|
||||||
CONF_NUMBER,
|
CONF_NUMBER,
|
||||||
CONF_RATE,
|
CONF_RATE,
|
||||||
CONF_RELEASE_DELAY,
|
CONF_RELEASE_DELAY,
|
||||||
@ -78,6 +80,7 @@ LIGHT_EDIT = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BUTTON_EDIT = {
|
BUTTON_EDIT = {
|
||||||
|
vol.Optional(CONF_LED, default=False): selector.BooleanSelector(),
|
||||||
vol.Optional(CONF_RELEASE_DELAY, default=0): selector.NumberSelector(
|
vol.Optional(CONF_RELEASE_DELAY, default=0): selector.NumberSelector(
|
||||||
selector.NumberSelectorConfig(
|
selector.NumberSelectorConfig(
|
||||||
min=0,
|
min=0,
|
||||||
@ -380,16 +383,17 @@ async def validate_remove_button(
|
|||||||
if str(index) not in removed_indexes:
|
if str(index) not in removed_indexes:
|
||||||
items.append(item)
|
items.append(item)
|
||||||
button_number = keypad[CONF_BUTTONS][index][CONF_NUMBER]
|
button_number = keypad[CONF_BUTTONS][index][CONF_NUMBER]
|
||||||
if entity_id := entity_registry.async_get_entity_id(
|
for domain in (BINARY_SENSOR_DOMAIN, BUTTON_DOMAIN):
|
||||||
BUTTON_DOMAIN,
|
if entity_id := entity_registry.async_get_entity_id(
|
||||||
DOMAIN,
|
domain,
|
||||||
calculate_unique_id(
|
DOMAIN,
|
||||||
handler.options[CONF_CONTROLLER_ID],
|
calculate_unique_id(
|
||||||
keypad[CONF_ADDR],
|
handler.options[CONF_CONTROLLER_ID],
|
||||||
button_number,
|
keypad[CONF_ADDR],
|
||||||
),
|
button_number,
|
||||||
):
|
),
|
||||||
entity_registry.async_remove(entity_id)
|
):
|
||||||
|
entity_registry.async_remove(entity_id)
|
||||||
keypad[CONF_BUTTONS] = items
|
keypad[CONF_BUTTONS] = items
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
@ -563,6 +567,7 @@ class HomeworksConfigFlowHandler(ConfigFlow, domain=DOMAIN):
|
|||||||
CONF_ADDR: keypad[CONF_ADDR],
|
CONF_ADDR: keypad[CONF_ADDR],
|
||||||
CONF_BUTTONS: [
|
CONF_BUTTONS: [
|
||||||
{
|
{
|
||||||
|
CONF_LED: button[CONF_LED],
|
||||||
CONF_NAME: button[CONF_NAME],
|
CONF_NAME: button[CONF_NAME],
|
||||||
CONF_NUMBER: button[CONF_NUMBER],
|
CONF_NUMBER: button[CONF_NUMBER],
|
||||||
CONF_RELEASE_DELAY: button[CONF_RELEASE_DELAY],
|
CONF_RELEASE_DELAY: button[CONF_RELEASE_DELAY],
|
||||||
|
@ -10,6 +10,7 @@ CONF_CONTROLLER_ID = "controller_id"
|
|||||||
CONF_DIMMERS = "dimmers"
|
CONF_DIMMERS = "dimmers"
|
||||||
CONF_INDEX = "index"
|
CONF_INDEX = "index"
|
||||||
CONF_KEYPADS = "keypads"
|
CONF_KEYPADS = "keypads"
|
||||||
|
CONF_LED = "led"
|
||||||
CONF_NUMBER = "number"
|
CONF_NUMBER = "number"
|
||||||
CONF_RATE = "rate"
|
CONF_RATE = "rate"
|
||||||
CONF_RELEASE_DELAY = "release_delay"
|
CONF_RELEASE_DELAY = "release_delay"
|
||||||
|
@ -60,10 +60,12 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"name": "[%key:common::config_flow::data::name%]",
|
"name": "[%key:common::config_flow::data::name%]",
|
||||||
"number": "Number",
|
"number": "Number",
|
||||||
|
"led": "LED",
|
||||||
"release_delay": "Release delay"
|
"release_delay": "Release delay"
|
||||||
},
|
},
|
||||||
"data_description": {
|
"data_description": {
|
||||||
"number": "Button number in the range 1 to 24",
|
"number": "Button number in the range 1 to 24",
|
||||||
|
"led": "Enable if the button has a scene select indicator",
|
||||||
"release_delay": "Time between press and release, set to 0 to only press"
|
"release_delay": "Time between press and release, set to 0 to only press"
|
||||||
},
|
},
|
||||||
"title": "[%key:component::homeworks::options::step::init::menu_options::add_keypad%]"
|
"title": "[%key:component::homeworks::options::step::init::menu_options::add_keypad%]"
|
||||||
@ -92,9 +94,11 @@
|
|||||||
},
|
},
|
||||||
"edit_button": {
|
"edit_button": {
|
||||||
"data": {
|
"data": {
|
||||||
|
"led": "[%key:component::homeworks::options::step::add_button::data::led%]",
|
||||||
"release_delay": "[%key:component::homeworks::options::step::add_button::data::release_delay%]"
|
"release_delay": "[%key:component::homeworks::options::step::add_button::data::release_delay%]"
|
||||||
},
|
},
|
||||||
"data_description": {
|
"data_description": {
|
||||||
|
"led": "[%key:component::homeworks::options::step::add_button::data_description::led%]",
|
||||||
"release_delay": "[%key:component::homeworks::options::step::add_button::data_description::release_delay%]"
|
"release_delay": "[%key:component::homeworks::options::step::add_button::data_description::release_delay%]"
|
||||||
},
|
},
|
||||||
"title": "[%key:component::homeworks::options::step::edit_keypad::menu_options::select_edit_button%]"
|
"title": "[%key:component::homeworks::options::step::edit_keypad::menu_options::select_edit_button%]"
|
||||||
|
@ -11,6 +11,7 @@ from homeassistant.components.homeworks.const import (
|
|||||||
CONF_CONTROLLER_ID,
|
CONF_CONTROLLER_ID,
|
||||||
CONF_DIMMERS,
|
CONF_DIMMERS,
|
||||||
CONF_KEYPADS,
|
CONF_KEYPADS,
|
||||||
|
CONF_LED,
|
||||||
CONF_NUMBER,
|
CONF_NUMBER,
|
||||||
CONF_RATE,
|
CONF_RATE,
|
||||||
CONF_RELEASE_DELAY,
|
CONF_RELEASE_DELAY,
|
||||||
@ -47,16 +48,19 @@ def mock_config_entry() -> MockConfigEntry:
|
|||||||
{
|
{
|
||||||
CONF_NAME: "Morning",
|
CONF_NAME: "Morning",
|
||||||
CONF_NUMBER: 1,
|
CONF_NUMBER: 1,
|
||||||
|
CONF_LED: True,
|
||||||
CONF_RELEASE_DELAY: None,
|
CONF_RELEASE_DELAY: None,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
CONF_NAME: "Relax",
|
CONF_NAME: "Relax",
|
||||||
CONF_NUMBER: 2,
|
CONF_NUMBER: 2,
|
||||||
|
CONF_LED: True,
|
||||||
CONF_RELEASE_DELAY: None,
|
CONF_RELEASE_DELAY: None,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
CONF_NAME: "Dim up",
|
CONF_NAME: "Dim up",
|
||||||
CONF_NUMBER: 3,
|
CONF_NUMBER: 3,
|
||||||
|
CONF_LED: False,
|
||||||
CONF_RELEASE_DELAY: 0.2,
|
CONF_RELEASE_DELAY: 0.2,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@ -5,6 +5,7 @@ from unittest.mock import ANY, MagicMock
|
|||||||
import pytest
|
import pytest
|
||||||
from pytest_unordered import unordered
|
from pytest_unordered import unordered
|
||||||
|
|
||||||
|
from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
|
||||||
from homeassistant.components.button import DOMAIN as BUTTON_DOMAIN
|
from homeassistant.components.button import DOMAIN as BUTTON_DOMAIN
|
||||||
from homeassistant.components.homeworks.const import (
|
from homeassistant.components.homeworks.const import (
|
||||||
CONF_ADDR,
|
CONF_ADDR,
|
||||||
@ -12,6 +13,7 @@ from homeassistant.components.homeworks.const import (
|
|||||||
CONF_DIMMERS,
|
CONF_DIMMERS,
|
||||||
CONF_INDEX,
|
CONF_INDEX,
|
||||||
CONF_KEYPADS,
|
CONF_KEYPADS,
|
||||||
|
CONF_LED,
|
||||||
CONF_NUMBER,
|
CONF_NUMBER,
|
||||||
CONF_RATE,
|
CONF_RATE,
|
||||||
CONF_RELEASE_DELAY,
|
CONF_RELEASE_DELAY,
|
||||||
@ -163,16 +165,19 @@ async def test_import_flow(
|
|||||||
{
|
{
|
||||||
CONF_NAME: "Morning",
|
CONF_NAME: "Morning",
|
||||||
CONF_NUMBER: 1,
|
CONF_NUMBER: 1,
|
||||||
|
CONF_LED: True,
|
||||||
CONF_RELEASE_DELAY: None,
|
CONF_RELEASE_DELAY: None,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
CONF_NAME: "Relax",
|
CONF_NAME: "Relax",
|
||||||
CONF_NUMBER: 2,
|
CONF_NUMBER: 2,
|
||||||
|
CONF_LED: True,
|
||||||
CONF_RELEASE_DELAY: None,
|
CONF_RELEASE_DELAY: None,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
CONF_NAME: "Dim up",
|
CONF_NAME: "Dim up",
|
||||||
CONF_NUMBER: 3,
|
CONF_NUMBER: 3,
|
||||||
|
CONF_LED: False,
|
||||||
CONF_RELEASE_DELAY: 0.2,
|
CONF_RELEASE_DELAY: 0.2,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -204,12 +209,13 @@ async def test_import_flow(
|
|||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
|
"led": True,
|
||||||
"name": "Morning",
|
"name": "Morning",
|
||||||
"number": 1,
|
"number": 1,
|
||||||
"release_delay": None,
|
"release_delay": None,
|
||||||
},
|
},
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
],
|
],
|
||||||
"name": "Foyer Keypad",
|
"name": "Foyer Keypad",
|
||||||
}
|
}
|
||||||
@ -295,12 +301,13 @@ async def test_reconfigure_flow(
|
|||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
|
"led": True,
|
||||||
"name": "Morning",
|
"name": "Morning",
|
||||||
"number": 1,
|
"number": 1,
|
||||||
"release_delay": None,
|
"release_delay": None,
|
||||||
},
|
},
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
],
|
],
|
||||||
"name": "Foyer Keypad",
|
"name": "Foyer Keypad",
|
||||||
},
|
},
|
||||||
@ -386,12 +393,13 @@ async def test_reconfigure_flow_flow_no_change(
|
|||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
|
"led": True,
|
||||||
"name": "Morning",
|
"name": "Morning",
|
||||||
"number": 1,
|
"number": 1,
|
||||||
"release_delay": None,
|
"release_delay": None,
|
||||||
},
|
},
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
],
|
],
|
||||||
"name": "Foyer Keypad",
|
"name": "Foyer Keypad",
|
||||||
}
|
}
|
||||||
@ -492,12 +500,13 @@ async def test_options_add_remove_light_flow(
|
|||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
|
"led": True,
|
||||||
"name": "Morning",
|
"name": "Morning",
|
||||||
"number": 1,
|
"number": 1,
|
||||||
"release_delay": None,
|
"release_delay": None,
|
||||||
},
|
},
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
],
|
],
|
||||||
"name": "Foyer Keypad",
|
"name": "Foyer Keypad",
|
||||||
}
|
}
|
||||||
@ -543,12 +552,13 @@ async def test_options_add_remove_light_flow(
|
|||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
|
"led": True,
|
||||||
"name": "Morning",
|
"name": "Morning",
|
||||||
"number": 1,
|
"number": 1,
|
||||||
"release_delay": None,
|
"release_delay": None,
|
||||||
},
|
},
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
],
|
],
|
||||||
"name": "Foyer Keypad",
|
"name": "Foyer Keypad",
|
||||||
}
|
}
|
||||||
@ -602,12 +612,13 @@ async def test_options_add_remove_keypad_flow(
|
|||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
|
"led": True,
|
||||||
"name": "Morning",
|
"name": "Morning",
|
||||||
"number": 1,
|
"number": 1,
|
||||||
"release_delay": None,
|
"release_delay": None,
|
||||||
},
|
},
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
],
|
],
|
||||||
"name": "Foyer Keypad",
|
"name": "Foyer Keypad",
|
||||||
},
|
},
|
||||||
@ -750,12 +761,13 @@ async def test_options_edit_light_no_lights_flow(
|
|||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
|
"led": True,
|
||||||
"name": "Morning",
|
"name": "Morning",
|
||||||
"number": 1,
|
"number": 1,
|
||||||
"release_delay": None,
|
"release_delay": None,
|
||||||
},
|
},
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
],
|
],
|
||||||
"name": "Foyer Keypad",
|
"name": "Foyer Keypad",
|
||||||
}
|
}
|
||||||
@ -801,6 +813,7 @@ async def test_options_add_button_flow(
|
|||||||
mock_config_entry.add_to_hass(hass)
|
mock_config_entry.add_to_hass(hass)
|
||||||
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
assert len(hass.states.async_entity_ids(BINARY_SENSOR_DOMAIN)) == 2
|
||||||
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 3
|
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 3
|
||||||
|
|
||||||
result = await hass.config_entries.options.async_init(mock_config_entry.entry_id)
|
result = await hass.config_entries.options.async_init(mock_config_entry.entry_id)
|
||||||
@ -836,6 +849,7 @@ async def test_options_add_button_flow(
|
|||||||
CONF_NAME: "Dim down",
|
CONF_NAME: "Dim down",
|
||||||
CONF_NUMBER: 4,
|
CONF_NUMBER: 4,
|
||||||
CONF_RELEASE_DELAY: 0.2,
|
CONF_RELEASE_DELAY: 0.2,
|
||||||
|
CONF_LED: True,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -850,13 +864,15 @@ async def test_options_add_button_flow(
|
|||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
|
"led": True,
|
||||||
"name": "Morning",
|
"name": "Morning",
|
||||||
"number": 1,
|
"number": 1,
|
||||||
"release_delay": None,
|
"release_delay": None,
|
||||||
},
|
},
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
{
|
{
|
||||||
|
"led": True,
|
||||||
"name": "Dim down",
|
"name": "Dim down",
|
||||||
"number": 4,
|
"number": 4,
|
||||||
"release_delay": 0.2,
|
"release_delay": 0.2,
|
||||||
@ -871,6 +887,7 @@ async def test_options_add_button_flow(
|
|||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
# Check the new entities were added
|
# Check the new entities were added
|
||||||
|
assert len(hass.states.async_entity_ids(BINARY_SENSOR_DOMAIN)) == 3
|
||||||
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 4
|
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 4
|
||||||
|
|
||||||
|
|
||||||
@ -881,6 +898,7 @@ async def test_options_add_button_flow_duplicate(
|
|||||||
mock_config_entry.add_to_hass(hass)
|
mock_config_entry.add_to_hass(hass)
|
||||||
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
assert len(hass.states.async_entity_ids(BINARY_SENSOR_DOMAIN)) == 2
|
||||||
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 3
|
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 3
|
||||||
|
|
||||||
result = await hass.config_entries.options.async_init(mock_config_entry.entry_id)
|
result = await hass.config_entries.options.async_init(mock_config_entry.entry_id)
|
||||||
@ -930,6 +948,7 @@ async def test_options_edit_button_flow(
|
|||||||
mock_config_entry.add_to_hass(hass)
|
mock_config_entry.add_to_hass(hass)
|
||||||
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
assert len(hass.states.async_entity_ids(BINARY_SENSOR_DOMAIN)) == 2
|
||||||
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 3
|
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 3
|
||||||
|
|
||||||
result = await hass.config_entries.options.async_init(mock_config_entry.entry_id)
|
result = await hass.config_entries.options.async_init(mock_config_entry.entry_id)
|
||||||
@ -974,6 +993,7 @@ async def test_options_edit_button_flow(
|
|||||||
result["flow_id"],
|
result["flow_id"],
|
||||||
user_input={
|
user_input={
|
||||||
CONF_RELEASE_DELAY: 0,
|
CONF_RELEASE_DELAY: 0,
|
||||||
|
CONF_LED: False,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -988,12 +1008,13 @@ async def test_options_edit_button_flow(
|
|||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{
|
{
|
||||||
|
"led": False,
|
||||||
"name": "Morning",
|
"name": "Morning",
|
||||||
"number": 1,
|
"number": 1,
|
||||||
"release_delay": 0.0,
|
"release_delay": 0.0,
|
||||||
},
|
},
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
],
|
],
|
||||||
"name": "Foyer Keypad",
|
"name": "Foyer Keypad",
|
||||||
}
|
}
|
||||||
@ -1004,6 +1025,7 @@ async def test_options_edit_button_flow(
|
|||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
# Check the new entities were added
|
# Check the new entities were added
|
||||||
|
assert len(hass.states.async_entity_ids(BINARY_SENSOR_DOMAIN)) == 2
|
||||||
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 3
|
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 3
|
||||||
|
|
||||||
|
|
||||||
@ -1061,8 +1083,8 @@ async def test_options_remove_button_flow(
|
|||||||
{
|
{
|
||||||
"addr": "[02:08:02:01]",
|
"addr": "[02:08:02:01]",
|
||||||
"buttons": [
|
"buttons": [
|
||||||
{"name": "Relax", "number": 2, "release_delay": None},
|
{"led": True, "name": "Relax", "number": 2, "release_delay": None},
|
||||||
{"name": "Dim up", "number": 3, "release_delay": 0.2},
|
{"led": False, "name": "Dim up", "number": 3, "release_delay": 0.2},
|
||||||
],
|
],
|
||||||
"name": "Foyer Keypad",
|
"name": "Foyer Keypad",
|
||||||
}
|
}
|
||||||
@ -1073,4 +1095,5 @@ async def test_options_remove_button_flow(
|
|||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
# Check the entities were removed
|
# Check the entities were removed
|
||||||
|
assert len(hass.states.async_entity_ids(BINARY_SENSOR_DOMAIN)) == 1
|
||||||
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 2
|
assert len(hass.states.async_entity_ids(BUTTON_DOMAIN)) == 2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user