use of org.openhab.model.item.binding.BindingConfigParseException in project openhab1-addons by openhab.
the class PLCLogoBinding method internalReceiveCommand.
@Override
protected void internalReceiveCommand(String itemName, Command command) {
// the code being executed when a command was sent on the openHAB
// event bus goes here. This method is only called if one of the
// BindingProviders provide a binding for the given 'itemName'.
// Note itemname is the item name not the controller name/instance!
//
super.internalReceiveCommand(itemName, command);
logger.debug("internalReceiveCommand() is called!");
for (PLCLogoBindingProvider provider : providers) {
if (!provider.providesBindingFor(itemName)) {
continue;
}
PLCLogoBindingConfig config = provider.getBindingConfig(itemName);
if (!controllers.containsKey(config.getController())) {
logger.warn("Invalid write requested for controller {}", config.getController());
continue;
}
PLCLogoConfig controller = controllers.get(config.getController());
PLCLogoMemoryConfig wr = config.getWR();
int address = -1;
try {
address = wr.getAddress(controller.getModel());
} catch (BindingConfigParseException exception) {
logger.error("Invalid address for block {} on {}", wr.getBlockName(), controller);
continue;
}
int bit = -1;
try {
bit = wr.getBit(controller.getModel());
} catch (BindingConfigParseException exception) {
logger.error("Invalid bit for block {} on {}", wr.getBlockName(), controller);
continue;
}
if (!wr.isInRange(controller.getModel())) {
logger.warn("Invalid write request for block {} at address {}", wr.getBlockName(), address);
continue;
}
// Send command to the LOGO! controller memory
S7Client LogoS7Client = controller.getS7Client();
if (LogoS7Client == null) {
logger.debug("No S7client for controller {} found", config.getController());
continue;
}
final byte[] buffer = new byte[2];
int size = wr.isDigital() ? 1 : 2;
lock.lock();
int result = LogoS7Client.ReadArea(S7.S7AreaDB, 1, address, size, buffer);
logger.debug("Read word from logo memory: at {} {} bytes, result = {}", address, size, result);
if (result == 0) {
Item item = config.getItem();
if (item instanceof NumberItem && !wr.isDigital()) {
if (command instanceof DecimalType) {
int oldValue = S7.GetShortAt(buffer, 0);
int newValue = ((DecimalType) command).intValue();
S7.SetWordAt(buffer, 0, newValue);
logger.debug("Changed word at {} from {} to {}", address, oldValue, newValue);
result = LogoS7Client.WriteArea(S7.S7AreaDB, 1, address, size, buffer);
logger.debug("Wrote to memory at {} two bytes: [{}, {}]", address, buffer[0], buffer[1]);
}
} else if (item instanceof SwitchItem && wr.isDigital()) {
if (command instanceof OnOffType) {
boolean oldValue = S7.GetBitAt(buffer, 0, bit) ? true : false;
boolean newValue = command == OnOffType.ON ? true : false;
S7.SetBitAt(buffer, 0, bit, newValue);
logger.debug("Changed bit {}.{} from {} to {}", address, bit, oldValue, newValue);
result = LogoS7Client.WriteArea(S7.S7AreaDB, 1, address, size, buffer);
logger.debug("Wrote to memory at {} one byte: [{}]", address, buffer[0]);
}
}
// If nothing was written and read was ok, nothing will happen here
if (result != 0) {
logger.warn("Failed to write memory: {}. Reconnecting...", S7Client.ErrorText(result));
ReconnectLogo(LogoS7Client);
}
} else {
logger.warn("Failed to read memory: {}. Reconnecting...", S7Client.ErrorText(result));
ReconnectLogo(LogoS7Client);
}
lock.unlock();
}
}
use of org.openhab.model.item.binding.BindingConfigParseException in project openhab1-addons by openhab.
the class OWServerGenericBindingProvider method parseInBindingConfig.
/**
* Parses a owserver-in configuration by using the regular expression
* <code>([0-9.a-zA-Z]+:[0-9.a-zA-Z]+:[0-9._a-zA-Z]+:[0-9]+)</code>. Where the groups should
* contain the following content:
* <ul>
* <li>1 - Server ID</li>
* <li>2 - One Wire ROM ID</li>
* <li>3 - Variable name</li>
* <li>4 - Refresh Interval</li>
* </ul>
*
* @param item
* @param bindingConfig the config string to parse
* @param config
*
* @return the filled {@link OWServerBindingConfig}
* @throws BindingConfigParseException if the regular expression doesn't match
* the given <code>bindingConfig</code>
*/
protected OWServerBindingConfig parseInBindingConfig(Item item, String bindingConfig, OWServerBindingConfig config) throws BindingConfigParseException {
Matcher matcher = IN_BINDING_PATTERN.matcher(bindingConfig);
if (!matcher.matches()) {
throw new BindingConfigParseException("bindingConfig '" + bindingConfig + "' doesn't represent a valid in-binding-configuration. A valid configuration is matched by the RegExp '" + IN_BINDING_PATTERN + "'");
}
matcher.reset();
OWServerBindingConfigElement configElement;
while (matcher.find()) {
configElement = new OWServerBindingConfigElement();
configElement.serverId = matcher.group(1);
configElement.romId = matcher.group(2);
configElement.name = matcher.group(3);
configElement.refreshInterval = Integer.valueOf(matcher.group(4)).intValue();
logger.debug("OWSERVER: " + configElement);
config.put(IN_BINDING_KEY, configElement);
}
return config;
}
use of org.openhab.model.item.binding.BindingConfigParseException in project openhab1-addons by openhab.
the class SappBindingConfigContactItem method parseSappAddressStatus.
private SappAddressOpenClosedStatus parseSappAddressStatus(String bindingStringAddress) throws BindingConfigParseException {
String pnmasId;
SappAddressType addressType;
int address;
String subAddress;
int openValue = 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));
}
// openvalue
if (bindingAddress.length == 5) {
try {
openValue = Integer.parseInt(bindingAddress[4]);
} catch (NumberFormatException e) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
}
return new SappAddressOpenClosedStatus(pnmasId, addressType, address, subAddress, openValue);
}
use of org.openhab.model.item.binding.BindingConfigParseException in project openhab1-addons by openhab.
the class SappBindingConfigNumberItem method parseSappAddressStatus.
private SappAddressDecimal parseSappAddressStatus(String bindingStringAddress) throws BindingConfigParseException {
String pnmasId;
SappAddressType addressType;
int address;
String subAddress;
int minScale;
int maxScale;
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));
}
// 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));
}
if (bindingAddress.length == 6) {
try {
minScale = Integer.parseInt(bindingAddress[4]);
maxScale = Integer.parseInt(bindingAddress[5]);
} catch (NumberFormatException e) {
throw new BindingConfigParseException(errorMessage(bindingStringAddress));
}
return new SappAddressDecimal(pnmasId, addressType, address, subAddress, minScale, maxScale);
} else {
return new SappAddressDecimal(pnmasId, addressType, address, subAddress);
}
}
use of org.openhab.model.item.binding.BindingConfigParseException in project openhab1-addons by openhab.
the class IntegraStateBindingConfig method parseConfig.
/**
* Parses given binding configuration and creates configuration object.
*
* @param bindingConfig
* config to parse
* @return parsed config object or <code>null</code> if config does not
* match
* @throws BindingConfigParseException
* in case of parse errors
*/
public static IntegraStateBindingConfig parseConfig(String bindingConfig) throws BindingConfigParseException {
ConfigIterator iterator = new ConfigIterator(bindingConfig);
ObjectType objectType;
// parse object type, mandatory
try {
objectType = iterator.nextOfType(ObjectType.class, "object type");
} catch (Exception e) {
// wrong config type, skip parsing
return null;
}
// parse state type, mandatory except for output
StateType stateType = null;
int[] objectNumbers = {};
switch(objectType) {
case ZONE:
stateType = iterator.nextOfType(ZoneState.class, "zone state type");
break;
case PARTITION:
stateType = iterator.nextOfType(PartitionState.class, "partition state type");
break;
case OUTPUT:
stateType = OutputState.OUTPUT;
break;
case DOORS:
stateType = iterator.nextOfType(DoorsState.class, "doors state type");
break;
}
// parse object number, if provided
if (iterator.hasNext()) {
try {
String[] objectNumbersStr = iterator.next().split(",");
objectNumbers = new int[objectNumbersStr.length];
for (int i = 0; i < objectNumbersStr.length; ++i) {
int objectNumber = Integer.parseInt(objectNumbersStr[i]);
if (objectNumber < 1 || objectNumber > 256) {
throw new BindingConfigParseException(String.format("Invalid object number: %s", bindingConfig));
}
objectNumbers[i] = objectNumber;
}
} catch (NumberFormatException e) {
throw new BindingConfigParseException(String.format("Invalid object number: %s", bindingConfig));
}
}
return new IntegraStateBindingConfig(stateType, objectNumbers, iterator.parseOptions());
}
Aggregations