Files
HomeOS/src/mqtt_home/schemas.py
walkpan 3ea47d471e feat(规则管理): 添加主题规则自动发现设备功能
实现设备自动发现规则管理系统,包含以下主要功能:
1. 新增规则管理页面和API,支持创建、编辑和删除主题匹配规则
2. 添加规则匹配引擎,支持+和#通配符匹配设备主题
3. 实现Broker设备注册表,自动发现并管理符合规则的设备
4. 扩展仪表盘显示Broker信息和活跃主题
5. 修改设备卡片和详情页以区分规则发现的设备
6. 添加相关测试用例确保功能稳定性
2026-03-30 19:28:22 +08:00

118 lines
2.5 KiB
Python

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}