]> git.basschouten.com Git - openhab-addons.git/commitdiff
[enocean] Fix humidity and temperature readings for EEP family A5_10 (#15506)
authorDaniel Weber <25605184+fruggy83@users.noreply.github.com>
Mon, 28 Aug 2023 20:49:20 +0000 (22:49 +0200)
committerGitHub <noreply@github.com>
Mon, 28 Aug 2023 20:49:20 +0000 (22:49 +0200)
* Updated A5-10 EEP family (corrected readings, added new channels)
 * Changed fanSpeedStage channel to type Number and added new options to it
 * Added dayNightModeState channel

Fixes #15458

Signed-off-by: Daniel Weber <uni@fruggy.de>
26 files changed:
bundles/org.openhab.binding.enocean/README.md
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/EnOceanBindingConstants.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/Helper.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_10.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_11.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_12.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_13.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_14.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_15.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_16.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_17.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_18.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_19.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_1A.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_1B.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_1C.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_1D.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_1E.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_20.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_21.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_22.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/A5_10/A5_10_23.java
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/eep/EEPType.java
bundles/org.openhab.binding.enocean/src/main/resources/OH-INF/i18n/enocean.properties
bundles/org.openhab.binding.enocean/src/main/resources/OH-INF/thing/channels.xml

index e3488717c1b3ae57472131aa60ad1789d29fd036..4454cfcffa5ee34eef71c9e159c7af18db2020ae 100644 (file)
@@ -89,7 +89,7 @@ Hence if your device supports one of the following EEPs the chances are good tha
 | occupancySensor                 | A5-07             | 0x01-03                 | illumination, batteryVoltage, motionDetection               | NodON PIR-2-1-01        | Discovery |
 | lightTemperatureOccupancySensor | A5-08             | 0x01-03                 | illumination, temperature, occupancy, motionDetection       | Eltako FABH             | Discovery |
 | lightSensor                     | A5-06             | 0x01                    | illumination                                                | Eltako TF-AHDSB         | Discovery |
-| roomOperatingPanel              | A5-10             | 0x01-23                 | temperature, setPoint, fanSpeedStage, occupancy             | Thermokon SR04          | Discovery |
+| roomOperatingPanel              | A5-10             | 0x01-23                 | temperature, setPoint, fanSpeedStage, occupancy, dayNightModeState, conntact, humidity, illumination, batteryLevel, batteryLow             | Thermokon SR04          | Discovery |
 | automatedMeterSensor            | A5-12             | 0x00-03                 | counter, currentNumber, instantpower, totalusage, amrLitre, amrCubicMetre | FWZ12     | Discovery |
 | environmentalSensor             | A5-13             | 0x01-02                 | temperature, windspeed, illumination, rainStatus            | FWS61                   | Discovery |
 | centralCommand                  | A5-38             | 0x08                    | dimmer, generalSwitch                                       | Eltako FUD14, FSR14     | Teach-in  |
@@ -297,7 +297,7 @@ The channels of a thing are determined automatically based on the chosen EEP.
 | occupancy                         | Switch                    | Occupancy button pressed (ON) or released (OFF) |
 | motionDetection                   | Switch                    | On=Motion detected, Off=not |
 | setPoint                          | Number                    | linear set point |
-| fanSpeedStage                     | String                    | Fan speed: -1 (Auto), 0, 1, 2, 3 |
+| fanSpeedStage                     | Number                    | Fan speed: -1 (Auto), 0, 1, 2, 3, 4, 5, 6 |
 | dimmer                            | Dimmer                    | Dimmer value in percent |
 | generalSwitch(/A/B)               | Switch                    | Switch something (channel A/B) ON/OFF |
 | rollershutter                     | Rollershutter             | Shut time (shutTime) in seconds can be configured |
@@ -350,6 +350,7 @@ The channels of a thing are determined automatically based on the chosen EEP.
 | windowBreachEvent                 | Trigger                   | Emits event 'ALARM' |
 | protectionPlusEvent               | Trigger                   | Emits event 'ALARM' |
 | vacationModeToggleEvent           | Trigger                   | Emits events 'ACTIVATED', 'DEACTIVATED' |
+| dayNightModeState                 | Number                    | 0 = Night mode on, 1 = day mode on |
 
 Items linked to bi-directional actuators (actuator sends status messages back) should always disable the `autoupdate`.
 This is especially true for Eltako rollershutter, as their position is calculated out of the current position and the moving time.
index 6de90dbbdf015101c41ab428770c0fd54ca65b5c..346f202525aa1420c0d240c61d5691f1a3dfe105 100644 (file)
@@ -221,6 +221,7 @@ public class EnOceanBindingConstants {
     public static final String CHANNEL_EXHAUSTAIRFANAIRFLOWRATE = "exhaustAirFanAirFlowRate";
     public static final String CHANNEL_SUPPLYFANSPEED = "supplyFanSpeed";
     public static final String CHANNEL_EXHAUSTFANSPEED = "exhaustFanSpeed";
+    public final static String CHANNEL_DAYNIGHTMODESTATE = "dayNightModeState";
 
     public static final Map<String, EnOceanChannelDescription> CHANNELID2CHANNELDESCRIPTION = Map.ofEntries(
             Map.entry(CHANNEL_GENERAL_SWITCHING,
@@ -263,7 +264,7 @@ public class EnOceanBindingConstants {
                             CoreItemFactory.NUMBER)),
             Map.entry(CHANNEL_FANSPEEDSTAGE,
                     new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_FANSPEEDSTAGE),
-                            CoreItemFactory.STRING)),
+                            CoreItemFactory.NUMBER)),
             Map.entry(CHANNEL_OCCUPANCY,
                     new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_OCCUPANCY),
                             CoreItemFactory.SWITCH)),
@@ -575,6 +576,9 @@ public class EnOceanBindingConstants {
                     new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_EXHAUSTFANSPEED),
                             CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
                                     + Dimensionless.class.getSimpleName())),
+            Map.entry(CHANNEL_DAYNIGHTMODESTATE,
+                    new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_DAYNIGHTMODESTATE),
+                            CoreItemFactory.NUMBER)),
 
             Map.entry(CHANNEL_STATUS_REQUEST_EVENT,
                     new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_STATUS_REQUEST_EVENT), null,
index 6420e8d6874c6ca923b9b77f0b589b13a9312e0d..897e8010cd6dd5f9f19af62ea83928d2b3555d1e 100644 (file)
@@ -53,4 +53,26 @@ public class Helper {
             return defaultValue;
         }
     }
+
+    /**
+     * Scales the given value
+     * 
+     * @param value Value to be scaled
+     * @param minUnscaled Value for min value in unscaled dimension
+     * @param maxUnscaled Value for max value in unscaled dimension
+     * @param minValue
+     * @param maxValue
+     * @return
+     */
+    public static double scaleValue(double value, double minUnscaled, double maxUnscaled, double minValue,
+            double maxValue) {
+        double range = maxValue - minValue;
+        double unscaledRange = maxUnscaled - minUnscaled;
+
+        if (maxUnscaled > minUnscaled) {
+            return minValue + (value * range / unscaledRange);
+        } else {
+            return maxValue + (value * range / unscaledRange);
+        }
+    }
 }
index a78169252681d065c3944f03ce9288fc08f905e6..f97c9e7041c27507155a879e77effe202ceacdf4 100644 (file)
@@ -18,19 +18,24 @@ import java.util.function.Function;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.enocean.internal.Helper;
 import org.openhab.binding.enocean.internal.eep.Base._4BSMessage;
 import org.openhab.binding.enocean.internal.messages.ERP1Message;
 import org.openhab.core.config.core.Configuration;
 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.State;
 import org.openhab.core.types.UnDefType;
 
 /**
- *
+ * From A5_10_01 up to A5_10_0D temperature is given as a 8Bit value (range: 255..0).
+ * Therefore higher values mean lower temperatures.
+ * Temperature range 0..40.
+ * 
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
@@ -40,32 +45,105 @@ public abstract class A5_10 extends _4BSMessage {
         super(packet);
     }
 
+    protected int getSetPointValue() {
+        // this is the default one
+        return getDB2Value();
+    }
+
+    protected double getMinTemperatureValue() {
+        return 0.0;
+    }
+
+    protected double getMinUnscaledTemperatureValue() {
+        return 255.0;
+    }
+
+    protected double getMaxTemperatureValue() {
+        return 40.0;
+    }
+
+    protected double getMaxUnscaledTemperatureValue() {
+        return 0.0;
+    }
+
+    protected double getTemperatureValue() {
+        return getDB1Value();
+    }
+
+    protected State getTemperature() {
+        return new QuantityType<>(
+                Helper.scaleValue(getTemperatureValue(), getMinUnscaledTemperatureValue(),
+                        getMaxUnscaledTemperatureValue(), getMinTemperatureValue(), getMaxTemperatureValue()),
+                SIUnits.CELSIUS);
+    }
+
+    protected State getFanSpeedStage() {
+        if (getDB3Value() > 209) {
+            return new DecimalType(-1);
+        } else if (getDB3Value() > 189) {
+            return new DecimalType(0);
+        } else if (getDB3Value() > 164) {
+            return new DecimalType(1);
+        } else if (getDB3Value() > 144) {
+            return new DecimalType(2);
+        } else {
+            return new DecimalType(3);
+        }
+    }
+
+    protected int getIlluminationValue() {
+        return getDB3Value();
+    }
+
+    protected State getIllumination() {
+        return new QuantityType<>(getIlluminationValue() * 4, Units.LUX);
+    }
+
+    protected double getHumidityValue() {
+        return getDB2Value();
+    }
+
+    protected State getSupplyVoltage() {
+        double voltage = ((double) getDB3Value()) / 50.0;
+        return new QuantityType<>(voltage, Units.VOLT);
+    }
+
     @Override
     protected State convertToStateImpl(String channelId, String channelTypeId,
             Function<String, @Nullable State> getCurrentStateFunc, Configuration config) {
+
         switch (channelId) {
+
+            case CHANNEL_BATTERY_VOLTAGE:
+                return getSupplyVoltage();
+
+            case CHANNEL_ILLUMINATION:
+                return getIllumination();
+
             case CHANNEL_FANSPEEDSTAGE:
-                if (getDB3Value() > 209) {
-                    return new StringType("-1");
-                } else if (getDB3Value() > 189) {
-                    return new StringType("0");
-                } else if (getDB3Value() > 164) {
-                    return new StringType("1");
-                } else if (getDB3Value() > 144) {
-                    return new StringType("2");
-                } else {
-                    return new StringType("3");
-                }
+                return getFanSpeedStage();
 
             case CHANNEL_SETPOINT:
-                return new DecimalType(getDB2Value());
+                return new DecimalType(getSetPointValue());
+
+            case CHANNEL_HUMIDITY:
+                return new DecimalType(getHumidityValue() / 2.5);
 
             case CHANNEL_TEMPERATURE:
-                double temp = (getDB1Value() - 255) / -6.375;
-                return new QuantityType<>(temp, SIUnits.CELSIUS);
+                return getTemperature();
+
+            case CHANNEL_BATTERYLOW:
+                return getBit(getDB0(), 4) ? OnOffType.ON : OnOffType.OFF;
 
             case CHANNEL_OCCUPANCY:
                 return getBit(getDB0(), 0) ? OnOffType.OFF : OnOffType.ON;
+
+            case CHANNEL_DAYNIGHTMODESTATE:
+                return new DecimalType(getDB0Value() & 0x01);
+
+            case CHANNEL_CONTACT:
+                return getBit(getDB0(), 0) ? OpenClosedType.OPEN : OpenClosedType.CLOSED;
+
         }
 
         return UnDefType.UNDEF;
index e6e98a1a31ff29abf58ae769c9a79d1dea1eb8ee..8714354ee4a46d6905457a0ed0daa9c6b40470cc 100644 (file)
@@ -16,7 +16,10 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.openhab.binding.enocean.internal.messages.ERP1Message;
 
 /**
- *
+ * From A5_10_10 up to A5_10_14 temperature is given as a 8Bit value (range: 0..250!).
+ * Therefore higher values mean higher temperatures.
+ * Temperature range 0..40.
+ * 
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
@@ -25,4 +28,29 @@ public class A5_10_10 extends A5_10 {
     public A5_10_10(ERP1Message packet) {
         super(packet);
     }
+
+    @Override
+    protected int getSetPointValue() {
+        return getDB3Value();
+    }
+
+    @Override
+    protected double getMinTemperatureValue() {
+        return 0.0;
+    }
+
+    @Override
+    protected double getMinUnscaledTemperatureValue() {
+        return 0.0;
+    }
+
+    @Override
+    protected double getMaxTemperatureValue() {
+        return 40.0;
+    }
+
+    @Override
+    protected double getMaxUnscaledTemperatureValue() {
+        return 250.0;
+    }
 }
index 78f53cd4c06e7b31a1eb93a5d3ed9a3e36e795e1..49e23e12c77d5aa9f70296ae4e8798ec44a97c63 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_11 extends A5_10 {
+public class A5_10_11 extends A5_10_10 {
 
     public A5_10_11(ERP1Message packet) {
         super(packet);
index e9a8b66653cc1f05289337bc7cefe01e8dd8c259..d9098373aab1380925302a6e6391509c627684c1 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_12 extends A5_10 {
+public class A5_10_12 extends A5_10_10 {
 
     public A5_10_12(ERP1Message packet) {
         super(packet);
index f647693e4e9ec83c5c439fd58e6846bcb96716bc..a265647cf82a18971ed2682e9f6c5692daa824aa 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_13 extends A5_10 {
+public class A5_10_13 extends A5_10_10 {
 
     public A5_10_13(ERP1Message packet) {
         super(packet);
index 7085dac6263dece120e20176c61f1cf7e5db9169..dfdcf155b4d9b04ce9f2b9429d8dc68031e94c2b 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_14 extends A5_10 {
+public class A5_10_14 extends A5_10_10 {
 
     public A5_10_14(ERP1Message packet) {
         super(packet);
index 2cb138589fd46bd90036169a67d2a7915a62f15c..815536cc06e244e271e28165e03afea92470fca4 100644 (file)
@@ -16,7 +16,10 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.openhab.binding.enocean.internal.messages.ERP1Message;
 
 /**
- *
+ * From A5_10_15 up to A5_10_17 temperature is given as a 10Bit value (range: 1023..0).
+ * Therefore higher values mean lower temperatures.
+ * Temperature range -10..41.2.
+ * 
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
@@ -25,4 +28,34 @@ public class A5_10_15 extends A5_10 {
     public A5_10_15(ERP1Message packet) {
         super(packet);
     }
+
+    @Override
+    protected int getSetPointValue() {
+        return getDB2Value() >>> 2;
+    }
+
+    @Override
+    protected double getMinTemperatureValue() {
+        return -10.0;
+    }
+
+    @Override
+    protected double getMinUnscaledTemperatureValue() {
+        return 1023.0;
+    }
+
+    @Override
+    protected double getMaxTemperatureValue() {
+        return 41.2;
+    }
+
+    @Override
+    protected double getMaxUnscaledTemperatureValue() {
+        return 0.0;
+    }
+
+    @Override
+    protected double getTemperatureValue() {
+        return ((getDB2Value() & 0b11) << 8) + getDB1Value();
+    }
 }
index af61d6b21139dd9767c59cb0f4c56fd1e6e3a6dd..a1f7b117e95dca27b0d21c183a32be750926cb42 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_16 extends A5_10 {
+public class A5_10_16 extends A5_10_15 {
 
     public A5_10_16(ERP1Message packet) {
         super(packet);
index 544a625a6eae0de8c217b6c44a238d92c7630e5a..213872d485b0ce4ffc4f70b610af01e8a0d18c97 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_17 extends A5_10 {
+public class A5_10_17 extends A5_10_15 {
 
     public A5_10_17(ERP1Message packet) {
         super(packet);
index 519177ade7e6cdfdff551bc650c5be4368092537..025b430bffee4b09ed1d366db50a797279833085 100644 (file)
@@ -14,9 +14,14 @@ package org.openhab.binding.enocean.internal.eep.A5_10;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.openhab.binding.enocean.internal.messages.ERP1Message;
+import org.openhab.core.library.types.DecimalType;
+import org.openhab.core.types.State;
 
 /**
- *
+ * From A5_10_18 up to A5_10_17 temperature is given as a 8Bit value (range: 250(!)..0).
+ * Therefore higher values mean lower temperatures.
+ * Temperature range 0..40.
+ * 
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
@@ -25,4 +30,13 @@ public class A5_10_18 extends A5_10 {
     public A5_10_18(ERP1Message packet) {
         super(packet);
     }
+
+    protected double getMinUnscaledTemperatureValue() {
+        return 250.0;
+    }
+
+    @Override
+    protected State getFanSpeedStage() {
+        return new DecimalType((getDB0Value() >>> 4) - 1);
+    }
 }
index 9cef98b3dcf3eb9a4ce71a2100222e5b1f08c63d..222d1b9cfd3c9ea4b9d2704cb21dac69bd358d10 100644 (file)
@@ -20,9 +20,14 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_19 extends A5_10 {
+public class A5_10_19 extends A5_10_18 {
 
     public A5_10_19(ERP1Message packet) {
         super(packet);
     }
+
+    @Override
+    protected double getHumidityValue() {
+        return getDB3Value();
+    }
 }
index e3552cbafe80bcd5aefe4a538ed0074ca1cbac51..be33a5fbb6953e5ad65b4d6f69fb6661d11c5ede 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_1A extends A5_10 {
+public class A5_10_1A extends A5_10_18 {
 
     public A5_10_1A(ERP1Message packet) {
         super(packet);
index bcf8d06f8d91903ea08cdc3fd198713e1ce93307..3972e5b1171289935c60d34a745f6b75eff33050 100644 (file)
@@ -20,9 +20,14 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_1B extends A5_10 {
+public class A5_10_1B extends A5_10_18 {
 
     public A5_10_1B(ERP1Message packet) {
         super(packet);
     }
+
+    @Override
+    protected int getIlluminationValue() {
+        return getDB2Value();
+    }
 }
index e0d53831ac890de6b41d97f85a6be59df53cf885..eb14a14f256c4f9813ab60a61c3175fcaabd06a5 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_1C extends A5_10 {
+public class A5_10_1C extends A5_10_18 {
 
     public A5_10_1C(ERP1Message packet) {
         super(packet);
index 462e7798f5143a2c711ae99122f64715c3926c4d..853f89adf1fff5d73fbf3b6e87b997e75d7d8d89 100644 (file)
@@ -20,9 +20,14 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_1D extends A5_10 {
+public class A5_10_1D extends A5_10_18 {
 
     public A5_10_1D(ERP1Message packet) {
         super(packet);
     }
+
+    @Override
+    protected double getHumidityValue() {
+        return getDB3Value();
+    }
 }
index 9e38b33c16660f5b2424aa5f5bba5074ab8a25cd..074e5e1bb0fd13af1afd29851394c1160654cb84 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_1E extends A5_10 {
+public class A5_10_1E extends A5_10_1B {
 
     public A5_10_1E(ERP1Message packet) {
         super(packet);
index 36b66763dc8f7644d868c11ebd70deec1af11d9e..ad9871c0868845980586a6f14460684282de5898 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_20 extends A5_10 {
+public class A5_10_20 extends A5_10_10 {
 
     public A5_10_20(ERP1Message packet) {
         super(packet);
index 4fa75dcc8b6975454a3a7719f999745340a1280c..5d01f2abb303a4b276d56cff70bd52fb4ec4c86a 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_21 extends A5_10 {
+public class A5_10_21 extends A5_10_10 {
 
     public A5_10_21(ERP1Message packet) {
         super(packet);
index 1a8d62a1706ced8a4ab25f3efdc0fc10821af0e5..abf957efe5fb0da45e0f724d56125fbb0e317dca 100644 (file)
@@ -14,15 +14,22 @@ package org.openhab.binding.enocean.internal.eep.A5_10;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.openhab.binding.enocean.internal.messages.ERP1Message;
+import org.openhab.core.library.types.DecimalType;
+import org.openhab.core.types.State;
 
 /**
  *
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_22 extends A5_10 {
+public class A5_10_22 extends A5_10_10 {
 
     public A5_10_22(ERP1Message packet) {
         super(packet);
     }
+
+    @Override
+    protected State getFanSpeedStage() {
+        return new DecimalType((getDB0Value() >>> 5) - 1);
+    }
 }
index b29dc6327000f612759d731373a55f069985f9b2..2de5fcf80200029d793830a03a7f8d8ec155c64d 100644 (file)
@@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
  * @author Daniel Weber - Initial contribution
  */
 @NonNullByDefault
-public class A5_10_23 extends A5_10 {
+public class A5_10_23 extends A5_10_22 {
 
     public A5_10_23(ERP1Message packet) {
         super(packet);
index ca86175e651cbae3adbe8a9b88403e85e4617d09..e1e9cf82e1d4a69dfd700a124b8df3212025a526 100644 (file)
@@ -321,7 +321,7 @@ public enum EEPType {
     RoomPanel_A5_10_01(RORG._4BS, 0x10, 0x01, false, A5_10_01.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
             CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
     RoomPanel_A5_10_02(RORG._4BS, 0x10, 0x02, false, A5_10_02.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE),
+            CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE, CHANNEL_DAYNIGHTMODESTATE),
     RoomPanel_A5_10_03(RORG._4BS, 0x10, 0x03, false, A5_10_03.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
             CHANNEL_SETPOINT),
     RoomPanel_A5_10_04(RORG._4BS, 0x10, 0x04, false, A5_10_04.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
@@ -329,61 +329,61 @@ public enum EEPType {
     RoomPanel_A5_10_05(RORG._4BS, 0x10, 0x05, false, A5_10_05.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
             CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
     RoomPanel_A5_10_06(RORG._4BS, 0x10, 0x06, false, A5_10_06.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT),
+            CHANNEL_SETPOINT, CHANNEL_DAYNIGHTMODESTATE),
     RoomPanel_A5_10_07(RORG._4BS, 0x10, 0x07, false, A5_10_07.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
             CHANNEL_FANSPEEDSTAGE),
     RoomPanel_A5_10_08(RORG._4BS, 0x10, 0x08, false, A5_10_08.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
             CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
     RoomPanel_A5_10_09(RORG._4BS, 0x10, 0x09, false, A5_10_09.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_FANSPEEDSTAGE),
+            CHANNEL_FANSPEEDSTAGE, CHANNEL_DAYNIGHTMODESTATE),
     RoomPanel_A5_10_0A(RORG._4BS, 0x10, 0x0A, false, A5_10_0A.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT),
-    RoomPanel_A5_10_0B(RORG._4BS, 0x10, 0x0B, false, A5_10_0B.class, THING_TYPE_ROOMOPERATINGPANEL,
-            CHANNEL_TEMPERATURE),
+            CHANNEL_SETPOINT, CHANNEL_CONTACT),
+    RoomPanel_A5_10_0B(RORG._4BS, 0x10, 0x0B, false, A5_10_0B.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
+            CHANNEL_CONTACT),
     RoomPanel_A5_10_0C(RORG._4BS, 0x10, 0x0C, false, A5_10_0C.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
             CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_0D(RORG._4BS, 0x10, 0x0D, false, A5_10_0D.class, THING_TYPE_ROOMOPERATINGPANEL,
-            CHANNEL_TEMPERATURE),
-    RoomPanel_A5_10_10(RORG._4BS, 0x10, 0x10, false, A5_10_10.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_11(RORG._4BS, 0x10, 0x11, false, A5_10_11.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT),
-    RoomPanel_A5_10_12(RORG._4BS, 0x10, 0x12, false, A5_10_12.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT),
-    RoomPanel_A5_10_13(RORG._4BS, 0x10, 0x13, false, A5_10_13.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_14(RORG._4BS, 0x10, 0x14, false, A5_10_14.class, THING_TYPE_ROOMOPERATINGPANEL,
-            CHANNEL_TEMPERATURE),
-    RoomPanel_A5_10_15(RORG._4BS, 0x10, 0x15, false, A5_10_15.class, THING_TYPE_ROOMOPERATINGPANEL,
+    RoomPanel_A5_10_0D(RORG._4BS, 0x10, 0x0D, false, A5_10_0D.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
+            CHANNEL_DAYNIGHTMODESTATE),
+    RoomPanel_A5_10_10(RORG._4BS, 0x10, 0x10, false, A5_10_10.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
+            CHANNEL_HUMIDITY, CHANNEL_TEMPERATURE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_11(RORG._4BS, 0x10, 0x11, false, A5_10_11.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
+            CHANNEL_HUMIDITY, CHANNEL_TEMPERATURE, CHANNEL_DAYNIGHTMODESTATE),
+    RoomPanel_A5_10_12(RORG._4BS, 0x10, 0x12, false, A5_10_12.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
+            CHANNEL_HUMIDITY, CHANNEL_TEMPERATURE),
+    RoomPanel_A5_10_13(RORG._4BS, 0x10, 0x13, false, A5_10_13.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_HUMIDITY,
+            CHANNEL_TEMPERATURE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_14(RORG._4BS, 0x10, 0x14, false, A5_10_14.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_HUMIDITY,
+            CHANNEL_TEMPERATURE, CHANNEL_DAYNIGHTMODESTATE),
+    RoomPanel_A5_10_15(RORG._4BS, 0x10, 0x15, false, A5_10_15.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
             CHANNEL_TEMPERATURE),
-    RoomPanel_A5_10_16(RORG._4BS, 0x10, 0x16, false, A5_10_16.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_16(RORG._4BS, 0x10, 0x16, false, A5_10_16.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
+            CHANNEL_TEMPERATURE, CHANNEL_OCCUPANCY),
     RoomPanel_A5_10_17(RORG._4BS, 0x10, 0x17, false, A5_10_17.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
             CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_18(RORG._4BS, 0x10, 0x18, false, A5_10_18.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_19(RORG._4BS, 0x10, 0x19, false, A5_10_19.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_1A(RORG._4BS, 0x10, 0x1A, false, A5_10_1A.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_1B(RORG._4BS, 0x10, 0x1B, false, A5_10_1B.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_1C(RORG._4BS, 0x10, 0x1C, false, A5_10_1C.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_1D(RORG._4BS, 0x10, 0x1D, false, A5_10_1D.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_1E(RORG._4BS, 0x10, 0x1E, false, A5_10_1E.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY),
-    RoomPanel_A5_10_1F(RORG._4BS, 0x10, 0x1F, false, A5_10_1F.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_OCCUPANCY, CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE),
-    RoomPanel_A5_10_20(RORG._4BS, 0x10, 0x20, false, A5_10_20.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT),
-    RoomPanel_A5_10_21(RORG._4BS, 0x10, 0x21, false, A5_10_21.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT),
-    RoomPanel_A5_10_22(RORG._4BS, 0x10, 0x22, false, A5_10_22.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT),
-    RoomPanel_A5_10_23(RORG._4BS, 0x10, 0x23, false, A5_10_23.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
-            CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_18(RORG._4BS, 0x10, 0x18, false, A5_10_18.class, THING_TYPE_ROOMOPERATINGPANEL,
+            CHANNEL_ILLUMINATION, CHANNEL_SETPOINT, CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_19(RORG._4BS, 0x10, 0x19, false, A5_10_19.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_HUMIDITY,
+            CHANNEL_SETPOINT, CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_1A(RORG._4BS, 0x10, 0x1A, false, A5_10_1A.class, THING_TYPE_ROOMOPERATINGPANEL,
+            CHANNEL_BATTERY_LEVEL, CHANNEL_SETPOINT, CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_1B(RORG._4BS, 0x10, 0x1B, false, A5_10_1B.class, THING_TYPE_ROOMOPERATINGPANEL,
+            CHANNEL_BATTERY_LEVEL, CHANNEL_ILLUMINATION, CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_1C(RORG._4BS, 0x10, 0x1C, false, A5_10_1C.class, THING_TYPE_ROOMOPERATINGPANEL,
+            CHANNEL_ILLUMINATION, CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_1D(RORG._4BS, 0x10, 0x1D, false, A5_10_1D.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_HUMIDITY,
+            CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_1E(RORG._4BS, 0x10, 0x1E, false, A5_10_1E.class, THING_TYPE_ROOMOPERATINGPANEL,
+            CHANNEL_BATTERY_LEVEL, CHANNEL_ILLUMINATION, CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_1F(RORG._4BS, 0x10, 0x1F, false, A5_10_1F.class, THING_TYPE_ROOMOPERATINGPANEL,
+            CHANNEL_FANSPEEDSTAGE, CHANNEL_SETPOINT, CHANNEL_TEMPERATURE, CHANNEL_OCCUPANCY),
+    RoomPanel_A5_10_20(RORG._4BS, 0x10, 0x20, false, A5_10_20.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
+            CHANNEL_TEMPERATURE, CHANNEL_BATTERYLOW),
+    RoomPanel_A5_10_21(RORG._4BS, 0x10, 0x21, false, A5_10_21.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
+            CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY, CHANNEL_BATTERYLOW),
+    RoomPanel_A5_10_22(RORG._4BS, 0x10, 0x22, false, A5_10_22.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
+            CHANNEL_HUMIDITY, CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE),
+    RoomPanel_A5_10_23(RORG._4BS, 0x10, 0x23, false, A5_10_23.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
+            CHANNEL_HUMIDITY, CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
 
     AutomatedMeterReading_00(RORG._4BS, 0x12, 0x00, false, A5_12_00.class, THING_TYPE_AUTOMATEDMETERSENSOR,
             CHANNEL_COUNTER, CHANNEL_CURRENTNUMBER),
index 186cdd6dc75c5c97a810974d345c49c92b323a05..8e165ddaf32866f6215e7837116946f08ea9f409 100644 (file)
@@ -407,6 +407,10 @@ channel-type.enocean.cumulativeValue.label = Cumulative Value
 channel-type.enocean.currentFlow.label = Current Flow
 channel-type.enocean.currentNumber.label = Current
 channel-type.enocean.currentNumber.description = Current
+channel-type.enocean.dayNightModeState.label = Day/Night Mode
+channel-type.enocean.dayNightModeState.description = Day (1) or Night (0) mode activated.
+channel-type.enocean.dayNightModeState.state.option.0 = Night
+channel-type.enocean.dayNightModeState.state.option.1 = Day
 channel-type.enocean.defrostMode.label = Defrost Mode
 channel-type.enocean.defrostMode.description = Indicates if defrosting of heat exchanger is active or not
 channel-type.enocean.delayRadioOFF.label = Delay Radio Off
@@ -446,6 +450,9 @@ channel-type.enocean.fanSpeedStage.state.option.0 = Stage 0
 channel-type.enocean.fanSpeedStage.state.option.1 = Stage 1
 channel-type.enocean.fanSpeedStage.state.option.2 = Stage 2
 channel-type.enocean.fanSpeedStage.state.option.3 = Stage 3
+channel-type.enocean.fanSpeedStage.state.option.4 = Stage 4
+channel-type.enocean.fanSpeedStage.state.option.5 = Stage 5
+channel-type.enocean.fanSpeedStage.state.option.6 = Off
 channel-type.enocean.feedTemperature.label = Feed Temperature
 channel-type.enocean.feedTemperature.description = Water temperature in the radiator input
 channel-type.enocean.fireplaceSafetyMode.label = Fireplace Safety Mode
index cc4c4f3adbb0c9875b7377b5b035bb56441feb04..966f1752808c3e0d507de671f6acd4c1b50837e4 100644 (file)
        </channel-type>
 
        <channel-type id="fanSpeedStage">
-               <item-type>String</item-type>
+               <item-type>Number</item-type>
                <label>Fan Speed</label>
                <state readOnly="true">
                        <options>
                                <option value="1">Stage 1</option>
                                <option value="2">Stage 2</option>
                                <option value="3">Stage 3</option>
+                               <option value="4">Stage 4</option>
+                               <option value="5">Stage 5</option>
+                               <option value="6">Off</option>
                        </options>
                </state>
        </channel-type>
                </event>
        </channel-type>
 
+       <channel-type id="dayNightModeState">
+               <item-type>Number</item-type>
+               <label>Day/Night Mode</label>
+               <description>Day (1) or Night (0) mode activated.</description>
+               <state readOnly="true">
+                       <options>
+                               <option value="0">Night</option>
+                               <option value="1">Day</option>
+                       </options>
+               </state>
+       </channel-type>
+
 </thing:thing-descriptions>