Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
9b3b3ec
Prioritize native Tuya unit of measurement (#170338)
epenet May 18, 2026
01d9c2e
Add siren platform support to Matter integration (#170031)
lboue May 18, 2026
de29414
Update uv to 0.11.14 (#171099)
renovate[bot] May 18, 2026
f08adfe
Use HA timezone for date in cookidoo (#171109)
frenck May 18, 2026
8c9d659
Use HA timezone for date in recollect_waste (#171106)
frenck May 18, 2026
8d8b9bb
data grand lyon: split coordinators (#170662)
Crocmagnon May 18, 2026
6f3dfab
Voip runtime data (#170765)
jaminh May 18, 2026
d268f8b
Restore Avea brightness on turn on (#171120)
pattyland May 18, 2026
251d7e1
Update requests to 2.34.2 (#171119)
renovate[bot] May 18, 2026
c468ae7
Enable agentic library workflow on forks and users without write righ…
edenhaus May 18, 2026
f66652c
Provide request retry option to overcome intermittant enphase_envoy f…
catsmanac May 18, 2026
1ad8169
Add chat log and response rendering to Wyoming conversation (#170433)
synesthesiam May 18, 2026
e8f3d35
Add group support to WLED main light (#169669)
mik-laj May 18, 2026
18f8e11
Split Tractive entities into tracker-related and pet-related (#170256)
bieniu May 18, 2026
c4d25a5
ElkM1 integration: Deprecate Elk Setting sensors; replaced by time/nu…
gwww May 18, 2026
5cf1e18
Update ruff (#171118)
renovate[bot] May 18, 2026
852faa7
Fix docstring of cv.string (#171128)
emontnemery May 18, 2026
cafcbf8
Improve bluetooth test fixture (#171061)
emontnemery May 18, 2026
7608d5f
Fix WeatherFlow websocket crash when data payload is None (#171037)
frenck May 18, 2026
ad71e31
prusalink: add sd_ready, farm_mode, and status_connect binary sensors…
heikkih May 18, 2026
1076d65
Update syrupy to 5.2.0 (#171100)
renovate[bot] May 18, 2026
34254c1
Fix handling of tracked devices on cleanup in FRITZ!Box Tools (#170574)
mib1185 May 18, 2026
01dde25
Bump aioimmich to 0.14.1 (#171138)
mib1185 May 18, 2026
f9654e1
Support stepper output in Qbus integration (#170772)
thomasddn May 18, 2026
f2691e4
Change model to model ID in the Tractive DeviceInfo (#171147)
bieniu May 18, 2026
612dbf2
Add SwitchBot Permanent Outdoor Light support (#170463)
Onero-testdev May 18, 2026
f5d2aa9
Use runtime_data and validate connection at setup for dnsip (#169745)
Phil-Rad May 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
60 changes: 15 additions & 45 deletions .github/workflows/check-requirements.lock.yml

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

2 changes: 2 additions & 0 deletions .github/workflows/check-requirements.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ on:
- "requirements*.txt"
- "homeassistant/package_constraints.txt"
- "pyproject.toml"
forks: ["*"]
workflow_dispatch:
inputs:
pull_request_number:
description: "Pull request number to (re-)check"
required: true
type: number
roles: all
permissions:
contents: read
pull-requests: read
Expand Down
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.12
rev: v0.15.13
hooks:
- id: ruff-check
args:
Expand Down
26 changes: 22 additions & 4 deletions homeassistant/components/avea/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
_LOGGER = logging.getLogger(__name__)
UPDATE_EXCEPTIONS = (BleakError, OSError, RuntimeError)
BREAKS_IN_HA_VERSION = "2026.12.0"
AVEA_MAX_BRIGHTNESS = 4095


def _normalize_name(name: str | None) -> str | None:
Expand All @@ -41,6 +42,16 @@ def _normalize_name(name: str | None) -> str | None:
return name


def _ha_brightness_to_avea(brightness: int) -> int:
"""Convert Home Assistant brightness to Avea brightness."""
return round((brightness / 255) * AVEA_MAX_BRIGHTNESS)


def _avea_brightness_to_ha(brightness: int) -> int:
"""Convert Avea brightness to Home Assistant brightness."""
return round(255 * (brightness / AVEA_MAX_BRIGHTNESS))


def _create_deprecated_yaml_issue(hass: HomeAssistant) -> None:
"""Create the deprecated YAML issue for Avea."""
ir.async_create_issue(
Expand Down Expand Up @@ -176,21 +187,26 @@ def __init__(self, light: avea.Bulb, entry_title: str) -> None:
self._light = light
self._attr_name = entry_title
self._attr_brightness = light.brightness
self._last_brightness = 255

def turn_on(self, **kwargs: Any) -> None:
"""Instruct the light to turn on."""
if not kwargs:
self._light.set_brightness(4095)
self._light.set_brightness(_ha_brightness_to_avea(self._last_brightness))
else:
if ATTR_BRIGHTNESS in kwargs:
bright = round((kwargs[ATTR_BRIGHTNESS] / 255) * 4095)
self._light.set_brightness(bright)
brightness = kwargs[ATTR_BRIGHTNESS]
if brightness:
self._last_brightness = brightness
self._light.set_brightness(_ha_brightness_to_avea(brightness))
if ATTR_HS_COLOR in kwargs:
rgb = color_util.color_hs_to_RGB(*kwargs[ATTR_HS_COLOR])
self._light.set_rgb(rgb[0], rgb[1], rgb[2])

def turn_off(self, **kwargs: Any) -> None:
"""Instruct the light to turn off."""
if self._attr_brightness:
self._last_brightness = self._attr_brightness
self._light.set_brightness(0)

def update(self) -> None:
Expand All @@ -206,5 +222,7 @@ def update(self) -> None:

if brightness is not None:
self._attr_is_on = brightness != 0
self._attr_brightness = round(255 * (brightness / 4095))
self._attr_brightness = _avea_brightness_to_ha(brightness)
if self._attr_brightness:
self._last_brightness = self._attr_brightness
self._attr_hs_color = color_util.color_RGB_to_hs(*rgb_color)
3 changes: 2 additions & 1 deletion homeassistant/components/cookidoo/calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.util import dt as dt_util

from .const import DOMAIN
from .coordinator import CookidooConfigEntry, CookidooDataUpdateCoordinator
Expand Down Expand Up @@ -58,7 +59,7 @@ def event(self) -> CalendarEvent | None:
if not self.coordinator.data.week_plan:
return None

today = date.today() # noqa: DTZ011
today = dt_util.now().date()
for day_data in self.coordinator.data.week_plan:
day_date = date.fromisoformat(day_data.id)
if day_date >= today and day_data.recipes:
Expand Down
7 changes: 5 additions & 2 deletions homeassistant/components/cookidoo/coordinator.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""DataUpdateCoordinator for the Cookidoo integration."""

from dataclasses import dataclass
from datetime import date, timedelta
from datetime import timedelta
import logging

from cookidoo_api import (
Expand All @@ -21,6 +21,7 @@
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from homeassistant.util import dt as dt_util

from .const import DOMAIN

Expand Down Expand Up @@ -81,7 +82,9 @@ async def _async_update_data(self) -> CookidooData:
ingredient_items = await self.cookidoo.get_ingredient_items()
additional_items = await self.cookidoo.get_additional_items()
subscription = await self.cookidoo.get_active_subscription()
week_plan = await self.cookidoo.get_recipes_in_calendar_week(date.today()) # noqa: DTZ011
week_plan = await self.cookidoo.get_recipes_in_calendar_week(
dt_util.now().date()
)
except CookidooAuthException:
try:
await self.cookidoo.refresh_token()
Expand Down
22 changes: 18 additions & 4 deletions homeassistant/components/data_grand_lyon/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
"""The Data Grand Lyon integration."""

import asyncio

from data_grand_lyon_ha import DataGrandLyonClient

from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator

from .coordinator import DataGrandLyonConfigEntry, DataGrandLyonCoordinator
from .coordinator import (
DataGrandLyonConfigEntry,
DataGrandLyonData,
DataGrandLyonTclCoordinator,
DataGrandLyonVelovCoordinator,
)

PLATFORMS: list[Platform] = [Platform.BINARY_SENSOR, Platform.SENSOR]

Expand All @@ -22,10 +30,16 @@ async def async_setup_entry(
password=entry.data[CONF_PASSWORD],
)

coordinator = DataGrandLyonCoordinator(hass, entry, client)
await coordinator.async_config_entry_first_refresh()
tcl_coordinator = DataGrandLyonTclCoordinator(hass, entry, client)
velov_coordinator = DataGrandLyonVelovCoordinator(hass, entry, client)

coordinators: list[DataUpdateCoordinator] = [tcl_coordinator, velov_coordinator]
await asyncio.gather(*(c.async_config_entry_first_refresh() for c in coordinators))

entry.runtime_data = coordinator
entry.runtime_data = DataGrandLyonData(
tcl_coordinator=tcl_coordinator,
velov_coordinator=velov_coordinator,
)

entry.async_on_unload(entry.add_update_listener(async_update_entry))

Expand Down
7 changes: 3 additions & 4 deletions homeassistant/components/data_grand_lyon/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ async def async_setup_entry(
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up Data Grand Lyon binary sensor entities."""
coordinator = entry.runtime_data
velov_coordinator = entry.runtime_data.velov_coordinator

for subentry in entry.get_subentries_of_type(SUBENTRY_TYPE_VELOV_STATION):
async_add_entities(
(
DataGrandLyonVelovBinarySensor(coordinator, subentry, description)
DataGrandLyonVelovBinarySensor(velov_coordinator, subentry, description)
for description in VELOV_BINARY_SENSOR_DESCRIPTIONS
),
config_subentry_id=subentry.subentry_id,
Expand All @@ -50,6 +50,5 @@ class DataGrandLyonVelovBinarySensor(DataGrandLyonVelovEntity, BinarySensorEntit
def is_on(self) -> bool:
"""Return true if the station is open."""
return (
self.coordinator.data.velov_stations[self._subentry_id].status
== VelovStationStatus.OPEN
self.coordinator.data[self._subentry_id].status == VelovStationStatus.OPEN
)
Loading
Loading