org.openremote.controller.protocol.isy99.Isy99Command.java Source code

Java tutorial

Introduction

Here is the source code for org.openremote.controller.protocol.isy99.Isy99Command.java

Source

/*
 * OpenRemote, the Home of the Digital Home.
 * Copyright 2008-2013, OpenRemote Inc.
 *
 * See the contributors.txt file in the distribution for a
 * full listing of individual contributors.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package org.openremote.controller.protocol.isy99;

import java.io.IOException;
import java.util.Map;

import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.openremote.controller.command.StatusCommand;
import org.openremote.controller.command.ExecutableCommand;
import org.openremote.controller.component.EnumSensorType;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.openremote.controller.utils.Logger;

/**
 * OpenRemote protocol implementation for the Universal Devices ISY-99 HTTP-to-Insteon Bridge
 *
 * See http://www.universal-devices.com/mwiki/index.php?title=ISY-99i_Series_INSTEON:REST_Interface
 * for documentation of the REST API for the ISY-99.
 *
 * @author <a href="mailto:andrew.puch.1@gmail.com">Andrew Puch</a>
 * @author <a href="mailto:aball@osintegrators.com">Andrew D. Ball</a>
 */
public class Isy99Command implements ExecutableCommand, StatusCommand {

    // Class Members --------------------------------------------------------------------------------

    /**
     * Logging. Use common log category for all related classes.
     */
    private final static Logger log = Logger.getLogger(Isy99CommandBuilder.ISY99_LOG_CATEGORY);

    // Constants ------------------------------------------------------------------------------------

    /**
     * Name of the command for both turning on a switch (if no parameter is given)
     * and adjusting the level of a dimmer in the ISY-99 REST interface.
     */
    public final static String ISY99_ON_COMMAND = "DON";

    /**
     * Name of the command for turning off a switch in the ISY-99 REST interface.
     */
    public final static String ISY99_OFF_COMMAND = "DOF";

    /**
     * The maximum level that the ISY-99 will report for dimmers.
     */
    public final static int ISY99_MAX_DIMMER_VALUE = 255;

    // Instance Fields ------------------------------------------------------------------------------

    private String host;
    private String username;
    private String password;
    private String address;
    private String command;
    private String commandParam;
    private Isy99StatusReader StatusReader;

    // Constructors ---------------------------------------------------------------------------------

    public Isy99Command(String host, String username, String password, String address, String command,
            Isy99StatusReader StatusReader) {
        this.host = host;
        this.username = username;
        this.password = password;
        this.address = address;
        this.command = command;
        this.StatusReader = StatusReader;
    }

    public Isy99Command(String host, String username, String password, String address, String command,
            String commandParam, Isy99StatusReader StatusReader) {
        this(host, username, password, address, command, StatusReader);
        this.commandParam = commandParam;
    }

    // Implements ExecutableCommand -----------------------------------------------------------------

    private String formWriteCommandUrl() {
        StringBuilder url = new StringBuilder();
        String effectiveCommand = command;
        String effectiveCommandParam = commandParam;

        // Compensate for the somewhat odd ISY-99 dimming behavior. Using the DON command
        // with 0 as a parameter does not actually cause the device to be turned off. Using
        // the DOF command will, though.
        if (ISY99_ON_COMMAND.equals(command) && commandParam != null) {
            if (commandParam.equals("0")) {
                effectiveCommand = ISY99_OFF_COMMAND;
                effectiveCommandParam = null;
            } else {
                effectiveCommandParam = "" + ((Integer.valueOf(commandParam) * ISY99_MAX_DIMMER_VALUE) / 100);
            }
        }

        url.append("http://");
        url.append(host);
        url.append("/rest/nodes/");
        url.append(address.replaceAll(" ", "%20"));
        url.append("/cmd/");
        url.append(effectiveCommand);
        if (effectiveCommandParam != null && !effectiveCommandParam.equals("")) {
            url.append("/");
            url.append(effectiveCommandParam);
        }

        return url.toString();
    }

    @Override
    public void send() {
        String url = formWriteCommandUrl();
        log.debug("send(): URL is " + url);

        DefaultHttpClient client = new DefaultHttpClient();

        if (username != null && !username.equals("")) {
            CredentialsProvider cred = new BasicCredentialsProvider();

            cred.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));

            client.setCredentialsProvider(cred);
        }

        try {
            HttpGet req = new HttpGet(url);
            HttpResponse response = client.execute(req);

            int responseStatusCode = response.getStatusLine().getStatusCode();
            if (responseStatusCode != 200) {
                log.error("send(): response status code was " + responseStatusCode);
            } else {
                StatusReader.setLocalStatus(address, command, commandParam);
            }
        } catch (IOException e) {
            log.error("send(): IOException: address: " + address + "command: " + command, e);
        }
    }

    // Implements StatusCommand ---------------------------------------------------------------------

    @Override
    public String read(EnumSensorType sensorType, Map<String, String> stateMap) {
        String value = StatusReader.getStatus(address);

        if (value == null || value.equals("")) {
            return "";
        }

        int integerValue = -1;
        try {
            integerValue = Integer.parseInt(value);
        } catch (NumberFormatException e) {
            log.error("invalid sensor reading from ISY-99: expected an integer, got \"" + value + "\"");
            return "";
        }

        switch (sensorType) {
        case SWITCH:

            if (integerValue >= 1) {
                return "on";
            } else {
                return "off";
            }

        case LEVEL:
            return "" + ((integerValue * 100) / ISY99_MAX_DIMMER_VALUE);

        case RANGE:

            return "" + integerValue;

        default:

            return "";
        }
    }
}