diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index 885427a9f80..f4db7831235 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -57,6 +57,9 @@ from homeassistant.helpers import condition import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import ToggleEntity from homeassistant.helpers.entity_component import EntityComponent +from homeassistant.helpers.integration_platform import ( + async_process_integration_platform_for_component, +) from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue from homeassistant.helpers.restore_state import RestoreEntity from homeassistant.helpers.script import ( @@ -246,6 +249,10 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: LOGGER, DOMAIN, hass ) + # Process integration platforms right away since + # we will create entities before firing EVENT_COMPONENT_LOADED + await async_process_integration_platform_for_component(hass, DOMAIN) + # Register automation as valid domain for Blueprint async_get_blueprints(hass) diff --git a/homeassistant/components/automation/manifest.json b/homeassistant/components/automation/manifest.json index de72d45d756..a22abbee3b2 100644 --- a/homeassistant/components/automation/manifest.json +++ b/homeassistant/components/automation/manifest.json @@ -6,12 +6,5 @@ "dependencies": ["blueprint", "trace"], "documentation": "https://www.home-assistant.io/integrations/automation", "integration_type": "system", - "quality_scale": "internal", - "recorder_excluded_attributes": [ - "current", - "id", - "last_triggered", - "max", - "mode" - ] + "quality_scale": "internal" } diff --git a/homeassistant/components/automation/recorder.py b/homeassistant/components/automation/recorder.py new file mode 100644 index 00000000000..3083d271d1f --- /dev/null +++ b/homeassistant/components/automation/recorder.py @@ -0,0 +1,12 @@ +"""Integration platform for recorder.""" +from __future__ import annotations + +from homeassistant.core import HomeAssistant, callback + +from . import ATTR_CUR, ATTR_LAST_TRIGGERED, ATTR_MAX, ATTR_MODE, CONF_ID + + +@callback +def exclude_attributes(hass: HomeAssistant) -> set[str]: + """Exclude extra attributes from being recorded in the database.""" + return {ATTR_LAST_TRIGGERED, ATTR_MODE, ATTR_CUR, ATTR_MAX, CONF_ID} diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 746b845c420..72d825d9e78 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -8,7 +8,6 @@ import voluptuous as vol from homeassistant.const import CONF_EXCLUDE, EVENT_STATE_CHANGED from homeassistant.core import HomeAssistant -from homeassistant.generated.recorder import EXCLUDED_ATTRIBUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entityfilter import ( INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA, @@ -133,7 +132,7 @@ def is_entity_recorded(hass: HomeAssistant, entity_id: str) -> bool: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the recorder.""" - exclude_attributes_by_domain: dict[str, set[str]] = dict(EXCLUDED_ATTRIBUTES) + exclude_attributes_by_domain: dict[str, set[str]] = {} hass.data[EXCLUDE_ATTRIBUTES] = exclude_attributes_by_domain conf = config[DOMAIN] entity_filter = convert_include_exclude_filter(conf).get_filter() diff --git a/homeassistant/generated/recorder.py b/homeassistant/generated/recorder.py deleted file mode 100644 index d9213c60125..00000000000 --- a/homeassistant/generated/recorder.py +++ /dev/null @@ -1,14 +0,0 @@ -"""Automatically generated file. - -To update, run python3 -m script.hassfest -""" - -EXCLUDED_ATTRIBUTES = { - "automation": { - "current", - "id", - "last_triggered", - "max", - "mode", - }, -} diff --git a/script/hassfest/__main__.py b/script/hassfest/__main__.py index f263c594bc5..1c626ac3c5b 100644 --- a/script/hassfest/__main__.py +++ b/script/hassfest/__main__.py @@ -20,7 +20,6 @@ from . import ( metadata, mqtt, mypy_config, - recorder, requirements, services, ssdp, @@ -40,7 +39,6 @@ INTEGRATION_PLUGINS = [ json, manifest, mqtt, - recorder, requirements, services, ssdp, diff --git a/script/hassfest/manifest.py b/script/hassfest/manifest.py index 5dbb7896dee..65e37aa515d 100644 --- a/script/hassfest/manifest.py +++ b/script/hassfest/manifest.py @@ -264,7 +264,6 @@ INTEGRATION_MANIFEST_SCHEMA = vol.Schema( vol.Optional("loggers"): [str], vol.Optional("disabled"): str, vol.Optional("iot_class"): vol.In(SUPPORTED_IOT_CLASSES), - vol.Optional("recorder_excluded_attributes"): [str], } ) diff --git a/script/hassfest/recorder.py b/script/hassfest/recorder.py deleted file mode 100644 index 752f9523d3a..00000000000 --- a/script/hassfest/recorder.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Generate recorder file.""" -from __future__ import annotations - -from .model import Config, Integration -from .serializer import format_python_namespace - - -def generate_and_validate(integrations: dict[str, Integration]) -> str: - """Validate and generate recorder data.""" - - data: dict[str, set[str]] = {} - - for domain in sorted(integrations): - exclude_list = integrations[domain].manifest.get("recorder_excluded_attributes") - - if not exclude_list: - continue - - data[domain] = set(exclude_list) - - return format_python_namespace({"EXCLUDED_ATTRIBUTES": data}) - - -def validate(integrations: dict[str, Integration], config: Config) -> None: - """Validate recorder file.""" - recorder_path = config.root / "homeassistant/generated/recorder.py" - config.cache["recorder"] = content = generate_and_validate(integrations) - - if config.specific_integrations: - return - - with open(str(recorder_path)) as fp: - if fp.read() != content: - config.add_error( - "recorder", - "File recorder.py is not up to date. Run python3 -m script.hassfest", - fixable=True, - ) - - -def generate(integrations: dict[str, Integration], config: Config) -> None: - """Generate recorder file.""" - recorder_path = config.root / "homeassistant/generated/recorder.py" - with open(str(recorder_path), "w") as fp: - fp.write(f"{config.cache['recorder']}")