Эх сурвалжийг харах

场景数据增加no_device_task,打开/关闭场景判断是否通知设备

locky 1 жил өмнө
parent
commit
95e45d4559

+ 32 - 22
Controller/SensorGateway/SmartSceneController.py

@@ -526,11 +526,7 @@ class SmartSceneView(View):
         try:
         try:
             smart_scene_id = int(smart_scene_id)
             smart_scene_id = int(smart_scene_id)
             scene_status = SCENE_STATUS_ON if is_enable == 'True' else SCENE_STATUS_OFF
             scene_status = SCENE_STATUS_ON if is_enable == 'True' else SCENE_STATUS_OFF
-            msg = {
-                'scene_event': SCENE_EVENT_EDIT_STATUS,
-                'scene_id': smart_scene_id,
-                'scene_status': scene_status
-            }
+
             # 查询序列号
             # 查询序列号
             smart_scene_qs = SmartScene.objects.filter(id=smart_scene_id).\
             smart_scene_qs = SmartScene.objects.filter(id=smart_scene_id).\
                 values('device_id', 'sub_device_id', 'scene_data')
                 values('device_id', 'sub_device_id', 'scene_data')
@@ -545,25 +541,34 @@ class SmartSceneView(View):
             smart_scene_data = {
             smart_scene_data = {
                 'is_enable': is_enable
                 'is_enable': is_enable
             }
             }
+            no_device_task = False
             # 如果存在定时任务,暂停或恢复任务
             # 如果存在定时任务,暂停或恢复任务
             scene_data = smart_scene_qs[0]['scene_data']
             scene_data = smart_scene_qs[0]['scene_data']
             if scene_data:
             if scene_data:
                 scene_data_dict = eval(scene_data)
                 scene_data_dict = eval(scene_data)
-                new_scene_data_dict = cls.pause_or_resume_job(scene_data_dict, scene_status)
-                if new_scene_data_dict:
-                    new_scene_data = json.dumps(new_scene_data_dict)
-                    smart_scene_data['scene_data'] = new_scene_data
-
-            topic_name = SMART_SCENE_TOPIC.format(serial_number)
+                no_device_task = scene_data_dict.get('no_device_task')
+                if no_device_task is not None:
+                    # 无设备任务,需要scene_id上报场景日志
+                    scene_id = smart_scene_id if no_device_task else 0
+                    new_scene_data_dict = cls.pause_or_resume_job(scene_data_dict, scene_status, scene_id)
+                    if new_scene_data_dict:
+                        smart_scene_data['scene_data'] = new_scene_data_dict
 
 
             with transaction.atomic():
             with transaction.atomic():
                 SmartScene.objects.filter(id=smart_scene_id).update(**smart_scene_data)
                 SmartScene.objects.filter(id=smart_scene_id).update(**smart_scene_data)
-                # 通过mqtt发送设备数据
-                success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
-                try:
-                    assert success
-                except AssertionError:
-                    return response.json(10044)
+                # 存在设备任务,通过mqtt发送设备数据
+                if not no_device_task:
+                    topic_name = SMART_SCENE_TOPIC.format(serial_number)
+                    msg = {
+                        'scene_event': SCENE_EVENT_EDIT_STATUS,
+                        'scene_id': smart_scene_id,
+                        'scene_status': scene_status
+                    }
+                    success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
+                    try:
+                        assert success
+                    except AssertionError:
+                        return response.json(10044)
             return response.json(0)
             return response.json(0)
         except Exception as e:
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
@@ -1411,11 +1416,12 @@ class SmartSceneView(View):
                         apscheduler_obj.del_job(task_id)
                         apscheduler_obj.del_job(task_id)
 
 
     @classmethod
     @classmethod
-    def pause_or_resume_job(cls, scene_data_dict, scene_status):
+    def pause_or_resume_job(cls, scene_data_dict, scene_status, scene_id):
         """
         """
         暂停或恢复定时任务
         暂停或恢复定时任务
         @param scene_data_dict: 场景数据
         @param scene_data_dict: 场景数据
         @param scene_status: 场景状态: SCENE_STATUS_ON, SCENE_STATUS_OFF
         @param scene_status: 场景状态: SCENE_STATUS_ON, SCENE_STATUS_OFF
+        @param scene_id: 场景id
         @return: None or scene_data_dict
         @return: None or scene_data_dict
         """
         """
         # 判断条件是否为设置时间
         # 判断条件是否为设置时间
@@ -1426,7 +1432,7 @@ class SmartSceneView(View):
             if scene_status == SCENE_STATUS_OFF:
             if scene_status == SCENE_STATUS_OFF:
                 cls.pause_time_job(apscheduler_obj, scene_data_dict)
                 cls.pause_time_job(apscheduler_obj, scene_data_dict)
             else:
             else:
-                return cls.resume_time_job(apscheduler_obj, time_type, scene_data_dict)
+                return cls.resume_time_job(apscheduler_obj, time_type, scene_data_dict, scene_id)
 
 
     @staticmethod
     @staticmethod
     def pause_time_job(apscheduler_obj, scene_data_dict):
     def pause_time_job(apscheduler_obj, scene_data_dict):
@@ -1446,12 +1452,13 @@ class SmartSceneView(View):
                     continue
                     continue
 
 
     @classmethod
     @classmethod
-    def resume_time_job(cls, apscheduler_obj, time_type, scene_data_dict):
+    def resume_time_job(cls, apscheduler_obj, time_type, scene_data_dict, scene_id):
         """
         """
         恢复定时任务
         恢复定时任务
         @param apscheduler_obj: apscheduler对象
         @param apscheduler_obj: apscheduler对象
         @param time_type: 时间类型: date, cron
         @param time_type: 时间类型: date, cron
         @param scene_data_dict: 场景数据
         @param scene_data_dict: 场景数据
+        @param scene_id: 场景id
         @return: None or time_stamp
         @return: None or time_stamp
         """
         """
         time_task_list = scene_data_dict['task_list']
         time_task_list = scene_data_dict['task_list']
@@ -1480,13 +1487,16 @@ class SmartSceneView(View):
             else:
             else:
                 # 创建新的定时任务,时间+24小时
                 # 创建新的定时任务,时间+24小时
                 time_stamp += 24 * 60 * 60
                 time_stamp += 24 * 60 * 60
-                for time_task in time_task_list:
+                task_list_len = len(time_task_list)
+                for index, time_task in enumerate(time_task_list):
                     device_type = time_task['device_type']
                     device_type = time_task['device_type']
                     event_type = time_task['event_type']
                     event_type = time_task['event_type']
                     serial_number = time_task['serial_number']
                     serial_number = time_task['serial_number']
                     task_id = serial_number + '_' + str(time_stamp)
                     task_id = serial_number + '_' + str(time_stamp)
+                    # 最后一个任务使用传入的scene_id
+                    smart_scene_id = scene_id if index == task_list_len-1 else 0
                     apscheduler_obj.create_date_job(func=cls.pub_mqtt, task_id=task_id, time_stamp=time_stamp,
                     apscheduler_obj.create_date_job(func=cls.pub_mqtt, task_id=task_id, time_stamp=time_stamp,
-                                                    args=(device_type, event_type, serial_number))
+                                                    args=(device_type, event_type, serial_number, smart_scene_id))
                     # 更新task_id
                     # 更新task_id
                     time_task['task_id'] = task_id
                     time_task['task_id'] = task_id
                 # 更新场景数据的时间戳
                 # 更新场景数据的时间戳