SmartSwitchController.py 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. # -*- coding: utf-8 -*-
  2. """
  3. # @Author : cheng
  4. # @Time : 2023/7/10 11:20
  5. # @File: SmartSwitchController.py
  6. """
  7. import datetime
  8. import json
  9. import os
  10. import threading
  11. import time
  12. from django.views import View
  13. from Model.models import SwitchDimmingSettings, SwitchChronopher, Device_Info, SceneLog, FamilyRoomDevice, \
  14. SwitchOperateLog
  15. from Object.RedisObject import RedisObject
  16. from Service.CommonService import CommonService
  17. from Object.CeleryBeatObject import CeleryBeatObj
  18. from django.db import transaction
  19. from Ansjer.config import LOGGER
  20. APSCHEDULER_TOPIC_NAME = 'loocam/switch/time_scheduling/{}' # 排程主题
  21. RESET_SWITCH_TOPIC_NAME = 'loocam/smart-switch/{}' # 重置设备
  22. MQTT_TASK = 'Controller.CeleryTasks.tasks.send_mqtt'
  23. class SmartSwitchView(View):
  24. def get(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.GET, request, operation)
  28. def post(self, request, *args, **kwargs):
  29. request.encoding = 'utf-8'
  30. operation = kwargs.get('operation')
  31. return self.validation(request.POST, request, operation)
  32. def validation(self, request_dict, request, operation):
  33. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  34. if operation == 'switch-chronopher-log': # 设备上报排程日志
  35. return self.create_chronopher_log(request_dict, response)
  36. if operation == 'switch-operate-log': # 设备上报操作日志
  37. return self.create_operate_log(request_dict, response)
  38. elif operation == 'reset': # 设备重置
  39. return self.reset(request_dict, response)
  40. else:
  41. if token_code != 0:
  42. return response.json(token_code)
  43. if operation == 'get-dimming-setting': # 获取智能开关调光设置
  44. return self.get_dimming_setting(request_dict, response)
  45. elif operation == 'get-chronopher-setting': # 获取定时计划
  46. return self.get_chronopher_setting(request_dict, response)
  47. elif operation == 'add-or-edit-chronopher': # 添加/编辑定时计划
  48. return self.add_or_edit_chronopher(request_dict, response)
  49. elif operation == 'edit-chronopher-status': # 修改定时计划状态
  50. return self.edit_chronopher_status(request_dict, response)
  51. elif operation == 'delete-chronopher': # 删除定时计划
  52. return self.delete_chronopher(request_dict, response)
  53. elif operation == 'edit-dimming-correction': # 设置调光校正
  54. return self.edit_dimming_correction(request_dict, response)
  55. elif operation == 'edit-dimming-setting': # 修改智能开关调光设置
  56. return self.edit_dimming_setting(request_dict, response)
  57. elif operation == 'get-chronopher-log': # 查询排程日志
  58. return self.get_chronopher_log(request_dict, response)
  59. elif operation == 'get-operate-log': # 查询普通操作日志
  60. return self.get_operate_log(request_dict, response)
  61. else:
  62. return response.json(414)
  63. @staticmethod
  64. def get_dimming_setting(request_dict, response):
  65. """
  66. 获取智能开关调光设置信息
  67. @param request_dict: 请求参数
  68. @request_dict deviceId: 设备id
  69. @param response: 响应对象
  70. @return: response
  71. """
  72. device_id = request_dict.get('deviceId', None)
  73. if not device_id:
  74. return response.json(444)
  75. try:
  76. switch_setting_info_qs = SwitchDimmingSettings.objects.filter(device_id=device_id).values()
  77. if not switch_setting_info_qs.exists():
  78. return response.json(173)
  79. res = {
  80. 'clickTurnOnSpeed': switch_setting_info_qs[0]['click_turn_on_speed'],
  81. 'clickTurnOffSpeed': switch_setting_info_qs[0]['click_turn_off_speed'],
  82. 'doubleClick': switch_setting_info_qs[0]['double_click'],
  83. 'press': switch_setting_info_qs[0]['press'],
  84. 'doublePressClickTurnOnSpeed': switch_setting_info_qs[0]['double_press_click_turn_on_speed'],
  85. 'doublePressClickTurnOffSpeed': switch_setting_info_qs[0]['double_press_click_turn_off_speed'],
  86. 'dimmingCorrection': switch_setting_info_qs[0]['dimming_correction'],
  87. }
  88. return response.json(0, res)
  89. except Exception as e:
  90. print(e)
  91. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  92. @staticmethod
  93. def edit_dimming_correction(request_dict, response):
  94. """
  95. 修改智能开关调光校正
  96. @param request_dict: 请求参数
  97. @request_dict deviceId: 设备id
  98. @request_dict dimmingCorrection: 调光校正
  99. @param response: 响应对象
  100. @return: response
  101. """
  102. device_id = request_dict.get('deviceId', None)
  103. dimming_correction = request_dict.get('dimmingCorrection', None)
  104. if not device_id:
  105. return response.json(444)
  106. try:
  107. SwitchDimmingSettings.objects.filter(device_id=device_id).update(dimming_correction=dimming_correction)
  108. return response.json(0)
  109. except Exception as e:
  110. print(e)
  111. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  112. @staticmethod
  113. def edit_dimming_setting(request_dict, response):
  114. """
  115. 修改智能开关调光设置
  116. @param request_dict: 请求参数
  117. @request_dict deviceId: 设备id
  118. @request_dict clickTurnOnSpeed: 单击开启速度
  119. @request_dict clickTurnOffSpeed: 单击关闭速度
  120. @request_dict doubleClick: 双击
  121. @request_dict press: 长按
  122. @request_dict doublePressClickTurnOnSpeed: 双击/长按开启速度
  123. @request_dict doublePressClickTurnOffSpeed: 双击/长按单击关闭速度
  124. @param response: 响应对象
  125. @return: response
  126. """
  127. device_id = request_dict.get('deviceId', None)
  128. click_turn_on_speed = request_dict.get('clickTurnOnSpeed', None)
  129. click_turn_off_speed = request_dict.get('clickTurnOffSpeed', None)
  130. double_click = request_dict.get('doubleClick', None)
  131. press = request_dict.get('press', None)
  132. double_press_click_turn_on_speed = request_dict.get('doublePressClickTurnOnSpeed', None)
  133. double_press_click_turn_off_speed = request_dict.get('doublePressClickTurnOffSpeed', None)
  134. if not device_id:
  135. return response.json(444)
  136. try:
  137. dimming_setting_data = {
  138. 'device_id': device_id,
  139. 'click_turn_on_speed': click_turn_on_speed,
  140. 'click_turn_off_speed': click_turn_off_speed,
  141. 'double_click': double_click,
  142. 'press': press,
  143. 'double_press_click_turn_on_speed': double_press_click_turn_on_speed,
  144. 'double_press_click_turn_off_speed': double_press_click_turn_off_speed
  145. }
  146. SwitchDimmingSettings.objects.filter(device_id=device_id).update(**dimming_setting_data)
  147. return response.json(0)
  148. except Exception as e:
  149. print(e)
  150. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  151. @staticmethod
  152. def get_chronopher_setting(request_dict, response):
  153. """
  154. 获取定时计划设置
  155. @param request_dict: 请求参数
  156. @request_dict deviceId: 设备id
  157. @param response: 响应对象
  158. @return: response
  159. """
  160. device_id = request_dict.get('deviceId', None)
  161. if not device_id:
  162. return response.json(444)
  163. try:
  164. switch_chronopher_qs = SwitchChronopher.objects.filter(device_id=device_id).values()
  165. if not switch_chronopher_qs.exists():
  166. return response.json(173)
  167. switch_chronopher_list = []
  168. for item in switch_chronopher_qs:
  169. switch_chronopher_list.append({
  170. 'chronopherId': item['id'],
  171. 'timeTypeRadio': item['time_type_radio'],
  172. 'timePoint': item['time_point'],
  173. 'timeQuantumStartTime': item['time_quantum_start_time'],
  174. 'timeQuantumEndTime': item['time_quantum_end_time'],
  175. 'timePointDeviceWillDoing': item['time_point_device_will_doing'],
  176. 'timeQuantumDeviceWillDoing': item['time_quantum_device_will_doing'],
  177. 'slowOpenOrCloseSpeed': item['slow_open_or_close_speed'],
  178. 'repeat': item['repeat'],
  179. })
  180. return response.json(0, {'list': switch_chronopher_list})
  181. except Exception as e:
  182. print(e)
  183. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  184. @staticmethod
  185. def add_or_edit_chronopher(request_dict, response):
  186. """
  187. 添加/编辑定时计划
  188. @param request_dict: 请求参数
  189. @request_dict deviceId: 设备id
  190. @request_dict chronopherId: 定时计划id
  191. @request_dict timeTypeRadio: 切换时间点/时间段
  192. @request_dict timePoint: 时间点
  193. @request_dict timeQuantumStartTime: 时间段开始时间
  194. @request_dict timeQuantumEndTime: 时间段结束时间
  195. @request_dict timePointDeviceWillDoing: 设备将会
  196. @request_dict timeQuantumDeviceWillDoing: 设备将会
  197. @request_dict slowOpenOrCloseSpeed: 缓慢开/关速度
  198. @request_dict repeat: 重复周期
  199. @param response: 响应对象
  200. @return: response
  201. """
  202. is_edit = request_dict.get('isEdit', None)
  203. device_id = request_dict.get('deviceId', None)
  204. chronopher_id = request_dict.get('chronopherId', None)
  205. time_type_radio = int(request_dict.get('timeTypeRadio', 0))
  206. time_point = request_dict.get('timePoint', None)
  207. time_quantum_start_time = request_dict.get('timeQuantumStartTime', None)
  208. time_quantum_end_time = request_dict.get('timeQuantumEndTime', None)
  209. time_point_device_will_doing = request_dict.get('timePointDeviceWillDoing', None)
  210. time_quantum_device_will_doing = request_dict.get('timeQuantumDeviceWillDoing', None)
  211. slow_open_or_close_speed = request_dict.get('slowOpenOrCloseSpeed', None)
  212. repeat = request_dict.get('repeat', None)
  213. if not all([device_id, repeat]):
  214. return response.json(444, {'param': 'deviceId,repeat'})
  215. device_qs = Device_Info.objects.filter(id=device_id).values('serial_number', 'userID')
  216. if not device_qs.exists():
  217. return response.json(173)
  218. if time_type_radio == 1: # 时间点
  219. if not all([time_point, slow_open_or_close_speed]):
  220. return response.json(444, {'param': 'timePoint,slowOpenOrCloseSpeed'})
  221. chronopher_data = {
  222. 'device_id': device_id,
  223. 'time_type_radio': time_type_radio,
  224. 'time_point': time_point,
  225. 'time_point_device_will_doing': time_point_device_will_doing,
  226. 'slow_open_or_close_speed': slow_open_or_close_speed,
  227. 'repeat': repeat
  228. }
  229. elif time_type_radio == 2: # 时间段
  230. if not all([time_quantum_start_time, time_quantum_end_time]):
  231. return response.json(444, {'param': 'timeQuantumStartTime,timeQuantumEndTime'})
  232. time_quantum_start_time = int(time_quantum_start_time)
  233. time_quantum_end_time = int(time_quantum_end_time)
  234. chronopher_data = {
  235. 'device_id': device_id,
  236. 'time_type_radio': time_type_radio,
  237. 'time_quantum_start_time': time_quantum_start_time,
  238. 'time_quantum_end_time': time_quantum_end_time,
  239. 'time_quantum_device_will_doing': time_quantum_device_will_doing,
  240. 'repeat': repeat
  241. }
  242. else:
  243. return response.json(444, {'param': 'timeTypeRadio'})
  244. try:
  245. with transaction.atomic():
  246. celery_obj = CeleryBeatObj()
  247. if is_edit:
  248. if not chronopher_id:
  249. return response.json(444, {'param': 'chronopherId'})
  250. update_flag = SwitchChronopher.objects.filter(device_id=device_id, id=chronopher_id).update(
  251. **chronopher_data)
  252. if not update_flag:
  253. return response.json(173)
  254. celery_obj.del_task('switchchronopher_{}'.format(chronopher_id))
  255. celery_obj.del_task('switchchronopher_{}_1'.format(chronopher_id))
  256. celery_obj.del_task('switchchronopher_{}_2'.format(chronopher_id))
  257. else:
  258. switch_qs = SwitchChronopher.objects.create(**chronopher_data)
  259. chronopher_id = switch_qs.id
  260. # 设置定时任务
  261. serial_number = device_qs[0]['serial_number']
  262. user_id = device_qs[0]['userID']
  263. tz = CommonService.get_user_tz(user_id)
  264. topic_name = APSCHEDULER_TOPIC_NAME.format(serial_number)
  265. if time_type_radio == 1: # 时间点任务
  266. task_id = 'switchchronopher_{}'.format(chronopher_id)
  267. if time_point_device_will_doing in ['0', '1']: # 开启或关闭
  268. msg = {
  269. "taskId": chronopher_id,
  270. "deviceSwitch": int(time_point_device_will_doing), # 设备开关-1:反转,0:关,1:开,2:预设亮度
  271. "slowTime": slow_open_or_close_speed
  272. }
  273. else: # 开启且设置亮度
  274. msg = {
  275. "taskId": chronopher_id,
  276. "deviceSwitch": 2,
  277. "pwmControl": int(time_point_device_will_doing),
  278. 'slowTime': slow_open_or_close_speed
  279. }
  280. time_str = datetime.datetime.fromtimestamp(int(time_point))
  281. celery_obj.creat_crontab_task(tz, task_id, MQTT_TASK, time_str.minute,
  282. time_str.hour, repeat, args=[serial_number, topic_name, msg, task_id])
  283. else: # 时间段任务
  284. start_hour = int(time_quantum_start_time / 60 // 60)
  285. start_minute = int(time_quantum_start_time / 60 % 60)
  286. end_hour = int(time_quantum_end_time / 60 // 60)
  287. end_minute = int(time_quantum_end_time / 60 % 60)
  288. if time_quantum_device_will_doing in ['0', '1']:
  289. begin_task_id = 'switchchronopher_{}_1'.format(chronopher_id) # 开始任务id
  290. end_task_id = 'switchchronopher_{}_2'.format(chronopher_id) # 结束任务id
  291. msg = {"taskId": chronopher_id,
  292. "deviceSwitch": int(time_quantum_device_will_doing)}
  293. celery_obj.creat_crontab_task(tz, begin_task_id, MQTT_TASK, start_minute, start_hour, repeat,
  294. args=[serial_number, topic_name, msg, begin_task_id])
  295. msg = {"taskId": chronopher_id,
  296. "deviceSwitch": 0 if int(time_quantum_device_will_doing) == 1 else 1}
  297. celery_obj.creat_crontab_task(tz, end_task_id, MQTT_TASK, end_minute, end_hour, repeat,
  298. args=[serial_number, topic_name, msg, end_task_id])
  299. else: # 间隔任务
  300. minute = int(time_quantum_device_will_doing)
  301. task_id = 'switchchronopher_{}'.format(chronopher_id) # 开始任务id
  302. msg = {"taskId": chronopher_id,
  303. "deviceSwitch": -1}
  304. if minute >= 60:
  305. hour = '{}-{}/{}'.format(start_hour, end_hour, minute // 60)
  306. minute = start_minute
  307. else:
  308. hour = '{}-{}'.format(start_hour, end_hour)
  309. minute = '*/{}'.format(minute)
  310. celery_obj.creat_crontab_task(tz, task_id, MQTT_TASK, minute, hour, repeat,
  311. args=[serial_number, topic_name, msg, task_id])
  312. return response.json(0)
  313. except Exception as e:
  314. print(e)
  315. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  316. @staticmethod
  317. def edit_chronopher_status(request_dict, response):
  318. """
  319. 修改定时计划状态
  320. @param request_dict: 请求参数
  321. @request_dict deviceId: 设备id
  322. @request_dict chronopherId: 定时计划id
  323. @request_dict isExecute: 修改状态
  324. @param response: 响应对象
  325. @return: response
  326. """
  327. device_id = request_dict.get('deviceId', None)
  328. chronopher_id = request_dict.get('chronopherId', None)
  329. is_execute = request_dict.get('isExecute', None)
  330. if not all([device_id, chronopher_id, is_execute]):
  331. return response.json(444, {'param': 'deviceId,chronopherId,isExecute'})
  332. try:
  333. is_execute = int(is_execute)
  334. celery_obj = CeleryBeatObj()
  335. if is_execute:
  336. celery_obj.enable_task('switchchronopher_{}'.format(chronopher_id))
  337. celery_obj.enable_task('switchchronopher_{}_1'.format(chronopher_id))
  338. celery_obj.enable_task('switchchronopher_{}_2'.format(chronopher_id))
  339. else:
  340. celery_obj.disable_task('switchchronopher_{}'.format(chronopher_id))
  341. celery_obj.disable_task('switchchronopher_{}_1'.format(chronopher_id))
  342. celery_obj.disable_task('switchchronopher_{}_2'.format(chronopher_id))
  343. SwitchChronopher.objects.filter(device_id=device_id, id=chronopher_id).update(is_execute=is_execute)
  344. return response.json(0)
  345. except Exception as e:
  346. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  347. @staticmethod
  348. def delete_chronopher(request_dict, response):
  349. """
  350. 删除定时计划
  351. @param request_dict: 请求参数
  352. @request_dict deviceId: 设备id
  353. @request_dict chronopherId: 定时计划id
  354. @param response: 响应对象
  355. @return: response
  356. """
  357. device_id = request_dict.get('deviceId', None)
  358. chronopher_id = request_dict.get('chronopherId', None)
  359. if not chronopher_id:
  360. return response.json(444, {'error param': 'deviceId or chronopherId'})
  361. try:
  362. delete_flag = SwitchChronopher.objects.filter(device_id=device_id, id=chronopher_id).delete()
  363. if not delete_flag[0]:
  364. return response.json(173)
  365. celery_obj = CeleryBeatObj()
  366. celery_obj.del_task('switchchronopher_{}'.format(chronopher_id)) # 删除定时任务
  367. celery_obj.del_task('switchchronopher_{}_1'.format(chronopher_id))
  368. celery_obj.del_task('switchchronopher_{}_2'.format(chronopher_id))
  369. return response.json(0)
  370. except Exception as e:
  371. print(e)
  372. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  373. @staticmethod
  374. def create_chronopher_log(request_dict, response):
  375. """
  376. 生成执行日志
  377. @param request_dict: 请求参数
  378. @request_dict serialNumber: 设备序列号
  379. @request_dict chronopherId: 排程id
  380. @request_dict status: 执行状态
  381. @param response: 响应对象
  382. @return: response
  383. """
  384. serial_number = request_dict.get('serial_number', None)
  385. chronopher_id = request_dict.get('task_id', None)
  386. operate_status = request_dict.get('status', None)
  387. switch_status = request_dict.get('switch_status', None)
  388. implement_time = request_dict.get('implement_time', None)
  389. brightness = request_dict.get('brightness', None)
  390. if not all([serial_number, chronopher_id, operate_status, switch_status, implement_time, brightness]):
  391. return response.json(444, {
  392. 'error param': 'serial_number, chronopher_id, status, switch_status, implement_time, brightness'})
  393. device_qs = Device_Info.objects.filter(serial_number=serial_number).values('id')
  394. if not device_qs.exists():
  395. return response.json(173)
  396. device_id = device_qs[0]['id']
  397. chronopher_qs = SwitchChronopher.objects.filter(device_id=device_id, id=chronopher_id).values(
  398. 'time_type_radio', 'time_point', 'time_quantum_start_time', 'time_quantum_end_time',
  399. 'time_point_device_will_doing', 'time_quantum_device_will_doing', 'slow_open_or_close_speed', 'repeat')
  400. if not chronopher_qs.exists():
  401. return response.json(173)
  402. try:
  403. scene_log = {
  404. 'scene_id': chronopher_id,
  405. 'device_id': device_id,
  406. 'tasks': json.dumps(chronopher_qs[0]),
  407. 'status': operate_status,
  408. 'created_time': implement_time,
  409. }
  410. scene_qs = SceneLog.objects.filter(created_time=implement_time, device_id=device_id,
  411. scene_id=chronopher_id)
  412. if not scene_qs.exists():
  413. SceneLog.objects.create(**scene_log)
  414. operate_log = {
  415. 'device_id': device_id,
  416. 'status': switch_status,
  417. 'operate_type': 2,
  418. 'brightness': brightness,
  419. 'created_time': implement_time
  420. }
  421. operate_qs = SwitchOperateLog.objects.filter(**operate_log)
  422. if not operate_qs.exists():
  423. SwitchOperateLog.objects.create(**operate_log)
  424. return response.json(0)
  425. except Exception as e:
  426. print(e)
  427. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  428. @staticmethod
  429. def get_chronopher_log(request_dict, response):
  430. """
  431. 查询排程执行日志
  432. @param request_dict: 请求参数
  433. @request_dict deviceId: 设备id
  434. @param response: 响应对象
  435. @return: response
  436. """
  437. device_id = request_dict.get('deviceId', None)
  438. if not device_id:
  439. return response.json(444, {'error param': 'deviceId'})
  440. try:
  441. scene_qs = SceneLog.objects.filter(device_id=device_id).values('tasks', 'status', 'created_time', 'id')
  442. res = []
  443. for item in scene_qs:
  444. res.append({
  445. 'id': item['id'],
  446. 'tasks': json.loads(item['tasks']),
  447. 'status': item['status'],
  448. 'created_time': item['created_time']
  449. })
  450. return response.json(0, res)
  451. except Exception as e:
  452. print(e)
  453. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  454. @staticmethod
  455. def reset(request_dict, response):
  456. """
  457. 重置设备
  458. @param request_dict: 请求参数
  459. @request_dict serialNumber: 设备序列号
  460. @param response: 响应对象
  461. @return: response
  462. """
  463. serial_number = request_dict.get('serial_number', None)
  464. if not serial_number:
  465. return response.json(444, {'error param': 'serial_number'})
  466. device_qs = Device_Info.objects.filter(serial_number=serial_number).values('id')
  467. if not device_qs.exists():
  468. return response.json(173)
  469. device_id = device_qs[0]['device_id']
  470. try:
  471. # 删除智能开关数据
  472. SwitchDimmingSettings.objects.filter(device_id=device_id).delete()
  473. chronopher_qs = SwitchChronopher.objects.filter(device_id=device_id)
  474. if chronopher_qs.exists():
  475. celery_obj = CeleryBeatObj()
  476. for chronopher in chronopher_qs:
  477. chronopher_id = chronopher.id
  478. celery_obj.del_task('switchchronopher_{}'.format(chronopher_id)) # 删除定时任务
  479. celery_obj.del_task('switchchronopher_{}_1'.format(chronopher_id))
  480. celery_obj.del_task('switchchronopher_{}_2'.format(chronopher_id))
  481. chronopher_qs.delete()
  482. SceneLog.objects.filter(device_id=device_id).delete()
  483. FamilyRoomDevice.objects.filter(device_id=device_id).delete()
  484. Device_Info.objects.filter(id=device_id).delete()
  485. except Exception as e:
  486. print(e)
  487. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  488. @staticmethod
  489. def del_switch(device_id, serial_number):
  490. """
  491. 删除开关
  492. @param device_id: 设备id
  493. @param serial_number: 设备序列号
  494. @return: response
  495. """
  496. try:
  497. SwitchDimmingSettings.objects.filter(device_id=device_id).delete()
  498. chronopher_qs = SwitchChronopher.objects.filter(device_id=device_id)
  499. if chronopher_qs.exists():
  500. celery_obj = CeleryBeatObj()
  501. for chronopher in chronopher_qs:
  502. chronopher_id = chronopher.id
  503. celery_obj.del_task('switchchronopher_{}'.format(chronopher_id)) # 删除定时任务
  504. celery_obj.del_task('switchchronopher_{}_1'.format(chronopher_id))
  505. celery_obj.del_task('switchchronopher_{}_2'.format(chronopher_id))
  506. chronopher_qs.delete()
  507. SceneLog.objects.filter(device_id=device_id).delete()
  508. msg = {
  509. "device_reset": 1 # 重置智能开关
  510. }
  511. topic_name = RESET_SWITCH_TOPIC_NAME.format(serial_number)
  512. result = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
  513. LOGGER.info('执行重置开关mqtt结果:{}'.format(result))
  514. except Exception as e:
  515. print(e)
  516. LOGGER.info('error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  517. @staticmethod
  518. def create_operate_log(request_dict, response):
  519. """
  520. 设备上报排程日志
  521. @param request_dict: 请求参数
  522. @request_dict serialNumber: 设备序列号
  523. @param response: 响应对象
  524. @return: response
  525. """
  526. serial_number = request_dict.get('serial_number', None)
  527. status = request_dict.get('switch_status', None)
  528. implement_time = request_dict.get('implement_time', None)
  529. if not all([serial_number, status, implement_time]):
  530. return response.json(444, {'error param': 'serial_number, switch_status, implement_time'})
  531. device_qs = Device_Info.objects.filter(serial_number=serial_number).values('id')
  532. if not device_qs.exists():
  533. return response.json(173)
  534. device_id = device_qs[0]['id']
  535. try:
  536. operate_log = {
  537. 'device_id': device_id,
  538. 'status': status,
  539. 'created_time': implement_time,
  540. }
  541. operate_qs = SwitchOperateLog.objects.filter(**operate_log)
  542. if not operate_qs.exists():
  543. SwitchOperateLog.objects.create(**operate_log)
  544. return response.json(0)
  545. except Exception as e:
  546. print(e)
  547. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  548. @staticmethod
  549. def get_operate_log(request_dict, response):
  550. """
  551. 查询普通操作日志
  552. @param request_dict: 请求参数
  553. @request_dict deviceId: 设备id
  554. @param response: 响应对象
  555. @return: response
  556. """
  557. device_id = request_dict.get('deviceId', None)
  558. if not device_id:
  559. return response.json(444, {'error param': 'deviceId'})
  560. try:
  561. scene_qs = SwitchOperateLog.objects.filter(device_id=device_id).values('status', 'created_time', 'id',
  562. 'operate_type')
  563. return response.json(0, list(scene_qs))
  564. except Exception as e:
  565. print(e)
  566. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))