smart_plug.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from datetime import datetime
  2. from sqlalchemy import String, Boolean, Integer, DateTime, ForeignKey, func
  3. from sqlalchemy.orm import Mapped, mapped_column, relationship
  4. from backend.app.core.database import Base
  5. class SmartPlug(Base):
  6. """Tasmota smart plug for printer power control."""
  7. __tablename__ = "smart_plugs"
  8. id: Mapped[int] = mapped_column(primary_key=True)
  9. name: Mapped[str] = mapped_column(String(100))
  10. ip_address: Mapped[str] = mapped_column(String(45)) # IPv4/IPv6
  11. # Link to printer (1:1)
  12. printer_id: Mapped[int | None] = mapped_column(
  13. ForeignKey("printers.id", ondelete="SET NULL"), unique=True, nullable=True
  14. )
  15. # Automation settings
  16. enabled: Mapped[bool] = mapped_column(Boolean, default=True)
  17. auto_on: Mapped[bool] = mapped_column(Boolean, default=True) # Turn on at print start
  18. auto_off: Mapped[bool] = mapped_column(Boolean, default=True) # Turn off at print complete/fail
  19. # Turn-off delay mode: "time" or "temperature"
  20. off_delay_mode: Mapped[str] = mapped_column(String(20), default="time")
  21. off_delay_minutes: Mapped[int] = mapped_column(Integer, default=5) # For time mode
  22. off_temp_threshold: Mapped[int] = mapped_column(Integer, default=70) # For temp mode (°C)
  23. # Optional auth (some Tasmota configs require it)
  24. username: Mapped[str | None] = mapped_column(String(50), nullable=True)
  25. password: Mapped[str | None] = mapped_column(String(100), nullable=True)
  26. # Status tracking
  27. last_state: Mapped[str | None] = mapped_column(String(10), nullable=True) # "ON"/"OFF"
  28. last_checked: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
  29. # Timestamps
  30. created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
  31. updated_at: Mapped[datetime] = mapped_column(
  32. DateTime, server_default=func.now(), onupdate=func.now()
  33. )
  34. # Relationship
  35. printer: Mapped["Printer"] = relationship(back_populates="smart_plug")
  36. from backend.app.models.printer import Printer # noqa: E402