/** * 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.powermax.internal.message; import java.util.HashMap; import org.openhab.binding.powermax.internal.state.PowerMaxState; /** * A class for PANEL message handling * * @author Laurent Garnier * @since 1.9.0 */ public class PowerMaxPanelMessage extends PowerMaxBaseMessage { /** * Constructor * * @param message * the received message as a buffer of bytes */ public PowerMaxPanelMessage(byte[] message) { super(message); } /** * {@inheritDoc} */ @Override public PowerMaxState handleMessage() { super.handleMessage(); PowerMaxState updatedState = new PowerMaxState(); byte[] message = getRawData(); int msgCnt = message[2] & 0x000000FF; for (int i = 1; i <= msgCnt; i++) { byte eventZone = message[2 + 2 * i]; byte logEvent = message[3 + 2 * i]; int eventType = logEvent & 0x0000007F; String logEventStr = (eventType < PowerMaxEventLogMessage.logEventTable.length) ? PowerMaxEventLogMessage.logEventTable[eventType] : "UNKNOWN"; String logUserStr = ((eventZone & 0x000000FF) < PowerMaxEventLogMessage.logUserTable.length) ? PowerMaxEventLogMessage.logUserTable[eventZone & 0x000000FF] : "UNKNOWN"; updatedState.setPanelStatus(logEventStr + " (" + logUserStr + ")"); HashMap<Integer, String> alarmTypes = new HashMap<Integer, String>(); alarmTypes.put(0x01, "Intruder"); alarmTypes.put(0x02, "Intruder"); alarmTypes.put(0x03, "Intruder"); alarmTypes.put(0x04, "Intruder"); alarmTypes.put(0x05, "Intruder"); alarmTypes.put(0x06, "Tamper"); alarmTypes.put(0x07, "Tamper"); alarmTypes.put(0x08, "Tamper"); alarmTypes.put(0x09, "Tamper"); alarmTypes.put(0x0B, "Panic"); alarmTypes.put(0x0C, "Panic"); alarmTypes.put(0x20, "Fire"); alarmTypes.put(0x23, "Emergency"); alarmTypes.put(0x49, "Gas"); alarmTypes.put(0x4D, "Flood"); String alarmStatus = alarmTypes.get(eventType); if (alarmStatus == null) { alarmStatus = "None"; } updatedState.setAlarmType(alarmStatus); HashMap<Integer, String> troubleTypes = new HashMap<Integer, String>(); troubleTypes.put(0x0A, "Communication"); troubleTypes.put(0x0F, "General"); troubleTypes.put(0x29, "Battery"); troubleTypes.put(0x2B, "Power"); troubleTypes.put(0x2D, "Battery"); troubleTypes.put(0x2F, "Jamming"); troubleTypes.put(0x31, "Communication"); troubleTypes.put(0x33, "Telephone"); troubleTypes.put(0x36, "Power"); troubleTypes.put(0x38, "Battery"); troubleTypes.put(0x3B, "Battery"); troubleTypes.put(0x3C, "Battery"); troubleTypes.put(0x40, "Battery"); troubleTypes.put(0x43, "Battery"); String troubleStatus = troubleTypes.get(eventType); if (troubleStatus == null) { troubleStatus = "None"; } updatedState.setTroubleType(troubleStatus); if (eventType == 0x60) { // System reset updatedState.setDownloadSetupRequired(true); } } return updatedState; } @Override public String toString() { String str = super.toString(); byte[] message = getRawData(); int msgCnt = message[2] & 0x000000FF; str += "\n - event count = " + msgCnt; for (int i = 1; i <= msgCnt; i++) { byte eventZone = message[2 + 2 * i]; byte logEvent = message[3 + 2 * i]; str += "\n - event " + i + " zone code = " + String.format("%08X", eventZone); str += "\n - event " + i + " event code = " + String.format("%08X", logEvent); } return str; } }