package com.hdl.sdk.hdl_core.HDLAppliances.HDLAirCondition.Parser; import com.hdl.sdk.hdl_core.Config.Configuration; import com.hdl.sdk.hdl_core.HDLAppliances.Config.HDLApConfig; import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo; import com.hdl.sdk.hdl_core.HDLDeviceManger.Core.HDLDeviceManager; /** * Created by Tommy on 2017/7/20. */ public class AirCtrlParser { public static final int fail = 0; public static final int infrared = 1; public static final int panelLock = 2; public static final int airSwich = 3; public static final int airOn = 1;//空调开 public static final int airOff = 0;//空调关 public static final int refTem = 4;//制冷温度 public static final int airSpeed = 5;//风速 public static final int airSpeedAuto = 0;//风速自动 public static final int airSpeedHigh = 1;//风速高风 public static final int airSpeedMid = 2;//风速中风 public static final int airSpeedLow = 3;//风速低风 public static final int airMode = 6;//空调模式 public static final int airModeRefTem = 0;//空调模式制冷 public static final int airModeHeatTem = 1;//空调模式制热 public static final int airModeVen = 2;//空调模式通风 public static final int airModeAuto = 3;//空调模式自动 public static final int airModeDehum = 4;//空调模式抽湿 public static final int heatTem = 7;//制热温度 public static final int autoTem = 8;//自动温度 public static final int upTem = 9;//上升温度 public static final int downTem = 10;//下降温度 public static final int dehumTem = 19;//抽湿温度 public static final int airIndoorTemp = 200;//室内温度 2021-08-10 自定义,用于通知当前设备室内温度 public static byte[] getAirPanelAddByte(int type, int arg2) { byte[] addBytes; switch (type) { case airSwich: if (arg2 == airOff) { addBytes = new byte[]{airSwich, (byte) arg2}; } else if (arg2 == airOn) { addBytes = new byte[]{airSwich, (byte) arg2}; } else { addBytes = new byte[]{fail}; } break; case refTem: addBytes = new byte[]{refTem, (byte) arg2}; break; case airSpeed: switch (arg2) { case airSpeedAuto: addBytes = new byte[]{airSpeed, airSpeedAuto}; break; case airSpeedHigh: addBytes = new byte[]{airSpeed, airSpeedHigh}; break; case airSpeedMid: addBytes = new byte[]{airSpeed, airSpeedMid}; break; case airSpeedLow: addBytes = new byte[]{airSpeed, airSpeedLow}; break; default: addBytes = new byte[]{fail}; break; } break; case airMode: switch (arg2) { case airModeRefTem: addBytes = new byte[]{airMode, airModeRefTem}; break; case airModeHeatTem: addBytes = new byte[]{airMode, airModeHeatTem}; break; case airModeVen: addBytes = new byte[]{airMode, airModeVen}; break; case airModeAuto: addBytes = new byte[]{airMode, airModeAuto}; break; case airModeDehum: addBytes = new byte[]{airMode, airModeDehum}; break; default: addBytes = new byte[]{fail}; break; } break; case heatTem: addBytes = new byte[]{heatTem, (byte) arg2}; break; case autoTem: addBytes = new byte[]{autoTem, (byte) arg2}; break; case dehumTem: addBytes = new byte[]{dehumTem, (byte) arg2}; break; case upTem: addBytes = new byte[]{upTem, (byte) arg2}; break; case downTem: addBytes = new byte[]{downTem, (byte) arg2}; break; default: addBytes = new byte[]{fail}; break; } return addBytes; } /** * 状态数据异常的时候,生成默认空调数据 * @return */ public static byte[] getNewAcByte() { byte[] airBytes = new byte[13]; airBytes[0] = 0; airBytes[1] = 0; airBytes[2] = (byte) 28; airBytes[3] = (byte) 28; airBytes[4] = (byte) 28; airBytes[5] = (byte) 28; airBytes[6] = (byte) 28; airBytes[7] = 0; airBytes[8] = 1; airBytes[9] = 0; airBytes[10] = 0; airBytes[11] = (byte) 28; airBytes[12] = 0; return airBytes; } /** * 简易编程搜索 状态数据bytes格式,对比旧状态数据修改更新状态处理,不用简易编程搜索备注接收状态的话,该方法可以忽略 * 0 开关状态 * 1 模式 * 2 温度 * 3 风速 * 4 当前室温 * 5 是否摆风 * * @return */ public static byte[] getNewAcByteWithE44B(byte[] bytes, byte[] oldBytes) { byte[] airBytes = getNewAcByte(); if(oldBytes != null && oldBytes.length >= 13){ airBytes = oldBytes; } if (bytes.length > 5) { // airBytes[0] = 0; // airBytes[1] = 0; airBytes[2] = bytes[4]; // airBytes[3] = bytes[2]; // airBytes[4] = bytes[2]; // airBytes[5] = bytes[2]; // airBytes[6] = bytes[2]; airBytes[7] = (byte) ((airBytes[2] & 0xff) * 16 + (airBytes[3] & 0xff)); airBytes[8] = bytes[0]; airBytes[9] = bytes[1]; airBytes[10] = bytes[3]; airBytes[11] = bytes[2]; airBytes[12] = bytes[5]; } return airBytes; } public static byte[] getAcAddByte(AppliancesInfo appliancesInfo, int type, int state) { try { AppliancesInfo newInfo = appliancesInfo; byte[] airBytes = null; outter: for (int i = 0; i < HDLDeviceManager.devicesDataList.size(); i++) { if (appliancesInfo.getDeviceSubnetID() == HDLDeviceManager.devicesDataList.get(i).getSourceSubnetID() && appliancesInfo.getDeviceDeviceID() == HDLDeviceManager.devicesDataList.get(i).getSourceDeviceID()) { for (int j = 0; j < HDLDeviceManager.devicesDataList.get(i).getAppliancesInfoList().size(); j++) { if (HDLDeviceManager.devicesDataList.get(i).getAppliancesInfoList().get(j).getBigType() == Configuration.AIR_BIG_TYPE && HDLDeviceManager.devicesDataList.get(i).getAppliancesInfoList().get(j).getDeviceType() != HDLApConfig.TYPE_AC_PANEL && appliancesInfo.getChannelNum() == HDLDeviceManager.devicesDataList.get(i).getAppliancesInfoList().get(j).getChannelNum()) { newInfo = HDLDeviceManager.devicesDataList.get(i).getAppliancesInfoList().get(j); //2021-09-07 之前标准空调模块协议是13位,新的空调回复协议变成长度19位,增加兼容处理 if (newInfo.getArrCurState() == null || newInfo.getArrCurState().length < 13) { newInfo.setArrCurState(getNewAcByte()); } airBytes = newInfo.getArrCurState(); break outter; } } } } byte[] addBytes = new byte[13]; if (airBytes != null && airBytes.length >= 13) { //2020-05-28 如果温度为0自动修改为28 if ((airBytes[11] & 0xff) == 0) { airBytes[11] = (byte) 28; } addBytes[0] = (byte) newInfo.getChannelNum(); addBytes[1] = 0; addBytes[2] = airBytes[2]; addBytes[3] = airBytes[3]; addBytes[4] = airBytes[4]; addBytes[5] = airBytes[5]; addBytes[6] = airBytes[6]; addBytes[7] = (byte) ((airBytes[9] & 0xff) * 16 + (airBytes[10] & 0xff)); addBytes[8] = airBytes[8]; addBytes[9] = airBytes[9]; addBytes[10] = airBytes[10]; addBytes[11] = airBytes[11]; addBytes[12] = airBytes[12]; } else { addBytes[0] = (byte) newInfo.getChannelNum(); addBytes[1] = 0; addBytes[2] = (byte) 28; addBytes[3] = (byte) 28; addBytes[4] = (byte) 28; addBytes[5] = (byte) 28; addBytes[6] = (byte) 28; addBytes[7] = 0; addBytes[8] = 1; addBytes[9] = 0; addBytes[10] = 0; addBytes[11] = (byte) 28; addBytes[12] = 0; } switch (type) { case airSwich: if (state == airOff) { addBytes[8] = 0; } else { addBytes[8] = 1; } break; case refTem: addBytes[8] = 1; addBytes[3] = (byte) state; addBytes[11] = (byte) state; break; case heatTem: addBytes[8] = 1; addBytes[4] = (byte) state; addBytes[11] = (byte) state; break; case autoTem: addBytes[8] = 1; addBytes[5] = (byte) state; addBytes[11] = (byte) state; break; case dehumTem: addBytes[8] = 1; addBytes[6] = (byte) state; addBytes[11] = (byte) state; break; case upTem: addBytes[8] = 1; byte tempByte = (byte) ((airBytes[11] & 0xff) + state); //判断当前模式 if(addBytes[9] == 0){//制冷 tempByte = (byte) ((airBytes[3] & 0xff) + state); addBytes[3] = tempByte; }else if(addBytes[9] == 1){//制热 tempByte = (byte) ((airBytes[4] & 0xff) + state); addBytes[4] = tempByte; }else if(addBytes[9] == 3){//自动 tempByte = (byte) ((airBytes[5] & 0xff) + state); addBytes[5] = tempByte; }else if(addBytes[9] == 4){//抽湿 tempByte = (byte) ((airBytes[6] & 0xff) + state); addBytes[6] = tempByte; } addBytes[11] = tempByte; break; case downTem: addBytes[8] = 1; byte tempByte2 = (byte) ((airBytes[11] & 0xff) - state); //判断当前模式 if(addBytes[9] == 0){//制冷 tempByte2 = (byte) ((airBytes[3] & 0xff) - state); addBytes[3] = tempByte2; }else if(addBytes[9] == 1){//制热 tempByte2 = (byte) ((airBytes[4] & 0xff) - state); addBytes[4] = tempByte2; }else if(addBytes[9] == 3){//自动 tempByte2 = (byte) ((airBytes[5] & 0xff) - state); addBytes[5] = tempByte2; }else if(addBytes[9] == 4){//抽湿 tempByte2 = (byte) ((airBytes[6] & 0xff) - state); addBytes[6] = tempByte2; } addBytes[11] = tempByte2; break; case airMode: addBytes[8] = 1; addBytes[7] = (byte) (state * 16 + (airBytes[10] & 0xff)); addBytes[9] = (byte) state; break; case airSpeed: addBytes[8] = 1; addBytes[7] = (byte) ((airBytes[9] & 0xff) * 16 + state); addBytes[10] = (byte) state; break; } return addBytes; } catch (Exception e) { e.printStackTrace(); return new byte[]{fail}; } } }