华荣三照明、合信、荣欣八组合馈电
This commit is contained in:
102
mqtt_object.py
Normal file
102
mqtt_object.py
Normal file
@ -0,0 +1,102 @@
|
||||
import menu_utils as utils
|
||||
import json
|
||||
from mqtt_device import class_comm_mqtt_interface, class_comm_mqtt_thread
|
||||
from device_conf import class_comm_device_config
|
||||
import string
|
||||
from enum import Enum
|
||||
import math
|
||||
from print_color import *
|
||||
|
||||
#创建mqtt 消息属性字典,
|
||||
class class_mqtt_info_object (class_comm_mqtt_interface):
|
||||
def __init__(self, device_name):
|
||||
class_comm_mqtt_interface.__init__(self)
|
||||
self.mqtt_dict = {}
|
||||
|
||||
device_config_info = __import__(device_name)
|
||||
|
||||
self.device_config : class_comm_device_config = device_config_info.comm_device_config
|
||||
self.menu_description = self.device_config.get_menu_caption_info()
|
||||
|
||||
menu_process_list = []
|
||||
for item_dict in self.menu_description :
|
||||
if "menu" in item_dict.keys() :
|
||||
menu_object = item_dict["menu"]
|
||||
self.__create_mqtt_dict__(menu_object, menu_process_list)
|
||||
|
||||
#创建mqtt索引, 用于定位mqtt消息相关的菜单属性, 内部函数, 外部不要调用
|
||||
def __create_mqtt_dict__(self, menu_object, menu_process_list: list): #创建菜单对应的各项mqtt信息,包含菜单内部的子菜单的各项mqtt信息
|
||||
if menu_object == None :
|
||||
return
|
||||
if menu_object in menu_process_list : #防止递归进入无限循环
|
||||
return
|
||||
|
||||
menu_process_list.append(menu_object) #添加到处理队列中,可以防止menu_object重复处理
|
||||
|
||||
for menu_item in menu_object : #遍历菜单内部的各个菜单项
|
||||
if "mqtt" in menu_item.keys() : #该项菜单具有mqtt属性
|
||||
mqtt_info_name = menu_item["mqtt"] #获取mqtt的信息名称, mqtt的消息中包含该信息时,可快速定位该 菜单项
|
||||
if mqtt_info_name not in self.mqtt_dict.keys() : #mqtt信息需要具有唯一性,
|
||||
self.mqtt_dict[mqtt_info_name] = menu_item #把mqtt信息与 菜单项 进行(key, value)绑定. key = mqtt信息, value为菜单项
|
||||
else :
|
||||
print_error_msg("Error, 菜单项有相同的mqtt字段(%s)"%(mqtt_info_name))
|
||||
|
||||
if "sub_menu" in menu_item.keys() :
|
||||
sub_menu_name = menu_item["sub_menu"]
|
||||
if isinstance(sub_menu_name, Enum):
|
||||
sub_menu_name = sub_menu_name.name
|
||||
|
||||
sub_menu_object = self.search_menu_group_object(sub_menu_name)
|
||||
self.__create_mqtt_dict__(sub_menu_object, menu_process_list) #递归调用, 直到处理完所有子菜单项
|
||||
|
||||
#通过菜单名搜索到菜单项
|
||||
def search_menu_item(self, mqtt_info_name : string) :
|
||||
if mqtt_info_name in self.mqtt_dict.keys() :
|
||||
return self.mqtt_dict[mqtt_info_name]
|
||||
else :
|
||||
return None
|
||||
|
||||
#通过菜单名字来查找菜单组对象, 每个菜单组包含若干个菜单项
|
||||
def search_menu_group_object(self, menu_group_name) :
|
||||
menu_group_object = None
|
||||
for item_dict in self.menu_description:
|
||||
menu_item_name = utils.dict_or_object_get_attr(item_dict, "name", None)
|
||||
if menu_item_name == menu_group_name :
|
||||
menu_group_object = utils.dict_or_object_get_attr(item_dict, "menu", None)
|
||||
break
|
||||
return menu_group_object
|
||||
|
||||
|
||||
#定义mqtt信息组:所有设备的mqtt信息 都集中于该类
|
||||
class class_mqtt_info_object_group():
|
||||
def __init__(self):
|
||||
self.device_mqtt_info_dict : class_mqtt_info_object = {}
|
||||
|
||||
def create_mqtt_info_object(self, device_name) ->class_mqtt_info_object:
|
||||
try :
|
||||
mqtt_info_object = None
|
||||
|
||||
if device_name not in self.device_mqtt_info_dict.keys() :
|
||||
new_mqtt_info = class_mqtt_info_object(device_name)
|
||||
self.device_mqtt_info_dict[device_name] = new_mqtt_info
|
||||
mqtt_info_object = self.get_mqtt_info_object(device_name)
|
||||
except Exception as e:
|
||||
print_error_msg(str(e))
|
||||
mqtt_info_object = None
|
||||
finally :
|
||||
return mqtt_info_object
|
||||
|
||||
def get_mqtt_info_object(self, device_name) ->class_mqtt_info_object:
|
||||
matched_mqtt_info = None
|
||||
if device_name in self.device_mqtt_info_dict.keys() :
|
||||
matched_mqtt_info = self.device_mqtt_info_dict[device_name]
|
||||
|
||||
return matched_mqtt_info
|
||||
|
||||
def search_mqtt_menu_item_info(self, device_name, mqtt_info_name) :
|
||||
if mqtt_info_name in self.device_mqtt_info_dict.keys() :
|
||||
mqtt_info_object : class_mqtt_info_object = self.device_mqtt_info_dict[device_name]
|
||||
menu_item = mqtt_info_object.search_menu_item(mqtt_info_name)
|
||||
return menu_item
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user