# -*- coding: utf-8 -*- # !/usr/bin/env python import time from apilib.utils_json import JsonResponse from apps.web.constant import DeviceCmdCode, MQTT_TIMEOUT, Const from apps.web.core.adapter.base import SmartBox from apps.web.core.exceptions import ServiceException from apps.web.core.networking import MessageSender from apps.web.device.models import Device class TimeSwitchBox2(SmartBox): def test(self, coins): return MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '01', 'data': '0101'}) def start_device(self, package, openId, attachParas): infoDict = self.get_dev_status_from_dev() if infoDict['switch']: raise ServiceException({'result': 2, 'description': u'足疗机已经开机了哦!还有%s分钟结束' % infoDict['leftTime']}) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '55', 'data': '0101'}, timeout = MQTT_TIMEOUT.START_DEVICE) if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException({'result': 2, 'description': u'足疗机正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'}) elif devInfo['rst'] == 1: raise ServiceException({'result': 2, 'description': u'足疗机正在忙,无响应,您的金币还在,请稍后再试哦'}) data = devInfo['data'][6::] switch = True if data[0:2] == '01' else False if not switch: raise ServiceException({'result': 2, 'description': u'足疗机启动失败,您的金币还在,请您再重试看看吧'}) shake = True if data[2:4] == '01' else False hot = True if data[4:6] == '01' else False mode = 'mode%s' % (int(data[6:8])) leftTime = int(data[8:10], 16) # 这款足疗机的运行时间固定是15分钟 Device.update_dev_control_cache( self._device['devNo'], { 'status': Const.DEV_WORK_STATUS_WORKING, 'switch': switch, 'shake': shake, 'hot': hot, 'mode': mode, 'leftTime': leftTime, 'finishedTime': int(time.time()) + leftTime * 60 }) return devInfo def get_dev_status_from_dev(self): devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '55', 'data': '010F'}) if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException({'result': 2, 'description': u'网络比较慢,请您稍后刷新页面重试哦'}) elif devInfo['rst'] == 1: raise ServiceException({'result': 2, 'description': u'足疗机正在忙,无响应,请稍后再试哦'}) data = devInfo['data'][6::] switch = True if data[0:2] == '01' else False shake = True if data[2:4] == '01' else False hot = True if data[4:6] == '01' else False mode = 'mode%s' % (int(data[6:8])) leftTime = int(data[8:10], 16) if not switch: leftTime = 0 return {'switch': switch, 'shake': shake, 'hot': hot, 'mode': mode, 'leftTime': leftTime} def get_left_time(self): infoDict = self.get_dev_status_from_dev() return infoDict['leftTime'] def press_button(self, buttonName, value): if buttonName == 'mode': buttonName = value data = '01' cmdDict = {'start': '01', 'shake': '02', 'hot': '03', 'mode1': '04', 'mode2': '05', 'mode3': '06', 'mode4': '07'} data += cmdDict[buttonName] devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '55', 'data': data}) if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException({'result': 2, 'description': u'足疗机正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'}) elif devInfo['rst'] == 1: raise ServiceException({'result': 2, 'description': u'足疗机正在忙,无响应,您的金币还在,请稍后再试哦'}) data = devInfo['data'][6::] switch = True if data[0:2] == '01' else False shake = True if data[2:4] == '01' else False hot = True if data[4:6] == '01' else False mode = 'mode%s' % (int(data[6:8])) leftTime = int(data[8:10], 16) # 这款足疗机的运行时间固定是15分钟 Device.update_dev_control_cache( self._device['devNo'], { 'status': Const.DEV_WORK_STATUS_WORKING if switch else Const.DEV_WORK_STATUS_IDLE, 'switch': switch, 'shake': shake, 'hot': hot, 'mode': mode, 'leftTime': leftTime, 'finishedTime': int(time.time()) + leftTime * 60 }) return {'switch': switch, 'shake': shake, 'hot': hot, 'mode': mode} def get_dev_status(self): infoDict = self.get_dev_status_from_dev() # 这款足疗机的运行时间固定是15分钟 Device.update_dev_control_cache( self._device['devNo'], {'status': Const.DEV_WORK_STATUS_WORKING, 'switch': infoDict['switch'], 'shake': infoDict['shake'], 'hot': infoDict['hot'], 'mode': infoDict['mode'], 'leftTime': infoDict['leftTime'], 'finishedTime': int(time.time()) + infoDict['leftTime'] * 60 }) return infoDict def support_count_down(self, openId = None, port = None): return True def count_down(self, request, dev, agent, group, devType, lastOpenId, port = None): devInfo = self.get_dev_status() return JsonResponse( { 'result': 1, 'description': '', 'payload': { 'surplus': devInfo['leftTime'], 'sum': 15, 'name': group['groupName'], 'address': group['address'], 'code': devType.get('code'), 'orderProcessing': False, 'logicalCode': dev['logicalCode'], 'user': 'me' if lastOpenId == request.user.openId else 'notme', 'agentFeatures': agent.features, 'status': devInfo } }) def stop(self, port = None): Device.invalid_device_control_cache(self.device.devNo) devInfo = MessageSender.send(device = self.device, cmd = DeviceCmdCode.STOP_DEVICE, payload = { 't': int(time.time()) }) if devInfo['rst'] == 0: if 'left_time' in devInfo: devInfo['remainder_time'] = int(devInfo['left_time'] / 60.0) else: devInfo['remainder_time'] = int(devInfo['remainder_time'] / 60.0) return devInfo