/** * 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.plcbus.internal; import java.util.Dictionary; import org.openhab.binding.plcbus.PLCBusBindingProvider; import org.openhab.binding.plcbus.internal.protocol.IPLCBusController; import org.openhab.binding.plcbus.internal.protocol.ISerialPortGateway; import org.openhab.binding.plcbus.internal.protocol.PLCBusController; import org.openhab.binding.plcbus.internal.protocol.SerialPortGateway; import org.openhab.binding.plcbus.internal.protocol.StatusResponse; import org.openhab.core.binding.AbstractBinding; import org.openhab.core.binding.BindingProvider; import org.openhab.core.library.types.IncreaseDecreaseType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.StopMoveType; import org.openhab.core.library.types.UpDownType; import org.openhab.core.types.Command; import org.openhab.core.types.State; import org.openhab.core.types.UnDefType; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedService; import org.osgi.service.component.ComponentContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Binding for PLC Bus * * @author Robin Lenz * @since 1.1.0 */ public class PLCBusBinding extends AbstractBinding<PLCBusBindingProvider>implements ManagedService { private static Logger logger = LoggerFactory.getLogger(PLCBusBinding.class); private ISerialPortGateway serialPortGateway; public void activate(ComponentContext componentContext) { } public void deactivate(ComponentContext componentContext) { for (PLCBusBindingProvider provider : providers) { provider.removeBindingChangeListener(this); } providers.clear(); if (serialPortGateway != null) { serialPortGateway.close(); } } /** * {@inheritDoc} */ @Override public void bindingChanged(BindingProvider provider, String itemName) { super.bindingChanged(provider, itemName); } /** * {@inheritDoc} */ @Override protected void internalReceiveCommand(String itemName, Command command) { PLCBusBindingConfig config = tryGetConfigFor(itemName); if (config == null) { logger.error("No config found for item %s", itemName); return; } IPLCBusController controller = PLCBusController.create(serialPortGateway); if (command == OnOffType.ON) { controller.switchOn(config.getUnit()); } else if (command == OnOffType.OFF) { controller.switchOff(config.getUnit()); } else if (command == IncreaseDecreaseType.INCREASE) { controller.bright(config.getUnit(), config.getSeconds()); } else if (command == IncreaseDecreaseType.DECREASE) { controller.dim(config.getUnit(), config.getSeconds()); } else if (command == StopMoveType.STOP) { controller.fadeStop(config.getUnit()); } else if (command == UpDownType.UP) { controller.switchOn(config.getUnit()); } else if (command == UpDownType.DOWN) { controller.switchOff(config.getUnit()); } } /** * {@inheritDoc} */ @Override protected void internalReceiveUpdate(String itemName, State newState) { PLCBusBindingConfig config = tryGetConfigFor(itemName); if (config == null) { logger.error("No config found for %s", itemName); return; } IPLCBusController controller = PLCBusController.create(serialPortGateway); if (newState == UnDefType.UNDEF) { StatusResponse response = controller.requestStatusFor(config.getUnit()); State status = (response.isUnitOn()) ? OnOffType.ON : OnOffType.OFF; this.eventPublisher.postUpdate(itemName, status); } } private PLCBusBindingConfig tryGetConfigFor(String itemName) { for (PLCBusBindingProvider provider : this.providers) { PLCBusBindingConfig config = provider.getConfigFor(itemName); if (config != null) { return config; } } return null; } protected void addBindingProvider(PLCBusBindingProvider bindingProvider) { super.addBindingProvider(bindingProvider); } protected void removeBindingProvider(PLCBusBindingProvider bindingProvider) { super.removeBindingProvider(bindingProvider); } @Override public void updated(Dictionary<String, ?> config) throws ConfigurationException { if (config == null) { return; } serialPortGateway = SerialPortGateway.create((String) config.get("port")); if (serialPortGateway == null) { logger.error("No Serialport config in openhab.cfg found"); } } }