smart_plug.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. # Power alerts
  17. power_alert_enabled: bool = False
  18. power_alert_high: float | None = Field(default=None, ge=0, le=5000) # Alert when power > this (watts)
  19. power_alert_low: float | None = Field(default=None, ge=0, le=5000) # Alert when power < this (watts)
  20. # Schedule
  21. schedule_enabled: bool = False
  22. schedule_on_time: str | None = Field(default=None, pattern=r"^([01]\d|2[0-3]):[0-5]\d$") # HH:MM format
  23. schedule_off_time: str | None = Field(default=None, pattern=r"^([01]\d|2[0-3]):[0-5]\d$") # HH:MM format
  24. class SmartPlugCreate(SmartPlugBase):
  25. pass
  26. class SmartPlugUpdate(BaseModel):
  27. name: str | None = None
  28. ip_address: str | None = None
  29. printer_id: int | None = None
  30. enabled: bool | None = None
  31. auto_on: bool | None = None
  32. auto_off: bool | None = None
  33. off_delay_mode: Literal["time", "temperature"] | None = None
  34. off_delay_minutes: int | None = Field(default=None, ge=0, le=60)
  35. off_temp_threshold: int | None = Field(default=None, ge=30, le=150)
  36. username: str | None = None
  37. password: str | None = None
  38. # Power alerts
  39. power_alert_enabled: bool | None = None
  40. power_alert_high: float | None = Field(default=None, ge=0, le=5000)
  41. power_alert_low: float | None = Field(default=None, ge=0, le=5000)
  42. # Schedule
  43. schedule_enabled: bool | None = None
  44. schedule_on_time: str | None = Field(default=None, pattern=r"^([01]\d|2[0-3]):[0-5]\d$")
  45. schedule_off_time: str | None = Field(default=None, pattern=r"^([01]\d|2[0-3]):[0-5]\d$")
  46. class SmartPlugResponse(SmartPlugBase):
  47. id: int
  48. last_state: str | None = None
  49. last_checked: datetime | None = None
  50. auto_off_executed: bool = False # True when auto-off was triggered after print
  51. power_alert_last_triggered: datetime | None = None
  52. created_at: datetime
  53. updated_at: datetime
  54. class Config:
  55. from_attributes = True
  56. class SmartPlugControl(BaseModel):
  57. action: Literal["on", "off", "toggle"]
  58. class SmartPlugEnergy(BaseModel):
  59. """Energy monitoring data from a smart plug."""
  60. power: float | None = None # Current watts
  61. voltage: float | None = None # Volts
  62. current: float | None = None # Amps
  63. today: float | None = None # kWh used today
  64. yesterday: float | None = None # kWh used yesterday
  65. total: float | None = None # Total kWh
  66. factor: float | None = None # Power factor (0-1)
  67. apparent_power: float | None = None # VA
  68. reactive_power: float | None = None # VAr
  69. class SmartPlugStatus(BaseModel):
  70. state: str | None = None # "ON", "OFF", or None if unreachable
  71. reachable: bool = True
  72. device_name: str | None = None
  73. energy: SmartPlugEnergy | None = None # Energy data if available
  74. class SmartPlugTestConnection(BaseModel):
  75. ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
  76. username: str | None = None
  77. password: str | None = None