diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index f4db7831235..885427a9f80 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -57,9 +57,6 @@ 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 ( @@ -249,10 +246,6 @@ 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 a22abbee3b2..de72d45d756 100644 --- a/homeassistant/components/automation/manifest.json +++ b/homeassistant/components/automation/manifest.json @@ -6,5 +6,12 @@ "dependencies": ["blueprint", "trace"], "documentation": "https://www.home-assistant.io/integrations/automation", "integration_type": "system", - "quality_scale": "internal" + "quality_scale": "internal", + "recorder_excluded_attributes": [ + "current", + "id", + "last_triggered", + "max", + "mode" + ] } diff --git a/homeassistant/components/automation/recorder.py b/homeassistant/components/automation/recorder.py deleted file mode 100644 index 3083d271d1f..00000000000 --- a/homeassistant/components/automation/recorder.py +++ /dev/null @@ -1,12 +0,0 @@ -"""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 72d825d9e78..746b845c420 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -8,6 +8,7 @@ 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, @@ -132,7 +133,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]] = {} + exclude_attributes_by_domain: dict[str, set[str]] = dict(EXCLUDED_ATTRIBUTES) 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 new file mode 100644 index 00000000000..d9213c60125 --- /dev/null +++ b/homeassistant/generated/recorder.py @@ -0,0 +1,14 @@ +"""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 1c626ac3c5b..f263c594bc5 100644 --- a/script/hassfest/__main__.py +++ b/script/hassfest/__main__.py @@ -20,6 +20,7 @@ from . import ( metadata, mqtt, mypy_config, + recorder, requirements, services, ssdp, @@ -39,6 +40,7 @@ INTEGRATION_PLUGINS = [ json, manifest, mqtt, + recorder, requirements, services, ssdp, diff --git a/script/hassfest/manifest.py b/script/hassfest/manifest.py index 65e37aa515d..5dbb7896dee 100644 --- a/script/hassfest/manifest.py +++ b/script/hassfest/manifest.py @@ -264,6 +264,7 @@ 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 new file mode 100644 index 00000000000..752f9523d3a --- /dev/null +++ b/script/hassfest/recorder.py @@ -0,0 +1,45 @@ +"""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']}")