import pendulum from pot_libs.logger import log from unify_api.modules.common.dao.common_dao import mid_by_pid, meter_by_mid, \ meter_param_by_mid, change_sensor_by_location, get_point_monitor_dao, \ get_location_monitor_dao from uuid import uuid4 async def get_point_soe_config(event_data, with_params=False): """ with_params: 用于同步配置参数信息,保证adio事件可以得到正确的数值 """ point_id = event_data.get('point_id') event_settings = {k: v for k, v in event_data.items() if k in [ 'threshold', 'duration', 'enable' ]} # 根据pid获取mid mid_dic = await mid_by_pid(point_id) mid = mid_dic.get("mid") if mid is None: log.info(f'=======no mid of point id: {point_id}') return None, None meter_dic = await meter_by_mid(mid) sid = meter_dic.get("sid") meter_sn = meter_dic.get("meter_no") config = { 'soe': { "electric": { meter_sn: {event_data['event_type']: event_settings}}} } if with_params: params = await meter_param_by_mid(mid) params = {k: v for k, v in params.items() if v is not None} params['point_id'] = point_id config['params'] = {'electric': {meter_sn: params}} return sid, config async def get_point_soe_config_new15(event_data, with_params=False): point_id = event_data.get('point_id') event_settings = {k: v for k, v in event_data.items() if k in [ 'threshold', 'duration', 'enable' ]} datas = await get_point_monitor_dao(point_id) sid = datas.get("sid") meter_sn = datas.get("meter_no") config = { 'soe': { "electric": { meter_sn: {event_data['event_type']: event_settings}}} } if with_params: keys_li = ["ctr", "ptr", "ctnum", "vc", "tc", "imax"] params = {k: v for k, v in datas.items() if k in keys_li and (v is not None)} params['point_id'] = point_id config['params'] = {'electric': {meter_sn: params}} return sid, config async def get_location_soe_config(event, with_params): location_id = event.get('location_id') event_settings = {k: v for k, v in event.items() if k in [ 'threshold', 'duration', 'enable' ]} try: sensor_dic = await change_sensor_by_location(location_id) sid = sensor_dic.get("sid") field = sensor_dic.get("field") except: log.info(f'=======no sid of location: {location_id}') return None, None if field == "residual_current": config = {'soe': {"adio": {event['event_type']: event_settings}}} else: config = { 'soe': {"adio": {field: {event['event_type']: event_settings}}}} if with_params: config['params'] = {'adio': {field: {'location_id': location_id}}} return sid, config async def get_location_soe_config_new15(event, with_params): location_id = event.get('location_id') event_settings = {k: v for k, v in event.items() if k in [ 'threshold', 'duration', 'enable' ]} datas = await get_location_monitor_dao(location_id) sid = datas.get("sid") field = datas.get("ad_field") if field == "residual_current": config = {'soe': {"adio": {event['event_type']: event_settings}}} else: config = { 'soe': {"adio": {field: {event['event_type']: event_settings}}}} if with_params: config['params'] = {'adio': {field: {'location_id': location_id}}} return sid, config async def change_param_to_config(req_json, method): """ web参数, 转换为与装置通信的报文 soe method: config """ sid, config = None, None point_id = req_json.get("point_id") if point_id is not None: # sid, config = await get_point_soe_config(req_json, with_params=True) sid, config = await get_point_soe_config_new15(req_json, with_params=True) location_id = req_json.get('location_id') if location_id is not None: # sid, config = await get_location_soe_config(req_json, # with_params=True) sid, config = await get_location_soe_config_new15(req_json, with_params=True) request_data = {} if sid: request_id = str(uuid4()) request_data = dict( request_id=request_id, time=pendulum.now().to_datetime_string(), method=method, sid=sid, data=config) return request_data async def switch_control_param_to_config(sid, field, switch, command="switch_control", method="command"): """ 联动控制, 转换为与装置通信的报文 soe method: command """ # 展龙反馈, 装置不识别00 if switch == "00": switch = "10" request_id = str(uuid4()) request_data = dict( request_id=request_id, time=pendulum.now().to_datetime_string(), method=method, sid=sid, data={'command': command, 'params': {'field': field, 'value': switch}} ) return request_data