SmartSceneController.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. else:
  40. return response.json(414)
  41. @staticmethod
  42. def condition_devices(request_dict, response):
  43. """
  44. 添加条件-查询设备
  45. @param request_dict: 请求参数
  46. @request_dict deviceId: 网关设备id
  47. @request_dict subDeviceId: 子设备id
  48. @param response: 响应对象
  49. @return: response
  50. """
  51. device_id = request_dict.get('deviceId', None)
  52. sub_device_id = request_dict.get('subDeviceId', None)
  53. if not any([device_id, sub_device_id]):
  54. return response.json(444, {'error param': 'deviceId or subDeviceId'})
  55. try:
  56. if device_id:
  57. gateway_sub_device_qs = GatewaySubDevice.objects.filter(device_id=device_id)
  58. else:
  59. gateway_sub_device_qs = GatewaySubDevice.objects.filter(id=sub_device_id)
  60. if not gateway_sub_device_qs.exists():
  61. return response.json(173)
  62. gateway_sub_device_qs = gateway_sub_device_qs.values('id', 'device_type', 'nickname', 'status')
  63. sub_device_list = []
  64. for gateway_sub_device in gateway_sub_device_qs:
  65. room_id = FamilyRoomDevice.objects.filter(sub_device=gateway_sub_device['id']).values('room_id')[0][
  66. 'room_id']
  67. try:
  68. gateway_sub_device['room_name'] = FamilyRoom.objects.get(id=room_id).name
  69. except ObjectDoesNotExist:
  70. gateway_sub_device['room_name'] = ''
  71. gateway_sub_device.pop('id')
  72. sub_device_list.append(gateway_sub_device)
  73. return response.json(0, sub_device_list)
  74. except Exception as e:
  75. return response.json(500, repr(e))
  76. @staticmethod
  77. def task_devices(request_dict, user_id, response):
  78. """
  79. 添加任务-查询设备
  80. @param request_dict: 请求参数
  81. @param user_id: 用户id
  82. @request_dict deviceId: 网关设备id
  83. @param response: 响应对象
  84. @return: response
  85. """
  86. device_id = request_dict.get('deviceId', None)
  87. if not all([device_id]):
  88. return response.json(444)
  89. try:
  90. device_info_qs = GatewaySubDevice.objects.filter(device__userID_id=user_id)
  91. return response.json(0)
  92. except Exception as e:
  93. return response.json(500, repr(e))
  94. @staticmethod
  95. def create_smart_scene(request_dict, user_id, response):
  96. """
  97. 创建智能场景
  98. @param request_dict: 请求参数
  99. @param user_id: 用户id
  100. @request_dict deviceId: 网关设备id
  101. @request_dict subDeviceId: 子设备id
  102. @request_dict sceneName: 场景名称
  103. @request_dict conditions: 条件
  104. @request_dict tasks: 任务
  105. @request_dict isAllDay: 是否全天执行
  106. @request_dict startTime: 开始时间
  107. @request_dict endTime: 结束时间
  108. @request_dict repeat: 重复周期
  109. @param response: 响应对象
  110. @return: response
  111. """
  112. device_id = request_dict.get('deviceId', None)
  113. sub_device_id = request_dict.get('subDeviceId', None)
  114. scene_name = request_dict.get('sceneName', None)
  115. conditions = request_dict.get('conditions', None)
  116. tasks = request_dict.get('tasks', None)
  117. is_all_day = request_dict.get('isAllDay', None)
  118. if not any([device_id, sub_device_id]):
  119. return response.json(444, {'error param': 'deviceId or subDeviceId'})
  120. if not all([conditions, tasks]):
  121. return response.json(444, {'error param': 'conditions and tasks'})
  122. now_time = int(time.time())
  123. try:
  124. # 判断是否已存在该场景名
  125. smart_scene_qs = SmartScene.objects.filter(user_id=user_id, scene_name=scene_name)
  126. if smart_scene_qs.exists():
  127. return response.json(174)
  128. smart_scene_dict = {
  129. 'user_id': user_id,
  130. 'scene_name': scene_name,
  131. 'conditions': conditions,
  132. 'tasks': tasks,
  133. 'created_time': now_time,
  134. 'updated_time': now_time,
  135. }
  136. if device_id:
  137. smart_scene_dict['device_id'] = device_id
  138. else:
  139. smart_scene_dict['sub_device_id'] = sub_device_id
  140. if is_all_day:
  141. SmartScene.objects.create(**smart_scene_dict)
  142. else:
  143. start_time = request_dict.get('startTime', None)
  144. end_time = request_dict.get('endTime', None)
  145. repeat = request_dict.get('repeat', None)
  146. if not all([start_time, end_time, repeat]):
  147. return response.json(444, {'error param': 'startTime and endTime and repeat'})
  148. effective_time_qs = EffectiveTime.objects.filter(start_time=start_time, end_time=end_time,
  149. repeat=repeat).values('id')
  150. if effective_time_qs.exists():
  151. effective_time_id = effective_time_qs[0]['id']
  152. else:
  153. effective_time_id = EffectiveTime.objects.create(start_time=start_time, end_time=end_time,
  154. repeat=repeat).id
  155. smart_scene_dict['effective_time_id'] = effective_time_id
  156. SmartScene.objects.create(**smart_scene_dict)
  157. return response.json(0)
  158. except Exception as e:
  159. return response.json(500, repr(e))
  160. @staticmethod
  161. def scene_list(request_dict, user_id, response):
  162. """
  163. 查询智能场景列表
  164. @param request_dict: 请求参数
  165. @param user_id: 用户id
  166. @request_dict deviceId: 网关设备id
  167. @request_dict subDeviceId: 子设备id
  168. @param response: 响应对象
  169. @return: response
  170. """
  171. device_id = request_dict.get('deviceId', None)
  172. sub_device_id = request_dict.get('subDeviceId', None)
  173. if not any([device_id, sub_device_id]):
  174. return response.json(444, {'error param': 'deviceId or subDeviceId'})
  175. try:
  176. if device_id:
  177. smart_scene_qs = SmartScene.objects.filter(user_id=user_id, device_id=device_id)
  178. else:
  179. smart_scene_qs = SmartScene.objects.filter(user_id=user_id, sub_device_id=sub_device_id)
  180. if not smart_scene_qs.exists():
  181. return response.json(173)
  182. smart_scene_qs = smart_scene_qs.values('id', 'scene_name', 'is_enable')
  183. return response.json(0, list(smart_scene_qs))
  184. except Exception as e:
  185. return response.json(500, repr(e))
  186. @staticmethod
  187. def update_status(request_dict, response):
  188. """
  189. 更新智能场景状态
  190. @param request_dict: 请求参数
  191. @request_dict smartSceneId: 智能场景id
  192. @request_dict isEnable: 状态,True or False
  193. @param response: 响应对象
  194. @return: response
  195. """
  196. smart_scene_id = request_dict.get('smartSceneId', None)
  197. is_enable = request_dict.get('isEnable', None)
  198. if not all([smart_scene_id, is_enable]):
  199. return response.json(444, {'error param': 'smartSceneId and status'})
  200. try:
  201. SmartScene.objects.filter(id=smart_scene_id).update(is_enable=is_enable)
  202. return response.json(0)
  203. except Exception as e:
  204. return response.json(500, repr(e))