from datetime import datetime from typing import Optional from pydantic import BaseModel, Field class DeviceCreate(BaseModel): name: str type: str = "switch" protocol: str = "custom" mqtt_topic: str command_topic: Optional[str] = None class DeviceUpdate(BaseModel): name: Optional[str] = None type: Optional[str] = None command_topic: Optional[str] = None class DeviceCommand(BaseModel): payload: str class DeviceResponse(BaseModel): id: str name: str type: str protocol: str mqtt_topic: str command_topic: Optional[str] = None state: Optional[str] = None is_online: bool last_seen: Optional[datetime] = None created_at: datetime updated_at: datetime model_config = {"from_attributes": True} class DeviceLogResponse(BaseModel): id: int device_id: str direction: str topic: str payload: str timestamp: datetime model_config = {"from_attributes": True} class BrokerClient(BaseModel): clientid: str username: Optional[str] = None ip_address: Optional[str] = None connected: bool keepalive: int proto_ver: Optional[int] = None clean_start: Optional[bool] = None class BrokerTopic(BaseModel): topic: str node: Optional[str] = None class BrokerDeviceResponse(BaseModel): id: str name: str type: str protocol: str = "topic_rule" mqtt_topic: str command_topic: str | None = None state: str | None = None is_online: bool = False last_seen: datetime | None = None rule_id: int = 0 class DashboardStats(BaseModel): total_devices: int online_devices: int offline_devices: int recent_logs: list[DeviceLogResponse] broker_topics: list[str] = [] broker_device_count: int = 0 broker_online_count: int = 0 mqtt_connected: bool = False class RuleCreate(BaseModel): name: str topic_pattern: str device_type: str = "switch" command_template: str | None = None state_value_path: str | None = None is_enabled: bool = True class RuleUpdate(BaseModel): name: str | None = None topic_pattern: str | None = None device_type: str | None = None command_template: str | None = None state_value_path: str | None = None is_enabled: bool | None = None class RuleResponse(BaseModel): id: int name: str topic_pattern: str device_type: str command_template: str | None = None state_value_path: str | None = None is_enabled: bool created_at: datetime model_config = {"from_attributes": True}