diff --git a/custom_components/huawei_solar/manifest.json b/custom_components/huawei_solar/manifest.json index 1107173..b2dbc5d 100644 --- a/custom_components/huawei_solar/manifest.json +++ b/custom_components/huawei_solar/manifest.json @@ -4,6 +4,6 @@ "documentation": "https://github.com/Emilv2/huawei_solar", "dependencies": [], "codeowners": ["Emilv2"], - "requirements": ["huawei-solar>=2.0.0,<=2.2.6"], + "requirements": ["huawei-solar>=2.0.0,<=2.2.9"], "version": "1.2.4" } diff --git a/custom_components/huawei_solar/sensor.py b/custom_components/huawei_solar/sensor.py index c0b981a..2f49af8 100644 --- a/custom_components/huawei_solar/sensor.py +++ b/custom_components/huawei_solar/sensor.py @@ -8,17 +8,13 @@ ATTR_LAST_RESET, ATTR_STATE_CLASS, PLATFORM_SCHEMA, - STATE_CLASS_MEASUREMENT, - STATE_CLASS_TOTAL_INCREASING, + SensorStateClass, + SensorDeviceClass, ) from homeassistant.const import ( CONF_HOST, - DEVICE_CLASS_CURRENT, - DEVICE_CLASS_ENERGY, - DEVICE_CLASS_POWER, - DEVICE_CLASS_VOLTAGE, - ENERGY_KILO_WATT_HOUR, - POWER_WATT, + UnitOfEnergy, + UnitOfPower, ) from homeassistant.helpers.entity import Entity from homeassistant.util.dt import utc_from_timestamp @@ -36,6 +32,7 @@ DEFAULT_RECONNECT_INTERVAL = 30 CONF_OPTIMIZERS = "optimizers" +CONF_NAME = "name" CONF_BATTERY = "battery" CONF_SLAVE = "slave" CONF_PORT = "port" @@ -78,7 +75,8 @@ "phase_B_current", "phase_C_current", "power_meter_active_power", - "input_power", + "input_power", # Total input power + "active_power", "grid_A_voltage", "grid_B_voltage", "grid_C_voltage", @@ -87,6 +85,8 @@ "active_grid_C_current", "active_grid_power_factor", "active_grid_frequency", + "daily_yield_energy", + "accumulated_yield_energy", "grid_exported_energy", "grid_accumulated_energy", "active_grid_A_B_voltage", @@ -155,6 +155,7 @@ vol.Optional(CONF_BATTERY, default=False): cv.boolean, vol.Optional(CONF_SLAVE, default=0): int, vol.Optional(CONF_PORT, default=502): int, + vol.Optional(CONF_NAME, default=''): cv.string, } ) @@ -166,14 +167,16 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= static_attributes = {} try: - inverter = AsyncHuaweiSolar( - host=config[CONF_HOST], port=config[CONF_PORT], loop=hass.loop, slave=config[CONF_SLAVE] + inverter = await AsyncHuaweiSolar.create( + host=config[CONF_HOST], port=config[CONF_PORT], slave=config[CONF_SLAVE] ) for register in STATIC_ATTR_LIST: static_attributes[register] = (await inverter.get(register)).value _LOGGER.debug("get sensor static attribute: %s", register) await asyncio.sleep(DEFAULT_COOLDOWN_INTERVAL) + if config[CONF_NAME]: + static_attributes["model_name"] = config[CONF_NAME] register = ATTR_GRID_CODE tmp = (await inverter.get(register)).value @@ -211,40 +214,40 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= huawei_solar_sensor, HuaweiSolarDailyYieldSensor( inverter=inverter, - unit=ENERGY_KILO_WATT_HOUR, + unit=UnitOfEnergy.KILO_WATT_HOUR, icon="mdi:solar-power", - device_class=DEVICE_CLASS_ENERGY, + device_class=SensorDeviceClass.ENERGY, parent_sensor=huawei_solar_sensor, register=ATTR_DAILY_YIELD, - name_prefix="daily_yield", - state_class=STATE_CLASS_MEASUREMENT, + name_prefix=static_attributes["model_name"] + "_daily_yield", + state_class=SensorStateClass.MEASUREMENT, ), HuaweiSolarEntitySensor( inverter=inverter, - unit=ENERGY_KILO_WATT_HOUR, + unit=UnitOfEnergy.KILO_WATT_HOUR, icon="mdi:solar-power", - device_class=DEVICE_CLASS_ENERGY, + device_class=SensorDeviceClass.ENERGY, parent_sensor=huawei_solar_sensor, register=ATTR_ACCUMULATED_YIELD, - name_prefix="total_yield", + name_prefix=static_attributes["model_name"] +"_total_yield", ), HuaweiSolarEntitySensor( inverter=inverter, - unit=ENERGY_KILO_WATT_HOUR, + unit=UnitOfEnergy.KILO_WATT_HOUR, icon="mdi:solar-power", - device_class=DEVICE_CLASS_ENERGY, + device_class=SensorDeviceClass.ENERGY, parent_sensor=huawei_solar_sensor, register=ATTR_GRID_EXPORTED, - name_prefix="grid_exported", + name_prefix=static_attributes["model_name"] + "_grid_exported", ), HuaweiSolarEntitySensor( inverter=inverter, - unit=ENERGY_KILO_WATT_HOUR, + unit=UnitOfEnergy.KILO_WATT_HOUR, icon="mdi:solar-power", - device_class=DEVICE_CLASS_ENERGY, + device_class=SensorDeviceClass.ENERGY, parent_sensor=huawei_solar_sensor, register=ATTR_GRID_ACCUMULATED, - name_prefix="grid_accumulated", + name_prefix=static_attributes["model_name"] + "_grid_accumulated", ), ] @@ -253,25 +256,25 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= [ HuaweiSolarEntitySensor( inverter=inverter, - unit=POWER_WATT, + unit=UnitOfPower.WATT, icon="mdi:solar-power", - device_class=DEVICE_CLASS_POWER, + device_class=SensorDeviceClass.POWER, parent_sensor=huawei_solar_sensor, register=ATTR_STORAGE_CHARGE_DISCHARGE_POWER, ), HuaweiSolarEntitySensor( inverter=inverter, - unit=ENERGY_KILO_WATT_HOUR, + unit=UnitOfEnergy.KILO_WATT_HOUR, icon="mdi:solar-power", - device_class=DEVICE_CLASS_ENERGY, + device_class=SensorDeviceClass.ENERGY, parent_sensor=huawei_solar_sensor, register=ATTR_STORAGE_TOTAL_CHARGE, ), HuaweiSolarEntitySensor( inverter=inverter, - unit=ENERGY_KILO_WATT_HOUR, + unit=UnitOfEnergy.KILO_WATT_HOUR, icon="mdi:solar-power", - device_class=DEVICE_CLASS_ENERGY, + device_class=SensorDeviceClass.ENERGY, parent_sensor=huawei_solar_sensor, register=ATTR_STORAGE_TOTAL_DISCHARGE, ), @@ -290,14 +293,14 @@ def __init__( self._optimizers_installed = optimizers_installed self._battery_installed = battery_installed self._hidden = False - self._unit = POWER_WATT + self._unit = UnitOfPower.WATT self._icon = "mdi:solar-power" self._available = False self._state = None self.sensor_states = {} self._attributes = static_attributes self._name = ( - self._attributes["model_name"] + "_" + self._attributes["serial_number"] + self._attributes["model_name"] # + "_" + self._attributes["serial_number"] ) self._unique_id = self._name self._pv_strings_voltage = [None] * self._attributes[ATTR_NB_PV_STRINGS] @@ -327,7 +330,7 @@ def state(self): @property def device_class(self): - return DEVICE_CLASS_POWER + return SensorDeviceClass.POWER @property def extra_state_attributes(self): @@ -368,7 +371,7 @@ async def async_update(self): for register in DYNAMIC_ATTR_LIST: try: self._attributes[register] = (await self._inverter.get(register)).value - _LOGGER.debug("get register: %s", register) + _LOGGER.debug("get register: %s = %s", register, self._attributes[register]) await asyncio.sleep(DEFAULT_COOLDOWN_INTERVAL) except (ReadException, ConnectionException) as ex: _LOGGER.error("could not get register '%s': %s", register, ex) @@ -448,7 +451,7 @@ def __init__( parent_sensor, register, name_prefix=None, - state_class=STATE_CLASS_TOTAL_INCREASING, + state_class=SensorStateClass.TOTAL_INCREASING, ): self._inverter = inverter self._hidden = False @@ -459,7 +462,7 @@ def __init__( self._register = register if name_prefix: self._name = ( - name_prefix + "_" + self._parent_sensor._attributes[ATTR_SERIAL_NUMBER] + name_prefix # + "_" + self._parent_sensor._attributes[ATTR_SERIAL_NUMBER] ) else: self._name = (