[openwebnet] fixing support for central unit (#12514)

* - read Temperature set in central unit at startup
* - ignoring what 4002 which may lead to unpredicted behaviours
- usage of own 0.8.0 from mvalla (new getWhatParameter method)
* attempt to integrate own 0.8.0
* - read setTemp (MANUAL mode) at startup
- read mode (OFF/PROTECTION/WEEKLY/SCENARIO/MANUAL) at startup
- persist selected mode (see issue 12401)
* remove unnecessary logs
* - fix typo
- own4j 0.8.1
* fix placeholder count

Signed-off-by: Conte Andrea <andrea@conte.com>
This commit is contained in:
Conte Andrea 2022-03-25 17:32:10 +01:00 committed by GitHub
parent 8e6e493fc9
commit 4774f8a7e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 89 additions and 14 deletions

View File

@ -23,7 +23,7 @@
<dependency>
<groupId>io.github.openwebnet4j</groupId>
<artifactId>openwebnet4j</artifactId>
<version>0.7.1</version>
<version>0.8.1</version>
<scope>compile</scope>
</dependency>

View File

@ -77,12 +77,13 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
private double currentSetPointTemp = 11.5d; // 11.5 is the default setTemp used in MyHomeUP mobile app
private Thermoregulation.Function currentFunction = Thermoregulation.Function.GENERIC;
private Thermoregulation.OperationMode currentMode = Thermoregulation.OperationMode.MANUAL;
private boolean isStandAlone = false;
private boolean isCentralUnit = false;
private String programNumber = "";
private String programNumber = "1";
private static Set<String> probesInProtection = new HashSet<String>();
private static Set<String> probesInOFF = new HashSet<String>();
@ -92,6 +93,8 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
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);
@ -118,6 +121,13 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR,
"@text/offline.conf-error-where");
}
// 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));
}
}
@ -192,6 +202,22 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
programNumber = command.toString();
logger.debug("handleSetProgramNumber() Program number set to {}", programNumber);
// force OperationMode update if we are already in SCENARIO o WEEKLY mode
if (currentMode.isScenario() || currentMode.isWeekly()) {
try {
Thermoregulation.OperationMode new_mode = Thermoregulation.OperationMode
.valueOf(currentMode.mode() + "_" + programNumber);
logger.debug("handleSetProgramNumber() new mode {}", new_mode);
send(Thermoregulation.requestWriteMode(getWhere(""), new_mode, currentFunction,
currentSetPointTemp));
} catch (OWNException e) {
logger.warn("handleSetProgramNumber() {}", e.getMessage());
} catch (IllegalArgumentException e) {
logger.warn("handleSetProgramNumber() Unsupported command {} for thing {}", command,
getThing().getUID());
}
}
} else {
logger.warn("handleSetProgramNumber() Unsupported command {} for thing {}", command, getThing().getUID());
}
@ -229,11 +255,14 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
try {
Thermoregulation.OperationMode new_mode = Thermoregulation.OperationMode.OFF;
if (isCentralUnit && WhatThermo.isComplex(command.toString()))
if (isCentralUnit && WhatThermo.isComplex(command.toString())) {
new_mode = Thermoregulation.OperationMode.valueOf(command.toString() + "_" + programNumber);
else
new_mode = Thermoregulation.OperationMode.valueOf(command.toString());
// store current mode
currentMode = new_mode;
} else {
new_mode = Thermoregulation.OperationMode.valueOf(command.toString());
}
send(Thermoregulation.requestWriteMode(getWhere(w.value()), new_mode, currentFunction,
currentSetPointTemp));
} catch (OWNException e) {
@ -280,6 +309,10 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
super.handleMessage(msg);
if (isCentralUnit) {
if (msg.getWhat() == null) {
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);
@ -301,12 +334,18 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
updateCUAtLeastOneProbeManual(OnOffType.ON);
} else if (msg.getWhat() == Thermoregulation.WhatThermo.FAILURE_DISCOVERED) {
updateCUFailureDiscovered(OnOffType.ON);
} // must intercept all possibile WHATs (will be implemented soon)
else if (msg.getWhat() == Thermoregulation.WhatThermo.RELEASE_SENSOR_LOCAL_ADJUST) {
} // 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 eventually parse mode and function
// check and update values of other channel (mode, function, temp)
updateModeAndFunction((Thermoregulation) msg);
updateSetpoint((Thermoregulation) msg);
}
return;
}
@ -350,29 +389,30 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
logger.debug("updateModeAndFunction() Could not parse Mode from: {}", tmsg.getFrameValue());
return;
}
if (w.getFunction() == null) {
logger.debug("updateModeAndFunction() Could not parse Function from: {}", tmsg.getFrameValue());
return;
}
Thermoregulation.OperationMode mode = w.getMode();
Thermoregulation.OperationMode operationMode = w.getMode();
Thermoregulation.Function function = w.getFunction();
// keep track of thermostats (zones) status
if (!isCentralUnit && (!((WhereThermo) deviceWhere).isProbe())) {
if (mode == Thermoregulation.OperationMode.OFF) {
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 (mode == Thermoregulation.OperationMode.PROTECTION) {
} 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 (mode == Thermoregulation.OperationMode.MANUAL) {
} else if (operationMode == Thermoregulation.OperationMode.MANUAL) {
probesInProtection.remove(tmsg.getWhere().value());
probesInOFF.remove(tmsg.getWhere().value());
if (probesInManual.add(tmsg.getWhere().value())) {
@ -392,10 +432,25 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
}
updateState(CHANNEL_FUNCTION, new StringType(function.toString()));
updateState(CHANNEL_MODE, new StringType(mode.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.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
if (isCentralUnit) {
currentMode = operationMode;
}
}
private void updateTemperature(Thermoregulation tmsg) {
@ -410,9 +465,29 @@ public class OpenWebNetThermoregulationHandler extends OpenWebNetThingHandler {
private void updateSetpoint(Thermoregulation tmsg) {
try {
double temp = Thermoregulation.parseTemperature(tmsg);
double temp = 11.5d;
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)",
tmsg.getFrameValue());
return;
}
String[] parameters = tmsg.getWhatParams();
if (parameters.length > 0) {
temp = Thermoregulation.decodeTemperature(parameters[0]);
logger.debug("updateSetpoint() parsed temperature from {}: {} ---> {}", tmsg.toStringVerbose(),
parameters[0], temp);
}
} else {
temp = Thermoregulation.parseTemperature(tmsg);
}
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);
} catch (FrameException e) {
logger.warn("updateSetpoint() FrameException on frame {}: {}", tmsg, e.getMessage());
updateState(CHANNEL_TEMP_SETPOINT, UnDefType.UNDEF);