Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
ef02b62
Make HTTP security filter scan cost track request target length (#182…
frenck Sep 18, 2026
843d9a7
Bump home-assistant/builder/actions/build-image from 2026.06.0 to 202…
dependabot[bot] Sep 18, 2026
26a3094
Use ToolResult in anthropic (#182542)
balloob Sep 18, 2026
907abfa
Fix Yeelight ambilight failing to update while its color mode is not …
frenck Sep 18, 2026
8a967b5
Split user flow init and data submission in ipp config flow tests (#1…
smitec11 Sep 18, 2026
18bfbc2
Fix Hue MotionAware entities for zones covering the whole home (#182586)
frenck Sep 18, 2026
6b6a232
Keep Brother counters and wear parts as diagnostic (#182591)
piitaya Sep 18, 2026
032ee44
Use ToolResult in ovhcloud_ai_endpoints (#182550)
balloob Sep 18, 2026
d7be305
Bump besen to 0.4.6 (#182520)
moryoav Sep 18, 2026
32413f4
Bump pysnooz to 0.10.0 (#182225)
JamieMagee Sep 18, 2026
a837241
Add virtual integration Onida Infrared (#182575)
Dr-Blank Sep 18, 2026
f83552c
Add door warning to Midea (#182579)
chemelli74 Sep 18, 2026
7d29177
Add reconfigure flow to Mikrotik (#181763)
chemelli74 Sep 18, 2026
b29d2ab
Raise an error when the Kodi notification fails (#182592)
smitec11 Sep 18, 2026
69c2215
Import probatio directly instead of aliasing it as vol (#182595)
joostlek Sep 18, 2026
ae3e6c8
Enumerate UniFi Protect entities from the public API and add switches…
RaHehl Sep 18, 2026
51c5e9c
Turn off Tuya fans when the speed is set to 0% (#181972)
frenck Sep 18, 2026
988d09b
Bump besen to 0.4.7 (#182596)
moryoav Sep 18, 2026
ff59823
Clarify Axle Energy API error messages (#182569)
Herbertmt978 Sep 18, 2026
6177c71
Use ToolResult in litellm (#182546)
balloob Sep 18, 2026
621bec3
Use ToolResult in openai_conversation (#182544)
balloob Sep 18, 2026
1ad01fb
Use ToolResult in cloud (#182543)
balloob Sep 18, 2026
6f9375c
Use ToolResult in todo (#182540)
balloob Sep 18, 2026
f1f8542
Use ToolResult in google_generative_ai_conversation (#182545)
balloob Sep 18, 2026
6081351
Use ToolResult in mcp (#182541)
balloob Sep 18, 2026
434a246
Use ToolResult in open_router (#182549)
balloob Sep 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/builder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ jobs:
echo "${GITHUB_SHA};${GITHUB_REF};${GITHUB_EVENT_NAME};${GITHUB_ACTOR}" > rootfs/OFFICIAL_IMAGE

- name: Build base image
uses: home-assistant/builder/actions/build-image@4de35182ce1e329181bffcbcc84d33db5e2c7e10 # 2026.06.0
uses: home-assistant/builder/actions/build-image@7412f0023ea9b6e58e8bb5059f1660f51376f49a # 2026.09.0
with:
arch: ${{ matrix.arch }}
build-args: |
Expand Down Expand Up @@ -256,7 +256,7 @@ jobs:
fi

- name: Build machine image
uses: home-assistant/builder/actions/build-image@4de35182ce1e329181bffcbcc84d33db5e2c7e10 # 2026.06.0
uses: home-assistant/builder/actions/build-image@7412f0023ea9b6e58e8bb5059f1660f51376f49a # 2026.09.0
with:
arch: ${{ matrix.arch }}
build-args: |
Expand Down
33 changes: 19 additions & 14 deletions homeassistant/components/anthropic/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,11 +245,11 @@ def _convert_content( # noqa: C901
"tool_use_id": content.tool_call_id,
"content": cast(
WebSearchToolResultBlockParamContentParam,
content.tool_result["content"]
if "content" in content.tool_result
content.result.data["content"]
if "content" in content.result.data
else {
"type": "web_search_tool_result_error",
"error_code": content.tool_result.get(
"error_code": content.result.data.get(
"error_code", "unavailable"
),
},
Expand All @@ -261,7 +261,7 @@ def _convert_content( # noqa: C901
"tool_use_id": content.tool_call_id,
"content": cast(
CodeExecutionToolResultBlockParamContentParam,
content.tool_result,
content.result.data,
),
}
elif content.tool_name == "bash_code_execution":
Expand All @@ -270,7 +270,7 @@ def _convert_content( # noqa: C901
"tool_use_id": content.tool_call_id,
"content": cast(
BashCodeExecutionToolResultBlockParamContentParam,
content.tool_result,
content.result.data,
),
}
elif content.tool_name == "text_editor_code_execution":
Expand All @@ -279,7 +279,7 @@ def _convert_content( # noqa: C901
"tool_use_id": content.tool_call_id,
"content": cast(
TextEditorCodeExecutionToolResultBlockParamContentParam,
content.tool_result,
content.result.data,
),
}
elif content.tool_name == "tool_search":
Expand All @@ -288,7 +288,7 @@ def _convert_content( # noqa: C901
"tool_use_id": content.tool_call_id,
"content": cast(
ToolSearchToolResultBlockParamContentParam,
content.tool_result,
content.result.data,
),
}
elif content.tool_name == "web_fetch":
Expand All @@ -297,14 +297,15 @@ def _convert_content( # noqa: C901
"tool_use_id": content.tool_call_id,
"content": cast(
WebFetchToolResultBlockParamContentParam,
content.tool_result,
content.result.data,
),
}
else:
tool_result_block = {
"type": "tool_result",
"tool_use_id": content.tool_call_id,
"content": json_dumps(content.tool_result),
"content": json_dumps(content.result.data),
"is_error": content.result.error,
}
external_tool = False
if not messages or messages[-1]["role"] != (
Expand Down Expand Up @@ -780,11 +781,15 @@ def on_server_tool_result_block(
"role": "tool_result",
"tool_call_id": tool_use_id,
"tool_name": tool_name.removesuffix("_tool_result"),
"tool_result": {
"content": cast(JsonArrayType, [x.to_dict() for x in content])
}
if isinstance(content, list)
else cast(JsonObjectType, content.to_dict()),
"result": llm.ToolResult(
data={
"content": cast(JsonArrayType, [x.to_dict() for x in content])
}
if isinstance(content, list)
else cast(JsonObjectType, content.to_dict()),
error=not isinstance(content, list)
and content.type.endswith("_tool_result_error"),
),
}
)
self._first_block = True
Expand Down
11 changes: 9 additions & 2 deletions homeassistant/components/axle_energy/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@

from typing import Any, override

from aioaxlevpp import AxleAuthenticationError, AxleClient, AxleError
from aioaxlevpp import (
AxleAuthenticationError,
AxleClient,
AxleConnectionError,
AxleError,
)
import probatio

from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
Expand Down Expand Up @@ -37,8 +42,10 @@ async def _validate(self, user_input: dict[str, Any]) -> dict[str, str]:
await client.get_event()
except AxleAuthenticationError:
return {"base": "invalid_auth"}
except AxleError:
except AxleConnectionError:
return {"base": "cannot_connect"}
except AxleError:
return {"base": "cannot_retrieve"}
return {}

@override
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/axle_energy/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"cannot_retrieve": "[%key:component::axle_energy::exceptions::cannot_connect::message%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
},
"step": {
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/besen/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
"integration_type": "device",
"iot_class": "local_push",
"quality_scale": "bronze",
"requirements": ["besen==0.4.5"]
"requirements": ["besen==0.4.7"]
}
24 changes: 24 additions & 0 deletions homeassistant/components/brother/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,154 +51,178 @@ class BrotherSensorEntityDescription(SensorEntityDescription):
key="page_counter",
translation_key="page_counter",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.page_counter,
),
BrotherSensorEntityDescription(
key="bw_counter",
translation_key="bw_pages",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.bw_counter,
),
BrotherSensorEntityDescription(
key="color_counter",
translation_key="color_pages",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.color_counter,
),
BrotherSensorEntityDescription(
key="duplex_unit_pages_counter",
translation_key="duplex_unit_page_counter",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.duplex_unit_pages_counter,
),
BrotherSensorEntityDescription(
key="drum_remaining_life",
translation_key="drum_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.drum_remaining_life,
),
BrotherSensorEntityDescription(
key="drum_remaining_pages",
translation_key="drum_remaining_pages",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.drum_remaining_pages,
),
BrotherSensorEntityDescription(
key="drum_counter",
translation_key="drum_page_counter",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.drum_counter,
),
BrotherSensorEntityDescription(
key="black_drum_remaining_life",
translation_key="black_drum_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.black_drum_remaining_life,
),
BrotherSensorEntityDescription(
key="black_drum_remaining_pages",
translation_key="black_drum_remaining_pages",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.black_drum_remaining_pages,
),
BrotherSensorEntityDescription(
key="black_drum_counter",
translation_key="black_drum_page_counter",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.black_drum_counter,
),
BrotherSensorEntityDescription(
key="cyan_drum_remaining_life",
translation_key="cyan_drum_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.cyan_drum_remaining_life,
),
BrotherSensorEntityDescription(
key="cyan_drum_remaining_pages",
translation_key="cyan_drum_remaining_pages",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.cyan_drum_remaining_pages,
),
BrotherSensorEntityDescription(
key="cyan_drum_counter",
translation_key="cyan_drum_page_counter",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.cyan_drum_counter,
),
BrotherSensorEntityDescription(
key="magenta_drum_remaining_life",
translation_key="magenta_drum_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.magenta_drum_remaining_life,
),
BrotherSensorEntityDescription(
key="magenta_drum_remaining_pages",
translation_key="magenta_drum_remaining_pages",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.magenta_drum_remaining_pages,
),
BrotherSensorEntityDescription(
key="magenta_drum_counter",
translation_key="magenta_drum_page_counter",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.magenta_drum_counter,
),
BrotherSensorEntityDescription(
key="yellow_drum_remaining_life",
translation_key="yellow_drum_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.yellow_drum_remaining_life,
),
BrotherSensorEntityDescription(
key="yellow_drum_remaining_pages",
translation_key="yellow_drum_remaining_pages",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.yellow_drum_remaining_pages,
),
BrotherSensorEntityDescription(
key="yellow_drum_counter",
translation_key="yellow_drum_page_counter",
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.yellow_drum_counter,
),
BrotherSensorEntityDescription(
key="belt_unit_remaining_life",
translation_key="belt_unit_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.belt_unit_remaining_life,
),
BrotherSensorEntityDescription(
key="fuser_remaining_life",
translation_key="fuser_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.fuser_remaining_life,
),
BrotherSensorEntityDescription(
key="laser_remaining_life",
translation_key="laser_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.laser_remaining_life,
),
BrotherSensorEntityDescription(
key="pf_kit_1_remaining_life",
translation_key="pf_kit_1_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.pf_kit_1_remaining_life,
),
BrotherSensorEntityDescription(
key="pf_kit_mp_remaining_life",
translation_key="pf_kit_mp_remaining_life",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
value=lambda data: data.pf_kit_mp_remaining_life,
),
BrotherSensorEntityDescription(
Expand Down
14 changes: 11 additions & 3 deletions homeassistant/components/cloud/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ def _convert_content_to_param(
and content.tool_call_id in web_search_calls
):
web_search_call = web_search_calls.pop(content.tool_call_id)
web_search_call["status"] = content.tool_result.get(
web_search_call["status"] = content.result.data.get(
"status", "completed"
)
messages.append(cast("ResponseInputItemParam", web_search_call))
Expand All @@ -93,7 +93,12 @@ def _convert_content_to_param(
{
"type": "function_call_output",
"call_id": content.tool_call_id,
"output": json_dumps(content.tool_result),
"output": json_dumps(
{
"data": content.result.data,
"error": content.result.error,
}
),
}
)
continue
Expand Down Expand Up @@ -316,7 +321,10 @@ async def _transform_stream( # noqa: C901 - This is complex, but better to have
"role": "tool_result",
"tool_call_id": event.item.id,
"tool_name": "web_search_call",
"tool_result": {"status": event.item.status},
"result": llm.ToolResult(
data={"status": event.item.status},
error=event.item.status == "failed",
),
}
last_role = "tool_result"
elif isinstance(event.item, LLMResponseImageOutputItem):
Expand Down
14 changes: 7 additions & 7 deletions homeassistant/components/de_dietrich/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import diematic_modbus
from modbus_connection import ModbusError, ModbusTcpParams
import probatio as vol
import probatio

from homeassistant.components.modbus import async_get_temporary_unit
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
Expand All @@ -31,20 +31,20 @@

_LOGGER = logging.getLogger(__name__)

STEP_USER_DATA_SCHEMA = vol.Schema(
STEP_USER_DATA_SCHEMA = probatio.Schema(
{
vol.Required(CONF_HOST): TextSelector(),
vol.Required(CONF_PORT, default=DEFAULT_PORT): vol.All(
probatio.Required(CONF_HOST): TextSelector(),
probatio.Required(CONF_PORT, default=DEFAULT_PORT): probatio.All(
NumberSelector(
NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=1, max=65535)
),
vol.Coerce(int),
probatio.Coerce(int),
),
vol.Required(CONF_UNIT_ID, default=DEFAULT_UNIT_ID): vol.All(
probatio.Required(CONF_UNIT_ID, default=DEFAULT_UNIT_ID): probatio.All(
NumberSelector(
NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=1, max=247)
),
vol.Coerce(int),
probatio.Coerce(int),
),
}
)
Expand Down
Loading
Loading