{"record":{"id":"1bc6266bd9ef0b76","repo":"home-assistant/core","slug":"failed-to-parse-hvac-action","errorCode":"failed_to_parse_hvac_action","errorMessage":"Could not determine HVAC action: {mode_and_active}, {current_temperature}, {target_temperature_low}","messagePattern":"Could not determine HVAC action: (.+?), (.+?), (.+?)","errorType":"exception","errorClass":"HomeAssistantError","httpStatus":null,"severity":"error","filePath":"homeassistant/components/bryant_evolution/climate.py","lineNumber":197,"sourceCode":"                return HVACAction.HEATING\n            case \"COOL\":\n                return HVACAction.COOLING\n            case \"OFF\":\n                return HVACAction.OFF\n            case \"AUTO\":\n                # In AUTO, we need to figure out what the actual action is\n                # based on the setpoints.\n                if (\n                    self.current_temperature is not None\n                    and self.target_temperature_low is not None\n                ):\n                    if self.current_temperature > self.target_temperature_low:\n                        # If the system is on and the current temperature is\n                        # higher than the point at which heating would activate,\n                        # then we must be cooling.\n                        return HVACAction.COOLING\n                    return HVACAction.HEATING\n        raise HomeAssistantError(\n            translation_domain=DOMAIN,\n            translation_key=\"failed_to_parse_hvac_action\",\n            translation_placeholders={\n                \"mode_and_active\": mode_and_active,\n                \"current_temperature\": str(self.current_temperature),\n                \"target_temperature_low\": str(self.target_temperature_low),\n            },\n        )\n\n    @override\n    async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:\n        \"\"\"Set new target hvac mode.\"\"\"\n        if hvac_mode == HVACMode.HEAT_COOL:\n            hvac_mode = HVACMode.AUTO\n        if not await self._client.set_hvac_mode(hvac_mode):\n            raise HomeAssistantError(\n                translation_domain=DOMAIN, translation_key=\"failed_to_set_hvac_mode\"\n            )","sourceCodeStart":179,"sourceCodeEnd":215,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/bryant_evolution/climate.py#L179-L215","documentation":"HomeAssistantError with translation_key 'failed_to_parse_hvac_action' (placeholders: mode_and_active, current_temperature, target_temperature_low), raised at the end of _read_hvac_action when the mode/action match chain fell through. Notably in AUTO mode the code needs both current_temperature and target_temperature_low to infer heating vs cooling; if either is None, inference is impossible and this error raises.","triggerScenarios":"System in AUTO (HEAT_COOL) with a missing temperature reading (current_temperature is None) or missing heating setpoint (target_temperature_low is None); gateway returning a mode string outside the match cases (HEAT/COOL/OFF/AUTO) while active.","commonSituations":"Fresh setup before the first temperature poll completes; sensor outage on the thermostat; heating setpoint never configured so target_temperature_low stays None in AUTO.","solutions":["Wait for the next successful poll so current_temperature is populated, then retry","Set both a heating and cooling setpoint on the system so AUTO inference has its inputs","Check thermostat sensor health if outdoor/indoor temperature reads fail persistently","Report persistent falls-through with the logged placeholder values upstream"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"# In AUTO mode, inference needs both readings:\nif (\n    climate.current_temperature is not None\n    and climate.target_temperature_low is not None\n):\n    action = climate.hvac_action  # safe to consume\nelse:\n    # missing inputs; hvac_action read would raise","typeGuard":"def can_infer_auto_action(\n    current_temperature: float | None,\n    target_temperature_low: float | None,\n) -> bool:\n    \"\"\"True when AUTO-mode action inference has all required inputs.\"\"\"\n    return current_temperature is not None and target_temperature_low is not None","tryCatchPattern":null,"preventionTips":["Set both heating and cooling setpoints when using heat_cool (AUTO) mode","Wait for the first successful temperature poll before reading hvac_action after setup"],"tags":["bryant-evolution","climate","hvac-action","auto-mode","missing-data","home-assistant"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}