/**
* 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.lcn.mappingtarget;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.openhab.binding.lcn.common.LcnAddrMod;
import org.openhab.binding.lcn.common.LcnDefs;
import org.openhab.binding.lcn.connection.Connection;
import org.openhab.binding.lcn.connection.ModInfo;
import org.openhab.binding.lcn.input.ModStatusBinSensors;
import org.openhab.binding.lcn.input.ModStatusKeyLocks;
import org.openhab.binding.lcn.input.ModStatusLedsAndLogicOps;
import org.openhab.binding.lcn.input.ModStatusOutput;
import org.openhab.binding.lcn.input.ModStatusRelays;
import org.openhab.binding.lcn.input.ModStatusVar;
import org.openhab.core.events.EventPublisher;
import org.openhab.core.items.Item;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.types.Command;
/**
* Visualizes the current value of a variable.
*
* @author Tobias J�ttner
*/
public class VarVisualize extends TargetWithLcnAddr {
/** Pattern to parse variable value visualizations. */
private static final Pattern PATTERN_VAR_VALUE = Pattern.compile("(?<varId>\\d+)(\\.(?<unit>.*))?",
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
/** Pattern to parse set-point value visualizations. */
private static final Pattern PATTERN_SETPOINT_VALUE = Pattern.compile("(?<regId>\\d+)(\\.(?<unit>.*))?",
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
/** Pattern to parse threshold value visualizations. */
private static final Pattern PATTERN_THRESHOLD_VALUE = Pattern.compile(
"(?<registerId>\\d+)\\.(?<thrsId>\\d+)(\\.(?<unit>.*))?", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
/** Pattern to parse S0-input value visualizations. */
private static final Pattern PATTERN_S0INPUT_VALUE = Pattern.compile("(?<s0Id>\\d+)(\\.(?<unit>.*))?",
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
/** The target variable to visualize. */
private final LcnDefs.Var var;
/** The unit to use for printing the variable's value. */
private final LcnDefs.VarUnit unit;
/**
* Constructor.
*
* @param addr the target LCN module
* @param var the LCN variable to visualize
* @param unit the {@link LcnDefs.VarUnit}
*/
VarVisualize(LcnAddrMod addr, LcnDefs.Var var, LcnDefs.VarUnit unit) {
super(addr);
this.var = var;
this.unit = unit;
}
/**
* Tries to parse the given input text.
*
* @param input the text to parse
* @return the parsed {@link VarVisualize} or null
*/
static Target tryParseTarget(String input) {
CmdAndAddressRet header = CmdAndAddressRet.parse(input, false);
if (header != null) {
Matcher matcher;
try {
switch (header.getCmd().toUpperCase()) {
case "VAR_VALUE":
if ((matcher = PATTERN_VAR_VALUE.matcher(header.getRestInput())).matches()) {
LcnDefs.Var var = LcnDefs.Var.varIdToVar(Integer.parseInt(matcher.group("varId")) - 1);
LcnDefs.VarUnit unit = matcher.group("unit") != null
? LcnDefs.VarUnit.parse(matcher.group("unit")) : LcnDefs.VarUnit.NATIVE;
return new VarVisualize((LcnAddrMod) header.getAddr(), var, unit);
}
break;
case "SETPOINT_VALUE":
if ((matcher = PATTERN_SETPOINT_VALUE.matcher(header.getRestInput())).matches()) {
LcnDefs.Var var = LcnDefs.Var.setPointIdToVar(Integer.parseInt(matcher.group("regId")) - 1);
LcnDefs.VarUnit unit = matcher.group("unit") != null
? LcnDefs.VarUnit.parse(matcher.group("unit")) : LcnDefs.VarUnit.NATIVE;
return new VarVisualize((LcnAddrMod) header.getAddr(), var, unit);
}
break;
case "THRESHOLD_VALUE":
if ((matcher = PATTERN_THRESHOLD_VALUE.matcher(header.getRestInput())).matches()) {
LcnDefs.Var var = LcnDefs.Var.thrsIdToVar(Integer.parseInt(matcher.group("registerId")) - 1,
Integer.parseInt(matcher.group("thrsId")) - 1);
LcnDefs.VarUnit unit = matcher.group("unit") != null
? LcnDefs.VarUnit.parse(matcher.group("unit")) : LcnDefs.VarUnit.NATIVE;
return new VarVisualize((LcnAddrMod) header.getAddr(), var, unit);
}
break;
case "S0_VALUE":
if ((matcher = PATTERN_S0INPUT_VALUE.matcher(header.getRestInput())).matches()) {
LcnDefs.Var var = LcnDefs.Var.s0IdToVar(Integer.parseInt(matcher.group("s0Id")) - 1);
LcnDefs.VarUnit unit = matcher.group("unit") != null
? LcnDefs.VarUnit.parse(matcher.group("unit")) : LcnDefs.VarUnit.NATIVE;
return new VarVisualize((LcnAddrMod) header.getAddr(), var, unit);
}
break;
}
} catch (IllegalArgumentException ex) {
}
}
return null;
}
/** {@inheritDoc} */
@Override
public void send(Connection conn, Item item, Command cmd) {
}
/** {@inheritDoc} */
@Override
public void register(Connection conn) {
long currTime = System.nanoTime();
ModInfo info = conn.updateModuleData((LcnAddrMod) this.addr);
if (!info.requestSwAge.isActive()) {
info.requestSwAge.nextRequestIn(0, currTime); // Firmware version is required
}
if (info.requestStatusVars.containsKey(this.var) && !info.requestStatusVars.get(this.var).isActive()) {
info.requestStatusVars.get(this.var).nextRequestIn(0, currTime);
}
}
/** {@inheritDoc} */
@Override
public boolean visualizationHandleOutputStatus(ModStatusOutput pchkInput, Command cmd, Item item,
EventPublisher eventPublisher) {
return false;
}
/** {@inheritDoc} */
@Override
public boolean visualizationHandleRelaysStatus(ModStatusRelays pchkInput, Command cmd, Item item,
EventPublisher eventPublisher) {
return false;
}
/** {@inheritDoc} */
@Override
public boolean visualizationBinSensorsStatus(ModStatusBinSensors pchkInput, Command cmd, Item item,
EventPublisher eventPublisher) {
return false;
}
/**
* Visualization for {@link StringType} and {@link DecimalType}.
* {@inheritDoc}
*/
@Override
public boolean visualizationVarStatus(ModStatusVar pchkInput, Command cmd, Item item,
EventPublisher eventPublisher) {
if (pchkInput.getLogicalSourceAddr().equals(this.addr) && pchkInput.getVar() == this.var) {
if (item.getAcceptedDataTypes().contains(StringType.class)) {
String value = pchkInput.getValue().toVarUnitString(this.unit,
LcnDefs.Var.isLockableRegulatorSource(this.var), LcnDefs.Var.useLcnSpecialValues(this.var));
eventPublisher.postUpdate(item.getName(), new StringType(value));
return true;
} else if (item.getAcceptedDataTypes().contains(DecimalType.class)) {
eventPublisher.postUpdate(item.getName(), new DecimalType(
pchkInput.getValue().toVarUnit(this.unit, LcnDefs.Var.isLockableRegulatorSource(this.var))));
return true;
}
}
return false;
}
/** {@inheritDoc} */
@Override
public boolean visualizationLedsAndLogicOpsStatus(ModStatusLedsAndLogicOps pchkInput, Command cmd, Item item,
EventPublisher eventPublisher) {
return false;
}
/** {@inheritDoc} */
@Override
public boolean visualizationKeyLocksStatus(ModStatusKeyLocks pchkInput, Command cmd, Item item,
EventPublisher eventPublisher) {
return false;
}
}