| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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
- 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
|