修复代码, 现在可以正常接收平台心跳包并返回设备状态
This commit is contained in:
@@ -207,7 +207,7 @@ class DeviceManager:
|
||||
"""
|
||||
if device_id in self.devices:
|
||||
del self.devices[device_id]
|
||||
logger.info(f"从管理器移除普通设备: {device_id}")
|
||||
logger.info(f"从管理器移除设备: {device_id}")
|
||||
|
||||
def get_device(self, device_id):
|
||||
"""
|
||||
@@ -236,6 +236,50 @@ class DeviceManager:
|
||||
logger.info(f"获取所有普通设备,共 {len(self.devices)} 个")
|
||||
return list(self.devices.values())
|
||||
|
||||
def reinitialize_devices(self, controllers_config, devices_config):
|
||||
"""
|
||||
重新初始化设备(根据新的配置)
|
||||
|
||||
Args:
|
||||
controllers_config (list): 区域主控设备配置列表
|
||||
devices_config (list): 普通设备配置列表
|
||||
"""
|
||||
logger.info("重新初始化设备")
|
||||
|
||||
# 清空现有设备
|
||||
self.controllers.clear()
|
||||
self.devices.clear()
|
||||
|
||||
# 根据新配置创建区域主控设备
|
||||
controllers = {}
|
||||
for controller_config in controllers_config:
|
||||
controller = AreaController(
|
||||
device_id=controller_config['id'],
|
||||
lora_address=controller_config['lora_address'],
|
||||
status=controller_config.get('status', 'stopped')
|
||||
)
|
||||
self.add_controller(controller)
|
||||
controllers[controller.device_id] = controller
|
||||
|
||||
# 根据新配置创建普通设备,并关联到区域主控
|
||||
for device_config in devices_config:
|
||||
device = NormalDevice(
|
||||
device_id=device_config['id'],
|
||||
device_type=device_config['type'],
|
||||
rs485_bus=device_config['rs485_bus'],
|
||||
rs485_address=device_config['rs485_address'],
|
||||
controller_id=device_config['controller_id'],
|
||||
status=device_config.get('status', 'stopped')
|
||||
)
|
||||
self.add_device(device)
|
||||
|
||||
# 将设备添加到对应的区域主控中
|
||||
controller_id = device_config['controller_id']
|
||||
if controller_id in controllers:
|
||||
controllers[controller_id].add_device(device)
|
||||
|
||||
logger.info(f"设备重新初始化完成,创建了 {len(controllers)} 个区域主控和 {len(devices_config)} 个普通设备")
|
||||
|
||||
def control_device(self, device_id, action):
|
||||
"""
|
||||
控制指定设备
|
||||
@@ -249,107 +293,37 @@ class DeviceManager:
|
||||
"""
|
||||
logger.info(f"控制设备: ID={device_id}, 动作={action}")
|
||||
|
||||
# 先尝试查找普通设备
|
||||
# 查找设备(先在普通设备中查找,再在区域主控中查找)
|
||||
device = self.get_device(device_id)
|
||||
if device:
|
||||
return self._control_normal_device(device, action)
|
||||
if not device:
|
||||
device = self.get_controller(device_id)
|
||||
|
||||
# 再尝试查找区域主控设备
|
||||
controller = self.get_controller(device_id)
|
||||
if controller:
|
||||
return self._control_area_controller(controller, action)
|
||||
|
||||
result = {
|
||||
"device_id": device_id,
|
||||
"status": "failed",
|
||||
"message": f"设备 {device_id} 不存在"
|
||||
}
|
||||
logger.error(f"控制设备失败: 设备 {device_id} 不存在")
|
||||
return result
|
||||
|
||||
def _control_normal_device(self, device, action):
|
||||
"""
|
||||
控制普通设备
|
||||
|
||||
Args:
|
||||
device (NormalDevice): 普通设备实例
|
||||
action (str): 控制动作
|
||||
|
||||
Returns:
|
||||
dict: 控制结果
|
||||
"""
|
||||
logger.info(f"控制普通设备 {device.device_id}: 动作={action}")
|
||||
|
||||
if action == "on":
|
||||
device.status = "running"
|
||||
result = {
|
||||
"device_id": device.device_id,
|
||||
"status": "success",
|
||||
"message": f"设备 {device.device_id} 已开启"
|
||||
}
|
||||
logger.info(f"普通设备 {device.device_id} 开启成功")
|
||||
return result
|
||||
elif action == "off":
|
||||
device.status = "stopped"
|
||||
result = {
|
||||
"device_id": device.device_id,
|
||||
"status": "success",
|
||||
"message": f"设备 {device.device_id} 已关闭"
|
||||
}
|
||||
logger.info(f"普通设备 {device.device_id} 关闭成功")
|
||||
return result
|
||||
else:
|
||||
result = {
|
||||
"device_id": device.device_id,
|
||||
if not device:
|
||||
return {
|
||||
"status": "failed",
|
||||
"message": f"不支持的操作: {action}"
|
||||
"message": f"设备不存在: {device_id}"
|
||||
}
|
||||
logger.warning(f"普通设备 {device.device_id} 不支持的操作: {action}")
|
||||
return result
|
||||
|
||||
def _control_area_controller(self, controller, action):
|
||||
"""
|
||||
控制区域主控设备
|
||||
|
||||
Args:
|
||||
controller (AreaController): 区域主控设备实例
|
||||
action (str): 控制动作
|
||||
|
||||
Returns:
|
||||
dict: 控制结果
|
||||
"""
|
||||
logger.info(f"控制区域主控 {controller.device_id}: 动作={action}")
|
||||
|
||||
if action == "on":
|
||||
controller.status = "running"
|
||||
result = {
|
||||
"device_id": controller.device_id,
|
||||
# 执行控制动作
|
||||
if action in ["on", "off"]:
|
||||
device.status = "running" if action == "on" else "stopped"
|
||||
return {
|
||||
"status": "success",
|
||||
"message": f"区域主控 {controller.device_id} 已开启"
|
||||
"message": f"设备控制成功: {action}",
|
||||
"data": {
|
||||
"device_id": device_id,
|
||||
"status": device.status
|
||||
}
|
||||
}
|
||||
logger.info(f"区域主控 {controller.device_id} 开启成功")
|
||||
return result
|
||||
elif action == "off":
|
||||
controller.status = "stopped"
|
||||
result = {
|
||||
"device_id": controller.device_id,
|
||||
"status": "success",
|
||||
"message": f"区域主控 {controller.device_id} 已关闭"
|
||||
}
|
||||
logger.info(f"区域主控 {controller.device_id} 关闭成功")
|
||||
return result
|
||||
else:
|
||||
result = {
|
||||
"device_id": controller.device_id,
|
||||
return {
|
||||
"status": "failed",
|
||||
"message": f"不支持的操作: {action}"
|
||||
"message": f"不支持的动作: {action}"
|
||||
}
|
||||
logger.warning(f"区域主控 {controller.device_id} 不支持的操作: {action}")
|
||||
return result
|
||||
|
||||
def query_device_status(self, device_id):
|
||||
"""
|
||||
查询指定设备状态
|
||||
查询设备状态
|
||||
|
||||
Args:
|
||||
device_id (str): 设备ID
|
||||
@@ -359,87 +333,26 @@ class DeviceManager:
|
||||
"""
|
||||
logger.info(f"查询设备状态: ID={device_id}")
|
||||
|
||||
# 先尝试查找普通设备
|
||||
# 查找设备(先在普通设备中查找,再在区域主控中查找)
|
||||
device = self.get_device(device_id)
|
||||
if device:
|
||||
return self._query_normal_device_status(device)
|
||||
if not device:
|
||||
device = self.get_controller(device_id)
|
||||
|
||||
# 再尝试查找区域主控设备
|
||||
controller = self.get_controller(device_id)
|
||||
if controller:
|
||||
return self._query_area_controller_status(controller)
|
||||
|
||||
result = {
|
||||
"device_id": device_id,
|
||||
"status": "failed",
|
||||
"message": f"设备 {device_id} 不存在"
|
||||
}
|
||||
logger.error(f"查询设备状态失败: 设备 {device_id} 不存在")
|
||||
return result
|
||||
|
||||
def _query_normal_device_status(self, device):
|
||||
"""
|
||||
查询普通设备状态
|
||||
|
||||
Args:
|
||||
device (NormalDevice): 普通设备实例
|
||||
|
||||
Returns:
|
||||
dict: 设备状态信息
|
||||
"""
|
||||
logger.info(f"查询普通设备 {device.device_id} 状态")
|
||||
|
||||
# 模拟一些随机的设备数据
|
||||
if device.status == "running":
|
||||
power = random.randint(200, 240)
|
||||
current = random.uniform(4.0, 6.0)
|
||||
result = {
|
||||
"device_id": device.device_id,
|
||||
"device_type": device.device_type,
|
||||
"status": device.status,
|
||||
"rs485_bus": device.rs485_bus,
|
||||
"rs485_address": device.rs485_address,
|
||||
"controller_id": device.controller_id,
|
||||
"power": power,
|
||||
"current": round(current, 2)
|
||||
if not device:
|
||||
return {
|
||||
"status": "failed",
|
||||
"message": f"设备不存在: {device_id}"
|
||||
}
|
||||
logger.info(f"普通设备 {device.device_id} 状态: 运行中, 功率={power}V, 电流={round(current, 2)}A")
|
||||
return result
|
||||
else:
|
||||
result = {
|
||||
"device_id": device.device_id,
|
||||
"device_type": device.device_type,
|
||||
"status": device.status,
|
||||
"rs485_bus": device.rs485_bus,
|
||||
"rs485_address": device.rs485_address,
|
||||
"controller_id": device.controller_id,
|
||||
"power": 0,
|
||||
"current": 0.0
|
||||
|
||||
# 返回设备状态
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "查询设备状态成功",
|
||||
"data": {
|
||||
"device_id": device_id,
|
||||
"status": device.status
|
||||
}
|
||||
logger.info(f"普通设备 {device.device_id} 状态: 已停止")
|
||||
return result
|
||||
|
||||
def _query_area_controller_status(self, controller):
|
||||
"""
|
||||
查询区域主控状态
|
||||
|
||||
Args:
|
||||
controller (AreaController): 区域主控设备实例
|
||||
|
||||
Returns:
|
||||
dict: 设备状态信息
|
||||
"""
|
||||
logger.info(f"查询区域主控 {controller.device_id} 状态")
|
||||
|
||||
result = {
|
||||
"device_id": controller.device_id,
|
||||
"device_type": "area_controller",
|
||||
"status": controller.status,
|
||||
"lora_address": controller.lora_address,
|
||||
"managed_devices": len(controller.devices)
|
||||
}
|
||||
logger.info(f"区域主控 {controller.device_id} 状态: {controller.status}, 管理设备数: {len(controller.devices)}")
|
||||
return result
|
||||
|
||||
def query_all_device_status(self):
|
||||
"""
|
||||
@@ -449,32 +362,36 @@ class DeviceManager:
|
||||
list: 所有设备状态信息列表
|
||||
"""
|
||||
logger.info("查询所有设备状态")
|
||||
|
||||
statuses = []
|
||||
|
||||
# 添加区域主控状态
|
||||
for controller in self.controllers.values():
|
||||
status_info = {
|
||||
# 添加所有区域主控设备状态
|
||||
for controller in self.get_all_controllers():
|
||||
statuses.append({
|
||||
"device_id": controller.device_id,
|
||||
"device_type": "area_controller",
|
||||
"status": controller.status,
|
||||
"lora_address": controller.lora_address,
|
||||
"managed_devices": len(controller.devices)
|
||||
}
|
||||
statuses.append(status_info)
|
||||
logger.debug(f"区域主控 {controller.device_id} 状态: {controller.status}")
|
||||
"status": controller.status
|
||||
})
|
||||
|
||||
# 添加该控制器下的所有普通设备状态
|
||||
for device in controller.get_all_devices():
|
||||
statuses.append({
|
||||
"device_id": device.device_id,
|
||||
"device_type": device.device_type,
|
||||
"status": device.status
|
||||
})
|
||||
|
||||
# 添加普通设备状态
|
||||
for device in self.devices.values():
|
||||
status_info = {
|
||||
"device_id": device.device_id,
|
||||
"device_type": device.device_type,
|
||||
"status": device.status,
|
||||
"rs485_bus": device.rs485_bus,
|
||||
"rs485_address": device.rs485_address,
|
||||
"controller_id": device.controller_id
|
||||
}
|
||||
statuses.append(status_info)
|
||||
logger.debug(f"普通设备 {device.device_id} 状态: {device.status}")
|
||||
# 添加未分配到控制器的普通设备状态
|
||||
controller_device_ids = set()
|
||||
for controller in self.get_all_controllers():
|
||||
controller_device_ids.update(controller.devices.keys())
|
||||
|
||||
for device in self.get_all_devices():
|
||||
if device.device_id not in controller_device_ids:
|
||||
statuses.append({
|
||||
"device_id": device.device_id,
|
||||
"device_type": device.device_type,
|
||||
"status": device.status
|
||||
})
|
||||
|
||||
logger.info(f"查询所有设备状态完成,共 {len(statuses)} 个设备")
|
||||
return statuses
|
||||
Reference in New Issue
Block a user