Add availability to Scrape config flow (#105516)

This commit is contained in:
G Johansson 2024-03-21 13:13:25 +01:00 committed by GitHub
parent e5fa6f0176
commit 9289fa23a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 69 additions and 1 deletions

View File

@ -60,6 +60,7 @@ from homeassistant.helpers.selector import (
TextSelectorConfig, TextSelectorConfig,
TextSelectorType, TextSelectorType,
) )
from homeassistant.helpers.trigger_template_entity import CONF_AVAILABILITY
from . import COMBINED_SCHEMA from . import COMBINED_SCHEMA
from .const import ( from .const import (
@ -105,6 +106,7 @@ SENSOR_SETUP = {
), ),
vol.Optional(CONF_ATTRIBUTE): TextSelector(), vol.Optional(CONF_ATTRIBUTE): TextSelector(),
vol.Optional(CONF_VALUE_TEMPLATE): TemplateSelector(), vol.Optional(CONF_VALUE_TEMPLATE): TemplateSelector(),
vol.Optional(CONF_AVAILABILITY): TemplateSelector(),
vol.Optional(CONF_DEVICE_CLASS): SelectSelector( vol.Optional(CONF_DEVICE_CLASS): SelectSelector(
SelectSelectorConfig( SelectSelectorConfig(
options=[ options=[

View File

@ -113,10 +113,13 @@ async def async_setup_entry(
Template(value_string, hass) if value_string is not None else None Template(value_string, hass) if value_string is not None else None
) )
trigger_entity_config = {CONF_NAME: name} trigger_entity_config: dict[str, str | Template | None] = {CONF_NAME: name}
for key in TRIGGER_ENTITY_OPTIONS: for key in TRIGGER_ENTITY_OPTIONS:
if key not in sensor_config: if key not in sensor_config:
continue continue
if key == CONF_AVAILABILITY:
trigger_entity_config[key] = Template(sensor_config[key], hass)
continue
trigger_entity_config[key] = sensor_config[key] trigger_entity_config[key] = sensor_config[key]
entities.append( entities.append(

View File

@ -5,24 +5,36 @@ from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch from unittest.mock import patch
from freezegun.api import FrozenDateTimeFactory
import pytest import pytest
from homeassistant.components.rest.const import DEFAULT_METHOD
from homeassistant.components.rest.data import DEFAULT_TIMEOUT
from homeassistant.components.scrape.const import ( from homeassistant.components.scrape.const import (
CONF_ENCODING,
CONF_INDEX, CONF_INDEX,
CONF_SELECT, CONF_SELECT,
DEFAULT_ENCODING,
DEFAULT_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL,
DEFAULT_VERIFY_SSL,
) )
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
CONF_STATE_CLASS, CONF_STATE_CLASS,
DOMAIN as SENSOR_DOMAIN,
SensorDeviceClass, SensorDeviceClass,
SensorStateClass, SensorStateClass,
) )
from homeassistant.const import ( from homeassistant.const import (
CONF_DEVICE_CLASS, CONF_DEVICE_CLASS,
CONF_ICON, CONF_ICON,
CONF_METHOD,
CONF_NAME, CONF_NAME,
CONF_RESOURCE,
CONF_TIMEOUT,
CONF_UNIQUE_ID, CONF_UNIQUE_ID,
CONF_UNIT_OF_MEASUREMENT, CONF_UNIT_OF_MEASUREMENT,
CONF_VALUE_TEMPLATE,
CONF_VERIFY_SSL,
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
UnitOfTemperature, UnitOfTemperature,
@ -562,3 +574,54 @@ async def test_templates_with_yaml(hass: HomeAssistant) -> None:
assert state.state == "Current Version: 2021.12.10" assert state.state == "Current Version: 2021.12.10"
assert state.attributes[CONF_ICON] == "mdi:on" assert state.attributes[CONF_ICON] == "mdi:on"
assert state.attributes["entity_picture"] == "/local/picture1.jpg" assert state.attributes["entity_picture"] == "/local/picture1.jpg"
@pytest.mark.parametrize(
"get_config",
[
{
CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: DEFAULT_METHOD,
CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL,
CONF_TIMEOUT: DEFAULT_TIMEOUT,
CONF_ENCODING: DEFAULT_ENCODING,
SENSOR_DOMAIN: [
{
CONF_SELECT: ".current-version h1",
CONF_NAME: "Current version",
CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}",
CONF_INDEX: 0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
CONF_AVAILABILITY: '{{ states("sensor.input1")=="on" }}',
}
],
}
],
)
async def test_availability(
hass: HomeAssistant,
loaded_entry: MockConfigEntry,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test availability when setup from config entry."""
hass.states.async_set("sensor.input1", "on")
freezer.tick(timedelta(minutes=10))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("sensor.current_version")
assert state.state == "2021.12.10"
hass.states.async_set("sensor.input1", "off")
await hass.async_block_till_done()
with patch(
"homeassistant.components.command_line.utils.subprocess.check_output",
return_value=b"0",
):
freezer.tick(timedelta(minutes=10))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("sensor.current_version")
assert state.state == STATE_UNAVAILABLE