/**
* 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.digitalstrom.internal.config;
import org.openhab.binding.digitalstrom.internal.client.entity.DSID;
import org.openhab.core.binding.BindingConfig;
import org.openhab.core.items.Item;
import org.openhab.core.library.items.NumberItem;
import org.openhab.core.library.items.StringItem;
import org.openhab.model.item.binding.BindingConfigParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Alexander Betker
* @author Alex Maier
* @since 1.3.0
*/
public class DigitalSTROMBindingConfig implements BindingConfig {
private static final Logger logger = LoggerFactory.getLogger(DigitalSTROMBindingConfig.class);
public String itemName = null;
public Item item = null;
public DSID dsid = null;
public DSID dsmid = null;
public ConsumptionConfig consumption = ConsumptionConfig.ACTIVE_POWER;
public SensorConfig sensor = null;
public int timeinterval = 0;
public ContextConfig context = null;
public short groupID = -1;
public int zoneID = -1;
public DigitalSTROMBindingConfig() {
super();
}
public void init(Item item, String bindingConfig) throws BindingConfigParseException {
this.itemName = item.getName();
this.item = item;
String[] elements = bindingConfig.trim().split("#"); // separator symbol
for (int i = 0; i < elements.length; i++) {
String[] pairs = elements[i].trim().split(":"); // symbol to separate a key from a value
if (pairs.length == 2) { // to ensure to get pairs
DigitalSTROMBindingConfigEnum configKey = null;
String keyStr = pairs[0].trim();
String valueStr = pairs[1].trim();
configKey = parseKey(keyStr);
if (configKey == null) {
throw new BindingConfigParseException(
"ERROR in item: " + item.getName() + " configuration: key is NULL");
}
if (valueStr.equals("")) {
throw new BindingConfigParseException(
"ERROR in item: " + item.getName() + " configuration: value is NULL");
} else {
parseValue(configKey, valueStr);
}
} else {
throw new BindingConfigParseException("ERROR in item: " + item.getName()
+ " configuration: you have used the symbol ':' more than one time ");
}
}
}
private DigitalSTROMBindingConfigEnum parseKey(String keyStr) throws BindingConfigParseException {
DigitalSTROMBindingConfigEnum configKey = null;
try {
configKey = DigitalSTROMBindingConfigEnum.valueOf(keyStr);
} catch (Exception e) {
logger.error("UNKNOWN key in item configuration: " + keyStr);
throw new BindingConfigParseException(
"ERROR in item: " + item.getName() + " UNKNOWN configuration: " + keyStr);
}
return configKey;
}
private void parseValue(DigitalSTROMBindingConfigEnum configKey, String valueStr) {
switch (configKey) {
case dsid:
this.dsid = new DSID(valueStr);
break;
case consumption:
try {
this.consumption = ConsumptionConfig.valueOf(valueStr);
} catch (Exception e) {
logger.error("WRONG consumption type: " + valueStr + "; " + e.getLocalizedMessage());
}
if (consumption == null) {
this.consumption = ConsumptionConfig.ACTIVE_POWER;
}
break;
case sensor:
try {
this.sensor = SensorConfig.valueOf(valueStr);
} catch (Exception e) {
logger.error("WRONG sensor type: " + valueStr + "; " + e.getLocalizedMessage());
}
break;
case timeinterval:
int interval = -1;
try {
interval = Integer.parseInt(valueStr);
} catch (java.lang.NumberFormatException e) {
logger.error("Numberformat exception by parsing a string to int in timeinterval: " + valueStr);
}
if (interval != -1) {
this.timeinterval = interval;
}
break;
case dsmid:
this.dsmid = new DSID(valueStr);
break;
case context:
if (valueStr.toLowerCase().equals(ContextConfig.slat.name())) {
this.context = ContextConfig.slat;
} else if (valueStr.toLowerCase().equals(ContextConfig.apartment.name())) {
this.context = ContextConfig.apartment;
} else if (valueStr.toLowerCase().equals(ContextConfig.zone.name())) {
this.context = ContextConfig.zone;
} else if (valueStr.toLowerCase().equals(ContextConfig.awning.name())) {
this.context = ContextConfig.awning;
}
break;
case groupid:
try {
this.groupID = Short.parseShort(valueStr);
} catch (java.lang.NumberFormatException e) {
logger.error("Numberformat exception by parsing a string to short: " + valueStr + "; "
+ e.getLocalizedMessage());
}
break;
case zoneid:
try {
this.zoneID = Integer.parseInt(valueStr);
} catch (java.lang.NumberFormatException e) {
logger.error("Numberformat exception by parsing a string to integer: " + valueStr + "; "
+ e.getLocalizedMessage());
}
break;
default:
}
}
public boolean isValid() {
if (dsid == null && dsmid == null) {
if (!isValidSceneItem()) {
return false;
}
} else if (dsmid != null) {
if (!isValidMeterItem()) {
return false;
}
}
return true;
}
public boolean isValidMeterItem() {
if (this.dsmid != null) {
return (item instanceof NumberItem || item instanceof StringItem);
}
return false;
}
public boolean isValidSceneItem() {
if (item instanceof NumberItem || item instanceof StringItem) {
if (context == null) {
return false;
} else {
if (context.equals(ContextConfig.apartment) || context.equals(ContextConfig.zone)) {
return true;
}
}
}
return false;
}
public boolean isValidDeviceMeterItem() {
if (this.dsid != null) {
return (item instanceof NumberItem || item instanceof StringItem);
}
return false;
}
}