mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Support ViCare energy units (#58433)
This commit is contained in:
parent
15c4f3906b
commit
066610923e
@ -1,6 +1,13 @@
|
|||||||
"""Constants for the ViCare integration."""
|
"""Constants for the ViCare integration."""
|
||||||
import enum
|
import enum
|
||||||
|
|
||||||
|
from homeassistant.const import (
|
||||||
|
DEVICE_CLASS_ENERGY,
|
||||||
|
DEVICE_CLASS_GAS,
|
||||||
|
ENERGY_KILO_WATT_HOUR,
|
||||||
|
VOLUME_CUBIC_METERS,
|
||||||
|
)
|
||||||
|
|
||||||
DOMAIN = "vicare"
|
DOMAIN = "vicare"
|
||||||
|
|
||||||
PLATFORMS = ["climate", "sensor", "binary_sensor", "water_heater"]
|
PLATFORMS = ["climate", "sensor", "binary_sensor", "water_heater"]
|
||||||
@ -15,6 +22,19 @@ CONF_HEATING_TYPE = "heating_type"
|
|||||||
|
|
||||||
DEFAULT_SCAN_INTERVAL = 60
|
DEFAULT_SCAN_INTERVAL = 60
|
||||||
|
|
||||||
|
VICARE_CUBIC_METER = "cubicMeter"
|
||||||
|
VICARE_KWH = "kilowattHour"
|
||||||
|
|
||||||
|
VICARE_UNIT_TO_DEVICE_CLASS = {
|
||||||
|
VICARE_KWH: DEVICE_CLASS_ENERGY,
|
||||||
|
VICARE_CUBIC_METER: DEVICE_CLASS_GAS,
|
||||||
|
}
|
||||||
|
|
||||||
|
VICARE_UNIT_TO_UNIT_OF_MEASUREMENT = {
|
||||||
|
VICARE_KWH: ENERGY_KILO_WATT_HOUR,
|
||||||
|
VICARE_CUBIC_METER: VOLUME_CUBIC_METERS,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class HeatingType(enum.Enum):
|
class HeatingType(enum.Enum):
|
||||||
"""Possible options for heating type."""
|
"""Possible options for heating type."""
|
||||||
|
@ -4,7 +4,9 @@ from __future__ import annotations
|
|||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
import logging
|
import logging
|
||||||
|
from typing import Callable
|
||||||
|
|
||||||
|
from PyViCare.PyViCareDevice import Device
|
||||||
from PyViCare.PyViCareUtils import (
|
from PyViCare.PyViCareUtils import (
|
||||||
PyViCareInvalidDataError,
|
PyViCareInvalidDataError,
|
||||||
PyViCareNotSupportedFeatureError,
|
PyViCareNotSupportedFeatureError,
|
||||||
@ -13,13 +15,13 @@ from PyViCare.PyViCareUtils import (
|
|||||||
import requests
|
import requests
|
||||||
|
|
||||||
from homeassistant.components.sensor import (
|
from homeassistant.components.sensor import (
|
||||||
|
STATE_CLASS_MEASUREMENT,
|
||||||
STATE_CLASS_TOTAL_INCREASING,
|
STATE_CLASS_TOTAL_INCREASING,
|
||||||
SensorEntity,
|
SensorEntity,
|
||||||
SensorEntityDescription,
|
SensorEntityDescription,
|
||||||
)
|
)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
DEVICE_CLASS_ENERGY,
|
DEVICE_CLASS_ENERGY,
|
||||||
DEVICE_CLASS_POWER,
|
|
||||||
DEVICE_CLASS_TEMPERATURE,
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
PERCENTAGE,
|
PERCENTAGE,
|
||||||
@ -30,7 +32,14 @@ from homeassistant.const import (
|
|||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
from . import ViCareRequiredKeysMixin
|
from . import ViCareRequiredKeysMixin
|
||||||
from .const import DOMAIN, VICARE_API, VICARE_DEVICE_CONFIG, VICARE_NAME
|
from .const import (
|
||||||
|
DOMAIN,
|
||||||
|
VICARE_API,
|
||||||
|
VICARE_DEVICE_CONFIG,
|
||||||
|
VICARE_NAME,
|
||||||
|
VICARE_UNIT_TO_DEVICE_CLASS,
|
||||||
|
VICARE_UNIT_TO_UNIT_OF_MEASUREMENT,
|
||||||
|
)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -74,6 +83,8 @@ SENSOR_POWER_PRODUCTION_THIS_YEAR = "power_production_this_year"
|
|||||||
class ViCareSensorEntityDescription(SensorEntityDescription, ViCareRequiredKeysMixin):
|
class ViCareSensorEntityDescription(SensorEntityDescription, ViCareRequiredKeysMixin):
|
||||||
"""Describes ViCare sensor entity."""
|
"""Describes ViCare sensor entity."""
|
||||||
|
|
||||||
|
unit_getter: Callable[[Device], bool | None] | None = None
|
||||||
|
|
||||||
|
|
||||||
GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
||||||
ViCareSensorEntityDescription(
|
ViCareSensorEntityDescription(
|
||||||
@ -102,6 +113,7 @@ GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
|||||||
name="Hot water gas consumption today",
|
name="Hot water gas consumption today",
|
||||||
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||||
value_getter=lambda api: api.getGasConsumptionDomesticHotWaterToday(),
|
value_getter=lambda api: api.getGasConsumptionDomesticHotWaterToday(),
|
||||||
|
unit_getter=lambda api: api.getGasConsumptionDomesticHotWaterUnit(),
|
||||||
device_class=DEVICE_CLASS_ENERGY,
|
device_class=DEVICE_CLASS_ENERGY,
|
||||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||||
),
|
),
|
||||||
@ -110,6 +122,7 @@ GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
|||||||
name="Hot water gas consumption this week",
|
name="Hot water gas consumption this week",
|
||||||
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||||
value_getter=lambda api: api.getGasConsumptionDomesticHotWaterThisWeek(),
|
value_getter=lambda api: api.getGasConsumptionDomesticHotWaterThisWeek(),
|
||||||
|
unit_getter=lambda api: api.getGasConsumptionDomesticHotWaterUnit(),
|
||||||
device_class=DEVICE_CLASS_ENERGY,
|
device_class=DEVICE_CLASS_ENERGY,
|
||||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||||
),
|
),
|
||||||
@ -118,6 +131,7 @@ GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
|||||||
name="Hot water gas consumption this month",
|
name="Hot water gas consumption this month",
|
||||||
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||||
value_getter=lambda api: api.getGasConsumptionDomesticHotWaterThisMonth(),
|
value_getter=lambda api: api.getGasConsumptionDomesticHotWaterThisMonth(),
|
||||||
|
unit_getter=lambda api: api.getGasConsumptionDomesticHotWaterUnit(),
|
||||||
device_class=DEVICE_CLASS_ENERGY,
|
device_class=DEVICE_CLASS_ENERGY,
|
||||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||||
),
|
),
|
||||||
@ -126,6 +140,7 @@ GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
|||||||
name="Hot water gas consumption this year",
|
name="Hot water gas consumption this year",
|
||||||
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||||
value_getter=lambda api: api.getGasConsumptionDomesticHotWaterThisYear(),
|
value_getter=lambda api: api.getGasConsumptionDomesticHotWaterThisYear(),
|
||||||
|
unit_getter=lambda api: api.getGasConsumptionDomesticHotWaterUnit(),
|
||||||
device_class=DEVICE_CLASS_ENERGY,
|
device_class=DEVICE_CLASS_ENERGY,
|
||||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||||
),
|
),
|
||||||
@ -134,6 +149,7 @@ GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
|||||||
name="Heating gas consumption today",
|
name="Heating gas consumption today",
|
||||||
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||||
value_getter=lambda api: api.getGasConsumptionHeatingToday(),
|
value_getter=lambda api: api.getGasConsumptionHeatingToday(),
|
||||||
|
unit_getter=lambda api: api.getGasConsumptionHeatingUnit(),
|
||||||
device_class=DEVICE_CLASS_ENERGY,
|
device_class=DEVICE_CLASS_ENERGY,
|
||||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||||
),
|
),
|
||||||
@ -142,6 +158,7 @@ GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
|||||||
name="Heating gas consumption this week",
|
name="Heating gas consumption this week",
|
||||||
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||||
value_getter=lambda api: api.getGasConsumptionHeatingThisWeek(),
|
value_getter=lambda api: api.getGasConsumptionHeatingThisWeek(),
|
||||||
|
unit_getter=lambda api: api.getGasConsumptionHeatingUnit(),
|
||||||
device_class=DEVICE_CLASS_ENERGY,
|
device_class=DEVICE_CLASS_ENERGY,
|
||||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||||
),
|
),
|
||||||
@ -150,6 +167,7 @@ GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
|||||||
name="Heating gas consumption this month",
|
name="Heating gas consumption this month",
|
||||||
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||||
value_getter=lambda api: api.getGasConsumptionHeatingThisMonth(),
|
value_getter=lambda api: api.getGasConsumptionHeatingThisMonth(),
|
||||||
|
unit_getter=lambda api: api.getGasConsumptionHeatingUnit(),
|
||||||
device_class=DEVICE_CLASS_ENERGY,
|
device_class=DEVICE_CLASS_ENERGY,
|
||||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||||
),
|
),
|
||||||
@ -158,6 +176,7 @@ GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
|||||||
name="Heating gas consumption this year",
|
name="Heating gas consumption this year",
|
||||||
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||||
value_getter=lambda api: api.getGasConsumptionHeatingThisYear(),
|
value_getter=lambda api: api.getGasConsumptionHeatingThisYear(),
|
||||||
|
unit_getter=lambda api: api.getGasConsumptionHeatingUnit(),
|
||||||
device_class=DEVICE_CLASS_ENERGY,
|
device_class=DEVICE_CLASS_ENERGY,
|
||||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||||
),
|
),
|
||||||
@ -166,8 +185,8 @@ GLOBAL_SENSORS: tuple[ViCareSensorEntityDescription, ...] = (
|
|||||||
name="Power production current",
|
name="Power production current",
|
||||||
native_unit_of_measurement=POWER_WATT,
|
native_unit_of_measurement=POWER_WATT,
|
||||||
value_getter=lambda api: api.getPowerProductionCurrent(),
|
value_getter=lambda api: api.getPowerProductionCurrent(),
|
||||||
device_class=DEVICE_CLASS_POWER,
|
device_class=DEVICE_CLASS_ENERGY,
|
||||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
),
|
),
|
||||||
ViCareSensorEntityDescription(
|
ViCareSensorEntityDescription(
|
||||||
key=SENSOR_POWER_PRODUCTION_TODAY,
|
key=SENSOR_POWER_PRODUCTION_TODAY,
|
||||||
@ -292,6 +311,15 @@ def _build_entity(name, vicare_api, device_config, sensor):
|
|||||||
_LOGGER.debug("Found device %s", name)
|
_LOGGER.debug("Found device %s", name)
|
||||||
try:
|
try:
|
||||||
sensor.value_getter(vicare_api)
|
sensor.value_getter(vicare_api)
|
||||||
|
|
||||||
|
if callable(sensor.unit_getter):
|
||||||
|
with suppress(PyViCareNotSupportedFeatureError):
|
||||||
|
vicare_unit = sensor.unit_getter(vicare_api)
|
||||||
|
if vicare_unit is not None:
|
||||||
|
sensor.device_class = VICARE_UNIT_TO_DEVICE_CLASS.get(vicare_unit)
|
||||||
|
sensor.native_unit_of_measurement = (
|
||||||
|
VICARE_UNIT_TO_UNIT_OF_MEASUREMENT.get(vicare_unit)
|
||||||
|
)
|
||||||
_LOGGER.debug("Found entity %s", name)
|
_LOGGER.debug("Found entity %s", name)
|
||||||
except PyViCareNotSupportedFeatureError:
|
except PyViCareNotSupportedFeatureError:
|
||||||
_LOGGER.info("Feature not supported %s", name)
|
_LOGGER.info("Feature not supported %s", name)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user