Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
19545f2
Use show in sidebar property instead of removing panel title and icon…
piitaya Feb 25, 2026
7b811cd
Use has_entity_name in SmartTub entities (#162374)
mdz Feb 25, 2026
7446d5e
Add reconfigure flow to Fully Kiosk (#161840)
erwindouna Feb 25, 2026
b81b12f
Sonarr service calls instead of sensor attributes (#161199)
Liquidmasl Feb 25, 2026
2e34d4d
Add brands system integration to proxy brand images through local API…
frenck Feb 25, 2026
f25b437
Add quality scale to Tessie integration (#160499)
Bre77 Feb 25, 2026
15e00f6
Add siren support for HmIP-MP3P (Combination Signalling Device) (#161…
lackas Feb 25, 2026
80fc369
Align airOS add_entities consumption in sensor (#164055)
CoMPaTech Feb 25, 2026
96d5056
Portainer optimize switch (#163520)
erwindouna Feb 25, 2026
227d2e8
Sonarr coordinator refactor (#164077)
Liquidmasl Feb 25, 2026
209af5d
Adjust service description for Volvo integration (#164073)
thomasddn Feb 25, 2026
52382b7
Fix ntfy test snapshots (#164079)
emontnemery Feb 25, 2026
0fd5154
Fix smarla test snapshots (#164078)
emontnemery Feb 25, 2026
b241054
Update frontend to 20260225.0 (#164076)
bramkragten Feb 25, 2026
f12c5b6
Remove building wheels for Python 3.13 (#164083)
edenhaus Feb 25, 2026
a704c2d
Add parallel updates to aladdin_connect (#164082)
JamieMagee Feb 25, 2026
ef7cccb
Handle coordinator update errors in aladdin_connect (#164084)
JamieMagee Feb 25, 2026
2fccbd6
dwd_weather_warnings: Filter expired warnings (#163096)
tribut Feb 25, 2026
09765fe
Fix AWS S3 config flow endpoint URL validation (#164085)
mik-laj Feb 25, 2026
6a5455d
Add integration_type device to wiffi (#163978)
joostlek Feb 25, 2026
7e3b7a0
Add integration_type device to zerproc (#163998)
joostlek Feb 25, 2026
6157802
Set initiate flow for Zinvolt (#164054)
joostlek Feb 25, 2026
91ca674
Add sensor platform to systemnexa2 (#163961)
konsulten Feb 25, 2026
1d97729
Use different name source in Zinvolt (#164072)
joostlek Feb 25, 2026
173aab5
Refresh coordinator in Zinvolt after setting value (#164069)
joostlek Feb 25, 2026
f2afd32
Make Zinvolt battery state a non diagnostic sensor (#164071)
joostlek Feb 25, 2026
9b56f93
Bump uv to 0.10.6 (#164086)
edenhaus Feb 25, 2026
5af6227
Add action exceptions for cover commands in aladdin_connect (#164087)
JamieMagee Feb 25, 2026
87bd04a
Update knx-frontend to 2026.2.25.165736 (#164089)
farmio Feb 25, 2026
19c7f66
Add diagnostic to systemnexa2 integration (#164090)
konsulten Feb 25, 2026
02171a1
Add Zinvolt power sensor (#164092)
joostlek Feb 25, 2026
c41dd3e
Bump hdfury to 1.6.0 (#164088)
glenndehaan Feb 25, 2026
42428b9
Bump velbusaio to 2026.2.0 (#164093)
cereal2nd Feb 25, 2026
324ed65
add codeowner to homevolt (#164097)
liudger Feb 25, 2026
4eb3e77
Remove redundant get_status call from Tessie coordinator (#163219)
Bre77 Feb 25, 2026
17e0fd1
Add Code execution tool to Anthropic (#164065)
Shulyaka Feb 25, 2026
390b625
Add PowerfoxPrivacyError handling for Powerfox integration (#164100)
klaasnicolaas Feb 25, 2026
80574f7
Change icon for Anthropic entities to `mdi:asterisk` (#164099)
Shulyaka Feb 25, 2026
0297257
Add Compit fan (#164049)
Przemko92 Feb 25, 2026
51dc6d7
Bump version to 2026.4.0dev0 (#164101)
frenck Feb 25, 2026
928732a
Clean up evohome constants (#164102)
zxdavb Feb 25, 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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ env:
CACHE_VERSION: 3
UV_CACHE_VERSION: 1
MYPY_CACHE_VERSION: 1
HA_SHORT_VERSION: "2026.3"
HA_SHORT_VERSION: "2026.4"
DEFAULT_PYTHON: "3.14.2"
ALL_PYTHON_VERSIONS: "['3.14.2']"
# 10.3 is the oldest supported version
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ jobs:
strategy:
fail-fast: false
matrix:
abi: ["cp313", "cp314"]
abi: ["cp314"]
arch: ["amd64", "aarch64"]
include:
- arch: amd64
Expand Down Expand Up @@ -161,7 +161,7 @@ jobs:
strategy:
fail-fast: false
matrix:
abi: ["cp313", "cp314"]
abi: ["cp314"]
arch: ["amd64", "aarch64"]
include:
- arch: amd64
Expand Down
6 changes: 4 additions & 2 deletions CODEOWNERS

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Dockerfile

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions homeassistant/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@
"analytics", # Needed for onboarding
"application_credentials",
"backup",
"brands",
"frontend",
"hardware",
"labs",
Expand Down
5 changes: 2 additions & 3 deletions homeassistant/components/airos/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,10 @@ async def async_setup_entry(
"""Set up the AirOS binary sensors from a config entry."""
coordinator = config_entry.runtime_data

entities: list[BinarySensorEntity] = []
entities.extend(
entities = [
AirOSBinarySensor(coordinator, description)
for description in COMMON_BINARY_SENSORS
)
]

if coordinator.device_data["fw_major"] == 8:
entities.extend(
Expand Down
8 changes: 4 additions & 4 deletions homeassistant/components/airos/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,15 +182,15 @@ async def async_setup_entry(
"""Set up the AirOS sensors from a config entry."""
coordinator = config_entry.runtime_data

async_add_entities(
AirOSSensor(coordinator, description) for description in COMMON_SENSORS
)
entities = [AirOSSensor(coordinator, description) for description in COMMON_SENSORS]

if coordinator.device_data["fw_major"] == 8:
async_add_entities(
entities.extend(
AirOSSensor(coordinator, description) for description in AIROS8_SENSORS
)

async_add_entities(entities)


class AirOSSensor(AirOSEntity, SensorEntity):
"""Representation of a Sensor."""
Expand Down
8 changes: 6 additions & 2 deletions homeassistant/components/aladdin_connect/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
from datetime import timedelta
import logging

import aiohttp
from genie_partner_sdk.client import AladdinConnectClient
from genie_partner_sdk.model import GarageDoor

from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed

_LOGGER = logging.getLogger(__name__)
type AladdinConnectConfigEntry = ConfigEntry[dict[str, AladdinConnectCoordinator]]
Expand Down Expand Up @@ -40,7 +41,10 @@ def __init__(

async def _async_update_data(self) -> GarageDoor:
"""Fetch data from the Aladdin Connect API."""
await self.client.update_door(self.data.device_id, self.data.door_number)
try:
await self.client.update_door(self.data.device_id, self.data.door_number)
except aiohttp.ClientError as err:
raise UpdateFailed(f"Error communicating with API: {err}") from err
self.data.status = self.client.get_door_status(
self.data.device_id, self.data.door_number
)
Expand Down
23 changes: 20 additions & 3 deletions homeassistant/components/aladdin_connect/cover.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,19 @@

from typing import Any

import aiohttp

from homeassistant.components.cover import CoverDeviceClass, CoverEntity
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback

from .const import SUPPORTED_FEATURES
from .const import DOMAIN, SUPPORTED_FEATURES
from .coordinator import AladdinConnectConfigEntry, AladdinConnectCoordinator
from .entity import AladdinConnectEntity

PARALLEL_UPDATES = 1


async def async_setup_entry(
hass: HomeAssistant,
Expand Down Expand Up @@ -40,11 +45,23 @@ def __init__(self, coordinator: AladdinConnectCoordinator) -> None:

async def async_open_cover(self, **kwargs: Any) -> None:
"""Issue open command to cover."""
await self.client.open_door(self._device_id, self._number)
try:
await self.client.open_door(self._device_id, self._number)
except aiohttp.ClientError as err:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="open_door_failed",
) from err

async def async_close_cover(self, **kwargs: Any) -> None:
"""Issue close command to cover."""
await self.client.close_door(self._device_id, self._number)
try:
await self.client.close_door(self._device_id, self._number)
except aiohttp.ClientError as err:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="close_door_failed",
) from err

@property
def is_closed(self) -> bool | None:
Expand Down
12 changes: 8 additions & 4 deletions homeassistant/components/aladdin_connect/quality_scale.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,20 @@ rules:
unique-config-entry: done

# Silver
action-exceptions: todo
action-exceptions: done
config-entry-unloading: done
docs-configuration-parameters:
status: exempt
comment: Integration does not have an options flow.
docs-installation-parameters: done
entity-unavailable: todo
entity-unavailable:
status: done
comment: Handled by the coordinator.
integration-owner: done
log-when-unavailable: todo
parallel-updates: todo
log-when-unavailable:
status: done
comment: Handled by the coordinator.
parallel-updates: done
reauthentication-flow: done
test-coverage: done

Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/aladdin_connect/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
from .coordinator import AladdinConnectConfigEntry, AladdinConnectCoordinator
from .entity import AladdinConnectEntity

PARALLEL_UPDATES = 0


@dataclass(frozen=True, kw_only=True)
class AladdinConnectSensorEntityDescription(SensorEntityDescription):
Expand Down
8 changes: 8 additions & 0 deletions homeassistant/components/aladdin_connect/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,13 @@
"title": "[%key:common::config_flow::title::reauth%]"
}
}
},
"exceptions": {
"close_door_failed": {
"message": "Failed to close the garage door"
},
"open_door_failed": {
"message": "Failed to open the garage door"
}
}
}
1 change: 1 addition & 0 deletions homeassistant/components/anthropic/ai_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class AnthropicTaskEntity(
ai_task.AITaskEntityFeature.GENERATE_DATA
| ai_task.AITaskEntityFeature.SUPPORT_ATTACHMENTS
)
_attr_translation_key = "ai_task_data"

async def _async_generate_data(
self,
Expand Down
12 changes: 12 additions & 0 deletions homeassistant/components/anthropic/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@
from homeassistant.helpers.typing import VolDictType

from .const import (
CODE_EXECUTION_UNSUPPORTED_MODELS,
CONF_CHAT_MODEL,
CONF_CODE_EXECUTION,
CONF_MAX_TOKENS,
CONF_PROMPT,
CONF_RECOMMENDED,
Expand Down Expand Up @@ -415,6 +417,16 @@ async def async_step_model(
else:
self.options.pop(CONF_THINKING_EFFORT, None)

if not model.startswith(tuple(CODE_EXECUTION_UNSUPPORTED_MODELS)):
step_schema[
vol.Optional(
CONF_CODE_EXECUTION,
default=DEFAULT[CONF_CODE_EXECUTION],
)
] = bool
else:
self.options.pop(CONF_CODE_EXECUTION, None)

if not model.startswith(tuple(WEB_SEARCH_UNSUPPORTED_MODELS)):
step_schema.update(
{
Expand Down
6 changes: 6 additions & 0 deletions homeassistant/components/anthropic/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
CONF_RECOMMENDED = "recommended"
CONF_PROMPT = "prompt"
CONF_CHAT_MODEL = "chat_model"
CONF_CODE_EXECUTION = "code_execution"
CONF_MAX_TOKENS = "max_tokens"
CONF_TEMPERATURE = "temperature"
CONF_THINKING_BUDGET = "thinking_budget"
Expand All @@ -25,6 +26,7 @@

DEFAULT = {
CONF_CHAT_MODEL: "claude-haiku-4-5",
CONF_CODE_EXECUTION: False,
CONF_MAX_TOKENS: 3000,
CONF_TEMPERATURE: 1.0,
CONF_THINKING_BUDGET: 0,
Expand Down Expand Up @@ -65,6 +67,10 @@
"claude-3-haiku",
]

CODE_EXECUTION_UNSUPPORTED_MODELS = [
"claude-3-haiku",
]

DEPRECATED_MODELS = [
"claude-3",
]
1 change: 1 addition & 0 deletions homeassistant/components/anthropic/conversation.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class AnthropicConversationEntity(
"""Anthropic conversation agent."""

_attr_supports_streaming = True
_attr_translation_key = "conversation"

def __init__(self, entry: AnthropicConfigEntry, subentry: ConfigSubentry) -> None:
"""Initialize the agent."""
Expand Down
Loading
Loading