88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
"""Services for Jewish Calendar."""
|
|
|
|
import datetime
|
|
import logging
|
|
from typing import get_args
|
|
|
|
from hdate import HebrewDate
|
|
from hdate.omer import Nusach, Omer
|
|
from hdate.translator import Language, set_language
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.const import CONF_LANGUAGE, SUN_EVENT_SUNSET
|
|
from homeassistant.core import (
|
|
HomeAssistant,
|
|
ServiceCall,
|
|
ServiceResponse,
|
|
SupportsResponse,
|
|
callback,
|
|
)
|
|
from homeassistant.exceptions import HomeAssistantError
|
|
from homeassistant.helpers import config_validation as cv
|
|
from homeassistant.helpers.selector import LanguageSelector, LanguageSelectorConfig
|
|
from homeassistant.helpers.sun import get_astral_event_date
|
|
from homeassistant.util import dt as dt_util
|
|
|
|
from .const import ATTR_AFTER_SUNSET, ATTR_DATE, ATTR_NUSACH, DOMAIN, SERVICE_COUNT_OMER
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
OMER_SCHEMA = vol.Schema(
|
|
{
|
|
vol.Optional(ATTR_DATE): cv.date,
|
|
vol.Optional(ATTR_AFTER_SUNSET, default=True): cv.boolean,
|
|
vol.Required(ATTR_NUSACH, default="sfarad"): vol.In(
|
|
[nusach.name.lower() for nusach in Nusach]
|
|
),
|
|
vol.Optional(CONF_LANGUAGE, default="he"): LanguageSelector(
|
|
LanguageSelectorConfig(languages=list(get_args(Language)))
|
|
),
|
|
}
|
|
)
|
|
|
|
|
|
@callback
|
|
def async_setup_services(hass: HomeAssistant) -> None:
|
|
"""Set up the Jewish Calendar services."""
|
|
|
|
def is_after_sunset(hass: HomeAssistant) -> bool:
|
|
"""Determine if the current time is after sunset."""
|
|
now = dt_util.now()
|
|
today = now.date()
|
|
event_date = get_astral_event_date(hass, SUN_EVENT_SUNSET, today)
|
|
if event_date is None:
|
|
raise HomeAssistantError(
|
|
translation_domain=DOMAIN, translation_key="sunset_event"
|
|
)
|
|
sunset = dt_util.as_local(event_date)
|
|
_LOGGER.debug("Now: %s Sunset: %s", now, sunset)
|
|
return now > sunset
|
|
|
|
async def get_omer_count(call: ServiceCall) -> ServiceResponse:
|
|
"""Return the Omer blessing for a given date."""
|
|
date = call.data.get(ATTR_DATE, dt_util.now().date())
|
|
after_sunset = (
|
|
call.data[ATTR_AFTER_SUNSET]
|
|
if ATTR_DATE in call.data
|
|
else is_after_sunset(hass)
|
|
)
|
|
hebrew_date = HebrewDate.from_gdate(
|
|
date + datetime.timedelta(days=int(after_sunset))
|
|
)
|
|
nusach = Nusach[call.data[ATTR_NUSACH].upper()]
|
|
set_language(call.data[CONF_LANGUAGE])
|
|
omer = Omer(date=hebrew_date, nusach=nusach)
|
|
return {
|
|
"message": str(omer.count_str()),
|
|
"weeks": omer.week,
|
|
"days": omer.day,
|
|
"total_days": omer.total_days,
|
|
}
|
|
|
|
hass.services.async_register(
|
|
DOMAIN,
|
|
SERVICE_COUNT_OMER,
|
|
get_omer_count,
|
|
schema=OMER_SCHEMA,
|
|
supports_response=SupportsResponse.ONLY,
|
|
)
|