1 """GoodWe PV inverter numeric settings entities."""
3 from __future__
import annotations
5 from collections.abc
import Awaitable, Callable
6 from dataclasses
import dataclass
9 from goodwe
import Inverter, InverterError
14 NumberEntityDescription,
22 from .const
import DOMAIN, KEY_DEVICE_INFO, KEY_INVERTER
24 _LOGGER = logging.getLogger(__name__)
27 @dataclass(frozen=True, kw_only=True)
29 """Class describing Goodwe number entities."""
31 getter: Callable[[Inverter], Awaitable[int]]
32 setter: Callable[[Inverter, int], Awaitable[
None]]
33 filter: Callable[[Inverter], bool]
37 """Return the unit of an inverter setting."""
38 return next((s.unit
for s
in inverter.settings()
if s.id_ == setting),
"")
46 key=
"grid_export_limit",
47 translation_key=
"grid_export_limit",
48 entity_category=EntityCategory.CONFIG,
49 device_class=NumberDeviceClass.POWER,
50 native_unit_of_measurement=UnitOfPower.WATT,
53 native_max_value=10000,
54 getter=
lambda inv: inv.get_grid_export_limit(),
55 setter=
lambda inv, val: inv.set_grid_export_limit(val),
60 key=
"grid_export_limit",
61 translation_key=
"grid_export_limit",
62 entity_category=EntityCategory.CONFIG,
63 native_unit_of_measurement=PERCENTAGE,
67 getter=
lambda inv: inv.get_grid_export_limit(),
68 setter=
lambda inv, val: inv.set_grid_export_limit(val),
72 key=
"battery_discharge_depth",
73 translation_key=
"battery_discharge_depth",
74 icon=
"mdi:battery-arrow-down",
75 entity_category=EntityCategory.CONFIG,
76 native_unit_of_measurement=PERCENTAGE,
80 getter=
lambda inv: inv.get_ongrid_battery_dod(),
81 setter=
lambda inv, val: inv.set_ongrid_battery_dod(val),
82 filter=
lambda inv:
True,
89 config_entry: ConfigEntry,
90 async_add_entities: AddEntitiesCallback,
92 """Set up the inverter select entities from a config entry."""
93 inverter = hass.data[DOMAIN][config_entry.entry_id][KEY_INVERTER]
94 device_info = hass.data[DOMAIN][config_entry.entry_id][KEY_DEVICE_INFO]
98 for description
in filter(
lambda dsc: dsc.filter(inverter), NUMBERS):
100 current_value = await description.getter(inverter)
101 except (InverterError, ValueError):
103 _LOGGER.debug(
"Could not read inverter setting %s", description.key)
114 """Inverter numeric setting entity."""
116 _attr_should_poll =
False
117 _attr_has_entity_name =
True
118 entity_description: GoodweNumberEntityDescription
122 device_info: DeviceInfo,
123 description: GoodweNumberEntityDescription,
127 """Initialize the number inverter setting entity."""
129 self.
_attr_unique_id_attr_unique_id = f
"{DOMAIN}-{description.key}-{inverter.serial_number}"
132 self._inverter: Inverter = inverter
135 """Get the current value from inverter."""
None __init__(self, DeviceInfo device_info, GoodweNumberEntityDescription description, Inverter inverter, int current_value)
None async_set_native_value(self, float value)
None async_write_ha_state(self)
str _get_setting_unit(Inverter inverter, str setting)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)