115 lines
4.7 KiB
Python
115 lines
4.7 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
"""
|
|||
|
|
设备/装备事件处理器集合
|
|||
|
|
演示两种注册方式:类继承 + @on_event 装饰器
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import asyncio
|
|||
|
|
import logging
|
|||
|
|
|
|||
|
|
from uas.event.event_handler import BaseEventHandler, on_event
|
|||
|
|
from uas.event.event_model import Event
|
|||
|
|
from uas.event.event_type import EventType
|
|||
|
|
|
|||
|
|
logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────────
|
|||
|
|
# 方式1:继承 BaseEventHandler(面向对象)
|
|||
|
|
# ─────────────────────────────────────────────────────────────────
|
|||
|
|
|
|||
|
|
class DeviceErrorHandler(BaseEventHandler):
|
|||
|
|
"""设备错误处理器:记录日志 + 触发告警"""
|
|||
|
|
event_types = [EventType.DEVICE_ERROR]
|
|||
|
|
priority = 0 # 最高优先执行
|
|||
|
|
|
|||
|
|
def handle(self, event: Event):
|
|||
|
|
code = event.params.get("code", "UNKNOWN")
|
|||
|
|
device = event.source
|
|||
|
|
message = event.message or "设备发生未知错误"
|
|||
|
|
self.logger.error(
|
|||
|
|
f"🔴 设备错误 | device={device} code={code} | {message}"
|
|||
|
|
)
|
|||
|
|
# 模拟:错误码 E999 触发紧急停机
|
|||
|
|
if code == "E999":
|
|||
|
|
self.logger.critical(f"⚠️ 紧急停机指令已发送 -> {device}")
|
|||
|
|
return {"action": "emergency_stop", "device": device}
|
|||
|
|
return {"action": "log", "code": code}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class DeviceTimeoutHandler(BaseEventHandler):
|
|||
|
|
"""设备超时处理器:尝试重连"""
|
|||
|
|
event_types = [EventType.DEVICE_TIMEOUT]
|
|||
|
|
priority = 0
|
|||
|
|
|
|||
|
|
def handle(self, event: Event):
|
|||
|
|
retry = event.params.get("retry_count", 0)
|
|||
|
|
self.logger.warning(
|
|||
|
|
f"⏱️ 设备超时 | device={event.source} retry={retry}"
|
|||
|
|
)
|
|||
|
|
if retry >= 3:
|
|||
|
|
self.logger.error(f"设备 {event.source} 超时重试超限,标记离线")
|
|||
|
|
return {"action": "mark_offline"}
|
|||
|
|
return {"action": "reconnect", "retry": retry + 1}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class EquipmentFaultHandler(BaseEventHandler):
|
|||
|
|
"""装备故障处理器:故障分级响应"""
|
|||
|
|
event_types = [EventType.EQUIPMENT_FAULT, EventType.EQUIPMENT_ALARM]
|
|||
|
|
priority = 0
|
|||
|
|
|
|||
|
|
LEVEL_ACTIONS = {
|
|||
|
|
"critical": "立即停机并通知维修人员",
|
|||
|
|
"major": "降级运行并记录故障",
|
|||
|
|
"minor": "记录故障,继续运行",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def handle(self, event: Event):
|
|||
|
|
level = event.params.get("level", "minor")
|
|||
|
|
action = self.LEVEL_ACTIONS.get(level, "记录故障")
|
|||
|
|
self.logger.warning(
|
|||
|
|
f"⚙️ 装备故障 | src={event.source} level={level} | {action}"
|
|||
|
|
)
|
|||
|
|
return {"level": level, "action": action}
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ─────────────────────────────────────────────────────────────────
|
|||
|
|
# 方式2:@on_event 装饰器(函数式)
|
|||
|
|
# ─────────────────────────────────────────────────────────────────
|
|||
|
|
|
|||
|
|
@on_event(EventType.DEVICE_CONNECTED, EventType.DEVICE_DISCONNECTED)
|
|||
|
|
def handle_device_connection(event: Event):
|
|||
|
|
"""设备连接/断开日志记录"""
|
|||
|
|
icon = "🟢" if event.event_type == EventType.DEVICE_CONNECTED else "🔴"
|
|||
|
|
logger.info(f"{icon} 设备连接状态变更 | {event.source} | {event.message}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
@on_event(EventType.DEVICE_WARNING,
|
|||
|
|
condition=lambda e: e.params.get("temp", 0) > 80)
|
|||
|
|
def handle_high_temp_warning(event: Event):
|
|||
|
|
"""仅处理温度超过80°C的设备警告"""
|
|||
|
|
temp = event.params.get("temp", 0)
|
|||
|
|
logger.warning(f"🌡️ 高温警告 | device={event.source} temp={temp}°C")
|
|||
|
|
return {"alert": "high_temp", "temp": temp}
|
|||
|
|
|
|||
|
|
|
|||
|
|
@on_event(EventType.EQUIPMENT_RECOVERED)
|
|||
|
|
def handle_equipment_recovered(event: Event):
|
|||
|
|
"""装备恢复正常"""
|
|||
|
|
logger.info(f"✅ 装备已恢复 | {event.source} | {event.message}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
@on_event(EventType.SYSTEM_HEARTBEAT, priority=100) # 低优先级
|
|||
|
|
async def async_heartbeat_handler(event: Event):
|
|||
|
|
"""异步心跳处理器(演示 async 支持)"""
|
|||
|
|
await asyncio.sleep(0.01) # 模拟异步IO
|
|||
|
|
logger.debug(f"💓 心跳 | {event.source} | ts={event.timestamp:.3f}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
@on_event("*", priority=999) # 通配符:捕获所有事件
|
|||
|
|
def global_audit_handler(event: Event):
|
|||
|
|
"""全局审计处理器(最低优先级,记录所有事件)"""
|
|||
|
|
logger.debug(
|
|||
|
|
f"📋 审计 | {event.type_key} | src={event.source} "
|
|||
|
|
f"| id={event.event_id[:8]}"
|
|||
|
|
)
|