smart_plug.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from datetime import datetime
  2. from typing import Literal
  3. from pydantic import BaseModel, Field
  4. class SmartPlugBase(BaseModel):
  5. name: str = Field(..., min_length=1, max_length=100)
  6. ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
  7. printer_id: int | None = None
  8. enabled: bool = True
  9. auto_on: bool = True
  10. auto_off: bool = True
  11. off_delay_mode: Literal["time", "temperature"] = "time"
  12. off_delay_minutes: int = Field(default=5, ge=0, le=60)
  13. off_temp_threshold: int = Field(default=70, ge=30, le=150)
  14. username: str | None = None
  15. password: str | None = None
  16. class SmartPlugCreate(SmartPlugBase):
  17. pass
  18. class SmartPlugUpdate(BaseModel):
  19. name: str | None = None
  20. ip_address: str | None = None
  21. printer_id: int | None = None
  22. enabled: bool | None = None
  23. auto_on: bool | None = None
  24. auto_off: bool | None = None
  25. off_delay_mode: Literal["time", "temperature"] | None = None
  26. off_delay_minutes: int | None = Field(default=None, ge=0, le=60)
  27. off_temp_threshold: int | None = Field(default=None, ge=30, le=150)
  28. username: str | None = None
  29. password: str | None = None
  30. class SmartPlugResponse(SmartPlugBase):
  31. id: int
  32. last_state: str | None = None
  33. last_checked: datetime | None = None
  34. created_at: datetime
  35. updated_at: datetime
  36. class Config:
  37. from_attributes = True
  38. class SmartPlugControl(BaseModel):
  39. action: Literal["on", "off", "toggle"]
  40. class SmartPlugStatus(BaseModel):
  41. state: str | None = None # "ON", "OFF", or None if unreachable
  42. reachable: bool = True
  43. device_name: str | None = None
  44. class SmartPlugTestConnection(BaseModel):
  45. ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
  46. username: str | None = None
  47. password: str | None = None