Files
relay/internal/simulation/devices.py

227 lines
6.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
模拟设备模块,用于创建和管理模拟设备
"""
import random
import time
import logging
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class SimulatedDevice:
"""模拟设备类"""
def __init__(self, device_id, device_type, status="stopped"):
"""
初始化模拟设备
Args:
device_id (str): 设备ID
device_type (str): 设备类型
status (str): 初始状态
"""
self.device_id = device_id
self.device_type = device_type
self.status = status
self.created_at = time.time()
logger.info(f"创建模拟设备: ID={device_id}, 类型={device_type}, 状态={status}")
def control(self, action):
"""
控制设备
Args:
action (str): 控制动作 ('on''off')
Returns:
dict: 控制结果
"""
logger.info(f"控制设备 {self.device_id}: 动作={action}")
if action == "on":
self.status = "running"
result = {
"device_id": self.device_id,
"status": "success",
"message": f"设备 {self.device_id} 已开启"
}
logger.info(f"设备 {self.device_id} 开启成功")
return result
elif action == "off":
self.status = "stopped"
result = {
"device_id": self.device_id,
"status": "success",
"message": f"设备 {self.device_id} 已关闭"
}
logger.info(f"设备 {self.device_id} 关闭成功")
return result
else:
result = {
"device_id": self.device_id,
"status": "failed",
"message": f"不支持的操作: {action}"
}
logger.warning(f"设备 {self.device_id} 不支持的操作: {action}")
return result
def get_status(self):
"""
获取设备状态
Returns:
dict: 设备状态信息
"""
logger.info(f"查询设备 {self.device_id} 状态")
# 模拟一些随机的设备数据
if self.status == "running":
power = random.randint(200, 240)
current = random.uniform(4.0, 6.0)
result = {
"device_id": self.device_id,
"status": self.status,
"power": power,
"current": round(current, 2)
}
logger.info(f"设备 {self.device_id} 状态: 运行中, 功率={power}V, 电流={round(current, 2)}A")
return result
else:
result = {
"device_id": self.device_id,
"status": self.status,
"power": 0,
"current": 0.0
}
logger.info(f"设备 {self.device_id} 状态: 已停止")
return result
class DeviceManager:
"""设备管理器"""
def __init__(self):
"""初始化设备管理器"""
self.devices = {}
logger.info("初始化设备管理器")
def add_device(self, device):
"""
添加设备
Args:
device (SimulatedDevice): 模拟设备实例
"""
self.devices[device.device_id] = device
logger.info(f"添加设备到管理器: {device.device_id}")
def remove_device(self, device_id):
"""
移除设备
Args:
device_id (str): 设备ID
"""
if device_id in self.devices:
del self.devices[device_id]
logger.info(f"从管理器移除设备: {device_id}")
def get_device(self, device_id):
"""
获取设备
Args:
device_id (str): 设备ID
Returns:
SimulatedDevice: 设备实例如果不存在则返回None
"""
device = self.devices.get(device_id)
if device:
logger.debug(f"获取设备: {device_id}")
else:
logger.warning(f"尝试获取不存在的设备: {device_id}")
return device
def get_all_devices(self):
"""
获取所有设备
Returns:
list: 所有设备实例的列表
"""
logger.info(f"获取所有设备,共 {len(self.devices)} 个设备")
return list(self.devices.values())
def control_device(self, device_id, action):
"""
控制指定设备
Args:
device_id (str): 设备ID
action (str): 控制动作
Returns:
dict: 控制结果
"""
logger.info(f"控制设备: ID={device_id}, 动作={action}")
device = self.get_device(device_id)
if device:
return device.control(action)
else:
result = {
"device_id": device_id,
"status": "failed",
"message": f"设备 {device_id} 不存在"
}
logger.error(f"控制设备失败: 设备 {device_id} 不存在")
return result
def query_device_status(self, device_id):
"""
查询指定设备状态
Args:
device_id (str): 设备ID
Returns:
dict: 设备状态信息
"""
logger.info(f"查询设备状态: ID={device_id}")
device = self.get_device(device_id)
if device:
return device.get_status()
else:
result = {
"device_id": device_id,
"status": "failed",
"message": f"设备 {device_id} 不存在"
}
logger.error(f"查询设备状态失败: 设备 {device_id} 不存在")
return result
def query_all_device_status(self):
"""
查询所有设备状态
Returns:
list: 所有设备状态信息列表
"""
logger.info("查询所有设备状态")
statuses = []
for device in self.devices.values():
status_info = {
"device_id": device.device_id,
"device_type": device.device_type,
"status": device.status
}
statuses.append(status_info)
logger.debug(f"设备 {device.device_id} 状态: {device.status}")
logger.info(f"查询所有设备状态完成,共 {len(statuses)} 个设备")
return statuses