1 """The scrape component."""
3 from __future__
import annotations
6 from collections.abc
import Coroutine
7 from datetime
import timedelta
10 import voluptuous
as vol
27 TEMPLATE_SENSOR_BASE_SCHEMA,
31 from .const
import CONF_INDEX, CONF_SELECT, DEFAULT_SCAN_INTERVAL, DOMAIN, PLATFORMS
32 from .coordinator
import ScrapeCoordinator
34 type ScrapeConfigEntry = ConfigEntry[ScrapeCoordinator]
36 SENSOR_SCHEMA = vol.Schema(
38 **TEMPLATE_SENSOR_BASE_SCHEMA.schema,
39 vol.Optional(CONF_AVAILABILITY): cv.template,
40 vol.Optional(CONF_ATTRIBUTE): cv.string,
41 vol.Optional(CONF_INDEX, default=0): cv.positive_int,
42 vol.Required(CONF_SELECT): cv.string,
43 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
47 COMBINED_SCHEMA = vol.Schema(
49 vol.Optional(CONF_SCAN_INTERVAL): cv.time_period,
51 vol.Optional(SENSOR_DOMAIN): vol.All(
52 cv.ensure_list, [vol.Schema(SENSOR_SCHEMA)]
57 CONFIG_SCHEMA = vol.Schema(
58 {vol.Optional(DOMAIN): vol.All(cv.ensure_list, [COMBINED_SCHEMA])},
59 extra=vol.ALLOW_EXTRA,
63 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
64 """Set up Scrape from yaml config."""
65 scrape_config: list[ConfigType] |
None
66 if not (scrape_config := config.get(DOMAIN)):
69 load_coroutines: list[Coroutine[Any, Any,
None]] = []
70 for resource_config
in scrape_config:
72 scan_interval: timedelta = resource_config.get(
73 CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL
77 sensors: list[ConfigType] = resource_config.get(SENSOR_DOMAIN, [])
79 load_coroutines.append(
80 discovery.async_load_platform(
84 {
"coordinator": coordinator,
"configs": sensors},
90 await asyncio.gather(*load_coroutines)
96 """Set up Scrape from a config entry."""
105 DEFAULT_SCAN_INTERVAL,
107 await coordinator.async_config_entry_first_refresh()
108 entry.runtime_data = coordinator
110 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
111 entry.async_on_unload(entry.add_update_listener(update_listener))
117 """Unload Scrape config entry."""
118 return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
122 """Handle options update."""
123 await hass.config_entries.async_reload(entry.entry_id)
127 hass: HomeAssistant, entry: ConfigEntry, device: DeviceEntry
129 """Remove Scrape config entry from a device."""
130 entity_registry = er.async_get(hass)
131 for identifier
in device.identifiers:
132 if identifier[0] == DOMAIN
and entity_registry.async_get_entity_id(
133 SENSOR_DOMAIN, DOMAIN, identifier[1]
RestData create_rest_data_from_config(HomeAssistant hass, ConfigType config)
bool async_setup(HomeAssistant hass, ConfigType config)
bool async_setup_entry(HomeAssistant hass, ScrapeConfigEntry entry)
None update_listener(HomeAssistant hass, ConfigEntry entry)
bool async_remove_config_entry_device(HomeAssistant hass, ConfigEntry entry, DeviceEntry device)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)