60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
from datetime import datetime, timezone
|
|
from enum import Enum
|
|
from typing import List
|
|
|
|
from sqlmodel import SQLModel, Field
|
|
|
|
from models.station import StationListResponse
|
|
|
|
|
|
def utc_now() -> datetime:
|
|
return datetime.now(timezone.utc)
|
|
|
|
class MeasurementResolution(str, Enum):
|
|
hourly = "hourly"
|
|
daily = "daily"
|
|
weekly = "weekly"
|
|
monthly = "monthly"
|
|
yearly = "yearly"
|
|
|
|
|
|
class IndoorMeasurement(SQLModel, table=True):
|
|
id: int | None = Field(default=None, primary_key=True)
|
|
station_id: int = Field(foreign_key="station.id")
|
|
timestamp: datetime = Field(default_factory=utc_now)
|
|
temperature: float | None= Field(default=None)
|
|
humidity: float| None = Field(default=None)
|
|
|
|
class OutdoorMeasurement(SQLModel, table=True):
|
|
id: int | None = Field(default=None, primary_key=True)
|
|
station_id : int= Field(foreign_key="station.id")
|
|
temperature: float| None = Field(default=None)
|
|
humidity: float | None = Field(default=None)
|
|
pressure: float| None = Field(default=None)
|
|
timestamp: datetime = Field(default_factory=utc_now)
|
|
|
|
class IndoorMeasurementCreateRequest(SQLModel):
|
|
mac: str
|
|
temperature: float
|
|
humidity: float
|
|
|
|
|
|
class OutdoorMeasurementCreateRequest(SQLModel):
|
|
mac: str
|
|
temperature: float
|
|
humidity: float | None = None
|
|
pressure: float | None = None
|
|
|
|
class MeasurementResponse(SQLModel):
|
|
temperature: float
|
|
humidity: float | None = None
|
|
pressure: float | None = None
|
|
timestamp: datetime
|
|
|
|
class StationMeasurementResponse(SQLModel):
|
|
station: StationListResponse
|
|
measurements: list[MeasurementResponse]
|
|
indoor: bool
|
|
|
|
class MeasurementListResponse(SQLModel):
|
|
stations: list[StationMeasurementResponse] |