From 9289fa23a15f0d06dd1c3a1091f40442112c4117 Mon Sep 17 00:00:00 2001 From: G Johansson Date: Thu, 21 Mar 2024 13:13:25 +0100 Subject: [PATCH] Add availability to Scrape config flow (#105516) --- .../components/scrape/config_flow.py | 2 + homeassistant/components/scrape/sensor.py | 5 +- tests/components/scrape/test_sensor.py | 63 +++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/scrape/config_flow.py b/homeassistant/components/scrape/config_flow.py index fc8124010ce..017b3c707a9 100644 --- a/homeassistant/components/scrape/config_flow.py +++ b/homeassistant/components/scrape/config_flow.py @@ -60,6 +60,7 @@ from homeassistant.helpers.selector import ( TextSelectorConfig, TextSelectorType, ) +from homeassistant.helpers.trigger_template_entity import CONF_AVAILABILITY from . import COMBINED_SCHEMA from .const import ( @@ -105,6 +106,7 @@ SENSOR_SETUP = { ), vol.Optional(CONF_ATTRIBUTE): TextSelector(), vol.Optional(CONF_VALUE_TEMPLATE): TemplateSelector(), + vol.Optional(CONF_AVAILABILITY): TemplateSelector(), vol.Optional(CONF_DEVICE_CLASS): SelectSelector( SelectSelectorConfig( options=[ diff --git a/homeassistant/components/scrape/sensor.py b/homeassistant/components/scrape/sensor.py index 58d90b2399e..61d58ea7bc5 100644 --- a/homeassistant/components/scrape/sensor.py +++ b/homeassistant/components/scrape/sensor.py @@ -113,10 +113,13 @@ async def async_setup_entry( 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: if key not in sensor_config: continue + if key == CONF_AVAILABILITY: + trigger_entity_config[key] = Template(sensor_config[key], hass) + continue trigger_entity_config[key] = sensor_config[key] entities.append( diff --git a/tests/components/scrape/test_sensor.py b/tests/components/scrape/test_sensor.py index 03b85a8944f..b2ee75c2172 100644 --- a/tests/components/scrape/test_sensor.py +++ b/tests/components/scrape/test_sensor.py @@ -5,24 +5,36 @@ from __future__ import annotations from datetime import timedelta from unittest.mock import patch +from freezegun.api import FrozenDateTimeFactory import pytest +from homeassistant.components.rest.const import DEFAULT_METHOD +from homeassistant.components.rest.data import DEFAULT_TIMEOUT from homeassistant.components.scrape.const import ( + CONF_ENCODING, CONF_INDEX, CONF_SELECT, + DEFAULT_ENCODING, DEFAULT_SCAN_INTERVAL, + DEFAULT_VERIFY_SSL, ) from homeassistant.components.sensor import ( CONF_STATE_CLASS, + DOMAIN as SENSOR_DOMAIN, SensorDeviceClass, SensorStateClass, ) from homeassistant.const import ( CONF_DEVICE_CLASS, CONF_ICON, + CONF_METHOD, CONF_NAME, + CONF_RESOURCE, + CONF_TIMEOUT, CONF_UNIQUE_ID, CONF_UNIT_OF_MEASUREMENT, + CONF_VALUE_TEMPLATE, + CONF_VERIFY_SSL, STATE_UNAVAILABLE, STATE_UNKNOWN, UnitOfTemperature, @@ -562,3 +574,54 @@ async def test_templates_with_yaml(hass: HomeAssistant) -> None: assert state.state == "Current Version: 2021.12.10" assert state.attributes[CONF_ICON] == "mdi:on" 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