/** * 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.satel.command; import java.io.UnsupportedEncodingException; import org.openhab.binding.satel.internal.protocol.SatelMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Command class for command that reads information about specific device * (partition, zone, user, etc). * * @author Krzysztof Goworek * @since 1.9.0 */ public class ReadDeviceInfoCommand extends SatelCommandBase { private static final Logger logger = LoggerFactory.getLogger(ReadDeviceInfoCommand.class); public static final byte COMMAND_CODE = (byte) 0xee; /** * Device type: partition, zone, expander, etc. * * @author Krzysztof Goworek * */ public enum DeviceType { PARTITION(0), ZONE(1), USER(2), EXPANDER(3), LCD(3), OUTPUT(4), ZONE_WITH_PARTITION(5), TIMER(6), TELEPHONE(7), OBJECT(15), PARTITION_WITH_OBJECT(16); int code; DeviceType(int code) { this.code = code; } int getCode() { return code; } } /** * Creates new command class instance to read description for given * parameters. * * @param deviceType * type of the device * @param deviceNumber * device number */ public ReadDeviceInfoCommand(DeviceType deviceType, int deviceNumber) { super(COMMAND_CODE, new byte[] { (byte) deviceType.getCode(), getDeviceNumber(deviceType, deviceNumber) }); } private static byte getDeviceNumber(DeviceType deviceType, int deviceNumber) { switch (deviceType) { case EXPANDER: if (deviceNumber < 128) { return (byte) (deviceNumber + 128); } break; case LCD: if (deviceNumber < 128) { return (byte) (deviceNumber + 192); } break; case ZONE: case ZONE_WITH_PARTITION: return (byte) (deviceNumber == 256 ? 0 : deviceNumber); default: break; } return (byte) deviceNumber; } /** * Returns device model or function depending on device type: * <ul> * <li>partition - partition type</li> * <li>zone - zone reaction</li> * <li>user - 0</li> * <li>object - 0</li> * <li>expander - expander model, CA-64 PP, CA-64 E, etc</li> * <li>LCD - LCD model, INT-KLCD, INT-KLCDR, etc</li> * <li>output - output function</li> * </ul> * * @return kind of the device */ public int getDeviceKind() { return response.getPayload()[2] & 0xff; } /** * Returns name of the device decoded using given encoding. Encoding * depends on firmware language and must be specified in the binding * configuration. * * @param encoding * encoding for the text * @return device name * @throws UnsupportedEncodingException * if provided encoding is not supported */ public String getName(String encoding) throws UnsupportedEncodingException { return new String(response.getPayload(), 3, 16, encoding).trim(); } @Override protected boolean isResponseValid(SatelMessage response) { // validate response if (response.getCommand() != COMMAND_CODE) { logger.error("Invalid response code: {}", response.getCommand()); return false; } if (response.getPayload().length < 19 || response.getPayload().length > 20) { logger.error("Invalid payload length: {}", response.getPayload().length); return false; } return true; } }