Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
31ca332
Increase Shelly code coverage for Gen1 EM3 (#156752)
davidrapan Nov 21, 2025
985eff9
Mark Shelly entity translations as done (#155683)
thecode Nov 21, 2025
30cce68
Update Shelly's quality scale to platinum 🏆️ (#156982)
davidrapan Nov 21, 2025
dea2f37
Migrate Tuya cover (state) to use wrapper class (#156941)
epenet Nov 21, 2025
88b373a
Migrate Tuya climate (swing) to use wrapper class (#156938)
epenet Nov 21, 2025
9a22808
Migrate Tuya fan (direction) to use wrapper class (#156944)
epenet Nov 21, 2025
bfdff46
Migrate Tuya fan (speed) to use wrapper class (#156976)
epenet Nov 21, 2025
0c9e92f
Add MQTT text subentry support (#156686)
jbouwh Nov 21, 2025
1a23610
Add update platform to Tesla Fleet (#156908)
Bre77 Nov 21, 2025
956a294
Migrate Tuya fan (oscillate) to use wrapper class (#156946)
epenet Nov 21, 2025
edb8007
Migrate Tuya climate (temperature) to use wrapper class (#156977)
epenet Nov 21, 2025
b76e9ad
Migrate Tuya light (color_data) to use wrapper class (#156816)
epenet Nov 21, 2025
aa69012
Bump actions/checkout from 5.0.1 to 6.0.0 (#156973)
dependabot[bot] Nov 21, 2025
7c1b8ee
Bump aioshelly to 13.20.0 (#156988)
bdraco Nov 21, 2025
ac46568
Add tests to concord232 component (#156070)
nealhomeassistant Nov 21, 2025
c9bd87f
Classify identify button as diagnostic in Matter (#156943)
arturpragacz Nov 21, 2025
97de944
Add Washer Water Temperature to SmartThings (#156980)
mik-laj Nov 21, 2025
32a40e5
Bump PySwichBot to 0.74.0 (#156986)
bdraco Nov 21, 2025
9812286
Add fixtures for Samsung oven and dishwasher (#156655)
mik-laj Nov 21, 2025
ae38214
Bump pySmartThings to 3.3.4 (#156830)
joostlek Nov 21, 2025
9964cb5
Throttle Decora wifi updates (#156994)
joostlek Nov 21, 2025
d01843e
Use unix socket for HA managed go2rtc instance (#156968)
edenhaus Nov 21, 2025
babe197
Add diagnostic support to WAQI (#156811)
joostlek Nov 21, 2025
12ace95
Improve error handling in Niko Home Control config flow (#154565)
VandeurenGlenn Nov 21, 2025
2957b15
Update frontend to 20251105.1 (#156992)
bramkragten Nov 21, 2025
30153ab
Fix spelling mistake in IronOS integration (#156996)
tr4nt0r Nov 21, 2025
f2b8bb0
Modernize template cover (#156475)
Petro31 Nov 21, 2025
514a329
Rework CloudhookURL setup for mobile app (#156940)
TimoPtr Nov 21, 2025
00d2340
Fix usage_prediction incorrectly accessing target fields (#156937)
karwosts Nov 21, 2025
80b316b
Bump version of python_awair to 0.2.5 (#155798)
averybiteydinosaur Nov 21, 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
14 changes: 7 additions & 7 deletions .github/workflows/builder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
publish: ${{ steps.version.outputs.publish }}
steps:
- name: Checkout the repository
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
fetch-depth: 0

Expand Down Expand Up @@ -94,7 +94,7 @@ jobs:
- arch: i386
steps:
- name: Checkout the repository
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

- name: Download nightly wheels of frontend
if: needs.init.outputs.channel == 'dev'
Expand Down Expand Up @@ -227,7 +227,7 @@ jobs:
- green
steps:
- name: Checkout the repository
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

- name: Set build additional args
run: |
Expand Down Expand Up @@ -265,7 +265,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

- name: Initialize git
uses: home-assistant/actions/helpers/git-init@master
Expand Down Expand Up @@ -309,7 +309,7 @@ jobs:
registry: ["ghcr.io/home-assistant", "docker.io/homeassistant"]
steps:
- name: Checkout the repository
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

- name: Install Cosign
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
Expand Down Expand Up @@ -418,7 +418,7 @@ jobs:
if: github.repository_owner == 'home-assistant' && needs.init.outputs.publish == 'true'
steps:
- name: Checkout the repository
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
Expand Down Expand Up @@ -463,7 +463,7 @@ jobs:
HASSFEST_IMAGE_TAG: ghcr.io/home-assistant/hassfest:${{ needs.init.outputs.version }}
steps:
- name: Checkout repository
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

- name: Login to GitHub Container Registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ jobs:
steps:
- &checkout
name: Check out code from GitHub
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- name: Generate partial Python venv restore key
id: generate_python_cache_key
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:

steps:
- name: Check out code from GitHub
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

- name: Initialize CodeQL
uses: github/codeql-action/init@e12f0178983d466f2f6028f5cc7a6d786fd97f4b # v4.31.4
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/translations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
steps:
- &checkout
name: Checkout the repository
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/awair/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"documentation": "https://www.home-assistant.io/integrations/awair",
"iot_class": "local_polling",
"loggers": ["python_awair"],
"requirements": ["python-awair==0.2.4"],
"requirements": ["python-awair==0.2.5"],
"zeroconf": [
{
"name": "awair*",
Expand Down
52 changes: 40 additions & 12 deletions homeassistant/components/cloud/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from datetime import datetime, timedelta
from enum import Enum
import logging
from typing import cast
from typing import Any, cast

from hass_nabucasa import Cloud
import voluptuous as vol
Expand Down Expand Up @@ -86,6 +86,10 @@
"CLOUD_CONNECTION_STATE"
)

_SIGNAL_CLOUDHOOKS_UPDATED: SignalType[dict[str, Any]] = SignalType(
"CLOUDHOOKS_UPDATED"
)

STARTUP_REPAIR_DELAY = 1 # 1 hour

ALEXA_ENTITY_SCHEMA = vol.Schema(
Expand Down Expand Up @@ -242,6 +246,24 @@ async def async_delete_cloudhook(hass: HomeAssistant, webhook_id: str) -> None:
await hass.data[DATA_CLOUD].cloudhooks.async_delete(webhook_id)


@callback
def async_listen_cloudhook_change(
hass: HomeAssistant,
webhook_id: str,
on_change: Callable[[dict[str, Any] | None], None],
) -> Callable[[], None]:
"""Listen for cloudhook changes for the given webhook and notify when modified or deleted."""

@callback
def _handle_cloudhooks_updated(cloudhooks: dict[str, Any]) -> None:
"""Handle cloudhooks updated signal."""
on_change(cloudhooks.get(webhook_id))

return async_dispatcher_connect(
hass, _SIGNAL_CLOUDHOOKS_UPDATED, _handle_cloudhooks_updated
)


@bind_hass
@callback
def async_remote_ui_url(hass: HomeAssistant) -> str:
Expand Down Expand Up @@ -289,7 +311,7 @@ async def _shutdown(event: Event) -> None:

hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _shutdown)

_remote_handle_prefs_updated(cloud)
_handle_prefs_updated(hass, cloud)
_setup_services(hass, prefs)

async def async_startup_repairs(_: datetime) -> None:
Expand Down Expand Up @@ -373,26 +395,32 @@ async def _on_initialized() -> None:


@callback
def _remote_handle_prefs_updated(cloud: Cloud[CloudClient]) -> None:
"""Handle remote preferences updated."""
cur_pref = cloud.client.prefs.remote_enabled
def _handle_prefs_updated(hass: HomeAssistant, cloud: Cloud[CloudClient]) -> None:
"""Register handler for cloud preferences updates."""
cur_remote_enabled = cloud.client.prefs.remote_enabled
cur_cloudhooks = cloud.client.prefs.cloudhooks
lock = asyncio.Lock()

# Sync remote connection with prefs
async def remote_prefs_updated(prefs: CloudPreferences) -> None:
"""Update remote status."""
nonlocal cur_pref
async def on_prefs_updated(prefs: CloudPreferences) -> None:
"""Handle cloud preferences updates."""
nonlocal cur_remote_enabled
nonlocal cur_cloudhooks

# Lock protects cur_ state variables from concurrent updates
async with lock:
if prefs.remote_enabled == cur_pref:
if cur_cloudhooks != prefs.cloudhooks:
cur_cloudhooks = prefs.cloudhooks
async_dispatcher_send(hass, _SIGNAL_CLOUDHOOKS_UPDATED, cur_cloudhooks)

if prefs.remote_enabled == cur_remote_enabled:
return

if cur_pref := prefs.remote_enabled:
if cur_remote_enabled := prefs.remote_enabled:
await cloud.remote.connect()
else:
await cloud.remote.disconnect()

cloud.client.prefs.async_listen_updates(remote_prefs_updated)
cloud.client.prefs.async_listen_updates(on_prefs_updated)


async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
Expand Down
3 changes: 3 additions & 0 deletions homeassistant/components/decora_wifi/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from __future__ import annotations

from datetime import timedelta
import logging
from typing import Any

Expand All @@ -25,6 +26,7 @@
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from homeassistant.util import Throttle

_LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -167,6 +169,7 @@ def turn_off(self, **kwargs: Any) -> None:
except ValueError:
_LOGGER.error("Failed to turn off myLeviton switch")

@Throttle(timedelta(seconds=30))
def update(self) -> None:
"""Fetch new state data for this switch."""
try:
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/frontend/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
"documentation": "https://www.home-assistant.io/integrations/frontend",
"integration_type": "system",
"quality_scale": "internal",
"requirements": ["home-assistant-frontend==20251105.0"]
"requirements": ["home-assistant-frontend==20251105.1"]
}
30 changes: 24 additions & 6 deletions homeassistant/components/go2rtc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

from __future__ import annotations

from dataclasses import dataclass
import logging
import shutil

from aiohttp import ClientSession
from aiohttp import ClientSession, UnixConnector
from aiohttp.client_exceptions import ClientConnectionError, ServerConnectionError
from awesomeversion import AwesomeVersion
from go2rtc_client import Go2RtcRestClient
Expand Down Expand Up @@ -52,6 +53,7 @@
CONF_DEBUG_UI,
DEBUG_UI_URL_MESSAGE,
DOMAIN,
HA_MANAGED_UNIX_SOCKET,
HA_MANAGED_URL,
RECOMMENDED_VERSION,
)
Expand All @@ -73,7 +75,7 @@
extra=vol.ALLOW_EXTRA,
)

_DATA_GO2RTC: HassKey[str] = HassKey(DOMAIN)
_DATA_GO2RTC: HassKey[Go2RtcConfig] = HassKey(DOMAIN)
_RETRYABLE_ERRORS = (ClientConnectionError, ServerConnectionError)
type Go2RtcConfigEntry = ConfigEntry[WebRTCProvider]

Expand All @@ -100,8 +102,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
return False

# HA will manage the binary
session = ClientSession(connector=UnixConnector(path=HA_MANAGED_UNIX_SOCKET))
server = Server(
hass, binary, enable_ui=config.get(DOMAIN, {}).get(CONF_DEBUG_UI, False)
hass,
binary,
session,
enable_ui=config.get(DOMAIN, {}).get(CONF_DEBUG_UI, False),
)
try:
await server.start()
Expand All @@ -111,12 +117,15 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:

async def on_stop(event: Event) -> None:
await server.stop()
await session.close()

hass.bus.async_listen(EVENT_HOMEASSISTANT_STOP, on_stop)

url = HA_MANAGED_URL
else:
session = async_get_clientsession(hass)

hass.data[_DATA_GO2RTC] = url
hass.data[_DATA_GO2RTC] = Go2RtcConfig(url, session)
discovery_flow.async_create_flow(
hass, DOMAIN, context={"source": SOURCE_SYSTEM}, data={}
)
Expand All @@ -132,8 +141,9 @@ async def _remove_go2rtc_entries(hass: HomeAssistant) -> None:
async def async_setup_entry(hass: HomeAssistant, entry: Go2RtcConfigEntry) -> bool:
"""Set up go2rtc from a config entry."""

url = hass.data[_DATA_GO2RTC]
session = async_get_clientsession(hass)
config = hass.data[_DATA_GO2RTC]
url = config.url
session = config.session
client = Go2RtcRestClient(session, url)
# Validate the server URL
try:
Expand Down Expand Up @@ -342,3 +352,11 @@ async def teardown(self) -> None:
for ws_client in self._sessions.values():
await ws_client.close()
self._sessions.clear()


@dataclass
class Go2RtcConfig:
"""Go2rtc configuration."""

url: str
session: ClientSession
1 change: 1 addition & 0 deletions homeassistant/components/go2rtc/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
DEBUG_UI_URL_MESSAGE = "Url and debug_ui cannot be set at the same time."
HA_MANAGED_API_PORT = 11984
HA_MANAGED_URL = f"http://localhost:{HA_MANAGED_API_PORT}/"
HA_MANAGED_UNIX_SOCKET = "/run/go2rtc.sock"
RECOMMENDED_VERSION = "1.9.12"
Loading
Loading