"""IoT设备支持模块,提供IoT设备描述符和状态处理""" import asyncio from config.logger import setup_logging from .iot_descriptor import IotDescriptor from typing import TYPE_CHECKING if TYPE_CHECKING: from core.connection import ConnectionHandler TAG = __name__ logger = setup_logging() async def handleIotDescriptors(conn: "ConnectionHandler", descriptors): """处理物联网描述""" wait_max_time = 5 while ( not hasattr(conn, "func_handler") or conn.func_handler is None or not conn.func_handler.finish_init ): await asyncio.sleep(1) wait_max_time -= 1 if wait_max_time <= 0: logger.bind(tag=TAG).debug("连接对象没有func_handler") return functions_changed = False for descriptor in descriptors: # 如果descriptor没有properties和methods,则直接跳过 if "properties" not in descriptor and "methods" not in descriptor: continue # 处理缺失properties的情况 if "properties" not in descriptor: descriptor["properties"] = {} # 从methods中提取所有参数作为properties if "methods" in descriptor: for method_name, method_info in descriptor["methods"].items(): if "parameters" in method_info: for param_name, param_info in method_info["parameters"].items(): # 将参数信息转换为属性信息 descriptor["properties"][param_name] = { "description": param_info["description"], "type": param_info["type"], } # 创建IOT设备描述符 iot_descriptor = IotDescriptor( descriptor["name"], descriptor["description"], descriptor["properties"], descriptor["methods"], ) conn.iot_descriptors[descriptor["name"]] = iot_descriptor functions_changed = True # 如果注册了新函数,更新function描述列表 if functions_changed and hasattr(conn, "func_handler"): # 注册IoT工具到统一工具处理器 await conn.func_handler.register_iot_tools(descriptors) conn.func_handler.current_support_functions() async def handleIotStatus(conn: "ConnectionHandler", states): """处理物联网状态""" for state in states: for key, value in conn.iot_descriptors.items(): if key == state["name"]: for property_item in value.properties: for k, v in state["state"].items(): if property_item["name"] == k: if type(v) != type(property_item["value"]): logger.bind(tag=TAG).error( f"属性{property_item['name']}的值类型不匹配" ) break else: property_item["value"] = v logger.bind(tag=TAG).info( f"物联网状态更新: {key} , {property_item['name']} = {v}" ) break break