From 4ddb3ce7e68c902adc6159edaeead06c0aee3176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hans=20B=C3=B6hm?= Date: Mon, 3 Jul 2023 17:45:45 +0200 Subject: [PATCH] [comfoair] extend UoM support, add semantic tags & update state descriptions (#15167) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enable UoM for rpm values * support uom for non-hour time channels * add state options for frost setting * add data type for percentage * support DecimalType for QuantityType channels * support rfc2217 * improve state description for time channels * improve code style in DataTypes * remove unnecessary command type check * enable UoM for enthalpy timer Signed-off-by: Hans Böhm --- .../org.openhab.binding.comfoair/README.md | 24 +- .../internal/ComfoAirCommandType.java | 49 +-- .../internal/ComfoAirSerialConnector.java | 14 +- .../internal/datatypes/DataTypeRPM.java | 28 +- .../datatypes/DataTypeTemperature.java | 23 +- .../internal/datatypes/DataTypeTime.java | 54 ++- .../internal/datatypes/DataTypeVolt.java | 21 +- .../resources/OH-INF/i18n/comfoair.properties | 57 ++- .../resources/OH-INF/thing/thing-types.xml | 344 ++++++++++++++---- .../resources/OH-INF/update/instructions.xml | 126 +++++++ 10 files changed, 592 insertions(+), 148 deletions(-) create mode 100644 bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/update/instructions.xml diff --git a/bundles/org.openhab.binding.comfoair/README.md b/bundles/org.openhab.binding.comfoair/README.md index 2baa6b2ac..1b20b8ba8 100644 --- a/bundles/org.openhab.binding.comfoair/README.md +++ b/bundles/org.openhab.binding.comfoair/README.md @@ -69,8 +69,8 @@ The ComfoAir binding supports the following channels. | ventilation#fanIn3 | Number | Fan In Level 3 | Fan level 3 performance (%) of incoming fan | false | yes | | ventilation#fanInPercent | Number | Fan In (%) | Current relative speed (%) of incoming fan | false | yes | | ventilation#fanOutPercent | Number | Fan Out (%) | Current relative speed (%) of outgoing fan | true | yes | -| ventilation#fanInRPM | Number | Fan In (rpm) | Current absolute speed (rpm) of incoming fan | true | yes | -| ventilation#fanOutRPM | Number | Fan Out (rpm) | Current absolute speed (rpm) of outgoing fan | true | yes | +| ventilation#fanInRPM | Number:Frequency | Fan In (rpm) | Current absolute speed (rpm) of incoming fan | true | yes | +| ventilation#fanOutRPM | Number:Frequency | Fan Out (rpm) | Current absolute speed (rpm) of outgoing fan | true | yes | | **Temperature Values** | | | | | | | temperatures#targetTemperature | Number:Temperature | Target Temperature | Target (comfort) temperature | false | no | | temperatures#outdoorTemperatureIn | Number:Temperature | Outdoor Temperature Incoming | Intake air temperature (outside) | true | yes | @@ -108,14 +108,14 @@ The ComfoAir binding supports the following channels. | menuP1#menu28Mode | Switch | Menu 28 Mode (P18) | State of menu 28 mode (P18) | true | yes | | menuP1#menu29Mode | Switch | Menu 29 Mode (P19) | State of menu 29 mode (P19) | true | yes | | **Menu P2: Delay Settings** | | | | | | -| menuP2#bathroomStartDelay | Number | Menu P21 | Start delay for bathroom switch (min) | false | yes | -| menuP2#bathroomEndDelay | Number | Menu P22 | End delay for bathroom switch (min) | false | yes | -| menuP2#L1EndDelay | Number | Menu P23 | End delay for L1 switch (min) | false | yes | -| menuP2#pulseVentilation | Number | Menu P27 | Period for pulse ventilation (min) | false | yes | -| menuP2#filterWeeks | Number | Menu P24 | Usage period until filter pollution message (weeks) | false | yes | -| menuP2#RFShortDelay | Number | Menu P25 | End delay (RF short actuation) for ventilation level 3 (min) | false | yes | -| menuP2#RFLongDelay | Number | Menu P26 | End delay (RF long actuation) for ventilation level 3 (min) | false | yes | -| menuP2#cookerhoodDelay | Number | Menu P20 | End delay for cooker hood control (min) | false | yes | +| menuP2#bathroomStartDelay | Number:Time | Menu P21 | Start delay for bathroom switch (uses minutes internally) | false | yes | +| menuP2#bathroomEndDelay | Number:Time | Menu P22 | End delay for bathroom switch (uses minutes internally) | false | yes | +| menuP2#L1EndDelay | Number:Time | Menu P23 | End delay for L1 switch (uses minutes internally) | false | yes | +| menuP2#pulseVentilation | Number:Time | Menu P27 | Period for pulse ventilation (uses minutes internally) | false | yes | +| menuP2#filterWeeks | Number:Time | Menu P24 | Usage period until filter pollution message (uses weeks internally) | false | yes | +| menuP2#RFShortDelay | Number:Time | Menu P25 | End delay (RF short actuation) for ventilation level 3 (uses minutes internally) | false | yes | +| menuP2#RFLongDelay | Number:Time | Menu P26 | End delay (RF long actuation) for ventilation level 3 (uses minutes internally) | false | yes | +| menuP2#cookerhoodDelay | Number:Time | Menu P20 | End delay for cooker hood control (uses minutes internally) | false | yes | | **Menu P9: Option States** | | | | | | | menuP9#chimneyState | Switch | Chimney Control State | State of the chimney control | true | yes | | menuP9#bypassState | Switch | Bypass State | State of the bypass (ON = open / OFF = closed) | true | yes | @@ -140,7 +140,7 @@ The ComfoAir binding supports the following channels. | preheater#preheaterValve | Number | Preheater Valve | State of the preheater valve | true | yes | | preheater#preheaterFrostProtect | Switch | Frost Protection | State of the frost protection | true | yes | | preheater#preheaterHeating | Switch | Preheater | State of the preheater | true | yes | -| preheater#preheaterFrostTime | Number | Preheater Frost Time | Frost minutes | true | yes | +| preheater#preheaterFrostTime | Number:Time | Preheater Frost Time | Frost minutes | true | yes | | preheater#preheaterSafety | Number | Preheater Frost Safety | Frost safety setting | true | yes | | **GHX Values** | | | | | | | ewt#ewtTemperatureLow | Number:Temperature | GHX Temperature (low) | Lower temperature of the geothermal heat exchanger | true | yes | @@ -156,7 +156,7 @@ The ComfoAir binding supports the following channels. | enthalpy#enthalpyTemperature | Number:Temperature | Enthalpy Sensor Temperature | Temperature of the enthalpy sensor | true | yes | | enthalpy#enthalpyHumidity | Number | Enthalpy Sensor Humidity | Humidity of the enthalpy sensor | true | yes | | enthalpy#enthalpyLevel | Number | Enthalpy Sensor Level | Level of the enthalpy sensor | true | yes | -| enthalpy#enthalpyTime | Number | Enthalpy Sensor Timer | Timer state of the enthalpy sensor | true | yes | +| enthalpy#enthalpyTime | Number:Time | Enthalpy Sensor Timer | Timer state of the enthalpy sensor | true | yes | | **Option Settings** | | | | | | | options#isPreheater | Switch | Preheater | Preheater option installed | true | yes | | options#isBypass | Switch | Bypass | Bypass option installed | true | yes | diff --git a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/ComfoAirCommandType.java b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/ComfoAirCommandType.java index efd0b4494..0735c6f47 100644 --- a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/ComfoAirCommandType.java +++ b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/ComfoAirCommandType.java @@ -30,10 +30,8 @@ import org.openhab.binding.comfoair.internal.datatypes.DataTypeTemperature; import org.openhab.binding.comfoair.internal.datatypes.DataTypeTime; import org.openhab.binding.comfoair.internal.datatypes.DataTypeVolt; import org.openhab.core.library.types.DecimalType; -import org.openhab.core.library.types.QuantityType; import org.openhab.core.types.Command; import org.openhab.core.types.State; -import org.openhab.core.types.UnDefType; /** * Represents all valid commands which could be processed by this binding @@ -107,28 +105,28 @@ public enum ComfoAirCommandType { DataTypeBoolean.getInstance(), Constants.REQUEST_GET_STATES, Constants.REPLY_GET_STATES, new int[] { 7 }, 0x02), BATHROOM_START_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_BR_START_DELAY, - DataTypeNumber.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 0, new ComfoAirCommandType[] { MENU21_MODE }, + DataTypeTime.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 0, new ComfoAirCommandType[] { MENU21_MODE }, Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 0 }), BATHROOM_END_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_BR_END_DELAY, - DataTypeNumber.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 1, new ComfoAirCommandType[] { MENU22_MODE }, + DataTypeTime.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 1, new ComfoAirCommandType[] { MENU22_MODE }, Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 1 }), L1_END_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_L1_END_DELAY, - DataTypeNumber.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 2, new ComfoAirCommandType[] { MENU27_MODE }, + DataTypeTime.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 2, new ComfoAirCommandType[] { MENU27_MODE }, Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 2 }), PULSE_VENTILATION(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_PULSE_VENTILATION, - DataTypeNumber.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 3, new ComfoAirCommandType[] { MENU23_MODE }, + DataTypeTime.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 3, new ComfoAirCommandType[] { MENU23_MODE }, Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 3 }), FILTER_WEEKS(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_FILTER_WEEKS, - DataTypeNumber.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 4, new ComfoAirCommandType[] { MENU24_MODE }, + DataTypeTime.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 4, new ComfoAirCommandType[] { MENU24_MODE }, Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 4 }), RF_SHORT_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_RF_SHORT_DELAY, - DataTypeNumber.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 5, new ComfoAirCommandType[] { MENU25_MODE }, + DataTypeTime.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 5, new ComfoAirCommandType[] { MENU25_MODE }, Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 5 }), RF_LONG_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_RF_LONG_DELAY, - DataTypeNumber.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 6, new ComfoAirCommandType[] { MENU26_MODE }, + DataTypeTime.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 6, new ComfoAirCommandType[] { MENU26_MODE }, Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 6 }), COOKERHOOD_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_COOKERHOOD_DELAY, - DataTypeNumber.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 7, new ComfoAirCommandType[] { MENU20_MODE }, + DataTypeTime.getInstance(), Constants.REQUEST_SET_DELAYS, 8, 7, new ComfoAirCommandType[] { MENU20_MODE }, Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 7 }), CHIMNEY_STATE(ComfoAirBindingConstants.CG_MENUP9_PREFIX + ComfoAirBindingConstants.CHANNEL_CHIMNEY_STATE, DataTypeBoolean.getInstance(), Constants.REQUEST_GET_STATES, Constants.REPLY_GET_STATES, new int[] { 8 }, @@ -229,7 +227,7 @@ public enum ComfoAirCommandType { ENTHALPY_LEVEL(ComfoAirBindingConstants.CG_ENTHALPY_PREFIX + ComfoAirBindingConstants.CHANNEL_ENTHALPY_LEVEL, DataTypeNumber.getInstance(), Constants.REQUEST_GET_SENSORS, Constants.REPLY_GET_SENSORS, new int[] { 4 }), ENTHALPY_TIME(ComfoAirBindingConstants.CG_ENTHALPY_PREFIX + ComfoAirBindingConstants.CHANNEL_ENTHALPY_TIME, - DataTypeNumber.getInstance(), Constants.REQUEST_GET_SENSORS, Constants.REPLY_GET_SENSORS, new int[] { 5 }), + DataTypeTime.getInstance(), Constants.REQUEST_GET_SENSORS, Constants.REPLY_GET_SENSORS, new int[] { 5 }), PREHEATER_VALVE(ComfoAirBindingConstants.CG_PREHEATER_PREFIX + ComfoAirBindingConstants.CHANNEL_PREHEATER_VALVE, DataTypeNumber.getInstance(), Constants.REQUEST_GET_PREHEATER, Constants.REPLY_GET_PREHEATER, new int[] { 0 }), @@ -242,7 +240,7 @@ public enum ComfoAirCommandType { new int[] { 2 }), PREHEATER_FROST_TIME( ComfoAirBindingConstants.CG_PREHEATER_PREFIX + ComfoAirBindingConstants.CHANNEL_PREHEATER_FROST_TIME, - DataTypeNumber.getInstance(), Constants.REQUEST_GET_PREHEATER, Constants.REPLY_GET_PREHEATER, + DataTypeTime.getInstance(), Constants.REQUEST_GET_PREHEATER, Constants.REPLY_GET_PREHEATER, new int[] { 3, 4 }), PREHEATER_OPTION(ComfoAirBindingConstants.CG_PREHEATER_PREFIX + ComfoAirBindingConstants.CHANNEL_PREHEATER_SAFETY, DataTypeNumber.getInstance(), Constants.REQUEST_GET_PREHEATER, Constants.REPLY_GET_PREHEATER, @@ -786,29 +784,22 @@ public enum ComfoAirCommandType { * new state * @return initialized ComfoAirCommand */ - @SuppressWarnings("PMD.CompareObjectsWithEquals") public static @Nullable ComfoAirCommand getChangeCommand(String key, Command command) { ComfoAirCommandType commandType = getCommandTypeByKey(key); - State value = UnDefType.NULL; if (commandType != null) { ComfoAirDataType dataType = commandType.getDataType(); - if (dataType == DataTypeBoolean.getInstance() || dataType == DataTypeNumber.getInstance() - || dataType == DataTypeRPM.getInstance() || command instanceof QuantityType) { - value = (State) command; - } - if (value instanceof UnDefType) { - return null; - } else { - int[] data = dataType.convertFromState(value, commandType); - DecimalType decimalValue = value.as(DecimalType.class); - if (decimalValue != null) { - int intValue = decimalValue.intValue(); - if (data != null) { - int dataPosition = commandType.getChangeDataPos(); - return new ComfoAirCommand(key, commandType.changeCommand, null, data, dataPosition, intValue); - } + State value = (State) command; + + int[] data = dataType.convertFromState(value, commandType); + DecimalType decimalValue = value.as(DecimalType.class); + if (decimalValue != null) { + int intValue = decimalValue.intValue(); + + if (data != null) { + int dataPosition = commandType.getChangeDataPos(); + return new ComfoAirCommand(key, commandType.changeCommand, null, data, dataPosition, intValue); } } } diff --git a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/ComfoAirSerialConnector.java b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/ComfoAirSerialConnector.java index 1d02cfadd..4faf375b2 100644 --- a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/ComfoAirSerialConnector.java +++ b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/ComfoAirSerialConnector.java @@ -79,9 +79,19 @@ public class ComfoAirSerialConnector { SerialPort serialPort = portIdentifier.open(this.getClass().getName(), 3000); serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); - serialPort.enableReceiveThreshold(1); - serialPort.enableReceiveTimeout(1000); serialPort.notifyOnDataAvailable(true); + + try { + serialPort.enableReceiveThreshold(1); + } catch (UnsupportedCommOperationException e) { + logger.debug("Enable receive threshold is unsupported"); + } + try { + serialPort.enableReceiveTimeout(1000); + } catch (UnsupportedCommOperationException e) { + logger.debug("Enable receive timeout is unsupported"); + } + this.serialPort = serialPort; inputStream = new DataInputStream(new BufferedInputStream(serialPort.getInputStream())); diff --git a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeRPM.java b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeRPM.java index ba26711a0..ed097402f 100644 --- a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeRPM.java +++ b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeRPM.java @@ -16,6 +16,8 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.comfoair.internal.ComfoAirCommandType; import org.openhab.core.library.types.DecimalType; +import org.openhab.core.library.types.QuantityType; +import org.openhab.core.library.unit.Units; import org.openhab.core.types.State; import org.openhab.core.types.UnDefType; import org.slf4j.Logger; @@ -52,20 +54,32 @@ public class DataTypeRPM implements ComfoAirDataType { return UnDefType.NULL; } // transferred value is (1875000 / rpm) per protocol - return new DecimalType((int) (1875000.0 / value)); + return new QuantityType<>((int) (1875000.0 / value), Units.RPM); } } @Override public int @Nullable [] convertFromState(State value, ComfoAirCommandType commandType) { - if (value instanceof UnDefType) { + int[] template = commandType.getChangeDataTemplate(); + float rpm; + + if (value instanceof QuantityType qt) { + QuantityType qtRpm = ((QuantityType) value).toUnit(Units.RPM); + + if (qtRpm != null) { + rpm = qtRpm.floatValue(); + } else { + return null; + } + } else if (value instanceof DecimalType dt) { + rpm = dt.floatValue(); + } else { logger.trace("\"DataTypeRPM\" class \"convertFromState\" undefined state"); return null; - } else { - int[] template = commandType.getChangeDataTemplate(); - // transferred value is (1875000 / rpm) per protocol - template[commandType.getChangeDataPos()] = (int) (1875000 / ((DecimalType) value).doubleValue()); - return template; } + + // transferred value is (1875000 / rpm) per protocol + template[commandType.getChangeDataPos()] = (int) (1875000 / rpm); + return template; } } diff --git a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeTemperature.java b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeTemperature.java index cd4cd3c40..f0a49be11 100644 --- a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeTemperature.java +++ b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeTemperature.java @@ -15,6 +15,7 @@ package org.openhab.binding.comfoair.internal.datatypes; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.comfoair.internal.ComfoAirCommandType; +import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.unit.SIUnits; import org.openhab.core.types.State; @@ -63,18 +64,28 @@ public class DataTypeTemperature implements ComfoAirDataType { @Override public int @Nullable [] convertFromState(State value, ComfoAirCommandType commandType) { int[] template = commandType.getChangeDataTemplate(); - QuantityType celsius = ((QuantityType) value).toUnit(SIUnits.CELSIUS); + float celsius; - if (celsius != null) { - if (commandType.getReadCommand() == ComfoAirCommandType.Constants.REQUEST_GET_GHX) { - template[commandType.getChangeDataPos()] = celsius.intValue(); + if (value instanceof QuantityType qt) { + QuantityType qtCelsius = qt.toUnit(SIUnits.CELSIUS); + + if (qtCelsius != null) { + celsius = qtCelsius.floatValue(); } else { - template[commandType.getChangeDataPos()] = (int) (celsius.doubleValue() + 20) * 2; + return null; } - return template; + } else if (value instanceof DecimalType dt) { + celsius = dt.floatValue(); } else { logger.trace("\"DataTypeTemperature\" class \"convertFromState\" undefined state"); return null; } + + if (commandType.getReadCommand() == ComfoAirCommandType.Constants.REQUEST_GET_GHX) { + template[commandType.getChangeDataPos()] = (int) celsius; + } else { + template[commandType.getChangeDataPos()] = (int) (celsius + 20) * 2; + } + return template; } } diff --git a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeTime.java b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeTime.java index cf2cde002..d8d1d7294 100644 --- a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeTime.java +++ b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeTime.java @@ -15,6 +15,7 @@ package org.openhab.binding.comfoair.internal.datatypes; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.comfoair.internal.ComfoAirCommandType; +import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.unit.Units; import org.openhab.core.types.State; @@ -52,6 +53,16 @@ public class DataTypeTime implements ComfoAirDataType { return UnDefType.NULL; } + if (commandType.getReadCommand() == ComfoAirCommandType.Constants.REQUEST_GET_DELAYS + || commandType.getReadCommand() == ComfoAirCommandType.Constants.REQUEST_GET_PREHEATER) { + if (commandType == ComfoAirCommandType.FILTER_WEEKS) { + return new QuantityType<>(value, Units.WEEK); + } else { + return new QuantityType<>(value, Units.MINUTE); + } + } else if (commandType == ComfoAirCommandType.ENTHALPY_TIME) { + return new QuantityType<>(value * 12, Units.MINUTE); + } return new QuantityType<>(value, Units.HOUR); } } @@ -61,25 +72,44 @@ public class DataTypeTime implements ComfoAirDataType { int[] template = commandType.getChangeDataTemplate(); int[] possibleValues = commandType.getPossibleValues(); int position = commandType.getChangeDataPos(); - QuantityType hours = ((QuantityType) value).toUnit(Units.HOUR); + int intValue; - if (hours != null) { - int intValue = hours.intValue(); + if (value instanceof QuantityType qt) { + QuantityType internalQuantity = new QuantityType<>(); - if (possibleValues == null) { - template[position] = intValue; - } else { - for (int i = 0; i < possibleValues.length; i++) { - if (possibleValues[i] == intValue) { - template[position] = intValue; - break; - } + if (commandType.getReadCommand() == ComfoAirCommandType.Constants.REQUEST_GET_DELAYS + || commandType.getReadCommand() == ComfoAirCommandType.Constants.REQUEST_GET_PREHEATER) { + if (commandType == ComfoAirCommandType.FILTER_WEEKS) { + internalQuantity = qt.toUnit(Units.WEEK); + } else { + internalQuantity = qt.toUnit(Units.MINUTE); } + } else { + internalQuantity = qt.toUnit(Units.HOUR); } - return template; + + if (internalQuantity != null) { + intValue = internalQuantity.intValue(); + } else { + return null; + } + } else if (value instanceof DecimalType dt) { + intValue = dt.intValue(); } else { logger.trace("\"DataTypeTime\" class \"convertFromState\" undefined state"); return null; } + + if (possibleValues == null) { + template[position] = intValue; + } else { + for (int i = 0; i < possibleValues.length; i++) { + if (possibleValues[i] == intValue) { + template[position] = intValue; + break; + } + } + } + return template; } } diff --git a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeVolt.java b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeVolt.java index e325a1f68..6af621995 100644 --- a/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeVolt.java +++ b/bundles/org.openhab.binding.comfoair/src/main/java/org/openhab/binding/comfoair/internal/datatypes/DataTypeVolt.java @@ -15,6 +15,7 @@ package org.openhab.binding.comfoair.internal.datatypes; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.comfoair.internal.ComfoAirCommandType; +import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.unit.Units; import org.openhab.core.types.State; @@ -44,7 +45,7 @@ public class DataTypeVolt implements ComfoAirDataType { @Override public State convertToState(int @Nullable [] data, ComfoAirCommandType commandType) { if (data == null) { - logger.trace("\"DataTypeVolt\" class \"convertToState\" method parameter: null"); + logger.trace("\"DataTypeVoltage\" class \"convertToState\" method parameter: null"); return UnDefType.NULL; } else { int[] readReplyDataPos = commandType.getReadReplyDataPos(); @@ -59,14 +60,24 @@ public class DataTypeVolt implements ComfoAirDataType { @Override public int @Nullable [] convertFromState(State value, ComfoAirCommandType commandType) { int[] template = commandType.getChangeDataTemplate(); - QuantityType volts = ((QuantityType) value).toUnit(Units.VOLT); + float volt; - if (volts != null) { - template[commandType.getChangeDataPos()] = (int) (volts.doubleValue() * 255 / 10); - return template; + if (value instanceof QuantityType qt) { + QuantityType qtVolt = qt.toUnit(Units.VOLT); + + if (qtVolt != null) { + volt = qtVolt.floatValue(); + } else { + return null; + } + } else if (value instanceof DecimalType dt) { + volt = dt.floatValue(); } else { logger.trace("\"DataTypeVolt\" class \"convertFromState\" undefined state"); return null; } + + template[commandType.getChangeDataPos()] = (int) (volt * 255 / 10); + return template; } } diff --git a/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/i18n/comfoair.properties b/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/i18n/comfoair.properties index bdd739193..83c3b0097 100644 --- a/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/i18n/comfoair.properties +++ b/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/i18n/comfoair.properties @@ -53,19 +53,23 @@ channel-group-type.comfoair.ventilation_WHR930.label = Ventilation Values # channel types channel-type.comfoair.L1_end_delay.label = L1 Switch End Delay (P23) -channel-type.comfoair.L1_end_delay.description = End delay for L1 switch (min) +channel-type.comfoair.L1_end_delay.description = End delay for L1 switch (uses minutes internally) channel-type.comfoair.RF_long_delay.label = RF Long Delay (P26) -channel-type.comfoair.RF_long_delay.description = End delay (RF long actuation) for ventilation level 3 (min) +channel-type.comfoair.RF_long_delay.description = End delay (RF long actuation) for ventilation level 3 (uses minutes internally) channel-type.comfoair.RF_max.label = RF Input Max channel-type.comfoair.RF_max.description = Maximum setting for RF input channel-type.comfoair.RF_min.label = RF Input Min channel-type.comfoair.RF_min.description = Minimum setting for RF input channel-type.comfoair.RF_mode.label = RF Input State channel-type.comfoair.RF_mode.description = State of RF input +channel-type.comfoair.RF_mode.state.option.OFF = Controlling +channel-type.comfoair.RF_mode.state.option.ON = Programming channel-type.comfoair.RF_negative.label = RF Input Postive/Negative channel-type.comfoair.RF_negative.description = Postive/Negative state of RF input +channel-type.comfoair.RF_negative.state.option.OFF = Positive +channel-type.comfoair.RF_negative.state.option.ON = Negative channel-type.comfoair.RF_short_delay.label = RF Short Delay (P25) -channel-type.comfoair.RF_short_delay.description = End delay (RF short actuation) for ventilation level 3 (min) +channel-type.comfoair.RF_short_delay.description = End delay (RF short actuation) for ventilation level 3 (uses minutes internally) channel-type.comfoair.RF_value.label = RF Input Target channel-type.comfoair.RF_value.description = Target setting for RF input channel-type.comfoair.activate.label = Activate Binding Control @@ -76,8 +80,12 @@ channel-type.comfoair.analog_min.label = Analog Input Min channel-type.comfoair.analog_min.description = Minimum setting for analog input channel-type.comfoair.analog_mode.label = Analog Input State channel-type.comfoair.analog_mode.description = State of analog input +channel-type.comfoair.analog_mode.state.option.OFF = Controlling +channel-type.comfoair.analog_mode.state.option.ON = Programming channel-type.comfoair.analog_negative.label = Analog Input Postive/Negative channel-type.comfoair.analog_negative.description = Postive/Negative state of analog input +channel-type.comfoair.analog_negative.state.option.OFF = Positive +channel-type.comfoair.analog_negative.state.option.ON = Negative channel-type.comfoair.analog_priority.label = Analog Priority channel-type.comfoair.analog_priority.description = Priority of analog inputs for highest fan level channel-type.comfoair.analog_priority.state.option.0 = Analog inputs @@ -87,9 +95,9 @@ channel-type.comfoair.analog_value.description = Target setting for analog input channel-type.comfoair.analog_volt.label = Analog Input Voltage Level channel-type.comfoair.analog_volt.description = Voltage level of analog input channel-type.comfoair.bathroom_end_delay.label = Bathroom Switch End Delay (P22) -channel-type.comfoair.bathroom_end_delay.description = End delay for bathroom switch (min) +channel-type.comfoair.bathroom_end_delay.description = End delay for bathroom switch (uses minutes internally) channel-type.comfoair.bathroom_start_delay.label = Bathroom Switch Start Delay (P21) -channel-type.comfoair.bathroom_start_delay.description = Start delay for bathroom switch (min) +channel-type.comfoair.bathroom_start_delay.description = Start delay for bathroom switch (uses minutes internally) channel-type.comfoair.bypass_correction.label = Bypass Correction channel-type.comfoair.bypass_correction.description = Bypass correction state channel-type.comfoair.bypass_factor.label = Bypass Factor @@ -98,18 +106,24 @@ channel-type.comfoair.bypass_level.label = Bypass Level channel-type.comfoair.bypass_level.description = Bypass level state channel-type.comfoair.bypass_state.label = Bypass State channel-type.comfoair.bypass_state.description = State of the bypass (ON = open / OFF = closed) +channel-type.comfoair.bypass_state.state.option.ON = Open +channel-type.comfoair.bypass_state.state.option.OFF = Closed channel-type.comfoair.bypass_summer.label = Bypass Summer Mode channel-type.comfoair.bypass_summer.description = Bypass summer mode channel-type.comfoair.bypass_time.label = Bypass Duration channel-type.comfoair.bypass_time.description = Hours of bypass open channel-type.comfoair.chimney_state.label = Chimney Control State channel-type.comfoair.chimney_state.description = State of the chimney control +channel-type.comfoair.chimney_state.state.option.ON = Active +channel-type.comfoair.chimney_state.state.option.OFF = Inactive channel-type.comfoair.cookerhood_delay.label = Cookerhood Delay (P20) -channel-type.comfoair.cookerhood_delay.description = End delay for cooker hood control (min) +channel-type.comfoair.cookerhood_delay.description = End delay for cooker hood control (uses minutes internally) channel-type.comfoair.cookerhood_speed.label = Cookerhood Speed Up (%) channel-type.comfoair.cookerhood_speed.description = Speed up of the cookerhood channel-type.comfoair.cookerhood_state.label = Cookerhood State channel-type.comfoair.cookerhood_state.description = State of the cookerhood control +channel-type.comfoair.cookerhood_state.state.option.ON = Active +channel-type.comfoair.cookerhood_state.state.option.OFF = Inactive channel-type.comfoair.cookerhood_temperature.label = Cookerhood Temperature channel-type.comfoair.cookerhood_temperature.description = Temperature of cookerhood sensor channel-type.comfoair.enthalpy_humidity.label = Enthalpy Sensor Humidity @@ -118,6 +132,8 @@ channel-type.comfoair.enthalpy_level.label = Enthalpy Sensor Level channel-type.comfoair.enthalpy_level.description = Level of the enthalpy sensor channel-type.comfoair.enthalpy_state.label = Enthalpy State channel-type.comfoair.enthalpy_state.description = State of the enthalpy module +channel-type.comfoair.enthalpy_state.state.option.ON = Active +channel-type.comfoair.enthalpy_state.state.option.OFF = Inactive channel-type.comfoair.enthalpy_temperature.label = Enthalpy Sensor Temperature channel-type.comfoair.enthalpy_temperature.description = Temperature of the enthalpy sensor channel-type.comfoair.enthalpy_time.label = Enthalpy Sensor Timer @@ -148,7 +164,7 @@ channel-type.comfoair.fan_in_2.description = Fan level 2 performance (%) of inco channel-type.comfoair.fan_in_3.label = Fan In Level 3 channel-type.comfoair.fan_in_3.description = Fan level 3 performance (%) of incoming fan channel-type.comfoair.fan_in_RPM.label = Fan In (rpm) -channel-type.comfoair.fan_in_RPM.description = Current absolute speed (rpm) of incoming fan +channel-type.comfoair.fan_in_RPM.description = Current rotational speed of incoming fan channel-type.comfoair.fan_in_percent.label = Fan In (%) channel-type.comfoair.fan_in_percent.description = Current relative speed (%) of incoming fan channel-type.comfoair.fan_out_0.label = Fan Out Level 0 (away) @@ -160,7 +176,7 @@ channel-type.comfoair.fan_out_2.description = Fan level 2 performance (%) of out channel-type.comfoair.fan_out_3.label = Fan Out Level 3 channel-type.comfoair.fan_out_3.description = Fan level 3 performance (%) of outgoing fan channel-type.comfoair.fan_out_RPM.label = Fan Out (rpm) -channel-type.comfoair.fan_out_RPM.description = Current absolute speed (rpm) of outgoing fan +channel-type.comfoair.fan_out_RPM.description = Current rotational speed of outgoing fan channel-type.comfoair.fan_out_percent.label = Fan Out (%) channel-type.comfoair.fan_out_percent.description = Current relative speed (%) of outgoing fan channel-type.comfoair.filter_error.label = Filter Error @@ -171,15 +187,19 @@ channel-type.comfoair.filter_reset.label = Filter Reset channel-type.comfoair.filter_reset.description = Reset filter uptime channel-type.comfoair.filter_reset.command.option.1 = Reset channel-type.comfoair.filter_weeks.label = Filter Period (P24) -channel-type.comfoair.filter_weeks.description = Usage period until filter pollution message (weeks) +channel-type.comfoair.filter_weeks.description = Usage period until filter pollution message (uses full weeks internally) channel-type.comfoair.freeze_time.label = Antifrost Duration channel-type.comfoair.freeze_time.description = Uptime of antifrost channel-type.comfoair.frost_state.label = Antifrost State channel-type.comfoair.frost_state.description = State of the antifrost control +channel-type.comfoair.frost_state.state.option.ON = Active +channel-type.comfoair.frost_state.state.option.OFF = Inactive channel-type.comfoair.ghx_speed.label = GHX Speed Up (%) channel-type.comfoair.ghx_speed.description = Speed up of the geothermal heat exchanger channel-type.comfoair.ghx_state.label = Geothermal Heat exchanger State channel-type.comfoair.ghx_state.description = State of the geothermal heat exchanger valve (ON = open / OFF = closed) +channel-type.comfoair.ghx_state.state.option.ON = Open +channel-type.comfoair.ghx_state.state.option.OFF = Closed channel-type.comfoair.ghx_temperature.label = GHX Temperature channel-type.comfoair.ghx_temperature.description = Temperature of geothermal heat exchanger sensor channel-type.comfoair.ghx_temperature_high.label = GHX Temperature (high) @@ -192,6 +212,8 @@ channel-type.comfoair.heater_power_I.label = Heater Power I-Parameter channel-type.comfoair.heater_power_I.description = Heater power I-parameter value channel-type.comfoair.heater_state.label = Heater State channel-type.comfoair.heater_state.description = State of the heater +channel-type.comfoair.heater_state.state.option.ON = Active +channel-type.comfoair.heater_state.state.option.OFF = Inactive channel-type.comfoair.heater_target_temperature.label = Heater Target Temperature channel-type.comfoair.heater_target_temperature.description = Target temperature of the heater channel-type.comfoair.heater_temperature.label = Heater Temperature @@ -286,18 +308,29 @@ channel-type.comfoair.outdoor_temperature_out.label = Outdoor Temperature Outgoi channel-type.comfoair.outdoor_temperature_out.description = Outlet air temperature (outside) channel-type.comfoair.preheater_frost_protect.label = Frost Protection channel-type.comfoair.preheater_frost_protect.description = State of the frost protection +channel-type.comfoair.preheater_frost_protect.state.option.ON = Active +channel-type.comfoair.preheater_frost_protect.state.option.OFF = Inactive channel-type.comfoair.preheater_frost_time.label = Preheater Frost Time -channel-type.comfoair.preheater_frost_time.description = Frost minutes +channel-type.comfoair.preheater_frost_time.description = Frost time channel-type.comfoair.preheater_heating.label = Preheater channel-type.comfoair.preheater_heating.description = State of the preheater +channel-type.comfoair.preheater_heating.state.option.ON = Active +channel-type.comfoair.preheater_heating.state.option.OFF = Inactive channel-type.comfoair.preheater_safety.label = Preheater Frost Safety channel-type.comfoair.preheater_safety.description = Frost safety setting +channel-type.comfoair.preheater_safety.state.option.0 = Extra-safe setting +channel-type.comfoair.preheater_safety.state.option.1 = Safe setting +channel-type.comfoair.preheater_safety.state.option.2 = Normal setting +channel-type.comfoair.preheater_safety.state.option.3 = Economy setting channel-type.comfoair.preheater_time.label = Preheater Duration channel-type.comfoair.preheater_time.description = Uptime of preheater channel-type.comfoair.preheater_valve.label = Preheater Valve channel-type.comfoair.preheater_valve.description = State of the preheater valve +channel-type.comfoair.preheater_valve.state.option.0 = Closed +channel-type.comfoair.preheater_valve.state.option.1 = Open +channel-type.comfoair.preheater_valve.state.option.2 = Unknown channel-type.comfoair.pulse_ventilation.label = Pulse Ventilation Period (P27) -channel-type.comfoair.pulse_ventilation.description = Period for pulse ventilation (min) +channel-type.comfoair.pulse_ventilation.description = Period for pulse ventilation (uses minutes internally) channel-type.comfoair.recu_size.label = Comfoair Size channel-type.comfoair.recu_size.description = Size of the ComfoAir (1 = big / 2 = small) channel-type.comfoair.recu_size.state.option.1 = Big @@ -310,3 +343,5 @@ channel-type.comfoair.target_temperature.label = Target Temperature channel-type.comfoair.target_temperature.description = Target (comfort) temperature channel-type.comfoair.v_control_state.label = 0-10V Control State channel-type.comfoair.v_control_state.description = State of the 0-10V control +channel-type.comfoair.v_control_state.state.option.ON = Active +channel-type.comfoair.v_control_state.state.option.OFF = Inactive diff --git a/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/thing/thing-types.xml index ec2b1203d..804b48404 100644 --- a/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/thing/thing-types.xml +++ b/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/thing/thing-types.xml @@ -41,6 +41,10 @@ + + 1 + + @@ -66,6 +70,11 @@ + + Zehnder + 1 + + @@ -409,6 +418,10 @@ Fan level Number + + Control + Level + @@ -424,6 +437,10 @@ Target (comfort) temperature Temperature + + Setpoint + Temperature + @@ -540,19 +557,19 @@ - Number + Number:Frequency - Current absolute speed (rpm) of incoming fan + Current rotational speed of incoming fan Number - + - Number + Number:Frequency - Current absolute speed (rpm) of outgoing fan + Current rotational speed of outgoing fan Number - + @@ -560,6 +577,10 @@ Intake air temperature (outside) Temperature + + Measurement + Temperature + @@ -568,6 +589,10 @@ Outlet air temperature (outside) Temperature + + Measurement + Temperature + @@ -576,6 +601,10 @@ Inlet air temperature (inside) Temperature + + Measurement + Temperature + @@ -584,6 +613,10 @@ Uptake air temperature (inside) Temperature + + Measurement + Temperature + @@ -648,7 +681,15 @@ State of the chimney control Switch - + + Status + + + + + + + @@ -656,7 +697,15 @@ State of the bypass (ON = open / OFF = closed) Switch - + + Status + + + + + + + @@ -664,7 +713,15 @@ State of the geothermal heat exchanger valve (ON = open / OFF = closed) Switch - + + Status + + + + + + + @@ -672,7 +729,15 @@ State of the heater Switch - + + Status + + + + + + + @@ -680,7 +745,15 @@ State of the 0-10V control Switch - + + Status + + + + + + + @@ -688,7 +761,15 @@ State of the antifrost control Switch - + + Status + + + + + + + @@ -696,7 +777,15 @@ State of the cookerhood control Switch - + + Status + + + + + + + @@ -704,7 +793,15 @@ State of the enthalpy module Switch - + + Status + + + + + + + @@ -712,6 +809,10 @@ Temperature of geothermal heat exchanger sensor Temperature + + Measurement + Temperature + @@ -720,6 +821,10 @@ Temperature of heater sensor Temperature + + Measurement + Temperature + @@ -728,6 +833,10 @@ Temperature of cookerhood sensor Temperature + + Measurement + Temperature + @@ -736,7 +845,7 @@ Uptime at level 0 (away) Time - + @@ -744,7 +853,7 @@ Uptime at level 1 Time - + @@ -752,7 +861,7 @@ Uptime at level 2 Time - + @@ -760,7 +869,7 @@ Uptime at level 3 Time - + @@ -768,7 +877,7 @@ Uptime of antifrost Time - + @@ -776,7 +885,7 @@ Uptime of preheater Time - + @@ -784,7 +893,7 @@ Hours of bypass open Time - + @@ -792,7 +901,7 @@ Uptime of the filter Time - + @@ -832,7 +941,16 @@ State of the preheater valve Number - + + Status + + + + + + + + @@ -840,7 +958,15 @@ State of the frost protection Switch - + + Status + + + + + + + @@ -848,15 +974,23 @@ State of the preheater Switch - + + Status + + + + + + + - Number + Number:Time - Frost minutes - Number - + Frost time + Time + @@ -864,7 +998,17 @@ Frost safety setting Number - + + Status + + + + + + + + + @@ -872,7 +1016,11 @@ Lower temperature of the geothermal heat exchanger Temperature - + + Setpoint + Temperature + + @@ -880,7 +1028,11 @@ Upper temperature of the geothermal heat exchanger Temperature - + + Setpoint + Temperature + + @@ -888,7 +1040,7 @@ Speed up of the geothermal heat exchanger Number - + @@ -912,7 +1064,11 @@ Target temperature of the heater Temperature - + + Setpoint + Temperature + + @@ -928,6 +1084,10 @@ Temperature of the enthalpy sensor Temperature + + Measurement + Temperature + @@ -936,6 +1096,10 @@ Humidity of the enthalpy sensor Humidity + + Measurement + Humidity + @@ -948,11 +1112,11 @@ - Number + Number:Time Timer state of the enthalpy sensor Time - + @@ -1186,67 +1350,95 @@ - Number + Number:Time - End delay for cooker hood control (min) + End delay for cooker hood control (uses minutes internally) Time - + + Setpoint + Duration + + - Number + Number:Time - Start delay for bathroom switch (min) + Start delay for bathroom switch (uses minutes internally) Time - + + Setpoint + Duration + + - Number + Number:Time - End delay for bathroom switch (min) + End delay for bathroom switch (uses minutes internally) Time - + + Setpoint + Duration + + - Number + Number:Time - End delay for L1 switch (min) + End delay for L1 switch (uses minutes internally) Time - + + Setpoint + Duration + + - Number + Number:Time - Usage period until filter pollution message (weeks) + Usage period until filter pollution message (uses full weeks internally) Time - + + Setpoint + Duration + + - Number + Number:Time - End delay (RF short actuation) for ventilation level 3 (min) + End delay (RF short actuation) for ventilation level 3 (uses minutes internally) Time - + + Setpoint + Duration + + - Number + Number:Time - End delay (RF long actuation) for ventilation level 3 (min) + End delay (RF long actuation) for ventilation level 3 (uses minutes internally) Time - + - Number + Number:Time - Period for pulse ventilation (min) + Period for pulse ventilation (uses minutes internally) Time - + + Setpoint + Duration + + @@ -1270,7 +1462,12 @@ State of analog input Switch - + + + + + + @@ -1278,7 +1475,12 @@ State of RF input Switch - + + + + + + @@ -1286,7 +1488,12 @@ Postive/Negative state of analog input Switch - + + + + + + @@ -1294,7 +1501,12 @@ Postive/Negative state of RF input Switch - + + + + + + @@ -1302,6 +1514,10 @@ Voltage level of analog input Number + + Measurement + Voltage + diff --git a/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/update/instructions.xml b/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/update/instructions.xml new file mode 100644 index 000000000..c6b6847d2 --- /dev/null +++ b/bundles/org.openhab.binding.comfoair/src/main/resources/OH-INF/update/instructions.xml @@ -0,0 +1,126 @@ + + + + + + + + comfoair:fan_in_RPM + + + + comfoair:fan_out_RPM + + + + comfoair:bathroom_start_delay + + + + comfoair:bathroom_end_delay + + + + comfoair:L1_end_delay + + + + comfoair:pulse_ventilation + + + + comfoair:filter_weeks + + + + comfoair:RF_short_delay + + + + comfoair:RF_long_delay + + + + comfoair:cookerhood_delay + + + + comfoair:enthalpy_time + + + + comfoair:preheater_frost_time + + + + comfoair:preheater_safety + + + + comfoair:ghx_temperature_low + + + + comfoair:ghx_temperature_high + + + + comfoair:ghx_speed + + + + comfoair:heater_target_temperature + + + + + + + + + + comfoair:fan_in_RPM + + + + comfoair:fan_out_RPM + + + + comfoair:bathroom_start_delay + + + + comfoair:bathroom_end_delay + + + + comfoair:L1_end_delay + + + + comfoair:filter_weeks + + + + comfoair:RF_short_delay + + + + comfoair:RF_long_delay + + + + comfoair:preheater_frost_time + + + + comfoair:preheater_safety + + + + + +