|
@@ -792,10 +792,11 @@ class SmartSceneView(View):
|
|
|
values('device__serial_number')[0]['device__serial_number']
|
|
|
topic_name = SMART_SCENE_TOPIC.format(serial_number)
|
|
|
with transaction.atomic():
|
|
|
- smart_scene_qs = SmartScene.objects.filter(id__in=smart_scene_id_list).values('scene_data')
|
|
|
+ smart_scene_qs = SmartScene.objects.filter(id__in=smart_scene_id_list)
|
|
|
|
|
|
# 删除定时任务
|
|
|
- for smart_scene in smart_scene_qs:
|
|
|
+ smart_scene_data = smart_scene_qs.values('scene_data')
|
|
|
+ for smart_scene in smart_scene_data:
|
|
|
scene_data = smart_scene['scene_data']
|
|
|
if scene_data:
|
|
|
scene_data_dict = eval(scene_data)
|
|
@@ -1067,8 +1068,14 @@ class SmartSceneView(View):
|
|
|
cls.del_aps_job(scene_data_dict)
|
|
|
task_list = []
|
|
|
mqtt_task_list = []
|
|
|
+ total_delay_time = 0
|
|
|
+
|
|
|
+ # 组织条件数据
|
|
|
+ condition = cls.get_condition(conditions_dict, now_time, tz)
|
|
|
+
|
|
|
for task in tasks_list:
|
|
|
sensor_type = int(task['device_type'])
|
|
|
+ total_delay_time += task['delay_time']
|
|
|
# 处理插座数据
|
|
|
# 不用添加到设备的任务列表,添加到mqtt任务列表
|
|
|
if sensor_type == DEVICE_TYPE['socket']:
|
|
@@ -1088,7 +1095,7 @@ class SmartSceneView(View):
|
|
|
repeat = conditions_dict['time']['repeat']
|
|
|
|
|
|
task_temp['task_id'] = cls.create_aps_job(
|
|
|
- minutes, delay_time, tz, now_time, repeat, sensor_type, event_type, serial_number)
|
|
|
+ condition, minutes, total_delay_time, tz, repeat, sensor_type, event_type, serial_number)
|
|
|
mqtt_task_list.append(task_temp)
|
|
|
else:
|
|
|
task_temp = {
|
|
@@ -1122,7 +1129,7 @@ class SmartSceneView(View):
|
|
|
scene_data = ''
|
|
|
if mqtt_task_list:
|
|
|
scene_data = {
|
|
|
- 'condition': cls.get_condition(conditions_dict, now_time, tz),
|
|
|
+ 'condition': condition,
|
|
|
'task_list': mqtt_task_list
|
|
|
}
|
|
|
|
|
@@ -1151,6 +1158,8 @@ class SmartSceneView(View):
|
|
|
time_string = CommonService.get_date_from_timestamp(now_time, tz)
|
|
|
time_string += ' {:02d}:{:02d}:00'.format(hour, minute)
|
|
|
time_stamp = CommonService.convert_to_timestamp(tz, time_string)
|
|
|
+ if time_stamp < now_time:
|
|
|
+ time_stamp += 24 * 60 * 60
|
|
|
time_dict = {
|
|
|
'time_stamp': time_stamp
|
|
|
}
|
|
@@ -1236,14 +1245,14 @@ class SmartSceneView(View):
|
|
|
return False
|
|
|
|
|
|
@classmethod
|
|
|
- def create_aps_job(cls, minutes, delay_time, tz, now_time, repeat, device_type, event_type, serial_number):
|
|
|
+ def create_aps_job(cls, condition, minutes, total_delay_time, tz, repeat, device_type, event_type, serial_number):
|
|
|
"""
|
|
|
创建定时任务
|
|
|
返回任务id和时间
|
|
|
+ @param condition: 条件数据
|
|
|
@param minutes: 分钟时间
|
|
|
- @param delay_time: 延迟时间
|
|
|
+ @param total_delay_time: 总延迟时间
|
|
|
@param tz: 时区
|
|
|
- @param now_time: 当前时间
|
|
|
@param repeat: 星期周期的十进制数
|
|
|
@param device_type: 设备类型
|
|
|
@param event_type: 事件类型
|
|
@@ -1254,21 +1263,13 @@ class SmartSceneView(View):
|
|
|
apscheduler_obj = ApschedulerObject(tz)
|
|
|
# 一次性任务
|
|
|
if repeat == 0:
|
|
|
- # 根据时间戳和时区获取年月日,拼接由分钟转换出来的时间
|
|
|
- time_string = CommonService.get_date_from_timestamp(now_time, tz)
|
|
|
- hour, minute = divmod(minutes, 60)
|
|
|
- time_string += ' {:02d}:{:02d}:00'.format(hour, minute)
|
|
|
- time_stamp = CommonService.convert_to_timestamp(tz, time_string)
|
|
|
- # 加上延时,如果执行时间小于当前时间,延迟24小时执行
|
|
|
- time_stamp += delay_time
|
|
|
- if time_stamp < now_time:
|
|
|
- time_stamp += 24 * 60 * 60
|
|
|
+ time_stamp = condition['time_dict']['time_stamp'] + total_delay_time
|
|
|
task_id += str(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))
|
|
|
# 周期任务
|
|
|
else:
|
|
|
- hour, minute, second, is_next_day = cls.handle_delay_time(minutes, delay_time)
|
|
|
+ hour, minute, second, is_next_day = cls.handle_delay_time(minutes, total_delay_time)
|
|
|
# 加上延时,如果执行时间超过23:59,隔天执行
|
|
|
weeks = cls.int_to_weeks(repeat, is_next_day)
|
|
|
time_str = weeks + '_{:02d}{:02d}{:02d}'.format(hour, minute, second)
|
|
@@ -1314,7 +1315,11 @@ class SmartSceneView(View):
|
|
|
next_day = 1 if is_next_day else 0
|
|
|
for i, bit in enumerate(bin_str):
|
|
|
if bit == '1':
|
|
|
- weeks += str(i+next_day) + ','
|
|
|
+ # 7 -> 0
|
|
|
+ week = i + next_day
|
|
|
+ if week == 7:
|
|
|
+ week = 0
|
|
|
+ weeks += str(week) + ','
|
|
|
# 删除最后一个逗号并返回结果
|
|
|
return weeks[:-1]
|
|
|
|
|
@@ -1369,7 +1374,7 @@ class SmartSceneView(View):
|
|
|
if scene_status == SCENE_STATUS_OFF:
|
|
|
cls.pause_time_job(apscheduler_obj, scene_data_dict)
|
|
|
else:
|
|
|
- cls.resume_time_job(apscheduler_obj, time_type, scene_data_dict)
|
|
|
+ return cls.resume_time_job(apscheduler_obj, time_type, scene_data_dict)
|
|
|
|
|
|
@staticmethod
|
|
|
def pause_time_job(apscheduler_obj, scene_data_dict):
|
|
@@ -1433,6 +1438,7 @@ class SmartSceneView(View):
|
|
|
time_task['task_id'] = task_id
|
|
|
# 更新场景数据的时间戳
|
|
|
scene_data_dict['condition']['time_dict']['time_stamp'] = time_stamp
|
|
|
+ return scene_data_dict
|
|
|
|
|
|
|
|
|
#
|