smart_plug.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. auto_off_executed: bool = False # True when auto-off was triggered after print
  35. created_at: datetime
  36. updated_at: datetime
  37. class Config:
  38. from_attributes = True
  39. class SmartPlugControl(BaseModel):
  40. action: Literal["on", "off", "toggle"]
  41. class SmartPlugEnergy(BaseModel):
  42. """Energy monitoring data from a smart plug."""
  43. power: float | None = None # Current watts
  44. voltage: float | None = None # Volts
  45. current: float | None = None # Amps
  46. today: float | None = None # kWh used today
  47. yesterday: float | None = None # kWh used yesterday
  48. total: float | None = None # Total kWh
  49. factor: float | None = None # Power factor (0-1)
  50. apparent_power: float | None = None # VA
  51. reactive_power: float | None = None # VAr
  52. class SmartPlugStatus(BaseModel):
  53. state: str | None = None # "ON", "OFF", or None if unreachable
  54. reachable: bool = True
  55. device_name: str | None = None
  56. energy: SmartPlugEnergy | None = None # Energy data if available
  57. class SmartPlugTestConnection(BaseModel):
  58. ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
  59. username: str | None = None
  60. password: str | None = None