From bfb5daa31c23afd788a9430dfec040bf96e4b90d Mon Sep 17 00:00:00 2001
From: gjong <gjong@users.noreply.github.com>
Date: Tue, 28 Mar 2023 08:49:31 +0200
Subject: [PATCH] Add phase information to YouLess (#89255)

---
 homeassistant/components/youless/sensor.py | 99 +++++++++++++++++++++-
 1 file changed, 98 insertions(+), 1 deletion(-)

diff --git a/homeassistant/components/youless/sensor.py b/homeassistant/components/youless/sensor.py
index b9120f433de..057533081e6 100644
--- a/homeassistant/components/youless/sensor.py
+++ b/homeassistant/components/youless/sensor.py
@@ -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)."""
 
-- 
GitLab