1 """Services for easyEnergy integration."""
3 from __future__
import annotations
5 from datetime
import date, datetime
7 from functools
import partial
8 from typing
import Final
10 from easyenergy
import Electricity, Gas, VatOption
11 import voluptuous
as vol
25 from .const
import DOMAIN
26 from .coordinator
import EasyEnergyDataUpdateCoordinator
28 ATTR_CONFIG_ENTRY: Final =
"config_entry"
29 ATTR_START: Final =
"start"
30 ATTR_END: Final =
"end"
31 ATTR_INCL_VAT: Final =
"incl_vat"
33 GAS_SERVICE_NAME: Final =
"get_gas_prices"
34 ENERGY_USAGE_SERVICE_NAME: Final =
"get_energy_usage_prices"
35 ENERGY_RETURN_SERVICE_NAME: Final =
"get_energy_return_prices"
36 SERVICE_SCHEMA: Final = vol.Schema(
38 vol.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector(
40 "integration": DOMAIN,
43 vol.Required(ATTR_INCL_VAT): bool,
44 vol.Optional(ATTR_START): str,
45 vol.Optional(ATTR_END): str,
53 ENERGY_USAGE =
"energy_usage"
54 ENERGY_RETURN =
"energy_return"
58 def __get_date(date_input: str |
None) -> date | datetime:
61 return dt_util.now().
date()
63 if value := dt_util.parse_datetime(date_input):
67 "Invalid datetime provided.",
68 translation_domain=DOMAIN,
69 translation_key=
"invalid_date",
70 translation_placeholders={
77 """Serialize prices to service response."""
81 key:
str(value)
if isinstance(value, datetime)
else value
82 for key, value
in timestamp_price.items()
84 for timestamp_price
in prices
90 hass: HomeAssistant, call: ServiceCall
91 ) -> EasyEnergyDataUpdateCoordinator:
92 """Get the coordinator from the entry."""
93 entry_id: str = call.data[ATTR_CONFIG_ENTRY]
94 entry: ConfigEntry |
None = hass.config_entries.async_get_entry(entry_id)
98 translation_domain=DOMAIN,
99 translation_key=
"invalid_config_entry",
100 translation_placeholders={
101 "config_entry": entry_id,
104 if entry.state != ConfigEntryState.LOADED:
106 translation_domain=DOMAIN,
107 translation_key=
"unloaded_config_entry",
108 translation_placeholders={
109 "config_entry": entry.title,
113 coordinator: EasyEnergyDataUpdateCoordinator = hass.data[DOMAIN][entry_id]
121 price_type: PriceType,
122 ) -> ServiceResponse:
123 """Get prices from easyEnergy."""
129 vat = VatOption.INCLUDE
130 if call.data.get(ATTR_INCL_VAT)
is False:
131 vat = VatOption.EXCLUDE
133 data: Electricity | Gas
135 if price_type == PriceType.GAS:
136 data = await coordinator.easyenergy.gas_prices(
142 data = await coordinator.easyenergy.energy_prices(
148 if price_type == PriceType.ENERGY_USAGE:
155 """Set up services for easyEnergy integration."""
157 hass.services.async_register(
160 partial(__get_prices, hass=hass, price_type=PriceType.GAS),
161 schema=SERVICE_SCHEMA,
162 supports_response=SupportsResponse.ONLY,
164 hass.services.async_register(
166 ENERGY_USAGE_SERVICE_NAME,
167 partial(__get_prices, hass=hass, price_type=PriceType.ENERGY_USAGE),
168 schema=SERVICE_SCHEMA,
169 supports_response=SupportsResponse.ONLY,
171 hass.services.async_register(
173 ENERGY_RETURN_SERVICE_NAME,
174 partial(__get_prices, hass=hass, price_type=PriceType.ENERGY_RETURN),
175 schema=SERVICE_SCHEMA,
176 supports_response=SupportsResponse.ONLY,
ServiceResponse __get_prices(ServiceCall call, *HomeAssistant hass, PriceType price_type)
EasyEnergyDataUpdateCoordinator __get_coordinator(HomeAssistant hass, ServiceCall call)
None async_setup_services(HomeAssistant hass)
date|datetime __get_date(str|None date_input)
ServiceResponse __serialize_prices(list[dict[str, float|datetime]] prices)