{"record":{"id":"e4b9f084a8012cdd","repo":"home-assistant/core","slug":"missing-input-join-sorted-input-names","errorCode":null,"errorMessage":"Missing input {', '.join(sorted(input_names))}","messagePattern":"Missing input (.+?)","errorType":"exception","errorClass":"MissingInput","httpStatus":null,"severity":"error","filePath":"homeassistant/components/blueprint/models.py","lineNumber":172,"sourceCode":"    def inputs_with_default(self) -> dict[str, Any]:\n        \"\"\"Return the inputs and fallback to defaults.\"\"\"\n        no_input = set(self.blueprint.inputs) - set(self.inputs)\n\n        inputs_with_default = dict(self.inputs)\n\n        for inp in no_input:\n            blueprint_input = self.blueprint.inputs[inp]\n            if isinstance(blueprint_input, dict) and CONF_DEFAULT in blueprint_input:\n                inputs_with_default[inp] = blueprint_input[CONF_DEFAULT]\n\n        return inputs_with_default\n\n    def validate(self) -> None:\n        \"\"\"Validate the inputs.\"\"\"\n        missing = set(self.blueprint.inputs) - set(self.inputs_with_default)\n\n        if missing:\n            raise MissingInput(self.blueprint.domain, self.blueprint.name, missing)\n\n        # In future we can see if entities are correct domain, areas exist etc\n        # using the new selector helper.\n\n    @callback\n    def async_substitute(self) -> dict:\n        \"\"\"Get the blueprint value with the inputs substituted.\"\"\"\n        processed = yaml_util.substitute(self.blueprint.data, self.inputs_with_default)\n        combined = {**processed, **self.config_with_inputs}\n        # From config_with_inputs\n        combined.pop(CONF_USE_BLUEPRINT)\n        # From blueprint\n        combined.pop(CONF_BLUEPRINT)\n        return combined\n\n\nclass DomainBlueprints:\n    \"\"\"Blueprints for a specific domain.\"\"\"","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/blueprint/models.py#L154-L190","documentation":"MissingInput is raised by BlueprintInputs.validate() when the configuration using the blueprint (use_blueprint:) does not supply values for inputs that have no default. It fires at config-validation time, before substitution, so the automation/script using the blueprint fails to load.","triggerScenarios":"An automation whose 'use_blueprint: path: ... input:' block omits a required input; also triggered when a blueprint author later removes a default from an input that existing automations relied on, and those automations are reloaded.","commonSituations":"Blueprint updated upstream and re-imported with a new required input; user manually edited the automation YAML and dropped an input line; blueprint author removed a default value.","solutions":["Open the automation/script that references the blueprint and add the missing input(s) under use_blueprint.input (names are listed in the message)","If many consumers are affected, give the input a default: in the blueprint itself and re-import it","Use Developer Tools > YAML > reload automations (or restart) to re-validate"],"exampleFix":"# before\naction:\n  - use_blueprint:\n      path: motion_light.yaml\n      input:\n        light: light.hall\n\n# after\naction:\n  - use_blueprint:\n      path: motion_light.yaml\n      input:\n        light: light.hall\n        motion_sensor: binary_sensor.hall_motion","handlingStrategy":"validation","validationCode":"def all_required_inputs_provided(blueprint, config_with_blueprint: dict) -> bool:\n    provided = set(config_with_blueprint[\"use_blueprint\"].get(\"input\", {}))\n    with_defaults = set(blueprint.inputs_with_default)\n    return set(blueprint.inputs) <= provided | with_defaults","typeGuard":null,"tryCatchPattern":"from homeassistant.components.blueprint.errors import MissingInput\ntry:\n    inputs = await manager.async_inputs_from_config(config)\nexcept MissingInput as err:\n    # surface the missing names to the UI for the user to fill in","preventionTips":["Give optional blueprint inputs a default: so existing consumers survive new versions","When updating a blueprint, re-test one consuming automation via YAML reload"],"tags":["blueprint","inputs","automation","validation"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}