home-assistant/core · error · InvalidBlueprintInputs
Invalid blueprint inputs: {humanize_error(config_with_bluepr
Error message
Invalid blueprint inputs: {humanize_error(config_with_blueprint, err)} What it means
InvalidBlueprintInputs is raised in async_inputs_from_config when the config passed to the blueprint fails BLUEPRINT_INSTANCE_FIELDS (voluptuous). The humanized error identifies the bad field. This validates the consumer's use_blueprint block shape, not the blueprint file itself.
Source
Thrown at homeassistant/components/blueprint/models.py:314
try:
blueprint = await self.hass.async_add_executor_job(
self._load_blueprint, blueprint_path
)
except FailedToLoad:
self._blueprints[blueprint_path] = None
raise
self._blueprints[blueprint_path] = blueprint
return blueprint
async def async_inputs_from_config(
self, config_with_blueprint: dict
) -> BlueprintInputs:
"""Process a blueprint config."""
try:
config_with_blueprint = BLUEPRINT_INSTANCE_FIELDS(config_with_blueprint)
except vol.Invalid as err:
raise InvalidBlueprintInputs(
self.domain, humanize_error(config_with_blueprint, err)
) from err
bp_conf = config_with_blueprint[CONF_USE_BLUEPRINT]
blueprint = await self.async_get_blueprint(bp_conf[CONF_PATH])
inputs = BlueprintInputs(blueprint, config_with_blueprint)
inputs.validate()
return inputs
async def async_remove_blueprint(self, blueprint_path: str) -> None:
"""Remove a blueprint file."""
if self._blueprint_in_use(self.hass, blueprint_path):
raise BlueprintInUse(self.domain, blueprint_path)
path = self.blueprint_folder / blueprint_path
await self.hass.async_add_executor_job(path.unlink)
self._blueprints[blueprint_path] = None
def _create_file(View on GitHub (pinned to 58a3fdb3ea)
Solutions
- Follow the humanized message: ensure the block is 'use_blueprint: {path: <file>, input: {<name>: <value>}}'
- Fix key typos (inputs -> input) and make input a mapping of input-name to value
- Validate with Developer Tools > YAML before saving
Example fix
# before
- use_blueprint: motion_light.yaml
inputs:
- light.hall
# after
- use_blueprint:
path: motion_light.yaml
input:
light: light.hall Defensive patterns
Strategy: validation
Validate before calling
import voluptuous as vol
from homeassistant.components.blueprint.models import BLUEPRINT_INSTANCE_FIELDS
def use_blueprint_config_valid(config: dict) -> bool:
try:
BLUEPRINT_INSTANCE_FIELDS(config)
return True
except vol.Invalid:
return False Try / catch
from homeassistant.components.blueprint.errors import InvalidBlueprintInputs
try:
inputs = await manager.async_inputs_from_config(config)
except InvalidBlueprintInputs as err:
# show humanized error next to the use_blueprint editor field Prevention
- Build use_blueprint blocks via the automation UI editor, which emits the correct shape
- Remember the schema: mapping with exactly path (required) and input
When it happens
Trigger: A config dict where use_blueprint is not a mapping containing path, or where unknown/extra keys sit next to 'input', or 'input' is not a mapping; reached via automation/script config validation or websocket API calls that build BlueprintInputs.
Common situations: Hand-written automation YAML with 'use_blueprint:' as a plain string; 'input:' given a list; typo like 'inputs:' instead of 'input:'.
Related errors
- Invalid blueprint: {msg_or_exc}
- Invalid blueprint: Missing input definition for {', '.join(m
- Missing input {', '.join(sorted(input_names))}
- Failed to validate CalendarEvent: {err}
- username_not_normalized
AI-assisted analysis of home-assistant/core@58a3fdb3ea (2026-08-14).
Data as JSON: /api/errors/ac74effe9a3e4b4e.
Report an issue: GitHub.