""" Service handlers for Tibber Prices integration. This package provides service endpoints for external integrations and data export: - Chart data export (get_chartdata) - ApexCharts YAML generation (get_apexcharts_yaml) - User data refresh (refresh_user_data) - Debug: Clear tomorrow data (debug_clear_tomorrow) - DevContainer only Architecture: - helpers.py: Common utilities (get_entry_and_data) - formatters.py: Data transformation and formatting functions - chartdata.py: Main data export service handler - apexcharts.py: ApexCharts card YAML generator - refresh_user_data.py: User data refresh handler - debug_clear_tomorrow.py: Debug tool for testing tomorrow refresh (dev only) """ from __future__ import annotations import os from typing import TYPE_CHECKING from custom_components.tibber_prices.const import DOMAIN from homeassistant.core import SupportsResponse, callback from .find_cheapest_block import ( FIND_CHEAPEST_BLOCK_SERVICE_NAME, FIND_CHEAPEST_BLOCK_SERVICE_SCHEMA, handle_find_cheapest_block, ) from .find_cheapest_hours import ( FIND_CHEAPEST_HOURS_SERVICE_NAME, FIND_CHEAPEST_HOURS_SERVICE_SCHEMA, handle_find_cheapest_hours, ) from .find_cheapest_schedule import ( FIND_CHEAPEST_SCHEDULE_SERVICE_NAME, FIND_CHEAPEST_SCHEDULE_SERVICE_SCHEMA, handle_find_cheapest_schedule, ) from .find_most_expensive_block import ( FIND_MOST_EXPENSIVE_BLOCK_SERVICE_NAME, FIND_MOST_EXPENSIVE_BLOCK_SERVICE_SCHEMA, handle_find_most_expensive_block, ) from .find_most_expensive_hours import ( FIND_MOST_EXPENSIVE_HOURS_SERVICE_NAME, FIND_MOST_EXPENSIVE_HOURS_SERVICE_SCHEMA, handle_find_most_expensive_hours, ) from .get_apexcharts_yaml import APEXCHARTS_SERVICE_SCHEMA, APEXCHARTS_YAML_SERVICE_NAME, handle_apexcharts_yaml from .get_chartdata import CHARTDATA_SERVICE_NAME, CHARTDATA_SERVICE_SCHEMA, handle_chartdata from .get_price import GET_PRICE_SERVICE_NAME, GET_PRICE_SERVICE_SCHEMA, handle_get_price from .plan_charging import PLAN_CHARGING_SERVICE_NAME, PLAN_CHARGING_SERVICE_SCHEMA, handle_plan_charging from .refresh_user_data import ( REFRESH_USER_DATA_SERVICE_NAME, REFRESH_USER_DATA_SERVICE_SCHEMA, handle_refresh_user_data, ) if TYPE_CHECKING: from homeassistant.core import HomeAssistant __all__ = [ "async_setup_services", ] # Check if running in development mode (DevContainer) _IS_DEV_MODE = os.environ.get("TIBBER_PRICES_DEV") == "1" @callback def async_setup_services(hass: HomeAssistant) -> None: """Set up services for Tibber Prices integration.""" hass.services.async_register( DOMAIN, APEXCHARTS_YAML_SERVICE_NAME, handle_apexcharts_yaml, schema=APEXCHARTS_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) hass.services.async_register( DOMAIN, CHARTDATA_SERVICE_NAME, handle_chartdata, schema=CHARTDATA_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) hass.services.async_register( DOMAIN, GET_PRICE_SERVICE_NAME, handle_get_price, schema=GET_PRICE_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) hass.services.async_register( DOMAIN, FIND_CHEAPEST_BLOCK_SERVICE_NAME, handle_find_cheapest_block, schema=FIND_CHEAPEST_BLOCK_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) hass.services.async_register( DOMAIN, FIND_CHEAPEST_HOURS_SERVICE_NAME, handle_find_cheapest_hours, schema=FIND_CHEAPEST_HOURS_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) hass.services.async_register( DOMAIN, FIND_CHEAPEST_SCHEDULE_SERVICE_NAME, handle_find_cheapest_schedule, schema=FIND_CHEAPEST_SCHEDULE_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) hass.services.async_register( DOMAIN, FIND_MOST_EXPENSIVE_BLOCK_SERVICE_NAME, handle_find_most_expensive_block, schema=FIND_MOST_EXPENSIVE_BLOCK_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) hass.services.async_register( DOMAIN, FIND_MOST_EXPENSIVE_HOURS_SERVICE_NAME, handle_find_most_expensive_hours, schema=FIND_MOST_EXPENSIVE_HOURS_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) hass.services.async_register( DOMAIN, PLAN_CHARGING_SERVICE_NAME, handle_plan_charging, schema=PLAN_CHARGING_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) hass.services.async_register( DOMAIN, REFRESH_USER_DATA_SERVICE_NAME, handle_refresh_user_data, schema=REFRESH_USER_DATA_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, ) # Debug services - only available in DevContainer (TIBBER_PRICES_DEV=1) if _IS_DEV_MODE: from .debug_clear_tomorrow import ( # noqa: PLC0415 - Conditional import for dev-only service DEBUG_CLEAR_TOMORROW_SERVICE_NAME, DEBUG_CLEAR_TOMORROW_SERVICE_SCHEMA, handle_debug_clear_tomorrow, ) hass.services.async_register( DOMAIN, DEBUG_CLEAR_TOMORROW_SERVICE_NAME, handle_debug_clear_tomorrow, schema=DEBUG_CLEAR_TOMORROW_SERVICE_SCHEMA, supports_response=SupportsResponse.ONLY, )