/**
* Copyright (c) 2010-2017 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.dscalarm1.internal.model;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.openhab.binding.dscalarm1.DSCAlarmBindingConfig;
import org.openhab.binding.dscalarm1.internal.DSCAlarmEvent;
import org.openhab.binding.dscalarm1.internal.protocol.APIMessage;
import org.openhab.core.events.EventPublisher;
import org.openhab.core.items.Item;
import org.openhab.core.library.types.DateTimeType;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.library.types.StringType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A Panel represents the basic DSC Alarm System
*
* @author Russell Stephens
* @since 1.6.0
*/
public class Panel extends DSCAlarmDevice {
private static final Logger logger = LoggerFactory.getLogger(Panel.class);
private int panelID;
private Date panelTime = new Date(0);
/**
* Constructor
*
* @param panelId
*/
public Panel(int panelID) {
this.panelID = panelID;
}
/**
* {@inheritDoc}
*/
@Override
public void refreshItem(Item item, DSCAlarmBindingConfig config, EventPublisher publisher, int state, String description) {
logger.debug("refreshItem(): Panel Item Name: {}", item.getName());
String str = "";
OnOffType onOffType;
if (config != null) {
if (config.getDSCAlarmItemType() != null) {
switch (config.getDSCAlarmItemType()) {
case PANEL_CONNECTION:
publisher.postUpdate(item.getName(), new DecimalType(state));
break;
case PANEL_MESSAGE:
publisher.postUpdate(item.getName(), new StringType(description));
break;
case PANEL_SYSTEM_ERROR:
str = String.format("%03d: %s", state, ((state == 0) ? "No Error" : description));
publisher.postUpdate(item.getName(), new StringType(str));
break;
case PANEL_TIME:
str = getFormattedPanelTime(description);
publisher.postUpdate(item.getName(), new DateTimeType(str));
break;
case PANEL_TIME_STAMP:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_TIME_BROADCAST:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_COMMAND:
publisher.postUpdate(item.getName(), new DecimalType(state));
break;
case PANEL_TROUBLE_MESSAGE:
publisher.postUpdate(item.getName(), new StringType(description));
break;
case PANEL_TROUBLE_LED:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_SERVICE_REQUIRED:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_AC_TROUBLE:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_TELEPHONE_TROUBLE:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_FTC_TROUBLE:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_ZONE_FAULT:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_ZONE_TAMPER:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_ZONE_LOW_BATTERY:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_TIME_LOSS:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_FIRE_KEY_ALARM:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_PANIC_KEY_ALARM:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_AUX_KEY_ALARM:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
case PANEL_AUX_INPUT_ALARM:
onOffType = (state == 1) ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
break;
default:
logger.debug("refreshItem(): Panel item not updated.");
break;
}
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void handleEvent(Item item, DSCAlarmBindingConfig config, EventPublisher publisher, DSCAlarmEvent event) {
APIMessage apiMessage = null;
int apiCode = -1;
boolean boolState;
int state = 0;
OnOffType onOffType;
if (event != null) {
apiMessage = event.getAPIMessage();
apiCode = Integer.parseInt(apiMessage.getAPICode());
String str = "";
logger.debug("handleEvent(): Panel Item Name: {}", item.getName());
if (config != null) {
if (config.getDSCAlarmItemType() != null) {
switch (config.getDSCAlarmItemType()) {
case PANEL_CONNECTION:
publisher.postUpdate(item.getName(), new DecimalType(state));
break;
case PANEL_MESSAGE:
if (apiMessage != null) {
str = apiMessage.getAPIDescription();
}
publisher.postUpdate(item.getName(), new StringType(str));
break;
case PANEL_SYSTEM_ERROR:
int systemErrorCode = 0;
if (apiMessage != null) {
systemErrorCode = Integer.parseInt(apiMessage.getAPIData());
str = String.format("%03d: %s", systemErrorCode, apiMessage.getError());
publisher.postUpdate(item.getName(), new StringType(str));
}
break;
case PANEL_TROUBLE_MESSAGE:
if (apiMessage != null) {
str = apiMessage.getAPIDescription();
}
publisher.postUpdate(item.getName(), new StringType(str));
break;
case PANEL_TROUBLE_LED:
if (apiMessage != null) {
boolState = (apiCode == 840) ? true : false;
onOffType = boolState ? OnOffType.ON : OnOffType.OFF;
publisher.postUpdate(item.getName(), onOffType);
}
break;
case PANEL_TIME:
if (apiMessage != null) {
str = getFormattedPanelTime(apiMessage.getAPIData());
publisher.postUpdate(item.getName(), new DateTimeType(str));
}
break;
default:
logger.debug("handleEvent(): Panel item not updated.");
break;
}
}
}
}
}
public String getFormattedPanelTime(String time) {
SimpleDateFormat receivedSDF = new SimpleDateFormat("HHmmMMddyy");
Date date = null;
if (!time.isEmpty()) {
try {
date = receivedSDF.parse(time);
} catch (ParseException e) {
logger.error("setTimeDate(): Parse Exception occured while trying parse date string - {}. ", e);
}
this.panelTime = date;
}
SimpleDateFormat returnSDF = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
return returnSDF.format(this.panelTime);
}
}