/**
* 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.akm868.internal;
import java.util.Dictionary;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.akm868.AKM868BindingProvider;
import org.openhab.core.binding.AbstractActiveBinding;
import org.openhab.core.library.types.OnOffType;
import org.osgi.service.cm.ConfigurationException;
import org.osgi.service.cm.ManagedService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This is the main class for the AKM868 binding
*
* @author Michael Heckmann
* @since 1.8.0
*/
public class AKM868Binding extends AbstractActiveBinding<AKM868BindingProvider>
implements ManagedService, AKM868Listener {
private static final Logger logger = LoggerFactory.getLogger(AKM868Binding.class);
/**
* the refresh interval which is used to poll values from the AKM868 server
* (optional, defaults to 60000ms)
*/
private long refreshInterval = 60000;
private String host;
private int port;
private long timeout;
private AKM868PacketReceiver packetlistener;
public AKM868Binding() {
packetlistener = new AKM868PacketReceiver(this);
}
protected void addBindingProvider(AKM868BindingProvider bindingProvider) {
super.addBindingProvider(bindingProvider);
}
protected void removeBindingProvider(AKM868BindingProvider bindingProvider) {
super.removeBindingProvider(bindingProvider);
}
@Override
public void activate() {
}
@Override
public void deactivate() {
logger.debug("Deactivating AKM868 binding...");
stopListener();
}
private void stopListener() {
logger.debug("Stopping AKM868 listener...");
if (packetlistener != null) {
packetlistener.stopListener();
}
}
/**
* @{inheritDoc}
*/
@Override
protected long getRefreshInterval() {
return refreshInterval;
}
/**
* @{inheritDoc}
*/
@Override
protected String getName() {
return "AKM868 Refresh Service";
}
/**
* @{inheritDoc}
*/
@Override
protected void execute() {
}
/**
* @{inheritDoc}
*/
@Override
public void updated(Dictionary<String, ?> config) throws ConfigurationException {
if (config != null) {
// to override the default refresh interval one has to add a
// parameter to openhab.cfg like
// <bindingName>:refresh=<intervalInMs>
String refreshIntervalString = (String) config.get("refresh");
if (StringUtils.isNotBlank(refreshIntervalString)) {
refreshInterval = Long.parseLong(refreshIntervalString);
}
String hostString = (String) config.get("host");
if (StringUtils.isNotBlank(hostString)) {
host = hostString;
}
String portString = (String) config.get("port");
if (StringUtils.isNotBlank(portString)) {
port = Integer.parseInt(portString);
}
String timeoutString = (String) config.get("timeout");
if (StringUtils.isNotBlank(timeoutString)) {
timeout = Long.parseLong(timeoutString);
}
// make sure that there is no listener running
packetlistener.stopListener();
// send the parsed information to the listener
packetlistener.initializeReceiver(host, port, timeout);
// start the listener
new Thread(packetlistener).start();
setProperlyConfigured(true);
}
}
@Override
public void publishUpdate(String id, boolean isPresent) {
for (AKM868BindingProvider provider : providers) {
for (String itemName : provider.getItemNames()) {
if (provider.getId(itemName).equals(id) && provider.getChannel(itemName).equals("0")) {
logger.debug("Publishing state for {} - state: {} ", itemName, provider.getId(itemName));
eventPublisher.postUpdate(itemName, isPresent == true ? OnOffType.ON : OnOffType.OFF);
}
}
}
}
@Override
public void publishKeyPressedShort(String id) {
for (AKM868BindingProvider provider : providers) {
for (String itemName : provider.getItemNames()) {
if (provider.getId(itemName).equals(id) && provider.getChannel(itemName).equals("1")) {
logger.debug("Publishing state for {} -state: ON", itemName);
eventPublisher.postUpdate(itemName, OnOffType.ON);
}
}
}
}
@Override
public void publishKeyPressedLong(String id) {
for (AKM868BindingProvider provider : providers) {
for (String itemName : provider.getItemNames()) {
if (provider.getId(itemName).equals(id) && provider.getChannel(itemName).equals("5")) {
logger.debug("Publishing state for {} -state: ON", itemName);
eventPublisher.postUpdate(itemName, OnOffType.ON);
}
}
}
}
}