From f5d9f0e31b8376e68c56724baf2d285ed65a83c3 Mon Sep 17 00:00:00 2001 From: Marc Billow Date: Sun, 16 Aug 2026 04:26:29 +0000 Subject: [PATCH] Stop importing the deprecated CONCENTRATION_MICROGRAMS_PER_CUBIC_METER HA logs a removal warning (2027.8) every time this name is accessed on releases that carry UnitOfDensity, attributed straight to this integration since it's a plain module-level import. UnitOfDensity is the replacement, but hacs.json's floor (2025.1.0) predates it existing at all -- pytest-homeassistant-custom-component 0.13.316, the newest available, still has no UnitOfDensity either, so this can't be a static import on either branch without breaking support for part of the version range. Resolved with a runtime getattr instead: reads UnitOfDensity off the homeassistant.const module if present and uses its MICROGRAMS_PER_CUBIC_METER member, otherwise falls back to the plain (un-deprecated, on those older releases) constant. The getattr short-circuits before the deprecated name is ever touched on a release new enough to have UnitOfDensity, so the warning stops firing there without dropping support for anything still on the old one. Same feature-detection shape _relabel_particulate_statistics already uses a few lines down for new_unit_class. Verified the resolution logic directly: against the installed HA (2026.2.3, pre-UnitOfDensity) it resolves to the plain constant with no warning; a simulated future homeassistant.const with UnitOfDensity present resolves to it without ever touching the deprecated name (a guard that raises on that access never fires). Full suite (1573 tests), ruff, and `ty check custom_components tests` (CI's exact invocation) all pass. --- custom_components/localthings/__init__.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/custom_components/localthings/__init__.py b/custom_components/localthings/__init__.py index ed5417f..55ccaca 100644 --- a/custom_components/localthings/__init__.py +++ b/custom_components/localthings/__init__.py @@ -7,10 +7,8 @@ import logging import re from typing import Any +from homeassistant import const as ha_const from homeassistant.config_entries import ConfigEntry -from homeassistant.const import ( - CONCENTRATION_MICROGRAMS_PER_CUBIC_METER as PARTICULATE_UNIT, -) from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.core import Event, HomeAssistant, callback from homeassistant.exceptions import ConfigEntryNotReady @@ -25,6 +23,22 @@ from .services import async_setup_services _LOGGER = logging.getLogger(__name__) +# UnitOfDensity is the non-deprecated home for this value from whichever HA +# release introduces it; CONCENTRATION_MICROGRAMS_PER_CUBIC_METER logs a +# removal warning (2027.8) on those releases every time it's accessed. +# hacs.json's floor (2025.1.0) predates UnitOfDensity existing at all, so +# this is a runtime getattr rather than a static import ty could only ever +# resolve against one HA generation -- see _relabel_particulate_statistics' +# own new_unit_class feature-detection below for the same pattern. The +# getattr short-circuits before the deprecated name is ever touched on a +# release new enough to have UnitOfDensity. +_unit_of_density = getattr(ha_const, "UnitOfDensity", None) +PARTICULATE_UNIT = ( + _unit_of_density.MICROGRAMS_PER_CUBIC_METER + if _unit_of_density is not None + else ha_const.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER +) + async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: # Services are process-global, registered once here rather than per