ソースを参照

修改网关推送接口

locky 2 年 前
コミット
46524060ea
1 ファイル変更188 行追加279 行削除
  1. 188 279
      Controller/gatewayController.py

+ 188 - 279
Controller/gatewayController.py

@@ -4,7 +4,6 @@
 @Time : 2022/5/9 10:51
 @File :gatewayController.py
 """
-import logging
 import time
 
 from django.views.generic.base import View
@@ -49,31 +48,27 @@ class GatewayView(View):
         网关推送
         @param request_dict: 请求参数
         @request_dict serial_number: 序列号
-        @request_dict dev_class: 设备大类
-        @request_dict dev_type: 设备小类
         @request_dict ieee_addr: 长地址
-        @request_dict param: 事件参数
-        @request_dict defense: 防御状态,0:撤防,1:布防
+        @request_dict sensor_type: 传感器类型
+        @request_dict event_type: 事件类型
+        @request_dict defense: 防御状态,0:撤防,1:防御
+        @request_dict sensor_status: 拆动状态,拆动时传参
         @param response: 响应对象
         @return: response
         """
-        LOGGER.info('---调用网关推送接口--- request_dict:{}'.format(request_dict))
         serial_number = request_dict.get('serial_number', None)
-        dev_class = int(request_dict.get('dev_class', None))
-        dev_type = int(request_dict.get('dev_type', None))
         ieee_addr = request_dict.get('ieee_addr', None)
-        param = eval(request_dict.get('param', None))
+        sensor_type = int(request_dict.get('sensor_type', None))
+        event_type = int(request_dict.get('event_type', None))
         defense = int(request_dict.get('defense', None))
-
-        if not all([serial_number, dev_class, dev_type, ieee_addr, param]):
+        sensor_status = request_dict.get('sensor_status', None)
+        LOGGER.info('---调用网关推送接口--- request_dict:{}'.format(request_dict))
+        if not all([serial_number, ieee_addr, sensor_type, event_type]):
             return response.json(444)
 
         n_time = int(time.time())
 
         try:
-            # 根据dev_class和dev_type确定sensor_type,param确定event_type列表
-            sensor_type, event_type_list = cls.confirm_sensor_type_and_event_type(dev_class, dev_type, param)
-
             # 查询子设备表id
             gateway_sub_device_qs = GatewaySubDevice.objects.filter(device__serial_number=serial_number,
                                                                     device_type=sensor_type, ieee_addr=ieee_addr). \
@@ -83,188 +78,108 @@ class GatewayView(View):
 
             country_id = gateway_sub_device_qs[0]['device__userID__region_country']
             lang = cls.confirm_lang(country_id)
-            event_type_and_alarm_dict = cls.get_event_type_and_alarm_dict(lang, event_type_list)
+            alarm = cls.get_alarm(lang, event_type)
+
             gateway_sub_device_id = gateway_sub_device_qs[0]['id']
             nickname = gateway_sub_device_qs[0]['nickname']
-
-            for_times = 0
-            dict_len = len(event_type_and_alarm_dict)
-            for event_type, alarm in event_type_and_alarm_dict.items():
-                for_times += 1
-                sensor_record_dict = {
-                    'gateway_sub_device_id': gateway_sub_device_id,
-                    'alarm': alarm,
-                    'event_type': event_type,
-                    'created_time': n_time,
-                }
-                # 处理温湿度,不推送
-                if sensor_type == SENSOR_TYPE['tem_hum_sensor'] and (
-                        event_type == EVENT_TYPE['temperature'] or event_type == EVENT_TYPE['humidity']):
-                    num = request_dict.get('num', None)
-                    num = str(int(num) / 100)
-                    sensor_record_dict['alarm'] = num
-                    SensorRecord.objects.create(**sensor_record_dict)
-                    return response.json(0)
-
+            sensor_record_dict = {
+                'gateway_sub_device_id': gateway_sub_device_id,
+                'alarm': alarm,
+                'event_type': event_type,
+                'created_time': n_time,
+            }
+            # 处理温湿度,不推送
+            if sensor_type == SENSOR_TYPE['tem_hum_sensor'] and (
+                    event_type == EVENT_TYPE['temperature'] or event_type == EVENT_TYPE['humidity']):
+                num = request_dict.get('num', None)
+                num = str(int(num) / 100)
+                sensor_record_dict['alarm'] = num
                 SensorRecord.objects.create(**sensor_record_dict)
+                return response.json(0)
 
-                # 门磁传感器被拆动/拆动恢复,修改拆动状态
-                if event_type == 2152:
-                    gateway_sub_device_qs.update(is_tampered=1)
-                elif event_type == 2156:
-                    gateway_sub_device_qs.update(is_tampered=0)
-
-                # 撤防状态,且完成遍历,不推送
-                if defense == 0 and for_times == dict_len:
-                    return response.json(0)
-
-                device_info_qs = Device_Info.objects.filter(serial_number=serial_number).values('userID_id')
-                if not device_info_qs.exists():
-                    return response.json(173)
-
-                equipment_info_list = []
-
-                # 推送到每个添加了网关的账号
-                for device_info in device_info_qs:
-                    user_id = device_info['userID_id']
-
-                    # 组织存储数据
-                    local_date_time = CommonService.get_now_time_str(n_time=n_time, tz=0, lang='cn')[:10]
-                    equipment_info_list.append(EquipmentInfoService.get_equipment_info_obj(
-                        local_date_time,
-                        add_time=n_time,
-                        event_time=n_time,
-                        receive_time=n_time,
-                        device_uid=serial_number,
-                        device_nick_name=nickname,
-                        alarm=alarm,
-                        event_type=event_type,
-                        device_user_id=user_id,
-                    ))
-                    if equipment_info_list:
-                        # 根据日期获得星期几
-                        week = LocalDateTimeUtil.date_to_week(local_date_time)
-                        EquipmentInfoService.equipment_info_bulk_create(week, equipment_info_list)
-
-                    # 查询推送配置数据
-                    gateway_push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \
-                        values('user_id', 'app_bundle_id', 'app_type', 'push_type', 'token_val', 'm_code', 'lang',
-                               'm_code', 'tz')
-                    if not gateway_push_qs.exists():
-                        continue
+            SensorRecord.objects.create(**sensor_record_dict)
 
-                    kwargs = {
-                        'n_time': n_time,
-                        'event_type': event_type,
-                        'nickname': nickname,
-                    }
+            # (门磁,烟雾,人体)传感器被拆动/拆动恢复,修改拆动状态
+            if sensor_status:
+                if sensor_type != SENSOR_TYPE['smart_button']:  # 智能按钮不更新
+                    gateway_sub_device_qs.update(is_tampered=1)
+            elif sensor_type == SENSOR_TYPE['door_magnet'] or sensor_type == SENSOR_TYPE['smoke_sensor'] or \
+                    sensor_type == SENSOR_TYPE['body_sensor']:
+                gateway_sub_device_qs.update(is_tampered=0)
 
-                    # 推送到每台登录账号的手机
-                    for gateway_push in gateway_push_qs:
-                        app_bundle_id = gateway_push['app_bundle_id']
-                        push_type = gateway_push['push_type']
-                        token_val = gateway_push['token_val']
-                        lang = gateway_push['lang']
-                        tz = gateway_push['tz'] if gateway_push['tz'] else 0
+            # 撤防状态不推送
+            if defense == 0:
+                return response.json(0)
 
-                        # 获取推送所需数据
-                        msg_title = PushObject.get_msg_title(nickname)
-                        msg_text = PushObject.get_gateway_msg_text(n_time, tz, lang, alarm)
+            device_info_qs = Device_Info.objects.filter(serial_number=serial_number).values('userID_id')
+            if not device_info_qs.exists():
+                return response.json(173)
 
-                        kwargs['msg_title'] = msg_title
-                        kwargs['msg_text'] = msg_text
-                        kwargs['app_bundle_id'] = app_bundle_id
-                        kwargs['token_val'] = token_val
+            equipment_info_list = []
+
+            for device_info in device_info_qs:
+                user_id = device_info['userID_id']
+
+                # 组织存储数据
+                local_date_time = CommonService.get_now_time_str(n_time=n_time, tz=0, lang='cn')[:10]
+                equipment_info_list.append(EquipmentInfoService.get_equipment_info_obj(
+                    local_date_time,
+                    add_time=n_time,
+                    event_time=n_time,
+                    receive_time=n_time,
+                    device_uid=serial_number,
+                    device_nick_name=nickname,
+                    alarm=alarm,
+                    event_type=event_type,
+                    device_user_id=user_id,
+                ))
+                if equipment_info_list:
+                    # 根据日期获得星期几
+                    week = LocalDateTimeUtil.date_to_week(local_date_time)
+                    EquipmentInfoService.equipment_info_bulk_create(week, equipment_info_list)
+
+                # 查询推送配置数据
+                gateway_push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \
+                    values('user_id', 'app_bundle_id', 'app_type', 'push_type', 'token_val', 'm_code', 'lang', 'm_code',
+                           'tz')
+                if not gateway_push_qs.exists():
+                    continue
+
+                kwargs = {
+                    'n_time': n_time,
+                    'event_type': event_type,
+                    'nickname': nickname,
+                }
 
-                        try:
-                            # 推送消息
-                            cls.push_msg(push_type, **kwargs)
-                        except Exception as e:
-                            LOGGER.info('网关推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
-                            continue
+                # 推送到每台登录账号的手机
+                for gateway_push in gateway_push_qs:
+                    app_bundle_id = gateway_push['app_bundle_id']
+                    push_type = gateway_push['push_type']
+                    token_val = gateway_push['token_val']
+                    lang = gateway_push['lang']
+                    tz = gateway_push['tz'] if gateway_push['tz'] else 0
+
+                    # 获取推送所需数据
+                    msg_title = PushObject.get_msg_title(nickname)
+                    msg_text = PushObject.get_gateway_msg_text(n_time, tz, lang, alarm)
+
+                    kwargs['msg_title'] = msg_title
+                    kwargs['msg_text'] = msg_text
+                    kwargs['app_bundle_id'] = app_bundle_id
+                    kwargs['token_val'] = token_val
+
+                    try:
+                        # 推送消息
+                        cls.push_msg(push_type, **kwargs)
+                    except Exception as e:
+                        LOGGER.info('网关推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                        continue
 
             return response.json(0)
         except Exception as e:
             LOGGER.info('---网关推送接口异常--- {}'.format(repr(e)))
             return response.json(500, repr(e))
 
-    @staticmethod
-    def confirm_sensor_type_and_event_type(dev_class, dev_type, param):
-        """
-        根据dev_class和dev_type确定sensor_type,param确定event_type
-        @param dev_class: 设备大类(开关量传感器、温湿度、灯)
-        @param dev_type: 设备小类(传感器类型、灯类型、温湿度类型)
-        @param param: 事件参数
-        @return: sensor_type, event_type_list
-        """
-        sensor_type, event_type_list = 0, []
-        if dev_class == 0:  # 灯,待定
-            sensor_type = 0
-        elif dev_class == 1:  # 网关
-            sensor_type = 200
-        elif dev_class == 2:  # 开关类传感器
-            if dev_type == 13:  # 人体红外
-                sensor_type = 219
-            elif dev_type == 22:  # 门磁
-                sensor_type = 215
-            elif dev_type == 42:  # 水浸
-                sensor_type = 217
-            elif dev_type == 44:  # 智能按钮
-                sensor_type = 216
-        elif dev_class == 3:  # 测量类传感器
-            if dev_type == 1:  # 温湿度
-                sensor_type = 220
-            elif dev_type == 2:  # 亮度,待定
-                sensor_type = 0
-        elif dev_class == 5:  # 智能锁
-            if dev_type == 1:  # 门锁,待定
-                sensor_type = 0
-        elif dev_class == 6:  # 电机类设备
-            if dev_type == 1:  # 窗帘,待定
-                sensor_type = 0
-
-        if sensor_type == 215:  # 门磁
-            if param['alarm'] == 1:  # 门磁开
-                event_type_list.append(2150)
-            elif param['alarm'] == 0:  # 门磁关
-                event_type_list.append(2151)
-            if param['tamper'] == 1:  # 拆动
-                event_type_list.append(2152)
-            if param['tamper'] == 0:  # 拆动恢复
-                event_type_list.append(2156)
-            if param['battery'] == 1:  # 低电量
-                event_type_list.append(2153)
-
-        elif sensor_type == 216:  # 智能按钮
-            if param['alarm'] == 1:  # 按下
-                event_type_list.append(2160)
-            if param['smrt_btn'] == 1:  # 单击
-                event_type_list.append(2161)
-            elif param['smrt_btn'] == 2:  # 双击
-                event_type_list.append(2162)
-            elif param['smrt_btn'] == 3:  # 三击
-                event_type_list.append(2163)
-            if param['battery'] == 1:  # 低电量
-                event_type_list.append(2164)
-
-        elif sensor_type == 217:  # 水浸
-            if param['alarm'] == 1:  # 水浸触发
-                event_type_list.append(2170)
-            elif param['alarm'] == 0:  # 水浸恢复
-                event_type_list.append(2171)
-            if param['battery'] == 1:  # 低电量
-                event_type_list.append(2172)
-
-        elif sensor_type == 219:  # 人体红外
-            if param['alarm'] == 1:  # 有人移动
-                event_type_list.append(2190)
-            elif param['alarm'] == 0:  # 无人移动
-                event_type_list.append(2191)
-            if param['battery'] == 1:  # 低电量
-                event_type_list.append(2193)
-
-        return sensor_type, event_type_list
-
     @staticmethod
     def confirm_lang(country_id):
         """
@@ -280,104 +195,99 @@ class GatewayView(View):
         return lang
 
     @staticmethod
-    def get_event_type_and_alarm_dict(lang, event_type_list):
+    def get_alarm(lang, event_type):
         """
-        获取事件类型和提示字典数据
+        根据语言和事件类型确定警报内容
         @param lang: 语言
-        @param event_type_list: 事件类型列表
-        @return event_type_and_alarm_dict: 事件类型字典
+        @param event_type: 事件类型
+        @return alarm: 警报内容
         """
         alarm = ''
-        event_type_and_alarm_dict = {}
         if lang == 'CN':
-            for event_type in event_type_list:
-                # 门磁
-                if event_type == 2150:
-                    alarm = '门磁开'
-                elif event_type == 2151:
-                    alarm = '门磁关'
-                elif event_type == 2152:
-                    alarm = '被拆动'
-                elif event_type == 2156:
-                    alarm = '拆动恢复'
-
-                # 智能按钮
-                elif event_type == 2160:
-                    alarm = '紧急按钮按下'
-                elif event_type == 2161:
-                    alarm = '按钮已按1下'
-                elif event_type == 2162:
-                    alarm = '按钮已按2下'
-                elif event_type == 2163:
-                    alarm = '按钮已按3下'
-
-                # 水浸
-                elif event_type == 2170:
-                    alarm = '水浸触发'
-                elif event_type == 2171:
-                    alarm = '水浸恢复'
-
-                # 烟雾
-                elif event_type == 2180:
-                    alarm = '烟雾触发'
-                elif event_type == 2181:
-                    alarm = '烟雾恢复'
-
-                # 人体红外
-                elif event_type == 2190:
-                    alarm = '有人移动'
-                elif event_type == 2191:
-                    alarm = '无人移动'
-
-                # 低电量
-                elif event_type in (2153, 2164, 2172, 2182, 2193):
-                    alarm = '低电量'
-                event_type_and_alarm_dict[event_type] = alarm
+            # 门磁
+            if event_type == 2150:
+                alarm = '门磁开'
+            elif event_type == 2151:
+                alarm = '门磁关'
+            elif event_type == 2152:
+                alarm = '被拆动'
+            elif event_type == 2156:
+                alarm = '拆动恢复'
+
+            # 智能按钮
+            elif event_type == 2160:
+                alarm = '紧急按钮按下'
+            elif event_type == 2161:
+                alarm = '按钮已按1下'
+            elif event_type == 2162:
+                alarm = '按钮已按2下'
+            elif event_type == 2163:
+                alarm = '按钮已按3下'
+
+            # 水浸
+            elif event_type == 2170:
+                alarm = '水浸触发'
+            elif event_type == 2171:
+                alarm = '水浸恢复'
+
+            # 烟雾
+            elif event_type == 2180:
+                alarm = '烟雾触发'
+            elif event_type == 2181:
+                alarm = '烟雾恢复'
+
+            # 人体红外
+            elif event_type == 2190:
+                alarm = '有人移动'
+            elif event_type == 2191:
+                alarm = '无人移动'
+
+            # 低电量
+            elif event_type in (2153, 2164, 2172, 2182, 2193):
+                alarm = '低电量'
         else:
-            for event_type in event_type_list:
-                # 门磁
-                if event_type == 2150:
-                    alarm = 'Door magnetic opening'
-                elif event_type == 2151:
-                    alarm = 'Door magnetic closing'
-                elif event_type == 2152:
-                    alarm = 'Be dismantled'
-                elif event_type == 2156:
-                    alarm = 'Dismantling recovery'
-
-                # 智能按钮
-                elif event_type == 2160:
-                    alarm = 'Emergency button pressed'
-                elif event_type == 2161:
-                    alarm = 'Button pressed once'
-                elif event_type == 2162:
-                    alarm = 'The button has been pressed twice'
-                elif event_type == 2163:
-                    alarm = 'The button has been pressed 3 times'
-
-                # 水浸
-                elif event_type == 2170:
-                    alarm = 'Water immersion trigger'
-                elif event_type == 2171:
-                    alarm = 'Water immersion recovery'
-
-                # 烟雾
-                elif event_type == 2180:
-                    alarm = 'Smoke triggering'
-                elif event_type == 2181:
-                    alarm = 'Smoke recovery'
-
-                # 人体红外
-                elif event_type == 2190:
-                    alarm = 'Someone moving'
-                elif event_type == 2191:
-                    alarm = 'Unmanned movement'
-
-                # 低电量
-                elif event_type in (2153, 2164, 2172, 2182, 2193):
-                    alarm = 'LOW BATTERY'
-                event_type_and_alarm_dict[event_type] = alarm
-        return event_type_and_alarm_dict
+            # 门磁
+            if event_type == 2150:
+                alarm = 'Door magnetic opening'
+            elif event_type == 2151:
+                alarm = 'Door magnetic closing'
+            elif event_type == 2152:
+                alarm = 'Be dismantled'
+            elif event_type == 2156:
+                alarm = 'Dismantling recovery'
+
+            # 智能按钮
+            elif event_type == 2160:
+                alarm = 'Emergency button pressed'
+            elif event_type == 2161:
+                alarm = 'Button pressed once'
+            elif event_type == 2162:
+                alarm = 'The button has been pressed twice'
+            elif event_type == 2163:
+                alarm = 'The button has been pressed 3 times'
+
+            # 水浸
+            elif event_type == 2170:
+                alarm = 'Water immersion trigger'
+            elif event_type == 2171:
+                alarm = 'Water immersion recovery'
+
+            # 烟雾
+            elif event_type == 2180:
+                alarm = 'Smoke triggering'
+            elif event_type == 2181:
+                alarm = 'Smoke recovery'
+
+            # 人体红外
+            elif event_type == 2190:
+                alarm = 'Someone moving'
+            elif event_type == 2191:
+                alarm = 'Unmanned movement'
+
+            # 低电量
+            elif event_type in (2153, 2164, 2172, 2182, 2193):
+                alarm = 'LOW BATTERY'
+        return alarm
 
     @classmethod
     def scene_log_push(cls, request_dict, response):
@@ -389,10 +299,9 @@ class GatewayView(View):
         @param response: 响应对象
         @return: response
         """
-        logger = logging.getLogger('info')
         scene_id = request_dict.get('sceneId', None)
         status = request_dict.get('status', None)
-        logger.info('---场景日志推送接口--- request_dict:{}'.format(request_dict))
+        LOGGER.info('---场景日志推送接口--- request_dict:{}'.format(request_dict))
         if not all([scene_id, status]):
             return response.json(444)
 
@@ -456,11 +365,12 @@ class GatewayView(View):
                             # 推送消息
                             cls.push_msg(push_type, **kwargs)
                         except Exception as e:
-                            logger.info('场景日志推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                            LOGGER.info(
+                                '场景日志推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
                             continue
             return response.json(0)
         except Exception as e:
-            logger.info('---场景日志推送接口异常--- {}'.format(repr(e)))
+            LOGGER.info('---场景日志推送接口异常--- {}'.format(repr(e)))
             return response.json(500, repr(e))
 
     @staticmethod
@@ -496,7 +406,6 @@ class GatewayView(View):
         """
         智能插座开关状态推送
         """
-        logger = logging.getLogger('info')
         try:
             switch_key = 'LOOCAM:SOCKET:SERIAL:NUMBER:{}'
             redis_obj = RedisObject(db=7)
@@ -521,5 +430,5 @@ class GatewayView(View):
             redis_obj.set_data(switch_key, status, 60 * 3)
             return response.json(0)
         except Exception as e:
-            logger.info('---插座开关日志推送接口异常--- {}'.format(repr(e)))
+            LOGGER.info('---插座开关日志推送接口异常--- {}'.format(repr(e)))
             return response.json(500, repr(e))