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