From b173bb9ca624d77aef01b51ffc9e7d0431611ff1 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 5 Oct 2026 12:48:21 +0200 Subject: [PATCH] Move utility_meter calibrate registration to services module (#184306) Co-authored-by: Claude Opus 5 --- .../components/utility_meter/sensor.py | 32 +------------------ .../components/utility_meter/services.py | 31 ++++++++++++++++-- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/homeassistant/components/utility_meter/sensor.py b/homeassistant/components/utility_meter/sensor.py index 28314710e4cc..f963f84bd8b7 100644 --- a/homeassistant/components/utility_meter/sensor.py +++ b/homeassistant/components/utility_meter/sensor.py @@ -5,11 +5,9 @@ from dataclasses import dataclass from datetime import datetime, timedelta from decimal import Decimal, DecimalException, InvalidOperation import logging -import math from typing import Any, Self, override from cronsim import CronSim -import probatio from homeassistant.components.sensor import ( ATTR_LAST_RESET, @@ -40,7 +38,7 @@ from homeassistant.core import ( State, callback, ) -from homeassistant.helpers import entity_platform, entity_registry as er +from homeassistant.helpers import entity_registry as er from homeassistant.helpers.device import async_entity_id_to_device from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import ( @@ -59,7 +57,6 @@ from homeassistant.util.enum import try_parse_enum from .const import ( ATTR_NEXT_RESET, - ATTR_VALUE, BIMONTHLY, CONF_CRON_PATTERN, CONF_METER, @@ -81,7 +78,6 @@ from .const import ( MONTHLY, QUARTER_HOURLY, QUARTERLY, - SERVICE_CALIBRATE_METER, SIGNAL_RESET_METER, WEEKLY, YEARLY, @@ -112,16 +108,6 @@ PAUSED = "paused" COLLECTING = "collecting" -def validate_is_number(value): - """Validate value is a number.""" - try: - if math.isfinite(float(value)): - return value - except ValueError, TypeError: - pass - raise probatio.Invalid("Value is not a number") - - async def async_setup_entry( hass: HomeAssistant, config_entry: ConfigEntry, @@ -197,14 +183,6 @@ async def async_setup_entry( async_add_entities(meters) - platform = entity_platform.async_get_current_platform() - - platform.async_register_entity_service( - SERVICE_CALIBRATE_METER, - {probatio.Required(ATTR_VALUE): validate_is_number}, - "async_calibrate", - ) - async def async_setup_platform( hass: HomeAssistant, @@ -279,14 +257,6 @@ async def async_setup_platform( async_add_entities(meters) - platform = entity_platform.async_get_current_platform() - - platform.async_register_entity_service( - SERVICE_CALIBRATE_METER, - {probatio.Required(ATTR_VALUE): validate_is_number}, - "async_calibrate", - ) - @dataclass class UtilitySensorExtraStoredData(SensorExtraStoredData): diff --git a/homeassistant/components/utility_meter/services.py b/homeassistant/components/utility_meter/services.py index 06b8707891ec..3a035895b11c 100644 --- a/homeassistant/components/utility_meter/services.py +++ b/homeassistant/components/utility_meter/services.py @@ -1,20 +1,38 @@ """Support for tracking consumption over given periods of time.""" import logging +import math import probatio from homeassistant.components.select import DOMAIN as SELECT_DOMAIN -from homeassistant.const import ATTR_ENTITY_ID +from homeassistant.const import ATTR_ENTITY_ID, Platform from homeassistant.core import HomeAssistant, ServiceCall, callback, split_entity_id from homeassistant.helpers import config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_send +from homeassistant.helpers.service import async_register_platform_entity_service -from .const import DOMAIN, SERVICE_RESET, SIGNAL_RESET_METER +from .const import ( + ATTR_VALUE, + DOMAIN, + SERVICE_CALIBRATE_METER, + SERVICE_RESET, + SIGNAL_RESET_METER, +) _LOGGER = logging.getLogger(__name__) +def _validate_is_number(value): + """Validate value is a number.""" + try: + if math.isfinite(float(value)): + return value + except ValueError, TypeError: + pass + raise probatio.Invalid("Value is not a number") + + async def async_reset_meters(service_call: ServiceCall) -> None: """Reset all sensors of a meter.""" meters = service_call.data["entity_id"] @@ -43,3 +61,12 @@ def async_setup_services(hass: HomeAssistant) -> None: {ATTR_ENTITY_ID: probatio.All(probatio.EnsureList(), [cv.entity_id])} ), ) + + async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_CALIBRATE_METER, + entity_domain=Platform.SENSOR, + func="async_calibrate", + schema={probatio.Required(ATTR_VALUE): _validate_is_number}, + )