实现设备自动发现规则管理系统,包含以下主要功能: 1. 新增规则管理页面和API,支持创建、编辑和删除主题匹配规则 2. 添加规则匹配引擎,支持+和#通配符匹配设备主题 3. 实现Broker设备注册表,自动发现并管理符合规则的设备 4. 扩展仪表盘显示Broker信息和活跃主题 5. 修改设备卡片和详情页以区分规则发现的设备 6. 添加相关测试用例确保功能稳定性
118 lines
2.5 KiB
Python
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}
|