1 """Support for Electric Kiwi sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from datetime
import datetime, timedelta
9 from electrickiwi_api.model
import AccountBalance, Hop
14 SensorEntityDescription,
24 from .const
import ACCOUNT_COORDINATOR, ATTRIBUTION, DOMAIN, HOP_COORDINATOR
25 from .coordinator
import (
26 ElectricKiwiAccountDataCoordinator,
27 ElectricKiwiHOPDataCoordinator,
30 ATTR_EK_HOP_START =
"hop_power_start"
31 ATTR_EK_HOP_END =
"hop_power_end"
32 ATTR_TOTAL_RUNNING_BALANCE =
"total_running_balance"
33 ATTR_TOTAL_CURRENT_BALANCE =
"total_account_balance"
34 ATTR_NEXT_BILLING_DATE =
"next_billing_date"
35 ATTR_HOP_PERCENTAGE =
"hop_percentage"
38 @dataclass(frozen=True, kw_only=True)
40 """Describes Electric Kiwi sensor entity."""
42 value_func: Callable[[AccountBalance], float | datetime]
45 ACCOUNT_SENSOR_TYPES: tuple[ElectricKiwiAccountSensorEntityDescription, ...] = (
47 key=ATTR_TOTAL_RUNNING_BALANCE,
48 translation_key=
"total_running_balance",
49 device_class=SensorDeviceClass.MONETARY,
50 state_class=SensorStateClass.TOTAL,
51 native_unit_of_measurement=CURRENCY_DOLLAR,
52 value_func=
lambda account_balance:
float(account_balance.total_running_balance),
55 key=ATTR_TOTAL_CURRENT_BALANCE,
56 translation_key=
"total_current_balance",
57 device_class=SensorDeviceClass.MONETARY,
58 state_class=SensorStateClass.TOTAL,
59 native_unit_of_measurement=CURRENCY_DOLLAR,
60 value_func=
lambda account_balance:
float(account_balance.total_account_balance),
63 key=ATTR_NEXT_BILLING_DATE,
64 translation_key=
"next_billing_date",
65 device_class=SensorDeviceClass.DATE,
66 value_func=
lambda account_balance: datetime.strptime(
67 account_balance.next_billing_date,
"%Y-%m-%d"
71 key=ATTR_HOP_PERCENTAGE,
72 translation_key=
"hop_power_savings",
73 native_unit_of_measurement=PERCENTAGE,
74 state_class=SensorStateClass.MEASUREMENT,
75 value_func=
lambda account_balance:
float(
76 account_balance.connections[0].hop_percentage
82 @dataclass(frozen=True, kw_only=True)
84 """Describes Electric Kiwi HOP sensor entity."""
86 value_func: Callable[[Hop], datetime]
90 """Return the time a day forward if HOP end_time is in the past."""
91 date_time = datetime.combine(
92 dt_util.start_of_local_day(),
93 datetime.strptime(time,
"%I:%M %p").
time(),
94 dt_util.get_default_time_zone(),
97 end_time = datetime.combine(
98 dt_util.start_of_local_day(),
99 datetime.strptime(hop.end.end_time,
"%I:%M %p").
time(),
100 dt_util.get_default_time_zone(),
103 if end_time < dt_util.now():
108 HOP_SENSOR_TYPES: tuple[ElectricKiwiHOPSensorEntityDescription, ...] = (
110 key=ATTR_EK_HOP_START,
111 translation_key=
"hop_free_power_start",
112 device_class=SensorDeviceClass.TIMESTAMP,
117 translation_key=
"hop_free_power_end",
118 device_class=SensorDeviceClass.TIMESTAMP,
125 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
127 """Electric Kiwi Sensors Setup."""
128 account_coordinator: ElectricKiwiAccountDataCoordinator = hass.data[DOMAIN][
130 ][ACCOUNT_COORDINATOR]
132 entities: list[SensorEntity] = [
137 for description
in ACCOUNT_SENSOR_TYPES
140 hop_coordinator: ElectricKiwiHOPDataCoordinator = hass.data[DOMAIN][entry.entry_id][
146 for description
in HOP_SENSOR_TYPES
153 CoordinatorEntity[ElectricKiwiAccountDataCoordinator], SensorEntity
155 """Entity object for Electric Kiwi sensor."""
157 entity_description: ElectricKiwiAccountSensorEntityDescription
158 _attr_has_entity_name =
True
159 _attr_attribution = ATTRIBUTION
163 coordinator: ElectricKiwiAccountDataCoordinator,
164 description: ElectricKiwiAccountSensorEntityDescription,
166 """Entity object for Electric Kiwi sensor."""
170 f
"{coordinator._ek_api.customer_number}"
171 f
"_{coordinator._ek_api.connection_id}_{description.key}"
177 """Return the state of the sensor."""
182 CoordinatorEntity[ElectricKiwiHOPDataCoordinator], SensorEntity
184 """Entity object for Electric Kiwi sensor."""
186 entity_description: ElectricKiwiHOPSensorEntityDescription
187 _attr_has_entity_name =
True
188 _attr_attribution = ATTRIBUTION
192 coordinator: ElectricKiwiHOPDataCoordinator,
193 description: ElectricKiwiHOPSensorEntityDescription,
195 """Entity object for Electric Kiwi sensor."""
199 f
"{coordinator._ek_api.customer_number}"
200 f
"_{coordinator._ek_api.connection_id}_{description.key}"
206 """Return the state of the sensor."""
float|datetime native_value(self)
None __init__(self, ElectricKiwiAccountDataCoordinator coordinator, ElectricKiwiAccountSensorEntityDescription description)
None __init__(self, ElectricKiwiHOPDataCoordinator coordinator, ElectricKiwiHOPSensorEntityDescription description)
datetime native_value(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
datetime _check_and_move_time(Hop hop, str time)
bool time(HomeAssistant hass, dt_time|str|None before=None, dt_time|str|None after=None, str|Container[str]|None weekday=None)