|
@@ -526,11 +526,7 @@ class SmartSceneView(View):
|
|
|
try:
|
|
|
smart_scene_id = int(smart_scene_id)
|
|
|
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).\
|
|
|
values('device_id', 'sub_device_id', 'scene_data')
|
|
@@ -545,25 +541,34 @@ class SmartSceneView(View):
|
|
|
smart_scene_data = {
|
|
|
'is_enable': is_enable
|
|
|
}
|
|
|
+ no_device_task = False
|
|
|
# 如果存在定时任务,暂停或恢复任务
|
|
|
scene_data = smart_scene_qs[0]['scene_data']
|
|
|
if 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():
|
|
|
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)
|
|
|
except Exception as 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)
|
|
|
|
|
|
@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_status: 场景状态: SCENE_STATUS_ON, SCENE_STATUS_OFF
|
|
|
+ @param scene_id: 场景id
|
|
|
@return: None or scene_data_dict
|
|
|
"""
|
|
|
# 判断条件是否为设置时间
|
|
@@ -1426,7 +1432,7 @@ class SmartSceneView(View):
|
|
|
if scene_status == SCENE_STATUS_OFF:
|
|
|
cls.pause_time_job(apscheduler_obj, scene_data_dict)
|
|
|
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
|
|
|
def pause_time_job(apscheduler_obj, scene_data_dict):
|
|
@@ -1446,12 +1452,13 @@ class SmartSceneView(View):
|
|
|
continue
|
|
|
|
|
|
@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 time_type: 时间类型: date, cron
|
|
|
@param scene_data_dict: 场景数据
|
|
|
+ @param scene_id: 场景id
|
|
|
@return: None or time_stamp
|
|
|
"""
|
|
|
time_task_list = scene_data_dict['task_list']
|
|
@@ -1480,13 +1487,16 @@ class SmartSceneView(View):
|
|
|
else:
|
|
|
# 创建新的定时任务,时间+24小时
|
|
|
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']
|
|
|
event_type = time_task['event_type']
|
|
|
serial_number = time_task['serial_number']
|
|
|
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,
|
|
|
- args=(device_type, event_type, serial_number))
|
|
|
+ args=(device_type, event_type, serial_number, smart_scene_id))
|
|
|
# 更新task_id
|
|
|
time_task['task_id'] = task_id
|
|
|
# 更新场景数据的时间戳
|