mirror of
https://github.com/home-assistant/core.git
synced 2025-06-04 21:27:10 +00:00

* Add circular mean statistics * fixes * Add has_circular_mean and fix tests * Fix mypy * Rename to MEASUREMENT_ANGLE * Fix kitchen_sink tests * Fix sensor tests * for testing only * Revert ws command change * Apply suggestions * test only * add custom handling for postgres * fix recursion limit * Check if column is already available * Set default false and not nullable for has_circular_mean * Proper fix to be backwards compatible * Fix value is None * Align with schema * Remove has_circular_mean from test schemas as it's not required anymore * fix wrong column type * Use correct variable to reduce stats * Add guard that the uom is matching a valid one from the state class * Add some tests * Fix tests again * Use mean_type in StatisticsMetato difference between different mean type algorithms * Fix leftovers * Fix kitchen_sink tests * Fix postgres * Add circular mean test * Add mean_type_changed stats issue * Align the attributes with unit_changed * Fix mean_type_change stats issue * Add missing sensor recorder tests * Add test_statistic_during_period_circular_mean * Add mean_weight * Add test_statistic_during_period_hole_circular_mean * Use seperate migration step to null has_mean * Typo ARITHMETIC * Implement requested changes * Implement requested changes * Split into #141444 * Add StatisticMeanType.NONE and forbid that mean_type can be None * Fix mean_type * Implement requested changes * Small leftover of latest StatisticMeanType changes
103 lines
2.2 KiB
Python
103 lines
2.2 KiB
Python
"""Models for statistics in the Recorder."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime, timedelta
|
|
from enum import IntEnum
|
|
from typing import Literal, NotRequired, TypedDict
|
|
|
|
|
|
class StatisticResult(TypedDict):
|
|
"""Statistic result data class.
|
|
|
|
Allows multiple datapoints for the same statistic_id.
|
|
"""
|
|
|
|
meta: StatisticMetaData
|
|
stat: StatisticData
|
|
|
|
|
|
class StatisticDataTimestampBase(TypedDict):
|
|
"""Mandatory fields for statistic data class with a timestamp."""
|
|
|
|
start_ts: float
|
|
|
|
|
|
class StatisticDataBase(TypedDict):
|
|
"""Mandatory fields for statistic data class."""
|
|
|
|
start: datetime
|
|
|
|
|
|
class StatisticMixIn(TypedDict, total=False):
|
|
"""Mandatory fields for statistic data class."""
|
|
|
|
state: float
|
|
sum: float
|
|
min: float
|
|
max: float
|
|
mean: float
|
|
mean_weight: float
|
|
|
|
|
|
class StatisticData(StatisticDataBase, StatisticMixIn, total=False):
|
|
"""Statistic data class."""
|
|
|
|
last_reset: datetime | None
|
|
|
|
|
|
class StatisticDataTimestamp(StatisticDataTimestampBase, StatisticMixIn, total=False):
|
|
"""Statistic data class with a timestamp."""
|
|
|
|
last_reset_ts: float | None
|
|
|
|
|
|
class StatisticMeanType(IntEnum):
|
|
"""Statistic mean type."""
|
|
|
|
NONE = 0
|
|
ARITHMETIC = 1
|
|
CIRCULAR = 2
|
|
|
|
|
|
class StatisticMetaData(TypedDict):
|
|
"""Statistic meta data class."""
|
|
|
|
# has_mean is deprecated, use mean_type instead. has_mean will be removed in 2026.4
|
|
has_mean: NotRequired[bool]
|
|
mean_type: StatisticMeanType
|
|
has_sum: bool
|
|
name: str | None
|
|
source: str
|
|
statistic_id: str
|
|
unit_of_measurement: str | None
|
|
|
|
|
|
class CalendarStatisticPeriod(TypedDict, total=False):
|
|
"""Statistic period definition."""
|
|
|
|
period: Literal["hour", "day", "week", "month", "year"]
|
|
offset: int
|
|
|
|
|
|
class FixedStatisticPeriod(TypedDict, total=False):
|
|
"""Statistic period definition."""
|
|
|
|
end_time: datetime
|
|
start_time: datetime
|
|
|
|
|
|
class RollingWindowStatisticPeriod(TypedDict, total=False):
|
|
"""Statistic period definition."""
|
|
|
|
duration: timedelta
|
|
offset: timedelta
|
|
|
|
|
|
class StatisticPeriod(TypedDict, total=False):
|
|
"""Statistic period definition."""
|
|
|
|
calendar: CalendarStatisticPeriod
|
|
fixed_period: FixedStatisticPeriod
|
|
rolling_window: RollingWindowStatisticPeriod
|