Search in sources :

Example 1 with HueError

use of com.bwssystems.HABridge.api.hue.HueError in project ha-bridge by bwssytems.

the class HueMulator method changeState.

private String changeState(String userId, String lightId, String body, String ipAddress) {
    String responseString = null;
    String url = null;
    StateChangeBody theStateChanges = null;
    DeviceState state = null;
    Integer targetBri = null;
    Integer targetBriInc = null;
    MultiCommandUtil aMultiUtil = new MultiCommandUtil();
    aMultiUtil.setTheDelay(bridgeSettings.getButtonsleep());
    aMultiUtil.setDelayDefault(bridgeSettings.getButtonsleep());
    aMultiUtil.setSetCount(1);
    log.debug("hue state change requested: " + userId + " from " + ipAddress + " body: " + body);
    HueError[] theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton());
    if (theErrors != null)
        return aGsonHandler.toJson(theErrors);
    try {
        theStateChanges = aGsonHandler.fromJson(body, StateChangeBody.class);
    } catch (Exception e) {
        theStateChanges = null;
    }
    if (theStateChanges == null) {
        log.warn("Could not parse state change body. Light state not changed.");
        return aGsonHandler.toJson(HueErrorResponse.createResponse("2", "/lights/" + lightId, "Could not parse state change body.", null, null, null).getTheErrors(), HueError[].class);
    }
    DeviceDescriptor device = repository.findOne(lightId);
    if (device == null) {
        log.warn("Could not find device: " + lightId + " for hue state change request: " + userId + " from " + ipAddress + " body: " + body);
        return aGsonHandler.toJson(HueErrorResponse.createResponse("3", "/lights/" + lightId, "Could not find device.", "/lights/" + lightId, null, null).getTheErrors(), HueError[].class);
    }
    if (body.contains("\"bri_inc\"")) {
        targetBriInc = new Integer(theStateChanges.getBri_inc());
    } else if (body.contains("\"bri\"")) {
        targetBri = new Integer(theStateChanges.getBri());
    }
    state = device.getDeviceState();
    if (state == null) {
        state = DeviceState.createDeviceState();
        device.setDeviceState(state);
    }
    if (targetBri != null || targetBriInc != null) {
        url = device.getDimUrl();
        if (url == null || url.length() == 0)
            url = device.getOnUrl();
    } else {
        if (theStateChanges.isOn()) {
            url = device.getOnUrl();
        } else if (!theStateChanges.isOn()) {
            url = device.getOffUrl();
        }
    }
    // code for backwards compatibility
    if (device.getMapType() != null && device.getMapType().equalsIgnoreCase(DeviceMapTypes.HUE_DEVICE[DeviceMapTypes.typeIndex])) {
        if (url == null)
            url = device.getOnUrl();
    }
    if (url != null && !url.equals("")) {
        if (!url.startsWith("[")) {
            if (url.startsWith("{\"item"))
                url = "[" + url + "]";
            else {
                if (url.startsWith("{"))
                    url = "[{\"item\":" + url + "}]";
                else
                    url = "[{\"item\":\"" + url + "\"}]";
            }
        } else if (!url.startsWith("[{\"item\""))
            url = "[{\"item\":" + url + "}]";
        log.debug("Decode Json for url items: " + url);
        CallItem[] callItems = null;
        try {
            callItems = aGsonHandler.fromJson(url, CallItem[].class);
        } catch (JsonSyntaxException e) {
            log.warn("Could not decode Json for url items: " + lightId + " for hue state change request: " + userId + " from " + ipAddress + " body: " + body + " url items: " + url);
            return aGsonHandler.toJson(HueErrorResponse.createResponse("3", "/lights/" + lightId, "Could decode json in request", "/lights/" + lightId, null, null).getTheErrors(), HueError[].class);
        }
        for (int i = 0; callItems != null && i < callItems.length; i++) {
            if (!filterByRequester(device.getRequesterAddress(), ipAddress) || !filterByRequester(callItems[i].getFilterIPs(), ipAddress)) {
                log.warn("filter for requester address not present in: (device)" + device.getRequesterAddress() + " OR then (item)" + callItems[i].getFilterIPs() + " with request ip of: " + ipAddress);
                continue;
            }
            if (callItems[i].getCount() != null && callItems[i].getCount() > 0)
                aMultiUtil.setSetCount(callItems[i].getCount());
            else
                aMultiUtil.setSetCount(1);
            // code for backwards compatibility
            if ((callItems[i].getType() == null || callItems[i].getType().trim().isEmpty())) {
                if (validMapTypes.validateType(device.getMapType()))
                    callItems[i].setType(device.getMapType().trim());
                else if (validMapTypes.validateType(device.getDeviceType()))
                    callItems[i].setType(device.getDeviceType().trim());
                else
                    callItems[i].setType(DeviceMapTypes.CUSTOM_DEVICE[DeviceMapTypes.typeIndex]);
            }
            if (callItems[i].getType() != null) {
                for (int x = 0; x < aMultiUtil.getSetCount(); x++) {
                    if (x > 0 || i > 0) {
                        try {
                            Thread.sleep(aMultiUtil.getTheDelay());
                        } catch (InterruptedException e) {
                        // ignore
                        }
                    }
                    if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0)
                        aMultiUtil.setTheDelay(callItems[i].getDelay());
                    else
                        aMultiUtil.setTheDelay(aMultiUtil.getDelayDefault());
                    responseString = homeManager.findHome(callItems[i].getType().trim()).deviceHandler(callItems[i], aMultiUtil, lightId, state.getBri(), targetBri, targetBriInc, device, body);
                    if (responseString != null && responseString.contains("{\"error\":")) {
                        x = aMultiUtil.getSetCount();
                    }
                }
            }
        }
    } else {
        log.warn("Could not find url: " + lightId + " for hue state change request: " + userId + " from " + ipAddress + " body: " + body);
        responseString = aGsonHandler.toJson(HueErrorResponse.createResponse("3", "/lights/" + lightId, "Could not find url.", "/lights/" + lightId, null, null).getTheErrors(), HueError[].class);
    }
    if (responseString == null || !responseString.contains("[{\"error\":")) {
        if (!device.isNoState()) {
            responseString = this.formatSuccessHueResponse(theStateChanges, body, lightId, state, targetBri, targetBriInc, device.isOffState());
            device.setDeviceState(state);
        } else {
            DeviceState dummyState = DeviceState.createDeviceState();
            responseString = this.formatSuccessHueResponse(theStateChanges, body, lightId, dummyState, targetBri, targetBriInc, device.isOffState());
        }
    }
    return responseString;
}
Also used : JsonSyntaxException(com.google.gson.JsonSyntaxException) DeviceState(com.bwssystems.HABridge.api.hue.DeviceState) JsonSyntaxException(com.google.gson.JsonSyntaxException) HueError(com.bwssystems.HABridge.api.hue.HueError) StateChangeBody(com.bwssystems.HABridge.api.hue.StateChangeBody) CallItem(com.bwssystems.HABridge.api.CallItem)

Example 2 with HueError

use of com.bwssystems.HABridge.api.hue.HueError in project ha-bridge by bwssytems.

the class HueMulator method updateState.

private String updateState(String userId, String lightId, String body, String ipAddress) {
    String responseString = null;
    StateChangeBody theStateChanges = null;
    DeviceState state = null;
    Integer targetBri = null;
    Integer targetBriInc = null;
    log.debug("Update state requested: " + userId + " from " + ipAddress + " body: " + body);
    HueError[] theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton());
    if (theErrors != null)
        return aGsonHandler.toJson(theErrors);
    try {
        theStateChanges = aGsonHandler.fromJson(body, StateChangeBody.class);
    } catch (Exception e) {
        theStateChanges = null;
    }
    if (theStateChanges == null) {
        log.warn("Could not parse state change body. Light state not changed.");
        return aGsonHandler.toJson(HueErrorResponse.createResponse("2", "/lights/" + lightId, "Could not parse state change body.", null, null, null).getTheErrors(), HueError[].class);
    }
    DeviceDescriptor device = repository.findOne(lightId);
    if (device == null) {
        log.warn("Could not find device: " + lightId + " for hue state change request: " + userId + " from " + ipAddress + " body: " + body);
        return aGsonHandler.toJson(HueErrorResponse.createResponse("3", "/lights/" + lightId, "Could not find device.", "/lights/" + lightId, null, null).getTheErrors(), HueError[].class);
    }
    if (body.contains("\"bri_inc\""))
        targetBriInc = new Integer(theStateChanges.getBri_inc());
    else if (body.contains("\"bri\"")) {
        targetBri = new Integer(theStateChanges.getBri());
    }
    state = device.getDeviceState();
    if (state == null)
        state = DeviceState.createDeviceState();
    responseString = this.formatSuccessHueResponse(theStateChanges, body, lightId, state, targetBri, targetBriInc, device.isOffState());
    device.setDeviceState(state);
    return responseString;
}
Also used : DeviceState(com.bwssystems.HABridge.api.hue.DeviceState) HueError(com.bwssystems.HABridge.api.hue.HueError) StateChangeBody(com.bwssystems.HABridge.api.hue.StateChangeBody) JsonSyntaxException(com.google.gson.JsonSyntaxException)

Example 3 with HueError

use of com.bwssystems.HABridge.api.hue.HueError in project ha-bridge by bwssytems.

the class HueMulator method groupsIdHandler.

private Object groupsIdHandler(String groupId, String userId, String requestIp) {
    log.debug("hue group id: <" + groupId + "> requested: " + userId + " from " + requestIp);
    HueError[] theErrors = null;
    theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton());
    if (theErrors == null) {
        if (bridgeSettingMaster.getBridgeSecurity().isSettingsChanged())
            bridgeSettingMaster.updateConfigFile();
        if (groupId.equalsIgnoreCase("0")) {
            GroupResponse theResponse = GroupResponse.createDefaultGroupResponse(repository.findActive());
            return theResponse;
        }
        if (!groupId.equalsIgnoreCase("0")) {
            GroupResponse theResponse = GroupResponse.createOtherGroupResponse(repository.findActive());
            return theResponse;
        }
        theErrors = HueErrorResponse.createResponse("3", userId + "/groups/" + groupId, "Object not found", null, null, null).getTheErrors();
    }
    return theErrors;
}
Also used : HueError(com.bwssystems.HABridge.api.hue.HueError) GroupResponse(com.bwssystems.HABridge.api.hue.GroupResponse)

Example 4 with HueError

use of com.bwssystems.HABridge.api.hue.HueError in project ha-bridge by bwssytems.

the class DomoticzHome method deviceHandler.

@Override
public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int intensity, Integer targetBri, Integer targetBriInc, DeviceDescriptor device, String body) {
    Devices theDomoticzApiResponse = null;
    String responseString = null;
    String theUrl = anItem.getItem().getAsString();
    if (theUrl != null && !theUrl.isEmpty() && (theUrl.startsWith("http://") || theUrl.startsWith("https://"))) {
        String intermediate = theUrl.substring(theUrl.indexOf("://") + 3);
        String hostPortion = intermediate.substring(0, intermediate.indexOf('/'));
        String theUrlBody = intermediate.substring(intermediate.indexOf('/') + 1);
        String hostAddr = null;
        if (hostPortion.contains(":")) {
            hostAddr = hostPortion.substring(0, intermediate.indexOf(':'));
        } else
            hostAddr = hostPortion;
        DomoticzHandler theHandler = findHandlerByAddress(hostAddr);
        if (theHandler != null) {
            String theData;
            String anUrl = BrightnessDecode.calculateReplaceIntensityValue(theUrlBody, intensity, targetBri, targetBriInc, false);
            theData = httpClient.doHttpRequest(theHandler.buildUrl(anUrl), null, null, null, theHandler.buildHeaders());
            try {
                theDomoticzApiResponse = new Gson().fromJson(theData, Devices.class);
                if (theDomoticzApiResponse.getStatus().equals("OK"))
                    responseString = null;
                else {
                    log.warn("Call failed for Domoticz " + theHandler.getDomoticzAddress().getName() + " with status " + theDomoticzApiResponse.getStatus() + " for item " + theDomoticzApiResponse.getTitle());
                    responseString = new Gson().toJson(HueErrorResponse.createResponse("6", "/lights/" + lightId, "Error on calling url to change device state", "/lights/" + lightId + "state", null, null).getTheErrors(), HueError[].class);
                }
            } catch (Exception e) {
                log.warn("Cannot interrpret result from call for Domoticz " + theHandler.getDomoticzAddress().getName() + " as response is not parsable.");
                responseString = new Gson().toJson(HueErrorResponse.createResponse("6", "/lights/" + lightId, "Error on calling url to change device state", "/lights/" + lightId + "state", null, null).getTheErrors(), HueError[].class);
            }
        } else {
            log.warn("Domoticz Call could not complete, no address found: " + theUrl);
            responseString = new Gson().toJson(HueErrorResponse.createResponse("6", "/lights/" + lightId, "Error on calling url to change device state", "/lights/" + lightId + "state", null, null).getTheErrors(), HueError[].class);
        }
    } else {
        log.warn("Domoticz Call to be presented as http(s)://<ip_address>(:<port>)/payload, format of request unknown: " + theUrl);
        responseString = new Gson().toJson(HueErrorResponse.createResponse("6", "/lights/" + lightId, "Error on calling url to change device state", "/lights/" + lightId + "state", null, null).getTheErrors(), HueError[].class);
    }
    return responseString;
}
Also used : Gson(com.google.gson.Gson) HueError(com.bwssystems.HABridge.api.hue.HueError)

Example 5 with HueError

use of com.bwssystems.HABridge.api.hue.HueError in project ha-bridge by bwssytems.

the class HueMulator method lightsListHandler.

private Object lightsListHandler(String userId, String requestIp) {
    HueError[] theErrors = null;
    Map<String, DeviceResponse> deviceResponseMap = null;
    if (bridgeSettings.isTraceupnp())
        log.info("Traceupnp: hue lights list requested: " + userId + " from " + requestIp);
    log.debug("hue lights list requested: " + userId + " from " + requestIp);
    theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton());
    if (theErrors == null) {
        if (bridgeSettingMaster.getBridgeSecurity().isSettingsChanged())
            bridgeSettingMaster.updateConfigFile();
        List<DeviceDescriptor> deviceList = repository.findAllByRequester(requestIp);
        //			List<DeviceDescriptor> deviceList = repository.findActive();
        deviceResponseMap = new HashMap<String, DeviceResponse>();
        for (DeviceDescriptor device : deviceList) {
            DeviceResponse deviceResponse = null;
            if (!device.isInactive()) {
                if (device.containsType(DeviceMapTypes.HUE_DEVICE[DeviceMapTypes.typeIndex])) {
                    CallItem[] callItems = null;
                    try {
                        if (device.getOnUrl() != null)
                            callItems = aGsonHandler.fromJson(device.getOnUrl(), CallItem[].class);
                    } catch (JsonSyntaxException e) {
                        log.warn("Could not decode Json for url items to get Hue state for device: " + device.getName());
                        callItems = null;
                    }
                    for (int i = 0; callItems != null && i < callItems.length; i++) {
                        if ((callItems[i].getType() != null && callItems[i].getType().equals(DeviceMapTypes.HUE_DEVICE[DeviceMapTypes.typeIndex])) || (callItems[i].getItem().getAsString().contains("hueName"))) {
                            deviceResponse = myHueHome.getHueDeviceInfo(callItems[i], device);
                            i = callItems.length;
                        }
                    }
                }
                if (deviceResponse == null)
                    deviceResponse = DeviceResponse.createResponse(device);
                deviceResponseMap.put(device.getId(), deviceResponse);
            }
        }
    }
    if (theErrors != null)
        return theErrors;
    return deviceResponseMap;
}
Also used : JsonSyntaxException(com.google.gson.JsonSyntaxException) DeviceResponse(com.bwssystems.HABridge.api.hue.DeviceResponse) HueError(com.bwssystems.HABridge.api.hue.HueError) CallItem(com.bwssystems.HABridge.api.CallItem)

Aggregations

HueError (com.bwssystems.HABridge.api.hue.HueError)7 JsonSyntaxException (com.google.gson.JsonSyntaxException)4 CallItem (com.bwssystems.HABridge.api.CallItem)3 DeviceResponse (com.bwssystems.HABridge.api.hue.DeviceResponse)3 DeviceState (com.bwssystems.HABridge.api.hue.DeviceState)2 GroupResponse (com.bwssystems.HABridge.api.hue.GroupResponse)2 StateChangeBody (com.bwssystems.HABridge.api.hue.StateChangeBody)2 HueApiResponse (com.bwssystems.HABridge.api.hue.HueApiResponse)1 Gson (com.google.gson.Gson)1