from datetime import datetime from typing import Literal from pydantic import BaseModel, Field class SmartPlugBase(BaseModel): name: str = Field(..., min_length=1, max_length=100) ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") printer_id: int | None = None enabled: bool = True auto_on: bool = True auto_off: bool = True off_delay_mode: Literal["time", "temperature"] = "time" off_delay_minutes: int = Field(default=5, ge=0, le=60) off_temp_threshold: int = Field(default=70, ge=30, le=150) username: str | None = None password: str | None = None class SmartPlugCreate(SmartPlugBase): pass class SmartPlugUpdate(BaseModel): name: str | None = None ip_address: str | None = None printer_id: int | None = None enabled: bool | None = None auto_on: bool | None = None auto_off: bool | None = None off_delay_mode: Literal["time", "temperature"] | None = None off_delay_minutes: int | None = Field(default=None, ge=0, le=60) off_temp_threshold: int | None = Field(default=None, ge=30, le=150) username: str | None = None password: str | None = None class SmartPlugResponse(SmartPlugBase): id: int last_state: str | None = None last_checked: datetime | None = None auto_off_executed: bool = False # True when auto-off was triggered after print created_at: datetime updated_at: datetime class Config: from_attributes = True class SmartPlugControl(BaseModel): action: Literal["on", "off", "toggle"] class SmartPlugEnergy(BaseModel): """Energy monitoring data from a smart plug.""" power: float | None = None # Current watts voltage: float | None = None # Volts current: float | None = None # Amps today: float | None = None # kWh used today yesterday: float | None = None # kWh used yesterday total: float | None = None # Total kWh factor: float | None = None # Power factor (0-1) apparent_power: float | None = None # VA reactive_power: float | None = None # VAr class SmartPlugStatus(BaseModel): state: str | None = None # "ON", "OFF", or None if unreachable reachable: bool = True device_name: str | None = None energy: SmartPlugEnergy | None = None # Energy data if available class SmartPlugTestConnection(BaseModel): ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") username: str | None = None password: str | None = None