SmartSwitchController.py 33 KB

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