mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Fix timer with empty config (#30463)
This commit is contained in:
parent
6c89b6c5a2
commit
e233dd7cbe
@ -17,7 +17,7 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
DOMAIN = "timer"
|
DOMAIN = "timer"
|
||||||
ENTITY_ID_FORMAT = DOMAIN + ".{}"
|
ENTITY_ID_FORMAT = DOMAIN + ".{}"
|
||||||
|
|
||||||
DEFAULT_DURATION = 0
|
DEFAULT_DURATION = timedelta(0)
|
||||||
ATTR_DURATION = "duration"
|
ATTR_DURATION = "duration"
|
||||||
ATTR_REMAINING = "remaining"
|
ATTR_REMAINING = "remaining"
|
||||||
CONF_DURATION = "duration"
|
CONF_DURATION = "duration"
|
||||||
@ -37,18 +37,25 @@ SERVICE_PAUSE = "pause"
|
|||||||
SERVICE_CANCEL = "cancel"
|
SERVICE_CANCEL = "cancel"
|
||||||
SERVICE_FINISH = "finish"
|
SERVICE_FINISH = "finish"
|
||||||
|
|
||||||
|
|
||||||
|
def _none_to_empty_dict(value):
|
||||||
|
if value is None:
|
||||||
|
return {}
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema(
|
CONFIG_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
DOMAIN: cv.schema_with_slug_keys(
|
DOMAIN: cv.schema_with_slug_keys(
|
||||||
vol.Any(
|
vol.All(
|
||||||
|
_none_to_empty_dict,
|
||||||
{
|
{
|
||||||
vol.Optional(CONF_NAME): cv.string,
|
vol.Optional(CONF_NAME): cv.string,
|
||||||
vol.Optional(CONF_ICON): cv.icon,
|
vol.Optional(CONF_ICON): cv.icon,
|
||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_DURATION, timedelta(DEFAULT_DURATION)
|
CONF_DURATION, default=DEFAULT_DURATION
|
||||||
): cv.time_period,
|
): cv.time_period,
|
||||||
},
|
},
|
||||||
None,
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
@ -82,11 +89,7 @@ async def async_setup(hass, config):
|
|||||||
)
|
)
|
||||||
component.async_register_entity_service(
|
component.async_register_entity_service(
|
||||||
SERVICE_START,
|
SERVICE_START,
|
||||||
{
|
{vol.Optional(ATTR_DURATION, default=DEFAULT_DURATION): cv.time_period},
|
||||||
vol.Optional(
|
|
||||||
ATTR_DURATION, default=timedelta(DEFAULT_DURATION)
|
|
||||||
): cv.time_period
|
|
||||||
},
|
|
||||||
"async_start",
|
"async_start",
|
||||||
)
|
)
|
||||||
component.async_register_entity_service(SERVICE_PAUSE, {}, "async_pause")
|
component.async_register_entity_service(SERVICE_PAUSE, {}, "async_pause")
|
||||||
@ -108,7 +111,7 @@ async def _async_process_config(hass, config):
|
|||||||
|
|
||||||
name = cfg.get(CONF_NAME)
|
name = cfg.get(CONF_NAME)
|
||||||
icon = cfg.get(CONF_ICON)
|
icon = cfg.get(CONF_ICON)
|
||||||
duration = cfg.get(CONF_DURATION)
|
duration = cfg[CONF_DURATION]
|
||||||
|
|
||||||
entities.append(Timer(hass, object_id, name, icon, duration))
|
entities.append(Timer(hass, object_id, name, icon, duration))
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ from homeassistant.components.timer import (
|
|||||||
CONF_DURATION,
|
CONF_DURATION,
|
||||||
CONF_ICON,
|
CONF_ICON,
|
||||||
CONF_NAME,
|
CONF_NAME,
|
||||||
|
DEFAULT_DURATION,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
EVENT_TIMER_CANCELLED,
|
EVENT_TIMER_CANCELLED,
|
||||||
EVENT_TIMER_FINISHED,
|
EVENT_TIMER_FINISHED,
|
||||||
@ -63,20 +64,23 @@ async def test_config_options(hass):
|
|||||||
CONF_ICON: "mdi:work",
|
CONF_ICON: "mdi:work",
|
||||||
CONF_DURATION: 10,
|
CONF_DURATION: 10,
|
||||||
},
|
},
|
||||||
|
"test_3": None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert await async_setup_component(hass, "timer", config)
|
assert await async_setup_component(hass, "timer", config)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert count_start + 2 == len(hass.states.async_entity_ids())
|
assert count_start + 3 == len(hass.states.async_entity_ids())
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
state_1 = hass.states.get("timer.test_1")
|
state_1 = hass.states.get("timer.test_1")
|
||||||
state_2 = hass.states.get("timer.test_2")
|
state_2 = hass.states.get("timer.test_2")
|
||||||
|
state_3 = hass.states.get("timer.test_3")
|
||||||
|
|
||||||
assert state_1 is not None
|
assert state_1 is not None
|
||||||
assert state_2 is not None
|
assert state_2 is not None
|
||||||
|
assert state_3 is not None
|
||||||
|
|
||||||
assert STATUS_IDLE == state_1.state
|
assert STATUS_IDLE == state_1.state
|
||||||
assert ATTR_ICON not in state_1.attributes
|
assert ATTR_ICON not in state_1.attributes
|
||||||
@ -87,6 +91,9 @@ async def test_config_options(hass):
|
|||||||
assert "mdi:work" == state_2.attributes.get(ATTR_ICON)
|
assert "mdi:work" == state_2.attributes.get(ATTR_ICON)
|
||||||
assert "0:00:10" == state_2.attributes.get(ATTR_DURATION)
|
assert "0:00:10" == state_2.attributes.get(ATTR_DURATION)
|
||||||
|
|
||||||
|
assert STATUS_IDLE == state_3.state
|
||||||
|
assert str(DEFAULT_DURATION) == state_3.attributes.get(CONF_DURATION)
|
||||||
|
|
||||||
|
|
||||||
async def test_methods_and_events(hass):
|
async def test_methods_and_events(hass):
|
||||||
"""Test methods and events."""
|
"""Test methods and events."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user