/* KadecotHomeAirConditionerProfile.java Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.kadecot.profile; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import org.deviceconnect.android.deviceplugin.kadecot.KadecotDeviceService; import org.deviceconnect.android.deviceplugin.kadecot.kadecotdevice.KadecotHomeAirConditioner; import org.deviceconnect.android.deviceplugin.kadecot.kadecotdevice.KadecotResult; import org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfile; import org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.DeleteApi; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.android.profile.api.PutApi; import org.deviceconnect.message.DConnectMessage; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.IDX_DEVICEID; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.IDX_PREFIX; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.IDX_PROFILENAME; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.NO_RESULT; import static org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService.PREFIX_KADECOT; /** * Home Air Conditioner Profile. * * @author NTT DOCOMO, INC. */ public class KadecotHomeAirConditionerProfile extends AirConditionerProfile { /** * Kadecot server query task class. */ public class KadecotServerQueryTask extends AsyncTask<Intent, Void, Void> { @Override protected Void doInBackground(final Intent... intents) { Intent request = intents[0]; Intent response = intents[1]; String action = request.getAction(); String attr = getAttribute(request); if (action.endsWith(DConnectMessage.METHOD_GET)) { if (attr == null) { getAirConditioner(request, response); } else { if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_POWER_SAVING, attr)) { getAirConditionerOperationPowerSaving(request, response); } else if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_MODE_SETTING, attr)) { getAirConditionerOperationModeSetting(request, response); } else if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_ROOM_TEMPERATURE, attr)) { getAirConditionerRoomTemperature(request, response); } else if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_TEMPERATURE, attr)) { getAirConditionerTemperatureValue(request, response); } else if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_AIR_FLOW, attr)) { getAirConditionerAirFlowValue(request, response); } else if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_ENL_PROPERTY, attr)) { getAirConditionerECHONETLiteProperty(request, response); } else { MessageUtils.setNotSupportAttributeError(response); sendResponse(response); } } } else if (action.endsWith(DConnectMessage.METHOD_POST)) { MessageUtils.setNotSupportAttributeError(response); sendResponse(response); } else if (action.endsWith(DConnectMessage.METHOD_PUT)) { if (attr == null) { putAirConditioner(request, response); } else { if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_POWER_SAVING, attr)) { putAirConditionerOperationPowerSaving(request, response); } else if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_MODE_SETTING, attr)) { putAirConditionerOperationModeSetting(request, response); } else if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_TEMPERATURE, attr)) { putAirConditionerTemperatureValue(request, response); } else if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_AIR_FLOW, attr)) { putAirConditionerAirFlowValue(request, response); } else if (isEqual(KadecotHomeAirConditionerProfile.ATTRIBUTE_ENL_PROPERTY, attr)) { putAirConditionerECHONETLiteProperty(request, response); } else { MessageUtils.setNotSupportAttributeError(response); sendResponse(response); } } } else if (action.endsWith(DConnectMessage.METHOD_DELETE)) { if (attr == null) { deleteAirConditioner(request, response); } else { MessageUtils.setNotSupportAttributeError(response); sendResponse(response); } } return null; } } public KadecotHomeAirConditionerProfile() { addApi(mGetAirConditionerApi); addApi(mGetOperationPowerSavingApi); addApi(mGetOperationModeSettingApi); addApi(mGetRoomTemperatureApi); addApi(mGetTemperatureValueApi); addApi(mGetAirFlowValueApi); addApi(mGetECHONETLitePropertyApi); addApi(mPutAirConditionerApi); addApi(mPutOperationPowerSavingApi); addApi(mPutOperationModeSettingApi); addApi(mPutTemperatureValueApi); addApi(mPutAirFlowValueApi); addApi(mPutECHONETLitePropertyApi); addApi(mDeleteAirConditionerApi); } private final DConnectApi mGetAirConditionerApi = new GetApi() { @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Get air conditioner power status. * * @param request Request. * @param response Response. */ private void getAirConditioner(final Intent request, final Intent response) { KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), KadecotHomeAirConditioner.POWERSTATE_GET); KadecotService.getPowerStatus(response, result); sendResponse(response); } private final DConnectApi mGetOperationPowerSavingApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_POWER_SAVING; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Get air conditioner operation power saving status. * * @param request Request. * @param response Response. */ protected void getAirConditionerOperationPowerSaving(final Intent request, final Intent response) { KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), KadecotHomeAirConditioner.POWERSAVING_GET); if (result != null) { String propertyName = result.getPropertyName(); String propertyValue = result.getPropertyValue(); if (propertyName != null && propertyValue != null) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_POWERSAVINGOPERATIONSETTING)) { setResult(response, DConnectMessage.RESULT_OK); switch (propertyValue) { case "65": setPowerSaving(response, "PowerSaving"); break; case "66": setPowerSaving(response, "Normal"); break; default: setPowerSaving(response, "UNKNOWN"); break; } } else if (result.getServerResult().equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } } sendResponse(response); } private final DConnectApi mGetOperationModeSettingApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_MODE_SETTING; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Get air conditioner operation mode setting status. * * @param request Request. * @param response Response. */ protected void getAirConditionerOperationModeSetting(final Intent request, final Intent response) { KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), KadecotHomeAirConditioner.OPERATIONMODE_GET); if (result != null) { String propertyName = result.getPropertyName(); String propertyValue = result.getPropertyValue(); if (propertyName != null && propertyValue != null) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_OPERATIONMODESETTING)) { setResult(response, DConnectMessage.RESULT_OK); switch (propertyValue) { case "64": setModeSetting(response, "Other"); break; case "65": setModeSetting(response, "Automatic"); break; case "66": setModeSetting(response, "Cooling"); break; case "67": setModeSetting(response, "Heating"); break; case "68": setModeSetting(response, "Dehumidification"); break; case "69": setModeSetting(response, "AirCirculator"); break; default: setModeSetting(response, "UNKNOWN"); break; } } else if (result.getServerResult().equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } } sendResponse(response); } private final DConnectApi mGetRoomTemperatureApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ROOM_TEMPERATURE; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Get air conditioner room temperature. * * @param request Request. * @param response Response. */ protected void getAirConditionerRoomTemperature(final Intent request, final Intent response) { KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), KadecotHomeAirConditioner.ROOMTEMPERATURE_GET); if (result != null) { String propertyName = result.getPropertyName(); String propertyValue = result.getPropertyValue(); if (propertyName != null && propertyValue != null) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_MEASUREDVALUEOFROOMTEMPERATURE)) { setResult(response, DConnectMessage.RESULT_OK); int value = Integer.parseInt(propertyValue); if ((value & 0x80) == 0x80) { value = ((~(value) & 0x7F) + 1) * -1; } setRoomTemperature(response, String.valueOf(value)); } else if (result.getServerResult().equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } } sendResponse(response); } private final DConnectApi mGetTemperatureValueApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_TEMPERATURE; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Get air conditioner temperature value. * * @param request Request. * @param response Response. */ protected void getAirConditionerTemperatureValue(final Intent request, final Intent response) { KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), KadecotHomeAirConditioner.TEMPERATUREVALUE_GET); if (result != null) { String propertyName = result.getPropertyName(); String propertyValue = result.getPropertyValue(); if (propertyName != null && propertyValue != null) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_SETTEMPERATUREVALUE)) { setResult(response, DConnectMessage.RESULT_OK); setTemperature(response, propertyValue); } else if (result.getServerResult().equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } } sendResponse(response); } private final DConnectApi mGetAirFlowValueApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_AIR_FLOW; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Get air conditioner air flow value. * * @param request Request. * @param response Response. */ protected void getAirConditionerAirFlowValue(final Intent request, final Intent response) { KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), KadecotHomeAirConditioner.AIRFLOW_GET); if (result != null) { String propertyName = result.getPropertyName(); String propertyValue = result.getPropertyValue(); if (propertyName != null && propertyValue != null) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_AIRFLOWRATESETTING)) { setResult(response, DConnectMessage.RESULT_OK); setAirFlowAuto(response, "false"); switch (propertyValue) { case "49": setAirFlow(response, "0.11"); break; case "50": setAirFlow(response, "0.24"); break; case "51": setAirFlow(response, "0.37"); break; case "52": setAirFlow(response, "0.50"); break; case "53": setAirFlow(response, "0.63"); break; case "54": setAirFlow(response, "0.76"); break; case "55": setAirFlow(response, "0.89"); break; case "56": setAirFlow(response, "1.0"); break; case "65": setAirFlow(response, "0.0"); setAirFlowAuto(response, "true"); break; default: setAirFlow(response, "-1.0"); break; } } else if (result.getServerResult().equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } } sendResponse(response); } private final DConnectApi mGetECHONETLitePropertyApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ENL_PROPERTY; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Get air conditioner ECHONET Lite property. * * @param request Request. * @param response Response. */ protected void getAirConditionerECHONETLiteProperty(final Intent request, final Intent response) { String[] element = KadecotDeviceService.getElementFromServiceId(getServiceID(request)); if (element[IDX_PREFIX].equals(PREFIX_KADECOT) && element[IDX_DEVICEID] != null && element[IDX_PROFILENAME].equals(PROFILE_NAME)) { String strEpcs = getEpc(request); if (strEpcs == null) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } Pattern p = Pattern.compile(","); String[] epcs = p.split(strEpcs); List<Bundle> dataList = new ArrayList<>(); Bundle resultData = new Bundle(); for (int i = 0; i < epcs.length; i++) { String strValue = epcs[i].trim(); try { int checkInt = Integer.decode(strValue); if (checkInt < 0x0 || checkInt >= 0x100) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } epcs[i] = "0x" + Integer.toHexString(checkInt); } catch (NumberFormatException e) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } } for (String epc : epcs) { String urlstr = "content://com.sonycsl.kadecot.json.provider/jsonp/v1/devices/" + element[IDX_DEVICEID] + "?procedure=get¶ms={\"propertyName\":\"" + epc + "\"}"; Cursor cursor = getContext().getContentResolver().query(Uri.parse(urlstr), null, null, null, null); if (cursor != null) { cursor.moveToFirst(); String result = cursor.getString(0); String propertyName = KadecotDeviceService.getPropertyName(result); String propertyValue = KadecotDeviceService.getPropertyValue(result); if (propertyName != null && propertyValue != null) { if (result.equals(NO_RESULT)) { cursor.close(); MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); sendResponse(response); return; } else { resultData.putString(PARAM_EPC, propertyName); resultData.putString(PARAM_VALUE, propertyValue); dataList.add((Bundle) resultData.clone()); } } else { cursor.close(); KadecotService.createInvalidKadecotResponseError(response); sendResponse(response); return; } cursor.close(); } else { KadecotService.createInvalidKadecotResponseError(response); sendResponse(response); return; } } setResult(response, DConnectMessage.RESULT_OK); response.putExtra(PARAM_PROPERTIES, dataList.toArray(new Bundle[dataList.size()])); } else { KadecotService.createInvalidKadecotResponseError(response); } sendResponse(response); } private final DConnectApi mPutAirConditionerApi = new PutApi() { @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Put air conditioner power status. * * @param request Request. * @param response Response. */ private void putAirConditioner(final Intent request, final Intent response) { KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), KadecotHomeAirConditioner.POWERSTATE_ON); KadecotService.powerOn(response, result); sendResponse(response); } private final DConnectApi mPutOperationPowerSavingApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_POWER_SAVING; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Put air conditioner operation power saving status. * * @param request Request. * @param response Response. */ protected void putAirConditionerOperationPowerSaving(final Intent request, final Intent response) { int index; String status = getPowerSaving(request); if (status == null) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } switch (status) { case "Normal": index = KadecotHomeAirConditioner.POWERSAVING_OFF; break; case "PowerSaving": index = KadecotHomeAirConditioner.POWERSAVING_ON; break; default: MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), index); if (result != null) { String propertyName = result.getPropertyName(); String propertyValue = result.getPropertyValue(); if (propertyName != null && propertyValue != null) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_POWERSAVINGOPERATIONSETTING)) { String powersaving = getPowerSaving(request); switch (propertyValue) { case "65": checkResult(response, powersaving, "PowerSaving"); break; case "66": checkResult(response, powersaving, "Normal"); break; default: KadecotService.createInvalidKadecotResponseError(response); break; } } else if (result.getServerResult().equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } } sendResponse(response); } private final DConnectApi mPutOperationModeSettingApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_MODE_SETTING; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Put air conditioner operation mode setting status. * * @param request Request. * @param response Response. */ protected void putAirConditionerOperationModeSetting(final Intent request, final Intent response) { int index; String status = getModeSetting(request); if (status == null) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } switch (getModeSetting(request)) { case "Other": index = KadecotHomeAirConditioner.OPERATIONMODE_OTHER; break; case "Automatic": index = KadecotHomeAirConditioner.OPERATIONMODE_AUTO; break; case "Cooling": index = KadecotHomeAirConditioner.OPERATIONMODE_COOL; break; case "Heating": index = KadecotHomeAirConditioner.OPERATIONMODE_HEAT; break; case "Dehumidification": index = KadecotHomeAirConditioner.OPERATIONMODE_DRY; break; case "AirCirculator": index = KadecotHomeAirConditioner.OPERATIONMODE_WIND; break; default: MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), index); if (result != null) { String propertyName = result.getPropertyName(); String propertyValue = result.getPropertyValue(); if (propertyName != null && propertyValue != null) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_OPERATIONMODESETTING)) { String mode = getModeSetting(request); switch (propertyValue) { case "64": checkResult(response, mode, "Other"); break; case "65": checkResult(response, mode, "Automatic"); break; case "66": checkResult(response, mode, "Cooling"); break; case "67": checkResult(response, mode, "Heating"); break; case "68": checkResult(response, mode, "Dehumidification"); break; case "69": checkResult(response, mode, "AirCirculator"); break; default: KadecotService.createInvalidKadecotResponseError(response); break; } } else if (result.getServerResult().equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } } sendResponse(response); } private final DConnectApi mPutTemperatureValueApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_TEMPERATURE; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Put air conditioner temperature value. * * @param request Request. * @param response Response. */ protected void putAirConditionerTemperatureValue(final Intent request, final Intent response) { int value = getTemperature(request); if (value == -1 || value < 0 || value > 50) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } KadecotResult result = KadecotService.requestKadecotServer(getContext(), response, getServiceID(request), KadecotHomeAirConditioner.TEMPERATUREVALUE_SET, value); if (result != null) { String propertyName = result.getPropertyName(); String propertyValue = result.getPropertyValue(); if (propertyName != null && propertyValue != null) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_SETTEMPERATUREVALUE)) { if (Integer.parseInt(propertyValue) == value) { setResult(response, DConnectMessage.RESULT_OK); } else { setResult(response, DConnectMessage.RESULT_ERROR); } } else if (result.getServerResult().equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } } sendResponse(response); } private final DConnectApi mPutAirFlowValueApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_AIR_FLOW; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Put air conditioner air flow value. * * @param request Request. * @param response Response. */ protected void putAirConditionerAirFlowValue(final Intent request, final Intent response) { if (isNullAirFlow(request) && isNullAirFlowAuto(request)) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } boolean auto = getAirFlowAuto(request); int param; if (auto) { param = KadecotHomeAirConditioner.AIRFLOW_AUTO; } else { int value = (int) (getAirFlow(request) * 100); if (value >= 0 && value < 12) { param = KadecotHomeAirConditioner.AIRFLOW_LV1; } else if (value >= 12 && value < 25) { param = KadecotHomeAirConditioner.AIRFLOW_LV2; } else if (value >= 25 && value < 38) { param = KadecotHomeAirConditioner.AIRFLOW_LV3; } else if (value >= 38 && value < 51) { param = KadecotHomeAirConditioner.AIRFLOW_LV4; } else if (value >= 51 && value < 64) { param = KadecotHomeAirConditioner.AIRFLOW_LV5; } else if (value >= 64 && value < 77) { param = KadecotHomeAirConditioner.AIRFLOW_LV6; } else if (value >= 77 && value < 90) { param = KadecotHomeAirConditioner.AIRFLOW_LV7; } else if (value >= 90 && value <= 100) { param = KadecotHomeAirConditioner.AIRFLOW_LV8; } else { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } } KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), param); if (result != null) { String propertyName = result.getPropertyName(); String propertyValue = result.getPropertyValue(); if (propertyName != null && propertyValue != null) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_AIRFLOWRATESETTING)) { if (propertyName.equals(KadecotHomeAirConditioner.PROP_AIRFLOWRATESETTING)) { switch (propertyValue) { case "49": checkResult(response, param, KadecotHomeAirConditioner.AIRFLOW_LV1); break; case "50": checkResult(response, param, KadecotHomeAirConditioner.AIRFLOW_LV2); break; case "51": checkResult(response, param, KadecotHomeAirConditioner.AIRFLOW_LV3); break; case "52": checkResult(response, param, KadecotHomeAirConditioner.AIRFLOW_LV4); break; case "53": checkResult(response, param, KadecotHomeAirConditioner.AIRFLOW_LV5); break; case "54": checkResult(response, param, KadecotHomeAirConditioner.AIRFLOW_LV6); break; case "55": checkResult(response, param, KadecotHomeAirConditioner.AIRFLOW_LV7); break; case "56": checkResult(response, param, KadecotHomeAirConditioner.AIRFLOW_LV8); break; case "65": checkResult(response, param, KadecotHomeAirConditioner.AIRFLOW_AUTO); break; default: KadecotService.createInvalidKadecotResponseError(response); break; } } else { KadecotService.createInvalidKadecotResponseError(response); } } else if (result.getServerResult().equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } } sendResponse(response); } private final DConnectApi mPutECHONETLitePropertyApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ENL_PROPERTY; } @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Put air conditioner ECHONET Lite property. * * @param request Request. * @param response Response. */ protected void putAirConditionerECHONETLiteProperty(final Intent request, final Intent response) { String[] element = KadecotDeviceService.getElementFromServiceId(getServiceID(request)); if (element[IDX_PREFIX].equals(PREFIX_KADECOT) && element[IDX_DEVICEID] != null && element[IDX_PROFILENAME].equals(PROFILE_NAME)) { String epc = getEpc(request); String value = getEpcValue(request); if (epc == null || value == null) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } try { int checkInt = Integer.decode(epc); if (checkInt < 0x0 || checkInt >= 0x100) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } epc = "0x" + Integer.toHexString(checkInt); } catch (NumberFormatException e) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } Pattern p = Pattern.compile(","); String[] values = p.split(value); for (int i = 0; i < values.length; i++) { String strValue = values[i].trim(); try { int checkInt = Integer.decode(strValue); if (checkInt < 0x0 || checkInt >= 0x100) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } values[i] = "0x" + Integer.toHexString(checkInt); } catch (NumberFormatException e) { MessageUtils.setInvalidRequestParameterError(response); sendResponse(response); return; } } StringBuilder buf = new StringBuilder(); for (int i = 0; i < values.length; i++) { if (i != 0) { buf.append(","); } buf.append(values[i]); } String urlstr = "content://com.sonycsl.kadecot.json.provider/jsonp/v1/devices/" + element[IDX_DEVICEID] + "?procedure=set¶ms={\"propertyName\":\"" + epc + "\",\"propertyValue\":[" + buf.toString() + "]}"; Cursor cursor = getContext().getContentResolver().query(Uri.parse(urlstr), null, null, null, null); if (cursor != null) { cursor.moveToFirst(); String result = cursor.getString(0); String propertyName = KadecotDeviceService.getPropertyName(result); String propertyValue = KadecotDeviceService.getPropertyValue(result); if (propertyName != null && propertyValue != null) { if (result.equals(NO_RESULT)) { MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure."); } else { setResult(response, DConnectMessage.RESULT_OK); setEpc(response, propertyName); setValue(response, propertyValue); } } else { KadecotService.createInvalidKadecotResponseError(response); } cursor.close(); } else { KadecotService.createInvalidKadecotResponseError(response); } } else { KadecotService.createInvalidKadecotResponseError(response); } sendResponse(response); } private final DConnectApi mDeleteAirConditionerApi = new DeleteApi() { @Override public boolean onRequest(final Intent request, final Intent response) { new KadecotServerQueryTask().execute(request, response); return false; } }; /** * Delete air conditioner power status. * * @param request Request. * @param response Response. */ protected void deleteAirConditioner(final Intent request, final Intent response) { KadecotResult result = KadecotService.requestKadecotServer(getContext(),response, getServiceID(request), KadecotHomeAirConditioner.POWERSTATE_OFF); KadecotService.powerOff(response, result); sendResponse(response); } /** * Check result (Int). * * @param response Response intent. * @param param1 parameter 1. * @param param2 parameter 2. */ private void checkResult(final Intent response, final int param1, final int param2) { if (param1 == param2) { setResult(response, DConnectMessage.RESULT_OK); } else { setResult(response, DConnectMessage.RESULT_ERROR); } } /** * Check result (String). * * @param response Response intent. * @param param1 parameter 1. * @param param2 parameter 2. */ private void checkResult(final Intent response, final String param1, final String param2) { if (param1.equals(param2)) { setResult(response, DConnectMessage.RESULT_OK); } else { setResult(response, DConnectMessage.RESULT_ERROR); } } }