diff --git a/bundles/org.openhab.binding.enocean/README.md b/bundles/org.openhab.binding.enocean/README.md
index 69dc3cb32bc..e6ff99b0a16 100644
--- a/bundles/org.openhab.binding.enocean/README.md
+++ b/bundles/org.openhab.binding.enocean/README.md
@@ -90,6 +90,7 @@ Hence if your device supports one of the following EEPs the chances are good tha
| rollershutter | A5-3F/D2-05/A5-38 | 0x7F/00/08 | rollershutter | Eltako FSB14, NodOn SIN-2-RS-01| Teach-in/Discovery |
| measurementSwitch | D2-01 | 0x00-0F,11,12 | generalSwitch(/A/B), instantpower,
totalusage, repeaterMode | NodOn In Wall Switch | Discovery |
| multiFunctionSmokeDetector | D2-14/F6-05 | 0x30/02 | smokeDetection, batteryLow | Insafe+, Afriso ASD | Discovery |
+| heatRecoveryVentilation | D2-50 | 0x00,01,10,11 | a lot of different state channels | Dimplex DL WE2 | Discovery |
| classicDevice | F6-02 | 0x01-02 | virtualRockerswitchA, virtualRockerswitchB | - | Teach-in |
ยน Not all channels are supported by all devices, it depends which specific EEP type is used by the device, all thing types additionally support `rssi`, `repeatCount` and `lastReceived` channels
@@ -210,6 +211,12 @@ If you change the SenderId of your thing, you have to pair again the thing with
| | suppressRepeating | | true, false |
| multiFunctionSmokeDetector | receivingEEPId | | F6_05_02, D2_14_30 |
| | enoceanId | | |
+| heatRecoveryVentilation | senderIdOffset | | 1-127 |
+| | enoceanId | | |
+| | sendingEEPId | | D2_50_00, D2_50_01,
D2_50_10, D2_50_11 |
+| | receivingEEPId | | D2_50_00, D2_50_01,
D2_50_10, D2_50_11 |
+| | broadcastMessages | | true, false |
+| | suppressRepeating | | true, false |
| classicDevice | senderIdOffset | | 1-127 |
| | sendingEEPId | | F6_02_01, F6_02_02 |
| | broadcastMessages | | true, false |
@@ -267,6 +274,29 @@ The channels of a thing are determined automatically based on the chosen EEP.
| remainingPLT | Number:Time | Remaining product life time |
| hygroComfortIndex | String | Hygrothermal Comfort Index |
| indoorAirAnalysis | String | Indoor Air Analysis |
+| ventilationOperationMode | String | Direct Operation Mode Control |
+| fireplaceSafetyMode | Switch | Fireplace Safety Mode |
+| heatExchangerBypassStatus | Contact | Heat Exchanger Bypass Status |
+| supplyAirFlapStatus | Contact | Supply Air Flap Position |
+| exhaustAirFlapStatus | Contact | Exhaust Air Flap Position |
+| defrostMode | Switch | Defrost Mode |
+| coolingProtectionMode | Switch | Cooling Protection Mode |
+| outdoorAirHeaterStatus | Switch | Outdoor Air Heater Status |
+| supplyAirHeaterStatus | Switch | Supply Air Heater Status |
+| drainHeaterStatus | Switch | Drain Heater Status |
+| timerOperationMode | Switch | Timer Operation Mode |
+| weeklyTimerProgramStatus | Switch | Weekly Timer Program Status |
+| roomTemperatureControlStatus | Switch | Room Temperature Control Status |
+| airQualityValue1 | Number:Dimensionless | Air Quality Value in percent |
+| airQualityValue2 | Number:Dimensionless | Air Quality Value in percent |
+| outdoorAirTemperature | Number:Temperature | Outdoor Temperature |
+| supplyAirTemperature | Number:Temperature | Supply Air Temperature |
+| indoorAirTemperature | Number:Temperature | Indoor Temperature |
+| exhaustAirTemperature | Number:Temperature | Exhaust Air Temperature |
+| supplyAirFanAirFlowRate | Number:VolumetricFlowRate | Supply Air Fan Air Flow Rate |
+| exhaustAirFanAirFlowRate | Number:VolumetricFlowRate | Exhaust Air Fan Air Flow Rate |
+| supplyFanSpeed | Number:Dimensionless | Supply Fan Speed in rpm |
+| exhaustFanSpeed | Number:Dimensionless | Exhaust Fan Speed |
| rssi | Number | Received Signal Strength Indication (dBm) of last received message |
| repeatCount | Number | Number of repeaters involved in the transmission of the telegram |
| lastReceived | DateTime | Date and time the last telegram was received |
diff --git a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/EnOceanBindingConstants.java b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/EnOceanBindingConstants.java
index b8dc0cca9d7..4ae4bf2240b 100644
--- a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/EnOceanBindingConstants.java
+++ b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/EnOceanBindingConstants.java
@@ -12,14 +12,11 @@
*/
package org.openhab.binding.enocean.internal;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.measure.quantity.Angle;
+import javax.measure.quantity.Dimensionless;
import javax.measure.quantity.ElectricPotential;
import javax.measure.quantity.Energy;
import javax.measure.quantity.Illuminance;
@@ -78,13 +75,16 @@ public class EnOceanBindingConstants {
public static final ThingTypeUID THING_TYPE_MULTFUNCTIONSMOKEDETECTOR = new ThingTypeUID(BINDING_ID,
"multiFunctionSmokeDetector");
- public static final Set SUPPORTED_DEVICE_THING_TYPES_UIDS = new HashSet<>(Arrays.asList(
- THING_TYPE_PUSHBUTTON, THING_TYPE_ROCKERSWITCH, THING_TYPE_CLASSICDEVICE, THING_TYPE_CENTRALCOMMAND,
- THING_TYPE_ROOMOPERATINGPANEL, THING_TYPE_MECHANICALHANDLE, THING_TYPE_CONTACT,
- THING_TYPE_MEASUREMENTSWITCH, THING_TYPE_TEMPERATURESENSOR, THING_TYPE_TEMPERATUREHUMIDITYSENSOR,
- THING_TYPE_GENERICTHING, THING_TYPE_ROLLERSHUTTER, THING_TYPE_OCCUPANCYSENSOR,
- THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, THING_TYPE_LIGHTSENSOR, THING_TYPE_ENVIRONMENTALSENSOR,
- THING_TYPE_AUTOMATEDMETERSENSOR, THING_TYPE_THERMOSTAT, THING_TYPE_MULTFUNCTIONSMOKEDETECTOR));
+ public static final ThingTypeUID THING_TYPE_HEATRECOVERYVENTILATION = new ThingTypeUID(BINDING_ID,
+ "heatRecoveryVentilation");
+
+ public static final Set SUPPORTED_DEVICE_THING_TYPES_UIDS = Set.of(THING_TYPE_PUSHBUTTON,
+ THING_TYPE_ROCKERSWITCH, THING_TYPE_CLASSICDEVICE, THING_TYPE_CENTRALCOMMAND, THING_TYPE_ROOMOPERATINGPANEL,
+ THING_TYPE_MECHANICALHANDLE, THING_TYPE_CONTACT, THING_TYPE_MEASUREMENTSWITCH, THING_TYPE_TEMPERATURESENSOR,
+ THING_TYPE_TEMPERATUREHUMIDITYSENSOR, THING_TYPE_GENERICTHING, THING_TYPE_ROLLERSHUTTER,
+ THING_TYPE_OCCUPANCYSENSOR, THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, THING_TYPE_LIGHTSENSOR,
+ THING_TYPE_ENVIRONMENTALSENSOR, THING_TYPE_AUTOMATEDMETERSENSOR, THING_TYPE_THERMOSTAT,
+ THING_TYPE_MULTFUNCTIONSMOKEDETECTOR, THING_TYPE_HEATRECOVERYVENTILATION);
// List of all Channel Type Ids, these type ids are also used as channel ids during dynamic creation of channels
// this makes it a lot easier as we do not have to manage a type id and an id, drawback long channel names
@@ -179,215 +179,356 @@ public class EnOceanBindingConstants {
public static final String CHANNEL_STATUS_REQUEST_EVENT = "statusRequestEvent";
public static final String CHANNEL_SEND_COMMAND = "sendCommand";
- public static final Map CHANNELID2CHANNELDESCRIPTION = Collections
- .unmodifiableMap(new HashMap() {
- private static final long serialVersionUID = 1L;
+ public static final String CHANNEL_VENTILATIONOPERATIONMODE = "ventilationOperationMode";
+ public static final String CHANNEL_FIREPLACESAFETYMODE = "fireplaceSafetyMode";
+ public static final String CHANNEL_HEATEXCHANGERBYPASSSTATUS = "heatExchangerBypassStatus";
+ public static final String CHANNEL_SUPPLYAIRFLAPSTATUS = "supplyAirFlapStatus";
+ public static final String CHANNEL_EXHAUSTAIRFLAPSTATUS = "exhaustAirFlapStatus";
+ public static final String CHANNEL_DEFROSTMODE = "defrostMode";
+ public static final String CHANNEL_COOLINGPROTECTIONMODE = "coolingProtectionMode";
+ public static final String CHANNEL_OUTDOORAIRHEATERSTATUS = "outdoorAirHeaterStatus";
+ public static final String CHANNEL_SUPPLYAIRHEATERSTATUS = "supplyAirHeaterStatus";
+ public static final String CHANNEL_DRAINHEATERSTATUS = "drainHeaterStatus";
+ public static final String CHANNEL_TIMEROPERATIONMODE = "timerOperationMode";
+ public static final String CHANNEL_WEEKLYTIMERPROGRAMSTATUS = "weeklyTimerProgramStatus";
+ public static final String CHANNEL_ROOMTEMPERATURECONTROLSTATUS = "roomTemperatureControlStatus";
+ public static final String CHANNEL_AIRQUALITYVALUE1 = "airQualityValue1";
+ public static final String CHANNEL_AIRQUALITYVALUE2 = "airQualityValue2";
+ public static final String CHANNEL_OUTDOORAIRTEMPERATURE = "outdoorAirTemperature";
+ public static final String CHANNEL_SUPPLYAIRTEMPERATURE = "supplyAirTemperature";
+ public static final String CHANNEL_INDOORAIRTEMPERATURE = "indoorAirTemperature";
+ public static final String CHANNEL_EXHAUSTAIRTEMPERATURE = "exhaustAirTemperature";
+ public static final String CHANNEL_SUPPLYAIRFANAIRFLOWRATE = "supplyAirFanAirFlowRate";
+ public static final String CHANNEL_EXHAUSTAIRFANAIRFLOWRATE = "exhaustAirFanAirFlowRate";
+ public static final String CHANNEL_SUPPLYFANSPEED = "supplyFanSpeed";
+ public static final String CHANNEL_EXHAUSTFANSPEED = "exhaustFanSpeed";
- {
- put(CHANNEL_GENERAL_SWITCHING, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_GENERAL_SWITCHING), CoreItemFactory.SWITCH));
+ public static final Map CHANNELID2CHANNELDESCRIPTION = Map.ofEntries(
+ Map.entry(CHANNEL_GENERAL_SWITCHING,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERAL_SWITCHING),
+ CoreItemFactory.SWITCH)),
- put(CHANNEL_GENERAL_SWITCHINGA, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_GENERAL_SWITCHINGA), CoreItemFactory.SWITCH));
- put(CHANNEL_GENERAL_SWITCHINGB, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_GENERAL_SWITCHINGB), CoreItemFactory.SWITCH));
+ Map.entry(CHANNEL_GENERAL_SWITCHINGA,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERAL_SWITCHINGA),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_GENERAL_SWITCHINGB,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERAL_SWITCHINGB),
+ CoreItemFactory.SWITCH)),
- put(CHANNEL_DIMMER, new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_DIMMER),
- CoreItemFactory.DIMMER));
- put(CHANNEL_ROLLERSHUTTER, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_ROLLERSHUTTER), CoreItemFactory.ROLLERSHUTTER));
- put(CHANNEL_ANGLE, new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ANGLE),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Angle.class.getSimpleName()));
- put(CHANNEL_TEMPERATURE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_TEMPERATURE),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName()));
- put(CHANNEL_HUMIDITY, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_HUMIDITY), CoreItemFactory.NUMBER));
- put(CHANNEL_FANSPEEDSTAGE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_FANSPEEDSTAGE), CoreItemFactory.STRING));
- put(CHANNEL_OCCUPANCY, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_OCCUPANCY), CoreItemFactory.SWITCH));
- put(CHANNEL_MOTIONDETECTION, new EnOceanChannelDescription(
- DefaultSystemChannelTypeProvider.SYSTEM_MOTION.getUID(), CoreItemFactory.SWITCH));
- put(CHANNEL_VIBRATION, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_VIBRATION), CoreItemFactory.SWITCH));
- put(CHANNEL_ILLUMINATION, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_ILLUMINATION),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Illuminance.class.getSimpleName()));
- put(CHANNEL_ILLUMINATIONWEST, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_ILLUMINATIONWEST),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Illuminance.class.getSimpleName()));
- put(CHANNEL_ILLUMINATIONSOUTHNORTH, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_ILLUMINATIONSOUTHNORTH),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Illuminance.class.getSimpleName()));
- put(CHANNEL_ILLUMINATIONEAST, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_ILLUMINATIONEAST),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Illuminance.class.getSimpleName()));
- put(CHANNEL_WINDSPEED, new EnOceanChannelDescription(
- DefaultSystemChannelTypeProvider.SYSTEM_WIND_SPEED.getUID(),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Speed.class.getSimpleName()));
- put(CHANNEL_RAINSTATUS, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_RAINSTATUS), CoreItemFactory.SWITCH));
- put(CHANNEL_COUNTER, new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_COUNTER),
- CoreItemFactory.NUMBER));
- put(CHANNEL_CURRENTNUMBER, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_CURRENTNUMBER), CoreItemFactory.NUMBER));
- put(CHANNEL_SMOKEDETECTION, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_SMOKEDETECTION), CoreItemFactory.SWITCH));
- put(CHANNEL_SENSORFAULT, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_SENSORFAULT), CoreItemFactory.SWITCH));
- put(CHANNEL_MAINTENANCESTATUS, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_SENSORFAULT), CoreItemFactory.SWITCH));
- put(CHANNEL_SENSORANALYSISHUMIDITYRANGE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_SENSORFAULT), CoreItemFactory.SWITCH));
- put(CHANNEL_SENSORANALYSISTEMPERATURRANGE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_SENSORFAULT), CoreItemFactory.SWITCH));
- put(CHANNEL_TIMESINCELASTMAINTENANCE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_TIMESINCELASTMAINTENANCE),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Time.class.getSimpleName()));
- put(CHANNEL_REMAININGPLT, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_REMAININGPLT),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Time.class.getSimpleName()));
- put(CHANNEL_HYGROCOMFORTINDEX, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_HYGROCOMFORTINDEX), CoreItemFactory.STRING));
- put(CHANNEL_INDOORAIRANALYSIS, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_INDOORAIRANALYSIS), CoreItemFactory.STRING));
- put(CHANNEL_SETPOINT, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_SETPOINT), CoreItemFactory.NUMBER));
- put(CHANNEL_CONTACT, new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_CONTACT),
- CoreItemFactory.CONTACT));
- put(CHANNEL_WINDOWHANDLESTATE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_WINDOWHANDLESTATE), CoreItemFactory.STRING));
- put(CHANNEL_BATTERY_VOLTAGE,
- new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_BATTERY_VOLTAGE),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
- + ElectricPotential.class.getSimpleName()));
- put(CHANNEL_ENERGY_STORAGE,
- new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ENERGY_STORAGE),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
- + ElectricPotential.class.getSimpleName()));
- put(CHANNEL_BATTERY_LEVEL,
- new EnOceanChannelDescription(
- DefaultSystemChannelTypeProvider.SYSTEM_CHANNEL_BATTERY_LEVEL.getUID(),
- CoreItemFactory.NUMBER));
- put(CHANNEL_BATTERYLOW,
- new EnOceanChannelDescription(
- DefaultSystemChannelTypeProvider.SYSTEM_CHANNEL_LOW_BATTERY.getUID(),
- CoreItemFactory.SWITCH));
- put(CHANNEL_TEACHINCMD, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_TEACHINCMD), CoreItemFactory.SWITCH));
+ Map.entry(CHANNEL_DIMMER,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_DIMMER),
+ CoreItemFactory.DIMMER)),
+ Map.entry(CHANNEL_ROLLERSHUTTER,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ROLLERSHUTTER),
+ CoreItemFactory.ROLLERSHUTTER)),
+ Map.entry(CHANNEL_ANGLE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ANGLE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Angle.class.getSimpleName())),
+ Map.entry(CHANNEL_TEMPERATURE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_TEMPERATURE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName())),
+ Map.entry(CHANNEL_HUMIDITY,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_HUMIDITY),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_FANSPEEDSTAGE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_FANSPEEDSTAGE),
+ CoreItemFactory.STRING)),
+ Map.entry(CHANNEL_OCCUPANCY,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_OCCUPANCY),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_MOTIONDETECTION,
+ new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_MOTION.getUID(),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_VIBRATION,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_VIBRATION),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_ILLUMINATION,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ILLUMINATION),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Illuminance.class.getSimpleName())),
+ Map.entry(CHANNEL_ILLUMINATIONWEST,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ILLUMINATIONWEST),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Illuminance.class.getSimpleName())),
+ Map.entry(CHANNEL_ILLUMINATIONSOUTHNORTH,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ILLUMINATIONSOUTHNORTH),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Illuminance.class.getSimpleName())),
+ Map.entry(CHANNEL_ILLUMINATIONEAST,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ILLUMINATIONEAST),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Illuminance.class.getSimpleName())),
+ Map.entry(CHANNEL_WINDSPEED,
+ new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_WIND_SPEED.getUID(),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Speed.class.getSimpleName())),
+ Map.entry(CHANNEL_RAINSTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_RAINSTATUS),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_COUNTER,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_COUNTER),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_CURRENTNUMBER,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_CURRENTNUMBER),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_SMOKEDETECTION,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SMOKEDETECTION),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_SENSORFAULT,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SENSORFAULT),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_MAINTENANCESTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SENSORFAULT),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_SENSORANALYSISHUMIDITYRANGE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SENSORFAULT),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_SENSORANALYSISTEMPERATURRANGE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SENSORFAULT),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_TIMESINCELASTMAINTENANCE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_TIMESINCELASTMAINTENANCE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Time.class.getSimpleName())),
+ Map.entry(CHANNEL_REMAININGPLT,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_REMAININGPLT),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Time.class.getSimpleName())),
+ Map.entry(CHANNEL_HYGROCOMFORTINDEX,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_HYGROCOMFORTINDEX),
+ CoreItemFactory.STRING)),
+ Map.entry(CHANNEL_INDOORAIRANALYSIS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_INDOORAIRANALYSIS),
+ CoreItemFactory.STRING)),
+ Map.entry(CHANNEL_SETPOINT,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SETPOINT),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_CONTACT,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_CONTACT),
+ CoreItemFactory.CONTACT)),
+ Map.entry(CHANNEL_WINDOWHANDLESTATE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_WINDOWHANDLESTATE),
+ CoreItemFactory.STRING)),
+ Map.entry(
+ CHANNEL_BATTERY_VOLTAGE,
+ new EnOceanChannelDescription(
+ new ChannelTypeUID(BINDING_ID, CHANNEL_BATTERY_VOLTAGE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ + ElectricPotential.class.getSimpleName())),
+ Map.entry(CHANNEL_ENERGY_STORAGE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ENERGY_STORAGE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ + ElectricPotential.class.getSimpleName())),
+ Map.entry(CHANNEL_BATTERY_LEVEL, new EnOceanChannelDescription(
+ DefaultSystemChannelTypeProvider.SYSTEM_CHANNEL_BATTERY_LEVEL.getUID(), CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_BATTERYLOW,
+ new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_CHANNEL_LOW_BATTERY.getUID(),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_TEACHINCMD,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_TEACHINCMD),
+ CoreItemFactory.SWITCH)),
- put(CHANNEL_PUSHBUTTON,
- new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWBUTTON.getUID(),
- null, "Push button", false, true));
- put(CHANNEL_DOUBLEPRESS,
- new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWBUTTON.getUID(),
- null, "Double press", false, true));
- put(CHANNEL_LONGPRESS,
- new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWBUTTON.getUID(),
- null, "Long press", false, true));
+ Map.entry(CHANNEL_PUSHBUTTON,
+ new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWBUTTON.getUID(), null,
+ "Push button", false, true)),
+ Map.entry(CHANNEL_DOUBLEPRESS,
+ new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWBUTTON.getUID(), null,
+ "Double press", false, true)),
+ Map.entry(CHANNEL_LONGPRESS,
+ new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWBUTTON.getUID(), null,
+ "Long press", false, true)),
- put(CHANNEL_ROCKERSWITCH_CHANNELA,
- new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWROCKER.getUID(),
- null, "Rocker Switch - Channel A", false, false));
- put(CHANNEL_ROCKERSWITCH_CHANNELB,
- new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWROCKER.getUID(),
- null, "Rocker Switch - Channel B", false, false));
+ Map.entry(CHANNEL_ROCKERSWITCH_CHANNELA,
+ new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWROCKER.getUID(), null,
+ "Rocker Switch - Channel A", false, false)),
+ Map.entry(CHANNEL_ROCKERSWITCH_CHANNELB,
+ new EnOceanChannelDescription(DefaultSystemChannelTypeProvider.SYSTEM_RAWROCKER.getUID(), null,
+ "Rocker Switch - Channel B", false, false)),
- put(CHANNEL_VIRTUALSWITCHA,
- new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_VIRTUALSWITCHA),
- CoreItemFactory.SWITCH, "", true, false));
- put(CHANNEL_VIRTUALROLLERSHUTTERA,
- new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_VIRTUALROLLERSHUTTERA),
- CoreItemFactory.ROLLERSHUTTER, "", true, false));
- put(CHANNEL_VIRTUALROCKERSWITCHB,
- new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_VIRTUALROCKERSWITCHB),
- CoreItemFactory.STRING, "Rocker Switch - Channel B", true, false));
- put(CHANNEL_ROCKERSWITCHLISTENERSWITCH,
- new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_ROCKERSWITCHLISTENERSWITCH),
- CoreItemFactory.SWITCH, "Rocker Switch Listener (Switch)", true, false));
- put(CHANNEL_ROCKERSWITCHLISTENERROLLERSHUTTER, new EnOceanChannelDescription(
+ Map.entry(CHANNEL_VIRTUALSWITCHA,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_VIRTUALSWITCHA),
+ CoreItemFactory.SWITCH, "", true, false)),
+ Map.entry(CHANNEL_VIRTUALROLLERSHUTTERA,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_VIRTUALROLLERSHUTTERA),
+ CoreItemFactory.ROLLERSHUTTER, "", true, false)),
+ Map.entry(CHANNEL_VIRTUALROCKERSWITCHB,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_VIRTUALROCKERSWITCHB),
+ CoreItemFactory.STRING, "Rocker Switch - Channel B", true, false)),
+ Map.entry(CHANNEL_ROCKERSWITCHLISTENERSWITCH,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ROCKERSWITCHLISTENERSWITCH),
+ CoreItemFactory.SWITCH, "Rocker Switch Listener (Switch)", true, false)),
+ Map.entry(CHANNEL_ROCKERSWITCHLISTENERROLLERSHUTTER,
+ new EnOceanChannelDescription(
new ChannelTypeUID(BINDING_ID, CHANNEL_ROCKERSWITCHLISTENERROLLERSHUTTER),
- CoreItemFactory.ROLLERSHUTTER, "Rocker Switch Listener (Rollershutter)", true, false));
+ CoreItemFactory.ROLLERSHUTTER, "Rocker Switch Listener (Rollershutter)", true, false)),
- put(CHANNEL_INSTANTPOWER, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_INSTANTPOWER),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Power.class.getSimpleName()));
- put(CHANNEL_TOTALUSAGE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_TOTALUSAGE),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Energy.class.getSimpleName()));
- put(CHANNEL_CURRENTFLOW,
- new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_CURRENTFLOW),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
- + VolumetricFlowRate.class.getSimpleName()));
- put(CHANNEL_CUMULATIVEVALUE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_CUMULATIVEVALUE),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Volume.class.getSimpleName()));
- put(CHANNEL_AUTOOFF, new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_AUTOOFF),
- CoreItemFactory.NUMBER));
- put(CHANNEL_DELAYRADIOOFF, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_DELAYRADIOOFF), CoreItemFactory.NUMBER));
- put(CHANNEL_EXTERNALINTERFACEMODE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_EXTERNALINTERFACEMODE), CoreItemFactory.STRING));
- put(CHANNEL_TWOSTATESWITCH, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_TWOSTATESWITCH), CoreItemFactory.SWITCH));
- put(CHANNEL_ECOMODE, new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ECOMODE),
- CoreItemFactory.SWITCH));
+ Map.entry(CHANNEL_INSTANTPOWER,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_INSTANTPOWER),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Power.class.getSimpleName())),
+ Map.entry(CHANNEL_TOTALUSAGE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_TOTALUSAGE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Energy.class.getSimpleName())),
+ Map.entry(CHANNEL_CURRENTFLOW,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_CURRENTFLOW),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ + VolumetricFlowRate.class.getSimpleName())),
+ Map.entry(CHANNEL_CUMULATIVEVALUE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_CUMULATIVEVALUE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Volume.class.getSimpleName())),
+ Map.entry(CHANNEL_AUTOOFF,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_AUTOOFF),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_DELAYRADIOOFF,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_DELAYRADIOOFF),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_EXTERNALINTERFACEMODE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_EXTERNALINTERFACEMODE),
+ CoreItemFactory.STRING)),
+ Map.entry(CHANNEL_TWOSTATESWITCH,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_TWOSTATESWITCH),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_ECOMODE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ECOMODE),
+ CoreItemFactory.SWITCH)),
- put(CHANNEL_RSSI, new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_RSSI),
- CoreItemFactory.NUMBER));
- put(CHANNEL_REPEATCOUNT, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_REPEATCOUNT), CoreItemFactory.NUMBER));
- put(CHANNEL_LASTRECEIVED, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_LASTRECEIVED), CoreItemFactory.DATETIME));
+ Map.entry(CHANNEL_RSSI,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_RSSI),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_REPEATCOUNT,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_REPEATCOUNT),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_LASTRECEIVED,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_LASTRECEIVED),
+ CoreItemFactory.DATETIME)),
- put(CHANNEL_GENERIC_SWITCH, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_SWITCH), CoreItemFactory.SWITCH));
- put(CHANNEL_GENERIC_ROLLERSHUTTER,
- new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_ROLLERSHUTTER),
- CoreItemFactory.ROLLERSHUTTER));
- put(CHANNEL_GENERIC_DIMMER, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_DIMMER), CoreItemFactory.DIMMER));
- put(CHANNEL_GENERIC_NUMBER, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_NUMBER), CoreItemFactory.NUMBER));
- put(CHANNEL_GENERIC_STRING, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_STRING), CoreItemFactory.STRING));
- put(CHANNEL_GENERIC_COLOR, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_COLOR), CoreItemFactory.COLOR));
- put(CHANNEL_GENERIC_TEACHINCMD, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_TEACHINCMD), CoreItemFactory.SWITCH));
+ Map.entry(CHANNEL_GENERIC_SWITCH,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_SWITCH),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_GENERIC_ROLLERSHUTTER,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_ROLLERSHUTTER),
+ CoreItemFactory.ROLLERSHUTTER)),
+ Map.entry(CHANNEL_GENERIC_DIMMER,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_DIMMER),
+ CoreItemFactory.DIMMER)),
+ Map.entry(CHANNEL_GENERIC_NUMBER,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_NUMBER),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_GENERIC_STRING,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_STRING),
+ CoreItemFactory.STRING)),
+ Map.entry(CHANNEL_GENERIC_COLOR,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_COLOR),
+ CoreItemFactory.COLOR)),
+ Map.entry(CHANNEL_GENERIC_TEACHINCMD,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_GENERIC_TEACHINCMD),
+ CoreItemFactory.SWITCH)),
- put(CHANNEL_VALVE_POSITION, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_VALVE_POSITION), CoreItemFactory.NUMBER));
- put(CHANNEL_BUTTON_LOCK, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_BUTTON_LOCK), CoreItemFactory.SWITCH));
- put(CHANNEL_DISPLAY_ORIENTATION, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_DISPLAY_ORIENTATION), CoreItemFactory.NUMBER));
- put(CHANNEL_TEMPERATURE_SETPOINT, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_TEMPERATURE_SETPOINT),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName()));
- put(CHANNEL_FEED_TEMPERATURE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_FEED_TEMPERATURE),
- CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName()));
- put(CHANNEL_MEASUREMENT_CONTROL, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_MEASUREMENT_CONTROL), CoreItemFactory.SWITCH));
- put(CHANNEL_FAILURE_CODE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_FAILURE_CODE), CoreItemFactory.NUMBER));
- put(CHANNEL_WAKEUPCYCLE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_WAKEUPCYCLE), CoreItemFactory.NUMBER));
- put(CHANNEL_SERVICECOMMAND, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_SERVICECOMMAND), CoreItemFactory.NUMBER));
+ Map.entry(CHANNEL_VALVE_POSITION,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_VALVE_POSITION),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_BUTTON_LOCK,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_BUTTON_LOCK),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_DISPLAY_ORIENTATION,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_DISPLAY_ORIENTATION),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_TEMPERATURE_SETPOINT,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_TEMPERATURE_SETPOINT),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName())),
+ Map.entry(CHANNEL_FEED_TEMPERATURE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_FEED_TEMPERATURE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName())),
+ Map.entry(CHANNEL_MEASUREMENT_CONTROL,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_MEASUREMENT_CONTROL),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_FAILURE_CODE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_FAILURE_CODE),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_WAKEUPCYCLE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_WAKEUPCYCLE),
+ CoreItemFactory.NUMBER)),
+ Map.entry(CHANNEL_SERVICECOMMAND,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SERVICECOMMAND),
+ CoreItemFactory.NUMBER)),
- put(CHANNEL_STATUS_REQUEST_EVENT, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_STATUS_REQUEST_EVENT), null, "", false, true));
- put(CHANNEL_SEND_COMMAND, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_SEND_COMMAND), CoreItemFactory.SWITCH));
+ Map.entry(CHANNEL_STATUS_REQUEST_EVENT,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_STATUS_REQUEST_EVENT), null,
+ "", false, true)),
+ Map.entry(CHANNEL_SEND_COMMAND,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SEND_COMMAND),
+ CoreItemFactory.SWITCH)),
- put(CHANNEL_REPEATERMODE, new EnOceanChannelDescription(
- new ChannelTypeUID(BINDING_ID, CHANNEL_REPEATERMODE), CoreItemFactory.STRING));
- }
- });
+ Map.entry(CHANNEL_VENTILATIONOPERATIONMODE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_VENTILATIONOPERATIONMODE),
+ CoreItemFactory.STRING)),
+ Map.entry(CHANNEL_FIREPLACESAFETYMODE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_FIREPLACESAFETYMODE),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_HEATEXCHANGERBYPASSSTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_HEATEXCHANGERBYPASSSTATUS),
+ CoreItemFactory.CONTACT)),
+ Map.entry(CHANNEL_SUPPLYAIRFLAPSTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SUPPLYAIRFLAPSTATUS),
+ CoreItemFactory.CONTACT)),
+ Map.entry(CHANNEL_EXHAUSTAIRFLAPSTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_EXHAUSTAIRFLAPSTATUS),
+ CoreItemFactory.CONTACT)),
+ Map.entry(CHANNEL_DEFROSTMODE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_DEFROSTMODE),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_COOLINGPROTECTIONMODE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_COOLINGPROTECTIONMODE),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_OUTDOORAIRHEATERSTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_OUTDOORAIRHEATERSTATUS),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_SUPPLYAIRHEATERSTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SUPPLYAIRHEATERSTATUS),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_DRAINHEATERSTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_DRAINHEATERSTATUS),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_TIMEROPERATIONMODE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_TIMEROPERATIONMODE),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_WEEKLYTIMERPROGRAMSTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_WEEKLYTIMERPROGRAMSTATUS),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_ROOMTEMPERATURECONTROLSTATUS,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_ROOMTEMPERATURECONTROLSTATUS),
+ CoreItemFactory.SWITCH)),
+ Map.entry(CHANNEL_AIRQUALITYVALUE1,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_AIRQUALITYVALUE1),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ + Dimensionless.class.getSimpleName())),
+ Map.entry(CHANNEL_AIRQUALITYVALUE2,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_AIRQUALITYVALUE2),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ + Dimensionless.class.getSimpleName())),
+ Map.entry(CHANNEL_OUTDOORAIRTEMPERATURE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_OUTDOORAIRTEMPERATURE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName())),
+ Map.entry(CHANNEL_SUPPLYAIRTEMPERATURE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SUPPLYAIRTEMPERATURE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName())),
+ Map.entry(CHANNEL_INDOORAIRTEMPERATURE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_INDOORAIRTEMPERATURE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName())),
+ Map.entry(CHANNEL_EXHAUSTAIRTEMPERATURE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_EXHAUSTAIRTEMPERATURE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR + Temperature.class.getSimpleName())),
+ Map.entry(CHANNEL_SUPPLYAIRFANAIRFLOWRATE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SUPPLYAIRFANAIRFLOWRATE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ + VolumetricFlowRate.class.getSimpleName())),
+ Map.entry(CHANNEL_EXHAUSTAIRFANAIRFLOWRATE,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_EXHAUSTAIRFANAIRFLOWRATE),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ + VolumetricFlowRate.class.getSimpleName())),
+ Map.entry(CHANNEL_SUPPLYFANSPEED,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_SUPPLYFANSPEED),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ + Dimensionless.class.getSimpleName())),
+ Map.entry(CHANNEL_EXHAUSTFANSPEED,
+ new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_EXHAUSTFANSPEED),
+ CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ + Dimensionless.class.getSimpleName())),
+
+ Map.entry(CHANNEL_REPEATERMODE, new EnOceanChannelDescription(
+ new ChannelTypeUID(BINDING_ID, CHANNEL_REPEATERMODE), CoreItemFactory.STRING)));
// List of all repeater mode states
public static final String REPEATERMODE_OFF = "OFF";
diff --git a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/Helper.java b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/Helper.java
index 65822bc3e6a..511d81a5dd3 100644
--- a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/Helper.java
+++ b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/Helper.java
@@ -42,4 +42,12 @@ public class Helper {
}
return result;
}
+
+ public static int tryParseInt(String value, int defaultValue) {
+ try {
+ return Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ }
}
diff --git a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/D2_50/D2_50.java b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/D2_50/D2_50.java
new file mode 100644
index 00000000000..ee12d418e84
--- /dev/null
+++ b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/D2_50/D2_50.java
@@ -0,0 +1,184 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.enocean.internal.eep.D2_50;
+
+import static org.openhab.binding.enocean.internal.EnOceanBindingConstants.*;
+
+import java.util.function.Function;
+
+import org.openhab.binding.enocean.internal.Helper;
+import org.openhab.binding.enocean.internal.eep.Base._VLDMessage;
+import org.openhab.binding.enocean.internal.messages.ERP1Message;
+import org.openhab.core.config.core.Configuration;
+import org.openhab.core.config.discovery.DiscoveryResultBuilder;
+import org.openhab.core.library.types.DecimalType;
+import org.openhab.core.library.types.OnOffType;
+import org.openhab.core.library.types.OpenClosedType;
+import org.openhab.core.library.types.QuantityType;
+import org.openhab.core.library.types.StringType;
+import org.openhab.core.library.unit.SIUnits;
+import org.openhab.core.library.unit.Units;
+import org.openhab.core.types.Command;
+import org.openhab.core.types.RefreshType;
+import org.openhab.core.types.State;
+import org.openhab.core.types.UnDefType;
+
+/**
+ *
+ * @author Daniel Weber - Initial contribution
+ */
+public class D2_50 extends _VLDMessage {
+
+ protected static final byte mtMask = (byte) 0xf0;
+ protected static final byte MT_REMOTE_TRANSMISSION_REQUEST = 0x00;
+ protected static final byte MT_CONTROL = 0x20;
+ protected static final byte MT_BASIC_STATUS = 0x40;
+ protected static final byte MT_EXTENDED_STATUS = 0x60; // not yet implemented
+
+ protected static final byte rmtMask = (byte) 0x0f;
+ protected static final byte RMT_BASIC_STATUS = 0x00;
+ protected static final byte RMT_EXTENDED_STATUS = 0x01; // not yet implemented
+
+ protected static final byte DOMC_NOACTION = 0x0f;
+ protected static final byte CONTROL_NOACTION = 0;
+ protected static final byte TMOC_NOACTION = 127;
+ protected static final byte TMOC_ACTIVATE = (byte) 0xff;
+ protected static final byte THRESHOLD_NOACTION = 127;
+
+ public D2_50() {
+ super();
+ }
+
+ public D2_50(ERP1Message packet) {
+ super(packet);
+ }
+
+ protected byte getMessageType(byte b) {
+ return (byte) (b & mtMask);
+ }
+
+ @Override
+ public void addConfigPropertiesTo(DiscoveryResultBuilder discoveredThingResultBuilder) {
+ discoveredThingResultBuilder.withProperty(PARAMETER_SENDINGEEPID, getEEPType().getId())
+ .withProperty(PARAMETER_RECEIVINGEEPID, getEEPType().getId());
+ }
+
+ @Override
+ protected void convertFromCommandImpl(String channelId, String channelTypeId, Command command,
+ Function getCurrentStateFunc, Configuration config) {
+
+ // we need to send just a single message to refresh all channel states, hence just send refresh for OM
+ if (command == RefreshType.REFRESH && CHANNEL_VENTILATIONOPERATIONMODE.equals(channelId)) {
+ setData((byte) (MT_REMOTE_TRANSMISSION_REQUEST + RMT_BASIC_STATUS));
+ } else {
+ switch (channelId) {
+ case CHANNEL_VENTILATIONOPERATIONMODE:
+ if (command instanceof StringType) {
+ byte value = (byte) (Helper.tryParseInt(((StringType) command).toString(), 15) & 0x0f);
+ setData((byte) (MT_CONTROL + value), CONTROL_NOACTION, TMOC_NOACTION, THRESHOLD_NOACTION,
+ THRESHOLD_NOACTION, CONTROL_NOACTION);
+ }
+ break;
+ case CHANNEL_TIMEROPERATIONMODE:
+ if (command instanceof OnOffType) {
+ byte value = (OnOffType) command == OnOffType.ON ? TMOC_ACTIVATE : TMOC_NOACTION;
+ setData((byte) (MT_CONTROL + DOMC_NOACTION), CONTROL_NOACTION, value, THRESHOLD_NOACTION,
+ THRESHOLD_NOACTION, CONTROL_NOACTION);
+ }
+ break;
+ }
+ }
+ }
+
+ @Override
+ protected State convertToStateImpl(String channelId, String channelTypeId,
+ Function getCurrentStateFunc, Configuration config) {
+
+ if (getMessageType(bytes[0]) != MT_BASIC_STATUS) {
+ return UnDefType.UNDEF;
+ }
+
+ switch (channelId) {
+ case CHANNEL_VENTILATIONOPERATIONMODE:
+ return new StringType(String.valueOf(bytes[0] & 0x0f));
+ case CHANNEL_FIREPLACESAFETYMODE:
+ return OnOffType.from(getBit(bytes[1], 3));
+ case CHANNEL_HEATEXCHANGERBYPASSSTATUS:
+ return getBit(bytes[1], 2) ? OpenClosedType.OPEN : OpenClosedType.CLOSED;
+ case CHANNEL_SUPPLYAIRFLAPSTATUS:
+ return getBit(bytes[1], 1) ? OpenClosedType.OPEN : OpenClosedType.CLOSED;
+ case CHANNEL_EXHAUSTAIRFLAPSTATUS:
+ return getBit(bytes[1], 0) ? OpenClosedType.OPEN : OpenClosedType.CLOSED;
+ case CHANNEL_DEFROSTMODE:
+ return OnOffType.from(getBit(bytes[2], 7));
+ case CHANNEL_COOLINGPROTECTIONMODE:
+ return OnOffType.from(getBit(bytes[2], 6));
+ case CHANNEL_OUTDOORAIRHEATERSTATUS:
+ return OnOffType.from(getBit(bytes[2], 5));
+ case CHANNEL_SUPPLYAIRHEATERSTATUS:
+ return OnOffType.from(getBit(bytes[2], 4));
+ case CHANNEL_DRAINHEATERSTATUS:
+ return OnOffType.from(getBit(bytes[2], 3));
+ case CHANNEL_TIMEROPERATIONMODE:
+ return OnOffType.from(getBit(bytes[2], 2));
+ case CHANNEL_MAINTENANCESTATUS:
+ return OnOffType.from(getBit(bytes[2], 1));
+ case CHANNEL_WEEKLYTIMERPROGRAMSTATUS:
+ return OnOffType.from(getBit(bytes[2], 0));
+ case CHANNEL_ROOMTEMPERATURECONTROLSTATUS:
+ return OnOffType.from(getBit(bytes[3], 7));
+ case CHANNEL_AIRQUALITYVALUE1:
+ return new QuantityType<>((bytes[3] & 0x7f), Units.PERCENT);
+ case CHANNEL_AIRQUALITYVALUE2:
+ return new QuantityType<>((bytes[4] & 0x7f), Units.PERCENT);
+ case CHANNEL_OUTDOORAIRTEMPERATURE:
+ return new QuantityType<>(-63 + (bytes[5] >>> 1), SIUnits.CELSIUS);
+ case CHANNEL_SUPPLYAIRTEMPERATURE:
+ return new QuantityType<>(-63 + (bytes[6] >>> 2) + ((bytes[5] & 1) << 6), SIUnits.CELSIUS);
+ case CHANNEL_INDOORAIRTEMPERATURE:
+ return new QuantityType<>(-63 + (bytes[7] >>> 3) + ((bytes[6] & 0b11) << 5), SIUnits.CELSIUS);
+ case CHANNEL_EXHAUSTAIRTEMPERATURE:
+ return new QuantityType<>(-63 + (bytes[8] >>> 4) + ((bytes[7] & 0b111) << 4), SIUnits.CELSIUS);
+ case CHANNEL_SUPPLYAIRFANAIRFLOWRATE:
+ return new QuantityType<>((bytes[9] >>> 2) + ((bytes[8] & 0b1111) << 6), Units.CUBICMETRE_PER_MINUTE);
+ case CHANNEL_EXHAUSTAIRFANAIRFLOWRATE:
+ return new QuantityType<>((bytes[10] & 0xff) + ((bytes[9] & 0b11) << 8), Units.CUBICMETRE_PER_MINUTE);
+ case CHANNEL_SUPPLYFANSPEED:
+ return new DecimalType((bytes[12] >>> 4) + (bytes[11] << 4));
+ case CHANNEL_EXHAUSTFANSPEED:
+ return new DecimalType((bytes[13] & 0xff) + ((bytes[12] & 0b1111) << 8));
+ }
+
+ return UnDefType.UNDEF;
+ }
+
+ @Override
+ protected boolean validateData(byte[] bytes) {
+ if (bytes.length == 0) {
+ return false;
+ }
+
+ switch (getMessageType(bytes[0])) {
+ case MT_REMOTE_TRANSMISSION_REQUEST:
+ return bytes.length == 1;
+ case MT_CONTROL:
+ return bytes.length == 6;
+ case MT_BASIC_STATUS:
+ return bytes.length == 14;
+ case MT_EXTENDED_STATUS: // MT_EXTENDED_STATUS is not yet supported, however return true to avoid Exceptions
+ return true;
+ default:
+ return false;
+ }
+ }
+}
diff --git a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/EEPType.java b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/EEPType.java
index 562bf8582db..451c853303f 100644
--- a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/EEPType.java
+++ b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/EEPType.java
@@ -136,6 +136,7 @@ import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_12_NodON;
import org.openhab.binding.enocean.internal.eep.D2_03.D2_03_0A;
import org.openhab.binding.enocean.internal.eep.D2_05.D2_05_00;
import org.openhab.binding.enocean.internal.eep.D2_14.D2_14_30;
+import org.openhab.binding.enocean.internal.eep.D2_50.D2_50;
import org.openhab.binding.enocean.internal.eep.D5_00.D5_00_01;
import org.openhab.binding.enocean.internal.eep.F6_01.F6_01_01;
import org.openhab.binding.enocean.internal.eep.F6_02.F6_02_01;
@@ -457,7 +458,43 @@ public enum EEPType {
MultiFunctionSensor_30(RORG.VLD, 0x14, 0x30, false, D2_14_30.class, THING_TYPE_MULTFUNCTIONSMOKEDETECTOR,
CHANNEL_SMOKEDETECTION, CHANNEL_SENSORFAULT, CHANNEL_TIMESINCELASTMAINTENANCE, CHANNEL_BATTERY_LEVEL,
CHANNEL_REMAININGPLT, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY, CHANNEL_HYGROCOMFORTINDEX,
- CHANNEL_INDOORAIRANALYSIS);
+ CHANNEL_INDOORAIRANALYSIS),
+
+ HeatRecoveryVentilation_00(RORG.VLD, 0x50, 0x00, false, D2_50.class, THING_TYPE_HEATRECOVERYVENTILATION,
+ CHANNEL_VENTILATIONOPERATIONMODE, CHANNEL_SUPPLYAIRFLAPSTATUS, CHANNEL_WEEKLYTIMERPROGRAMSTATUS,
+ CHANNEL_EXHAUSTAIRFLAPSTATUS, CHANNEL_DEFROSTMODE, CHANNEL_COOLINGPROTECTIONMODE,
+ CHANNEL_OUTDOORAIRHEATERSTATUS, CHANNEL_SUPPLYAIRHEATERSTATUS, CHANNEL_DRAINHEATERSTATUS,
+ CHANNEL_TIMEROPERATIONMODE, CHANNEL_MAINTENANCESTATUS, CHANNEL_ROOMTEMPERATURECONTROLSTATUS,
+ CHANNEL_AIRQUALITYVALUE1, CHANNEL_AIRQUALITYVALUE2, CHANNEL_OUTDOORAIRTEMPERATURE,
+ CHANNEL_SUPPLYAIRTEMPERATURE, CHANNEL_INDOORAIRTEMPERATURE, CHANNEL_EXHAUSTAIRTEMPERATURE,
+ CHANNEL_SUPPLYAIRFANAIRFLOWRATE, CHANNEL_EXHAUSTAIRFANAIRFLOWRATE, CHANNEL_SUPPLYFANSPEED,
+ CHANNEL_EXHAUSTFANSPEED),
+ HeatRecoveryVentilation_01(RORG.VLD, 0x50, 0x01, false, D2_50.class, THING_TYPE_HEATRECOVERYVENTILATION,
+ CHANNEL_VENTILATIONOPERATIONMODE, CHANNEL_SUPPLYAIRFLAPSTATUS, CHANNEL_WEEKLYTIMERPROGRAMSTATUS,
+ CHANNEL_EXHAUSTAIRFLAPSTATUS, CHANNEL_DEFROSTMODE, CHANNEL_COOLINGPROTECTIONMODE,
+ CHANNEL_OUTDOORAIRHEATERSTATUS, CHANNEL_SUPPLYAIRHEATERSTATUS, CHANNEL_DRAINHEATERSTATUS,
+ CHANNEL_TIMEROPERATIONMODE, CHANNEL_MAINTENANCESTATUS, CHANNEL_ROOMTEMPERATURECONTROLSTATUS,
+ CHANNEL_AIRQUALITYVALUE1, CHANNEL_AIRQUALITYVALUE2, CHANNEL_OUTDOORAIRTEMPERATURE,
+ CHANNEL_SUPPLYAIRTEMPERATURE, CHANNEL_INDOORAIRTEMPERATURE, CHANNEL_EXHAUSTAIRTEMPERATURE,
+ CHANNEL_SUPPLYAIRFANAIRFLOWRATE, CHANNEL_EXHAUSTAIRFANAIRFLOWRATE, CHANNEL_SUPPLYFANSPEED,
+ CHANNEL_EXHAUSTFANSPEED),
+ HeatRecoveryVentilation_10(RORG.VLD, 0x50, 0x10, false, D2_50.class, THING_TYPE_HEATRECOVERYVENTILATION,
+ CHANNEL_VENTILATIONOPERATIONMODE, CHANNEL_DEFROSTMODE, CHANNEL_COOLINGPROTECTIONMODE,
+ CHANNEL_OUTDOORAIRHEATERSTATUS, CHANNEL_SUPPLYAIRHEATERSTATUS, CHANNEL_DRAINHEATERSTATUS,
+ CHANNEL_TIMEROPERATIONMODE, CHANNEL_MAINTENANCESTATUS, CHANNEL_ROOMTEMPERATURECONTROLSTATUS,
+ CHANNEL_AIRQUALITYVALUE1, CHANNEL_AIRQUALITYVALUE2, CHANNEL_OUTDOORAIRTEMPERATURE,
+ CHANNEL_SUPPLYAIRTEMPERATURE, CHANNEL_INDOORAIRTEMPERATURE, CHANNEL_EXHAUSTAIRTEMPERATURE,
+ CHANNEL_SUPPLYAIRFANAIRFLOWRATE, CHANNEL_EXHAUSTAIRFANAIRFLOWRATE, CHANNEL_SUPPLYFANSPEED,
+ CHANNEL_EXHAUSTFANSPEED, CHANNEL_WEEKLYTIMERPROGRAMSTATUS),
+ HeatRecoveryVentilation_11(RORG.VLD, 0x50, 0x11, false, D2_50.class, THING_TYPE_HEATRECOVERYVENTILATION,
+ CHANNEL_VENTILATIONOPERATIONMODE, CHANNEL_FIREPLACESAFETYMODE, CHANNEL_HEATEXCHANGERBYPASSSTATUS,
+ CHANNEL_DEFROSTMODE, CHANNEL_COOLINGPROTECTIONMODE, CHANNEL_OUTDOORAIRHEATERSTATUS,
+ CHANNEL_WEEKLYTIMERPROGRAMSTATUS, CHANNEL_SUPPLYAIRHEATERSTATUS, CHANNEL_DRAINHEATERSTATUS,
+ CHANNEL_TIMEROPERATIONMODE, CHANNEL_MAINTENANCESTATUS, CHANNEL_ROOMTEMPERATURECONTROLSTATUS,
+ CHANNEL_AIRQUALITYVALUE1, CHANNEL_AIRQUALITYVALUE2, CHANNEL_OUTDOORAIRTEMPERATURE,
+ CHANNEL_SUPPLYAIRTEMPERATURE, CHANNEL_INDOORAIRTEMPERATURE, CHANNEL_EXHAUSTAIRTEMPERATURE,
+ CHANNEL_SUPPLYAIRFANAIRFLOWRATE, CHANNEL_EXHAUSTAIRFANAIRFLOWRATE, CHANNEL_SUPPLYFANSPEED,
+ CHANNEL_EXHAUSTFANSPEED);
private RORG rorg;
private int func;
diff --git a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBaseActuatorHandler.java b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBaseActuatorHandler.java
index 970947763fd..59076915379 100644
--- a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBaseActuatorHandler.java
+++ b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBaseActuatorHandler.java
@@ -14,10 +14,8 @@ package org.openhab.binding.enocean.internal.handler;
import static org.openhab.binding.enocean.internal.EnOceanBindingConstants.*;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
@@ -50,8 +48,9 @@ import org.openhab.core.util.HexUtils;
public class EnOceanBaseActuatorHandler extends EnOceanBaseSensorHandler {
// List of thing types which support sending of eep messages
- public static final Set SUPPORTED_THING_TYPES = new HashSet<>(Arrays.asList(THING_TYPE_CENTRALCOMMAND,
- THING_TYPE_MEASUREMENTSWITCH, THING_TYPE_GENERICTHING, THING_TYPE_ROLLERSHUTTER, THING_TYPE_THERMOSTAT));
+ public static final Set SUPPORTED_THING_TYPES = Set.of(THING_TYPE_CENTRALCOMMAND,
+ THING_TYPE_MEASUREMENTSWITCH, THING_TYPE_GENERICTHING, THING_TYPE_ROLLERSHUTTER, THING_TYPE_THERMOSTAT,
+ THING_TYPE_HEATRECOVERYVENTILATION);
protected byte[] senderId; // base id of bridge + senderIdOffset, used for sending msg
protected byte[] destinationId; // in case of broadcast FFFFFFFF otherwise the enocean id of the device
diff --git a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBaseSensorHandler.java b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBaseSensorHandler.java
index c85aa460b32..d533c1e558c 100644
--- a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBaseSensorHandler.java
+++ b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBaseSensorHandler.java
@@ -14,11 +14,9 @@ package org.openhab.binding.enocean.internal.handler;
import static org.openhab.binding.enocean.internal.EnOceanBindingConstants.*;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
-import java.util.HashSet;
import java.util.Hashtable;
import java.util.Set;
import java.util.function.Predicate;
@@ -51,12 +49,11 @@ import org.openhab.core.util.HexUtils;
public class EnOceanBaseSensorHandler extends EnOceanBaseThingHandler implements PacketListener {
// List of all thing types which support receiving of eep messages
- public static final Set SUPPORTED_THING_TYPES = new HashSet<>(
- Arrays.asList(THING_TYPE_ROOMOPERATINGPANEL, THING_TYPE_MECHANICALHANDLE, THING_TYPE_CONTACT,
- THING_TYPE_TEMPERATURESENSOR, THING_TYPE_TEMPERATUREHUMIDITYSENSOR, THING_TYPE_ROCKERSWITCH,
- THING_TYPE_OCCUPANCYSENSOR, THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, THING_TYPE_LIGHTSENSOR,
- THING_TYPE_PUSHBUTTON, THING_TYPE_AUTOMATEDMETERSENSOR, THING_TYPE_ENVIRONMENTALSENSOR,
- THING_TYPE_MULTFUNCTIONSMOKEDETECTOR));
+ public static final Set SUPPORTED_THING_TYPES = Set.of(THING_TYPE_ROOMOPERATINGPANEL,
+ THING_TYPE_MECHANICALHANDLE, THING_TYPE_CONTACT, THING_TYPE_TEMPERATURESENSOR,
+ THING_TYPE_TEMPERATUREHUMIDITYSENSOR, THING_TYPE_ROCKERSWITCH, THING_TYPE_OCCUPANCYSENSOR,
+ THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, THING_TYPE_LIGHTSENSOR, THING_TYPE_PUSHBUTTON,
+ THING_TYPE_AUTOMATEDMETERSENSOR, THING_TYPE_ENVIRONMENTALSENSOR, THING_TYPE_MULTFUNCTIONSMOKEDETECTOR);
protected final Hashtable receivingEEPTypes = new Hashtable<>();
diff --git a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBridgeHandler.java b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBridgeHandler.java
index 9fc1c5eee4d..c888f6a60be 100644
--- a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBridgeHandler.java
+++ b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanBridgeHandler.java
@@ -16,9 +16,7 @@ import static org.openhab.binding.enocean.internal.EnOceanBindingConstants.*;
import java.io.IOException;
import java.math.BigDecimal;
-import java.util.Arrays;
import java.util.Collection;
-import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import java.util.concurrent.ScheduledFuture;
@@ -70,7 +68,7 @@ public class EnOceanBridgeHandler extends ConfigStatusBridgeHandler implements T
private Logger logger = LoggerFactory.getLogger(EnOceanBridgeHandler.class);
- public static final Set SUPPORTED_THING_TYPES = new HashSet<>(Arrays.asList(THING_TYPE_BRIDGE));
+ public static final Set SUPPORTED_THING_TYPES = Set.of(THING_TYPE_BRIDGE);
private EnOceanTransceiver transceiver; // holds connection to serial/tcp port and sends/receives messages
private ScheduledFuture> connectorTask; // is used for reconnection if something goes wrong
diff --git a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanClassicDeviceHandler.java b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanClassicDeviceHandler.java
index 3e52c257e90..412cd9ad8d8 100644
--- a/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanClassicDeviceHandler.java
+++ b/bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/handler/EnOceanClassicDeviceHandler.java
@@ -14,8 +14,6 @@ package org.openhab.binding.enocean.internal.handler;
import static org.openhab.binding.enocean.internal.EnOceanBindingConstants.*;
-import java.util.Arrays;
-import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
@@ -56,8 +54,7 @@ import org.openhab.core.util.HexUtils;
public class EnOceanClassicDeviceHandler extends EnOceanBaseActuatorHandler {
// List of thing types which support sending of eep messages
- public static final Set SUPPORTED_THING_TYPES = new HashSet<>(
- Arrays.asList(THING_TYPE_CLASSICDEVICE));
+ public static final Set SUPPORTED_THING_TYPES = Set.of(THING_TYPE_CLASSICDEVICE);
private StringType lastTriggerEvent = StringType.valueOf(CommonTriggerEvents.DIR1_PRESSED);
ScheduledFuture> releaseFuture = null;
diff --git a/bundles/org.openhab.binding.enocean/src/main/resources/OH-INF/thing/HeatRecoveryVentilation.xml b/bundles/org.openhab.binding.enocean/src/main/resources/OH-INF/thing/HeatRecoveryVentilation.xml
new file mode 100644
index 00000000000..cd58af2cbf2
--- /dev/null
+++ b/bundles/org.openhab.binding.enocean/src/main/resources/OH-INF/thing/HeatRecoveryVentilation.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+ Sensor and actuator to control heat recovery ventilation units (EEP: D2-50)
+
+
+
+
+ EnOceanId of device this thing belongs to
+ true
+
+
+
+ Id is used to generate the EnOcean Id (Int between [1-127]). If not specified the next free Id will be
+ determined by bridge
+ true
+
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+ false
+
+
+
+ EEP which is used by Ventilation Unit
+
+
+
+
+
+
+ true
+ true
+
+
+
+ false
+
+
+
+
+
+
diff --git a/bundles/org.openhab.binding.enocean/src/main/resources/OH-INF/thing/channels.xml b/bundles/org.openhab.binding.enocean/src/main/resources/OH-INF/thing/channels.xml
index 9550e0d5e6a..9469d48b8c9 100644
--- a/bundles/org.openhab.binding.enocean/src/main/resources/OH-INF/thing/channels.xml
+++ b/bundles/org.openhab.binding.enocean/src/main/resources/OH-INF/thing/channels.xml
@@ -576,4 +576,187 @@
+
+ String
+
+ Sets the ventilation mode/level.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Switch
+
+ Indicates if device is running in fireplace safety mode
+
+
+
+
+ Contact
+
+ Indicates if heat exchanger bypass is open (heat recovery inactive) or closed (heat recovery active)
+
+
+
+
+ Contact
+
+ Indicates if supply air flap is open or closed
+
+
+
+
+ Contact
+
+ Indicates if exhaust air flap is open or closed
+
+
+
+
+ Switch
+
+ Indicates if defrosting of heat exchanger is active or not
+
+
+
+
+ Switch
+
+ Indicates if device is running in cooling protection mode
+
+
+
+
+ Switch
+
+ Indicates if outdoor air heater is active or not
+
+
+
+
+ Switch
+
+ Indicates if supply air heater is active or not
+
+
+
+
+ Switch
+
+ Indicates if drain heater is active or not
+
+
+
+
+ Switch
+
+ Indicates if timer operation mode is active or not
+
+
+
+ Switch
+
+ Indicates if device is running according to configured program or not
+
+
+
+
+ Switch
+
+ Indicates if room temperature control is active or not
+
+
+
+
+ Number:Dimensionless
+
+ Air quality value of first sensor in percentages
+
+
+
+
+ Number:Dimensionless
+
+ Air quality value of second sensor in percentages
+
+
+
+
+ Number:Temperature
+
+ Current outdoor air temperature in degree Celsius
+ Temperature
+
+
+
+
+ Number:Temperature
+
+ Current supply air temperature in degree Celsius
+ Temperature
+
+
+
+
+ Number:Temperature
+
+ Current indoor air temperature in degree Celsius
+ Temperature
+
+
+
+
+ Number:Temperature
+
+ Current exhaust air temperature in degree Celsius
+ Temperature
+
+
+
+
+ Number:VolumetricFlowRate
+
+ Current supply air fan air flow rate
+
+
+
+
+ Number:VolumetricFlowRate
+
+ Current exhaust air fan air flow rate
+
+
+
+
+ Number:Dimensionless
+
+ Supply fan speed in revolutions per minutes
+
+
+
+
+ Number:Dimensionless
+
+ Exhaust fan speed in revolutions per minutes
+
+
+