Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
9394127
Add binary sensor platform for MELCloud ATW devices (#168128)
RaHehl Apr 14, 2026
073d22d
Fix Wyoming satellite memory leak on disconnect (#168152)
marcelveldt Apr 14, 2026
8695d32
iaqualink: enable _attr_has_entity_name (#167810)
flz Apr 14, 2026
d8c8f82
Translate coordinator exceptions for PVOutput (#168076)
frenck Apr 14, 2026
98b41d2
Add send_message_draft action to telegram_bot (#165682)
Shulyaka Apr 14, 2026
a4d4fe3
Add Renovate config for allow-listed Python dependency updates (#168192)
frenck Apr 14, 2026
ccd1d9f
Bump pyTibber to 0.37.1 (#168208)
Danielhiversen Apr 14, 2026
a952636
Refine Renovate config with built-in manager and review follow-ups (#…
frenck Apr 14, 2026
a45e2d7
Split hassio data coordinator and add dedicated stats coordinator (#1…
agners Apr 14, 2026
b18602c
Disable Renovate vulnerability alerts flow (#168233)
frenck Apr 14, 2026
599c548
Bump serialx to 1.2.2 (#168229)
balloob Apr 14, 2026
3848d4e
Update Pillow to 12.2.0 (#168234)
renovate[bot] Apr 14, 2026
d5441ff
Update freezegun to 1.5.5 (#168236)
renovate[bot] Apr 14, 2026
f599885
Update yamllint (#168242)
renovate[bot] Apr 14, 2026
da66632
Update syrupy to 5.1.0 (#168241)
renovate[bot] Apr 14, 2026
a5d640a
Add diagnostics to Duco integration (#168231)
ronaldvdmeer Apr 14, 2026
4474ad0
Add native DHW service to Evohome (#167359)
zxdavb Apr 14, 2026
513fff1
Improve setup exception handling in ruckus_unleashed (#168014)
lanrat Apr 14, 2026
a21a0a6
Refactor Lutron setup logic (#167993)
cdheiser Apr 14, 2026
99dc368
Add feeder meal plan actions to tuya (#161488)
FredrikM97 Apr 14, 2026
b231742
Add test for LoginError reauth in FreshrReadingsCoordinator (#168022)
SierraNL Apr 14, 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
161 changes: 161 additions & 0 deletions .github/renovate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended"],

"enabledManagers": [
"pep621",
"pip_requirements",
"pre-commit",
"homeassistant-manifest"
],

"pre-commit": {
"enabled": true
},

"pip_requirements": {
"managerFilePatterns": [
"/(^|/)requirements[\\w_-]*\\.txt$/",
"/(^|/)homeassistant/package_constraints\\.txt$/"
]
},

"homeassistant-manifest": {
"managerFilePatterns": [
"/^homeassistant/components/[^/]+/manifest\\.json$/"
]
},

"minimumReleaseAge": "7 days",
"prConcurrentLimit": 10,
"prHourlyLimit": 2,
"schedule": ["before 6am"],

"semanticCommits": "disabled",
"commitMessageAction": "Update",
"commitMessageTopic": "{{depName}}",
"commitMessageExtra": "to {{newVersion}}",

"automerge": false,

"vulnerabilityAlerts": {
"enabled": false
},

"packageRules": [
{
"description": "Deny all by default — allowlist below re-enables specific packages",
"matchPackageNames": ["*"],
"enabled": false
},
{
"description": "Core runtime dependencies (allowlisted)",
"matchPackageNames": [
"aiohttp",
"aiohttp-fast-zlib",
"aiohttp_cors",
"aiohttp-asyncmdnsresolver",
"yarl",
"httpx",
"requests",
"urllib3",
"certifi",
"orjson",
"PyYAML",
"Jinja2",
"cryptography",
"pyOpenSSL",
"PyJWT",
"SQLAlchemy",
"Pillow",
"attrs",
"uv",
"voluptuous",
"voluptuous-serialize",
"voluptuous-openapi",
"zeroconf"
],
"enabled": true,
"labels": ["dependency", "core"]
},
{
"description": "Test dependencies (allowlisted)",
"matchPackageNames": [
"pytest",
"pytest-asyncio",
"pytest-aiohttp",
"pytest-cov",
"pytest-freezer",
"pytest-github-actions-annotate-failures",
"pytest-socket",
"pytest-sugar",
"pytest-timeout",
"pytest-unordered",
"pytest-picked",
"pytest-xdist",
"pylint",
"pylint-per-file-ignores",
"astroid",
"coverage",
"freezegun",
"syrupy",
"respx",
"requests-mock",
"ruff",
"codespell",
"yamllint",
"zizmor"
],
"enabled": true,
"labels": ["dependency"]
},
{
"description": "For types-* stubs, only allow patch updates. Major/minor bumps track the upstream runtime package version and must be manually coordinated with the corresponding pin.",
"matchPackageNames": ["/^types-/"],
"matchUpdateTypes": ["patch"],
"enabled": true,
"labels": ["dependency"]
},
{
"description": "Pre-commit hook repos (allowlisted, matched by owner/repo)",
"matchPackageNames": [
"astral-sh/ruff-pre-commit",
"codespell-project/codespell",
"adrienverge/yamllint",
"zizmorcore/zizmor-pre-commit"
],
"enabled": true,
"labels": ["dependency"]
},
{
"description": "Group ruff pre-commit hook with its PyPI twin into one PR",
"matchPackageNames": ["astral-sh/ruff-pre-commit", "ruff"],
"groupName": "ruff",
"groupSlug": "ruff"
},
{
"description": "Group codespell pre-commit hook with its PyPI twin into one PR",
"matchPackageNames": ["codespell-project/codespell", "codespell"],
"groupName": "codespell",
"groupSlug": "codespell"
},
{
"description": "Group yamllint pre-commit hook with its PyPI twin into one PR",
"matchPackageNames": ["adrienverge/yamllint", "yamllint"],
"groupName": "yamllint",
"groupSlug": "yamllint"
},
{
"description": "Group zizmor pre-commit hook with its PyPI twin into one PR",
"matchPackageNames": ["zizmorcore/zizmor-pre-commit", "zizmor"],
"groupName": "zizmor",
"groupSlug": "zizmor"
},
{
"description": "Group pylint with astroid (their versions are linked and must move together)",
"matchPackageNames": ["pylint", "astroid"],
"groupName": "pylint",
"groupSlug": "pylint"
}
]
}
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ repos:
- --branch=master
- --branch=rc
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.37.1
rev: v1.38.0
hooks:
- id: yamllint
- repo: https://github.com/rbubley/mirrors-prettier
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/doods/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"iot_class": "local_polling",
"loggers": ["pydoods"],
"quality_scale": "legacy",
"requirements": ["pydoods==1.0.2", "Pillow==12.1.1"]
"requirements": ["pydoods==1.0.2", "Pillow==12.2.0"]
}
53 changes: 53 additions & 0 deletions homeassistant/components/duco/diagnostics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
"""Diagnostics support for Duco."""

from __future__ import annotations

import asyncio
from dataclasses import asdict
from typing import Any

from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant

from .coordinator import DucoConfigEntry

TO_REDACT = {
CONF_HOST,
"mac",
"host_name",
"serial_board_box",
"serial_board_comm",
"serial_duco_box",
"serial_duco_comm",
}


async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: DucoConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
coordinator = entry.runtime_data

board = asdict(coordinator.board_info)
board.pop("time")

lan_info, duco_diags, write_remaining = await asyncio.gather(
coordinator.client.async_get_lan_info(),
coordinator.client.async_get_diagnostics(),
coordinator.client.async_get_write_req_remaining(),
)

return async_redact_data(
{
"entry_data": entry.data,
"board_info": board,
"lan_info": asdict(lan_info),
"nodes": {
str(node_id): asdict(node) for node_id, node in coordinator.data.items()
},
"duco_diagnostics": [asdict(d) for d in duco_diags],
"write_requests_remaining": write_remaining,
},
TO_REDACT,
)
4 changes: 2 additions & 2 deletions homeassistant/components/duco/quality_scale.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ rules:

# Gold
devices: done
diagnostics: todo
diagnostics: done
discovery-update-info:
status: todo
comment: >-
Expand Down Expand Up @@ -74,7 +74,7 @@ rules:
entity-device-class: done
entity-disabled-by-default: done
entity-translations: done
exception-translations: todo
exception-translations: done
icon-translations: done
reconfiguration-flow: todo
repair-issues: todo
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/evohome/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,8 @@
SCAN_INTERVAL_DEFAULT: Final = timedelta(seconds=300)
SCAN_INTERVAL_MINIMUM: Final = timedelta(seconds=60)

ATTR_PERIOD: Final = "period" # number of days
ATTR_DURATION: Final = "duration" # number of minutes, <24h

ATTR_PERIOD: Final = "period" # number of days
ATTR_SETPOINT: Final = "setpoint"


Expand All @@ -37,3 +36,4 @@ class EvoService(StrEnum):
RESET_SYSTEM = "reset_system"
SET_ZONE_OVERRIDE = "set_zone_override"
CLEAR_ZONE_OVERRIDE = "clear_zone_override"
SET_DHW_OVERRIDE = "set_dhw_override"
3 changes: 3 additions & 0 deletions homeassistant/components/evohome/icons.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
"reset_system": {
"service": "mdi:refresh"
},
"set_dhw_override": {
"service": "mdi:water-heater"
},
"set_system_mode": {
"service": "mdi:pencil"
},
Expand Down
26 changes: 25 additions & 1 deletion homeassistant/components/evohome/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
import voluptuous as vol

from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN
from homeassistant.const import ATTR_MODE
from homeassistant.components.water_heater import DOMAIN as WATER_HEATER_DOMAIN
from homeassistant.const import ATTR_MODE, ATTR_STATE
from homeassistant.core import HomeAssistant, ServiceCall, callback
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers import config_validation as cv, service
Expand Down Expand Up @@ -49,6 +50,15 @@
),
}

# DHW service schemas (registered as entity services)
SET_DHW_OVERRIDE_SCHEMA: Final[dict[str | vol.Marker, Any]] = {
vol.Required(ATTR_STATE): cv.boolean,
vol.Optional(ATTR_DURATION): vol.All(
cv.time_period,
vol.Range(min=timedelta(days=0), max=timedelta(days=1)),
),
}


def _register_zone_entity_services(hass: HomeAssistant) -> None:
"""Register entity-level services for zones."""
Expand All @@ -71,6 +81,19 @@ def _register_zone_entity_services(hass: HomeAssistant) -> None:
)


def _register_dhw_entity_services(hass: HomeAssistant) -> None:
"""Register entity-level services for DHW zones."""

service.async_register_platform_entity_service(
hass,
DOMAIN,
EvoService.SET_DHW_OVERRIDE,
entity_domain=WATER_HEATER_DOMAIN,
schema=SET_DHW_OVERRIDE_SCHEMA,
func="async_set_dhw_override",
)


def _validate_set_system_mode_params(tcs: ControlSystem, data: dict[str, Any]) -> None:
"""Validate that a set_system_mode service call is properly formed."""

Expand Down Expand Up @@ -156,3 +179,4 @@ async def set_system_mode(call: ServiceCall) -> None:
)

_register_zone_entity_services(hass)
_register_dhw_entity_services(hass)
16 changes: 16 additions & 0 deletions homeassistant/components/evohome/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,19 @@ clear_zone_override:
domain: climate
supported_features:
- climate.ClimateEntityFeature.TARGET_TEMPERATURE

set_dhw_override:
target:
entity:
integration: evohome
domain: water_heater
fields:
state:
required: true
selector:
boolean:
duration:
example: "02:15"
selector:
duration:
enable_second: false
22 changes: 18 additions & 4 deletions homeassistant/components/evohome/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,33 @@
},
"services": {
"clear_zone_override": {
"description": "Sets a zone to follow its schedule.",
"description": "Sets the zone to follow its schedule.",
"name": "Clear zone override"
},
"refresh_system": {
"description": "Pulls the latest data from the vendor's servers now, rather than waiting for the next scheduled update.",
"name": "Refresh system"
},
"reset_system": {
"description": "Sets the system to `Auto` mode and resets all the zones to follow their schedules. Not all Evohome systems support this feature (i.e. `AutoWithReset` mode).",
"description": "Sets the system mode to `Auto` mode and resets all the zones to follow their schedules. Not all Evohome systems support this feature (i.e. `AutoWithReset` mode).",
"name": "Reset system"
},
"set_dhw_override": {
"description": "Overrides the DHW state, either indefinitely or for a specified duration, after which it will revert to following its schedule.",
"fields": {
"duration": {
"description": "The DHW will revert to its schedule after this time. If 0 the change is until the next scheduled setpoint.",
"name": "Duration"
},
"state": {
"description": "The DHW state: True (on: heat the water up to the setpoint) or False (off).",
"name": "State"
}
},
"name": "Set DHW override"
},
"set_system_mode": {
"description": "Sets the system mode, either indefinitely, or for a specified period of time, after which it will revert to `Auto`. Not all systems support all modes.",
"description": "Sets the system mode, either indefinitely or until a specified end time, after which it will revert to `Auto`. Not all systems support all modes.",
"fields": {
"duration": {
"description": "The duration in hours; used only with `AutoWithEco` mode (up to 24 hours).",
Expand All @@ -51,7 +65,7 @@
"name": "Set system mode"
},
"set_zone_override": {
"description": "Overrides the zone's setpoint, either indefinitely, or for a specified period of time, after which it will revert to following its schedule.",
"description": "Overrides the zone setpoint, either indefinitely or for a specified duration, after which it will revert to following its schedule.",
"fields": {
"duration": {
"description": "The zone will revert to its schedule after this time. If 0 the change is until the next scheduled setpoint.",
Expand Down
Loading
Loading