/** * 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.modbus.internal; import org.openhab.binding.modbus.ModbusBindingProvider; import org.openhab.core.items.Item; import org.openhab.core.library.items.ContactItem; import org.openhab.core.library.items.NumberItem; 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; /** * ModbusBindingProvider provides binding for Openhab Items * There are two ways to bind an item to modbus coils/registers * * 1) single coil/register per item * Switch MySwitch "My Modbus Switch" (ALL) {modbus="slave1:5"} * * This binds MySwitch to modbus slave defined as "slave1" in openhab.config reading/writing to the coil 5 * * 2) separate coils/registers for reading and writing * Switch MySwitch "My Modbus Switch" (ALL) {modbus="slave1:<6:>7"} * * In this case coil 6 is used as status coil (readonly) and commands are put to coil 7 by setting coil 7 to true. * You hardware should then set coil 7 back to false to allow further commands processing. * * @author Dmitry Krasnov * @since 1.1.0 */ public class ModbusGenericBindingProvider extends AbstractGenericBindingProvider implements ModbusBindingProvider { static final Logger logger = LoggerFactory.getLogger(ModbusGenericBindingProvider.class); static final String BINDING_TYPE = "modbus"; /** * {@inheritDoc} */ /* * (non-Javadoc) * * @see org.openhab.model.item.binding.BindingConfigReader#getBindingType() */ @Override public String getBindingType() { return BINDING_TYPE; } /** * @{inheritDoc} */ @Override public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException { if (item.getClass() == SwitchItem.class) { return; } else if (item.getClass() == ContactItem.class) { return; } else if (item.getClass() == NumberItem.class) { return; } else { logger.debug( "Item '{}' is of type '{}'. Please make sure that transformation is " + "in place to convert the polled data to a format understood " + "by the item. Furthermore, make sure that commands are converted to " + "DecimalType or any command accepted by Switch, Contact or Number items.", item.getName(), item.getClass().getSimpleName()); } } /** * {@inheritDoc} */ @Override public void processBindingConfiguration(String context, Item item, String bindingConfig) throws BindingConfigParseException { super.processBindingConfiguration(context, item, bindingConfig); if (bindingConfig != null) { ModbusBindingConfig config = parseBindingConfig(item, bindingConfig); addBindingConfig(item, config); } else { logger.warn("bindingConfig is NULL (item={}) -> processing bindingConfig aborted!", item); } } /** * Checks if the bindingConfig contains a valid binding type and returns an appropriate instance. * * @param item * @param bindingConfig * * @throws BindingConfigParseException if bindingConfig is no valid binding type */ protected ModbusBindingConfig parseBindingConfig(Item item, String bindingConfig) throws BindingConfigParseException { return new ModbusBindingConfig(item, bindingConfig); } /* * (non-Javadoc) * * @see org.openhab.binding.modbus.tcp.master.ModbusBindingProvider#getConfig(java.lang.String) */ @Override public ModbusBindingConfig getConfig(String name) { return (ModbusBindingConfig) bindingConfigs.get(name); } @Override public void removeConfigurations(String context) { super.removeConfigurations(context); } }