SmartSceneController.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Author : Rocky
  4. @Time : 2022/6/29 9:31
  5. @File :SmartSceneController.py
  6. """
  7. import time
  8. from django.core.exceptions import ObjectDoesNotExist
  9. from django.views import View
  10. from Model.models import FamilyRoomDevice, GatewaySubDevice, FamilyRoom, SmartScene, EffectiveTime
  11. from Object.ResponseObject import ResponseObject
  12. from Object.TokenObject import TokenObject
  13. class SmartSceneView(View):
  14. def get(self, request, *args, **kwargs):
  15. request.encoding = 'utf-8'
  16. operation = kwargs.get('operation')
  17. return self.validation(request.GET, request, operation)
  18. def post(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. operation = kwargs.get('operation')
  21. return self.validation(request.POST, request, operation)
  22. def validation(self, request_dict, request, operation):
  23. token_obj = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  24. lang = request_dict.get('lang', None)
  25. response = ResponseObject(lang if lang else token_obj.lang)
  26. if token_obj.code != 0:
  27. return response.json(token_obj.code)
  28. user_id = token_obj.userID
  29. if operation == 'condition-devices': # 添加条件-查询设备
  30. return self.condition_devices(request_dict, response)
  31. if operation == 'task-devices': # 添加任务-查询设备
  32. return self.task_devices(request_dict, user_id, response)
  33. elif operation == 'create': # 创建智能场景
  34. return self.create_smart_scene(request_dict, user_id, response)
  35. elif operation == 'scene-list': # 查询智能场景列表
  36. return self.scene_list(request_dict, user_id, response)
  37. elif operation == 'update-status': # 更新智能场景状态
  38. return self.update_status(request_dict, response)
  39. elif operation == 'detail': # 查询智能场景详情
  40. return self.scene_detail(request_dict, response)
  41. elif operation == 'edit': # 编辑智能场景
  42. return self.edit_smart_scene(request_dict, response)
  43. else:
  44. return response.json(414)
  45. @staticmethod
  46. def condition_devices(request_dict, response):
  47. """
  48. 添加条件-查询设备
  49. @param request_dict: 请求参数
  50. @request_dict deviceId: 网关设备id
  51. @request_dict subDeviceId: 子设备id
  52. @param response: 响应对象
  53. @return: response
  54. """
  55. device_id = request_dict.get('deviceId', None)
  56. sub_device_id = request_dict.get('subDeviceId', None)
  57. if not any([device_id, sub_device_id]):
  58. return response.json(444, {'error param': 'deviceId or subDeviceId'})
  59. try:
  60. if device_id:
  61. gateway_sub_device_qs = GatewaySubDevice.objects.filter(device_id=device_id)
  62. else:
  63. gateway_sub_device_qs = GatewaySubDevice.objects.filter(id=sub_device_id)
  64. if not gateway_sub_device_qs.exists():
  65. return response.json(173)
  66. gateway_sub_device_qs = gateway_sub_device_qs.values('id', 'device_type', 'nickname', 'status')
  67. sub_device_list = []
  68. for gateway_sub_device in gateway_sub_device_qs:
  69. room_id = FamilyRoomDevice.objects.filter(sub_device=gateway_sub_device['id']).values('room_id')[0][
  70. 'room_id']
  71. try:
  72. gateway_sub_device['room_name'] = FamilyRoom.objects.get(id=room_id).name
  73. except ObjectDoesNotExist:
  74. gateway_sub_device['room_name'] = ''
  75. gateway_sub_device.pop('id')
  76. sub_device_list.append(gateway_sub_device)
  77. return response.json(0, sub_device_list)
  78. except Exception as e:
  79. return response.json(500, repr(e))
  80. @staticmethod
  81. def task_devices(request_dict, user_id, response):
  82. """
  83. 添加任务-查询设备
  84. @param request_dict: 请求参数
  85. @param user_id: 用户id
  86. @request_dict deviceId: 网关设备id
  87. @param response: 响应对象
  88. @return: response
  89. """
  90. device_id = request_dict.get('deviceId', None)
  91. if not all([device_id]):
  92. return response.json(444)
  93. try:
  94. device_info_qs = GatewaySubDevice.objects.filter(device__userID_id=user_id)
  95. return response.json(0)
  96. except Exception as e:
  97. return response.json(500, repr(e))
  98. @staticmethod
  99. def create_smart_scene(request_dict, user_id, response):
  100. """
  101. 创建智能场景
  102. @param request_dict: 请求参数
  103. @param user_id: 用户id
  104. @request_dict deviceId: 网关设备id
  105. @request_dict subDeviceId: 子设备id
  106. @request_dict sceneName: 场景名称
  107. @request_dict conditions: 条件
  108. @request_dict tasks: 任务
  109. @request_dict isAllDay: 是否全天执行
  110. @request_dict startTime: 开始时间
  111. @request_dict endTime: 结束时间
  112. @request_dict repeat: 重复周期
  113. @param response: 响应对象
  114. @return: response
  115. """
  116. device_id = request_dict.get('deviceId', None)
  117. sub_device_id = request_dict.get('subDeviceId', None)
  118. scene_name = request_dict.get('sceneName', None)
  119. conditions = request_dict.get('conditions', None)
  120. tasks = request_dict.get('tasks', None)
  121. is_all_day = request_dict.get('isAllDay', None)
  122. if not any([device_id, sub_device_id]):
  123. return response.json(444, {'error param': 'deviceId or subDeviceId'})
  124. if not all([conditions, tasks]):
  125. return response.json(444, {'error param': 'conditions and tasks'})
  126. now_time = int(time.time())
  127. try:
  128. # 判断是否已存在该场景名
  129. smart_scene_qs = SmartScene.objects.filter(user_id=user_id, scene_name=scene_name)
  130. if smart_scene_qs.exists():
  131. return response.json(174)
  132. smart_scene_dict = {
  133. 'user_id': user_id,
  134. 'scene_name': scene_name,
  135. 'conditions': conditions,
  136. 'tasks': tasks,
  137. 'created_time': now_time,
  138. 'updated_time': now_time,
  139. }
  140. if device_id:
  141. smart_scene_dict['device_id'] = device_id
  142. else:
  143. smart_scene_dict['sub_device_id'] = sub_device_id
  144. if not is_all_day: # 没传时间
  145. SmartScene.objects.create(**smart_scene_dict)
  146. else:
  147. if is_all_day == '0':
  148. effective_time_qs = EffectiveTime.objects.filter(is_all_day=True).values('id')
  149. if effective_time_qs.exists():
  150. effective_time_id = effective_time_qs[0]['id']
  151. else:
  152. effective_time_id = EffectiveTime.objects.create(is_all_day=True).id
  153. smart_scene_dict['effective_time_id'] = effective_time_id
  154. SmartScene.objects.create(**smart_scene_dict)
  155. else:
  156. start_time = int(request_dict.get('startTime', None))
  157. end_time = int(request_dict.get('endTime', None))
  158. repeat = int(request_dict.get('repeat', None))
  159. if not all([start_time, end_time, repeat]):
  160. return response.json(444, {'error param': 'startTime and endTime and repeat'})
  161. effective_time_qs = EffectiveTime.objects.filter(start_time=start_time, end_time=end_time,
  162. repeat=repeat).values('id')
  163. if effective_time_qs.exists():
  164. effective_time_id = effective_time_qs[0]['id']
  165. else:
  166. effective_time_id = EffectiveTime.objects.create(start_time=start_time, end_time=end_time,
  167. repeat=repeat).id
  168. smart_scene_dict['effective_time_id'] = effective_time_id
  169. SmartScene.objects.create(**smart_scene_dict)
  170. return response.json(0)
  171. except Exception as e:
  172. return response.json(500, repr(e))
  173. @staticmethod
  174. def scene_list(request_dict, user_id, response):
  175. """
  176. 查询智能场景列表
  177. @param request_dict: 请求参数
  178. @param user_id: 用户id
  179. @request_dict deviceId: 网关设备id
  180. @request_dict subDeviceId: 子设备id
  181. @param response: 响应对象
  182. @return: response
  183. """
  184. device_id = request_dict.get('deviceId', None)
  185. sub_device_id = request_dict.get('subDeviceId', None)
  186. if not any([device_id, sub_device_id]):
  187. return response.json(444, {'error param': 'deviceId or subDeviceId'})
  188. try:
  189. if device_id:
  190. smart_scene_qs = SmartScene.objects.filter(user_id=user_id, device_id=device_id)
  191. else:
  192. smart_scene_qs = SmartScene.objects.filter(user_id=user_id, sub_device_id=sub_device_id)
  193. if not smart_scene_qs.exists():
  194. return response.json(173)
  195. smart_scene_qs = smart_scene_qs.values('id', 'scene_name', 'is_enable')
  196. return response.json(0, list(smart_scene_qs))
  197. except Exception as e:
  198. return response.json(500, repr(e))
  199. @staticmethod
  200. def update_status(request_dict, response):
  201. """
  202. 更新智能场景状态
  203. @param request_dict: 请求参数
  204. @request_dict smartSceneId: 智能场景id
  205. @request_dict isEnable: 状态,True or False
  206. @param response: 响应对象
  207. @return: response
  208. """
  209. smart_scene_id = request_dict.get('smartSceneId', None)
  210. is_enable = request_dict.get('isEnable', None)
  211. if not all([smart_scene_id, is_enable]):
  212. return response.json(444, {'error param': 'smartSceneId and status'})
  213. try:
  214. SmartScene.objects.filter(id=smart_scene_id).update(is_enable=is_enable)
  215. return response.json(0)
  216. except Exception as e:
  217. return response.json(500, repr(e))
  218. @staticmethod
  219. def scene_detail(request_dict, response):
  220. """
  221. 查询智能场景详情
  222. @param request_dict: 请求参数
  223. @request_dict smartSceneId: 智能场景id
  224. @param response: 响应对象
  225. @return: response
  226. """
  227. smart_scene_id = request_dict.get('smartSceneId', None)
  228. if not smart_scene_id:
  229. return response.json(444, {'error param': 'smartSceneId'})
  230. try:
  231. smart_scene_qs = SmartScene.objects.filter(id=smart_scene_id).values('id', 'scene_name', 'conditions',
  232. 'tasks', 'effective_time_id')
  233. if not smart_scene_qs.exists():
  234. return response.json(173)
  235. res = {
  236. 'scene_name': smart_scene_qs[0]['scene_name'],
  237. 'condition': eval(smart_scene_qs[0]['conditions']),
  238. 'task': eval(smart_scene_qs[0]['tasks']),
  239. }
  240. # 如果存在关联的时间数据,组织时间数据
  241. try:
  242. effective_time_qs = EffectiveTime.objects.get(id=smart_scene_qs[0]['effective_time_id'])
  243. except ObjectDoesNotExist:
  244. return response.json(0, res)
  245. if effective_time_qs.is_all_day: # 全天
  246. time_dict = {'all_day': 1}
  247. else:
  248. time_dict = {
  249. 'start_time': effective_time_qs.start_time,
  250. 'end_time': effective_time_qs.end_time,
  251. 'repeat': effective_time_qs.repeat,
  252. }
  253. res['time'] = time_dict
  254. return response.json(0, res)
  255. except Exception as e:
  256. return response.json(500, repr(e))
  257. @staticmethod
  258. def edit_smart_scene(request_dict, response):
  259. """
  260. 编辑智能场景
  261. @param request_dict: 请求参数
  262. @request_dict smartSceneId: 智能场景id
  263. @param response: 响应对象
  264. @return: response
  265. """
  266. smart_scene_id = request_dict.get('smartSceneId', None)
  267. if not smart_scene_id:
  268. return response.json(444, {'error param': 'smartSceneId'})
  269. try:
  270. smart_scene_qs = SmartScene.objects.filter(id=smart_scene_id).values('id', 'scene_name', 'conditions',
  271. 'tasks', 'effective_time_id')
  272. if not smart_scene_qs.exists():
  273. return response.json(173)
  274. return response.json(0, list(smart_scene_qs))
  275. except Exception as e:
  276. return response.json(500, repr(e))