Add phase information to YouLess (#89255)

pull/90365/head
gjong 2023-03-28 08:49:31 +02:00 committed by GitHub
parent 38f3b9f165
commit bfb5daa31c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 98 additions and 1 deletions

View File

@ -10,7 +10,14 @@ from homeassistant.components.sensor import (
SensorStateClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_DEVICE, UnitOfEnergy, UnitOfPower, UnitOfVolume
from homeassistant.const import (
CONF_DEVICE,
UnitOfElectricCurrent,
UnitOfElectricPotential,
UnitOfEnergy,
UnitOfPower,
UnitOfVolume,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
@ -47,6 +54,15 @@ async def async_setup_entry(
DeliveryMeterSensor(coordinator, device, "high"),
ExtraMeterSensor(coordinator, device, "total"),
ExtraMeterPowerSensor(coordinator, device, "usage"),
PhasePowerSensor(coordinator, device, 1),
PhaseVoltageSensor(coordinator, device, 1),
PhaseCurrentSensor(coordinator, device, 1),
PhasePowerSensor(coordinator, device, 2),
PhaseVoltageSensor(coordinator, device, 2),
PhaseCurrentSensor(coordinator, device, 2),
PhasePowerSensor(coordinator, device, 3),
PhaseVoltageSensor(coordinator, device, 3),
PhaseCurrentSensor(coordinator, device, 3),
]
)
@ -193,6 +209,87 @@ class EnergyMeterSensor(YoulessBaseSensor):
return getattr(self.coordinator.data.power_meter, f"_{self._type}", None)
class PhasePowerSensor(YoulessBaseSensor):
"""The current power usage of a single phase."""
_attr_native_unit_of_measurement = UnitOfPower.WATT
_attr_device_class = SensorDeviceClass.POWER
_attr_state_class = SensorStateClass.MEASUREMENT
def __init__(
self, coordinator: DataUpdateCoordinator[YoulessAPI], device: str, phase: int
) -> None:
"""Initialize the power phase sensor."""
super().__init__(
coordinator, device, "power", "Energy usage", f"phase_{phase}_power"
)
self._attr_name = f"Phase {phase} power"
self._phase = phase
@property
def get_sensor(self) -> YoulessSensor | None:
"""Get the sensor value from the coordinator."""
phase_sensor = getattr(self.coordinator.data, f"phase{self._phase}", None)
if phase_sensor is None:
return None
return phase_sensor.power
class PhaseVoltageSensor(YoulessBaseSensor):
"""The current voltage of a single phase."""
_attr_native_unit_of_measurement = UnitOfElectricPotential.VOLT
_attr_device_class = SensorDeviceClass.VOLTAGE
_attr_state_class = SensorStateClass.MEASUREMENT
def __init__(
self, coordinator: DataUpdateCoordinator[YoulessAPI], device: str, phase: int
) -> None:
"""Initialize the voltage phase sensor."""
super().__init__(
coordinator, device, "power", "Energy usage", f"phase_{phase}_voltage"
)
self._attr_name = f"Phase {phase} voltage"
self._phase = phase
@property
def get_sensor(self) -> YoulessSensor | None:
"""Get the sensor value from the coordinator for phase voltage."""
phase_sensor = getattr(self.coordinator.data, f"phase{self._phase}", None)
if phase_sensor is None:
return None
return phase_sensor.voltage
class PhaseCurrentSensor(YoulessBaseSensor):
"""The current current of a single phase."""
_attr_native_unit_of_measurement = UnitOfElectricCurrent.AMPERE
_attr_device_class = SensorDeviceClass.CURRENT
_attr_state_class = SensorStateClass.MEASUREMENT
def __init__(
self, coordinator: DataUpdateCoordinator[YoulessAPI], device: str, phase: int
) -> None:
"""Initialize the current phase sensor."""
super().__init__(
coordinator, device, "power", "Energy usage", f"phase_{phase}_current"
)
self._attr_name = f"Phase {phase} current"
self._phase = phase
@property
def get_sensor(self) -> YoulessSensor | None:
"""Get the sensor value from the coordinator for phase current."""
phase_sensor = getattr(self.coordinator.data, f"phase{self._phase}", None)
if phase_sensor is None:
return None
return phase_sensor.current
class ExtraMeterSensor(YoulessBaseSensor):
"""The Youless extra meter value sensor (s0)."""