Skip to content

Commit 2d72c8a

Browse files
authored
[avmfritz] Fix incorrect state of dimmable bulb (openhab#17685)
* [avmfritz] Fix incorrect state of dimmable bulb Fixes openhab#17609 Signed-off-by: Fabian Girgert <[email protected]>
1 parent d918c20 commit 2d72c8a

File tree

2 files changed

+82
-5
lines changed

2 files changed

+82
-5
lines changed

bundles/org.openhab.binding.avmfritz/src/main/java/org/openhab/binding/avmfritz/internal/handler/AVMFritzBaseThingHandler.java

+11-3
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
* @author Ulrich Mertin - Added support for HAN-FUN blinds
127127
* @author Christoph Sommer - Added support for color temperature
128128
* @author Tobias Lange - Added abs color temperature and fixed on/off behavior of light blub
129+
* @author Fabian Girgert - Fixed incorrect state of dimmable bulb when switched off
129130
*/
130131
@NonNullByDefault
131132
public abstract class AVMFritzBaseThingHandler extends BaseThingHandler implements FritzAhaStatusListener {
@@ -207,7 +208,7 @@ public void onDeviceUpdated(ThingUID thingUID, AVMFritzBaseModel device) {
207208
updateColorLight(deviceModel.getColorControlModel(), deviceModel.getLevelControlModel(),
208209
deviceModel.getSimpleOnOffUnit());
209210
} else if (deviceModel.isDimmableLight() && !deviceModel.isHANFUNBlinds()) {
210-
updateDimmableLight(deviceModel.getLevelControlModel());
211+
updateDimmableLight(deviceModel.getLevelControlModel(), deviceModel.getSimpleOnOffUnit());
211212
} else if (deviceModel.isHANFUNUnit() && deviceModel.isHANFUNOnOff()) {
212213
updateSimpleOnOffUnit(deviceModel.getSimpleOnOffUnit());
213214
}
@@ -255,9 +256,16 @@ protected void updateLevelControl(@Nullable LevelControlModel levelControlModel)
255256
}
256257
}
257258

258-
private void updateDimmableLight(@Nullable LevelControlModel levelControlModel) {
259+
private void updateDimmableLight(@Nullable LevelControlModel levelControlModel,
260+
@Nullable SimpleOnOffModel simpleOnOff) {
259261
if (levelControlModel != null) {
260-
updateThingChannelState(CHANNEL_BRIGHTNESS, new PercentType(levelControlModel.getLevelPercentage()));
262+
PercentType brightness;
263+
if (simpleOnOff == null || simpleOnOff.state) {
264+
brightness = new PercentType(levelControlModel.getLevelPercentage());
265+
} else {
266+
brightness = PercentType.ZERO;
267+
}
268+
updateThingChannelState(CHANNEL_BRIGHTNESS, brightness);
261269
}
262270
}
263271

bundles/org.openhab.binding.avmfritz/src/test/java/org/openhab/binding/avmfritz/internal/dto/AVMFritzDeviceListModelTest.java

+71-2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
*
3535
* @author Christoph Weitkamp - Initial contribution
3636
* @author Ulrich Mertin - Added support for HAN-FUN blinds
37+
* @author Fabian Girgert - Fixed incorrect state of dimmable bulb when switched off
3738
*/
3839
@NonNullByDefault
3940
public class AVMFritzDeviceListModelTest {
@@ -111,7 +112,24 @@ public void setUp() throws JAXBException, XMLStreamException {
111112
<interfaces>512,514,513</interfaces>
112113
</etsiunitinfo>
113114
</device>\
114-
</devicelist>\
115+
<device identifier="Z001788011D4B55D30B" id="2038" functionbitmask="106500" fwversion="0.0" manufacturer="0x100b" productname="Signify Netherlands B.V. LWG004">
116+
<present>1</present>
117+
<txbusy>0</txbusy>
118+
<name>Zigbee dimmable bulb</name>
119+
<simpleonoff>
120+
<state>0</state>
121+
</simpleonoff>
122+
<levelcontrol>
123+
<level>255</level>
124+
<levelpercentage>100</levelpercentage>
125+
</levelcontrol>
126+
<etsiunitinfo>
127+
<etsideviceid>20029</etsideviceid>
128+
<unittype>265</unittype>
129+
<interfaces>512,513</interfaces>
130+
</etsiunitinfo>
131+
</device>\
132+
</devicelist>\
115133
""";
116134
//@formatter:on
117135
XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
@@ -122,7 +140,7 @@ public void setUp() throws JAXBException, XMLStreamException {
122140
@Test
123141
public void validateDeviceListModel() {
124142
assertNotNull(devices);
125-
assertEquals(17, devices.getDevicelist().size());
143+
assertEquals(18, devices.getDevicelist().size());
126144
assertEquals("1", devices.getXmlApiVersion());
127145
}
128146

@@ -732,6 +750,57 @@ public void validateHANFUNColorLightModel() {
732750
assertEquals(2700, colorModel.temperature);
733751
}
734752

753+
@Test
754+
public void validateHANFUNDimmableLightModel() {
755+
Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("Z001788011D4B55D30B");
756+
assertTrue(optionalDevice.isPresent());
757+
assertTrue(optionalDevice.get() instanceof DeviceModel);
758+
759+
DeviceModel device = (DeviceModel) optionalDevice.get();
760+
assertEquals("Signify Netherlands B.V. LWG004", device.getProductName());
761+
assertEquals("Z001788011D4B55D30B", device.getIdentifier());
762+
assertEquals("2038", device.getDeviceId());
763+
assertEquals("0.0", device.getFirmwareVersion());
764+
assertEquals("0x100b", device.getManufacturer());
765+
766+
assertEquals(1, device.getPresent());
767+
assertEquals("Zigbee dimmable bulb", device.getName());
768+
769+
assertFalse(device.isHANFUNDevice());
770+
assertFalse(device.isHANFUNButton());
771+
assertFalse(device.isHANFUNAlarmSensor());
772+
assertFalse(device.isButton());
773+
assertFalse(device.isSwitchableOutlet());
774+
assertFalse(device.isTemperatureSensor());
775+
assertFalse(device.isHumiditySensor());
776+
assertFalse(device.isPowermeter());
777+
assertFalse(device.isDectRepeater());
778+
assertFalse(device.isHeatingThermostat());
779+
assertFalse(device.hasMicrophone());
780+
assertTrue(device.isHANFUNUnit());
781+
assertTrue(device.isHANFUNOnOff());
782+
assertTrue(device.isDimmableLight());
783+
assertFalse(device.isColorLight());
784+
assertFalse(device.isHANFUNBlinds());
785+
786+
assertTrue(device.getButtons().isEmpty());
787+
788+
assertNull(device.getAlert());
789+
790+
assertNull(device.getSwitch());
791+
792+
assertNull(device.getTemperature());
793+
794+
assertNull(device.getPowermeter());
795+
796+
assertNull(device.getHkr());
797+
798+
LevelControlModel levelcontrol = device.getLevelControlModel();
799+
assertNotNull(levelcontrol);
800+
assertEquals(BigDecimal.valueOf(255L), levelcontrol.getLevel());
801+
assertEquals(BigDecimal.valueOf(100L), levelcontrol.getLevelPercentage());
802+
}
803+
735804
@Test
736805
public void validateHANFUNOnOffModel() {
737806
Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("113240824499-1");

0 commit comments

Comments
 (0)