1 """Services for Tibber integration."""
3 from __future__
import annotations
6 from datetime
import datetime
7 from functools
import partial
8 from typing
import Any, Final
10 import voluptuous
as vol
22 from .const
import DOMAIN
24 PRICE_SERVICE_NAME =
"get_prices"
25 ATTR_START: Final =
"start"
26 ATTR_END: Final =
"end"
28 SERVICE_SCHEMA: Final = vol.Schema(
30 vol.Optional(ATTR_START): str,
31 vol.Optional(ATTR_END): str,
36 async
def __get_prices(call: ServiceCall, *, hass: HomeAssistant) -> ServiceResponse:
37 tibber_connection = hass.data[DOMAIN]
39 start =
__get_date(call.data.get(ATTR_START),
"start")
40 end =
__get_date(call.data.get(ATTR_END),
"end")
43 end = start + dt.timedelta(days=1)
45 tibber_prices: dict[str, Any] = {}
47 for tibber_home
in tibber_connection.get_homes(only_active=
True):
48 home_nickname = tibber_home.name
52 "start_time": starts_at,
54 "level": tibber_home.price_level.get(starts_at),
56 for starts_at, price
in tibber_home.price_total.items()
61 for price
in price_data
62 if start <= dt.datetime.fromisoformat(price[
"start_time"]) < end
64 tibber_prices[home_nickname] = selected_data
66 return {
"prices": tibber_prices}
69 def __get_date(date_input: str |
None, mode: str |
None) -> datetime:
73 increment = dt.timedelta(days=1)
75 increment = dt.timedelta()
76 return dt_util.start_of_local_day() + increment
78 if value := dt_util.parse_datetime(date_input):
79 return dt_util.as_local(value)
82 translation_domain=DOMAIN,
83 translation_key=
"invalid_date",
84 translation_placeholders={
92 """Set up services for Tibber integration."""
94 hass.services.async_register(
97 partial(__get_prices, hass=hass),
98 schema=SERVICE_SCHEMA,
99 supports_response=SupportsResponse.ONLY,
None async_setup_services(HomeAssistant hass)
ServiceResponse __get_prices(ServiceCall call, *HomeAssistant hass)
datetime __get_date(str|None date_input, str|None mode)