/**
* 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.heatmiser.internal;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.openhab.binding.heatmiser.HeatmiserBindingProvider;
import org.openhab.binding.heatmiser.internal.thermostat.HeatmiserThermostat;
import org.openhab.binding.heatmiser.internal.thermostat.HeatmiserThermostat.Functions;
import org.openhab.core.binding.BindingConfig;
import org.openhab.core.items.Item;
import org.openhab.core.library.items.DateTimeItem;
import org.openhab.core.library.items.NumberItem;
import org.openhab.core.library.items.StringItem;
import org.openhab.core.library.items.SwitchItem;
import org.openhab.model.item.binding.AbstractGenericBindingProvider;
import org.openhab.model.item.binding.BindingConfigParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class is responsible for parsing the binding configuration.
*
* @author Chris Jackson
* @since 1.4.0
*/
public class HeatmiserGenericBindingProvider extends AbstractGenericBindingProvider
implements HeatmiserBindingProvider {
/** {@link Pattern} which matches an In-Binding */
private static final Pattern BINDING_PATTERN = Pattern.compile("([0-9]+):([A-Z]+)");
static final Logger logger = LoggerFactory.getLogger(HeatmiserGenericBindingProvider.class);
/**
* {@inheritDoc}
*/
@Override
public String getBindingType() {
return "heatmiser";
}
/**
* @{inheritDoc}
*/
@Override
public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException {
}
/**
* {@inheritDoc}
*/
@Override
public void processBindingConfiguration(String context, Item item, String bindingConfig)
throws BindingConfigParseException {
super.processBindingConfiguration(context, item, bindingConfig);
if (bindingConfig != null) {
HeatmiserBindingConfig config = new HeatmiserBindingConfig();
config.itemType = item.getClass();
Matcher bindingMatcher = BINDING_PATTERN.matcher(bindingConfig);
if (!bindingMatcher.matches()) {
throw new BindingConfigParseException(getBindingType()
+ " binding configuration must consist of two parts [config=" + bindingMatcher + "]");
} else {
config.address = Integer.parseInt(bindingMatcher.group(1));
config.function = Functions.valueOf(bindingMatcher.group(2));
// Check the type for different functions
switch (config.function) {
case SETTEMP:
case FROSTTEMP:
case ROOMTEMP:
case FLOORTEMP:
if (config.itemType != NumberItem.class && config.itemType != StringItem.class) {
logger.error("Only Number and String allowed for Heatmiser:{} function", config.function);
config = null;
}
break;
case HOLDTIME:
case HOLIDAYTIME:
if (config.itemType != SwitchItem.class && config.itemType != DateTimeItem.class) {
logger.error("Only Switch and DateTime allowed for Heatmiser:{} function", config.function);
config = null;
}
break;
case HOLIDAYSET:
if (config.itemType != SwitchItem.class && config.itemType != NumberItem.class) {
logger.error("Only Switch and Number allowed for Heatmiser:{} function", config.function);
config = null;
}
break;
case HOLDMODE:
case HOLIDAYMODE:
if (config.itemType != SwitchItem.class) {
logger.error("Only Switch allowed for Heatmiser:{} function", config.function);
config = null;
}
break;
case WATERSTATE:
case HEATSTATE:
case STATE:
case ONOFF:
if (config.itemType != SwitchItem.class && config.itemType != StringItem.class) {
logger.error("Only Switch and String allowed for Heatmiser:{} function", config.function);
config = null;
}
break;
default:
config = null;
logger.error("Unknown or unsupported Heatmiser function: {}", bindingConfig);
break;
}
}
if (config != null) {
addBindingConfig(item, config);
}
} else {
logger.warn("bindingConfig is NULL (item=" + item + ") -> processing bindingConfig aborted!");
}
}
/**
* @{inheritDoc
*/
@Override
public List<String> getBindingItemsAtAddress(int address) {
List<String> bindings = new ArrayList<String>();
for (String itemName : bindingConfigs.keySet()) {
HeatmiserBindingConfig itemConfig = (HeatmiserBindingConfig) bindingConfigs.get(itemName);
if (itemConfig.hasAddress(address)) {
bindings.add(itemName);
}
}
return bindings;
}
@Override
public Functions getFunction(String itemName) {
HeatmiserBindingConfig config = (HeatmiserBindingConfig) bindingConfigs.get(itemName);
return config != null ? config.function : null;
}
@Override
public int getAddress(String itemName) {
HeatmiserBindingConfig config = (HeatmiserBindingConfig) bindingConfigs.get(itemName);
return config != null ? config.address : -1;
}
@Override
public Class<? extends Item> getItemType(String itemName) {
HeatmiserBindingConfig config = (HeatmiserBindingConfig) bindingConfigs.get(itemName);
return config != null ? config.itemType : null;
}
class HeatmiserBindingConfig implements BindingConfig {
Class<? extends Item> itemType;
int address;
HeatmiserThermostat.Functions function;
boolean hasAddress(int addr) {
if (address == addr) {
return true;
}
return false;
}
}
}