1 """Number platform for Enphase Envoy solar energy monitor."""
3 from __future__
import annotations
5 from collections.abc
import Awaitable, Callable
6 from dataclasses
import dataclass
7 from operator
import attrgetter
10 from pyenphase
import Envoy, EnvoyDryContactSettings
11 from pyenphase.const
import SupportedFeatures
12 from pyenphase.models.tariff
import EnvoyStorageSettings
17 NumberEntityDescription,
24 from .const
import DOMAIN
25 from .coordinator
import EnphaseConfigEntry, EnphaseUpdateCoordinator
26 from .entity
import EnvoyBaseEntity
29 @dataclass(frozen=True, kw_only=True)
31 """Describes an Envoy Dry Contact Relay number entity."""
33 value_fn: Callable[[EnvoyDryContactSettings], float]
36 @dataclass(frozen=True, kw_only=True)
38 """Describes an Envoy storage mode number entity."""
40 value_fn: Callable[[EnvoyStorageSettings], float]
41 update_fn: Callable[[Envoy, float], Awaitable[dict[str, Any]]]
47 translation_key=
"cutoff_battery_level",
48 device_class=NumberDeviceClass.BATTERY,
49 entity_category=EntityCategory.CONFIG,
50 value_fn=attrgetter(
"soc_low"),
54 translation_key=
"restore_battery_level",
55 device_class=NumberDeviceClass.BATTERY,
56 entity_category=EntityCategory.CONFIG,
57 value_fn=attrgetter(
"soc_high"),
63 translation_key=
"reserve_soc",
64 native_unit_of_measurement=PERCENTAGE,
65 device_class=NumberDeviceClass.BATTERY,
66 value_fn=attrgetter(
"reserved_soc"),
67 update_fn=
lambda envoy, value: envoy.set_reserve_soc(
int(value)),
73 config_entry: EnphaseConfigEntry,
74 async_add_entities: AddEntitiesCallback,
76 """Set up Enphase Envoy number platform."""
77 coordinator = config_entry.runtime_data
78 envoy_data = coordinator.envoy.data
79 assert envoy_data
is not None
80 entities: list[NumberEntity] = []
81 if envoy_data.dry_contact_settings:
84 for entity
in RELAY_ENTITIES
85 for relay
in envoy_data.dry_contact_settings
89 and envoy_data.tariff.storage_settings
90 and coordinator.envoy.supported_features & SupportedFeatures.ENCHARGE
99 """Representation of an Enphase Enpower number entity."""
101 entity_description: EnvoyRelayNumberEntityDescription
105 coordinator: EnphaseUpdateCoordinator,
106 description: EnvoyRelayNumberEntityDescription,
109 """Initialize the Enphase relay number entity."""
110 super().
__init__(coordinator, description)
113 assert enpower
is not None
114 serial_number = enpower.serial_number
116 self.
_attr_unique_id_attr_unique_id = f
"{serial_number}_relay_{relay_id}_{description.key}"
118 identifiers={(DOMAIN, relay_id)},
119 manufacturer=
"Enphase",
120 model=
"Dry contact relay",
121 name=self.
datadatadata.dry_contact_settings[relay_id].load_name,
122 sw_version=
str(enpower.firmware_version),
123 via_device=(DOMAIN, serial_number),
128 """Return the state of the relay entity."""
134 """Update the relay."""
135 await self.
envoyenvoyenvoy.update_dry_contact(
142 """Representation of an Enphase storage settings number entity."""
144 entity_description: EnvoyStorageSettingsNumberEntityDescription
148 coordinator: EnphaseUpdateCoordinator,
149 description: EnvoyStorageSettingsNumberEntityDescription,
151 """Initialize the Enphase relay number entity."""
152 super().
__init__(coordinator, description)
154 assert self.
datadatadata
is not None
155 if enpower := self.
datadatadata.enpower:
160 manufacturer=
"Enphase",
162 name=f
"Enpower {self._serial_number}",
163 sw_version=
str(enpower.firmware_version),
168 self.
_attr_unique_id_attr_unique_id = f
"{self.envoy_serial_num}_{description.key}"
171 manufacturer=
"Enphase",
172 model=coordinator.envoy.envoy_model,
173 name=coordinator.name,
174 sw_version=
str(coordinator.envoy.firmware),
175 hw_version=coordinator.envoy.part_number,
181 """Return the state of the storage setting entity."""
182 assert self.
datadatadata.tariff
is not None
183 assert self.
datadatadata.tariff.storage_settings
is not None
187 """Update the storage setting."""
None __init__(self, EnphaseUpdateCoordinator coordinator, EnvoyRelayNumberEntityDescription description, str relay_id)
None async_set_native_value(self, float value)
None async_set_native_value(self, float value)
None __init__(self, EnphaseUpdateCoordinator coordinator, EnvoyStorageSettingsNumberEntityDescription description)
None async_request_refresh(self)
None async_setup_entry(HomeAssistant hass, EnphaseConfigEntry config_entry, AddEntitiesCallback async_add_entities)