smart_plug.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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 SmartPlugEnergy(BaseModel):
  41. """Energy monitoring data from a smart plug."""
  42. power: float | None = None # Current watts
  43. voltage: float | None = None # Volts
  44. current: float | None = None # Amps
  45. today: float | None = None # kWh used today
  46. yesterday: float | None = None # kWh used yesterday
  47. total: float | None = None # Total kWh
  48. factor: float | None = None # Power factor (0-1)
  49. apparent_power: float | None = None # VA
  50. reactive_power: float | None = None # VAr
  51. class SmartPlugStatus(BaseModel):
  52. state: str | None = None # "ON", "OFF", or None if unreachable
  53. reachable: bool = True
  54. device_name: str | None = None
  55. energy: SmartPlugEnergy | None = None # Energy data if available
  56. class SmartPlugTestConnection(BaseModel):
  57. ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
  58. username: str | None = None
  59. password: str | None = None