time3.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import time
  5. from apilib.utils_datetime import to_datetime
  6. from apilib.utils_json import JsonResponse
  7. from apps.web.constant import DeviceCmdCode, MQTT_TIMEOUT, ErrorCode, Const
  8. from apps.web.core.adapter.base import SmartBox
  9. from apps.web.core.exceptions import ServiceException
  10. from apps.web.core.networking import MessageSender
  11. from apps.web.device.models import Device
  12. from apps.web.core.device_define import PackageDict
  13. class TimeSwitchBox3(SmartBox):
  14. def __init__(self, device):
  15. super(TimeSwitchBox3, self).__init__(device)
  16. def test(self, coins):
  17. now_time = datetime.datetime.now()
  18. return MessageSender.send(device = self.device, cmd = DeviceCmdCode.PAY_MONEY, payload = {
  19. 't': int(time.mktime(now_time.timetuple())),
  20. 'duration': 300
  21. })
  22. def stop(self, port = None):
  23. Device.invalid_device_control_cache(self.device.devNo)
  24. devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.STOP_DEVICE, payload = {
  25. 't': int(time.time())
  26. })
  27. if devInfo['rst'] == 0:
  28. if 'left_time' in devInfo:
  29. devInfo['remainder_time'] = int(devInfo['left_time'] / 60.0)
  30. else:
  31. devInfo['remainder_time'] = int(devInfo['remainder_time'] / 60.0)
  32. return devInfo
  33. def start_device(self, package, openId, attachParas):
  34. #: 首先检查设备是否在线
  35. now_time = datetime.datetime.now()
  36. duration = PackageDict(package).estimated_duraion
  37. devInfo = MessageSender.send(device = self.device,
  38. cmd = DeviceCmdCode.PAY_MONEY,
  39. payload = {
  40. 't': int(time.mktime(now_time.timetuple())),
  41. 'duration': duration
  42. }, timeout = MQTT_TIMEOUT.START_DEVICE)
  43. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  44. current_dev_type_name = self.device['devType']['name']
  45. if current_dev_type_name == u'其他':
  46. current_dev_type_name = u'自助设备'
  47. if devInfo['rst'] == -1:
  48. description = u'当前' + current_dev_type_name + u'正在玩命找网络,您的金币还在,重试不会扣款,建议您试试旁边其他设备,或者试试投硬币,或者稍后再试哦'
  49. raise ServiceException({'result': ErrorCode.DEVICE_CONN_FAIL, 'description': description})
  50. elif devInfo['rst'] == 1:
  51. description = u'当前' + current_dev_type_name + u'正在忙,无响应,您的金币还在,重试不会扣款,请试试其他线路,或者请稍后再试哦'
  52. raise ServiceException({'result': ErrorCode.BOARD_UART_TIMEOUT, 'description': description})
  53. if 'left_time' in devInfo:
  54. # 新版本设置到设备后, 时间是上次还剩下的时间加上本次下发的时间
  55. needTime = devInfo['left_time']
  56. devInfo['finishedTime'] = (int(time.mktime(now_time.timetuple())) + int(needTime))
  57. Device.update_dev_control_cache(
  58. self.device['devNo'],
  59. {
  60. 'status': Const.DEV_WORK_STATUS_WORKING,
  61. 'finishedTime': devInfo['finishedTime'],
  62. 'openId': openId,
  63. 'startTime': now_time.strftime('%Y-%m-%d %H:%M:%S'),
  64. 'needTime': needTime,
  65. 'vCardId': self._vcard_id
  66. })
  67. return devInfo
  68. else:
  69. # 老版本去模块取时间
  70. devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.GET_DEVINFO, payload = {
  71. 'fields': ['remainder_time']
  72. })
  73. if devInfo.has_key('rst') and devInfo['rst'] == 0 and devInfo.has_key('remainder_time'):
  74. needTime = devInfo['remainder_time'] / 1000.0
  75. else:
  76. needTime = duration
  77. devInfo['finishedTime'] = (int(time.time()) + int(needTime))
  78. Device.update_dev_control_cache(self.device.devNo,
  79. {
  80. 'status': Const.DEV_WORK_STATUS_WORKING,
  81. 'finishedTime': devInfo['finishedTime'],
  82. 'openId': openId,
  83. 'startTime': now_time.strftime('%Y-%m-%d %H:%M:%S'),
  84. 'needTime': needTime,
  85. 'vCardId': self._vcard_id
  86. })
  87. return devInfo
  88. def get_left_time(self):
  89. ctrInfo = Device.get_dev_control_cache(self.device['devNo'])
  90. if (ctrInfo is None) or (not ctrInfo.has_key('status')) or (
  91. ctrInfo['status'] == Const.DEV_WORK_STATUS_IDLE):
  92. return 0.0, 0.0
  93. devInfo = MessageSender.send(device = self.device,
  94. cmd = DeviceCmdCode.GET_DEVINFO,
  95. payload = {'fields': ['remainder_time', 'left_time']})
  96. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  97. if ctrInfo.has_key('startTime') and ctrInfo.has_key('needTime'):
  98. startTime = to_datetime(ctrInfo['startTime'])
  99. needTime = ctrInfo['needTime'] / 60.0
  100. leftTime = needTime - (datetime.datetime.now() - startTime).total_seconds() / 60.0
  101. return leftTime, needTime
  102. current_dev_type_name = self.device['devType']['name']
  103. if current_dev_type_name == u'其他':
  104. current_dev_type_name = u'自助设备'
  105. if devInfo['rst'] == -1:
  106. description = u'当前' + current_dev_type_name + u'正在玩命找网络,建议您试试旁边其他设备,或者试试投硬币,或者稍后再试哦'
  107. raise ServiceException({'result': 2, 'description': description})
  108. elif devInfo['rst'] == 1:
  109. description = u'当前' + current_dev_type_name + u'正在忙,无响应,请稍后再试哦'
  110. raise ServiceException({'result': 2, 'description': description})
  111. if 'left_time' in devInfo:
  112. # 新版本换一个字段,以秒为单位
  113. leftTime = devInfo['left_time']
  114. needTime = ctrInfo.get('needTime', leftTime)
  115. elif 'remainder_time' in devInfo:
  116. # 老版本是以毫秒为单位
  117. leftTime = devInfo['remainder_time'] / 1000.0
  118. needTime = ctrInfo.get('needTime', leftTime)
  119. elif ctrInfo.has_key('startTime') and ctrInfo.has_key('needTime'):
  120. startTime = to_datetime(ctrInfo['startTime'])
  121. needTime = ctrInfo['needTime'] / 60.0
  122. leftTime = needTime - (datetime.datetime.now() - startTime).total_seconds() / 60.0
  123. return leftTime, needTime
  124. else:
  125. return 0.0, 0.0
  126. if leftTime == 0.0: # 顺便清理下状态
  127. Device.invalid_device_control_cache(self.device['devNo'])
  128. if needTime < leftTime:
  129. needTime = leftTime
  130. return leftTime / 60.0, needTime / 60.0
  131. def support_count_down(self, openId = None, port = None):
  132. return True
  133. def count_down(self, request, dev, agent, group, devType, lastOpenId, port = None):
  134. surplus, sumtime = self.get_left_time()
  135. orderProcessing = False
  136. if surplus == 0.0 and sumtime == 0.0:
  137. orderProcessing = True
  138. return JsonResponse(
  139. {
  140. 'result': 1,
  141. 'description': '',
  142. 'payload': {
  143. 'surplus': surplus,
  144. 'sum': sumtime,
  145. 'name': group['groupName'],
  146. 'address': group['address'],
  147. 'code': devType.get('code'),
  148. 'orderProcessing': orderProcessing,
  149. 'logicalCode': dev['logicalCode'],
  150. 'user': 'me' if lastOpenId == request.user.openId else 'notme',
  151. 'agentFeatures': agent.features,
  152. }
  153. })