From c97b48cf3bddddf58f6954d9e951bdcad07c8e75 Mon Sep 17 00:00:00 2001 From: muppet3000 Date: Fri, 16 Dec 2022 14:31:49 +0000 Subject: [PATCH] Re-add missing Growatt TLX values (#84040) * Growatt - Re-adding missing TLX values (#81470) * Growatt - Added missing files to .coveragerc * Growatt - Correcting TLX Voltage types * Growatt - Addressing review comments --- .coveragerc | 2 + .../components/growatt_server/sensor.py | 19 ++ .../sensor_types/sensor_entity_description.py | 1 + .../growatt_server/sensor_types/tlx.py | 250 +++++++++++++++++- 4 files changed, 268 insertions(+), 4 deletions(-) diff --git a/.coveragerc b/.coveragerc index 94e1667bad8e2c..85e08d51f71ee4 100644 --- a/.coveragerc +++ b/.coveragerc @@ -471,7 +471,9 @@ omit = homeassistant/components/greenwave/light.py homeassistant/components/group/notify.py homeassistant/components/growatt_server/__init__.py + homeassistant/components/growatt_server/const.py homeassistant/components/growatt_server/sensor.py + homeassistant/components/growatt_server/sensor_types/* homeassistant/components/gstreamer/media_player.py homeassistant/components/gtfs/sensor.py homeassistant/components/guardian/__init__.py diff --git a/homeassistant/components/growatt_server/sensor.py b/homeassistant/components/growatt_server/sensor.py index d9ca800131f914..b22664897fd06c 100644 --- a/homeassistant/components/growatt_server/sensor.py +++ b/homeassistant/components/growatt_server/sensor.py @@ -315,6 +315,25 @@ def get_data(self, entity_description): "%s - No drop detected, using API value", entity_description.name ) + # Lifetime total values should always be increasing, they will never reset, however + # the API sometimes returns 0 values when the clock turns to 00:00 local time + # in that scenario we should just return the previous value + # Scenarios: + # 1 - System has a genuine 0 value when it it first commissioned: + # - will return 0 until a non-zero value is registered + # 2 - System has been running fine but temporarily resets to 0 briefly at midnight: + # - will return the previous value + # 3 - HA is restarted during the midnight 'outage' - Not handled: + # - Previous value will not exist meaning 0 will be returned + # - This is an edge case that would be better handled by looking up the previous + # value of the entity from the recorder + if entity_description.never_resets and api_value == 0 and previous_value: + _LOGGER.debug( + "API value is 0, but this value should never reset, returning previous value (%s) instead", + previous_value, + ) + return_value = previous_value + self.previous_values[variable] = return_value return return_value diff --git a/homeassistant/components/growatt_server/sensor_types/sensor_entity_description.py b/homeassistant/components/growatt_server/sensor_types/sensor_entity_description.py index 08a20209098e27..cd286e228b441d 100644 --- a/homeassistant/components/growatt_server/sensor_types/sensor_entity_description.py +++ b/homeassistant/components/growatt_server/sensor_types/sensor_entity_description.py @@ -20,3 +20,4 @@ class GrowattSensorEntityDescription(SensorEntityDescription, GrowattRequiredKey precision: int | None = None currency: bool = False previous_value_drop_threshold: float | None = None + never_resets: bool = False diff --git a/homeassistant/components/growatt_server/sensor_types/tlx.py b/homeassistant/components/growatt_server/sensor_types/tlx.py index ba455747457e83..2a6e76a55a77af 100644 --- a/homeassistant/components/growatt_server/sensor_types/tlx.py +++ b/homeassistant/components/growatt_server/sensor_types/tlx.py @@ -1,4 +1,8 @@ -"""Growatt Sensor definitions for the TLX type.""" +""" +Growatt Sensor definitions for the TLX type. + +TLX Type is also shown on the UI as: "MIN/MIC/MOD/NEO" +""" from __future__ import annotations from homeassistant.components.sensor import SensorDeviceClass, SensorStateClass @@ -7,6 +11,7 @@ ELECTRIC_POTENTIAL_VOLT, ENERGY_KILO_WATT_HOUR, FREQUENCY_HERTZ, + PERCENTAGE, POWER_WATT, TEMP_CELSIUS, ) @@ -29,8 +34,9 @@ api_key="eacTotal", native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, device_class=SensorDeviceClass.ENERGY, - state_class=SensorStateClass.TOTAL, + state_class=SensorStateClass.TOTAL_INCREASING, precision=1, + never_resets=True, ), GrowattSensorEntityDescription( key="tlx_energy_total_input_1", @@ -38,8 +44,9 @@ api_key="epv1Total", native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, device_class=SensorDeviceClass.ENERGY, - state_class=SensorStateClass.TOTAL, + state_class=SensorStateClass.TOTAL_INCREASING, precision=1, + never_resets=True, ), GrowattSensorEntityDescription( key="tlx_energy_today_input_1", @@ -80,8 +87,9 @@ api_key="epv2Total", native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, device_class=SensorDeviceClass.ENERGY, - state_class=SensorStateClass.TOTAL, + state_class=SensorStateClass.TOTAL_INCREASING, precision=1, + never_resets=True, ), GrowattSensorEntityDescription( key="tlx_energy_today_input_2", @@ -116,6 +124,101 @@ device_class=SensorDeviceClass.POWER, precision=1, ), + GrowattSensorEntityDescription( + key="tlx_energy_total_input_3", + name="Lifetime total energy input 3", + api_key="epv3Total", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + precision=1, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_energy_today_input_3", + name="Energy Today Input 3", + api_key="epv3Today", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + precision=1, + ), + GrowattSensorEntityDescription( + key="tlx_voltage_input_3", + name="Input 3 voltage", + api_key="vpv3", + native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, + device_class=SensorDeviceClass.VOLTAGE, + precision=1, + ), + GrowattSensorEntityDescription( + key="tlx_amperage_input_3", + name="Input 3 Amperage", + api_key="ipv3", + native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE, + device_class=SensorDeviceClass.CURRENT, + precision=1, + ), + GrowattSensorEntityDescription( + key="tlx_wattage_input_3", + name="Input 3 Wattage", + api_key="ppv3", + native_unit_of_measurement=POWER_WATT, + device_class=SensorDeviceClass.POWER, + precision=1, + ), + GrowattSensorEntityDescription( + key="tlx_energy_total_input_4", + name="Lifetime total energy input 4", + api_key="epv4Total", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + precision=1, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_energy_today_input_4", + name="Energy Today Input 4", + api_key="epv4Today", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + precision=1, + ), + GrowattSensorEntityDescription( + key="tlx_voltage_input_4", + name="Input 4 voltage", + api_key="vpv4", + native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, + device_class=SensorDeviceClass.VOLTAGE, + precision=1, + ), + GrowattSensorEntityDescription( + key="tlx_amperage_input_4", + name="Input 4 Amperage", + api_key="ipv4", + native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE, + device_class=SensorDeviceClass.CURRENT, + precision=1, + ), + GrowattSensorEntityDescription( + key="tlx_wattage_input_4", + name="Input 4 Wattage", + api_key="ppv4", + native_unit_of_measurement=POWER_WATT, + device_class=SensorDeviceClass.POWER, + precision=1, + ), + GrowattSensorEntityDescription( + key="tlx_solar_generation_total", + name="Lifetime total solar energy", + api_key="epvTotal", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + never_resets=True, + ), GrowattSensorEntityDescription( key="tlx_internal_wattage", name="Internal wattage", @@ -187,4 +290,143 @@ device_class=SensorDeviceClass.TEMPERATURE, precision=1, ), + GrowattSensorEntityDescription( + key="tlx_all_batteries_discharge_today", + name="All batteries discharged today", + api_key="edischargeToday", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + ), + GrowattSensorEntityDescription( + key="tlx_all_batteries_discharge_total", + name="Lifetime total all batteries discharged", + api_key="edischargeTotal", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_battery_1_discharge_w", + name="Battery 1 discharging W", + api_key="bdc1DischargePower", + native_unit_of_measurement=POWER_WATT, + device_class=SensorDeviceClass.POWER, + ), + GrowattSensorEntityDescription( + key="tlx_battery_1_discharge_total", + name="Lifetime total battery 1 discharged", + api_key="bdc1DischargeTotal", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_battery_2_discharge_w", + name="Battery 2 discharging W", + api_key="bdc1DischargePower", + native_unit_of_measurement=POWER_WATT, + device_class=SensorDeviceClass.POWER, + ), + GrowattSensorEntityDescription( + key="tlx_battery_2_discharge_total", + name="Lifetime total battery 2 discharged", + api_key="bdc1DischargeTotal", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_all_batteries_charge_today", + name="All batteries charged today", + api_key="echargeToday", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + ), + GrowattSensorEntityDescription( + key="tlx_all_batteries_charge_total", + name="Lifetime total all batteries charged", + api_key="echargeTotal", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_battery_1_charge_w", + name="Battery 1 charging W", + api_key="bdc1ChargePower", + native_unit_of_measurement=POWER_WATT, + device_class=SensorDeviceClass.POWER, + ), + GrowattSensorEntityDescription( + key="tlx_battery_1_charge_total", + name="Lifetime total battery 1 charged", + api_key="bdc1ChargeTotal", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_battery_2_charge_w", + name="Battery 2 charging W", + api_key="bdc1ChargePower", + native_unit_of_measurement=POWER_WATT, + device_class=SensorDeviceClass.POWER, + ), + GrowattSensorEntityDescription( + key="tlx_battery_2_charge_total", + name="Lifetime total battery 2 charged", + api_key="bdc1ChargeTotal", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_export_to_grid_today", + name="Export to grid today", + api_key="etoGridToday", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + ), + GrowattSensorEntityDescription( + key="tlx_export_to_grid_total", + name="Lifetime total export to grid", + api_key="etoGridTotal", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_load_consumption_today", + name="Load consumption today", + api_key="elocalLoadToday", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + ), + GrowattSensorEntityDescription( + key="mix_load_consumption_total", + name="Lifetime total load consumption", + api_key="elocalLoadTotal", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + never_resets=True, + ), + GrowattSensorEntityDescription( + key="tlx_statement_of_charge", + name="Statement of charge (SoC)", + api_key="bmsSoc", + native_unit_of_measurement=PERCENTAGE, + device_class=SensorDeviceClass.BATTERY, + ), )