mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-05-28 18:43:40 +00:00
Remove unused functions, constants, and entity definitions that were left over from previous refactorings. All removed code was either superseded by better implementations or never actually called. Removed functions: - entity_utils/helpers.py: translate_level(), translate_rating_level() (HA handles ENUM translation automatically via translations/*.json) - entity_utils/attributes.py: build_timestamp_attribute(), build_period_attributes() (superseded by inline implementations) - sensor/helpers.py: get_hourly_price_value(), aggregate_window_data() (replaced by Calculator Pattern in sensor/calculators/) Removed constants and definitions: - const.py: CONF_CHART_DATA_CONFIG (DATA_CHART_CONFIG is the active one), PRICE_LEVEL_OPTIONS, PRICE_RATING_OPTIONS, VOLATILITY_OPTIONS, PRICE_TREND_OPTIONS (never imported; options defined inline in definitions.py due to HA import timing constraints), async_get_home_type_translation() (sync version used instead) - coordinator/core.py: FRESH_TO_CACHED_SECONDS (leftover from old caching strategy, never referenced) - switch/definitions.py: BEST_PRICE_SWITCH_ENTITIES (duplicate of BEST_PRICE_SWITCH_ENTITY_DESCRIPTIONS using base class instead of custom TibberPricesSwitchEntityDescription subclass) Cleanup: - entity_utils/__init__.py: Remove exports for deleted functions - sensor/helpers.py: Remove now-unused imports (timedelta, get_intervals_for_day_offsets, get_price_value, Callable) - entity_utils/helpers.py: Remove unused get_price_level_translation import after translate_level() removal - sensor/definitions.py: Update 7x "Keep in sync with *_OPTIONS" comments to reference individual PRICE_LEVEL_*/PRICE_RATING_*/ VOLATILITY_* constants instead Impact: No user-visible changes. Reduces codebase by ~130 lines. Improves maintainability by eliminating misleading dead code.
102 lines
3.2 KiB
Python
102 lines
3.2 KiB
Python
"""
|
|
Common helper functions for entities across platforms.
|
|
|
|
This module provides utility functions used by both sensor and binary_sensor platforms:
|
|
- Price value conversion (major/subunit currency units)
|
|
|
|
- Time-based calculations (rolling hour center index)
|
|
|
|
These functions operate on entity-level concepts (states, translations) but are
|
|
platform-agnostic and can be used by both sensor and binary_sensor platforms.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
from custom_components.tibber_prices.const import get_display_unit_factor
|
|
|
|
if TYPE_CHECKING:
|
|
from datetime import datetime
|
|
|
|
from custom_components.tibber_prices.coordinator.time_service import TibberPricesTimeService
|
|
from custom_components.tibber_prices.data import TibberPricesConfigEntry
|
|
from homeassistant.config_entries import ConfigEntry
|
|
|
|
|
|
def get_price_value(
|
|
price: float,
|
|
*,
|
|
in_euro: bool | None = None,
|
|
config_entry: ConfigEntry | TibberPricesConfigEntry | None = None,
|
|
) -> float:
|
|
"""
|
|
Convert price based on unit.
|
|
|
|
NOTE: This function supports two modes for backward compatibility:
|
|
1. Legacy mode: in_euro=True/False (hardcoded conversion)
|
|
2. New mode: config_entry (config-driven conversion)
|
|
|
|
New code should use get_display_unit_factor(config_entry) directly.
|
|
|
|
Args:
|
|
price: Price value to convert.
|
|
in_euro: (Legacy) If True, return in base currency; if False, in subunit currency.
|
|
config_entry: (New) Config entry to get display unit configuration.
|
|
|
|
Returns:
|
|
Price in requested unit (major or subunit currency units).
|
|
|
|
"""
|
|
# Legacy mode: use in_euro parameter
|
|
if in_euro is not None:
|
|
return price if in_euro else round(price * 100, 2)
|
|
|
|
# New mode: use config_entry
|
|
if config_entry is not None:
|
|
factor = get_display_unit_factor(config_entry)
|
|
return round(price * factor, 2)
|
|
|
|
# Fallback: default to subunit currency (backward compatibility)
|
|
return round(price * 100, 2)
|
|
|
|
|
|
def find_rolling_hour_center_index(
|
|
all_prices: list[dict],
|
|
current_time: datetime,
|
|
hour_offset: int,
|
|
*,
|
|
time: TibberPricesTimeService,
|
|
) -> int | None:
|
|
"""
|
|
Find the center index for the rolling hour window.
|
|
|
|
Args:
|
|
all_prices: List of all price interval dictionaries with 'startsAt' key
|
|
current_time: Current datetime to find the current interval
|
|
hour_offset: Number of hours to offset from current interval (can be negative)
|
|
time: TibberPricesTimeService instance (required)
|
|
|
|
Returns:
|
|
Index of the center interval for the rolling hour window, or None if not found
|
|
|
|
"""
|
|
# Round to nearest interval boundary to handle edge cases where HA schedules
|
|
# us slightly before the boundary (e.g., 14:59:59.999 → 15:00:00)
|
|
target_time = time.round_to_nearest_quarter(current_time)
|
|
current_idx = None
|
|
|
|
for idx, price_data in enumerate(all_prices):
|
|
starts_at = time.get_interval_time(price_data)
|
|
if starts_at is None:
|
|
continue
|
|
|
|
# Exact match after rounding
|
|
if starts_at == target_time:
|
|
current_idx = idx
|
|
break
|
|
|
|
if current_idx is None:
|
|
return None
|
|
|
|
return current_idx + (hour_offset * 4)
|