/** * 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.ebus.internal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.xml.bind.DatatypeConverter; import org.apache.commons.lang.StringUtils; import org.openhab.binding.ebus.EBusBindingProvider; import org.openhab.binding.ebus.internal.utils.EBusUtils; import org.openhab.core.binding.BindingConfig; import org.openhab.core.items.Item; import org.openhab.model.item.binding.AbstractGenericBindingProvider; import org.openhab.model.item.binding.BindingConfigParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class can parse information from the binding format and provides eBus * binding informations. * * @author Christian Sowada * @since 1.7.0 */ public class EBusGenericBindingProvider extends AbstractGenericBindingProvider implements EBusBindingProvider { private static final Logger logger = LoggerFactory.getLogger(EBusGenericBindingProvider.class); /* * (non-Javadoc) * * @see org.openhab.model.item.binding.BindingConfigReader#getBindingType() */ @Override public String getBindingType() { return "ebus"; } /* * (non-Javadoc) * * @see org.openhab.binding.ebus.EBusBindingProvider#getItemName(java.lang.String) */ @Override public List<String> getItemNames(String uniqueId) { ArrayList<String> list = new ArrayList<String>(); // Search for id for (Entry<String, BindingConfig> entry : bindingConfigs.entrySet()) { EBusBindingConfig cfg = (EBusBindingConfig) entry.getValue(); String clazz = (String) cfg.map.get("class"); String id = (String) cfg.map.get("id"); if (clazz != null) { // logger.warn("Use of property class \"{}\" for id \"{}\" is deprecated!", clazz, id); } id = clazz == null ? id : clazz + "." + id; if (StringUtils.equals(id, uniqueId)) { list.add(entry.getKey()); } } return list; } /* * (non-Javadoc) * * @see org.openhab.model.item.binding.AbstractGenericBindingProvider#processBindingConfiguration(java.lang.String, * org.openhab.core.items.Item, java.lang.String) */ @Override public void processBindingConfiguration(String context, Item item, String bindingConfig) throws BindingConfigParseException { super.processBindingConfiguration(context, item, bindingConfig); logger.debug("Process binding cfg for {} with settings {} [Context:{}]", item.getName(), bindingConfig, context); EBusBindingConfig config = new EBusBindingConfig(); for (String set : bindingConfig.trim().split(",")) { String[] configParts = set.split(":"); if (configParts.length > 2) { throw new BindingConfigParseException( "eBus binding configuration must not contain more than two parts"); } configParts[0] = configParts[0].trim().toLowerCase(); configParts[1] = configParts[1].trim(); if (configParts[0].equals("data")) { config.map.put(configParts[0], EBusUtils.toByteArray(configParts[1])); } else if (configParts[0].equals("src")) { config.map.put(configParts[0], DatatypeConverter.parseHexBinary(configParts[1])[0]); } else if (configParts[0].equals("dst")) { config.map.put(configParts[0], DatatypeConverter.parseHexBinary(configParts[1])[0]); } else if (configParts[0].equals("refresh")) { config.map.put(configParts[0], Integer.parseInt(configParts[1])); } else if (configParts[0].startsWith("data-")) { if (!config.map.containsKey("data-map")) { config.map.put("data-map", new HashMap<String, byte[]>()); } @SuppressWarnings("unchecked") HashMap<String, byte[]> m = (HashMap<String, byte[]>) config.map.get("data-map"); String key = configParts[0].substring(5); m.put(key, EBusUtils.toByteArray(configParts[1])); } else { config.map.put(configParts[0], configParts[1]); } } addBindingConfig(item, config); } /* * (non-Javadoc) * * @see org.openhab.model.item.binding.BindingConfigReader#validateItemType(org.openhab.core.items.Item, * java.lang.String) */ @Override public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException { // noop } /** * This is an internal data structure to store information from the binding * config strings. Simple map used. */ class EBusBindingConfig implements BindingConfig { public HashMap<String, Object> map = new HashMap<String, Object>(); } /** * Simple get a value from binding configuration or use default value. * * @param itemName The openhab item name * @param type The eBus item type * @param defaultValue The default value if not set * @return The value or default if set */ @SuppressWarnings("unchecked") protected <T> T get(String itemName, String type, T defaultValue) { EBusBindingConfig bindingConfig = (EBusBindingConfig) bindingConfigs.get(itemName); if (bindingConfig != null) { if (bindingConfig.map.containsKey(type)) { return (T) bindingConfig.map.get(type); } } return defaultValue; } /* * (non-Javadoc) * * @see org.openhab.binding.ebus.EBusBindingProvider#getCommandData(java.lang.String) */ @Override public byte[] getTelegramData(String itemName) { return get(itemName, "data", null); } /* * (non-Javadoc) * * @see org.openhab.binding.ebus.EBusBindingProvider#getRefreshRate(java.lang.String) */ @Override public int getRefreshRate(String itemName) { return get(itemName, "refresh", 0); } /* * (non-Javadoc) * * @see org.openhab.binding.ebus.EBusBindingProvider#getCommandData(java.lang.String, java.lang.String) */ @Override public byte[] getTelegramData(String itemName, String type) { Map<String, Object> m = get(itemName, "data-map", null); if (m != null && m.containsKey(type)) { return (byte[]) m.get(type); } return null; } /* * (non-Javadoc) * * @see org.openhab.binding.ebus.EBusBindingProvider#getCommand(java.lang.String) */ @Override public String getId(String itemName) { return get(itemName, "id", null); } /* * (non-Javadoc) * * @see org.openhab.binding.ebus.EBusBindingProvider#getCommand(java.lang.String) */ @Override public String getCommand(String itemName) { return get(itemName, "cmd", null); } /* * (non-Javadoc) * * @see org.openhab.binding.ebus.EBusBindingProvider#getCommand(java.lang.String) */ @Override public String getSet(String itemName) { return get(itemName, "set", null); } /* * (non-Javadoc) * * @see org.openhab.binding.ebus.EBusBindingProvider#getTelegramSource(java.lang.String) */ @Override public Byte getTelegramSource(String itemName) { return get(itemName, "src", null); } /* * (non-Javadoc) * * @see org.openhab.binding.ebus.EBusBindingProvider#getTelegramDestination(java.lang.String) */ @Override public Byte getTelegramDestination(String itemName) { return get(itemName, "dst", null); } }