Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
307c6a4
Netatmo doortag binary sensor addition (#160608)
farkasdi Feb 17, 2026
219b982
Improve type hints in aemet weather (#163239)
epenet Feb 17, 2026
8e14dc7
Cleanup for 100% coverage of entity for Fritz (#163237)
chemelli74 Feb 17, 2026
6c0fb12
Improve type hints in ecobee weather (#163240)
epenet Feb 17, 2026
f0e7d09
Improve type hints in environment_canada weather (#163241)
epenet Feb 17, 2026
6c50711
Improve type hints in ipma weather (#163242)
epenet Feb 17, 2026
7f65db2
Improve type hints in meteo_france weather (#163243)
epenet Feb 17, 2026
6322185
Bump onedrive-personal-sdk to 0.1.4 (#163238)
zweckj Feb 17, 2026
487e2f8
Improve type hints in tomorrowio weather (#163246)
epenet Feb 17, 2026
68c82c2
Debug logging for service calls (#163235)
zweckj Feb 17, 2026
f1c142b
Refactor BSB-Lan tests (#163245)
liudger Feb 17, 2026
34a78f9
Rename DOMAIN aliases (#163253)
epenet Feb 17, 2026
82148e4
Rename DOMAIN aliases in tests (#163254)
epenet Feb 17, 2026
c114ea2
Fix warning in Fritz switch tests (#163256)
chemelli74 Feb 17, 2026
ba695b5
Add quality scale to Splunk (#162893)
Bre77 Feb 17, 2026
0337988
Improve type hints in meteoclimatic weather (#163244)
epenet Feb 17, 2026
fdad987
Mark weather method type hints as mandatory (#163247)
epenet Feb 17, 2026
58e4a42
Add coordinator for Satel Integra (#158533)
Tommatheussen Feb 17, 2026
d12816d
Removed more warnings from Fritz tests (#163262)
chemelli74 Feb 17, 2026
98b8e15
Use shorthand attributes in currencylayer (#163267)
epenet Feb 17, 2026
637accb
Rename DOMAIN_xxx aliases in template (#163259)
epenet Feb 17, 2026
163a680
Rename DOMAIN_xxx aliases in components (#163260)
epenet Feb 17, 2026
b6e7a55
Rename DOMAIN_xxx aliases in tests (#163261)
epenet Feb 17, 2026
d61f7d8
Use shorthand attributes in geo_rss_events (#163268)
epenet Feb 17, 2026
59dad4c
Add DHCP Discovery for SmartThings (#160314)
joostlek Feb 17, 2026
c205785
Add quality scale to Anthropic (#162953)
Shulyaka Feb 17, 2026
ff2f0ac
Mark RestoreEntity/RestoreSensor type hints as mandatory (#163272)
epenet Feb 17, 2026
91c36fc
Fix dynamic entity creation in eheimdigital (#161155)
autinerd Feb 17, 2026
b23c402
Improve haveibeenpwned type hints (#163280)
epenet Feb 17, 2026
f6f5200
Add Indevolt integration (#160595)
Xirt Feb 17, 2026
049a910
Fix frontend development PR download cache (#162928)
wendevlin Feb 17, 2026
1d41e24
Add type hints to extra_state_attributes [a-l] (#163279)
epenet Feb 17, 2026
e7aa0ae
Add type hints to extra_state_attributes [m-z] (#163281)
epenet Feb 17, 2026
bd45232
Translation keys for exceptions Watts Vision + integration (#163231)
theobld-ww Feb 17, 2026
b449005
Ensure DOMAIN constant is always aliased with _DOMAIN suffix (#163270)
epenet Feb 17, 2026
523b527
Use shorthand attributes in omnilogic (#163283)
epenet Feb 17, 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
2 changes: 2 additions & 0 deletions CODEOWNERS

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

4 changes: 2 additions & 2 deletions homeassistant/components/accuweather/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from accuweather import AccuWeather

from homeassistant.components.sensor import DOMAIN as SENSOR_PLATFORM
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.const import CONF_API_KEY, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
Expand Down Expand Up @@ -72,7 +72,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: AccuWeatherConfigEntry)
ent_reg = er.async_get(hass)
for day in range(5):
unique_id = f"{location_key}-ozone-{day}"
if entity_id := ent_reg.async_get_entity_id(SENSOR_PLATFORM, DOMAIN, unique_id):
if entity_id := ent_reg.async_get_entity_id(SENSOR_DOMAIN, DOMAIN, unique_id):
_LOGGER.debug("Removing ozone sensor entity %s", entity_id)
ent_reg.async_remove(entity_id)

Expand Down
14 changes: 7 additions & 7 deletions homeassistant/components/aemet/weather.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def __init__(
self._attr_unique_id = unique_id

@property
def condition(self):
def condition(self) -> str | None:
"""Return the current condition."""
cond = self.get_aemet_value([AOD_WEATHER, AOD_CONDITION])
return CONDITIONS_MAP.get(cond)
Expand All @@ -90,31 +90,31 @@ def _async_forecast_hourly(self) -> list[Forecast]:
return self.get_aemet_forecast(AOD_FORECAST_HOURLY)

@property
def humidity(self):
def humidity(self) -> float | None:
"""Return the humidity."""
return self.get_aemet_value([AOD_WEATHER, AOD_HUMIDITY])

@property
def native_pressure(self):
def native_pressure(self) -> float | None:
"""Return the pressure."""
return self.get_aemet_value([AOD_WEATHER, AOD_PRESSURE])

@property
def native_temperature(self):
def native_temperature(self) -> float | None:
"""Return the temperature."""
return self.get_aemet_value([AOD_WEATHER, AOD_TEMP])

@property
def wind_bearing(self):
def wind_bearing(self) -> float | None:
"""Return the wind bearing."""
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_DIRECTION])

@property
def native_wind_gust_speed(self):
def native_wind_gust_speed(self) -> float | None:
"""Return the wind gust speed in native units."""
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_SPEED_MAX])

@property
def native_wind_speed(self):
def native_wind_speed(self) -> float | None:
"""Return the wind speed."""
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_SPEED])
6 changes: 2 additions & 4 deletions homeassistant/components/airly/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from datetime import timedelta
import logging

from homeassistant.components.air_quality import DOMAIN as AIR_QUALITY_PLATFORM
from homeassistant.components.air_quality import DOMAIN as AIR_QUALITY_DOMAIN
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er
Expand Down Expand Up @@ -75,9 +75,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: AirlyConfigEntry) -> boo
# Remove air_quality entities from registry if they exist
ent_reg = er.async_get(hass)
unique_id = f"{coordinator.latitude}-{coordinator.longitude}"
if entity_id := ent_reg.async_get_entity_id(
AIR_QUALITY_PLATFORM, DOMAIN, unique_id
):
if entity_id := ent_reg.async_get_entity_id(AIR_QUALITY_DOMAIN, DOMAIN, unique_id):
_LOGGER.debug("Removing deprecated air_quality entity %s", entity_id)
ent_reg.async_remove(entity_id)

Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/alert/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
ATTR_DATA,
ATTR_MESSAGE,
ATTR_TITLE,
DOMAIN as DOMAIN_NOTIFY,
DOMAIN as NOTIFY_DOMAIN,
)
from homeassistant.const import STATE_IDLE, STATE_OFF, STATE_ON
from homeassistant.core import Event, EventStateChangedData, HassJob, HomeAssistant
Expand Down Expand Up @@ -185,7 +185,7 @@ async def _send_notification_message(self, message: Any) -> None:
for target in self._notifiers:
try:
await self.hass.services.async_call(
DOMAIN_NOTIFY, target, msg_payload, context=self._context
NOTIFY_DOMAIN, target, msg_payload, context=self._context
)
except ServiceNotFound:
LOGGER.error(
Expand Down
119 changes: 119 additions & 0 deletions homeassistant/components/anthropic/quality_scale.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
rules:
# Bronze
action-setup:
status: exempt
comment: |
Integration has no actions.
appropriate-polling:
status: exempt
comment: |
Integration does not poll.
brands: done
common-modules: done
config-flow-test-coverage:
status: todo
comment: |
* Remove integration setup from the config flow init test
* Make `mock_setup_entry` a separate fixture
* Use the mock_config_entry fixture in `test_duplicate_entry`
* `test_duplicate_entry`: Patch `homeassistant.components.anthropic.config_flow.anthropic.resources.models.AsyncModels.list`
* Fix docstring and name for `test_form_invalid_auth` (does not only test auth)
* In `test_form_invalid_auth`, make sure the test run until CREATE_ENTRY to test that the flow is able to recover
config-flow: done
dependency-transparency: done
docs-actions:
status: exempt
comment: |
Integration has no actions.
docs-high-level-description: done
docs-installation-instructions: done
docs-removal-instructions: done
entity-event-setup:
status: exempt
comment: |
Integration does not subscribe to events.
entity-unique-id: done
has-entity-name: done
runtime-data:
status: todo
comment: |
To redesign deferred reloading.
test-before-configure: done
test-before-setup: done
unique-config-entry: done
# Silver
action-exceptions:
status: todo
comment: |
Reevaluate exceptions for entity services.
config-entry-unloading: done
docs-configuration-parameters: done
docs-installation-parameters: done
entity-unavailable: todo
integration-owner: done
log-when-unavailable: todo
parallel-updates:
status: exempt
comment: |
The API does not limit parallel updates.
reauthentication-flow: done
test-coverage: done
# Gold
devices: done
diagnostics: todo
discovery-update-info:
status: exempt
comment: |
Service integration, no discovery.
discovery:
status: exempt
comment: |
Service integration, no discovery.
docs-data-update:
status: exempt
comment: |
No data updates.
docs-examples:
status: todo
comment: |
To give examples of how people use the integration
docs-known-limitations: done
docs-supported-devices:
status: todo
comment: |
To write something about what models we support.
docs-supported-functions: done
docs-troubleshooting: todo
docs-use-cases: done
dynamic-devices:
status: exempt
comment: |
Service integration, no devices.
entity-category:
status: exempt
comment: |
No entities with categories.
entity-device-class:
status: exempt
comment: |
No entities with device classes.
entity-disabled-by-default:
status: exempt
comment: |
No entities disabled by default.
entity-translations: todo
exception-translations: todo
icon-translations: todo
reconfiguration-flow: done
repair-issues: done
stale-devices:
status: exempt
comment: |
Service integration, no devices.
# Platinum
async-dependency: done
inject-websession:
status: done
comment: |
Uses `httpx` session.
strict-typing: done
4 changes: 2 additions & 2 deletions homeassistant/components/brother/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from brother import BrotherSensors

from homeassistant.components.sensor import (
DOMAIN as PLATFORM,
DOMAIN as SENSOR_DOMAIN,
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
Expand Down Expand Up @@ -314,7 +314,7 @@ async def async_setup_entry(
entity_registry = er.async_get(hass)
old_unique_id = f"{coordinator.brother.serial.lower()}_b/w_counter"
if entity_id := entity_registry.async_get_entity_id(
PLATFORM, DOMAIN, old_unique_id
SENSOR_DOMAIN, DOMAIN, old_unique_id
):
new_unique_id = f"{coordinator.brother.serial.lower()}_bw_counter"
_LOGGER.debug(
Expand Down
6 changes: 3 additions & 3 deletions homeassistant/components/camera/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from homeassistant.components.media_player import (
ATTR_MEDIA_CONTENT_ID,
ATTR_MEDIA_CONTENT_TYPE,
DOMAIN as DOMAIN_MP,
DOMAIN as MP_DOMAIN,
SERVICE_PLAY_MEDIA,
)
from homeassistant.components.stream import (
Expand Down Expand Up @@ -133,7 +133,7 @@ class CameraEntityFeature(IntFlag):
CAMERA_SERVICE_SNAPSHOT: VolDictType = {vol.Required(ATTR_FILENAME): cv.template}

CAMERA_SERVICE_PLAY_STREAM: VolDictType = {
vol.Required(ATTR_MEDIA_PLAYER): cv.entities_domain(DOMAIN_MP),
vol.Required(ATTR_MEDIA_PLAYER): cv.entities_domain(MP_DOMAIN),
vol.Optional(ATTR_FORMAT, default="hls"): vol.In(OUTPUT_FORMATS),
}

Expand Down Expand Up @@ -1044,7 +1044,7 @@ async def async_handle_play_stream_service(
url = f"{get_url(hass)}{url}"

await hass.services.async_call(
DOMAIN_MP,
MP_DOMAIN,
SERVICE_PLAY_MEDIA,
{
ATTR_ENTITY_ID: service_call.data[ATTR_MEDIA_PLAYER],
Expand Down
25 changes: 5 additions & 20 deletions homeassistant/components/currencylayer/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,33 +65,18 @@ class CurrencylayerSensor(SensorEntity):
_attr_attribution = "Data provided by currencylayer.com"
_attr_icon = "mdi:currency"

def __init__(self, rest, base, quote):
def __init__(self, rest: CurrencylayerData, base: str, quote: str) -> None:
"""Initialize the sensor."""
self.rest = rest
self._quote = quote
self._base = base
self._state = None

@property
def native_unit_of_measurement(self):
"""Return the unit of measurement of this entity, if any."""
return self._quote

@property
def name(self):
"""Return the name of the sensor."""
return self._base

@property
def native_value(self):
"""Return the state of the sensor."""
return self._state
self._attr_name = base
self._attr_native_unit_of_measurement = quote
self._key = f"{base}{quote}"

def update(self) -> None:
"""Update current date."""
self.rest.update()
if (value := self.rest.data) is not None:
self._state = round(value[f"{self._base}{self._quote}"], 4)
self._attr_native_value = round(value[self._key], 4)


class CurrencylayerData:
Expand Down
Loading
Loading