46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
from datetime import datetime
|
|
from decimal import Decimal
|
|
from enum import StrEnum
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
|
|
class ReadingSource(StrEnum):
|
|
CSV = "csv"
|
|
API_CURRENT = "api_current"
|
|
API_HISTORY = "api_history"
|
|
|
|
|
|
class ReadingDataQuality(StrEnum):
|
|
GOOD = "good"
|
|
PARTIAL = "partial"
|
|
DEGRADED = "degraded"
|
|
CRITICAL = "critical"
|
|
|
|
|
|
class ReadingResponse(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
reading_id: int
|
|
site_id: str
|
|
timestamp: datetime
|
|
source: ReadingSource
|
|
consumption_kw: float | None
|
|
consumption_kwh: float | None
|
|
# Piège : `Decimal` (miroir de `Numeric(14, 2)` en base, pour ne pas arrondir un montant)
|
|
# sérialise en chaîne dans le JSON, pas en nombre — un consommateur qui ferait un `parseFloat`
|
|
# naïf perdrait la précision que ce choix visait à garder.
|
|
consumption_euros: Decimal | None
|
|
voltage_v: float | None
|
|
current_a: float | None
|
|
power_factor: float | None
|
|
temperature_celsius: float | None
|
|
humidity_percent: float | None
|
|
solar_irradiance_wm2: float | None
|
|
is_working_hours: bool | None
|
|
data_quality: ReadingDataQuality | None
|
|
null_reasons: list[str] | None
|
|
imputed_values: dict[str, Any] | None
|
|
imputation_method: str | None
|