time2.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import time
  4. from apilib.utils_json import JsonResponse
  5. from apps.web.constant import DeviceCmdCode, MQTT_TIMEOUT, Const
  6. from apps.web.core.adapter.base import SmartBox
  7. from apps.web.core.exceptions import ServiceException
  8. from apps.web.core.networking import MessageSender
  9. from apps.web.device.models import Device
  10. class TimeSwitchBox2(SmartBox):
  11. def test(self, coins):
  12. return MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  13. {'IMEI': self._device['devNo'], "funCode": '01', 'data': '0101'})
  14. def start_device(self, package, openId, attachParas):
  15. infoDict = self.get_dev_status_from_dev()
  16. if infoDict['switch']:
  17. raise ServiceException({'result': 2, 'description': u'足疗机已经开机了哦!还有%s分钟结束' % infoDict['leftTime']})
  18. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  19. {'IMEI': self._device['devNo'], "funCode": '55', 'data': '0101'},
  20. timeout = MQTT_TIMEOUT.START_DEVICE)
  21. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  22. if devInfo['rst'] == -1:
  23. raise ServiceException({'result': 2, 'description': u'足疗机正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'})
  24. elif devInfo['rst'] == 1:
  25. raise ServiceException({'result': 2, 'description': u'足疗机正在忙,无响应,您的金币还在,请稍后再试哦'})
  26. data = devInfo['data'][6::]
  27. switch = True if data[0:2] == '01' else False
  28. if not switch:
  29. raise ServiceException({'result': 2, 'description': u'足疗机启动失败,您的金币还在,请您再重试看看吧'})
  30. shake = True if data[2:4] == '01' else False
  31. hot = True if data[4:6] == '01' else False
  32. mode = 'mode%s' % (int(data[6:8]))
  33. leftTime = int(data[8:10], 16)
  34. # 这款足疗机的运行时间固定是15分钟
  35. Device.update_dev_control_cache(
  36. self._device['devNo'],
  37. {
  38. 'status': Const.DEV_WORK_STATUS_WORKING,
  39. 'switch': switch,
  40. 'shake': shake,
  41. 'hot': hot,
  42. 'mode': mode,
  43. 'leftTime': leftTime,
  44. 'finishedTime': int(time.time()) + leftTime * 60
  45. })
  46. return devInfo
  47. def get_dev_status_from_dev(self):
  48. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  49. {'IMEI': self._device['devNo'], "funCode": '55', 'data': '010F'})
  50. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  51. if devInfo['rst'] == -1:
  52. raise ServiceException({'result': 2, 'description': u'网络比较慢,请您稍后刷新页面重试哦'})
  53. elif devInfo['rst'] == 1:
  54. raise ServiceException({'result': 2, 'description': u'足疗机正在忙,无响应,请稍后再试哦'})
  55. data = devInfo['data'][6::]
  56. switch = True if data[0:2] == '01' else False
  57. shake = True if data[2:4] == '01' else False
  58. hot = True if data[4:6] == '01' else False
  59. mode = 'mode%s' % (int(data[6:8]))
  60. leftTime = int(data[8:10], 16)
  61. if not switch:
  62. leftTime = 0
  63. return {'switch': switch, 'shake': shake, 'hot': hot, 'mode': mode, 'leftTime': leftTime}
  64. def get_left_time(self):
  65. infoDict = self.get_dev_status_from_dev()
  66. return infoDict['leftTime']
  67. def press_button(self, buttonName, value):
  68. if buttonName == 'mode':
  69. buttonName = value
  70. data = '01'
  71. cmdDict = {'start': '01', 'shake': '02', 'hot': '03', 'mode1': '04', 'mode2': '05', 'mode3': '06',
  72. 'mode4': '07'}
  73. data += cmdDict[buttonName]
  74. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  75. {'IMEI': self._device['devNo'], "funCode": '55', 'data': data})
  76. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  77. if devInfo['rst'] == -1:
  78. raise ServiceException({'result': 2, 'description': u'足疗机正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'})
  79. elif devInfo['rst'] == 1:
  80. raise ServiceException({'result': 2, 'description': u'足疗机正在忙,无响应,您的金币还在,请稍后再试哦'})
  81. data = devInfo['data'][6::]
  82. switch = True if data[0:2] == '01' else False
  83. shake = True if data[2:4] == '01' else False
  84. hot = True if data[4:6] == '01' else False
  85. mode = 'mode%s' % (int(data[6:8]))
  86. leftTime = int(data[8:10], 16)
  87. # 这款足疗机的运行时间固定是15分钟
  88. Device.update_dev_control_cache(
  89. self._device['devNo'],
  90. {
  91. 'status': Const.DEV_WORK_STATUS_WORKING if switch else Const.DEV_WORK_STATUS_IDLE,
  92. 'switch': switch,
  93. 'shake': shake,
  94. 'hot': hot,
  95. 'mode': mode,
  96. 'leftTime': leftTime,
  97. 'finishedTime': int(time.time()) + leftTime * 60
  98. })
  99. return {'switch': switch, 'shake': shake, 'hot': hot, 'mode': mode}
  100. def get_dev_status(self):
  101. infoDict = self.get_dev_status_from_dev()
  102. # 这款足疗机的运行时间固定是15分钟
  103. Device.update_dev_control_cache(
  104. self._device['devNo'],
  105. {'status': Const.DEV_WORK_STATUS_WORKING,
  106. 'switch': infoDict['switch'],
  107. 'shake': infoDict['shake'],
  108. 'hot': infoDict['hot'],
  109. 'mode': infoDict['mode'],
  110. 'leftTime': infoDict['leftTime'],
  111. 'finishedTime': int(time.time()) + infoDict['leftTime'] * 60
  112. })
  113. return infoDict
  114. def support_count_down(self, openId = None, port = None):
  115. return True
  116. def count_down(self, request, dev, agent, group, devType, lastOpenId, port = None):
  117. devInfo = self.get_dev_status()
  118. return JsonResponse(
  119. {
  120. 'result': 1,
  121. 'description': '',
  122. 'payload': {
  123. 'surplus': devInfo['leftTime'],
  124. 'sum': 15,
  125. 'name': group['groupName'],
  126. 'address': group['address'],
  127. 'code': devType.get('code'),
  128. 'orderProcessing': False,
  129. 'logicalCode': dev['logicalCode'],
  130. 'user': 'me' if lastOpenId == request.user.openId else 'notme',
  131. 'agentFeatures': agent.features,
  132. 'status': devInfo
  133. }
  134. })
  135. def stop(self, port = None):
  136. Device.invalid_device_control_cache(self.device.devNo)
  137. devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.STOP_DEVICE, payload = {
  138. 't': int(time.time())
  139. })
  140. if devInfo['rst'] == 0:
  141. if 'left_time' in devInfo:
  142. devInfo['remainder_time'] = int(devInfo['left_time'] / 60.0)
  143. else:
  144. devInfo['remainder_time'] = int(devInfo['remainder_time'] / 60.0)
  145. return devInfo