Files
bambuddy/backend/app/schemas/smart_plug.py
T
maziggy c74f24353a - Added smart plug monitoring and scheduling
- Added daily digest to notification module
2025-12-08 16:30:53 +00:00

95 lines
3.5 KiB
Python

from datetime import datetime
from typing import Literal
from pydantic import BaseModel, Field
class SmartPlugBase(BaseModel):
name: str = Field(..., min_length=1, max_length=100)
ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
printer_id: int | None = None
enabled: bool = True
auto_on: bool = True
auto_off: bool = True
off_delay_mode: Literal["time", "temperature"] = "time"
off_delay_minutes: int = Field(default=5, ge=0, le=60)
off_temp_threshold: int = Field(default=70, ge=30, le=150)
username: str | None = None
password: str | None = None
# Power alerts
power_alert_enabled: bool = False
power_alert_high: float | None = Field(default=None, ge=0, le=5000) # Alert when power > this (watts)
power_alert_low: float | None = Field(default=None, ge=0, le=5000) # Alert when power < this (watts)
# Schedule
schedule_enabled: bool = False
schedule_on_time: str | None = Field(default=None, pattern=r"^([01]\d|2[0-3]):[0-5]\d$") # HH:MM format
schedule_off_time: str | None = Field(default=None, pattern=r"^([01]\d|2[0-3]):[0-5]\d$") # HH:MM format
class SmartPlugCreate(SmartPlugBase):
pass
class SmartPlugUpdate(BaseModel):
name: str | None = None
ip_address: str | None = None
printer_id: int | None = None
enabled: bool | None = None
auto_on: bool | None = None
auto_off: bool | None = None
off_delay_mode: Literal["time", "temperature"] | None = None
off_delay_minutes: int | None = Field(default=None, ge=0, le=60)
off_temp_threshold: int | None = Field(default=None, ge=30, le=150)
username: str | None = None
password: str | None = None
# Power alerts
power_alert_enabled: bool | None = None
power_alert_high: float | None = Field(default=None, ge=0, le=5000)
power_alert_low: float | None = Field(default=None, ge=0, le=5000)
# Schedule
schedule_enabled: bool | None = None
schedule_on_time: str | None = Field(default=None, pattern=r"^([01]\d|2[0-3]):[0-5]\d$")
schedule_off_time: str | None = Field(default=None, pattern=r"^([01]\d|2[0-3]):[0-5]\d$")
class SmartPlugResponse(SmartPlugBase):
id: int
last_state: str | None = None
last_checked: datetime | None = None
auto_off_executed: bool = False # True when auto-off was triggered after print
power_alert_last_triggered: datetime | None = None
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class SmartPlugControl(BaseModel):
action: Literal["on", "off", "toggle"]
class SmartPlugEnergy(BaseModel):
"""Energy monitoring data from a smart plug."""
power: float | None = None # Current watts
voltage: float | None = None # Volts
current: float | None = None # Amps
today: float | None = None # kWh used today
yesterday: float | None = None # kWh used yesterday
total: float | None = None # Total kWh
factor: float | None = None # Power factor (0-1)
apparent_power: float | None = None # VA
reactive_power: float | None = None # VAr
class SmartPlugStatus(BaseModel):
state: str | None = None # "ON", "OFF", or None if unreachable
reachable: bool = True
device_name: str | None = None
energy: SmartPlugEnergy | None = None # Energy data if available
class SmartPlugTestConnection(BaseModel):
ip_address: str = Field(..., pattern=r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
username: str | None = None
password: str | None = None