Skip to content

Commit

Permalink
Merge aee7fb6 into 7004922
Browse files Browse the repository at this point in the history
  • Loading branch information
bramstroker committed Dec 29, 2022
2 parents 7004922 + aee7fb6 commit 57de1a3
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 8 deletions.
7 changes: 3 additions & 4 deletions custom_components/powercalc/sensors/energy.py
@@ -1,6 +1,7 @@
from __future__ import annotations

import logging
from abc import ABC
from typing import Any, Mapping, Optional

import homeassistant.helpers.entity_registry as er
Expand Down Expand Up @@ -128,11 +129,9 @@ def find_related_real_energy_sensor(
return RealEnergySensor(energy_sensors[0])


class EnergySensor:
class EnergySensor(ABC):
"""Class which all energy sensors should extend from"""

pass


class VirtualEnergySensor(IntegrationSensor, EnergySensor, BaseEntity):
"""Virtual energy sensor, totalling kWh"""
Expand Down Expand Up @@ -206,7 +205,7 @@ def entity_id(self) -> str:
return self._entity_entry.entity_id

@property
def name(self) -> str:
def name(self) -> str | None:
"""Return the name of the sensor."""
return self._entity_entry.name or self._entity_entry.original_name

Expand Down
18 changes: 16 additions & 2 deletions custom_components/powercalc/sensors/utility_meter.py
Expand Up @@ -4,16 +4,17 @@
import logging
from typing import cast

import homeassistant.helpers.entity_registry as er
from awesomeversion.awesomeversion import AwesomeVersion
from homeassistant.components.select import DOMAIN as SELECT_DOMAIN
from homeassistant.components.sensor import SensorEntity
from homeassistant.components.utility_meter.const import (
DATA_TARIFF_SENSORS,
DATA_UTILITY,
)
from homeassistant.components.utility_meter.const import DOMAIN as UTILITY_DOMAIN
from homeassistant.components.utility_meter.select import TariffSelect
from homeassistant.components.utility_meter.sensor import UtilityMeterSensor
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.const import __version__ as HA_VERSION
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_component import EntityComponent
Expand All @@ -25,16 +26,18 @@
CONF_UTILITY_METER_TARIFFS,
CONF_UTILITY_METER_TYPES,
DEFAULT_ENERGY_SENSOR_PRECISION,
DOMAIN,
)
from ..errors import SensorConfigurationError
from .abstract import BaseEntity
from .energy import VirtualEnergySensor, RealEnergySensor

_LOGGER = logging.getLogger(__name__)


async def create_utility_meters(
hass: HomeAssistant,
energy_sensor: SensorEntity,
energy_sensor: VirtualEnergySensor | RealEnergySensor,
sensor_config: dict,
net_consumption: bool = False,
) -> list[UtilityMeterSensor]:
Expand All @@ -59,6 +62,17 @@ async def create_utility_meters(
if energy_sensor.unique_id:
unique_id = f"{energy_sensor.unique_id}_{meter_type}"

# Prevent duplicate creation of utility meter. See #1322
if isinstance(energy_sensor, RealEnergySensor):
entity_registry = er.async_get(hass)
existing_entity_id = entity_registry.async_get_entity_id(
domain=SENSOR_DOMAIN,
platform=DOMAIN,
unique_id=unique_id
)
if existing_entity_id and hass.states.get(existing_entity_id):
continue

if tariffs:
tariff_select = await create_tariff_select(tariffs, hass, name, unique_id)

Expand Down
67 changes: 65 additions & 2 deletions tests/sensors/test_utility_meter.py
@@ -1,8 +1,12 @@
from homeassistant.components import input_boolean, sensor, utility_meter
import logging

import pytest
from homeassistant.components import sensor, utility_meter
from homeassistant.components.utility_meter.sensor import (
ATTR_SOURCE_ID,
ATTR_STATUS,
ATTR_TARIFF,
CONF_UNIQUE_ID,
COLLECTING,
PAUSED,
)
Expand All @@ -12,16 +16,20 @@

from custom_components.powercalc.const import (
CONF_CREATE_UTILITY_METERS,
CONF_ENERGY_SENSOR_ID,
CONF_FIXED,
CONF_MODE,
CONF_POWER,
CONF_POWER_SENSOR_ID,
CONF_UTILITY_METER_TARIFFS,
CONF_UTILITY_METER_TYPES,
DOMAIN,
CalculationStrategy,
)
from homeassistant.helpers.entity_registry import RegistryEntry
from pytest_homeassistant_custom_component.common import mock_registry

from ..common import create_input_boolean
from ..common import create_input_boolean, run_powercalc_setup


async def test_tariff_sensors_are_created(hass: HomeAssistant):
Expand Down Expand Up @@ -65,3 +73,58 @@ async def test_tariff_sensors_are_created(hass: HomeAssistant):
assert offpeak_sensor.attributes[ATTR_SOURCE_ID] == "sensor.test_energy"
assert offpeak_sensor.attributes[ATTR_TARIFF] == "offpeak"
assert offpeak_sensor.attributes[ATTR_STATUS] == PAUSED


async def test_utility_meter_is_not_created_twice(hass: HomeAssistant, caplog: pytest.LogCaptureFixture) -> None:
caplog.set_level(logging.ERROR)
entity_registry = mock_registry(
hass,
{
"sensor.test_power": RegistryEntry(
entity_id="sensor.test_power",
unique_id="1234",
name="Test power",
platform="powercalc",
),
"sensor.test_energy": RegistryEntry(
entity_id="sensor.test_energy",
unique_id="1234_energy",
name="Test energy",
platform="powercalc",
),
"sensor.test_energy_daily": RegistryEntry(
entity_id="sensor.test_energy_daily",
unique_id="1234_energy_daily",
name="Test energy daily",
platform="powercalc",
),
},
)

await run_powercalc_setup(
hass,
{
CONF_ENTITY_ID: "sensor.dummy",
CONF_UNIQUE_ID: "1234",
CONF_CREATE_UTILITY_METERS: True,
CONF_UTILITY_METER_TYPES: ["daily"],
CONF_POWER_SENSOR_ID: "sensor.test_power",
CONF_ENERGY_SENSOR_ID: "sensor.test_energy"
},
)

await run_powercalc_setup(
hass,
{
CONF_ENTITY_ID: "sensor.dummy",
CONF_UNIQUE_ID: "1234",
CONF_CREATE_UTILITY_METERS: True,
CONF_UTILITY_METER_TYPES: ["daily"],
CONF_POWER_SENSOR_ID: "sensor.test_power",
CONF_ENERGY_SENSOR_ID: "sensor.test_energy"
},
)

assert entity_registry.async_get("sensor.test_energy_daily")
assert hass.states.get("sensor.test_energy_daily")
assert len(caplog.records) == 0

0 comments on commit 57de1a3

Please sign in to comment.