mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Timer code cleanup (#67604)
This commit is contained in:
parent
723dcbafca
commit
2791cd68c2
@ -55,8 +55,7 @@ STORAGE_KEY = DOMAIN
|
|||||||
STORAGE_VERSION = 1
|
STORAGE_VERSION = 1
|
||||||
|
|
||||||
CREATE_FIELDS = {
|
CREATE_FIELDS = {
|
||||||
vol.Required(CONF_NAME): vol.All(str, vol.Length(min=1)),
|
vol.Required(CONF_NAME): cv.string,
|
||||||
vol.Optional(CONF_NAME): cv.string,
|
|
||||||
vol.Optional(CONF_ICON): cv.icon,
|
vol.Optional(CONF_ICON): cv.icon,
|
||||||
vol.Optional(CONF_DURATION, default=DEFAULT_DURATION): cv.time_period,
|
vol.Optional(CONF_DURATION, default=DEFAULT_DURATION): cv.time_period,
|
||||||
}
|
}
|
||||||
@ -199,6 +198,9 @@ class Timer(RestoreEntity):
|
|||||||
self._end: datetime | None = None
|
self._end: datetime | None = None
|
||||||
self._listener: Callable[[], None] | None = None
|
self._listener: Callable[[], None] | None = None
|
||||||
|
|
||||||
|
self._attr_should_poll = False
|
||||||
|
self._attr_force_update = True
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_yaml(cls, config: dict) -> Timer:
|
def from_yaml(cls, config: dict) -> Timer:
|
||||||
"""Return entity instance initialized from yaml storage."""
|
"""Return entity instance initialized from yaml storage."""
|
||||||
@ -207,16 +209,6 @@ class Timer(RestoreEntity):
|
|||||||
timer.editable = False
|
timer.editable = False
|
||||||
return timer
|
return timer
|
||||||
|
|
||||||
@property
|
|
||||||
def should_poll(self):
|
|
||||||
"""If entity should be polled."""
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def force_update(self) -> bool:
|
|
||||||
"""Return True to fix restart issues."""
|
|
||||||
return True
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
"""Return name of the timer."""
|
"""Return name of the timer."""
|
||||||
@ -266,9 +258,6 @@ class Timer(RestoreEntity):
|
|||||||
if self._listener:
|
if self._listener:
|
||||||
self._listener()
|
self._listener()
|
||||||
self._listener = None
|
self._listener = None
|
||||||
newduration = None
|
|
||||||
if duration:
|
|
||||||
newduration = duration
|
|
||||||
|
|
||||||
event = EVENT_TIMER_STARTED
|
event = EVENT_TIMER_STARTED
|
||||||
if self._state in (STATUS_ACTIVE, STATUS_PAUSED):
|
if self._state in (STATUS_ACTIVE, STATUS_PAUSED):
|
||||||
@ -277,17 +266,13 @@ class Timer(RestoreEntity):
|
|||||||
self._state = STATUS_ACTIVE
|
self._state = STATUS_ACTIVE
|
||||||
start = dt_util.utcnow().replace(microsecond=0)
|
start = dt_util.utcnow().replace(microsecond=0)
|
||||||
|
|
||||||
if self._remaining and newduration is None:
|
# Set remaining to new value if needed
|
||||||
self._end = start + self._remaining
|
if duration:
|
||||||
|
self._remaining = self._duration = duration
|
||||||
elif newduration:
|
elif not self._remaining:
|
||||||
self._duration = newduration
|
|
||||||
self._remaining = newduration
|
|
||||||
self._end = start + self._duration
|
|
||||||
|
|
||||||
else:
|
|
||||||
self._remaining = self._duration
|
self._remaining = self._duration
|
||||||
self._end = start + self._duration
|
|
||||||
|
self._end = start + self._remaining
|
||||||
|
|
||||||
self.hass.bus.async_fire(event, {"entity_id": self.entity_id})
|
self.hass.bus.async_fire(event, {"entity_id": self.entity_id})
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ import pytest
|
|||||||
|
|
||||||
from homeassistant.components.timer import (
|
from homeassistant.components.timer import (
|
||||||
ATTR_DURATION,
|
ATTR_DURATION,
|
||||||
|
ATTR_REMAINING,
|
||||||
CONF_DURATION,
|
CONF_DURATION,
|
||||||
CONF_ICON,
|
CONF_ICON,
|
||||||
CONF_NAME,
|
CONF_NAME,
|
||||||
@ -190,6 +191,46 @@ async def test_methods_and_events(hass):
|
|||||||
assert len(results) == expectedEvents
|
assert len(results) == expectedEvents
|
||||||
|
|
||||||
|
|
||||||
|
async def test_start_service(hass):
|
||||||
|
"""Test the start/stop service."""
|
||||||
|
await async_setup_component(hass, DOMAIN, {DOMAIN: {"test1": {CONF_DURATION: 10}}})
|
||||||
|
|
||||||
|
state = hass.states.get("timer.test1")
|
||||||
|
assert state
|
||||||
|
assert state.state == STATUS_IDLE
|
||||||
|
assert state.attributes[ATTR_DURATION] == "0:00:10"
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
DOMAIN, SERVICE_START, {CONF_ENTITY_ID: "timer.test1"}
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get("timer.test1")
|
||||||
|
assert state
|
||||||
|
assert state.state == STATUS_ACTIVE
|
||||||
|
assert state.attributes[ATTR_DURATION] == "0:00:10"
|
||||||
|
assert state.attributes[ATTR_REMAINING] == "0:00:10"
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
DOMAIN, SERVICE_CANCEL, {CONF_ENTITY_ID: "timer.test1"}
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get("timer.test1")
|
||||||
|
assert state
|
||||||
|
assert state.state == STATUS_IDLE
|
||||||
|
assert state.attributes[ATTR_DURATION] == "0:00:10"
|
||||||
|
assert ATTR_REMAINING not in state.attributes
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
DOMAIN, SERVICE_START, {CONF_ENTITY_ID: "timer.test1", CONF_DURATION: 15}
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get("timer.test1")
|
||||||
|
assert state
|
||||||
|
assert state.state == STATUS_ACTIVE
|
||||||
|
assert state.attributes[ATTR_DURATION] == "0:00:15"
|
||||||
|
assert state.attributes[ATTR_REMAINING] == "0:00:15"
|
||||||
|
|
||||||
|
|
||||||
async def test_wait_till_timer_expires(hass):
|
async def test_wait_till_timer_expires(hass):
|
||||||
"""Test for a timer to end."""
|
"""Test for a timer to end."""
|
||||||
hass.state = CoreState.starting
|
hass.state = CoreState.starting
|
||||||
|
Loading…
x
Reference in New Issue
Block a user