1 """The EnergyZero services."""
3 from __future__
import annotations
5 from datetime
import date, datetime
7 from functools
import partial
8 from typing
import Final
10 from energyzero
import Electricity, Gas, VatOption
11 import voluptuous
as vol
25 from .const
import DOMAIN
26 from .coordinator
import EnergyZeroDataUpdateCoordinator
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_SERVICE_NAME: Final =
"get_energy_prices"
35 SERVICE_SCHEMA: Final = vol.Schema(
37 vol.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector(
39 "integration": DOMAIN,
42 vol.Required(ATTR_INCL_VAT): bool,
43 vol.Optional(ATTR_START): str,
44 vol.Optional(ATTR_END): str,
56 def __get_date(date_input: str |
None) -> date | datetime:
59 return dt_util.now().
date()
61 if value := dt_util.parse_datetime(date_input):
65 translation_domain=DOMAIN,
66 translation_key=
"invalid_date",
67 translation_placeholders={
74 """Serialize prices."""
78 key:
str(value)
if isinstance(value, datetime)
else value
79 for key, value
in timestamp_price.items()
81 for timestamp_price
in prices.timestamp_prices
87 hass: HomeAssistant, call: ServiceCall
88 ) -> EnergyZeroDataUpdateCoordinator:
89 """Get the coordinator from the entry."""
90 entry_id: str = call.data[ATTR_CONFIG_ENTRY]
91 entry: ConfigEntry |
None = hass.config_entries.async_get_entry(entry_id)
95 translation_domain=DOMAIN,
96 translation_key=
"invalid_config_entry",
97 translation_placeholders={
98 "config_entry": entry_id,
101 if entry.state != ConfigEntryState.LOADED:
103 translation_domain=DOMAIN,
104 translation_key=
"unloaded_config_entry",
105 translation_placeholders={
106 "config_entry": entry.title,
110 coordinator: EnergyZeroDataUpdateCoordinator = hass.data[DOMAIN][entry_id]
118 price_type: PriceType,
119 ) -> ServiceResponse:
125 vat = VatOption.INCLUDE
127 if call.data.get(ATTR_INCL_VAT)
is False:
128 vat = VatOption.EXCLUDE
130 data: Electricity | Gas
132 if price_type == PriceType.GAS:
133 data = await coordinator.energyzero.gas_prices(
139 data = await coordinator.energyzero.energy_prices(
150 """Set up EnergyZero services."""
152 hass.services.async_register(
155 partial(__get_prices, hass=hass, price_type=PriceType.GAS),
156 schema=SERVICE_SCHEMA,
157 supports_response=SupportsResponse.ONLY,
159 hass.services.async_register(
162 partial(__get_prices, hass=hass, price_type=PriceType.ENERGY),
163 schema=SERVICE_SCHEMA,
164 supports_response=SupportsResponse.ONLY,
None async_setup_services(HomeAssistant hass)
EnergyZeroDataUpdateCoordinator __get_coordinator(HomeAssistant hass, ServiceCall call)
ServiceResponse __get_prices(ServiceCall call, *HomeAssistant hass, PriceType price_type)
date|datetime __get_date(str|None date_input)
ServiceResponse __serialize_prices(Electricity|Gas prices)