diff --git a/bundles/org.openhab.binding.openwebnet/pom.xml b/bundles/org.openhab.binding.openwebnet/pom.xml
index 92637aae27f..f14136a4565 100644
--- a/bundles/org.openhab.binding.openwebnet/pom.xml
+++ b/bundles/org.openhab.binding.openwebnet/pom.xml
@@ -23,7 +23,7 @@
io.github.openwebnet4j
openwebnet4j
- 0.10.0
+ 0.10.1
compile
diff --git a/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetThermoregulationHandler.java b/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetThermoregulationHandler.java
index 19d9b0d4dc8..deaef021191 100644
--- a/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetThermoregulationHandler.java
+++ b/bundles/org.openhab.binding.openwebnet/src/main/java/org/openhab/binding/openwebnet/internal/handler/OpenWebNetThermoregulationHandler.java
@@ -14,10 +14,12 @@ package org.openhab.binding.openwebnet.internal.handler;
import static org.openhab.binding.openwebnet.internal.OpenWebNetBindingConstants.*;
-import java.util.HashSet;
import java.util.Set;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.openwebnet.internal.OpenWebNetBindingConstants;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.OnOffType;
@@ -36,6 +38,7 @@ import org.openwebnet4j.message.BaseOpenMessage;
import org.openwebnet4j.message.FrameException;
import org.openwebnet4j.message.MalformedFrameException;
import org.openwebnet4j.message.Thermoregulation;
+import org.openwebnet4j.message.Thermoregulation.DimThermo;
import org.openwebnet4j.message.Thermoregulation.WhatThermo;
import org.openwebnet4j.message.Where;
import org.openwebnet4j.message.WhereThermo;
@@ -45,12 +48,13 @@ import org.slf4j.LoggerFactory;
/**
* The {@link OpenWebNetThermoregulationHandler} is responsible for handling
- * commands/messages for Thermoregulation
- * Things. It extends the abstract {@link OpenWebNetThingHandler}.
+ * commands/messages for Thermoregulation Things. It extends the abstract
+ * {@link OpenWebNetThingHandler}.
*
- * @author Massimo Valla - Initial contribution. Added support for 4-zone CU
- * @author Andrea Conte - Thermoregulation
- * @author Gilberto Cocchi - Thermoregulation
+ * @author Massimo Valla - Initial contribution. Added support for 4-zones CU.
+ * Rafactoring and fixed CU state channels updates.
+ * @author Gilberto Cocchi - Initial contribution.
+ * @author Andrea Conte - Added support for 99-zone CU and CU state channels.
*/
@NonNullByDefault
public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
@@ -59,27 +63,30 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
public static final Set SUPPORTED_THING_TYPES = OpenWebNetBindingConstants.THERMOREGULATION_SUPPORTED_THING_TYPES;
- private double currentSetPointTemp = 11.5d; // 11.5 is the default setTemp used in MyHomeUP mobile app
+ private double currentSetPointTemp = 20.0d;
- private Thermoregulation.Function currentFunction = Thermoregulation.Function.GENERIC;
- private Thermoregulation.OperationMode currentMode = Thermoregulation.OperationMode.MANUAL;
+ private Thermoregulation.@Nullable Function currentFunction = null;
+ private Thermoregulation.@Nullable OperationMode currentMode = null;
+ private int currentWeeklyPrgNum = 1;
+ private int currentScenarioPrgNum = 1;
private boolean isStandAlone = true; // true if zone is not associated to a CU
-
private boolean isCentralUnit = false;
- private String programNumber = "1";
+ private boolean cuAtLeastOneProbeOff = false;
+ private boolean cuAtLeastOneProbeProtection = false;
+ private boolean cuAtLeastOneProbeManual = false;
+ private String cuBatteryStatus = CU_BATTERY_OK;
+ private boolean cuFailureDiscovered = false;
- private static Set probesInProtection = new HashSet();
- private static Set probesInOFF = new HashSet();
- private static Set probesInManual = new HashSet();
+ private @Nullable ScheduledFuture> cuStateChannelsUpdateSchedule;
+
+ public static final int CU_STATE_CHANNELS_UPDATE_DELAY = 1500; // msec
private static final String CU_REMOTE_CONTROL_ENABLED = "ENABLED";
private static final String CU_REMOTE_CONTROL_DISABLED = "DISABLED";
private static final String CU_BATTERY_OK = "OK";
private static final String CU_BATTERY_KO = "KO";
- private static final Integer UNDOCUMENTED_WHAT_4001 = 4001;
- private static final Integer UNDOCUMENTED_WHAT_4002 = 4002;
public OpenWebNetThermoregulationHandler(Thing thing) {
super(thing);
@@ -88,18 +95,17 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
@Override
public void initialize() {
super.initialize();
-
ThingTypeUID thingType = thing.getThingTypeUID();
isCentralUnit = OpenWebNetBindingConstants.THING_TYPE_BUS_THERMO_CU.equals(thingType);
-
if (!isCentralUnit) {
- Object standAloneConfig = getConfig().get(OpenWebNetBindingConstants.CONFIG_PROPERTY_STANDALONE);
- if (standAloneConfig != null) {
- isStandAlone = Boolean.parseBoolean(standAloneConfig.toString());
+ if (!((WhereThermo) deviceWhere).isProbe()) {
+ Object standAloneConfig = getConfig().get(OpenWebNetBindingConstants.CONFIG_PROPERTY_STANDALONE);
+ if (standAloneConfig != null) {
+ isStandAlone = Boolean.parseBoolean(standAloneConfig.toString());
+ }
+ logger.debug("@@@@ THERMO ZONE INITIALIZE isStandAlone={}", isStandAlone);
}
- logger.debug("@@@@ THERMO ZONE INITIALIZE isStandAlone={}", isStandAlone);
} else {
-
// central unit must have WHERE=#0 or WHERE=0 or WHERE=#0#n
String w = deviceWhere.value();
if (w == null || !("0".equals(w) || "#0".equals(w) || w.startsWith("#0#"))) {
@@ -108,14 +114,6 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
"@text/offline.conf-error-where");
return;
}
- // reset state of signal channels (they will be setted when specific messages
- // are received)
- updateState(CHANNEL_CU_AT_LEAST_ONE_PROBE_MANUAL, OnOffType.OFF);
- updateState(CHANNEL_CU_AT_LEAST_ONE_PROBE_OFF, OnOffType.OFF);
- updateState(CHANNEL_CU_AT_LEAST_ONE_PROBE_PROTECTION, OnOffType.OFF);
- updateState(CHANNEL_CU_SCENARIO_PROGRAM_NUMBER, new DecimalType(programNumber));
- updateState(CHANNEL_CU_WEEKLY_PROGRAM_NUMBER, new DecimalType(programNumber));
- updateState(CHANNEL_CU_FAILURE_DISCOVERED, OnOffType.OFF);
}
}
@@ -136,7 +134,7 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
break;
case CHANNEL_CU_WEEKLY_PROGRAM_NUMBER:
case CHANNEL_CU_SCENARIO_PROGRAM_NUMBER:
- handleSetProgramNumber(command);
+ handleSetProgramNumber(channel, command);
break;
default: {
logger.warn("handleChannelCommand() Unsupported ChannelUID {}", channel.getId());
@@ -180,23 +178,32 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
}
}
- private void handleSetProgramNumber(Command command) {
+ private void handleSetProgramNumber(ChannelUID channel, Command command) {
if (command instanceof DecimalType) {
if (!isCentralUnit) {
logger.warn("handleSetProgramNumber() This command can be sent only for a Central Unit.");
return;
}
+ int programNumber = ((DecimalType) command).intValue();
+ boolean updateOpMode = false;
- programNumber = command.toString();
- logger.debug("handleSetProgramNumber() Program number set to {}", programNumber);
+ if (CHANNEL_CU_WEEKLY_PROGRAM_NUMBER.equals(channel.getId())) {
+ updateOpMode = currentMode.isWeekly();
+ currentWeeklyPrgNum = programNumber;
+ logger.debug("handleSetProgramNumber() currentWeeklyPrgNum changed to: {}", programNumber);
+ } else {
+ updateOpMode = currentMode.isScenario();
+ currentScenarioPrgNum = programNumber;
+ logger.debug("handleSetProgramNumber() currentScenarioPrgNum changed to: {}", programNumber);
+ }
- // force OperationMode update if we are already in SCENARIO o WEEKLY mode
- if (currentMode.isScenario() || currentMode.isWeekly()) {
+ // force OperationMode update if we are already in SCENARIO or WEEKLY mode
+ if (updateOpMode) {
try {
- Thermoregulation.OperationMode new_mode = Thermoregulation.OperationMode
+ Thermoregulation.OperationMode newMode = Thermoregulation.OperationMode
.valueOf(currentMode.mode() + "_" + programNumber);
- logger.debug("handleSetProgramNumber() new mode {}", new_mode);
- send(Thermoregulation.requestWriteMode(getWhere(deviceWhere.value()), new_mode, currentFunction,
+ logger.debug("handleSetProgramNumber() new mode {}", newMode);
+ send(Thermoregulation.requestWriteMode(getWhere(deviceWhere.value()), newMode, currentFunction,
currentSetPointTemp));
} catch (OWNException e) {
logger.warn("handleSetProgramNumber() {}", e.getMessage());
@@ -204,8 +211,9 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
logger.warn("handleSetProgramNumber() Unsupported command {} for thing {}", command,
getThing().getUID());
}
+ } else { // just update channel
+ updateState(channel, new DecimalType(programNumber));
}
-
} else {
logger.warn("handleSetProgramNumber() Unsupported command {} for thing {}", command, getThing().getUID());
}
@@ -241,17 +249,21 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
Where w = deviceWhere;
if (w != null) {
try {
- Thermoregulation.OperationMode new_mode = Thermoregulation.OperationMode.OFF;
+ Thermoregulation.OperationMode newMode = Thermoregulation.OperationMode.OFF;
if (isCentralUnit && WhatThermo.isComplex(command.toString())) {
- new_mode = Thermoregulation.OperationMode.valueOf(command.toString() + "_" + programNumber);
-
- // store current mode
- currentMode = new_mode;
+ int programNumber = 0;
+ if ("WEEKLY".equalsIgnoreCase(command.toString())) {
+ programNumber = currentWeeklyPrgNum;
+ } else {
+ programNumber = currentScenarioPrgNum;
+ }
+ newMode = Thermoregulation.OperationMode.valueOf(command.toString() + "_" + programNumber);
+ currentMode = newMode;
} else {
- new_mode = Thermoregulation.OperationMode.valueOf(command.toString());
+ newMode = Thermoregulation.OperationMode.valueOf(command.toString());
}
- send(Thermoregulation.requestWriteMode(getWhere(w.value()), new_mode, currentFunction,
+ send(Thermoregulation.requestWriteMode(getWhere(w.value()), newMode, currentFunction,
currentSetPointTemp));
} catch (OWNException e) {
logger.warn("handleMode() {}", e.getMessage());
@@ -299,149 +311,139 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
@Override
protected void handleMessage(BaseOpenMessage msg) {
super.handleMessage(msg);
-
logger.debug("@@@@ Thermo.handleMessage(): {}", msg.toStringVerbose());
-
+ Thermoregulation tmsg = (Thermoregulation) msg;
if (isCentralUnit) {
- if (msg.getWhat() == null) {
+ WhatThermo tWhat = (WhatThermo) msg.getWhat();
+ if (tWhat == null) {
+ logger.debug("handleMessage() Ignoring unsupported WHAT {}. Frame={}", tWhat, msg);
return;
}
-
- // there isn't a message used for setting OK for battery status so let's assume
- // it's OK and then change to KO if according message is received
- updateCUBatteryStatus(CU_BATTERY_OK);
-
- // same in case of Failure Discovered
- updateCUFailureDiscovered(OnOffType.OFF);
-
- if (msg.getWhat() == Thermoregulation.WhatThermo.REMOTE_CONTROL_DISABLED) {
- updateCURemoteControlStatus(CU_REMOTE_CONTROL_DISABLED);
- } else if (msg.getWhat() == Thermoregulation.WhatThermo.REMOTE_CONTROL_ENABLED) {
- updateCURemoteControlStatus(CU_REMOTE_CONTROL_ENABLED);
- } else if (msg.getWhat() == Thermoregulation.WhatThermo.BATTERY_KO) {
- updateCUBatteryStatus(CU_BATTERY_KO);
- } else if (msg.getWhat() == Thermoregulation.WhatThermo.AT_LEAST_ONE_PROBE_OFF) {
- updateCUAtLeastOneProbeOff(OnOffType.ON);
- } else if (msg.getWhat() == Thermoregulation.WhatThermo.AT_LEAST_ONE_PROBE_ANTIFREEZE) {
- updateCUAtLeastOneProbeProtection(OnOffType.ON);
- } else if (msg.getWhat() == Thermoregulation.WhatThermo.AT_LEAST_ONE_PROBE_MANUAL) {
- updateCUAtLeastOneProbeManual(OnOffType.ON);
- } else if (msg.getWhat() == Thermoregulation.WhatThermo.FAILURE_DISCOVERED) {
- updateCUFailureDiscovered(OnOffType.ON);
- } // must intercept all possibile WHATs
- else if (msg.getWhat() == Thermoregulation.WhatThermo.RELEASE_SENSOR_LOCAL_ADJUST) { // will be implemented
- // soon
- logger.debug("handleMessage() Ignoring unsupported WHAT {}. Frame={}", msg.getWhat(), msg);
- } else if (msg.getWhat().value() == UNDOCUMENTED_WHAT_4001) {
- logger.debug("handleMessage() Ignoring unsupported WHAT {}. Frame={}", msg.getWhat(), msg);
- } else if (msg.getWhat().value() == UNDOCUMENTED_WHAT_4002) {
- logger.debug("handleMessage() Ignoring unsupported WHAT {}. Frame={}", msg.getWhat(), msg);
- } else {
- // check and update values of other channel (mode, function, temp)
- updateModeAndFunction((Thermoregulation) msg);
- updateSetpoint((Thermoregulation) msg);
+ if (tWhat.value() > 40) {
+ // it's a CU mode event, CU state events will follow shortly, so let's reset
+ // their values
+ resetCUState();
+ }
+ switch (tWhat) {
+ case AT_LEAST_ONE_PROBE_ANTIFREEZE:
+ cuAtLeastOneProbeProtection = true;
+ break;
+ case AT_LEAST_ONE_PROBE_MANUAL:
+ cuAtLeastOneProbeManual = true;
+ break;
+ case AT_LEAST_ONE_PROBE_OFF:
+ cuAtLeastOneProbeOff = true;
+ break;
+ case BATTERY_KO:
+ cuBatteryStatus = CU_BATTERY_KO;
+ break;
+ case FAILURE_DISCOVERED:
+ cuFailureDiscovered = true;
+ break;
+ case RELEASE_SENSOR_LOCAL_ADJUST:
+ logger.debug("handleMessage(): Ignoring unsupported WHAT {}. Frame={}", tWhat, msg);
+ break;
+ case REMOTE_CONTROL_DISABLED:
+ updateCURemoteControlStatus(CU_REMOTE_CONTROL_DISABLED);
+ break;
+ case REMOTE_CONTROL_ENABLED:
+ updateCURemoteControlStatus(CU_REMOTE_CONTROL_ENABLED);
+ break;
+ default:
+ // check and update values of other channels (mode, function, temp)
+ updateModeAndFunction(tmsg);
+ updateSetpoint(tmsg);
+ break;
}
return;
}
- if (msg.isCommand()) {
- updateModeAndFunction((Thermoregulation) msg);
+ if (tmsg.isCommand()) {
+ updateModeAndFunction(tmsg);
} else {
- if (msg.getDim() == null) {
- return;
- }
- if (msg.getDim() == Thermoregulation.DimThermo.TEMPERATURE
- || msg.getDim() == Thermoregulation.DimThermo.PROBE_TEMPERATURE) {
- updateTemperature((Thermoregulation) msg);
- } else if (msg.getDim() == Thermoregulation.DimThermo.TEMP_SETPOINT
- || msg.getDim() == Thermoregulation.DimThermo.COMPLETE_PROBE_STATUS) {
- updateSetpoint((Thermoregulation) msg);
- } else if (msg.getDim() == Thermoregulation.DimThermo.VALVES_STATUS) {
- updateValveStatus((Thermoregulation) msg);
- } else if (msg.getDim() == Thermoregulation.DimThermo.ACTUATOR_STATUS) {
- updateActuatorStatus((Thermoregulation) msg);
- } else if (msg.getDim() == Thermoregulation.DimThermo.FAN_COIL_SPEED) {
- updateFanCoilSpeed((Thermoregulation) msg);
- } else if (msg.getDim() == Thermoregulation.DimThermo.OFFSET) {
- updateLocalOffset((Thermoregulation) msg);
- } else {
- logger.debug("handleMessage() Ignoring unsupported DIM {} for thing {}. Frame={}", msg.getDim(),
- getThing().getUID(), msg);
+ DimThermo dim = (DimThermo) tmsg.getDim();
+ switch (dim) {
+ case TEMP_SETPOINT:
+ case COMPLETE_PROBE_STATUS:
+ updateSetpoint(tmsg);
+ break;
+ case PROBE_TEMPERATURE:
+ case TEMPERATURE:
+ updateTemperature(tmsg);
+ break;
+ case ACTUATOR_STATUS:
+ updateActuatorStatus(tmsg);
+ break;
+ case FAN_COIL_SPEED:
+ updateFanCoilSpeed(tmsg);
+ break;
+ case OFFSET:
+ updateLocalOffset(tmsg);
+ break;
+ case VALVES_STATUS:
+ updateValveStatus(tmsg);
+ break;
+ default:
+ logger.debug("handleMessage() Ignoring unsupported DIM {} for thing {}. Frame={}", tmsg.getDim(),
+ getThing().getUID(), tmsg);
+ break;
}
}
}
private void updateModeAndFunction(Thermoregulation tmsg) {
if (tmsg.getWhat() == null) {
- logger.debug("updateModeAndFunction() Could not parse Mode or Function from {} (what is null)",
+ logger.warn("updateModeAndFunction() Could not parse Mode or Function from {} (WHAT is null)",
tmsg.getFrameValue());
return;
}
Thermoregulation.WhatThermo w = Thermoregulation.WhatThermo.fromValue(tmsg.getWhat().value());
-
if (w.getMode() == null) {
- logger.debug("updateModeAndFunction() Could not parse Mode from: {}", tmsg.getFrameValue());
+ logger.warn("updateModeAndFunction() Could not parse Mode from: {}", tmsg.getFrameValue());
return;
}
-
if (w.getFunction() == null) {
- logger.debug("updateModeAndFunction() Could not parse Function from: {}", tmsg.getFrameValue());
+ logger.warn("updateModeAndFunction() Could not parse Function from: {}", tmsg.getFrameValue());
return;
}
- Thermoregulation.OperationMode operationMode = w.getMode();
- Thermoregulation.Function function = w.getFunction();
-
- // keep track of thermostats (zones) status
- if (!isCentralUnit && (!((WhereThermo) deviceWhere).isProbe())) {
- if (operationMode == Thermoregulation.OperationMode.OFF) {
- probesInManual.remove(tmsg.getWhere().value());
- probesInProtection.remove(tmsg.getWhere().value());
- if (probesInOFF.add(tmsg.getWhere().value())) {
- logger.debug("atLeastOneProbeInOFF: added WHERE ---> {}", tmsg.getWhere());
- }
- } else if (operationMode == Thermoregulation.OperationMode.PROTECTION) {
- probesInManual.remove(tmsg.getWhere().value());
- probesInOFF.remove(tmsg.getWhere().value());
- if (probesInProtection.add(tmsg.getWhere().value())) {
- logger.debug("atLeastOneProbeInProtection: added WHERE ---> {}", tmsg.getWhere());
- }
- } else if (operationMode == Thermoregulation.OperationMode.MANUAL) {
- probesInProtection.remove(tmsg.getWhere().value());
- probesInOFF.remove(tmsg.getWhere().value());
- if (probesInManual.add(tmsg.getWhere().value())) {
- logger.debug("atLeastOneProbeInManual: added WHERE ---> {}", tmsg.getWhere());
- }
- }
-
- if (probesInOFF.isEmpty()) {
- updateCUAtLeastOneProbeOff(OnOffType.OFF);
- }
- if (probesInProtection.isEmpty()) {
- updateCUAtLeastOneProbeProtection(OnOffType.OFF);
- }
- if (probesInManual.isEmpty()) {
- updateCUAtLeastOneProbeManual(OnOffType.OFF);
- }
+ Thermoregulation.OperationMode operationMode = null;
+ if (w != WhatThermo.HEATING && w != WhatThermo.CONDITIONING) {
+ // *4*1*z## and *4*0*z## do not tell us which mode is the zone now
+ operationMode = w.getMode();
}
+ Thermoregulation.Function function = w.getFunction();
updateState(CHANNEL_FUNCTION, new StringType(function.toString()));
// must convert from OperationMode to Mode and set ProgramNumber when necessary
- updateState(CHANNEL_MODE, new StringType(operationMode.mode()));
- if (operationMode.isScenario()) {
- logger.debug("updateModeAndFunction() set SCENARIO program to: {}", operationMode.programNumber());
- updateState(CHANNEL_CU_SCENARIO_PROGRAM_NUMBER, new DecimalType(operationMode.programNumber()));
+ if (operationMode != null) {
+ updateState(CHANNEL_MODE, new StringType(operationMode.mode()));
+ Integer programN = 0;
+ try {
+ @Nullable
+ Integer prNum = operationMode.programNumber();
+ if (prNum != null) {
+ programN = prNum;
+ }
+ } catch (Exception e) {
+ logger.warn("updateModeAndFunction() Could not parse program number from: {}", tmsg.getFrameValue());
+ return;
+ }
+ if (operationMode.isScenario()) {
+ logger.debug("{} - updateModeAndFunction() set SCENARIO program to: {}", getThing().getUID(), programN);
+ updateState(CHANNEL_CU_SCENARIO_PROGRAM_NUMBER, new DecimalType(programN));
+ currentScenarioPrgNum = programN;
+ }
+ if (operationMode.isWeekly()) {
+ logger.debug("{} - updateModeAndFunction() set WEEKLY program to: {}", getThing().getUID(), programN);
+ updateState(CHANNEL_CU_WEEKLY_PROGRAM_NUMBER, new DecimalType(programN));
+ currentWeeklyPrgNum = programN;
+ }
}
- if (operationMode.isWeekly()) {
- logger.debug("updateModeAndFunction() set WEEKLY program to: {}", operationMode.programNumber());
- updateState(CHANNEL_CU_WEEKLY_PROGRAM_NUMBER, new DecimalType(operationMode.programNumber()));
- }
-
// store current function
currentFunction = function;
-
- // in case of central unit store also current operation mode
+ // in case of Central Unit store also current operation mode
if (isCentralUnit) {
currentMode = operationMode;
}
@@ -459,26 +461,27 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
private void updateSetpoint(Thermoregulation tmsg) {
try {
- double temp = 11.5d;
+ double newTemp = -1;
if (isCentralUnit) {
if (tmsg.getWhat() == null) {
- // it should be like *4*WHAT#TTTT*#0##
- logger.debug("updateSetpoint() Could not parse function from {} (what is null)",
+ logger.warn("updateSetpoint() Could not parse function from {} (what is null)",
tmsg.getFrameValue());
return;
}
-
String[] parameters = tmsg.getWhatParams();
if (parameters.length > 0) {
- temp = Thermoregulation.decodeTemperature(parameters[0]);
+ // it should be like *4*WHAT#TTTT*#0##
+ newTemp = Thermoregulation.decodeTemperature(parameters[0]);
logger.debug("updateSetpoint() parsed temperature from {}: {} ---> {}", tmsg.toStringVerbose(),
- parameters[0], temp);
+ parameters[0], newTemp);
}
} else {
- temp = Thermoregulation.parseTemperature(tmsg);
+ newTemp = Thermoregulation.parseTemperature(tmsg);
+ }
+ if (newTemp > 0) {
+ updateState(CHANNEL_TEMP_SETPOINT, getAsQuantityTypeOrNull(newTemp, SIUnits.CELSIUS));
+ currentSetPointTemp = newTemp;
}
- updateState(CHANNEL_TEMP_SETPOINT, getAsQuantityTypeOrNull(temp, SIUnits.CELSIUS));
- currentSetPointTemp = temp;
} catch (NumberFormatException e) {
logger.warn("updateSetpoint() NumberFormatException on frame {}: {}", tmsg, e.getMessage());
updateState(CHANNEL_TEMP_SETPOINT, UnDefType.UNDEF);
@@ -492,6 +495,9 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
try {
Thermoregulation.FanCoilSpeed speed = Thermoregulation.parseFanCoilSpeed(tmsg);
updateState(CHANNEL_FAN_SPEED, new StringType(speed.toString()));
+ } catch (NumberFormatException e) {
+ logger.warn("updateFanCoilSpeed() NumberFormatException on frame {}: {}", tmsg, e.getMessage());
+ updateState(CHANNEL_FAN_SPEED, UnDefType.UNDEF);
} catch (FrameException e) {
logger.warn("updateFanCoilSpeed() FrameException on frame {}: {}", tmsg, e.getMessage());
updateState(CHANNEL_FAN_SPEED, UnDefType.UNDEF);
@@ -541,35 +547,26 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
logger.debug("updateCURemoteControlStatus(): {}", status);
}
- private void updateCUBatteryStatus(String status) {
- updateState(CHANNEL_CU_BATTERY_STATUS, new StringType(status));
+ private void resetCUState() {
+ logger.debug("########### resetting CU state");
+ cuAtLeastOneProbeOff = false;
+ cuAtLeastOneProbeProtection = false;
+ cuAtLeastOneProbeManual = false;
+ cuBatteryStatus = CU_BATTERY_OK;
+ cuFailureDiscovered = false;
- if (status == CU_BATTERY_KO) { // do not log default value (which is automatically setted)
- logger.debug("updateCUBatteryStatus(): {}", status);
- }
+ cuStateChannelsUpdateSchedule = scheduler.schedule(() -> {
+ updateCUStateChannels();
+ }, CU_STATE_CHANNELS_UPDATE_DELAY, TimeUnit.MILLISECONDS);
}
- private void updateCUFailureDiscovered(OnOffType status) {
- updateState(CHANNEL_CU_FAILURE_DISCOVERED, status);
-
- if (status == OnOffType.ON) { // do not log default value (which is automatically setted)
- logger.debug("updateCUFailureDiscovered(): {}", status);
- }
- }
-
- private void updateCUAtLeastOneProbeOff(OnOffType status) {
- updateState(CHANNEL_CU_AT_LEAST_ONE_PROBE_OFF, status);
- logger.debug("updateCUAtLeastOneProbeOff(): {}", status);
- }
-
- private void updateCUAtLeastOneProbeProtection(OnOffType status) {
- updateState(CHANNEL_CU_AT_LEAST_ONE_PROBE_PROTECTION, status);
- logger.debug("updateCUAtLeastOneProbeProtection(): {}", status);
- }
-
- private void updateCUAtLeastOneProbeManual(OnOffType status) {
- updateState(CHANNEL_CU_AT_LEAST_ONE_PROBE_MANUAL, status);
- logger.debug("updateCUAtLeastOneProbeManual(): {}", status);
+ private void updateCUStateChannels() {
+ logger.debug("@@@@ updating CU state channels");
+ updateState(CHANNEL_CU_AT_LEAST_ONE_PROBE_OFF, OnOffType.from(cuAtLeastOneProbeOff));
+ updateState(CHANNEL_CU_AT_LEAST_ONE_PROBE_PROTECTION, OnOffType.from(cuAtLeastOneProbeProtection));
+ updateState(CHANNEL_CU_AT_LEAST_ONE_PROBE_MANUAL, OnOffType.from(cuAtLeastOneProbeManual));
+ updateState(CHANNEL_CU_BATTERY_STATUS, new StringType(cuBatteryStatus));
+ updateState(CHANNEL_CU_FAILURE_DISCOVERED, OnOffType.from(cuFailureDiscovered));
}
private Boolean channelExists(String channelID) {
@@ -581,11 +578,11 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
logger.debug("--- refreshDevice() : refreshing SINGLE... ({})", thing.getUID());
if (deviceWhere != null) {
- String w = deviceWhere.value();
+ String whereStr = deviceWhere.value();
if (isCentralUnit) {
try {
- send(Thermoregulation.requestStatus(getWhere(w)));
+ send(Thermoregulation.requestStatus(getWhere(whereStr)));
} catch (OWNException e) {
logger.warn("refreshDevice() central unit returned OWNException {}", e.getMessage());
}
@@ -593,35 +590,42 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
}
try {
- send(Thermoregulation.requestTemperature(w));
+ send(Thermoregulation.requestTemperature(whereStr));
if (!((WhereThermo) deviceWhere).isProbe()) {
// for bus_thermo_zone request also other single channels updates
- send(Thermoregulation.requestSetPointTemperature(w));
- send(Thermoregulation.requestMode(w));
+ send(Thermoregulation.requestSetPointTemperature(whereStr));
+ send(Thermoregulation.requestMode(whereStr));
// refresh ONLY subscribed channels
if (channelExists(CHANNEL_FAN_SPEED)) {
- send(Thermoregulation.requestFanCoilSpeed(w));
+ send(Thermoregulation.requestFanCoilSpeed(whereStr));
}
-
if (channelExists(CHANNEL_CONDITIONING_VALVES) || channelExists(CHANNEL_HEATING_VALVES)) {
- send(Thermoregulation.requestValvesStatus(w));
+ send(Thermoregulation.requestValvesStatus(whereStr));
}
-
if (channelExists(CHANNEL_ACTUATORS)) {
- send(Thermoregulation.requestActuatorsStatus(w));
+ send(Thermoregulation.requestActuatorsStatus(whereStr));
}
-
if (channelExists(CHANNEL_LOCAL_OFFSET)) {
- send(Thermoregulation.requestLocalOffset(w));
+ send(Thermoregulation.requestLocalOffset(whereStr));
}
}
} catch (OWNException e) {
- logger.warn("refreshDevice() where='{}' returned OWNException {}", w, e.getMessage());
+ logger.warn("refreshDevice() where='{}' returned OWNException {}", whereStr, e.getMessage());
}
} else {
logger.debug("refreshDevice() where is null");
}
}
+
+ @Override
+ public void dispose() {
+ ScheduledFuture> s = cuStateChannelsUpdateSchedule;
+ if (s != null) {
+ s.cancel(false);
+ logger.debug("dispose() - scheduler stopped.");
+ }
+ super.dispose();
+ }
}