/** * 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.samsungac.internal; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.openhab.binding.samsungac.SamsungAcBindingProvider; 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.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. A valid * items binding configuration file will look like the following: * Replace <AC_NAME> with the name of the configured air conditioner, e.g. Livingroom * * <pre> * Number ac_current_temp "Current temp [%.1f]" {samsungac="[<AC_NAME>|AC_FUN_TEMPNOW]"} * Switch ac_power {samsungac="[<AC_NAME>|AC_FUN_POWER]"} * Number ac_mode "Convenience mode" {samsungac="[<AC_NAME>|AC_FUN_COMODE]"} * Number ac_op_mode "Operation mode" {samsungac="[<AC_NAME>|AC_FUN_OPMODE]"} * Number ac_set_temp "Set temp [%.1f]" {samsungac="[<AC_NAME>|AC_FUN_TEMPSET]"} * Number ac_direction "Direction" {samsungac="[<AC_NAME>|AC_FUN_DIRECTION]"} * Number ac_windlevel "Windlevel" {samsungac="[<AC_NAME>|AC_FUN_WINDLEVEL]"} * String ac_error "Error" {samsungac="[<AC_NAME>|AC_FUN_ERROR]"} * </pre> * * @author Stein Tore Tøsse * @since 1.6.0 */ public class SamsungAcGenericBindingProvider extends AbstractGenericBindingProvider implements SamsungAcBindingProvider { static final Logger logger = LoggerFactory.getLogger(SamsungAcGenericBindingProvider.class); private static final Pattern CONFIG_PATTERN = Pattern.compile("\\[(.*)\\|(.*)\\]"); /** * {@inheritDoc} */ public String getBindingType() { return "samsungac"; } /** * @{inheritDoc */ public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException { if (!(item instanceof SwitchItem) && !(item instanceof NumberItem) && !(item instanceof StringItem)) { throw new BindingConfigParseException("item '" + item.getName() + "' is of type '" + item.getClass().getSimpleName() + "', but only Number, Strings and Switchs items are allowed."); } } /** * {@inheritDoc} */ @Override public void processBindingConfiguration(String context, Item item, String bindingConfig) throws BindingConfigParseException { super.processBindingConfiguration(context, item, bindingConfig); SamsungAcBindingConfig config = parseBindingConfig(item, bindingConfig); addBindingConfig(item, config); } private SamsungAcBindingConfig parseBindingConfig(Item item, String bindingConfig) throws BindingConfigParseException { Matcher matcher = CONFIG_PATTERN.matcher(bindingConfig); if (!matcher.matches()) { throw new BindingConfigParseException("Config for item '" + item.getName() + "' could not be parsed."); } String acInstance = matcher.group(1); CommandEnum property = CommandEnum.valueOf(matcher.group(2)); return new SamsungAcBindingConfig(acInstance, item.getName(), property); } public BindingConfig getItem(String acName, CommandEnum property) { for (BindingConfig config : bindingConfigs.values()) { SamsungAcBindingConfig con = (SamsungAcBindingConfig) config; if (property.equals(con.getProperty()) && con.acInstance.equals(acName)) { return con; } } return null; } public String getItemName(String acName, CommandEnum property) { SamsungAcBindingConfig con = (SamsungAcBindingConfig) getItem(acName, property); if (con != null && property.equals(con.getProperty())) { return con.getItemName(); } return null; } class SamsungAcBindingConfig implements BindingConfig { private String acInstance; private String itemName; private CommandEnum property; public SamsungAcBindingConfig(String acInstance, CommandEnum property) { this.acInstance = acInstance; this.property = property; } public SamsungAcBindingConfig(String acInstance, String itemName, CommandEnum property) { this.acInstance = acInstance; this.property = property; this.itemName = itemName; } public String getSamsungAcInstance() { return acInstance; } public CommandEnum getProperty() { return property; } public String getItemName() { return itemName; } @Override public String toString() { return " acInstance:" + acInstance + " itemName:" + itemName + " property:" + property; } } public String getAirConditionerInstance(String itemname) { SamsungAcBindingConfig bindingConfig = (SamsungAcBindingConfig) bindingConfigs.get(itemname); return bindingConfig.getSamsungAcInstance(); } public CommandEnum getProperty(String itemname) { SamsungAcBindingConfig bindingConfig = (SamsungAcBindingConfig) bindingConfigs.get(itemname); return bindingConfig.getProperty(); } }