[comfoair] extend UoM support, add semantic tags & update state descriptions (#15167)

* 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 <h.boehm@gmx.at>
This commit is contained in:
Hans Böhm 2023-07-03 17:45:45 +02:00 committed by GitHub
parent f0bdeff81b
commit 4ddb3ce7e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 592 additions and 148 deletions

View File

@ -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#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#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#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#fanInRPM | Number:Frequency | 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#fanOutRPM | Number:Frequency | Fan Out (rpm) | Current absolute speed (rpm) of outgoing fan | true | yes |
| **Temperature Values** | | | | | | | **Temperature Values** | | | | | |
| temperatures#targetTemperature | Number:Temperature | Target Temperature | Target (comfort) temperature | false | no | | temperatures#targetTemperature | Number:Temperature | Target Temperature | Target (comfort) temperature | false | no |
| temperatures#outdoorTemperatureIn | Number:Temperature | Outdoor Temperature Incoming | Intake air temperature (outside) | true | yes | | 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#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 | | menuP1#menu29Mode | Switch | Menu 29 Mode (P19) | State of menu 29 mode (P19) | true | yes |
| **Menu P2: Delay Settings** | | | | | | | **Menu P2: Delay Settings** | | | | | |
| menuP2#bathroomStartDelay | Number | Menu P21 | Start delay for bathroom switch (min) | false | yes | | menuP2#bathroomStartDelay | Number:Time | Menu P21 | Start delay for bathroom switch (uses minutes internally) | false | yes |
| menuP2#bathroomEndDelay | Number | Menu P22 | End delay for bathroom switch (min) | false | yes | | menuP2#bathroomEndDelay | Number:Time | Menu P22 | End delay for bathroom switch (uses minutes internally) | false | yes |
| menuP2#L1EndDelay | Number | Menu P23 | End delay for L1 switch (min) | false | yes | | menuP2#L1EndDelay | Number:Time | Menu P23 | End delay for L1 switch (uses minutes internally) | false | yes |
| menuP2#pulseVentilation | Number | Menu P27 | Period for pulse ventilation (min) | false | yes | | menuP2#pulseVentilation | Number:Time | Menu P27 | Period for pulse ventilation (uses minutes internally) | false | yes |
| menuP2#filterWeeks | Number | Menu P24 | Usage period until filter pollution message (weeks) | false | yes | | menuP2#filterWeeks | Number:Time | Menu P24 | Usage period until filter pollution message (uses weeks internally) | false | yes |
| menuP2#RFShortDelay | Number | Menu P25 | End delay (RF short actuation) for ventilation level 3 (min) | 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 | Menu P26 | End delay (RF long actuation) for ventilation level 3 (min) | 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 | Menu P20 | End delay for cooker hood control (min) | false | yes | | menuP2#cookerhoodDelay | Number:Time | Menu P20 | End delay for cooker hood control (uses minutes internally) | false | yes |
| **Menu P9: Option States** | | | | | | | **Menu P9: Option States** | | | | | |
| menuP9#chimneyState | Switch | Chimney Control State | State of the chimney control | true | yes | | 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 | | 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#preheaterValve | Number | Preheater Valve | State of the preheater valve | true | yes |
| preheater#preheaterFrostProtect | Switch | Frost Protection | State of the frost protection | 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#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 | | preheater#preheaterSafety | Number | Preheater Frost Safety | Frost safety setting | true | yes |
| **GHX Values** | | | | | | | **GHX Values** | | | | | |
| ewt#ewtTemperatureLow | Number:Temperature | GHX Temperature (low) | Lower temperature of the geothermal heat exchanger | true | yes | | 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#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#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#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** | | | | | | | **Option Settings** | | | | | |
| options#isPreheater | Switch | Preheater | Preheater option installed | true | yes | | options#isPreheater | Switch | Preheater | Preheater option installed | true | yes |
| options#isBypass | Switch | Bypass | Bypass option installed | true | yes | | options#isBypass | Switch | Bypass | Bypass option installed | true | yes |

View File

@ -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.DataTypeTime;
import org.openhab.binding.comfoair.internal.datatypes.DataTypeVolt; import org.openhab.binding.comfoair.internal.datatypes.DataTypeVolt;
import org.openhab.core.library.types.DecimalType; 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.Command;
import org.openhab.core.types.State; import org.openhab.core.types.State;
import org.openhab.core.types.UnDefType;
/** /**
* Represents all valid commands which could be processed by this binding * 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 }, DataTypeBoolean.getInstance(), Constants.REQUEST_GET_STATES, Constants.REPLY_GET_STATES, new int[] { 7 },
0x02), 0x02),
BATHROOM_START_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_BR_START_DELAY, 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 }), Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 0 }),
BATHROOM_END_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_BR_END_DELAY, 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 }), Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 1 }),
L1_END_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_L1_END_DELAY, 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 }), Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 2 }),
PULSE_VENTILATION(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_PULSE_VENTILATION, 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 }), Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 3 }),
FILTER_WEEKS(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_FILTER_WEEKS, 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 }), Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 4 }),
RF_SHORT_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_RF_SHORT_DELAY, 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 }), Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 5 }),
RF_LONG_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_RF_LONG_DELAY, 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 }), Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 6 }),
COOKERHOOD_DELAY(ComfoAirBindingConstants.CG_MENUP2_PREFIX + ComfoAirBindingConstants.CHANNEL_COOKERHOOD_DELAY, 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 }), Constants.REQUEST_GET_DELAYS, Constants.REPLY_GET_DELAYS, new int[] { 7 }),
CHIMNEY_STATE(ComfoAirBindingConstants.CG_MENUP9_PREFIX + ComfoAirBindingConstants.CHANNEL_CHIMNEY_STATE, CHIMNEY_STATE(ComfoAirBindingConstants.CG_MENUP9_PREFIX + ComfoAirBindingConstants.CHANNEL_CHIMNEY_STATE,
DataTypeBoolean.getInstance(), Constants.REQUEST_GET_STATES, Constants.REPLY_GET_STATES, new int[] { 8 }, 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, ENTHALPY_LEVEL(ComfoAirBindingConstants.CG_ENTHALPY_PREFIX + ComfoAirBindingConstants.CHANNEL_ENTHALPY_LEVEL,
DataTypeNumber.getInstance(), Constants.REQUEST_GET_SENSORS, Constants.REPLY_GET_SENSORS, new int[] { 4 }), DataTypeNumber.getInstance(), Constants.REQUEST_GET_SENSORS, Constants.REPLY_GET_SENSORS, new int[] { 4 }),
ENTHALPY_TIME(ComfoAirBindingConstants.CG_ENTHALPY_PREFIX + ComfoAirBindingConstants.CHANNEL_ENTHALPY_TIME, 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, PREHEATER_VALVE(ComfoAirBindingConstants.CG_PREHEATER_PREFIX + ComfoAirBindingConstants.CHANNEL_PREHEATER_VALVE,
DataTypeNumber.getInstance(), Constants.REQUEST_GET_PREHEATER, Constants.REPLY_GET_PREHEATER, DataTypeNumber.getInstance(), Constants.REQUEST_GET_PREHEATER, Constants.REPLY_GET_PREHEATER,
new int[] { 0 }), new int[] { 0 }),
@ -242,7 +240,7 @@ public enum ComfoAirCommandType {
new int[] { 2 }), new int[] { 2 }),
PREHEATER_FROST_TIME( PREHEATER_FROST_TIME(
ComfoAirBindingConstants.CG_PREHEATER_PREFIX + ComfoAirBindingConstants.CHANNEL_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 }), new int[] { 3, 4 }),
PREHEATER_OPTION(ComfoAirBindingConstants.CG_PREHEATER_PREFIX + ComfoAirBindingConstants.CHANNEL_PREHEATER_SAFETY, PREHEATER_OPTION(ComfoAirBindingConstants.CG_PREHEATER_PREFIX + ComfoAirBindingConstants.CHANNEL_PREHEATER_SAFETY,
DataTypeNumber.getInstance(), Constants.REQUEST_GET_PREHEATER, Constants.REPLY_GET_PREHEATER, DataTypeNumber.getInstance(), Constants.REQUEST_GET_PREHEATER, Constants.REPLY_GET_PREHEATER,
@ -786,29 +784,22 @@ public enum ComfoAirCommandType {
* new state * new state
* @return initialized ComfoAirCommand * @return initialized ComfoAirCommand
*/ */
@SuppressWarnings("PMD.CompareObjectsWithEquals")
public static @Nullable ComfoAirCommand getChangeCommand(String key, Command command) { public static @Nullable ComfoAirCommand getChangeCommand(String key, Command command) {
ComfoAirCommandType commandType = getCommandTypeByKey(key); ComfoAirCommandType commandType = getCommandTypeByKey(key);
State value = UnDefType.NULL;
if (commandType != null) { if (commandType != null) {
ComfoAirDataType dataType = commandType.getDataType(); 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) { State value = (State) command;
int dataPosition = commandType.getChangeDataPos();
return new ComfoAirCommand(key, commandType.changeCommand, null, data, dataPosition, intValue); 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);
} }
} }
} }

View File

@ -79,9 +79,19 @@ public class ComfoAirSerialConnector {
SerialPort serialPort = portIdentifier.open(this.getClass().getName(), 3000); SerialPort serialPort = portIdentifier.open(this.getClass().getName(), 3000);
serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE); SerialPort.PARITY_NONE);
serialPort.enableReceiveThreshold(1);
serialPort.enableReceiveTimeout(1000);
serialPort.notifyOnDataAvailable(true); 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; this.serialPort = serialPort;
inputStream = new DataInputStream(new BufferedInputStream(serialPort.getInputStream())); inputStream = new DataInputStream(new BufferedInputStream(serialPort.getInputStream()));

View File

@ -16,6 +16,8 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.comfoair.internal.ComfoAirCommandType; import org.openhab.binding.comfoair.internal.ComfoAirCommandType;
import org.openhab.core.library.types.DecimalType; 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.State;
import org.openhab.core.types.UnDefType; import org.openhab.core.types.UnDefType;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -52,20 +54,32 @@ public class DataTypeRPM implements ComfoAirDataType {
return UnDefType.NULL; return UnDefType.NULL;
} }
// transferred value is (1875000 / rpm) per protocol // transferred value is (1875000 / rpm) per protocol
return new DecimalType((int) (1875000.0 / value)); return new QuantityType<>((int) (1875000.0 / value), Units.RPM);
} }
} }
@Override @Override
public int @Nullable [] convertFromState(State value, ComfoAirCommandType commandType) { 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"); logger.trace("\"DataTypeRPM\" class \"convertFromState\" undefined state");
return null; 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;
} }
} }

View File

@ -15,6 +15,7 @@ package org.openhab.binding.comfoair.internal.datatypes;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.comfoair.internal.ComfoAirCommandType; 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.types.QuantityType;
import org.openhab.core.library.unit.SIUnits; import org.openhab.core.library.unit.SIUnits;
import org.openhab.core.types.State; import org.openhab.core.types.State;
@ -63,18 +64,28 @@ public class DataTypeTemperature implements ComfoAirDataType {
@Override @Override
public int @Nullable [] convertFromState(State value, ComfoAirCommandType commandType) { public int @Nullable [] convertFromState(State value, ComfoAirCommandType commandType) {
int[] template = commandType.getChangeDataTemplate(); int[] template = commandType.getChangeDataTemplate();
QuantityType<?> celsius = ((QuantityType<?>) value).toUnit(SIUnits.CELSIUS); float celsius;
if (celsius != null) { if (value instanceof QuantityType<?> qt) {
if (commandType.getReadCommand() == ComfoAirCommandType.Constants.REQUEST_GET_GHX) { QuantityType<?> qtCelsius = qt.toUnit(SIUnits.CELSIUS);
template[commandType.getChangeDataPos()] = celsius.intValue();
if (qtCelsius != null) {
celsius = qtCelsius.floatValue();
} else { } else {
template[commandType.getChangeDataPos()] = (int) (celsius.doubleValue() + 20) * 2; return null;
} }
return template; } else if (value instanceof DecimalType dt) {
celsius = dt.floatValue();
} else { } else {
logger.trace("\"DataTypeTemperature\" class \"convertFromState\" undefined state"); logger.trace("\"DataTypeTemperature\" class \"convertFromState\" undefined state");
return null; 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;
} }
} }

View File

@ -15,6 +15,7 @@ package org.openhab.binding.comfoair.internal.datatypes;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.comfoair.internal.ComfoAirCommandType; 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.types.QuantityType;
import org.openhab.core.library.unit.Units; import org.openhab.core.library.unit.Units;
import org.openhab.core.types.State; import org.openhab.core.types.State;
@ -52,6 +53,16 @@ public class DataTypeTime implements ComfoAirDataType {
return UnDefType.NULL; 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); return new QuantityType<>(value, Units.HOUR);
} }
} }
@ -61,25 +72,44 @@ public class DataTypeTime implements ComfoAirDataType {
int[] template = commandType.getChangeDataTemplate(); int[] template = commandType.getChangeDataTemplate();
int[] possibleValues = commandType.getPossibleValues(); int[] possibleValues = commandType.getPossibleValues();
int position = commandType.getChangeDataPos(); int position = commandType.getChangeDataPos();
QuantityType<?> hours = ((QuantityType<?>) value).toUnit(Units.HOUR); int intValue;
if (hours != null) { if (value instanceof QuantityType<?> qt) {
int intValue = hours.intValue(); QuantityType<?> internalQuantity = new QuantityType<>();
if (possibleValues == null) { if (commandType.getReadCommand() == ComfoAirCommandType.Constants.REQUEST_GET_DELAYS
template[position] = intValue; || commandType.getReadCommand() == ComfoAirCommandType.Constants.REQUEST_GET_PREHEATER) {
} else { if (commandType == ComfoAirCommandType.FILTER_WEEKS) {
for (int i = 0; i < possibleValues.length; i++) { internalQuantity = qt.toUnit(Units.WEEK);
if (possibleValues[i] == intValue) { } else {
template[position] = intValue; internalQuantity = qt.toUnit(Units.MINUTE);
break;
}
} }
} 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 { } else {
logger.trace("\"DataTypeTime\" class \"convertFromState\" undefined state"); logger.trace("\"DataTypeTime\" class \"convertFromState\" undefined state");
return null; 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;
} }
} }

View File

@ -15,6 +15,7 @@ package org.openhab.binding.comfoair.internal.datatypes;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.comfoair.internal.ComfoAirCommandType; 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.types.QuantityType;
import org.openhab.core.library.unit.Units; import org.openhab.core.library.unit.Units;
import org.openhab.core.types.State; import org.openhab.core.types.State;
@ -44,7 +45,7 @@ public class DataTypeVolt implements ComfoAirDataType {
@Override @Override
public State convertToState(int @Nullable [] data, ComfoAirCommandType commandType) { public State convertToState(int @Nullable [] data, ComfoAirCommandType commandType) {
if (data == null) { if (data == null) {
logger.trace("\"DataTypeVolt\" class \"convertToState\" method parameter: null"); logger.trace("\"DataTypeVoltage\" class \"convertToState\" method parameter: null");
return UnDefType.NULL; return UnDefType.NULL;
} else { } else {
int[] readReplyDataPos = commandType.getReadReplyDataPos(); int[] readReplyDataPos = commandType.getReadReplyDataPos();
@ -59,14 +60,24 @@ public class DataTypeVolt implements ComfoAirDataType {
@Override @Override
public int @Nullable [] convertFromState(State value, ComfoAirCommandType commandType) { public int @Nullable [] convertFromState(State value, ComfoAirCommandType commandType) {
int[] template = commandType.getChangeDataTemplate(); int[] template = commandType.getChangeDataTemplate();
QuantityType<?> volts = ((QuantityType<?>) value).toUnit(Units.VOLT); float volt;
if (volts != null) { if (value instanceof QuantityType<?> qt) {
template[commandType.getChangeDataPos()] = (int) (volts.doubleValue() * 255 / 10); QuantityType<?> qtVolt = qt.toUnit(Units.VOLT);
return template;
if (qtVolt != null) {
volt = qtVolt.floatValue();
} else {
return null;
}
} else if (value instanceof DecimalType dt) {
volt = dt.floatValue();
} else { } else {
logger.trace("\"DataTypeVolt\" class \"convertFromState\" undefined state"); logger.trace("\"DataTypeVolt\" class \"convertFromState\" undefined state");
return null; return null;
} }
template[commandType.getChangeDataPos()] = (int) (volt * 255 / 10);
return template;
} }
} }

View File

@ -53,19 +53,23 @@ channel-group-type.comfoair.ventilation_WHR930.label = Ventilation Values
# channel types # channel types
channel-type.comfoair.L1_end_delay.label = L1 Switch End Delay (P23) 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.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.label = RF Input Max
channel-type.comfoair.RF_max.description = Maximum setting for RF input 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.label = RF Input Min
channel-type.comfoair.RF_min.description = Minimum setting for RF input 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.label = RF Input State
channel-type.comfoair.RF_mode.description = State of RF input 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.label = RF Input Postive/Negative
channel-type.comfoair.RF_negative.description = Postive/Negative state of RF input 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.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.label = RF Input Target
channel-type.comfoair.RF_value.description = Target setting for RF input channel-type.comfoair.RF_value.description = Target setting for RF input
channel-type.comfoair.activate.label = Activate Binding Control 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_min.description = Minimum setting for analog input
channel-type.comfoair.analog_mode.label = Analog Input State channel-type.comfoair.analog_mode.label = Analog Input State
channel-type.comfoair.analog_mode.description = State of analog input 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.label = Analog Input Postive/Negative
channel-type.comfoair.analog_negative.description = Postive/Negative state of analog input 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.label = Analog Priority
channel-type.comfoair.analog_priority.description = Priority of analog inputs for highest fan level channel-type.comfoair.analog_priority.description = Priority of analog inputs for highest fan level
channel-type.comfoair.analog_priority.state.option.0 = Analog inputs 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.label = Analog Input Voltage Level
channel-type.comfoair.analog_volt.description = Voltage level of analog input 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.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.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.label = Bypass Correction
channel-type.comfoair.bypass_correction.description = Bypass correction state channel-type.comfoair.bypass_correction.description = Bypass correction state
channel-type.comfoair.bypass_factor.label = Bypass Factor 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_level.description = Bypass level state
channel-type.comfoair.bypass_state.label = Bypass 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.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.label = Bypass Summer Mode
channel-type.comfoair.bypass_summer.description = 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.label = Bypass Duration
channel-type.comfoair.bypass_time.description = Hours of bypass open channel-type.comfoair.bypass_time.description = Hours of bypass open
channel-type.comfoair.chimney_state.label = Chimney Control State 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.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.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.label = Cookerhood Speed Up (%)
channel-type.comfoair.cookerhood_speed.description = Speed up of the cookerhood channel-type.comfoair.cookerhood_speed.description = Speed up of the cookerhood
channel-type.comfoair.cookerhood_state.label = Cookerhood State channel-type.comfoair.cookerhood_state.label = Cookerhood State
channel-type.comfoair.cookerhood_state.description = State of the cookerhood control 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.label = Cookerhood Temperature
channel-type.comfoair.cookerhood_temperature.description = Temperature of cookerhood sensor channel-type.comfoair.cookerhood_temperature.description = Temperature of cookerhood sensor
channel-type.comfoair.enthalpy_humidity.label = Enthalpy Sensor Humidity 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_level.description = Level of the enthalpy sensor
channel-type.comfoair.enthalpy_state.label = Enthalpy State channel-type.comfoair.enthalpy_state.label = Enthalpy State
channel-type.comfoair.enthalpy_state.description = State of the enthalpy module 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.label = Enthalpy Sensor Temperature
channel-type.comfoair.enthalpy_temperature.description = Temperature of the enthalpy sensor channel-type.comfoair.enthalpy_temperature.description = Temperature of the enthalpy sensor
channel-type.comfoair.enthalpy_time.label = Enthalpy Sensor Timer 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.label = Fan In Level 3
channel-type.comfoair.fan_in_3.description = Fan level 3 performance (%) of incoming fan 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.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.label = Fan In (%)
channel-type.comfoair.fan_in_percent.description = Current relative speed (%) of incoming fan 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) 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.label = Fan Out Level 3
channel-type.comfoair.fan_out_3.description = Fan level 3 performance (%) of outgoing fan 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.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.label = Fan Out (%)
channel-type.comfoair.fan_out_percent.description = Current relative speed (%) of outgoing fan channel-type.comfoair.fan_out_percent.description = Current relative speed (%) of outgoing fan
channel-type.comfoair.filter_error.label = Filter Error 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.description = Reset filter uptime
channel-type.comfoair.filter_reset.command.option.1 = Reset channel-type.comfoair.filter_reset.command.option.1 = Reset
channel-type.comfoair.filter_weeks.label = Filter Period (P24) 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.label = Antifrost Duration
channel-type.comfoair.freeze_time.description = Uptime of antifrost channel-type.comfoair.freeze_time.description = Uptime of antifrost
channel-type.comfoair.frost_state.label = Antifrost State channel-type.comfoair.frost_state.label = Antifrost State
channel-type.comfoair.frost_state.description = State of the antifrost control 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.label = GHX Speed Up (%)
channel-type.comfoair.ghx_speed.description = Speed up of the geothermal heat exchanger 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.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.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.label = GHX Temperature
channel-type.comfoair.ghx_temperature.description = Temperature of geothermal heat exchanger sensor channel-type.comfoair.ghx_temperature.description = Temperature of geothermal heat exchanger sensor
channel-type.comfoair.ghx_temperature_high.label = GHX Temperature (high) 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_power_I.description = Heater power I-parameter value
channel-type.comfoair.heater_state.label = Heater State channel-type.comfoair.heater_state.label = Heater State
channel-type.comfoair.heater_state.description = State of the heater 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.label = Heater Target Temperature
channel-type.comfoair.heater_target_temperature.description = Target temperature of the heater channel-type.comfoair.heater_target_temperature.description = Target temperature of the heater
channel-type.comfoair.heater_temperature.label = Heater Temperature 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.outdoor_temperature_out.description = Outlet air temperature (outside)
channel-type.comfoair.preheater_frost_protect.label = Frost Protection 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.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.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.label = Preheater
channel-type.comfoair.preheater_heating.description = State of the 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.label = Preheater Frost Safety
channel-type.comfoair.preheater_safety.description = Frost safety setting 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.label = Preheater Duration
channel-type.comfoair.preheater_time.description = Uptime of preheater channel-type.comfoair.preheater_time.description = Uptime of preheater
channel-type.comfoair.preheater_valve.label = Preheater Valve channel-type.comfoair.preheater_valve.label = Preheater Valve
channel-type.comfoair.preheater_valve.description = State of the 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.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.label = Comfoair Size
channel-type.comfoair.recu_size.description = Size of the ComfoAir (1 = big / 2 = small) channel-type.comfoair.recu_size.description = Size of the ComfoAir (1 = big / 2 = small)
channel-type.comfoair.recu_size.state.option.1 = Big 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.target_temperature.description = Target (comfort) temperature
channel-type.comfoair.v_control_state.label = 0-10V Control State 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.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

View File

@ -41,6 +41,10 @@
<channel-group id="resets" typeId="resets"/> <channel-group id="resets" typeId="resets"/>
</channel-groups> </channel-groups>
<properties>
<property name="thingTypeVersion">1</property>
</properties>
<config-description-ref uri="thing-type:comfoair:serial"/> <config-description-ref uri="thing-type:comfoair:serial"/>
</thing-type> </thing-type>
@ -66,6 +70,11 @@
<channel-group id="resets" typeId="resets"/> <channel-group id="resets" typeId="resets"/>
</channel-groups> </channel-groups>
<properties>
<property name="vendor">Zehnder</property>
<property name="thingTypeVersion">1</property>
</properties>
<config-description-ref uri="thing-type:comfoair:serial"/> <config-description-ref uri="thing-type:comfoair:serial"/>
</thing-type> </thing-type>
@ -409,6 +418,10 @@
<label>Fan Level</label> <label>Fan Level</label>
<description>Fan level</description> <description>Fan level</description>
<category>Number</category> <category>Number</category>
<tags>
<tag>Control</tag>
<tag>Level</tag>
</tags>
<state readOnly="false"> <state readOnly="false">
<options> <options>
<option value="1">Away</option> <option value="1">Away</option>
@ -424,6 +437,10 @@
<label>Target Temperature</label> <label>Target Temperature</label>
<description>Target (comfort) temperature</description> <description>Target (comfort) temperature</description>
<category>Temperature</category> <category>Temperature</category>
<tags>
<tag>Setpoint</tag>
<tag>Temperature</tag>
</tags>
<state min="12" max="28" step="0.5" pattern="%.1f %unit%" readOnly="false"/> <state min="12" max="28" step="0.5" pattern="%.1f %unit%" readOnly="false"/>
</channel-type> </channel-type>
@ -540,19 +557,19 @@
</channel-type> </channel-type>
<channel-type id="fan_in_RPM" advanced="true"> <channel-type id="fan_in_RPM" advanced="true">
<item-type>Number</item-type> <item-type>Number:Frequency</item-type>
<label>Fan In (rpm)</label> <label>Fan In (rpm)</label>
<description>Current absolute speed (rpm) of incoming fan</description> <description>Current rotational speed of incoming fan</description>
<category>Number</category> <category>Number</category>
<state readOnly="true"/> <state readOnly="true" pattern="%.0f rpm"/>
</channel-type> </channel-type>
<channel-type id="fan_out_RPM" advanced="true"> <channel-type id="fan_out_RPM" advanced="true">
<item-type>Number</item-type> <item-type>Number:Frequency</item-type>
<label>Fan Out (rpm)</label> <label>Fan Out (rpm)</label>
<description>Current absolute speed (rpm) of outgoing fan</description> <description>Current rotational speed of outgoing fan</description>
<category>Number</category> <category>Number</category>
<state readOnly="true"/> <state readOnly="true" pattern="%.0f rpm"/>
</channel-type> </channel-type>
<channel-type id="outdoor_temperature_in"> <channel-type id="outdoor_temperature_in">
@ -560,6 +577,10 @@
<label>Outdoor Temperature Incoming</label> <label>Outdoor Temperature Incoming</label>
<description>Intake air temperature (outside)</description> <description>Intake air temperature (outside)</description>
<category>Temperature</category> <category>Temperature</category>
<tags>
<tag>Measurement</tag>
<tag>Temperature</tag>
</tags>
<state readOnly="true" pattern="%.1f %unit%"/> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
@ -568,6 +589,10 @@
<label>Outdoor Temperature Outgoing</label> <label>Outdoor Temperature Outgoing</label>
<description>Outlet air temperature (outside)</description> <description>Outlet air temperature (outside)</description>
<category>Temperature</category> <category>Temperature</category>
<tags>
<tag>Measurement</tag>
<tag>Temperature</tag>
</tags>
<state readOnly="true" pattern="%.1f %unit%"/> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
@ -576,6 +601,10 @@
<label>Indoor Temperature Incoming</label> <label>Indoor Temperature Incoming</label>
<description>Inlet air temperature (inside)</description> <description>Inlet air temperature (inside)</description>
<category>Temperature</category> <category>Temperature</category>
<tags>
<tag>Measurement</tag>
<tag>Temperature</tag>
</tags>
<state readOnly="true" pattern="%.1f %unit%"/> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
@ -584,6 +613,10 @@
<label>Indoor Temperature Outgoing</label> <label>Indoor Temperature Outgoing</label>
<description>Uptake air temperature (inside)</description> <description>Uptake air temperature (inside)</description>
<category>Temperature</category> <category>Temperature</category>
<tags>
<tag>Measurement</tag>
<tag>Temperature</tag>
</tags>
<state readOnly="true" pattern="%.1f %unit%"/> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
@ -648,7 +681,15 @@
<label>Chimney Control State</label> <label>Chimney Control State</label>
<description>State of the chimney control</description> <description>State of the chimney control</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Active</option>
<option value="OFF">Inactive</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="bypass_state" advanced="true"> <channel-type id="bypass_state" advanced="true">
@ -656,7 +697,15 @@
<label>Bypass State</label> <label>Bypass State</label>
<description>State of the bypass (ON = open / OFF = closed)</description> <description>State of the bypass (ON = open / OFF = closed)</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Open</option>
<option value="OFF">Closed</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="ghx_state" advanced="true"> <channel-type id="ghx_state" advanced="true">
@ -664,7 +713,15 @@
<label>Geothermal Heat exchanger State</label> <label>Geothermal Heat exchanger State</label>
<description>State of the geothermal heat exchanger valve (ON = open / OFF = closed)</description> <description>State of the geothermal heat exchanger valve (ON = open / OFF = closed)</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Open</option>
<option value="OFF">Closed</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="heater_state" advanced="true"> <channel-type id="heater_state" advanced="true">
@ -672,7 +729,15 @@
<label>Heater State</label> <label>Heater State</label>
<description>State of the heater</description> <description>State of the heater</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Active</option>
<option value="OFF">Inactive</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="v_control_state" advanced="true"> <channel-type id="v_control_state" advanced="true">
@ -680,7 +745,15 @@
<label>0-10V Control State</label> <label>0-10V Control State</label>
<description>State of the 0-10V control</description> <description>State of the 0-10V control</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Active</option>
<option value="OFF">Inactive</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="frost_state" advanced="true"> <channel-type id="frost_state" advanced="true">
@ -688,7 +761,15 @@
<label>Antifrost State</label> <label>Antifrost State</label>
<description>State of the antifrost control</description> <description>State of the antifrost control</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Active</option>
<option value="OFF">Inactive</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="cookerhood_state" advanced="true"> <channel-type id="cookerhood_state" advanced="true">
@ -696,7 +777,15 @@
<label>Cookerhood State</label> <label>Cookerhood State</label>
<description>State of the cookerhood control</description> <description>State of the cookerhood control</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Active</option>
<option value="OFF">Inactive</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="enthalpy_state" advanced="true"> <channel-type id="enthalpy_state" advanced="true">
@ -704,7 +793,15 @@
<label>Enthalpy State</label> <label>Enthalpy State</label>
<description>State of the enthalpy module</description> <description>State of the enthalpy module</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Active</option>
<option value="OFF">Inactive</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="ghx_temperature" advanced="true"> <channel-type id="ghx_temperature" advanced="true">
@ -712,6 +809,10 @@
<label>GHX Temperature</label> <label>GHX Temperature</label>
<description>Temperature of geothermal heat exchanger sensor</description> <description>Temperature of geothermal heat exchanger sensor</description>
<category>Temperature</category> <category>Temperature</category>
<tags>
<tag>Measurement</tag>
<tag>Temperature</tag>
</tags>
<state readOnly="true" pattern="%.1f %unit%"/> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
@ -720,6 +821,10 @@
<label>Heater Temperature</label> <label>Heater Temperature</label>
<description>Temperature of heater sensor</description> <description>Temperature of heater sensor</description>
<category>Temperature</category> <category>Temperature</category>
<tags>
<tag>Measurement</tag>
<tag>Temperature</tag>
</tags>
<state readOnly="true" pattern="%.1f %unit%"/> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
@ -728,6 +833,10 @@
<label>Cookerhood Temperature</label> <label>Cookerhood Temperature</label>
<description>Temperature of cookerhood sensor</description> <description>Temperature of cookerhood sensor</description>
<category>Temperature</category> <category>Temperature</category>
<tags>
<tag>Measurement</tag>
<tag>Temperature</tag>
</tags>
<state readOnly="true" pattern="%.1f %unit%"/> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
@ -736,7 +845,7 @@
<label>Level 0 Duration</label> <label>Level 0 Duration</label>
<description>Uptime at level 0 (away)</description> <description>Uptime at level 0 (away)</description>
<category>Time</category> <category>Time</category>
<state readOnly="true" pattern="%.0f %unit%"/> <state readOnly="true" pattern="%.0f h"/>
</channel-type> </channel-type>
<channel-type id="level1_time" advanced="true"> <channel-type id="level1_time" advanced="true">
@ -744,7 +853,7 @@
<label>Level 1 Duration</label> <label>Level 1 Duration</label>
<description>Uptime at level 1</description> <description>Uptime at level 1</description>
<category>Time</category> <category>Time</category>
<state readOnly="true" pattern="%.0f %unit%"/> <state readOnly="true" pattern="%.0f h"/>
</channel-type> </channel-type>
<channel-type id="level2_time" advanced="true"> <channel-type id="level2_time" advanced="true">
@ -752,7 +861,7 @@
<label>Level 2 Duration</label> <label>Level 2 Duration</label>
<description>Uptime at level 2</description> <description>Uptime at level 2</description>
<category>Time</category> <category>Time</category>
<state readOnly="true" pattern="%.0f %unit%"/> <state readOnly="true" pattern="%.0f h"/>
</channel-type> </channel-type>
<channel-type id="level3_time" advanced="true"> <channel-type id="level3_time" advanced="true">
@ -760,7 +869,7 @@
<label>Level 3 Duration</label> <label>Level 3 Duration</label>
<description>Uptime at level 3</description> <description>Uptime at level 3</description>
<category>Time</category> <category>Time</category>
<state readOnly="true" pattern="%.0f %unit%"/> <state readOnly="true" pattern="%.0f h"/>
</channel-type> </channel-type>
<channel-type id="freeze_time" advanced="true"> <channel-type id="freeze_time" advanced="true">
@ -768,7 +877,7 @@
<label>Antifrost Duration</label> <label>Antifrost Duration</label>
<description>Uptime of antifrost</description> <description>Uptime of antifrost</description>
<category>Time</category> <category>Time</category>
<state readOnly="true" pattern="%.0f %unit%"/> <state readOnly="true" pattern="%.0f h"/>
</channel-type> </channel-type>
<channel-type id="preheater_time" advanced="true"> <channel-type id="preheater_time" advanced="true">
@ -776,7 +885,7 @@
<label>Preheater Duration</label> <label>Preheater Duration</label>
<description>Uptime of preheater</description> <description>Uptime of preheater</description>
<category>Time</category> <category>Time</category>
<state readOnly="true" pattern="%.0f %unit%"/> <state readOnly="true" pattern="%.0f h"/>
</channel-type> </channel-type>
<channel-type id="bypass_time" advanced="true"> <channel-type id="bypass_time" advanced="true">
@ -784,7 +893,7 @@
<label>Bypass Duration</label> <label>Bypass Duration</label>
<description>Hours of bypass open</description> <description>Hours of bypass open</description>
<category>Time</category> <category>Time</category>
<state readOnly="true" pattern="%.0f %unit%"/> <state readOnly="true" pattern="%.0f h"/>
</channel-type> </channel-type>
<channel-type id="filter_hours"> <channel-type id="filter_hours">
@ -792,7 +901,7 @@
<label>Filter Duration</label> <label>Filter Duration</label>
<description>Uptime of the filter</description> <description>Uptime of the filter</description>
<category>Time</category> <category>Time</category>
<state readOnly="true" pattern="%.0f %unit%"/> <state readOnly="true" pattern="%.0f h"/>
</channel-type> </channel-type>
<channel-type id="bypass_factor" advanced="true"> <channel-type id="bypass_factor" advanced="true">
@ -832,7 +941,16 @@
<label>Preheater Valve</label> <label>Preheater Valve</label>
<description>State of the preheater valve</description> <description>State of the preheater valve</description>
<category>Number</category> <category>Number</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="0">Closed</option>
<option value="1">Open</option>
<option value="2">Unknown</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="preheater_frost_protect" advanced="true"> <channel-type id="preheater_frost_protect" advanced="true">
@ -840,7 +958,15 @@
<label>Frost Protection</label> <label>Frost Protection</label>
<description>State of the frost protection</description> <description>State of the frost protection</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Active</option>
<option value="OFF">Inactive</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="preheater_heating" advanced="true"> <channel-type id="preheater_heating" advanced="true">
@ -848,15 +974,23 @@
<label>Preheater</label> <label>Preheater</label>
<description>State of the preheater</description> <description>State of the preheater</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="ON">Active</option>
<option value="OFF">Inactive</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="preheater_frost_time" advanced="true"> <channel-type id="preheater_frost_time" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>Preheater Frost Time</label> <label>Preheater Frost Time</label>
<description>Frost minutes</description> <description>Frost time</description>
<category>Number</category> <category>Time</category>
<state readOnly="true"/> <state readOnly="true" pattern="%.0f min"/>
</channel-type> </channel-type>
<channel-type id="preheater_safety" advanced="true"> <channel-type id="preheater_safety" advanced="true">
@ -864,7 +998,17 @@
<label>Preheater Frost Safety</label> <label>Preheater Frost Safety</label>
<description>Frost safety setting</description> <description>Frost safety setting</description>
<category>Number</category> <category>Number</category>
<state readOnly="true"/> <tags>
<tag>Status</tag>
</tags>
<state readOnly="true">
<options>
<option value="0">Extra-safe setting</option>
<option value="1">Safe setting</option>
<option value="2">Normal setting</option>
<option value="3">Economy setting</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="ghx_temperature_low" advanced="true"> <channel-type id="ghx_temperature_low" advanced="true">
@ -872,7 +1016,11 @@
<label>GHX Temperature (low)</label> <label>GHX Temperature (low)</label>
<description>Lower temperature of the geothermal heat exchanger</description> <description>Lower temperature of the geothermal heat exchanger</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"/> <tags>
<tag>Setpoint</tag>
<tag>Temperature</tag>
</tags>
<state min="0" max="15" step="1" pattern="%.1f %unit%" readOnly="false"/>
</channel-type> </channel-type>
<channel-type id="ghx_temperature_high" advanced="true"> <channel-type id="ghx_temperature_high" advanced="true">
@ -880,7 +1028,11 @@
<label>GHX Temperature (high)</label> <label>GHX Temperature (high)</label>
<description>Upper temperature of the geothermal heat exchanger</description> <description>Upper temperature of the geothermal heat exchanger</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"/> <tags>
<tag>Setpoint</tag>
<tag>Temperature</tag>
</tags>
<state min="10" max="25" step="1" pattern="%.1f %unit%" readOnly="false"/>
</channel-type> </channel-type>
<channel-type id="ghx_speed" advanced="true"> <channel-type id="ghx_speed" advanced="true">
@ -888,7 +1040,7 @@
<label>GHX Speed Up (%)</label> <label>GHX Speed Up (%)</label>
<description>Speed up of the geothermal heat exchanger</description> <description>Speed up of the geothermal heat exchanger</description>
<category>Number</category> <category>Number</category>
<state readOnly="true"/> <state min="0" max="99" step="1" pattern="%.0f %%" readOnly="false"/>
</channel-type> </channel-type>
<channel-type id="heater_power" advanced="true"> <channel-type id="heater_power" advanced="true">
@ -912,7 +1064,11 @@
<label>Heater Target Temperature</label> <label>Heater Target Temperature</label>
<description>Target temperature of the heater</description> <description>Target temperature of the heater</description>
<category>Temperature</category> <category>Temperature</category>
<state readOnly="true" pattern="%.1f %unit%"/> <tags>
<tag>Setpoint</tag>
<tag>Temperature</tag>
</tags>
<state min="5" max="40" step="1" pattern="%.1f %unit%" readOnly="false"/>
</channel-type> </channel-type>
<channel-type id="cookerhood_speed" advanced="true"> <channel-type id="cookerhood_speed" advanced="true">
@ -928,6 +1084,10 @@
<label>Enthalpy Sensor Temperature</label> <label>Enthalpy Sensor Temperature</label>
<description>Temperature of the enthalpy sensor</description> <description>Temperature of the enthalpy sensor</description>
<category>Temperature</category> <category>Temperature</category>
<tags>
<tag>Measurement</tag>
<tag>Temperature</tag>
</tags>
<state readOnly="true" pattern="%.1f %unit%"/> <state readOnly="true" pattern="%.1f %unit%"/>
</channel-type> </channel-type>
@ -936,6 +1096,10 @@
<label>Enthalpy Sensor Humidity</label> <label>Enthalpy Sensor Humidity</label>
<description>Humidity of the enthalpy sensor</description> <description>Humidity of the enthalpy sensor</description>
<category>Humidity</category> <category>Humidity</category>
<tags>
<tag>Measurement</tag>
<tag>Humidity</tag>
</tags>
<state readOnly="true"/> <state readOnly="true"/>
</channel-type> </channel-type>
@ -948,11 +1112,11 @@
</channel-type> </channel-type>
<channel-type id="enthalpy_time" advanced="true"> <channel-type id="enthalpy_time" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>Enthalpy Sensor Timer</label> <label>Enthalpy Sensor Timer</label>
<description>Timer state of the enthalpy sensor</description> <description>Timer state of the enthalpy sensor</description>
<category>Time</category> <category>Time</category>
<state readOnly="true"/> <state readOnly="true" pattern="%.0f min"/>
</channel-type> </channel-type>
<channel-type id="is_preheater" advanced="true"> <channel-type id="is_preheater" advanced="true">
@ -1186,67 +1350,95 @@
</channel-type> </channel-type>
<channel-type id="cookerhood_delay" advanced="true"> <channel-type id="cookerhood_delay" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>Cookerhood Delay (P20)</label> <label>Cookerhood Delay (P20)</label>
<description>End delay for cooker hood control (min)</description> <description>End delay for cooker hood control (uses minutes internally)</description>
<category>Time</category> <category>Time</category>
<state min="0" max="180" step="1" readOnly="false"/> <tags>
<tag>Setpoint</tag>
<tag>Duration</tag>
</tags>
<state min="0" max="180" step="1" readOnly="false" pattern="%.0f min"/>
</channel-type> </channel-type>
<channel-type id="bathroom_start_delay" advanced="true"> <channel-type id="bathroom_start_delay" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>Bathroom Switch Start Delay (P21)</label> <label>Bathroom Switch Start Delay (P21)</label>
<description>Start delay for bathroom switch (min)</description> <description>Start delay for bathroom switch (uses minutes internally)</description>
<category>Time</category> <category>Time</category>
<state min="0" max="120" step="1" readOnly="false"/> <tags>
<tag>Setpoint</tag>
<tag>Duration</tag>
</tags>
<state min="0" max="120" step="1" readOnly="false" pattern="%.0f min"/>
</channel-type> </channel-type>
<channel-type id="bathroom_end_delay" advanced="true"> <channel-type id="bathroom_end_delay" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>Bathroom Switch End Delay (P22)</label> <label>Bathroom Switch End Delay (P22)</label>
<description>End delay for bathroom switch (min)</description> <description>End delay for bathroom switch (uses minutes internally)</description>
<category>Time</category> <category>Time</category>
<state min="0" max="120" step="1" readOnly="false"/> <tags>
<tag>Setpoint</tag>
<tag>Duration</tag>
</tags>
<state min="0" max="120" step="1" readOnly="false" pattern="%.0f min"/>
</channel-type> </channel-type>
<channel-type id="L1_end_delay" advanced="true"> <channel-type id="L1_end_delay" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>L1 Switch End Delay (P23)</label> <label>L1 Switch End Delay (P23)</label>
<description>End delay for L1 switch (min)</description> <description>End delay for L1 switch (uses minutes internally)</description>
<category>Time</category> <category>Time</category>
<state min="0" max="120" step="1" readOnly="false"/> <tags>
<tag>Setpoint</tag>
<tag>Duration</tag>
</tags>
<state min="0" max="120" step="1" readOnly="false" pattern="%.0f min"/>
</channel-type> </channel-type>
<channel-type id="filter_weeks" advanced="true"> <channel-type id="filter_weeks" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>Filter Period (P24)</label> <label>Filter Period (P24)</label>
<description>Usage period until filter pollution message (weeks)</description> <description>Usage period until filter pollution message (uses full weeks internally)</description>
<category>Time</category> <category>Time</category>
<state min="10" max="26" step="1" readOnly="false"/> <tags>
<tag>Setpoint</tag>
<tag>Duration</tag>
</tags>
<state min="10" max="26" step="1" readOnly="false" pattern="%.0f week"/>
</channel-type> </channel-type>
<channel-type id="RF_short_delay" advanced="true"> <channel-type id="RF_short_delay" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>RF Short Delay (P25)</label> <label>RF Short Delay (P25)</label>
<description>End delay (RF short actuation) for ventilation level 3 (min)</description> <description>End delay (RF short actuation) for ventilation level 3 (uses minutes internally)</description>
<category>Time</category> <category>Time</category>
<state min="1" max="20" step="1" readOnly="false"/> <tags>
<tag>Setpoint</tag>
<tag>Duration</tag>
</tags>
<state min="1" max="20" step="1" readOnly="false" pattern="%.0f min"/>
</channel-type> </channel-type>
<channel-type id="RF_long_delay" advanced="true"> <channel-type id="RF_long_delay" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>RF Long Delay (P26)</label> <label>RF Long Delay (P26)</label>
<description>End delay (RF long actuation) for ventilation level 3 (min)</description> <description>End delay (RF long actuation) for ventilation level 3 (uses minutes internally)</description>
<category>Time</category> <category>Time</category>
<state min="1" max="120" step="1" readOnly="false"/> <state min="1" max="120" step="1" readOnly="false" pattern="%.0f min"/>
</channel-type> </channel-type>
<channel-type id="pulse_ventilation" advanced="true"> <channel-type id="pulse_ventilation" advanced="true">
<item-type>Number</item-type> <item-type>Number:Time</item-type>
<label>Pulse Ventilation Period (P27)</label> <label>Pulse Ventilation Period (P27)</label>
<description>Period for pulse ventilation (min)</description> <description>Period for pulse ventilation (uses minutes internally)</description>
<category>Time</category> <category>Time</category>
<state min="0" max="120" step="1" readOnly="false"/> <tags>
<tag>Setpoint</tag>
<tag>Duration</tag>
</tags>
<state min="0" max="120" step="1" readOnly="false" pattern="%.0f min"/>
</channel-type> </channel-type>
<channel-type id="is_analog" advanced="true"> <channel-type id="is_analog" advanced="true">
@ -1270,7 +1462,12 @@
<label>Analog Input State</label> <label>Analog Input State</label>
<description>State of analog input</description> <description>State of analog input</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="false"/> <state readOnly="false">
<options>
<option value="OFF">Controlling</option>
<option value="ON">Programming</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="RF_mode" advanced="true"> <channel-type id="RF_mode" advanced="true">
@ -1278,7 +1475,12 @@
<label>RF Input State</label> <label>RF Input State</label>
<description>State of RF input</description> <description>State of RF input</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="false"/> <state readOnly="false">
<options>
<option value="OFF">Controlling</option>
<option value="ON">Programming</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="analog_negative" advanced="true"> <channel-type id="analog_negative" advanced="true">
@ -1286,7 +1488,12 @@
<label>Analog Input Postive/Negative</label> <label>Analog Input Postive/Negative</label>
<description>Postive/Negative state of analog input</description> <description>Postive/Negative state of analog input</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="false"/> <state readOnly="false">
<options>
<option value="OFF">Positive</option>
<option value="ON">Negative</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="RF_negative" advanced="true"> <channel-type id="RF_negative" advanced="true">
@ -1294,7 +1501,12 @@
<label>RF Input Postive/Negative</label> <label>RF Input Postive/Negative</label>
<description>Postive/Negative state of RF input</description> <description>Postive/Negative state of RF input</description>
<category>Switch</category> <category>Switch</category>
<state readOnly="false"/> <state readOnly="false">
<options>
<option value="OFF">Positive</option>
<option value="ON">Negative</option>
</options>
</state>
</channel-type> </channel-type>
<channel-type id="analog_volt" advanced="true"> <channel-type id="analog_volt" advanced="true">
@ -1302,6 +1514,10 @@
<label>Analog Input Voltage Level</label> <label>Analog Input Voltage Level</label>
<description>Voltage level of analog input</description> <description>Voltage level of analog input</description>
<category>Number</category> <category>Number</category>
<tags>
<tag>Measurement</tag>
<tag>Voltage</tag>
</tags>
<state readOnly="true"/> <state readOnly="true"/>
</channel-type> </channel-type>

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<update:update-descriptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:update="https://openhab.org/schemas/update-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/update-description/v1.0.0 https://openhab.org/schemas/update-description-1.0.0.xsd">
<thing-type uid="comfoair:comfoair">
<instruction-set targetVersion="1">
<update-channel id="fanInRPM" groupIds="ventilation">
<type>comfoair:fan_in_RPM</type>
</update-channel>
<update-channel id="fanOutRPM" groupIds="ventilation">
<type>comfoair:fan_out_RPM</type>
</update-channel>
<update-channel id="bathroomStartDelay" groupIds="menuP2">
<type>comfoair:bathroom_start_delay</type>
</update-channel>
<update-channel id="bathroomEndDelay" groupIds="menuP2">
<type>comfoair:bathroom_end_delay</type>
</update-channel>
<update-channel id="L1EndDelay" groupIds="menuP2">
<type>comfoair:L1_end_delay</type>
</update-channel>
<update-channel id="pulseVentilation" groupIds="menuP2">
<type>comfoair:pulse_ventilation</type>
</update-channel>
<update-channel id="filterWeeks" groupIds="menuP2">
<type>comfoair:filter_weeks</type>
</update-channel>
<update-channel id="RFShortDelay" groupIds="menuP2">
<type>comfoair:RF_short_delay</type>
</update-channel>
<update-channel id="RFLongDelay" groupIds="menuP2">
<type>comfoair:RF_long_delay</type>
</update-channel>
<update-channel id="cookerhoodDelay" groupIds="menuP2">
<type>comfoair:cookerhood_delay</type>
</update-channel>
<update-channel id="enthalpyTime" groupIds="enthalpy">
<type>comfoair:enthalpy_time</type>
</update-channel>
<update-channel id="preheaterFrostTime" groupIds="preheater">
<type>comfoair:preheater_frost_time</type>
</update-channel>
<update-channel id="preheaterSafety" groupIds="preheater">
<type>comfoair:preheater_safety</type>
</update-channel>
<update-channel id="ewtTemperatureLow" groupIds="ghx">
<type>comfoair:ghx_temperature_low</type>
</update-channel>
<update-channel id="ewtTemperatureHigh" groupIds="ghx">
<type>comfoair:ghx_temperature_high</type>
</update-channel>
<update-channel id="ewtSpeed" groupIds="ghx">
<type>comfoair:ghx_speed</type>
</update-channel>
<update-channel id="heaterTargetTemperature" groupIds="heater">
<type>comfoair:heater_target_temperature</type>
</update-channel>
</instruction-set>
</thing-type>
<thing-type uid="comfoair:WHR930">
<instruction-set targetVersion="1">
<update-channel id="fanInRPM" groupIds="ventilation">
<type>comfoair:fan_in_RPM</type>
</update-channel>
<update-channel id="fanOutRPM" groupIds="ventilation">
<type>comfoair:fan_out_RPM</type>
</update-channel>
<update-channel id="bathroomStartDelay" groupIds="menuP2">
<type>comfoair:bathroom_start_delay</type>
</update-channel>
<update-channel id="bathroomEndDelay" groupIds="menuP2">
<type>comfoair:bathroom_end_delay</type>
</update-channel>
<update-channel id="L1EndDelay" groupIds="menuP2">
<type>comfoair:L1_end_delay</type>
</update-channel>
<update-channel id="filterWeeks" groupIds="menuP2">
<type>comfoair:filter_weeks</type>
</update-channel>
<update-channel id="RFShortDelay" groupIds="menuP2">
<type>comfoair:RF_short_delay</type>
</update-channel>
<update-channel id="RFLongDelay" groupIds="menuP2">
<type>comfoair:RF_long_delay</type>
</update-channel>
<update-channel id="preheaterFrostTime" groupIds="preheater">
<type>comfoair:preheater_frost_time</type>
</update-channel>
<update-channel id="preheaterSafety" groupIds="preheater">
<type>comfoair:preheater_safety</type>
</update-channel>
</instruction-set>
</thing-type>
</update:update-descriptions>