Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
683c6b1
Add release url to Litter-Robot 4 update entity (#152504)
natekspencer Sep 30, 2025
aeadc0c
Add lock support to Switchbot Cloud (#148310)
XiaoLing-git Sep 30, 2025
dcb8d4f
Add support model [relay switch 2pm] for switchbot cloud (#148381)
XiaoLing-git Sep 30, 2025
2850a57
Add Reolink floodlight event entities (#152564)
starkillerOG Sep 30, 2025
d7269cf
Use pytest_unordered in additional service helper tests (#153255)
emontnemery Sep 30, 2025
7f63ba2
Improve saved state of RestoreSensor when using freezegun (#152740)
emontnemery Sep 30, 2025
b308a88
Add Roomba J9 compatibility to the roomba integration (#145913)
rokam Sep 30, 2025
9eaa40c
Require cloud for Aladdin Connect (#153278)
joostlek Sep 30, 2025
b93f4aa
Add tests for Sonos media metadata (#152622)
PeteRager Sep 30, 2025
dbc4a65
Fix Sonos Dialog Select type conversion part II (#152491)
PeteRager Sep 30, 2025
904d7e5
Add air/water filter state in percent to LG ThinQ (#152150)
LG-ThinQ-Integration Sep 30, 2025
2be33c5
Update quality scale of ntfy integration to platinum 🏆️ (#151785)
tr4nt0r Sep 30, 2025
fa4cb54
Fix sentence-casing in two title strings of `roomba` (#153281)
NoRi2909 Sep 30, 2025
f7ecad6
Bump aioecowitt to 2025.9.2 (#153273)
edenhaus Sep 30, 2025
39eadc8
Replace "Climate name" with "Climate program" in `ecobee` action (#15…
NoRi2909 Sep 30, 2025
4c1ae0e
Add Level brand (#153279)
joostlek Sep 30, 2025
c8d676e
Add Konnected brand (#153280)
joostlek Sep 30, 2025
291c441
Add Eltako brand (#153276)
joostlek Sep 30, 2025
1ca701d
Portainer fix CONF_VERIFY_SSL (#153269)
erwindouna Sep 30, 2025
6d940f4
Add support for Media player Mute/Unmute intents (#150508)
anishsane Sep 30, 2025
db3b070
Add meteo_lt integration (#152948)
xE1H Sep 30, 2025
4ac89f6
Add notify platform to Habitica (#150553)
tr4nt0r Sep 30, 2025
327f65c
Add switch domain to VegeHub integration (#148436)
Thulrus Sep 30, 2025
7d1a0be
Reduce Connect firmware install times by removing unnecessary firmwar…
puddly Sep 30, 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
2 changes: 2 additions & 0 deletions CODEOWNERS

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

5 changes: 5 additions & 0 deletions homeassistant/brands/eltako.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"domain": "eltako",
"name": "Eltako",
"iot_standards": ["matter"]
}
5 changes: 5 additions & 0 deletions homeassistant/brands/konnected.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"domain": "konnected",
"name": "Konnected",
"integrations": ["konnected", "konnected_esphome"]
}
5 changes: 5 additions & 0 deletions homeassistant/brands/level.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"domain": "level",
"name": "Level",
"iot_standards": ["matter"]
}
11 changes: 11 additions & 0 deletions homeassistant/components/aladdin_connect/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,17 @@ class OAuth2FlowHandler(
VERSION = CONFIG_FLOW_VERSION
MINOR_VERSION = CONFIG_FLOW_MINOR_VERSION

async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Check we have the cloud integration set up."""
if "cloud" not in self.hass.config.components:
return self.async_abort(
reason="cloud_not_enabled",
description_placeholders={"default_config": "default_config"},
)
return await super().async_step_user(user_input)

async def async_step_reauth(
self, user_input: Mapping[str, Any]
) -> ConfigFlowResult:
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/aladdin_connect/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
"no_url_available": "[%key:common::config_flow::abort::oauth2_no_url_available%]",
"user_rejected_authorize": "[%key:common::config_flow::abort::oauth2_user_rejected_authorize%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"wrong_account": "You are authenticated with a different account than the one set up. Please authenticate with the configured account."
"wrong_account": "You are authenticated with a different account than the one set up. Please authenticate with the configured account.",
"cloud_not_enabled": "Please make sure you run Home Assistant with `{default_config}` enabled in your configuration.yaml."
},
"create_entry": {
"default": "[%key:common::config_flow::create_entry::authenticated%]"
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/ecobee/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@
"description": "Sets the participating sensors for a climate program.",
"fields": {
"preset_mode": {
"name": "Climate Name",
"name": "Climate program",
"description": "Name of the climate program to set the sensors active on.\nDefaults to currently active program."
},
"device_ids": {
Expand All @@ -188,7 +188,7 @@
},
"exceptions": {
"invalid_preset": {
"message": "Invalid climate name, available options are: {options}"
"message": "Invalid climate program, available options are: {options}"
},
"invalid_sensor": {
"message": "Invalid sensor for thermostat, available options are: {options}"
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/ecowitt/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"dependencies": ["webhook"],
"documentation": "https://www.home-assistant.io/integrations/ecowitt",
"iot_class": "local_push",
"requirements": ["aioecowitt==2025.9.1"]
"requirements": ["aioecowitt==2025.9.2"]
}
18 changes: 17 additions & 1 deletion homeassistant/components/habitica/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@

from habiticalib import Habitica

from homeassistant.components.notify import DOMAIN as NOTIFY_DOMAIN
from homeassistant.const import CONF_API_KEY, CONF_URL, CONF_VERIFY_SSL, Platform
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import config_validation as cv, device_registry as dr
from homeassistant.helpers import (
config_validation as cv,
device_registry as dr,
entity_registry as er,
)
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.typing import ConfigType
from homeassistant.util.hass_dict import HassKey
Expand All @@ -27,6 +32,7 @@
Platform.BUTTON,
Platform.CALENDAR,
Platform.IMAGE,
Platform.NOTIFY,
Platform.SENSOR,
Platform.SWITCH,
Platform.TODO,
Expand All @@ -46,6 +52,7 @@ async def async_setup_entry(
"""Set up habitica from a config entry."""
party_added_by_this_entry: UUID | None = None
device_reg = dr.async_get(hass)
entity_registry = er.async_get(hass)

session = async_get_clientsession(
hass, verify_ssl=config_entry.data.get(CONF_VERIFY_SSL, True)
Expand Down Expand Up @@ -96,6 +103,15 @@ def _party_update_listener() -> None:
device.id, remove_config_entry_id=config_entry.entry_id
)

notify_entities = [
entry.entity_id
for entry in entity_registry.entities.values()
if entry.domain == NOTIFY_DOMAIN
and entry.config_entry_id == config_entry.entry_id
]
for entity_id in notify_entities:
entity_registry.async_remove(entity_id)

hass.config_entries.async_schedule_reload(config_entry.entry_id)

coordinator.async_add_listener(_party_update_listener)
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/habitica/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,4 @@ def __init__(
@property
def is_on(self) -> bool | None:
"""If the binary sensor is on."""
return self.coordinator.data.quest.active
return self.coordinator.data.party.quest.active
23 changes: 20 additions & 3 deletions homeassistant/components/habitica/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from io import BytesIO
import logging
from typing import Any
from uuid import UUID

from aiohttp import ClientError
from habiticalib import (
Expand Down Expand Up @@ -48,6 +49,14 @@ class HabiticaData:
tasks: list[TaskData]


@dataclass
class HabiticaPartyData:
"""Habitica party data."""

party: GroupData
members: dict[UUID, UserData]


type HabiticaConfigEntry = ConfigEntry[HabiticaDataUpdateCoordinator]


Expand Down Expand Up @@ -192,11 +201,19 @@ async def generate_avatar(self, avatar: Avatar) -> bytes:
return png.getvalue()


class HabiticaPartyCoordinator(HabiticaBaseCoordinator[GroupData]):
class HabiticaPartyCoordinator(HabiticaBaseCoordinator[HabiticaPartyData]):
"""Habitica Party Coordinator."""

_update_interval = timedelta(minutes=15)

async def _update_data(self) -> GroupData:
async def _update_data(self) -> HabiticaPartyData:
"""Fetch the latest party data."""
return (await self.habitica.get_group()).data

return HabiticaPartyData(
party=(await self.habitica.get_group()).data,
members={
member.id: member
for member in (await self.habitica.get_group_members()).data
if member.id
},
)
4 changes: 2 additions & 2 deletions homeassistant/components/habitica/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,14 @@ def __init__(
super().__init__(coordinator)
if TYPE_CHECKING:
assert config_entry.unique_id
unique_id = f"{config_entry.unique_id}_{coordinator.data.id!s}"
unique_id = f"{config_entry.unique_id}_{coordinator.data.party.id!s}"
self.entity_description = entity_description
self._attr_unique_id = f"{unique_id}_{entity_description.key}"
self._attr_device_info = DeviceInfo(
entry_type=DeviceEntryType.SERVICE,
manufacturer=MANUFACTURER,
model=NAME,
name=coordinator.data.summary,
name=coordinator.data.party.summary,
identifiers={(DOMAIN, unique_id)},
via_device=(DOMAIN, config_entry.unique_id),
)
Expand Down
5 changes: 5 additions & 0 deletions homeassistant/components/habitica/icons.json
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,11 @@
"quest_running": {
"default": "mdi:script-text-play"
}
},
"notify": {
"party_chat": {
"default": "mdi:forum"
}
}
},
"services": {
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/habitica/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ def image_url(self) -> str | None:
"""Return URL of image."""
return (
f"{ASSETS_URL}quest_{key}.png"
if (key := self.coordinator.data.quest.key)
if (key := self.coordinator.data.party.quest.key)
else None
)

Expand Down
Loading
Loading