hass.tibber_prices/custom_components/tibber_prices/utils/__init__.py
Julian Pawlowski abb02083a7 feat(sensors): always show both mean and median in average sensor attributes
Implemented configurable display format (mean/median/both) while always
calculating and exposing both price_mean and price_median attributes.

Core changes:
- utils/average.py: Refactored calculate_mean_median() to always return both
  values, added comprehensive None handling (117 lines changed)
- sensor/attributes/helpers.py: Always include both attributes regardless of
  user display preference (41 lines)
- sensor/core.py: Dynamic _unrecorded_attributes based on display setting
  (55 lines), extracted helper methods to reduce complexity
- Updated all calculators (rolling_hour, trend, volatility, window_24h) to
  use new always-both approach

Impact: Users can switch display format in UI without losing historical data.
Automation authors always have access to both statistical measures.
2025-12-18 15:12:30 +00:00

65 lines
2 KiB
Python

"""
Pure data transformation utilities for Tibber Prices integration.
This package contains stateless, pure functions for data processing:
- Time-window calculations (trailing/leading averages, min/max)
- Price enrichment (differences, volatility, rating levels)
- Statistical analysis (aggregation, trends)
These functions operate on raw data structures (dicts, lists) and do NOT depend on:
- Home Assistant entities or state management
- Configuration entries or coordinators
- Translation systems or UI-specific logic
For entity-specific utilities (icons, colors, attributes), see entity_utils/ package.
"""
from __future__ import annotations
from .average import (
calculate_current_leading_max,
calculate_current_leading_mean,
calculate_current_leading_min,
calculate_current_trailing_max,
calculate_current_trailing_mean,
calculate_current_trailing_min,
calculate_mean,
calculate_median,
calculate_next_n_hours_mean,
)
from .price import (
aggregate_period_levels,
aggregate_period_ratings,
aggregate_price_levels,
aggregate_price_rating,
calculate_difference_percentage,
calculate_price_trend,
calculate_rating_level,
calculate_trailing_average_for_interval,
calculate_volatility_level,
enrich_price_info_with_differences,
find_price_data_for_interval,
)
__all__ = [
"aggregate_period_levels",
"aggregate_period_ratings",
"aggregate_price_levels",
"aggregate_price_rating",
"calculate_current_leading_max",
"calculate_current_leading_mean",
"calculate_current_leading_min",
"calculate_current_trailing_max",
"calculate_current_trailing_mean",
"calculate_current_trailing_min",
"calculate_difference_percentage",
"calculate_mean",
"calculate_median",
"calculate_next_n_hours_mean",
"calculate_price_trend",
"calculate_rating_level",
"calculate_trailing_average_for_interval",
"calculate_volatility_level",
"enrich_price_info_with_differences",
"find_price_data_for_interval",
]