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
dbc7f2b
Remove Home Connect stale code (#152307)
Diegorro98 Sep 14, 2025
f832002
Bump holidays to 0.80 (#152306)
gjohansson-ST Sep 14, 2025
a3a4433
Add missing unit conversion for BTU/h (#152300)
bramstroker Sep 14, 2025
c97f16a
Bump aiohomekit to 3.2.17 (#152297)
bdraco Sep 14, 2025
49e75c9
Fix browse by language in radio browser (#152296)
karwosts Sep 14, 2025
af9717c
Raise error for entity services without a correct schema (#151165)
gjohansson-ST Sep 14, 2025
1509c42
Improve husqvarna_automower_ble config flow (#144877)
CFenner Sep 14, 2025
d2b255b
nitpick: Add parameter types to `_test_selector` function signature (…
cr7pt0gr4ph7 Sep 14, 2025
d877d6d
Fix Lutron Caseta shade stuttering and improve stop functionality (#1…
bdraco Sep 14, 2025
9bf467e
Bump aioesphomeapi to 40.2.0 (#152272)
bdraco Sep 14, 2025
1fcc6df
Add proper error handling for /actions endpoint for miele (#152290)
astrandb Sep 14, 2025
58d6549
Add display precision for rain rate and rain count (#151822)
GSzabados Sep 14, 2025
75d2219
Fix local_todo capitalization to preserve user input (#150814)
Skaronator Sep 14, 2025
c13002b
Add supported device[Plug-Mini-EU] for switchbot cloud (#151019)
XiaoLing-git Sep 14, 2025
5ba580b
Capitalize "Supervisor" in two issues strings of `hassio` (#152303)
NoRi2909 Sep 14, 2025
dd0f6a7
Small fixes of user-facing strings in `esphome` (#152311)
NoRi2909 Sep 14, 2025
2f4c69b
Simplify description of `direction_command_topic` in `mqtt` (#150617)
NoRi2909 Sep 14, 2025
e40ecdf
Remove Shelly empty sub-devices (#152251)
thecode Sep 14, 2025
f5535db
Automatically generate entity platform enum (#152193)
balloob Sep 14, 2025
1483c94
Update authorization server to prefer absolute urls (#152313)
allenporter Sep 14, 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
19 changes: 15 additions & 4 deletions homeassistant/components/auth/login_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,11 @@
from homeassistant.components.http.data_validator import RequestDataValidator
from homeassistant.components.http.view import HomeAssistantView
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.network import is_cloud_connection
from homeassistant.helpers.network import (
NoURLAvailableError,
get_url,
is_cloud_connection,
)
from homeassistant.util.network import is_local

from . import indieauth
Expand Down Expand Up @@ -125,11 +129,18 @@ class WellKnownOAuthInfoView(HomeAssistantView):

async def get(self, request: web.Request) -> web.Response:
"""Return the well known OAuth2 authorization info."""
hass = request.app[KEY_HASS]
# Some applications require absolute urls, so we prefer using the
# current requests url if possible, with fallback to a relative url.
try:
url_prefix = get_url(hass, require_current_request=True)
except NoURLAvailableError:
url_prefix = ""
return self.json(
{
"authorization_endpoint": "/auth/authorize",
"token_endpoint": "/auth/token",
"revocation_endpoint": "/auth/revoke",
"authorization_endpoint": f"{url_prefix}/auth/authorize",
"token_endpoint": f"{url_prefix}/auth/token",
"revocation_endpoint": f"{url_prefix}/auth/revoke",
"response_types_supported": ["code"],
"service_documentation": (
"https://developers.home-assistant.io/docs/auth_api"
Expand Down
5 changes: 5 additions & 0 deletions homeassistant/components/conversation/icons.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
{
"entity_component": {
"_": {
"default": "mdi:forum-outline"
}
},
"services": {
"process": {
"service": "mdi:message-processing"
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/conversation/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"codeowners": ["@home-assistant/core", "@synesthesiam", "@arturpragacz"],
"dependencies": ["http", "intent"],
"documentation": "https://www.home-assistant.io/integrations/conversation",
"integration_type": "system",
"integration_type": "entity",
"quality_scale": "internal",
"requirements": ["hassil==3.2.0", "home-assistant-intents==2025.9.3"]
}
4 changes: 4 additions & 0 deletions homeassistant/components/ecowitt/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,24 +152,28 @@
native_unit_of_measurement=UnitOfPrecipitationDepth.MILLIMETERS,
device_class=SensorDeviceClass.PRECIPITATION,
state_class=SensorStateClass.TOTAL_INCREASING,
suggested_display_precision=1,
),
EcoWittSensorTypes.RAIN_COUNT_INCHES: SensorEntityDescription(
key="RAIN_COUNT_INCHES",
native_unit_of_measurement=UnitOfPrecipitationDepth.INCHES,
device_class=SensorDeviceClass.PRECIPITATION,
state_class=SensorStateClass.TOTAL_INCREASING,
suggested_display_precision=2,
),
EcoWittSensorTypes.RAIN_RATE_MM: SensorEntityDescription(
key="RAIN_RATE_MM",
native_unit_of_measurement=UnitOfVolumetricFlux.MILLIMETERS_PER_HOUR,
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.PRECIPITATION_INTENSITY,
suggested_display_precision=1,
),
EcoWittSensorTypes.RAIN_RATE_INCHES: SensorEntityDescription(
key="RAIN_RATE_INCHES",
native_unit_of_measurement=UnitOfVolumetricFlux.INCHES_PER_HOUR,
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.PRECIPITATION_INTENSITY,
suggested_display_precision=2,
),
EcoWittSensorTypes.LIGHTNING_DISTANCE_KM: SensorEntityDescription(
key="LIGHTNING_DISTANCE_KM",
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/esphome/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"mqtt": ["esphome/discover/#"],
"quality_scale": "platinum",
"requirements": [
"aioesphomeapi==40.1.0",
"aioesphomeapi==40.2.0",
"esphome-dashboard-api==1.3.0",
"bleak-esphome==3.3.0"
],
Expand Down
10 changes: 5 additions & 5 deletions homeassistant/components/esphome/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"mqtt_missing_mac": "Missing MAC address in MQTT properties.",
"mqtt_missing_api": "Missing API port in MQTT properties.",
"mqtt_missing_ip": "Missing IP address in MQTT properties.",
"mqtt_missing_payload": "Missing MQTT Payload.",
"mqtt_missing_payload": "Missing MQTT payload.",
"name_conflict_migrated": "The configuration for `{name}` has been migrated to a new device with MAC address `{mac}` from `{existing_mac}`.",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
"reauth_unique_id_changed": "**Re-authentication of `{name}` was aborted** because the address `{host}` points to a different device: `{unexpected_device_name}` (MAC: `{unexpected_mac}`) instead of the expected one (MAC: `{expected_mac}`).",
Expand Down Expand Up @@ -91,7 +91,7 @@
"subscribe_logs": "Subscribe to logs from the device."
},
"data_description": {
"allow_service_calls": "When enabled, ESPHome devices can perform Home Assistant actions, such as calling services or sending events. Only enable this if you trust the device.",
"allow_service_calls": "When enabled, ESPHome devices can perform Home Assistant actions or send events. Only enable this if you trust the device.",
"subscribe_logs": "When enabled, the device will send logs to Home Assistant and you can view them in the logs panel."
}
}
Expand Down Expand Up @@ -154,7 +154,7 @@
"description": "To improve Bluetooth reliability and performance, we highly recommend updating {name} with ESPHome {version} or later. When updating the device from ESPHome earlier than 2022.12.0, it is recommended to use a serial cable instead of an over-the-air update to take advantage of the new partition scheme."
},
"api_password_deprecated": {
"title": "API Password deprecated on {name}",
"title": "API password deprecated on {name}",
"description": "The API password for ESPHome is deprecated and the use of an API encryption key is recommended instead.\n\nRemove the API password and add an encryption key to your ESPHome device to resolve this issue."
},
"service_calls_not_allowed": {
Expand Down Expand Up @@ -193,10 +193,10 @@
"message": "Error communicating with the device {device_name}: {error}"
},
"error_compiling": {
"message": "Error compiling {configuration}; Try again in ESPHome dashboard for more information."
"message": "Error compiling {configuration}. Try again in ESPHome dashboard for more information."
},
"error_uploading": {
"message": "Error during OTA (Over-The-Air) of {configuration}; Try again in ESPHome dashboard for more information."
"message": "Error during OTA (Over-The-Air) update of {configuration}. Try again in ESPHome dashboard for more information."
},
"ota_in_progress": {
"message": "An OTA (Over-The-Air) update is already in progress for {configuration}."
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/hassio/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@
},
"issue_addon_detached_addon_missing": {
"title": "Missing repository for an installed add-on",
"description": "Repository for add-on {addon} is missing. This means it will not get updates, and backups may not be restored correctly as the supervisor may not be able to build/download the resources required.\n\nPlease check the [add-on's documentation]({addon_url}) for installation instructions and add the repository to the store."
"description": "Repository for add-on {addon} is missing. This means it will not get updates, and backups may not be restored correctly as the Home Assistant Supervisor may not be able to build/download the resources required.\n\nPlease check the [add-on's documentation]({addon_url}) for installation instructions and add the repository to the store."
},
"issue_addon_detached_addon_removed": {
"title": "Installed add-on has been removed from repository",
"fix_flow": {
"step": {
"addon_execute_remove": {
"description": "Add-on {addon} has been removed from the repository it was installed from. This means it will not get updates, and backups may not be restored correctly as the supervisor may not be able to build/download the resources required.\n\nSelecting **Submit** will uninstall this deprecated add-on. Alternatively, you can check [Home Assistant help]({help_url}) and the [community forum]({community_url}) for alternatives to migrate to."
"description": "Add-on {addon} has been removed from the repository it was installed from. This means it will not get updates, and backups may not be restored correctly as the Home Assistant Supervisor may not be able to build/download the resources required.\n\nSelecting **Submit** will uninstall this deprecated add-on. Alternatively, you can check [Home Assistant help]({help_url}) and the [community forum]({community_url}) for alternatives to migrate to."
}
},
"abort": {
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/holiday/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/holiday",
"iot_class": "local_polling",
"requirements": ["holidays==0.79", "babel==2.15.0"]
"requirements": ["holidays==0.80", "babel==2.15.0"]
}
10 changes: 0 additions & 10 deletions homeassistant/components/home_connect/application_credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,3 @@ async def async_get_authorization_server(hass: HomeAssistant) -> AuthorizationSe
authorize_url=OAUTH2_AUTHORIZE,
token_url=OAUTH2_TOKEN,
)


async def async_get_description_placeholders(hass: HomeAssistant) -> dict[str, str]:
"""Return description placeholders for the credentials dialog."""
return {
"developer_dashboard_url": "https://developer.home-connect.com/",
"applications_url": "https://developer.home-connect.com/applications",
"register_application_url": "https://developer.home-connect.com/application/add",
"redirect_url": "https://my.home-assistant.io/redirect/oauth",
}
14 changes: 0 additions & 14 deletions homeassistant/components/home_connect/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -659,17 +659,3 @@ def refreshed_too_often_recently(self, appliance_ha_id: str) -> bool:
)

return False

async def reset_execution_tracker(self, appliance_ha_id: str) -> None:
"""Reset the execution tracker for a specific appliance."""
self._execution_tracker.pop(appliance_ha_id, None)
appliance_info = await self.client.get_specific_appliance(appliance_ha_id)

appliance_data = await self._get_appliance_data(
appliance_info, self.data.get(appliance_info.ha_id)
)
self.data[appliance_ha_id].update(appliance_data)
for listener, context in self._special_listeners.values():
if EventKey.BSH_COMMON_APPLIANCE_DEPAIRED not in context:
listener()
self._call_all_event_listeners_for_appliance(appliance_ha_id)
60 changes: 0 additions & 60 deletions homeassistant/components/home_connect/repairs.py

This file was deleted.

2 changes: 1 addition & 1 deletion homeassistant/components/homekit_controller/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@
"documentation": "https://www.home-assistant.io/integrations/homekit_controller",
"iot_class": "local_push",
"loggers": ["aiohomekit", "commentjson"],
"requirements": ["aiohomekit==3.2.16"],
"requirements": ["aiohomekit==3.2.17"],
"zeroconf": ["_hap._tcp.local.", "_hap._udp.local."]
}
76 changes: 42 additions & 34 deletions homeassistant/components/husqvarna_automower_ble/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,21 @@

from .const import DOMAIN, LOGGER

BLUETOOTH_SCHEMA = vol.Schema(
{
vol.Required(CONF_PIN): str,
}
)

USER_SCHEMA = vol.Schema(
{
vol.Required(CONF_ADDRESS): str,
vol.Required(CONF_PIN): str,
}
)

REAUTH_SCHEMA = BLUETOOTH_SCHEMA


def _is_supported(discovery_info: BluetoothServiceInfo):
"""Check if device is supported."""
Expand Down Expand Up @@ -78,6 +93,10 @@ async def async_step_bluetooth(
if not _is_supported(discovery_info):
return self.async_abort(reason="no_devices_found")

self.context["title_placeholders"] = {
"name": discovery_info.name,
"address": discovery_info.address,
}
self.address = discovery_info.address
await self.async_set_unique_id(self.address)
self._abort_if_unique_id_configured()
Expand All @@ -100,12 +119,7 @@ async def async_step_bluetooth_confirm(
return self.async_show_form(
step_id="bluetooth_confirm",
data_schema=self.add_suggested_values_to_schema(
vol.Schema(
{
vol.Required(CONF_PIN): str,
},
),
user_input,
BLUETOOTH_SCHEMA, user_input
),
description_placeholders={"name": self.mower_name or self.address},
errors=errors,
Expand All @@ -129,15 +143,7 @@ async def async_step_user(

return self.async_show_form(
step_id="user",
data_schema=self.add_suggested_values_to_schema(
vol.Schema(
{
vol.Required(CONF_ADDRESS): str,
vol.Required(CONF_PIN): str,
},
),
user_input,
),
data_schema=self.add_suggested_values_to_schema(USER_SCHEMA, user_input),
errors=errors,
)

Expand Down Expand Up @@ -184,7 +190,24 @@ async def check_mower(

title = await self.probe_mower(device)
if title is None:
return self.async_abort(reason="cannot_connect")
if self.source == SOURCE_BLUETOOTH:
return self.async_show_form(
step_id="bluetooth_confirm",
data_schema=BLUETOOTH_SCHEMA,
description_placeholders={"name": self.address},
errors={"base": "cannot_connect"},
)
return self.async_show_form(
step_id="user",
data_schema=self.add_suggested_values_to_schema(
USER_SCHEMA,
{
CONF_ADDRESS: self.address,
CONF_PIN: self.pin,
},
),
errors={"base": "cannot_connect"},
)
self.mower_name = title

try:
Expand All @@ -209,11 +232,7 @@ async def check_mower(
if self.source == SOURCE_BLUETOOTH:
return self.async_show_form(
step_id="bluetooth_confirm",
data_schema=vol.Schema(
{
vol.Required(CONF_PIN): str,
},
),
data_schema=BLUETOOTH_SCHEMA,
description_placeholders={
"name": self.mower_name or self.address
},
Expand All @@ -230,13 +249,7 @@ async def check_mower(
return self.async_show_form(
step_id="user",
data_schema=self.add_suggested_values_to_schema(
vol.Schema(
{
vol.Required(CONF_ADDRESS): str,
vol.Required(CONF_PIN): str,
},
),
suggested_values,
USER_SCHEMA, suggested_values
),
errors=errors,
)
Expand Down Expand Up @@ -312,12 +325,7 @@ async def async_step_reauth_confirm(
return self.async_show_form(
step_id="reauth_confirm",
data_schema=self.add_suggested_values_to_schema(
vol.Schema(
{
vol.Required(CONF_PIN): str,
},
),
{CONF_PIN: self.pin},
REAUTH_SCHEMA, {CONF_PIN: self.pin}
),
description_placeholders={"name": self.mower_name},
errors=errors,
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/local_todo/todo.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ def __init__(
self._store = store
self._calendar = calendar
self._calendar_lock = asyncio.Lock()
self._attr_name = name.capitalize()
self._attr_name = name
self._attr_unique_id = unique_id

def _new_todo_store(self) -> TodoStore:
Expand Down
Loading
Loading