mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 21:57:51 +00:00
Allow input_number entity_id as for numeric_state trigger thresholds (#45091)
* Allow input_number as limits for numeric_state trigger * Rename threshold schema
This commit is contained in:
parent
83b210061d
commit
de8f273bd0
@ -32,6 +32,9 @@ def validate_above_below(value):
|
|||||||
if above is None or below is None:
|
if above is None or below is None:
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
if isinstance(above, str) or isinstance(below, str):
|
||||||
|
return value
|
||||||
|
|
||||||
if above > below:
|
if above > below:
|
||||||
raise vol.Invalid(
|
raise vol.Invalid(
|
||||||
f"A value can never be above {above} and below {below} at the same time. You probably want two different triggers.",
|
f"A value can never be above {above} and below {below} at the same time. You probably want two different triggers.",
|
||||||
@ -45,8 +48,8 @@ TRIGGER_SCHEMA = vol.All(
|
|||||||
{
|
{
|
||||||
vol.Required(CONF_PLATFORM): "numeric_state",
|
vol.Required(CONF_PLATFORM): "numeric_state",
|
||||||
vol.Required(CONF_ENTITY_ID): cv.entity_ids,
|
vol.Required(CONF_ENTITY_ID): cv.entity_ids,
|
||||||
vol.Optional(CONF_BELOW): vol.Coerce(float),
|
vol.Optional(CONF_BELOW): cv.NUMERIC_STATE_THRESHOLD_SCHEMA,
|
||||||
vol.Optional(CONF_ABOVE): vol.Coerce(float),
|
vol.Optional(CONF_ABOVE): cv.NUMERIC_STATE_THRESHOLD_SCHEMA,
|
||||||
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
||||||
vol.Optional(CONF_FOR): cv.positive_time_period_template,
|
vol.Optional(CONF_FOR): cv.positive_time_period_template,
|
||||||
vol.Optional(CONF_ATTRIBUTE): cv.match_all,
|
vol.Optional(CONF_ATTRIBUTE): cv.match_all,
|
||||||
|
@ -916,18 +916,18 @@ SERVICE_SCHEMA = vol.All(
|
|||||||
has_at_least_one_key(CONF_SERVICE, CONF_SERVICE_TEMPLATE),
|
has_at_least_one_key(CONF_SERVICE, CONF_SERVICE_TEMPLATE),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
NUMERIC_STATE_THRESHOLD_SCHEMA = vol.Any(
|
||||||
|
vol.Coerce(float), vol.All(str, entity_domain("input_number"))
|
||||||
|
)
|
||||||
|
|
||||||
NUMERIC_STATE_CONDITION_SCHEMA = vol.All(
|
NUMERIC_STATE_CONDITION_SCHEMA = vol.All(
|
||||||
vol.Schema(
|
vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Required(CONF_CONDITION): "numeric_state",
|
vol.Required(CONF_CONDITION): "numeric_state",
|
||||||
vol.Required(CONF_ENTITY_ID): entity_ids,
|
vol.Required(CONF_ENTITY_ID): entity_ids,
|
||||||
vol.Optional(CONF_ATTRIBUTE): str,
|
vol.Optional(CONF_ATTRIBUTE): str,
|
||||||
CONF_BELOW: vol.Any(
|
CONF_BELOW: NUMERIC_STATE_THRESHOLD_SCHEMA,
|
||||||
vol.Coerce(float), vol.All(str, entity_domain("input_number"))
|
CONF_ABOVE: NUMERIC_STATE_THRESHOLD_SCHEMA,
|
||||||
),
|
|
||||||
CONF_ABOVE: vol.Any(
|
|
||||||
vol.Coerce(float), vol.All(str, entity_domain("input_number"))
|
|
||||||
),
|
|
||||||
vol.Optional(CONF_VALUE_TEMPLATE): template,
|
vol.Optional(CONF_VALUE_TEMPLATE): template,
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
@ -29,12 +29,27 @@ def calls(hass):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup_comp(hass):
|
async def setup_comp(hass):
|
||||||
"""Initialize components."""
|
"""Initialize components."""
|
||||||
mock_component(hass, "group")
|
mock_component(hass, "group")
|
||||||
|
await async_setup_component(
|
||||||
|
hass,
|
||||||
|
"input_number",
|
||||||
|
{
|
||||||
|
"input_number": {
|
||||||
|
"value_3": {"min": 0, "max": 255, "initial": 3},
|
||||||
|
"value_5": {"min": 0, "max": 255, "initial": 5},
|
||||||
|
"value_8": {"min": 0, "max": 255, "initial": 8},
|
||||||
|
"value_10": {"min": 0, "max": 255, "initial": 10},
|
||||||
|
"value_12": {"min": 0, "max": 255, "initial": 12},
|
||||||
|
"value_100": {"min": 0, "max": 255, "initial": 100},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_on_entity_removal(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_not_fires_on_entity_removal(hass, calls, below):
|
||||||
"""Test the firing with removed entity."""
|
"""Test the firing with removed entity."""
|
||||||
hass.states.async_set("test.entity", 11)
|
hass.states.async_set("test.entity", 11)
|
||||||
|
|
||||||
@ -46,7 +61,7 @@ async def test_if_not_fires_on_entity_removal(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -59,7 +74,8 @@ async def test_if_not_fires_on_entity_removal(hass, calls):
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_below(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_fires_on_entity_change_below(hass, calls, below):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
hass.states.async_set("test.entity", 11)
|
hass.states.async_set("test.entity", 11)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -73,7 +89,7 @@ async def test_if_fires_on_entity_change_below(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -99,7 +115,8 @@ async def test_if_fires_on_entity_change_below(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_over_to_below(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_fires_on_entity_change_over_to_below(hass, calls, below):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
hass.states.async_set("test.entity", 11)
|
hass.states.async_set("test.entity", 11)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -112,7 +129,7 @@ async def test_if_fires_on_entity_change_over_to_below(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -125,7 +142,8 @@ async def test_if_fires_on_entity_change_over_to_below(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entities_change_over_to_below(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_fires_on_entities_change_over_to_below(hass, calls, below):
|
||||||
"""Test the firing with changed entities."""
|
"""Test the firing with changed entities."""
|
||||||
hass.states.async_set("test.entity_1", 11)
|
hass.states.async_set("test.entity_1", 11)
|
||||||
hass.states.async_set("test.entity_2", 11)
|
hass.states.async_set("test.entity_2", 11)
|
||||||
@ -139,7 +157,7 @@ async def test_if_fires_on_entities_change_over_to_below(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": ["test.entity_1", "test.entity_2"],
|
"entity_id": ["test.entity_1", "test.entity_2"],
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -155,7 +173,8 @@ async def test_if_fires_on_entities_change_over_to_below(hass, calls):
|
|||||||
assert len(calls) == 2
|
assert len(calls) == 2
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_on_entity_change_below_to_below(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_not_fires_on_entity_change_below_to_below(hass, calls, below):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
context = Context()
|
context = Context()
|
||||||
hass.states.async_set("test.entity", 11)
|
hass.states.async_set("test.entity", 11)
|
||||||
@ -169,7 +188,7 @@ async def test_if_not_fires_on_entity_change_below_to_below(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -193,7 +212,8 @@ async def test_if_not_fires_on_entity_change_below_to_below(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_below_fires_on_entity_change_to_equal(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_not_below_fires_on_entity_change_to_equal(hass, calls, below):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
hass.states.async_set("test.entity", 11)
|
hass.states.async_set("test.entity", 11)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -206,7 +226,7 @@ async def test_if_not_below_fires_on_entity_change_to_equal(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -219,7 +239,8 @@ async def test_if_not_below_fires_on_entity_change_to_equal(hass, calls):
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_initial_entity_below(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_fires_on_initial_entity_below(hass, calls, below):
|
||||||
"""Test the firing when starting with a match."""
|
"""Test the firing when starting with a match."""
|
||||||
hass.states.async_set("test.entity", 9)
|
hass.states.async_set("test.entity", 9)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -232,7 +253,7 @@ async def test_if_fires_on_initial_entity_below(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -245,7 +266,8 @@ async def test_if_fires_on_initial_entity_below(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_initial_entity_above(hass, calls):
|
@pytest.mark.parametrize("above", (10, "input_number.value_10"))
|
||||||
|
async def test_if_fires_on_initial_entity_above(hass, calls, above):
|
||||||
"""Test the firing when starting with a match."""
|
"""Test the firing when starting with a match."""
|
||||||
hass.states.async_set("test.entity", 11)
|
hass.states.async_set("test.entity", 11)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -258,7 +280,7 @@ async def test_if_fires_on_initial_entity_above(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 10,
|
"above": above,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -271,7 +293,8 @@ async def test_if_fires_on_initial_entity_above(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_above(hass, calls):
|
@pytest.mark.parametrize("above", (10, "input_number.value_10"))
|
||||||
|
async def test_if_fires_on_entity_change_above(hass, calls, above):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
hass.states.async_set("test.entity", 9)
|
hass.states.async_set("test.entity", 9)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -284,7 +307,7 @@ async def test_if_fires_on_entity_change_above(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 10,
|
"above": above,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -296,7 +319,8 @@ async def test_if_fires_on_entity_change_above(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_below_to_above(hass, calls):
|
@pytest.mark.parametrize("above", (10, "input_number.value_10"))
|
||||||
|
async def test_if_fires_on_entity_change_below_to_above(hass, calls, above):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
# set initial state
|
# set initial state
|
||||||
hass.states.async_set("test.entity", 9)
|
hass.states.async_set("test.entity", 9)
|
||||||
@ -310,7 +334,7 @@ async def test_if_fires_on_entity_change_below_to_above(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 10,
|
"above": above,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -323,7 +347,8 @@ async def test_if_fires_on_entity_change_below_to_above(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_on_entity_change_above_to_above(hass, calls):
|
@pytest.mark.parametrize("above", (10, "input_number.value_10"))
|
||||||
|
async def test_if_not_fires_on_entity_change_above_to_above(hass, calls, above):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
# set initial state
|
# set initial state
|
||||||
hass.states.async_set("test.entity", 9)
|
hass.states.async_set("test.entity", 9)
|
||||||
@ -337,7 +362,7 @@ async def test_if_not_fires_on_entity_change_above_to_above(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 10,
|
"above": above,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -355,7 +380,8 @@ async def test_if_not_fires_on_entity_change_above_to_above(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_above_fires_on_entity_change_to_equal(hass, calls):
|
@pytest.mark.parametrize("above", (10, "input_number.value_10"))
|
||||||
|
async def test_if_not_above_fires_on_entity_change_to_equal(hass, calls, above):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
# set initial state
|
# set initial state
|
||||||
hass.states.async_set("test.entity", 9)
|
hass.states.async_set("test.entity", 9)
|
||||||
@ -369,7 +395,7 @@ async def test_if_not_above_fires_on_entity_change_to_equal(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 10,
|
"above": above,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -382,7 +408,16 @@ async def test_if_not_above_fires_on_entity_change_to_equal(hass, calls):
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_below_range(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(5, 10),
|
||||||
|
(5, "input_number.value_10"),
|
||||||
|
("input_number.value_5", 10),
|
||||||
|
("input_number.value_5", "input_number.value_10"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_entity_change_below_range(hass, calls, above, below):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
hass.states.async_set("test.entity", 11)
|
hass.states.async_set("test.entity", 11)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -395,8 +430,8 @@ async def test_if_fires_on_entity_change_below_range(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
"above": 5,
|
"above": above,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -408,7 +443,16 @@ async def test_if_fires_on_entity_change_below_range(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_below_above_range(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(5, 10),
|
||||||
|
(5, "input_number.value_10"),
|
||||||
|
("input_number.value_5", 10),
|
||||||
|
("input_number.value_5", "input_number.value_10"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_entity_change_below_above_range(hass, calls, above, below):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
@ -418,8 +462,8 @@ async def test_if_fires_on_entity_change_below_above_range(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
"above": 5,
|
"above": above,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -431,7 +475,16 @@ async def test_if_fires_on_entity_change_below_above_range(hass, calls):
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_over_to_below_range(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(5, 10),
|
||||||
|
(5, "input_number.value_10"),
|
||||||
|
("input_number.value_5", 10),
|
||||||
|
("input_number.value_5", "input_number.value_10"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_entity_change_over_to_below_range(hass, calls, above, below):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
hass.states.async_set("test.entity", 11)
|
hass.states.async_set("test.entity", 11)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -444,8 +497,8 @@ async def test_if_fires_on_entity_change_over_to_below_range(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
"above": 5,
|
"above": above,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -458,7 +511,18 @@ async def test_if_fires_on_entity_change_over_to_below_range(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_over_to_below_above_range(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(5, 10),
|
||||||
|
(5, "input_number.value_10"),
|
||||||
|
("input_number.value_5", 10),
|
||||||
|
("input_number.value_5", "input_number.value_10"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_entity_change_over_to_below_above_range(
|
||||||
|
hass, calls, above, below
|
||||||
|
):
|
||||||
"""Test the firing with changed entity."""
|
"""Test the firing with changed entity."""
|
||||||
hass.states.async_set("test.entity", 11)
|
hass.states.async_set("test.entity", 11)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -471,8 +535,8 @@ async def test_if_fires_on_entity_change_over_to_below_above_range(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": above,
|
||||||
"above": 5,
|
"above": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -485,7 +549,8 @@ async def test_if_fires_on_entity_change_over_to_below_above_range(hass, calls):
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_if_entity_not_match(hass, calls):
|
@pytest.mark.parametrize("below", (100, "input_number.value_100"))
|
||||||
|
async def test_if_not_fires_if_entity_not_match(hass, calls, below):
|
||||||
"""Test if not fired with non matching entity."""
|
"""Test if not fired with non matching entity."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
@ -495,7 +560,7 @@ async def test_if_not_fires_if_entity_not_match(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.another_entity",
|
"entity_id": "test.another_entity",
|
||||||
"below": 100,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -507,7 +572,8 @@ async def test_if_not_fires_if_entity_not_match(hass, calls):
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_below_with_attribute(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_fires_on_entity_change_below_with_attribute(hass, calls, below):
|
||||||
"""Test attributes change."""
|
"""Test attributes change."""
|
||||||
hass.states.async_set("test.entity", 11, {"test_attribute": 11})
|
hass.states.async_set("test.entity", 11, {"test_attribute": 11})
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -520,7 +586,7 @@ async def test_if_fires_on_entity_change_below_with_attribute(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -532,7 +598,10 @@ async def test_if_fires_on_entity_change_below_with_attribute(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_on_entity_change_not_below_with_attribute(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_not_fires_on_entity_change_not_below_with_attribute(
|
||||||
|
hass, calls, below
|
||||||
|
):
|
||||||
"""Test attributes."""
|
"""Test attributes."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
@ -542,7 +611,7 @@ async def test_if_not_fires_on_entity_change_not_below_with_attribute(hass, call
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -554,7 +623,8 @@ async def test_if_not_fires_on_entity_change_not_below_with_attribute(hass, call
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_attribute_change_with_attribute_below(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_fires_on_attribute_change_with_attribute_below(hass, calls, below):
|
||||||
"""Test attributes change."""
|
"""Test attributes change."""
|
||||||
hass.states.async_set("test.entity", "entity", {"test_attribute": 11})
|
hass.states.async_set("test.entity", "entity", {"test_attribute": 11})
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -568,7 +638,7 @@ async def test_if_fires_on_attribute_change_with_attribute_below(hass, calls):
|
|||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"value_template": "{{ state.attributes.test_attribute }}",
|
"value_template": "{{ state.attributes.test_attribute }}",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -580,7 +650,10 @@ async def test_if_fires_on_attribute_change_with_attribute_below(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_on_attribute_change_with_attribute_not_below(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_not_fires_on_attribute_change_with_attribute_not_below(
|
||||||
|
hass, calls, below
|
||||||
|
):
|
||||||
"""Test attributes change."""
|
"""Test attributes change."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
@ -591,7 +664,7 @@ async def test_if_not_fires_on_attribute_change_with_attribute_not_below(hass, c
|
|||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"value_template": "{{ state.attributes.test_attribute }}",
|
"value_template": "{{ state.attributes.test_attribute }}",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -603,7 +676,8 @@ async def test_if_not_fires_on_attribute_change_with_attribute_not_below(hass, c
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_on_entity_change_with_attribute_below(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_not_fires_on_entity_change_with_attribute_below(hass, calls, below):
|
||||||
"""Test attributes change."""
|
"""Test attributes change."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
@ -614,7 +688,7 @@ async def test_if_not_fires_on_entity_change_with_attribute_below(hass, calls):
|
|||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"value_template": "{{ state.attributes.test_attribute }}",
|
"value_template": "{{ state.attributes.test_attribute }}",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -626,7 +700,10 @@ async def test_if_not_fires_on_entity_change_with_attribute_below(hass, calls):
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_on_entity_change_with_not_attribute_below(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_if_not_fires_on_entity_change_with_not_attribute_below(
|
||||||
|
hass, calls, below
|
||||||
|
):
|
||||||
"""Test attributes change."""
|
"""Test attributes change."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
@ -637,7 +714,7 @@ async def test_if_not_fires_on_entity_change_with_not_attribute_below(hass, call
|
|||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"value_template": "{{ state.attributes.test_attribute }}",
|
"value_template": "{{ state.attributes.test_attribute }}",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -649,7 +726,10 @@ async def test_if_not_fires_on_entity_change_with_not_attribute_below(hass, call
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_fires_on_attr_change_with_attribute_below_and_multiple_attr(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_fires_on_attr_change_with_attribute_below_and_multiple_attr(
|
||||||
|
hass, calls, below
|
||||||
|
):
|
||||||
"""Test attributes change."""
|
"""Test attributes change."""
|
||||||
hass.states.async_set(
|
hass.states.async_set(
|
||||||
"test.entity", "entity", {"test_attribute": 11, "not_test_attribute": 11}
|
"test.entity", "entity", {"test_attribute": 11, "not_test_attribute": 11}
|
||||||
@ -664,7 +744,7 @@ async def test_fires_on_attr_change_with_attribute_below_and_multiple_attr(hass,
|
|||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"value_template": "{{ state.attributes.test_attribute }}",
|
"value_template": "{{ state.attributes.test_attribute }}",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -678,7 +758,8 @@ async def test_fires_on_attr_change_with_attribute_below_and_multiple_attr(hass,
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_template_list(hass, calls):
|
@pytest.mark.parametrize("below", (10, "input_number.value_10"))
|
||||||
|
async def test_template_list(hass, calls, below):
|
||||||
"""Test template list."""
|
"""Test template list."""
|
||||||
hass.states.async_set("test.entity", "entity", {"test_attribute": [11, 15, 11]})
|
hass.states.async_set("test.entity", "entity", {"test_attribute": [11, 15, 11]})
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -691,7 +772,7 @@ async def test_template_list(hass, calls):
|
|||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"value_template": "{{ state.attributes.test_attribute[2] }}",
|
"value_template": "{{ state.attributes.test_attribute[2] }}",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -703,7 +784,8 @@ async def test_template_list(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_template_string(hass, calls):
|
@pytest.mark.parametrize("below", (10.0, "input_number.value_10"))
|
||||||
|
async def test_template_string(hass, calls, below):
|
||||||
"""Test template string."""
|
"""Test template string."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
@ -714,7 +796,7 @@ async def test_template_string(hass, calls):
|
|||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"value_template": "{{ state.attributes.test_attribute | multiply(10) }}",
|
"value_template": "{{ state.attributes.test_attribute | multiply(10) }}",
|
||||||
"below": 10,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {
|
"action": {
|
||||||
"service": "test.automation",
|
"service": "test.automation",
|
||||||
@ -742,7 +824,7 @@ async def test_template_string(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
assert (
|
assert (
|
||||||
calls[0].data["some"]
|
calls[0].data["some"]
|
||||||
== "numeric_state - test.entity - 10.0 - None - test state 1 - test state 2"
|
== f"numeric_state - test.entity - {below} - None - test state 1 - test state 2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -771,7 +853,16 @@ async def test_not_fires_on_attr_change_with_attr_not_below_multiple_attr(hass,
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_action(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_action(hass, calls, above, below):
|
||||||
"""Test if action."""
|
"""Test if action."""
|
||||||
entity_id = "domain.test_entity"
|
entity_id = "domain.test_entity"
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
@ -783,8 +874,8 @@ async def test_if_action(hass, calls):
|
|||||||
"condition": {
|
"condition": {
|
||||||
"condition": "numeric_state",
|
"condition": "numeric_state",
|
||||||
"entity_id": entity_id,
|
"entity_id": entity_id,
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
}
|
}
|
||||||
@ -810,7 +901,16 @@ async def test_if_action(hass, calls):
|
|||||||
assert len(calls) == 2
|
assert len(calls) == 2
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fails_setup_bad_for(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fails_setup_bad_for(hass, calls, above, below):
|
||||||
"""Test for setup failure for bad for."""
|
"""Test for setup failure for bad for."""
|
||||||
hass.states.async_set("test.entity", 5)
|
hass.states.async_set("test.entity", 5)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -823,8 +923,8 @@ async def test_if_fails_setup_bad_for(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": {"invalid": 5},
|
"for": {"invalid": 5},
|
||||||
},
|
},
|
||||||
"action": {"service": "homeassistant.turn_on"},
|
"action": {"service": "homeassistant.turn_on"},
|
||||||
@ -857,7 +957,16 @@ async def test_if_fails_setup_for_without_above_below(hass, calls):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_on_entity_change_with_for(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_not_fires_on_entity_change_with_for(hass, calls, above, below):
|
||||||
"""Test for not firing on entity change with for."""
|
"""Test for not firing on entity change with for."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
@ -867,8 +976,8 @@ async def test_if_not_fires_on_entity_change_with_for(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": {"seconds": 5},
|
"for": {"seconds": 5},
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
@ -885,7 +994,18 @@ async def test_if_not_fires_on_entity_change_with_for(hass, calls):
|
|||||||
assert len(calls) == 0
|
assert len(calls) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_if_not_fires_on_entities_change_with_for_after_stop(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_not_fires_on_entities_change_with_for_after_stop(
|
||||||
|
hass, calls, above, below
|
||||||
|
):
|
||||||
"""Test for not firing on entities change with for after stop."""
|
"""Test for not firing on entities change with for after stop."""
|
||||||
hass.states.async_set("test.entity_1", 0)
|
hass.states.async_set("test.entity_1", 0)
|
||||||
hass.states.async_set("test.entity_2", 0)
|
hass.states.async_set("test.entity_2", 0)
|
||||||
@ -899,8 +1019,8 @@ async def test_if_not_fires_on_entities_change_with_for_after_stop(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": ["test.entity_1", "test.entity_2"],
|
"entity_id": ["test.entity_1", "test.entity_2"],
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": {"seconds": 5},
|
"for": {"seconds": 5},
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
@ -932,7 +1052,18 @@ async def test_if_not_fires_on_entities_change_with_for_after_stop(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_with_for_attribute_change(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_entity_change_with_for_attribute_change(
|
||||||
|
hass, calls, above, below
|
||||||
|
):
|
||||||
"""Test for firing on entity change with for and attribute change."""
|
"""Test for firing on entity change with for and attribute change."""
|
||||||
hass.states.async_set("test.entity", 0)
|
hass.states.async_set("test.entity", 0)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -945,8 +1076,8 @@ async def test_if_fires_on_entity_change_with_for_attribute_change(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": {"seconds": 5},
|
"for": {"seconds": 5},
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
@ -970,7 +1101,16 @@ async def test_if_fires_on_entity_change_with_for_attribute_change(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entity_change_with_for(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_entity_change_with_for(hass, calls, above, below):
|
||||||
"""Test for firing on entity change with for."""
|
"""Test for firing on entity change with for."""
|
||||||
hass.states.async_set("test.entity", 0)
|
hass.states.async_set("test.entity", 0)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -983,8 +1123,8 @@ async def test_if_fires_on_entity_change_with_for(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": {"seconds": 5},
|
"for": {"seconds": 5},
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
@ -999,7 +1139,8 @@ async def test_if_fires_on_entity_change_with_for(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_wait_template_with_trigger(hass, calls):
|
@pytest.mark.parametrize("above", (10, "input_number.value_10"))
|
||||||
|
async def test_wait_template_with_trigger(hass, calls, above):
|
||||||
"""Test using wait template with 'trigger.entity_id'."""
|
"""Test using wait template with 'trigger.entity_id'."""
|
||||||
hass.states.async_set("test.entity", "0")
|
hass.states.async_set("test.entity", "0")
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -1012,7 +1153,7 @@ async def test_wait_template_with_trigger(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 10,
|
"above": above,
|
||||||
},
|
},
|
||||||
"action": [
|
"action": [
|
||||||
{"wait_template": "{{ states(trigger.entity_id) | int < 10 }}"},
|
{"wait_template": "{{ states(trigger.entity_id) | int < 10 }}"},
|
||||||
@ -1039,7 +1180,16 @@ async def test_wait_template_with_trigger(hass, calls):
|
|||||||
assert "numeric_state - test.entity - 12" == calls[0].data["some"]
|
assert "numeric_state - test.entity - 12" == calls[0].data["some"]
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entities_change_no_overlap(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_entities_change_no_overlap(hass, calls, above, below):
|
||||||
"""Test for firing on entities change with no overlap."""
|
"""Test for firing on entities change with no overlap."""
|
||||||
hass.states.async_set("test.entity_1", 0)
|
hass.states.async_set("test.entity_1", 0)
|
||||||
hass.states.async_set("test.entity_2", 0)
|
hass.states.async_set("test.entity_2", 0)
|
||||||
@ -1053,8 +1203,8 @@ async def test_if_fires_on_entities_change_no_overlap(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": ["test.entity_1", "test.entity_2"],
|
"entity_id": ["test.entity_1", "test.entity_2"],
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": {"seconds": 5},
|
"for": {"seconds": 5},
|
||||||
},
|
},
|
||||||
"action": {
|
"action": {
|
||||||
@ -1086,7 +1236,16 @@ async def test_if_fires_on_entities_change_no_overlap(hass, calls):
|
|||||||
assert calls[1].data["some"] == "test.entity_2"
|
assert calls[1].data["some"] == "test.entity_2"
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entities_change_overlap(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_entities_change_overlap(hass, calls, above, below):
|
||||||
"""Test for firing on entities change with overlap."""
|
"""Test for firing on entities change with overlap."""
|
||||||
hass.states.async_set("test.entity_1", 0)
|
hass.states.async_set("test.entity_1", 0)
|
||||||
hass.states.async_set("test.entity_2", 0)
|
hass.states.async_set("test.entity_2", 0)
|
||||||
@ -1100,8 +1259,8 @@ async def test_if_fires_on_entities_change_overlap(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": ["test.entity_1", "test.entity_2"],
|
"entity_id": ["test.entity_1", "test.entity_2"],
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": {"seconds": 5},
|
"for": {"seconds": 5},
|
||||||
},
|
},
|
||||||
"action": {
|
"action": {
|
||||||
@ -1144,7 +1303,16 @@ async def test_if_fires_on_entities_change_overlap(hass, calls):
|
|||||||
assert calls[1].data["some"] == "test.entity_2"
|
assert calls[1].data["some"] == "test.entity_2"
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_change_with_for_template_1(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_change_with_for_template_1(hass, calls, above, below):
|
||||||
"""Test for firing on change with for template."""
|
"""Test for firing on change with for template."""
|
||||||
hass.states.async_set("test.entity", 0)
|
hass.states.async_set("test.entity", 0)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -1157,8 +1325,8 @@ async def test_if_fires_on_change_with_for_template_1(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": {"seconds": "{{ 5 }}"},
|
"for": {"seconds": "{{ 5 }}"},
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
@ -1174,7 +1342,16 @@ async def test_if_fires_on_change_with_for_template_1(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_change_with_for_template_2(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_change_with_for_template_2(hass, calls, above, below):
|
||||||
"""Test for firing on change with for template."""
|
"""Test for firing on change with for template."""
|
||||||
hass.states.async_set("test.entity", 0)
|
hass.states.async_set("test.entity", 0)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -1187,8 +1364,8 @@ async def test_if_fires_on_change_with_for_template_2(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": "{{ 5 }}",
|
"for": "{{ 5 }}",
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
@ -1204,7 +1381,16 @@ async def test_if_fires_on_change_with_for_template_2(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_change_with_for_template_3(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_change_with_for_template_3(hass, calls, above, below):
|
||||||
"""Test for firing on change with for template."""
|
"""Test for firing on change with for template."""
|
||||||
hass.states.async_set("test.entity", 0)
|
hass.states.async_set("test.entity", 0)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -1217,8 +1403,8 @@ async def test_if_fires_on_change_with_for_template_3(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": "00:00:{{ 5 }}",
|
"for": "00:00:{{ 5 }}",
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
@ -1234,7 +1420,16 @@ async def test_if_fires_on_change_with_for_template_3(hass, calls):
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_invalid_for_template(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_invalid_for_template(hass, calls, above, below):
|
||||||
"""Test for invalid for template."""
|
"""Test for invalid for template."""
|
||||||
hass.states.async_set("test.entity", 0)
|
hass.states.async_set("test.entity", 0)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -1247,8 +1442,8 @@ async def test_invalid_for_template(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": "{{ five }}",
|
"for": "{{ five }}",
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
@ -1262,7 +1457,18 @@ async def test_invalid_for_template(hass, calls):
|
|||||||
assert mock_logger.error.called
|
assert mock_logger.error.called
|
||||||
|
|
||||||
|
|
||||||
async def test_if_fires_on_entities_change_overlap_for_template(hass, calls):
|
@pytest.mark.parametrize(
|
||||||
|
"above, below",
|
||||||
|
(
|
||||||
|
(8, 12),
|
||||||
|
(8, "input_number.value_12"),
|
||||||
|
("input_number.value_8", 12),
|
||||||
|
("input_number.value_8", "input_number.value_12"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_if_fires_on_entities_change_overlap_for_template(
|
||||||
|
hass, calls, above, below
|
||||||
|
):
|
||||||
"""Test for firing on entities change with overlap and for template."""
|
"""Test for firing on entities change with overlap and for template."""
|
||||||
hass.states.async_set("test.entity_1", 0)
|
hass.states.async_set("test.entity_1", 0)
|
||||||
hass.states.async_set("test.entity_2", 0)
|
hass.states.async_set("test.entity_2", 0)
|
||||||
@ -1276,8 +1482,8 @@ async def test_if_fires_on_entities_change_overlap_for_template(hass, calls):
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": ["test.entity_1", "test.entity_2"],
|
"entity_id": ["test.entity_1", "test.entity_2"],
|
||||||
"above": 8,
|
"above": above,
|
||||||
"below": 12,
|
"below": below,
|
||||||
"for": '{{ 5 if trigger.entity_id == "test.entity_1"'
|
"for": '{{ 5 if trigger.entity_id == "test.entity_1"'
|
||||||
" else 10 }}",
|
" else 10 }}",
|
||||||
},
|
},
|
||||||
@ -1335,7 +1541,30 @@ def test_below_above():
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_attribute_if_fires_on_entity_change_with_both_filters(hass, calls):
|
def test_schema_input_number():
|
||||||
|
"""Test input_number only is accepted for above/below."""
|
||||||
|
with pytest.raises(vol.Invalid):
|
||||||
|
numeric_state_trigger.TRIGGER_SCHEMA(
|
||||||
|
{
|
||||||
|
"platform": "numeric_state",
|
||||||
|
"above": "input_datetime.some_input",
|
||||||
|
"below": 1000,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
with pytest.raises(vol.Invalid):
|
||||||
|
numeric_state_trigger.TRIGGER_SCHEMA(
|
||||||
|
{
|
||||||
|
"platform": "numeric_state",
|
||||||
|
"below": "input_datetime.some_input",
|
||||||
|
"above": 1200,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("above", (3, "input_number.value_3"))
|
||||||
|
async def test_attribute_if_fires_on_entity_change_with_both_filters(
|
||||||
|
hass, calls, above
|
||||||
|
):
|
||||||
"""Test for firing if both filters are match attribute."""
|
"""Test for firing if both filters are match attribute."""
|
||||||
hass.states.async_set("test.entity", "bla", {"test-measurement": 1})
|
hass.states.async_set("test.entity", "bla", {"test-measurement": 1})
|
||||||
|
|
||||||
@ -1347,7 +1576,7 @@ async def test_attribute_if_fires_on_entity_change_with_both_filters(hass, calls
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 3,
|
"above": above,
|
||||||
"attribute": "test-measurement",
|
"attribute": "test-measurement",
|
||||||
},
|
},
|
||||||
"action": {"service": "test.automation"},
|
"action": {"service": "test.automation"},
|
||||||
@ -1361,8 +1590,9 @@ async def test_attribute_if_fires_on_entity_change_with_both_filters(hass, calls
|
|||||||
assert len(calls) == 1
|
assert len(calls) == 1
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("above", (3, "input_number.value_3"))
|
||||||
async def test_attribute_if_not_fires_on_entities_change_with_for_after_stop(
|
async def test_attribute_if_not_fires_on_entities_change_with_for_after_stop(
|
||||||
hass, calls
|
hass, calls, above
|
||||||
):
|
):
|
||||||
"""Test for not firing on entity change with for after stop trigger."""
|
"""Test for not firing on entity change with for after stop trigger."""
|
||||||
hass.states.async_set("test.entity", "bla", {"test-measurement": 1})
|
hass.states.async_set("test.entity", "bla", {"test-measurement": 1})
|
||||||
@ -1375,7 +1605,7 @@ async def test_attribute_if_not_fires_on_entities_change_with_for_after_stop(
|
|||||||
"trigger": {
|
"trigger": {
|
||||||
"platform": "numeric_state",
|
"platform": "numeric_state",
|
||||||
"entity_id": "test.entity",
|
"entity_id": "test.entity",
|
||||||
"above": 3,
|
"above": above,
|
||||||
"attribute": "test-measurement",
|
"attribute": "test-measurement",
|
||||||
"for": 5,
|
"for": 5,
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user