]> git.basschouten.com Git - openhab-addons.git/commitdiff
[mqtt.homeassistant] interpret a dimmable light as OFF properly from zigbee2mqtt...
authorCody Cutrer <cody@cutrer.us>
Sat, 25 Nov 2023 11:47:00 +0000 (04:47 -0700)
committerGitHub <noreply@github.com>
Sat, 25 Nov 2023 11:47:00 +0000 (12:47 +0100)
* [mqtt.homeassistant] interpret a dimmable light as OFF properly from zigbee2mqtt

zigbee2mqtt can send a brightness of say 99, with a state of OFF, when a bulb is
off. make sure if state is sent, it overrides all other inferences

* handle brightness but not color bulbs

---------

Signed-off-by: Cody Cutrer <cody@cutrer.us>
bundles/org.openhab.binding.mqtt.homeassistant/src/main/java/org/openhab/binding/mqtt/homeassistant/internal/component/JSONSchemaLight.java
bundles/org.openhab.binding.mqtt.homeassistant/src/test/java/org/openhab/binding/mqtt/homeassistant/internal/component/JSONSchemaLightTests.java

index 93dcd606a695855745fb7f67306388a8095683f7..a86f6488de5ba45fd8775e82ddc1ef3ec63e5061 100644 (file)
@@ -253,26 +253,38 @@ public class JSONSchemaLight extends AbstractRawSchemaLight {
             }
         }
 
+        boolean off = false;
         if (jsonState.state != null) {
             onOffValue.update(onOffValue.parseCommand(new StringType(jsonState.state)));
+            off = onOffValue.getChannelState().equals(OnOffType.OFF);
             if (brightnessValue.getChannelState() instanceof UnDefType) {
-                brightnessValue.update(brightnessValue.parseCommand((OnOffType) onOffValue.getChannelState()));
+                brightnessValue.update(off ? PercentType.ZERO : PercentType.HUNDRED);
             }
             if (colorValue.getChannelState() instanceof UnDefType) {
-                colorValue.update(colorValue.parseCommand((OnOffType) onOffValue.getChannelState()));
+                colorValue.update(off ? HSBType.BLACK : HSBType.WHITE);
             }
         }
 
+        PercentType brightness;
+        if (off) {
+            brightness = PercentType.ZERO;
+        } else if (brightnessValue.getChannelState() instanceof PercentType percentValue) {
+            brightness = percentValue;
+        } else {
+            brightness = PercentType.HUNDRED;
+        }
+
         if (jsonState.brightness != null) {
-            brightnessValue.update(
-                    brightnessValue.parseCommand(new DecimalType(Objects.requireNonNull(jsonState.brightness))));
+            if (!off) {
+                brightness = (PercentType) brightnessValue
+                        .parseMessage(new DecimalType(Objects.requireNonNull(jsonState.brightness)));
+            }
+            brightnessValue.update(brightness);
             if (colorValue.getChannelState() instanceof HSBType) {
                 HSBType color = (HSBType) colorValue.getChannelState();
-                colorValue.update(new HSBType(color.getHue(), color.getSaturation(),
-                        (PercentType) brightnessValue.getChannelState()));
+                colorValue.update(new HSBType(color.getHue(), color.getSaturation(), brightness));
             } else {
-                colorValue.update(new HSBType(DecimalType.ZERO, PercentType.ZERO,
-                        (PercentType) brightnessValue.getChannelState()));
+                colorValue.update(new HSBType(DecimalType.ZERO, PercentType.ZERO, brightness));
             }
         }
 
@@ -284,9 +296,6 @@ public class JSONSchemaLight extends AbstractRawSchemaLight {
         }
 
         if (jsonState.color != null) {
-            PercentType brightness = brightnessValue.getChannelState() instanceof PercentType
-                    ? (PercentType) brightnessValue.getChannelState()
-                    : PercentType.HUNDRED;
             // This corresponds to "deprecated" color mode handling, since we're not checking which color
             // mode is currently active.
             // HS is highest priority, then XY, then RGB
index e1c50de28992f90fa41a7c78b6555bbcf7e8fc7c..604836dfc4eef20232648538bda7cde7c1a1841d 100644 (file)
@@ -119,6 +119,9 @@ public class JSONSchemaLightTests extends AbstractComponentTests {
         assertState(component, Light.BRIGHTNESS_CHANNEL_ID,
                 new PercentType(new BigDecimal(128 * 100).divide(new BigDecimal(255), MathContext.DECIMAL128)));
 
+        publishMessage("zigbee2mqtt/light/state", "{ \"state\": \"OFF\", \"brightness\": 128 }");
+        assertState(component, Light.BRIGHTNESS_CHANNEL_ID, PercentType.ZERO);
+
         sendCommand(component, Light.BRIGHTNESS_CHANNEL_ID, PercentType.HUNDRED);
         assertPublished("zigbee2mqtt/light/set/state", "{\"state\":\"ON\",\"brightness\":255}");