1 """Sensor to collect the reference daily prices of electricity ('PVPC') in Spain."""
3 from __future__
import annotations
5 from collections.abc
import Mapping
6 from datetime
import datetime
10 from aiopvpc.const
import KEY_INJECTION, KEY_MAG, KEY_OMIE, KEY_PVPC
14 SensorEntityDescription,
26 from .const
import DOMAIN
27 from .coordinator
import ElecPricesDataUpdateCoordinator
28 from .helpers
import make_sensor_unique_id
30 _LOGGER = logging.getLogger(__name__)
32 SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
35 icon=
"mdi:currency-eur",
36 native_unit_of_measurement=f
"{CURRENCY_EURO}/{UnitOfEnergy.KILO_WATT_HOUR}",
37 state_class=SensorStateClass.MEASUREMENT,
38 suggested_display_precision=5,
43 icon=
"mdi:transmission-tower-export",
44 native_unit_of_measurement=f
"{CURRENCY_EURO}/{UnitOfEnergy.KILO_WATT_HOUR}",
45 state_class=SensorStateClass.MEASUREMENT,
46 suggested_display_precision=5,
47 name=
"Injection Price",
51 icon=
"mdi:bank-transfer",
52 native_unit_of_measurement=f
"{CURRENCY_EURO}/{UnitOfEnergy.KILO_WATT_HOUR}",
53 state_class=SensorStateClass.MEASUREMENT,
54 suggested_display_precision=5,
56 entity_registry_enabled_default=
False,
61 native_unit_of_measurement=f
"{CURRENCY_EURO}/{UnitOfEnergy.KILO_WATT_HOUR}",
62 state_class=SensorStateClass.MEASUREMENT,
63 suggested_display_precision=5,
65 entity_registry_enabled_default=
False,
68 _PRICE_SENSOR_ATTRIBUTES_MAP = {
73 "available_power":
"available_power",
74 "next_period":
"next_period",
75 "hours_to_next_period":
"hours_to_next_period",
76 "next_better_price":
"next_better_price",
77 "hours_to_better_price":
"hours_to_better_price",
78 "num_better_prices_ahead":
"num_better_prices_ahead",
79 "price_position":
"price_position",
80 "price_ratio":
"price_ratio",
81 "max_price":
"max_price",
82 "max_price_at":
"max_price_at",
83 "min_price":
"min_price",
84 "min_price_at":
"min_price_at",
85 "next_best_at":
"next_best_at",
86 "price_00h":
"price_00h",
87 "price_01h":
"price_01h",
88 "price_02h":
"price_02h",
89 "price_02h_d":
"price_02h_d",
90 "price_03h":
"price_03h",
91 "price_04h":
"price_04h",
92 "price_05h":
"price_05h",
93 "price_06h":
"price_06h",
94 "price_07h":
"price_07h",
95 "price_08h":
"price_08h",
96 "price_09h":
"price_09h",
97 "price_10h":
"price_10h",
98 "price_11h":
"price_11h",
99 "price_12h":
"price_12h",
100 "price_13h":
"price_13h",
101 "price_14h":
"price_14h",
102 "price_15h":
"price_15h",
103 "price_16h":
"price_16h",
104 "price_17h":
"price_17h",
105 "price_18h":
"price_18h",
106 "price_19h":
"price_19h",
107 "price_20h":
"price_20h",
108 "price_21h":
"price_21h",
109 "price_22h":
"price_22h",
110 "price_23h":
"price_23h",
112 "next_better_price (next day)":
"next_better_price (next day)",
113 "hours_to_better_price (next day)":
"hours_to_better_price (next day)",
114 "num_better_prices_ahead (next day)":
"num_better_prices_ahead (next day)",
115 "price_position (next day)":
"price_position (next day)",
116 "price_ratio (next day)":
"price_ratio (next day)",
117 "max_price (next day)":
"max_price (next day)",
118 "max_price_at (next day)":
"max_price_at (next day)",
119 "min_price (next day)":
"min_price (next day)",
120 "min_price_at (next day)":
"min_price_at (next day)",
121 "next_best_at (next day)":
"next_best_at (next day)",
122 "price_next_day_00h":
"price_next_day_00h",
123 "price_next_day_01h":
"price_next_day_01h",
124 "price_next_day_02h":
"price_next_day_02h",
125 "price_next_day_02h_d":
"price_next_day_02h_d",
126 "price_next_day_03h":
"price_next_day_03h",
127 "price_next_day_04h":
"price_next_day_04h",
128 "price_next_day_05h":
"price_next_day_05h",
129 "price_next_day_06h":
"price_next_day_06h",
130 "price_next_day_07h":
"price_next_day_07h",
131 "price_next_day_08h":
"price_next_day_08h",
132 "price_next_day_09h":
"price_next_day_09h",
133 "price_next_day_10h":
"price_next_day_10h",
134 "price_next_day_11h":
"price_next_day_11h",
135 "price_next_day_12h":
"price_next_day_12h",
136 "price_next_day_13h":
"price_next_day_13h",
137 "price_next_day_14h":
"price_next_day_14h",
138 "price_next_day_15h":
"price_next_day_15h",
139 "price_next_day_16h":
"price_next_day_16h",
140 "price_next_day_17h":
"price_next_day_17h",
141 "price_next_day_18h":
"price_next_day_18h",
142 "price_next_day_19h":
"price_next_day_19h",
143 "price_next_day_20h":
"price_next_day_20h",
144 "price_next_day_21h":
"price_next_day_21h",
145 "price_next_day_22h":
"price_next_day_22h",
146 "price_next_day_23h":
"price_next_day_23h",
151 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
153 """Set up the electricity price sensor from config_entry."""
154 coordinator: ElecPricesDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
155 sensors = [
ElecPriceSensor(coordinator, SENSOR_TYPES[0], entry.unique_id)]
156 if coordinator.api.using_private_api:
159 for sensor_desc
in SENSOR_TYPES[1:]
165 """Class to hold the prices of electricity as a sensor."""
167 _attr_has_entity_name =
True
171 coordinator: ElecPricesDataUpdateCoordinator,
172 description: SensorEntityDescription,
173 unique_id: str |
None,
175 """Initialize ESIOS sensor."""
181 configuration_url=
"https://api.esios.ree.es",
182 entry_type=DeviceEntryType.SERVICE,
183 identifiers={(DOMAIN, coordinator.entry_id)},
190 """Return if entity is available."""
191 return self.coordinator.data.availability.get(
196 """Handle entity which will be added."""
199 self.coordinator.api.update_active_sensors(self.
entity_descriptionentity_description.key,
True)
201 lambda: self.coordinator.api.update_active_sensors(
213 "Setup of ESIOS sensor %s (%s, unique_id: %s)",
221 """Update the sensor state, by selecting the current price for this hour."""
222 self.coordinator.api.process_state_and_attributes(
229 """Return the state of the sensor."""
234 """Return the state attributes."""
235 sensor_attributes = self.coordinator.api.sensor_attributes.get(
239 _PRICE_SENSOR_ATTRIBUTES_MAP[key]: value
240 for key, value
in sensor_attributes.items()
241 if key
in _PRICE_SENSOR_ATTRIBUTES_MAP
None async_added_to_hass(self)
StateType native_value(self)
Mapping[str, Any] extra_state_attributes(self)
None update_current_price(self, datetime now)
None __init__(self, ElecPricesDataUpdateCoordinator coordinator, SensorEntityDescription description, str|None unique_id)
None async_write_ha_state(self)
None async_on_remove(self, CALLBACK_TYPE func)
str make_sensor_unique_id(str|None config_entry_id, str sensor_key)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
CALLBACK_TYPE async_track_time_change(HomeAssistant hass, Callable[[datetime], Coroutine[Any, Any, None]|None] action, Any|None hour=None, Any|None minute=None, Any|None second=None)