# -*- coding: utf-8 -*- # !/usr/bin/env python from apps.web.constant import DeviceCmdCode, Const, MQTT_TIMEOUT from apps.web.core.adapter.base import SmartBox from apps.web.core.exceptions import ServiceException from apps.web.core.networking import MessageSender class WasherCWBox(SmartBox): STATUS_CODE_INFO = { '00': u'待机中', '01': u'预约中', '02': u'消毒清洁中', '03': u'洗衣工作中', '04': u'洗衣机洗涤结束', '05': u'洗衣机自检中', '06': u'进水超时', '07': u'排水超时', '08': u'脱水时撞桶', '09': u'脱水开盖', '0A': u'水位传感器异常', '0B': u'溢水报警', '0C': u'电机故障', '0D': u'通讯故障', 'FD': u'IMEI', 'FE': u'投币金额', } def __init__(self, device): super(WasherCWBox, self).__init__(device) # 向洗衣发送查询信息 def send_data(self, funCode, data='', timeout=MQTT_TIMEOUT.NORMAL): result = MessageSender.send(device = self.device, cmd = DeviceCmdCode.OPERATE_DEV_SYNC, payload = { "IMEI": self._device["devNo"], "funCode": funCode, "data": data }, timeout = timeout) if result["rst"] != 0: if result['rst'] == -1: raise ServiceException({'result': 2, 'description': u'洗衣机正在玩命找网络,请稍候再试'}) elif result['rst'] == 1: raise ServiceException({'result': 2, 'description': u'洗衣机主板连接故障'}) else: raise ServiceException({'result': 2, 'description': u'系统错误'}) return result #获取设备信息 def getDevInfo(self): """ 获取 洗衣机的状态信息 funCode指令: 01-查询 02-工作 03-预约 05-取消预约 """ devInfo = self.send_data("01") data = devInfo.get("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'当前洗衣机忙,无响应,请您稍候再试'}) #当前状态判断 temp = data[6:8] if temp == '00': status = Const.DEV_WORK_STATUS_IDLE statusInfo = u'待机中' elif temp == '01': status = Const.DEV_WORK_STATUS_WORKING statusInfo = u'预约中' elif temp == '02': status = Const.DEV_WORK_STATUS_WORKING statusInfo = u'消毒清洁中' elif temp == '03': status = Const.DEV_WORK_STATUS_WORKING statusInfo = u'洗衣工作中' elif temp == '04': status = Const.DEV_WORK_STATUS_FINISHED statusInfo = u'洗衣机洗涤结束' elif temp == '05': status = Const.DEV_WORK_STATUS_WORKING statusInfo = u'洗衣机自检中' elif temp == '06': status = Const.DEV_WORK_STATUS_FAULT statusInfo = u'进水超时' elif temp == '07': status = Const.DEV_WORK_STATUS_FAULT statusInfo = u'排水超时' elif temp == '08': status = Const.DEV_WORK_STATUS_FAULT statusInfo = u'脱水时撞桶' elif temp == '09': status = Const.DEV_WORK_STATUS_FAULT statusInfo = u'脱水开盖' elif temp == '0A': status = Const.DEV_WORK_STATUS_FAULT statusInfo = u'水位传感器异常' elif temp == '0B': status = Const.DEV_WORK_STATUS_FAULT statusInfo = u'溢水报警' elif temp == '0C': status = Const.DEV_WORK_STATUS_FAULT statusInfo = u'电机故障' elif temp == '0D': status = Const.DEV_WORK_STATUS_FAULT statusInfo = u'通讯故障' elif temp == 'FD': status = Const.DEV_WORK_STATUS_WORKING statusInfo = u'IMEI' elif temp == 'FE': status = Const.DEV_WORK_STATUS_WORKING statusInfo = u'投币金额' else: status = Const.DEV_WORK_STATUS_FAULT statusInfo = u'未知错误' temp = data[14:16] leftTime = int(temp, 16) return {'status': status, 'statusInfo': statusInfo, 'leftTime': leftTime} def check_dev_status(self, attachParas = None): """ 检查洗衣机的当前状态 :param attachParas: :return: """ status = self.getDevInfo().get("status") if status != Const.DEV_WORK_STATUS_IDLE: raise ServiceException({"result": 2, "description": u"请稍后使用"}) #入口函数 def start_device(self, package, openId, attachParas): info = self.getDevInfo() if info['status'] == Const.DEV_WORK_STATUS_FAULT: raise ServiceException( {'result': 2, 'description': u'当前洗衣机故障:%s' % info['statusInfo']}) if u'待机' not in info['statusInfo']: raise ServiceException( {'result': 2, 'description': u'当前洗衣机%s,请稍候使用' % info['statusInfo']}) ''' 指令: 01-查询 02-工作 03-预约 05-取消预约 ''' #定义发送的指令信息如果有预约 data = '' washName = package['name'] temp = '' if washName == Const.WASHER_BOX_SET_DWX: # 大物件 --> 加强洗 46min temp = '01' elif washName == Const.WASHER_BOX_SET_BZX: # 标准洗 --> 标准洗 38min temp = '02' elif washName == Const.WASHER_BOX_SET_KSX: # 快速洗 --> 快速洗 22min temp = '03' elif washName == Const.WASHER_BOX_SET_DTS: # 单脱水 --> 单脱水 6min temp = '04' elif washName == Const.WASHER_BOX_SET_TQJ: # 桶清洁 --> 桶清洁 4min temp = '05' elif washName == Const.WASHER_BOX_SET_DWX: # 自检 --> 洗衣机自检 30sec 复位洗衣机状态!!! temp = '06' data = data + temp result = MessageSender.send(device = self.device, cmd = DeviceCmdCode.OPERATE_DEV_SYNC, payload = { 'IMEI': self._device['devNo'], "funCode": "02", "data": data }, timeout = MQTT_TIMEOUT.START_DEVICE) if result['rst'] != 0: if result['rst'] == -1: raise ServiceException( {'result': 2, 'description': u'洗衣机正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者试试投硬币,或者稍后再试哦'}) elif result['rst'] == 1: raise ServiceException({'result': 2, 'description': u'洗衣机主板连接故障,您的金币还在,设备暂时不能网络支付,请尝试投币哦'}) else: raise ServiceException({'result': 2, 'description': u'系统错误,您的金币还在,款请尝试投币哦'})