from datetime import datetime from typing import Optional from pydantic import BaseModel, Field class EnviroReading(BaseModel): time: datetime node_id: str temperature_c: Optional[float] = None humidity_percent: Optional[float] = None pressure_pa: Optional[float] = None wind_speed_ms: Optional[float] = None wind_direction: Optional[int] = None pm25_ugm3: Optional[float] = None pm10_ugm3: Optional[float] = None gas_resistance_kohm: Optional[float] = None battery_voltage: Optional[float] = None solar_voltage: Optional[float] = None class Config: from_attributes = True class Node(BaseModel): id: Optional[str] = None mesh_node_id: str name: Optional[str] = None lat: Optional[float] = None lon: Optional[float] = None hardware_revision: str = "v1.0" installed_at: Optional[datetime] = None last_seen: Optional[datetime] = None is_active: bool = True class Config: from_attributes = True class IngestEnviroPayload(BaseModel): type: str = Field(default="enviro_reading") node_id: str received_at: datetime hop_count: Optional[int] = None lat: Optional[float] = None lon: Optional[float] = None payload: EnviroReading