mirror of
https://github.com/home-assistant/core.git
synced 2025-04-24 09:17:53 +00:00
Execute scripts from HomeKit (#53106)
This commit is contained in:
parent
7b27725ec1
commit
671e838085
@ -55,6 +55,9 @@ VALVE_TYPE = {
|
||||
}
|
||||
|
||||
|
||||
ACTIVATE_ONLY_SWITCH_DOMAINS = {"scene", "script"}
|
||||
|
||||
|
||||
@TYPES.register("Outlet")
|
||||
class Outlet(HomeAccessory):
|
||||
"""Generate an Outlet accessory."""
|
||||
@ -98,7 +101,7 @@ class Switch(HomeAccessory):
|
||||
def __init__(self, *args):
|
||||
"""Initialize a Switch accessory object."""
|
||||
super().__init__(*args, category=CATEGORY_SWITCH)
|
||||
self._domain = split_entity_id(self.entity_id)[0]
|
||||
self._domain, self._object_id = split_entity_id(self.entity_id)
|
||||
state = self.hass.states.get(self.entity_id)
|
||||
|
||||
self.activate_only = self.is_activate(self.hass.states.get(self.entity_id))
|
||||
@ -113,9 +116,7 @@ class Switch(HomeAccessory):
|
||||
|
||||
def is_activate(self, state):
|
||||
"""Check if entity is activate only."""
|
||||
if self._domain == "scene":
|
||||
return True
|
||||
return False
|
||||
return self._domain in ACTIVATE_ONLY_SWITCH_DOMAINS
|
||||
|
||||
def reset_switch(self, *args):
|
||||
"""Reset switch to emulate activate click."""
|
||||
@ -129,8 +130,14 @@ class Switch(HomeAccessory):
|
||||
if self.activate_only and not value:
|
||||
_LOGGER.debug("%s: Ignoring turn_off call", self.entity_id)
|
||||
return
|
||||
|
||||
params = {ATTR_ENTITY_ID: self.entity_id}
|
||||
service = SERVICE_TURN_ON if value else SERVICE_TURN_OFF
|
||||
if self._domain == "script":
|
||||
service = self._object_id
|
||||
params = {}
|
||||
else:
|
||||
service = SERVICE_TURN_ON if value else SERVICE_TURN_OFF
|
||||
|
||||
self.async_call_service(self._domain, service, params)
|
||||
|
||||
if self.activate_only:
|
||||
|
@ -84,7 +84,6 @@ async def test_outlet_set_state(hass, hk_driver, events):
|
||||
("automation.test", {}),
|
||||
("input_boolean.test", {}),
|
||||
("remote.test", {}),
|
||||
("script.test", {}),
|
||||
("switch.test", {}),
|
||||
],
|
||||
)
|
||||
@ -340,8 +339,9 @@ async def test_reset_switch(hass, hk_driver, events):
|
||||
assert len(events) == 1
|
||||
|
||||
|
||||
async def test_reset_switch_reload(hass, hk_driver, events):
|
||||
"""Test reset switch after script reload."""
|
||||
async def test_script_switch(hass, hk_driver, events):
|
||||
"""Test if script switch accessory is reset correctly."""
|
||||
domain = "script"
|
||||
entity_id = "script.test"
|
||||
|
||||
hass.states.async_set(entity_id, None)
|
||||
@ -350,8 +350,28 @@ async def test_reset_switch_reload(hass, hk_driver, events):
|
||||
await acc.run()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert acc.activate_only is False
|
||||
assert acc.activate_only is True
|
||||
assert acc.char_on.value is False
|
||||
|
||||
hass.states.async_set(entity_id, None)
|
||||
call_turn_on = async_mock_service(hass, domain, "test")
|
||||
call_turn_off = async_mock_service(hass, domain, "turn_off")
|
||||
|
||||
await hass.async_add_executor_job(acc.char_on.client_update_value, True)
|
||||
await hass.async_block_till_done()
|
||||
assert acc.char_on.value is True
|
||||
assert call_turn_on
|
||||
assert call_turn_on[0].data == {}
|
||||
assert len(events) == 1
|
||||
assert events[-1].data[ATTR_VALUE] is None
|
||||
|
||||
future = dt_util.utcnow() + timedelta(seconds=1)
|
||||
async_fire_time_changed(hass, future)
|
||||
await hass.async_block_till_done()
|
||||
assert acc.char_on.value is False
|
||||
assert len(events) == 1
|
||||
assert not call_turn_off
|
||||
|
||||
await hass.async_add_executor_job(acc.char_on.client_update_value, False)
|
||||
await hass.async_block_till_done()
|
||||
assert acc.char_on.value is False
|
||||
assert len(events) == 1
|
||||
|
Loading…
x
Reference in New Issue
Block a user