Allows defining list of attributes excluded from history in manifest.json (#99283)

* Move list of attributes excluded from history to manifest.json

* Address comments
This commit is contained in:
Erik Montnemery 2023-08-29 20:14:33 +02:00 committed by GitHub
parent 50150f5577
commit 0366e14630
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 72 additions and 21 deletions

View file

@ -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)

View file

@ -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"
]
}

View file

@ -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}

View file

@ -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()

View file

@ -0,0 +1,14 @@
"""Automatically generated file.
To update, run python3 -m script.hassfest
"""
EXCLUDED_ATTRIBUTES = {
"automation": {
"current",
"id",
"last_triggered",
"max",
"mode",
},
}

View file

@ -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,

View file

@ -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],
}
)

View file

@ -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']}")