/**
* 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.sapp.internal.configs;
import org.apache.commons.lang.ArrayUtils;
import org.openhab.binding.sapp.internal.model.SappAddressOnOffControl;
import org.openhab.binding.sapp.internal.model.SappAddressOnOffStatus;
import org.openhab.binding.sapp.internal.model.SappAddressType;
import org.openhab.core.items.Item;
import org.openhab.model.item.binding.BindingConfigParseException;
// Switch binding format
// <pnmasid status>:<status address type, I/O/V>:<status address, 1-250/1-250/1-2500>:<status subaddress, */H/L/1-16>:<on value>/<pnmasid control>:<status address type, only V>:<control address, 1-2500>:<control subaddress, */H/L/1-16>:<on value>:<off value>
// <on value> can be omitted, default is 1
// <on value>:<off value> can be omitted, default is 1:0
// example: { sapp="home:V:60:1/home:V:192:1:1:0" }
//
// stopping poller switch, suspends and restarts the polling
//<pnmasid status>:<P>
//example: { sapp="P" }
/**
* This is a helper class holding SwitchItem binding specific configuration details
*
* @author Paolo Denti
* @since 1.8.0
*
*/
public class SappBindingConfigSwitchItem extends SappBindingConfig {
private SappAddressOnOffStatus status;
private SappAddressOnOffControl control;
private boolean pollerSuspender;
/**
* Constructor
*/
public SappBindingConfigSwitchItem(Item item, String bindingConfig) throws BindingConfigParseException {
super(item.getName());
if ("P".equals(bindingConfig)) {
pollerSuspender = true;
this.status = null;
this.control = null;
} else {
pollerSuspender = false;
String[] bindingConfigParts = bindingConfig.split("/");
if (bindingConfigParts.length != 2) {
throw new BindingConfigParseException(errorMessage(bindingConfig));
}
this.status = parseSappAddressStatus(bindingConfigParts[0]);
this.control = parseSappAddressControl(bindingConfigParts[1]);
}
}
/**
* status getter
*/
public SappAddressOnOffStatus getStatus() {
return status;
}
/**
* control getter
*/
public SappAddressOnOffControl getControl() {
return control;
}
/**
* pollerSuspender getter
*/
public boolean isPollerSuspender() {
return pollerSuspender;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
if (pollerSuspender) {
return String.format("[itemName:%s: pollerSuspender ]", getItemName());
} else {
return String.format("[itemName:%s: status:%s - control: %s ]", getItemName(), this.status.toString(),
this.control.toString());
}
}
private String errorMessage(String bindingConfig) {
return String.format("Invalid Sapp binding configuration for SwitchItem '%s'", bindingConfig);
}
private SappAddressOnOffStatus parseSappAddressStatus(String bindingStringAddress)
throws BindingConfigParseException {
String pnmasId;
SappAddressType addressType;
int address;
String subAddress;
int onValue = 1;
String[] bindingAddress = bindingStringAddress.split(":");
if (bindingAddress.length != 4 && bindingAddress.length != 5) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// pnmasId
pnmasId = bindingAddress[0];
if (pnmasId.length() == 0) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// addressType
addressType = SappAddressType.fromString(bindingAddress[1].toUpperCase());
if (!validAddresses.keySet().contains(addressType)) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// address
try {
address = Integer.parseInt(bindingAddress[2]);
if (address < validAddresses.get(addressType).getLoRange()
|| address > validAddresses.get(addressType).getHiRange()) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
} catch (NumberFormatException e) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// subaddress
subAddress = bindingAddress[3].toUpperCase();
if (!ArrayUtils.contains(validSubAddresses, subAddress)) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// onvalue, offvalue
if (bindingAddress.length == 5) {
try {
onValue = Integer.parseInt(bindingAddress[4]);
} catch (NumberFormatException e) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
}
return new SappAddressOnOffStatus(pnmasId, addressType, address, subAddress, onValue);
}
private SappAddressOnOffControl parseSappAddressControl(String bindingStringAddress)
throws BindingConfigParseException {
String pnmasId;
SappAddressType addressType;
int address;
String subAddress;
int onValue = 1;
int offValue = 0;
String[] bindingAddress = bindingStringAddress.split(":");
if (bindingAddress.length != 4 && bindingAddress.length != 6) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// pnmasId
pnmasId = bindingAddress[0];
if (pnmasId.length() == 0) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// addressType
addressType = SappAddressType.fromString(bindingAddress[1].toUpperCase());
if (!validAddresses.keySet().contains(addressType)) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
if (addressType != SappAddressType.VIRTUAL) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// address
try {
address = Integer.parseInt(bindingAddress[2]);
if (address < validAddresses.get(addressType).getLoRange()
|| address > validAddresses.get(addressType).getHiRange()) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
} catch (NumberFormatException e) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// subaddress
subAddress = bindingAddress[3].toUpperCase();
if (!ArrayUtils.contains(validSubAddresses, subAddress)) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
// onvalue, offvalue
if (bindingAddress.length == 6) {
try {
onValue = Integer.parseInt(bindingAddress[4]);
offValue = Integer.parseInt(bindingAddress[5]);
} catch (NumberFormatException e) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
}
return new SappAddressOnOffControl(pnmasId, addressType, address, subAddress, onValue, offValue);
}
}