150 lines
4.2 KiB
Python
150 lines
4.2 KiB
Python
import logging
|
|
from datetime import datetime
|
|
|
|
from typing import Any
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse
|
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
|
import homeassistant.helpers.config_validation as cv
|
|
from homeassistant.util import dt as dt_util
|
|
|
|
from .const import _REGIONS
|
|
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def check_setting(value):
|
|
def validator(value):
|
|
c = any([i for i in value if i in list(_REGIONS.keys())])
|
|
if c is not True:
|
|
vol.Invalid(
|
|
f"{value} in not in on of the supported areas {','.join(_REGIONS.keys())}"
|
|
)
|
|
return value
|
|
|
|
return validator
|
|
|
|
|
|
HOURLY_SCHEMA = vol.Schema(
|
|
{
|
|
vol.Required("currency"): str,
|
|
vol.Required("date"): cv.date,
|
|
vol.Required("area"): check_setting(cv.ensure_list),
|
|
}
|
|
)
|
|
|
|
|
|
YEAR_SCHEMA = vol.Schema(
|
|
{
|
|
vol.Required("currency"): str,
|
|
vol.Required("year", default=dt_util.now().strftime("Y")): cv.matches_regex(
|
|
r"^[1|2]\d{3}$"
|
|
),
|
|
vol.Required("area"): check_setting(cv.ensure_list),
|
|
}
|
|
)
|
|
|
|
|
|
async def async_setup_services(hass: HomeAssistant):
|
|
_LOGGER.debug("Setting up services")
|
|
from .aio_price import AioPrices
|
|
|
|
client = async_get_clientsession(hass)
|
|
|
|
async def hourly(service_call: ServiceCall) -> Any:
|
|
sc = service_call.data
|
|
_LOGGER.debug("called hourly with %r", sc)
|
|
|
|
# Convert the date to datetime as the rest of the code expects a datetime. We will want to keep date as it easier for ppl to use.
|
|
end_date = datetime(
|
|
year=sc["date"].year, month=sc["date"].month, day=sc["date"].day
|
|
)
|
|
|
|
value = await AioPrices(sc["currency"], client).hourly(
|
|
areas=sc["area"], end_date=end_date, raw=True
|
|
)
|
|
|
|
_LOGGER.debug("Got value %r", value)
|
|
return value
|
|
|
|
async def yearly(service_call: ServiceCall):
|
|
sc = service_call.data
|
|
_LOGGER.debug("called yearly with %r", sc)
|
|
|
|
value = await AioPrices(sc["currency"], client).yearly(
|
|
areas=sc["area"], end_date=sc["year"]
|
|
)
|
|
|
|
_LOGGER.debug("Got value %r", value)
|
|
return value
|
|
|
|
async def weekly(service_call: ServiceCall):
|
|
sc = service_call.data
|
|
_LOGGER.debug("called weekly with %r", sc)
|
|
|
|
value = await AioPrices(sc["currency"], client).yearly(
|
|
areas=sc["area"], end_date=sc["year"]
|
|
)
|
|
|
|
_LOGGER.debug("Got value %r", value)
|
|
return value
|
|
|
|
async def monthly(service_call: ServiceCall):
|
|
sc = service_call.data
|
|
_LOGGER.debug("called monthly with %r", sc)
|
|
|
|
value = await AioPrices(sc["currency"], client).monthly(
|
|
areas=sc["area"], end_date=sc["year"]
|
|
)
|
|
_LOGGER.debug("Got value %r", value)
|
|
return value
|
|
|
|
async def daily(service_call: ServiceCall):
|
|
sc = service_call.data
|
|
_LOGGER.debug("called daily with %r", sc)
|
|
|
|
value = await AioPrices(sc["currency"], client).daily(
|
|
areas=sc["area"], end_date=sc["year"]
|
|
)
|
|
_LOGGER.debug("Got value %r", value)
|
|
return value
|
|
|
|
hass.services.async_register(
|
|
domain="nordpool",
|
|
service="hourly",
|
|
service_func=hourly,
|
|
schema=HOURLY_SCHEMA,
|
|
supports_response=SupportsResponse.OPTIONAL,
|
|
)
|
|
hass.services.async_register(
|
|
domain="nordpool",
|
|
service="yearly",
|
|
service_func=yearly,
|
|
schema=YEAR_SCHEMA,
|
|
supports_response=SupportsResponse.OPTIONAL,
|
|
)
|
|
hass.services.async_register(
|
|
domain="nordpool",
|
|
service="monthly",
|
|
service_func=monthly,
|
|
schema=YEAR_SCHEMA,
|
|
supports_response=SupportsResponse.OPTIONAL,
|
|
)
|
|
hass.services.async_register(
|
|
domain="nordpool",
|
|
service="daily",
|
|
service_func=daily,
|
|
schema=YEAR_SCHEMA,
|
|
supports_response=SupportsResponse.OPTIONAL,
|
|
)
|
|
hass.services.async_register(
|
|
domain="nordpool",
|
|
service="weekly",
|
|
service_func=weekly,
|
|
schema=YEAR_SCHEMA,
|
|
supports_response=SupportsResponse.OPTIONAL,
|
|
)
|