smart_plug.py 3.6 KB

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