Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
a270bd7
Add sensors for battery charge amount to ViCare integration (#153631)
CFenner Oct 5, 2025
f44d65e
Migrate tolo to entry.runtime_data (#153744)
zweckj Oct 5, 2025
fed8f13
Upgrade python-melcloud to 0.1.2 (#153742)
Sander0542 Oct 5, 2025
d75ca0f
Bump aioamazondevices to 6.2.9 (#153756)
chemelli74 Oct 5, 2025
26bfbc5
Bump anthropic to 0.69.0 (#153764)
Shulyaka Oct 5, 2025
6ec7b63
Add support for Anthropic Claude Sonnet 4.5 (#153769)
Shulyaka Oct 5, 2025
933b15c
Revert "AGENTS.md" (#153777)
zweckj Oct 5, 2025
d63d154
Daikin increase timeout (#153722)
fredrike Oct 5, 2025
5d83c82
Shelly's energy sensors naming paradigm standardization (#153729)
davidrapan Oct 5, 2025
19f990e
ESPHome to set Z-Wave discovery as next_flow (#153706)
balloob Oct 5, 2025
f524edc
Add pytest command line option to drop recorder db before test (#153527)
emontnemery Oct 5, 2025
1818fce
Validating schema outside the event loop will now fail (#153472)
gjohansson-ST Oct 5, 2025
9ac9392
Cleanup process_fds addition in systemmonitor (#153568)
gjohansson-ST Oct 5, 2025
78cd807
Bump aiomealie to 1.0.0, update min Mealie instance version to v2. (#…
andrew-codechimp Oct 5, 2025
a048356
Make hassfest fail on services with device filter on targets (#152794)
emontnemery Oct 5, 2025
7f931e4
Add device class filter to hydrawise services (#153249)
emontnemery Oct 5, 2025
fad0e23
Allow to set the manufacturer in a MQTT device subentry setup (#153747)
jbouwh Oct 5, 2025
19f3559
Remove previously deprecated template attach function (#153370)
gjohansson-ST Oct 5, 2025
bc3fe7a
Use automatic reload options flow in min_max (#153143)
gjohansson-ST Oct 5, 2025
9a9fd44
Use yaml anchors in ci workflow (#152586)
cdce8p Oct 5, 2025
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
File renamed without changes.
710 changes: 206 additions & 504 deletions .github/workflows/ci.yaml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion CLAUDE.md
2 changes: 1 addition & 1 deletion homeassistant/components/alexa_devices/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
"iot_class": "cloud_polling",
"loggers": ["aioamazondevices"],
"quality_scale": "platinum",
"requirements": ["aioamazondevices==6.2.8"]
"requirements": ["aioamazondevices==6.2.9"]
}
9 changes: 4 additions & 5 deletions homeassistant/components/anthropic/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@
RECOMMENDED_THINKING_BUDGET = 0
MIN_THINKING_BUDGET = 1024

THINKING_MODELS = [
"claude-3-7-sonnet",
"claude-sonnet-4-0",
"claude-opus-4-0",
"claude-opus-4-1",
NON_THINKING_MODELS = [
"claude-3-5", # Both sonnet and haiku
"claude-3-opus",
"claude-3-haiku",
]
4 changes: 2 additions & 2 deletions homeassistant/components/anthropic/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@
DOMAIN,
LOGGER,
MIN_THINKING_BUDGET,
NON_THINKING_MODELS,
RECOMMENDED_CHAT_MODEL,
RECOMMENDED_MAX_TOKENS,
RECOMMENDED_TEMPERATURE,
RECOMMENDED_THINKING_BUDGET,
THINKING_MODELS,
)

# Max number of back and forth with the LLM to generate a response
Expand Down Expand Up @@ -364,7 +364,7 @@ async def _async_handle_chat_log(
if tools:
model_args["tools"] = tools
if (
model.startswith(tuple(THINKING_MODELS))
not model.startswith(tuple(NON_THINKING_MODELS))
and thinking_budget >= MIN_THINKING_BUDGET
):
model_args["thinking"] = ThinkingConfigEnabledParam(
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/anthropic/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
"documentation": "https://www.home-assistant.io/integrations/anthropic",
"integration_type": "service",
"iot_class": "cloud_polling",
"requirements": ["anthropic==0.62.0"]
"requirements": ["anthropic==0.69.0"]
}
6 changes: 3 additions & 3 deletions homeassistant/components/daikin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC
from homeassistant.util.ssl import client_context_no_verify

from .const import KEY_MAC, TIMEOUT
from .const import KEY_MAC, TIMEOUT_SEC
from .coordinator import DaikinConfigEntry, DaikinCoordinator

_LOGGER = logging.getLogger(__name__)
Expand All @@ -42,7 +42,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: DaikinConfigEntry) -> bo
session = async_get_clientsession(hass)
host = conf[CONF_HOST]
try:
async with asyncio.timeout(TIMEOUT):
async with asyncio.timeout(TIMEOUT_SEC):
device: Appliance = await DaikinFactory(
host,
session,
Expand All @@ -53,7 +53,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: DaikinConfigEntry) -> bo
)
_LOGGER.debug("Connection to %s successful", host)
except TimeoutError as err:
_LOGGER.debug("Connection to %s timed out in 60 seconds", host)
_LOGGER.debug("Connection to %s timed out in %s seconds", host, TIMEOUT_SEC)
raise ConfigEntryNotReady from err
except ClientConnectionError as err:
_LOGGER.debug("ClientConnectionError to %s", host)
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/daikin/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from homeassistant.util.ssl import client_context_no_verify

from .const import DOMAIN, KEY_MAC, TIMEOUT
from .const import DOMAIN, KEY_MAC, TIMEOUT_SEC

_LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -84,7 +84,7 @@ async def _create_device(
password = None

try:
async with asyncio.timeout(TIMEOUT):
async with asyncio.timeout(TIMEOUT_SEC):
device: Appliance = await DaikinFactory(
host,
async_get_clientsession(self.hass),
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/daikin/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@
KEY_MAC = "mac"
KEY_IP = "ip"

TIMEOUT = 60
TIMEOUT_SEC = 120
4 changes: 2 additions & 2 deletions homeassistant/components/daikin/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator

from .const import DOMAIN
from .const import DOMAIN, TIMEOUT_SEC

_LOGGER = logging.getLogger(__name__)

Expand All @@ -28,7 +28,7 @@ def __init__(
_LOGGER,
config_entry=entry,
name=device.values.get("name", DOMAIN),
update_interval=timedelta(seconds=60),
update_interval=timedelta(seconds=TIMEOUT_SEC),
)
self.device = device

Expand Down
53 changes: 48 additions & 5 deletions homeassistant/components/esphome/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,23 @@

from homeassistant.components import zeroconf
from homeassistant.config_entries import (
SOURCE_ESPHOME,
SOURCE_IGNORE,
SOURCE_REAUTH,
SOURCE_RECONFIGURE,
ConfigEntry,
ConfigFlow,
ConfigFlowResult,
FlowType,
OptionsFlow,
)
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT
from homeassistant.core import callback
from homeassistant.data_entry_flow import AbortFlow
from homeassistant.data_entry_flow import AbortFlow, FlowResultType
from homeassistant.helpers import discovery_flow
from homeassistant.helpers.device_registry import format_mac
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.helpers.service_info.esphome import ESPHomeServiceInfo
from homeassistant.helpers.service_info.hassio import HassioServiceInfo
from homeassistant.helpers.service_info.mqtt import MqttServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
Expand Down Expand Up @@ -75,6 +79,7 @@ class EsphomeFlowHandler(ConfigFlow, domain=DOMAIN):
def __init__(self) -> None:
"""Initialize flow."""
self._host: str | None = None
self._connected_address: str | None = None
self.__name: str | None = None
self._port: int | None = None
self._password: str | None = None
Expand Down Expand Up @@ -498,18 +503,55 @@ async def async_step_name_conflict_overwrite(
await self.hass.config_entries.async_remove(
self._entry_with_name_conflict.entry_id
)
return self._async_create_entry()
return await self._async_create_entry()

@callback
def _async_create_entry(self) -> ConfigFlowResult:
async def _async_create_entry(self) -> ConfigFlowResult:
"""Create the config entry."""
assert self._name is not None
assert self._device_info is not None

# Check if Z-Wave capabilities are present and start discovery flow
next_flow_id: str | None = None
if self._device_info.zwave_proxy_feature_flags:
assert self._connected_address is not None
assert self._port is not None

# Start Z-Wave discovery flow and get the flow ID
zwave_result = await self.hass.config_entries.flow.async_init(
"zwave_js",
context={
"source": SOURCE_ESPHOME,
"discovery_key": discovery_flow.DiscoveryKey(
domain=DOMAIN,
key=self._device_info.mac_address,
version=1,
),
},
data=ESPHomeServiceInfo(
name=self._device_info.name,
zwave_home_id=self._device_info.zwave_home_id or None,
ip_address=self._connected_address,
port=self._port,
noise_psk=self._noise_psk,
),
)
if zwave_result["type"] in (
FlowResultType.ABORT,
FlowResultType.CREATE_ENTRY,
):
_LOGGER.debug(
"Unable to continue created Z-Wave JS config flow: %s", zwave_result
)
else:
next_flow_id = zwave_result["flow_id"]

return self.async_create_entry(
title=self._name,
data=self._async_make_config_data(),
options={
CONF_ALLOW_SERVICE_CALLS: DEFAULT_NEW_CONFIG_ALLOW_ALLOW_SERVICE_CALLS,
},
next_flow=(FlowType.CONFIG_FLOW, next_flow_id) if next_flow_id else None,
)

@callback
Expand Down Expand Up @@ -556,7 +598,7 @@ async def _async_validated_connection(self) -> ConfigFlowResult:
if entry.data.get(CONF_DEVICE_NAME) == self._device_name:
self._entry_with_name_conflict = entry
return await self.async_step_name_conflict()
return self._async_create_entry()
return await self._async_create_entry()

async def _async_reauth_validated_connection(self) -> ConfigFlowResult:
"""Handle reauth validated connection."""
Expand Down Expand Up @@ -703,6 +745,7 @@ async def _fetch_device_info(
try:
await cli.connect()
self._device_info = await cli.device_info()
self._connected_address = cli.connected_address
except InvalidAuthAPIError:
return ERROR_INVALID_PASSWORD_AUTH
except RequiresEncryptionAPIError:
Expand Down
19 changes: 16 additions & 3 deletions homeassistant/components/hydrawise/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,24 @@ def _add_new_zones(zones: Iterable[tuple[Zone, Controller]]) -> None:
coordinators.main.new_zones_callbacks.append(_add_new_zones)

platform = entity_platform.async_get_current_platform()
platform.async_register_entity_service(SERVICE_RESUME, None, "resume")
platform.async_register_entity_service(
SERVICE_START_WATERING, SCHEMA_START_WATERING, "start_watering"
SERVICE_RESUME,
None,
"resume",
entity_device_classes=(BinarySensorDeviceClass.RUNNING,),
)
platform.async_register_entity_service(
SERVICE_START_WATERING,
SCHEMA_START_WATERING,
"start_watering",
entity_device_classes=(BinarySensorDeviceClass.RUNNING,),
)
platform.async_register_entity_service(
SERVICE_SUSPEND,
SCHEMA_SUSPEND,
"suspend",
entity_device_classes=(BinarySensorDeviceClass.RUNNING,),
)
platform.async_register_entity_service(SERVICE_SUSPEND, SCHEMA_SUSPEND, "suspend")


class HydrawiseBinarySensor(HydrawiseEntity, BinarySensorEntity):
Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/mealie/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: MealieConfigEntry) -> bo
),
)
try:
await client.define_household_support()
about = await client.get_about()
version = create_version(about.version)
except MealieAuthenticationError as error:
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/mealie/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@
ATTR_SEARCH_TERMS = "search_terms"
ATTR_RESULT_LIMIT = "result_limit"

MIN_REQUIRED_MEALIE_VERSION = AwesomeVersion("v1.0.0")
MIN_REQUIRED_MEALIE_VERSION = AwesomeVersion("v2.0.0")
2 changes: 1 addition & 1 deletion homeassistant/components/mealie/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
"integration_type": "service",
"iot_class": "local_polling",
"quality_scale": "silver",
"requirements": ["aiomealie==0.11.0"]
"requirements": ["aiomealie==1.0.0"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/mealie/quality_scale.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ rules:
docs-data-update: done
docs-examples: done
docs-known-limitations: todo
docs-supported-devices: todo
docs-supported-devices: done
docs-supported-functions: done
docs-troubleshooting: todo
docs-use-cases: todo
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/melcloud/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/melcloud",
"iot_class": "cloud_polling",
"loggers": ["pymelcloud"],
"requirements": ["python-melcloud==0.1.0"]
"requirements": ["python-melcloud==0.1.2"]
}
7 changes: 0 additions & 7 deletions homeassistant/components/min_max/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up Min/Max from a config entry."""
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)

entry.async_on_unload(entry.add_update_listener(config_entry_update_listener))

return True


async def config_entry_update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Update listener, called when the config entry options are changed."""
await hass.config_entries.async_reload(entry.entry_id)


async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
1 change: 1 addition & 0 deletions homeassistant/components/min_max/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class ConfigFlowHandler(SchemaConfigFlowHandler, domain=DOMAIN):

config_flow = CONFIG_FLOW
options_flow = OPTIONS_FLOW
options_flow_reloads = True

def async_config_entry_title(self, options: Mapping[str, Any]) -> str:
"""Return config entry title."""
Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/mqtt/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
from homeassistant.const import (
ATTR_CONFIGURATION_URL,
ATTR_HW_VERSION,
ATTR_MANUFACTURER,
ATTR_MODEL,
ATTR_MODEL_ID,
ATTR_NAME,
Expand Down Expand Up @@ -3050,6 +3051,7 @@ class PlatformField:
),
ATTR_MODEL: PlatformField(selector=TEXT_SELECTOR, required=False),
ATTR_MODEL_ID: PlatformField(selector=TEXT_SELECTOR, required=False),
ATTR_MANUFACTURER: PlatformField(selector=TEXT_SELECTOR, required=False),
ATTR_CONFIGURATION_URL: PlatformField(
selector=TEXT_SELECTOR, required=False, validator=cv.url, error="invalid_url"
),
Expand Down
6 changes: 4 additions & 2 deletions homeassistant/components/mqtt/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -165,13 +165,15 @@
"name": "[%key:common::config_flow::data::name%]",
"configuration_url": "Configuration URL",
"model": "Model",
"model_id": "Model ID"
"model_id": "Model ID",
"manufacturer": "Manufacturer"
},
"data_description": {
"name": "The name of the manually added MQTT device.",
"configuration_url": "A link to the webpage that can manage the configuration of this device. Can be either a 'http://', 'https://' or an internal 'homeassistant://' URL.",
"model": "E.g. 'Cleanmaster Pro'.",
"model_id": "E.g. '123NK2PRO'."
"model_id": "E.g. '123NK2PRO'.",
"manufacturer": "E.g. Cleanmaster Ltd."
},
"sections": {
"advanced_settings": {
Expand Down
Loading
Loading