1 """Support for Autarco sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
8 from autarco
import Battery, Inverter, Solar
13 SensorEntityDescription,
23 from .
import AutarcoConfigEntry
24 from .const
import DOMAIN
25 from .coordinator
import AutarcoDataUpdateCoordinator
28 @dataclass(frozen=True, kw_only=True)
30 """Describes an Autarco sensor entity."""
32 value_fn: Callable[[Battery], StateType]
35 SENSORS_BATTERY: tuple[AutarcoBatterySensorEntityDescription, ...] = (
38 translation_key=
"flow_now",
39 native_unit_of_measurement=UnitOfPower.WATT,
40 device_class=SensorDeviceClass.POWER,
41 state_class=SensorStateClass.MEASUREMENT,
42 value_fn=
lambda battery: battery.flow_now,
45 key=
"state_of_charge",
46 translation_key=
"state_of_charge",
47 native_unit_of_measurement=PERCENTAGE,
48 device_class=SensorDeviceClass.BATTERY,
49 state_class=SensorStateClass.MEASUREMENT,
50 value_fn=
lambda battery: battery.state_of_charge,
53 key=
"discharged_today",
54 translation_key=
"discharged_today",
55 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
56 device_class=SensorDeviceClass.ENERGY,
57 state_class=SensorStateClass.TOTAL,
58 value_fn=
lambda battery: battery.discharged_today,
61 key=
"discharged_month",
62 translation_key=
"discharged_month",
63 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
64 device_class=SensorDeviceClass.ENERGY,
65 state_class=SensorStateClass.TOTAL,
66 value_fn=
lambda battery: battery.discharged_month,
69 key=
"discharged_total",
70 translation_key=
"discharged_total",
71 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
72 device_class=SensorDeviceClass.ENERGY,
73 state_class=SensorStateClass.TOTAL_INCREASING,
74 value_fn=
lambda battery: battery.discharged_total,
78 translation_key=
"charged_today",
79 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
80 device_class=SensorDeviceClass.ENERGY,
81 state_class=SensorStateClass.TOTAL,
82 value_fn=
lambda battery: battery.charged_today,
86 translation_key=
"charged_month",
87 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
88 device_class=SensorDeviceClass.ENERGY,
89 state_class=SensorStateClass.TOTAL,
90 value_fn=
lambda battery: battery.charged_month,
94 translation_key=
"charged_total",
95 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
96 device_class=SensorDeviceClass.ENERGY,
97 state_class=SensorStateClass.TOTAL_INCREASING,
98 value_fn=
lambda battery: battery.charged_total,
103 @dataclass(frozen=True, kw_only=True)
105 """Describes an Autarco sensor entity."""
107 value_fn: Callable[[Solar], StateType]
110 SENSORS_SOLAR: tuple[AutarcoSolarSensorEntityDescription, ...] = (
112 key=
"power_production",
113 translation_key=
"power_production",
114 native_unit_of_measurement=UnitOfPower.WATT,
115 device_class=SensorDeviceClass.POWER,
116 state_class=SensorStateClass.MEASUREMENT,
117 value_fn=
lambda solar: solar.power_production,
120 key=
"energy_production_today",
121 translation_key=
"energy_production_today",
122 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
123 device_class=SensorDeviceClass.ENERGY,
124 state_class=SensorStateClass.TOTAL,
125 value_fn=
lambda solar: solar.energy_production_today,
128 key=
"energy_production_month",
129 translation_key=
"energy_production_month",
130 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
131 device_class=SensorDeviceClass.ENERGY,
132 state_class=SensorStateClass.TOTAL,
133 value_fn=
lambda solar: solar.energy_production_month,
136 key=
"energy_production_total",
137 translation_key=
"energy_production_total",
138 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
139 device_class=SensorDeviceClass.ENERGY,
140 state_class=SensorStateClass.TOTAL_INCREASING,
141 value_fn=
lambda solar: solar.energy_production_total,
146 @dataclass(frozen=True, kw_only=True)
148 """Describes an Autarco inverter sensor entity."""
150 value_fn: Callable[[Inverter], StateType]
153 SENSORS_INVERTER: tuple[AutarcoInverterSensorEntityDescription, ...] = (
156 translation_key=
"out_ac_power",
157 native_unit_of_measurement=UnitOfPower.WATT,
158 device_class=SensorDeviceClass.POWER,
159 state_class=SensorStateClass.MEASUREMENT,
160 value_fn=
lambda inverter: inverter.out_ac_power,
163 key=
"out_ac_energy_total",
164 translation_key=
"out_ac_energy_total",
165 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
166 device_class=SensorDeviceClass.ENERGY,
167 state_class=SensorStateClass.TOTAL_INCREASING,
168 value_fn=
lambda inverter: inverter.out_ac_energy_total,
175 entry: AutarcoConfigEntry,
176 async_add_entities: AddEntitiesCallback,
178 """Set up Autarco sensors based on a config entry."""
179 entities: list[SensorEntity] = []
180 for coordinator
in entry.runtime_data:
183 coordinator=coordinator,
184 description=description,
186 for description
in SENSORS_SOLAR
190 coordinator=coordinator,
191 description=description,
192 serial_number=inverter,
194 for description
in SENSORS_INVERTER
195 for inverter
in coordinator.data.inverters
197 if coordinator.data.battery:
200 coordinator=coordinator,
201 description=description,
203 for description
in SENSORS_BATTERY
209 CoordinatorEntity[AutarcoDataUpdateCoordinator], SensorEntity
211 """Defines an Autarco battery sensor."""
213 entity_description: AutarcoBatterySensorEntityDescription
214 _attr_has_entity_name =
True
219 coordinator: AutarcoDataUpdateCoordinator,
220 description: AutarcoBatterySensorEntityDescription,
222 """Initialize Autarco sensor."""
227 f
"{coordinator.account_site.site_id}_battery_{description.key}"
230 identifiers={(DOMAIN, f
"{coordinator.account_site.site_id}_battery")},
231 entry_type=DeviceEntryType.SERVICE,
232 manufacturer=
"Autarco",
238 """Return the state of the sensor."""
239 assert self.coordinator.data.battery
is not None
244 CoordinatorEntity[AutarcoDataUpdateCoordinator], SensorEntity
246 """Defines an Autarco solar sensor."""
248 entity_description: AutarcoSolarSensorEntityDescription
249 _attr_has_entity_name =
True
254 coordinator: AutarcoDataUpdateCoordinator,
255 description: AutarcoSolarSensorEntityDescription,
257 """Initialize Autarco sensor."""
262 f
"{coordinator.account_site.site_id}_solar_{description.key}"
265 identifiers={(DOMAIN, f
"{coordinator.account_site.site_id}_solar")},
266 entry_type=DeviceEntryType.SERVICE,
267 manufacturer=
"Autarco",
273 """Return the state of the sensor."""
278 CoordinatorEntity[AutarcoDataUpdateCoordinator], SensorEntity
280 """Defines an Autarco inverter sensor."""
282 entity_description: AutarcoInverterSensorEntityDescription
283 _attr_has_entity_name =
True
288 coordinator: AutarcoDataUpdateCoordinator,
289 description: AutarcoInverterSensorEntityDescription,
292 """Initialize Autarco sensor."""
299 identifiers={(DOMAIN, serial_number)},
300 name=f
"Inverter {serial_number}",
301 manufacturer=
"Autarco",
303 serial_number=serial_number,
308 """Return the state of the sensor."""
310 self.coordinator.data.inverters[self.
_serial_number_serial_number]
None __init__(self, *AutarcoDataUpdateCoordinator coordinator, AutarcoBatterySensorEntityDescription description)
StateType native_value(self)
StateType native_value(self)
None __init__(self, *AutarcoDataUpdateCoordinator coordinator, AutarcoInverterSensorEntityDescription description, str serial_number)
StateType native_value(self)
None __init__(self, *AutarcoDataUpdateCoordinator coordinator, AutarcoSolarSensorEntityDescription description)
None async_setup_entry(HomeAssistant hass, AutarcoConfigEntry entry, AddEntitiesCallback async_add_entities)