/** * 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.xpl.internal; import java.util.List; import org.cdp1802.xpl.xPL_MessageI; import org.cdp1802.xpl.xPL_MessageListenerI; import org.openhab.binding.xpl.XplBindingConfig; import org.openhab.binding.xpl.XplBindingProvider; import org.openhab.core.binding.AbstractBinding; import org.openhab.core.events.EventPublisher; 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.core.library.items.ContactItem; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.OpenClosedType; import org.openhab.core.library.types.StringType; import org.openhab.core.types.Command; import org.openhab.io.transport.xpl.XplTransportService; /** * xPL binding for openHAB * * @author clinique * @since 1.6.0 */ public class XplBinding extends AbstractBinding<XplBindingProvider>implements xPL_MessageListenerI { // private static final Logger logger = LoggerFactory.getLogger(XplBinding.class); private XplTransportService xplTransportService; private EventPublisher eventPublisher; public XplBinding() { } @Override public void setEventPublisher(EventPublisher eventPublisher) { this.eventPublisher = eventPublisher; } @Override public void unsetEventPublisher(EventPublisher eventPublisher) { this.eventPublisher = null; } protected void addBindingProvider(XplBindingProvider bindingProvider) { super.addBindingProvider(bindingProvider); } protected void removeBindingProvider(XplBindingProvider bindingProvider) { super.removeBindingProvider(bindingProvider); } /** * Sends an xPL message upon command received by an Item */ @Override protected void internalReceiveCommand(String itemName, Command command) { for (XplBindingProvider provider : providers) { XplBindingConfig config = provider.getConfig(itemName); if ((config == null) || (config.NamedParameter == null)) { continue; } if (config.Message.getSource() == null) { config.Message.setSource(xplTransportService.getSourceIdentifier()); } config.Message.setNamedValue(config.NamedParameter, command.toString().toLowerCase()); xplTransportService.sendMessage(config.Message); } } @Override public void handleXPLMessage(xPL_MessageI theMessage) { for (XplBindingProvider provider : providers) { List<String> matchingItems = provider.hasMessage(theMessage); for (String itemName : matchingItems) { XplBindingConfig config = provider.getConfig(itemName); if (config == null) { continue; } String current = theMessage.getNamedValue(config.NamedParameter); Item item = provider.getItem(itemName); if (item != null) { if (item instanceof SwitchItem) { OnOffType status = (current.equalsIgnoreCase("on") || current.equalsIgnoreCase("true") || current.equalsIgnoreCase("1") || current.equalsIgnoreCase("open") || current.equalsIgnoreCase("high")) ? OnOffType.ON : OnOffType.OFF; synchronized (item) { if (!item.getState().equals(status)) { eventPublisher.postUpdate(itemName, status); ((SwitchItem) item).setState(status); } } } else if (item instanceof ContactItem) { OpenClosedType status = (current.equalsIgnoreCase("on") || current.equalsIgnoreCase("true") || current.equalsIgnoreCase("1") || current.equalsIgnoreCase("open") || current.equalsIgnoreCase("high")) ? OpenClosedType.OPEN : OpenClosedType.CLOSED; synchronized (item) { if (!item.getState().equals(status)) { eventPublisher.postUpdate(itemName, status); ((ContactItem) item).setState(status); } } } else if (item instanceof NumberItem) { DecimalType value = new DecimalType(current); synchronized (item) { if (!item.getState().equals(value)) { eventPublisher.postUpdate(itemName, value); ((NumberItem) item).setState(value); } } } else if (item instanceof StringItem) { StringType value = new StringType(current); synchronized (item) { if (!item.getState().equals(value)) { eventPublisher.postUpdate(itemName, value); ((StringItem) item).setState(value); } } } } } } } /** * Setter for Declarative Services. Adds the XplTransportService instance. * * @param xplTransportService * Service. */ public void setXplTransportService(XplTransportService xplTransportService) { this.xplTransportService = xplTransportService; this.xplTransportService.addMessageListener(this); } /** * Unsetter for Declarative Services. * * @param xplTransportService * Service to remove. */ public void unsetXplTransportService(XplTransportService xplTransportService) { this.xplTransportService.removeMessageListener(this); this.xplTransportService = null; } }