/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.binding.maxcube.internal.message; import org.apache.commons.codec.binary.Base64; import org.openhab.binding.maxcube.internal.Utils; /** * Command to be send via the MAX!Cube protocol. * * @author Andreas Heil (info@aheil.de) * @author Marcel Verpaalen * @since 1.4.0 */ public class S_Command { private String baseString = "000440000000"; private boolean[] bits = null; private String rfAddress = null; private int roomId = -1; /** * Creates a new instance of the MAX! protocol S command. * * @param rfAddress * the RF address the command is for * @param roomId * the room ID the RF address is mapped to * @param setpointTemperature * the desired setpoint temperature for the device. */ public S_Command(String rfAddress, int roomId, ThermostatModeType mode, double setpointTemperature) { this.rfAddress = rfAddress; this.roomId = roomId; // Temperature setpoint, Temp uses 6 bits (bit 0:5), // 20 deg C = bits 101000 = dec 40/2 = 20 deg C, // you need 8 bits to send so add the 2 bits below (sample 10101000 = hex A8) // bit 0,1 = 00 = Auto weekprog (no temp is needed) int setpointValue = (int) (setpointTemperature * 2); bits = Utils.getBits(setpointValue); // default to perm setting // AB => bit mapping // 01 = Permanent // 10 = Temporarily if (mode.equals(ThermostatModeType.MANUAL)) { bits[7] = false; // A (MSB) bits[6] = true; // B } else if (mode.equals(ThermostatModeType.BOOST)) { bits[7] = true; // A (MSB) bits[6] = true; // B } else { bits[7] = false; // A (MSB) bits[6] = false; // B } } /** * Creates a new instance of the MAX! protocol S command. * * @param rfAddress * the RF address the command is for * @param roomId * the room ID the RF address is mapped to * @param mode * the desired mode for the device. */ public S_Command(String rfAddress, int roomId, ThermostatModeType mode) { this.rfAddress = rfAddress; this.roomId = roomId; // default to perm setting // AB => bit mapping // 01 = Permanent // 10 = Temporarily switch (mode) { case VACATION: case MANUAL: // not implemented break; case AUTOMATIC: bits = Utils.getBits(0); break; case BOOST: bits = Utils.getBits(255); break; default: // no further modes supported } } /** * Returns the Base64 encoded command string to be sent via the MAX! * protocol. * * @return the string representing the command */ public String getCommandString() { String commandString = baseString + rfAddress + Utils.toHex(roomId) + Utils.toHex(bits); String encodedString = Base64.encodeBase64String(Utils.hexStringToByteArray(commandString)); return "s:" + encodedString; } }