mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-29 21:03:40 +00:00
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.
41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
"""Helper functions for sensor attributes."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
if TYPE_CHECKING:
|
|
from custom_components.tibber_prices.data import TibberPricesConfigEntry
|
|
|
|
|
|
def add_alternate_average_attribute(
|
|
attributes: dict,
|
|
cached_data: dict,
|
|
base_key: str,
|
|
*,
|
|
config_entry: TibberPricesConfigEntry, # noqa: ARG001
|
|
) -> None:
|
|
"""
|
|
Add both average values (mean and median) as attributes.
|
|
|
|
This ensures automations work consistently regardless of which value
|
|
is displayed in the state. Both values are always available as attributes.
|
|
|
|
Note: To avoid duplicate recording, the value used as state should be
|
|
excluded from recorder via dynamic _unrecorded_attributes in sensor core.
|
|
|
|
Args:
|
|
attributes: Dictionary to add attribute to
|
|
cached_data: Cached calculation data containing mean/median values
|
|
base_key: Base key for cached values (e.g., "average_price_today", "rolling_hour_0")
|
|
config_entry: Config entry for user preferences (used to determine which value is in state)
|
|
|
|
"""
|
|
# Always add both mean and median values as attributes
|
|
mean_value = cached_data.get(f"{base_key}_mean")
|
|
if mean_value is not None:
|
|
attributes["price_mean"] = mean_value
|
|
|
|
median_value = cached_data.get(f"{base_key}_median")
|
|
if median_value is not None:
|
|
attributes["price_median"] = median_value
|