SmartSwitchController.py 27 KB

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