[enocean] Fix humidity and temperature readings for EEP family A5_10 (#15506)

* 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>
This commit is contained in:
Daniel Weber 2023-08-28 22:49:20 +02:00 committed by GitHub
parent 5cc5ee6f7b
commit b9b9bbb74c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 308 additions and 84 deletions

View 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 | | 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 | | lightTemperatureOccupancySensor | A5-08 | 0x01-03 | illumination, temperature, occupancy, motionDetection | Eltako FABH | Discovery |
| lightSensor | A5-06 | 0x01 | illumination | Eltako TF-AHDSB | 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 | | automatedMeterSensor | A5-12 | 0x00-03 | counter, currentNumber, instantpower, totalusage, amrLitre, amrCubicMetre | FWZ12 | Discovery |
| environmentalSensor | A5-13 | 0x01-02 | temperature, windspeed, illumination, rainStatus | FWS61 | Discovery | | environmentalSensor | A5-13 | 0x01-02 | temperature, windspeed, illumination, rainStatus | FWS61 | Discovery |
| centralCommand | A5-38 | 0x08 | dimmer, generalSwitch | Eltako FUD14, FSR14 | Teach-in | | 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) | | occupancy | Switch | Occupancy button pressed (ON) or released (OFF) |
| motionDetection | Switch | On=Motion detected, Off=not | | motionDetection | Switch | On=Motion detected, Off=not |
| setPoint | Number | linear set point | | 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 | | dimmer | Dimmer | Dimmer value in percent |
| generalSwitch(/A/B) | Switch | Switch something (channel A/B) ON/OFF | | generalSwitch(/A/B) | Switch | Switch something (channel A/B) ON/OFF |
| rollershutter | Rollershutter | Shut time (shutTime) in seconds can be configured | | 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' | | windowBreachEvent | Trigger | Emits event 'ALARM' |
| protectionPlusEvent | Trigger | Emits event 'ALARM' | | protectionPlusEvent | Trigger | Emits event 'ALARM' |
| vacationModeToggleEvent | Trigger | Emits events 'ACTIVATED', 'DEACTIVATED' | | 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`. 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. This is especially true for Eltako rollershutter, as their position is calculated out of the current position and the moving time.

View File

@ -221,6 +221,7 @@ public class EnOceanBindingConstants {
public static final String CHANNEL_EXHAUSTAIRFANAIRFLOWRATE = "exhaustAirFanAirFlowRate"; public static final String CHANNEL_EXHAUSTAIRFANAIRFLOWRATE = "exhaustAirFanAirFlowRate";
public static final String CHANNEL_SUPPLYFANSPEED = "supplyFanSpeed"; public static final String CHANNEL_SUPPLYFANSPEED = "supplyFanSpeed";
public static final String CHANNEL_EXHAUSTFANSPEED = "exhaustFanSpeed"; public static final String CHANNEL_EXHAUSTFANSPEED = "exhaustFanSpeed";
public final static String CHANNEL_DAYNIGHTMODESTATE = "dayNightModeState";
public static final Map<String, EnOceanChannelDescription> CHANNELID2CHANNELDESCRIPTION = Map.ofEntries( public static final Map<String, EnOceanChannelDescription> CHANNELID2CHANNELDESCRIPTION = Map.ofEntries(
Map.entry(CHANNEL_GENERAL_SWITCHING, Map.entry(CHANNEL_GENERAL_SWITCHING,
@ -263,7 +264,7 @@ public class EnOceanBindingConstants {
CoreItemFactory.NUMBER)), CoreItemFactory.NUMBER)),
Map.entry(CHANNEL_FANSPEEDSTAGE, Map.entry(CHANNEL_FANSPEEDSTAGE,
new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_FANSPEEDSTAGE), new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_FANSPEEDSTAGE),
CoreItemFactory.STRING)), CoreItemFactory.NUMBER)),
Map.entry(CHANNEL_OCCUPANCY, Map.entry(CHANNEL_OCCUPANCY,
new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_OCCUPANCY), new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_OCCUPANCY),
CoreItemFactory.SWITCH)), CoreItemFactory.SWITCH)),
@ -575,6 +576,9 @@ public class EnOceanBindingConstants {
new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_EXHAUSTFANSPEED), new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_EXHAUSTFANSPEED),
CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR CoreItemFactory.NUMBER + ItemUtil.EXTENSION_SEPARATOR
+ Dimensionless.class.getSimpleName())), + Dimensionless.class.getSimpleName())),
Map.entry(CHANNEL_DAYNIGHTMODESTATE,
new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_DAYNIGHTMODESTATE),
CoreItemFactory.NUMBER)),
Map.entry(CHANNEL_STATUS_REQUEST_EVENT, Map.entry(CHANNEL_STATUS_REQUEST_EVENT,
new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_STATUS_REQUEST_EVENT), null, new EnOceanChannelDescription(new ChannelTypeUID(BINDING_ID, CHANNEL_STATUS_REQUEST_EVENT), null,

View File

@ -53,4 +53,26 @@ public class Helper {
return defaultValue; 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);
}
}
} }

View File

@ -18,18 +18,23 @@ import java.util.function.Function;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.enocean.internal.Helper;
import org.openhab.binding.enocean.internal.eep.Base._4BSMessage; import org.openhab.binding.enocean.internal.eep.Base._4BSMessage;
import org.openhab.binding.enocean.internal.messages.ERP1Message; import org.openhab.binding.enocean.internal.messages.ERP1Message;
import org.openhab.core.config.core.Configuration; import org.openhab.core.config.core.Configuration;
import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.OnOffType; 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.QuantityType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.library.unit.SIUnits; 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.State;
import org.openhab.core.types.UnDefType; 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 * @author Daniel Weber - Initial contribution
*/ */
@ -40,32 +45,105 @@ public abstract class A5_10 extends _4BSMessage {
super(packet); 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 @Override
protected State convertToStateImpl(String channelId, String channelTypeId, protected State convertToStateImpl(String channelId, String channelTypeId,
Function<String, @Nullable State> getCurrentStateFunc, Configuration config) { Function<String, @Nullable State> getCurrentStateFunc, Configuration config) {
switch (channelId) { switch (channelId) {
case CHANNEL_BATTERY_VOLTAGE:
return getSupplyVoltage();
case CHANNEL_ILLUMINATION:
return getIllumination();
case CHANNEL_FANSPEEDSTAGE: case CHANNEL_FANSPEEDSTAGE:
if (getDB3Value() > 209) { return getFanSpeedStage();
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");
}
case CHANNEL_SETPOINT: case CHANNEL_SETPOINT:
return new DecimalType(getDB2Value()); return new DecimalType(getSetPointValue());
case CHANNEL_HUMIDITY:
return new DecimalType(getHumidityValue() / 2.5);
case CHANNEL_TEMPERATURE: case CHANNEL_TEMPERATURE:
double temp = (getDB1Value() - 255) / -6.375; return getTemperature();
return new QuantityType<>(temp, SIUnits.CELSIUS);
case CHANNEL_BATTERYLOW:
return getBit(getDB0(), 4) ? OnOffType.ON : OnOffType.OFF;
case CHANNEL_OCCUPANCY: case CHANNEL_OCCUPANCY:
return getBit(getDB0(), 0) ? OnOffType.OFF : OnOffType.ON; 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; return UnDefType.UNDEF;

View File

@ -16,6 +16,9 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.enocean.internal.messages.ERP1Message; 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 * @author Daniel Weber - Initial contribution
*/ */
@ -25,4 +28,29 @@ public class A5_10_10 extends A5_10 {
public A5_10_10(ERP1Message packet) { public A5_10_10(ERP1Message packet) {
super(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;
}
} }

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_11 extends A5_10 { public class A5_10_11 extends A5_10_10 {
public A5_10_11(ERP1Message packet) { public A5_10_11(ERP1Message packet) {
super(packet); super(packet);

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_12 extends A5_10 { public class A5_10_12 extends A5_10_10 {
public A5_10_12(ERP1Message packet) { public A5_10_12(ERP1Message packet) {
super(packet); super(packet);

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_13 extends A5_10 { public class A5_10_13 extends A5_10_10 {
public A5_10_13(ERP1Message packet) { public A5_10_13(ERP1Message packet) {
super(packet); super(packet);

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_14 extends A5_10 { public class A5_10_14 extends A5_10_10 {
public A5_10_14(ERP1Message packet) { public A5_10_14(ERP1Message packet) {
super(packet); super(packet);

View File

@ -16,6 +16,9 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.enocean.internal.messages.ERP1Message; 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 * @author Daniel Weber - Initial contribution
*/ */
@ -25,4 +28,34 @@ public class A5_10_15 extends A5_10 {
public A5_10_15(ERP1Message packet) { public A5_10_15(ERP1Message packet) {
super(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();
}
} }

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_16 extends A5_10 { public class A5_10_16 extends A5_10_15 {
public A5_10_16(ERP1Message packet) { public A5_10_16(ERP1Message packet) {
super(packet); super(packet);

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_17 extends A5_10 { public class A5_10_17 extends A5_10_15 {
public A5_10_17(ERP1Message packet) { public A5_10_17(ERP1Message packet) {
super(packet); super(packet);

View File

@ -14,8 +14,13 @@ package org.openhab.binding.enocean.internal.eep.A5_10;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.enocean.internal.messages.ERP1Message; 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 * @author Daniel Weber - Initial contribution
*/ */
@ -25,4 +30,13 @@ public class A5_10_18 extends A5_10 {
public A5_10_18(ERP1Message packet) { public A5_10_18(ERP1Message packet) {
super(packet); super(packet);
} }
protected double getMinUnscaledTemperatureValue() {
return 250.0;
}
@Override
protected State getFanSpeedStage() {
return new DecimalType((getDB0Value() >>> 4) - 1);
}
} }

View File

@ -20,9 +20,14 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_19 extends A5_10 { public class A5_10_19 extends A5_10_18 {
public A5_10_19(ERP1Message packet) { public A5_10_19(ERP1Message packet) {
super(packet); super(packet);
} }
@Override
protected double getHumidityValue() {
return getDB3Value();
}
} }

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_1A extends A5_10 { public class A5_10_1A extends A5_10_18 {
public A5_10_1A(ERP1Message packet) { public A5_10_1A(ERP1Message packet) {
super(packet); super(packet);

View File

@ -20,9 +20,14 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_1B extends A5_10 { public class A5_10_1B extends A5_10_18 {
public A5_10_1B(ERP1Message packet) { public A5_10_1B(ERP1Message packet) {
super(packet); super(packet);
} }
@Override
protected int getIlluminationValue() {
return getDB2Value();
}
} }

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_1C extends A5_10 { public class A5_10_1C extends A5_10_18 {
public A5_10_1C(ERP1Message packet) { public A5_10_1C(ERP1Message packet) {
super(packet); super(packet);

View File

@ -20,9 +20,14 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_1D extends A5_10 { public class A5_10_1D extends A5_10_18 {
public A5_10_1D(ERP1Message packet) { public A5_10_1D(ERP1Message packet) {
super(packet); super(packet);
} }
@Override
protected double getHumidityValue() {
return getDB3Value();
}
} }

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_1E extends A5_10 { public class A5_10_1E extends A5_10_1B {
public A5_10_1E(ERP1Message packet) { public A5_10_1E(ERP1Message packet) {
super(packet); super(packet);

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_20 extends A5_10 { public class A5_10_20 extends A5_10_10 {
public A5_10_20(ERP1Message packet) { public A5_10_20(ERP1Message packet) {
super(packet); super(packet);

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_21 extends A5_10 { public class A5_10_21 extends A5_10_10 {
public A5_10_21(ERP1Message packet) { public A5_10_21(ERP1Message packet) {
super(packet); super(packet);

View File

@ -14,15 +14,22 @@ package org.openhab.binding.enocean.internal.eep.A5_10;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.enocean.internal.messages.ERP1Message; 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 * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_22 extends A5_10 { public class A5_10_22 extends A5_10_10 {
public A5_10_22(ERP1Message packet) { public A5_10_22(ERP1Message packet) {
super(packet); super(packet);
} }
@Override
protected State getFanSpeedStage() {
return new DecimalType((getDB0Value() >>> 5) - 1);
}
} }

View File

@ -20,7 +20,7 @@ import org.openhab.binding.enocean.internal.messages.ERP1Message;
* @author Daniel Weber - Initial contribution * @author Daniel Weber - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
public class A5_10_23 extends A5_10 { public class A5_10_23 extends A5_10_22 {
public A5_10_23(ERP1Message packet) { public A5_10_23(ERP1Message packet) {
super(packet); super(packet);

View 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, RoomPanel_A5_10_01(RORG._4BS, 0x10, 0x01, false, A5_10_01.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY), CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
RoomPanel_A5_10_02(RORG._4BS, 0x10, 0x02, false, A5_10_02.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, 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, RoomPanel_A5_10_03(RORG._4BS, 0x10, 0x03, false, A5_10_03.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
CHANNEL_SETPOINT), CHANNEL_SETPOINT),
RoomPanel_A5_10_04(RORG._4BS, 0x10, 0x04, false, A5_10_04.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, 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, RoomPanel_A5_10_05(RORG._4BS, 0x10, 0x05, false, A5_10_05.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
CHANNEL_SETPOINT, CHANNEL_OCCUPANCY), CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
RoomPanel_A5_10_06(RORG._4BS, 0x10, 0x06, false, A5_10_06.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, 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, RoomPanel_A5_10_07(RORG._4BS, 0x10, 0x07, false, A5_10_07.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
CHANNEL_FANSPEEDSTAGE), CHANNEL_FANSPEEDSTAGE),
RoomPanel_A5_10_08(RORG._4BS, 0x10, 0x08, false, A5_10_08.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, RoomPanel_A5_10_08(RORG._4BS, 0x10, 0x08, false, A5_10_08.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY), CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
RoomPanel_A5_10_09(RORG._4BS, 0x10, 0x09, false, A5_10_09.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, 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, RoomPanel_A5_10_0A(RORG._4BS, 0x10, 0x0A, false, A5_10_0A.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
CHANNEL_SETPOINT), CHANNEL_SETPOINT, CHANNEL_CONTACT),
RoomPanel_A5_10_0B(RORG._4BS, 0x10, 0x0B, false, A5_10_0B.class, THING_TYPE_ROOMOPERATINGPANEL, RoomPanel_A5_10_0B(RORG._4BS, 0x10, 0x0B, false, A5_10_0B.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
CHANNEL_TEMPERATURE), CHANNEL_CONTACT),
RoomPanel_A5_10_0C(RORG._4BS, 0x10, 0x0C, false, A5_10_0C.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, RoomPanel_A5_10_0C(RORG._4BS, 0x10, 0x0C, false, A5_10_0C.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
CHANNEL_OCCUPANCY), CHANNEL_OCCUPANCY),
RoomPanel_A5_10_0D(RORG._4BS, 0x10, 0x0D, false, A5_10_0D.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), CHANNEL_TEMPERATURE),
RoomPanel_A5_10_10(RORG._4BS, 0x10, 0x10, false, A5_10_10.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, RoomPanel_A5_10_16(RORG._4BS, 0x10, 0x16, false, A5_10_16.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
CHANNEL_SETPOINT, CHANNEL_OCCUPANCY), CHANNEL_TEMPERATURE, 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,
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_17(RORG._4BS, 0x10, 0x17, false, A5_10_17.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, RoomPanel_A5_10_17(RORG._4BS, 0x10, 0x17, false, A5_10_17.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
CHANNEL_OCCUPANCY), CHANNEL_OCCUPANCY),
RoomPanel_A5_10_18(RORG._4BS, 0x10, 0x18, false, A5_10_18.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, RoomPanel_A5_10_18(RORG._4BS, 0x10, 0x18, false, A5_10_18.class, THING_TYPE_ROOMOPERATINGPANEL,
CHANNEL_OCCUPANCY), 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_TEMPERATURE, RoomPanel_A5_10_19(RORG._4BS, 0x10, 0x19, false, A5_10_19.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_HUMIDITY,
CHANNEL_OCCUPANCY), 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_TEMPERATURE, RoomPanel_A5_10_1A(RORG._4BS, 0x10, 0x1A, false, A5_10_1A.class, THING_TYPE_ROOMOPERATINGPANEL,
CHANNEL_OCCUPANCY), 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_TEMPERATURE, RoomPanel_A5_10_1B(RORG._4BS, 0x10, 0x1B, false, A5_10_1B.class, THING_TYPE_ROOMOPERATINGPANEL,
CHANNEL_OCCUPANCY), 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_TEMPERATURE, RoomPanel_A5_10_1C(RORG._4BS, 0x10, 0x1C, false, A5_10_1C.class, THING_TYPE_ROOMOPERATINGPANEL,
CHANNEL_OCCUPANCY), 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_TEMPERATURE, RoomPanel_A5_10_1D(RORG._4BS, 0x10, 0x1D, false, A5_10_1D.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_HUMIDITY,
CHANNEL_OCCUPANCY), CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
RoomPanel_A5_10_1E(RORG._4BS, 0x10, 0x1E, false, A5_10_1E.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, RoomPanel_A5_10_1E(RORG._4BS, 0x10, 0x1E, false, A5_10_1E.class, THING_TYPE_ROOMOPERATINGPANEL,
CHANNEL_OCCUPANCY), 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_TEMPERATURE, RoomPanel_A5_10_1F(RORG._4BS, 0x10, 0x1F, false, A5_10_1F.class, THING_TYPE_ROOMOPERATINGPANEL,
CHANNEL_OCCUPANCY, CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE), 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_TEMPERATURE, RoomPanel_A5_10_20(RORG._4BS, 0x10, 0x20, false, A5_10_20.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
CHANNEL_SETPOINT), CHANNEL_TEMPERATURE, CHANNEL_BATTERYLOW),
RoomPanel_A5_10_21(RORG._4BS, 0x10, 0x21, false, A5_10_21.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE, RoomPanel_A5_10_21(RORG._4BS, 0x10, 0x21, false, A5_10_21.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
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_TEMPERATURE, RoomPanel_A5_10_22(RORG._4BS, 0x10, 0x22, false, A5_10_22.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
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_TEMPERATURE, RoomPanel_A5_10_23(RORG._4BS, 0x10, 0x23, false, A5_10_23.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_SETPOINT,
CHANNEL_SETPOINT, CHANNEL_OCCUPANCY), CHANNEL_HUMIDITY, CHANNEL_TEMPERATURE, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
AutomatedMeterReading_00(RORG._4BS, 0x12, 0x00, false, A5_12_00.class, THING_TYPE_AUTOMATEDMETERSENSOR, AutomatedMeterReading_00(RORG._4BS, 0x12, 0x00, false, A5_12_00.class, THING_TYPE_AUTOMATEDMETERSENSOR,
CHANNEL_COUNTER, CHANNEL_CURRENTNUMBER), CHANNEL_COUNTER, CHANNEL_CURRENTNUMBER),

View File

@ -407,6 +407,10 @@ channel-type.enocean.cumulativeValue.label = Cumulative Value
channel-type.enocean.currentFlow.label = Current Flow channel-type.enocean.currentFlow.label = Current Flow
channel-type.enocean.currentNumber.label = Current channel-type.enocean.currentNumber.label = Current
channel-type.enocean.currentNumber.description = 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.label = Defrost Mode
channel-type.enocean.defrostMode.description = Indicates if defrosting of heat exchanger is active or not channel-type.enocean.defrostMode.description = Indicates if defrosting of heat exchanger is active or not
channel-type.enocean.delayRadioOFF.label = Delay Radio Off 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.1 = Stage 1
channel-type.enocean.fanSpeedStage.state.option.2 = Stage 2 channel-type.enocean.fanSpeedStage.state.option.2 = Stage 2
channel-type.enocean.fanSpeedStage.state.option.3 = Stage 3 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.label = Feed Temperature
channel-type.enocean.feedTemperature.description = Water temperature in the radiator input channel-type.enocean.feedTemperature.description = Water temperature in the radiator input
channel-type.enocean.fireplaceSafetyMode.label = Fireplace Safety Mode channel-type.enocean.fireplaceSafetyMode.label = Fireplace Safety Mode

View File

@ -171,7 +171,7 @@
</channel-type> </channel-type>
<channel-type id="fanSpeedStage"> <channel-type id="fanSpeedStage">
<item-type>String</item-type> <item-type>Number</item-type>
<label>Fan Speed</label> <label>Fan Speed</label>
<state readOnly="true"> <state readOnly="true">
<options> <options>
@ -180,6 +180,9 @@
<option value="1">Stage 1</option> <option value="1">Stage 1</option>
<option value="2">Stage 2</option> <option value="2">Stage 2</option>
<option value="3">Stage 3</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> </options>
</state> </state>
</channel-type> </channel-type>
@ -917,4 +920,16 @@
</event> </event>
</channel-type> </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> </thing:thing-descriptions>