From: Stefan Triller Date: Sat, 17 Aug 2024 14:15:46 +0000 (+0200) Subject: [wled] Fix brightness inconsistency + power on (#16907) X-Git-Url: https://git.basschouten.com/?a=commitdiff_plain;h=97e9f374ad0281a288c2be0b4ab2b5fcdcc4f70f;p=openhab-addons.git [wled] Fix brightness inconsistency + power on (#16907) --- diff --git a/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/WLedHelper.java b/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/WLedHelper.java index 7245750a02..390fdb6534 100644 --- a/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/WLedHelper.java +++ b/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/WLedHelper.java @@ -30,14 +30,17 @@ import org.openhab.core.library.types.PercentType; */ @NonNullByDefault public class WLedHelper { - public static HSBType parseToHSBType(String message) { + public static HSBType parseToHSBType(String message, int brightness) { // example message rgb in array brackets [255.0, 255.0, 255.0] List colors = Arrays.asList(message.replaceAll("\\[|\\]", "").split("\\s*,\\s*")); try { int r = new BigDecimal(colors.get(0)).intValue(); int g = new BigDecimal(colors.get(1)).intValue(); int b = new BigDecimal(colors.get(2)).intValue(); - return HSBType.fromRGB(r, g, b); + HSBType tmp = HSBType.fromRGB(r, g, b); + PercentType brightnessPercent = new PercentType( + new BigDecimal(brightness).divide(BIG_DECIMAL_2_55, RoundingMode.HALF_UP)); + return new HSBType(tmp.getHue(), tmp.getSaturation(), brightnessPercent); } catch (NumberFormatException e) { return new HSBType(); } diff --git a/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/api/WledApiV084.java b/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/api/WledApiV084.java index b30374ab12..4629488b55 100644 --- a/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/api/WledApiV084.java +++ b/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/api/WledApiV084.java @@ -296,12 +296,13 @@ public class WledApiV084 implements WledApi { // There is no thing setup for this segmentIndex. return; } - HSBType tempHSB = WLedHelper.parseToHSBType(state.stateResponse.seg[segmentIndex].col[0].toString()); + HSBType tempHSB = WLedHelper.parseToHSBType(state.stateResponse.seg[segmentIndex].col[0].toString(), + state.stateResponse.seg[segmentIndex].bri); handler.update(segmentIndex, CHANNEL_PRIMARY_COLOR, tempHSB); - handler.update(segmentIndex, CHANNEL_SECONDARY_COLOR, - WLedHelper.parseToHSBType(state.stateResponse.seg[segmentIndex].col[1].toString())); - handler.update(segmentIndex, CHANNEL_THIRD_COLOR, - WLedHelper.parseToHSBType(state.stateResponse.seg[segmentIndex].col[2].toString())); + handler.update(segmentIndex, CHANNEL_SECONDARY_COLOR, WLedHelper.parseToHSBType( + state.stateResponse.seg[segmentIndex].col[1].toString(), state.stateResponse.seg[segmentIndex].bri)); + handler.update(segmentIndex, CHANNEL_THIRD_COLOR, WLedHelper.parseToHSBType( + state.stateResponse.seg[segmentIndex].col[2].toString(), state.stateResponse.seg[segmentIndex].bri)); if (state.ledInfo.rgbw) { handler.update(segmentIndex, CHANNEL_PRIMARY_WHITE, WLedHelper.parseWhitePercent(state.stateResponse.seg[segmentIndex].col[0].toString())); @@ -378,14 +379,17 @@ public class WledApiV084 implements WledApi { @Override public void setMasterHSB(HSBType hsbType, int segmentIndex) throws ApiException { if (hsbType.getBrightness().toBigDecimal().equals(BigDecimal.ZERO)) { - updateStateFromReply(postState("{\"tt\":2,\"v\":true,\"seg\":[{\"on\":false,\"id\":" + segmentIndex - + ",\"fx\":0,\"col\":[[" + hsbType.getRed().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() - + "," + hsbType.getGreen().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + "," - + hsbType.getBlue().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + "]]}]}")); + updateStateFromReply(postState( + "{\"tt\":2,\"v\":true,\"seg\":[{\"on\":false,\"id\":" + segmentIndex + ",\"fx\":0,\"bri\":" + + hsbType.getBrightness().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + + ",\"col\":[[" + hsbType.getRed().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + + "," + hsbType.getGreen().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + "," + + hsbType.getBlue().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + "]]}]}")); return; } updateStateFromReply(postState("{\"tt\":2,\"v\":true,\"seg\":[{\"on\":true,\"id\":" + segmentIndex - + ",\"fx\":0,\"col\":[[" + hsbType.getRed().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + "," + + ",\"fx\":0,\"bri\":" + hsbType.getBrightness().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + + ",\"col\":[[" + hsbType.getRed().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + "," + hsbType.getGreen().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + "," + hsbType.getBlue().toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + "]]}]}")); } @@ -472,7 +476,8 @@ public class WledApiV084 implements WledApi { @Override public void setWhiteOnly(PercentType percentType, int segmentIndex) throws ApiException { - postState("{\"seg\":[{\"on\":true,\"id\":" + segmentIndex + ",\"fx\":0,\"col\":[[0,0,0," + postState("{\"seg\":[{\"on\":true,\"id\":" + segmentIndex + ",\"fx\":0,\"bri\":" + + percentType.toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + ",\"col\":[[0,0,0," + percentType.toBigDecimal().multiply(BIG_DECIMAL_2_55).intValue() + "]]}]}"); } diff --git a/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/handlers/WLedSegmentHandler.java b/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/handlers/WLedSegmentHandler.java index f33b1a6ab4..3bb92de950 100644 --- a/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/handlers/WLedSegmentHandler.java +++ b/bundles/org.openhab.binding.wled/src/main/java/org/openhab/binding/wled/internal/handlers/WLedSegmentHandler.java @@ -117,6 +117,8 @@ public class WLedSegmentHandler extends BaseThingHandler { localApi.setMasterOn(false, config.segmentIndex); return; } + // do not turn the globalOn in order to allow for configuring this segment for effects that + // start later localApi.setMasterBrightness(percentCommand, config.segmentIndex); } break; @@ -155,6 +157,7 @@ public class WLedSegmentHandler extends BaseThingHandler { localApi.setMasterOn(OnOffType.ON.equals(command), config.segmentIndex); } else if (command instanceof IncreaseDecreaseType) { if (IncreaseDecreaseType.INCREASE.equals(command)) { + localApi.setGlobalOn(true); if (masterBrightness255.intValue() < 240) { localApi.sendGetRequest("/win&TT=1000&A=~15"); // 255 divided by 15 = 17 levels } else { @@ -184,6 +187,11 @@ public class WLedSegmentHandler extends BaseThingHandler { localApi.setMasterHSB(hsbCommand, config.segmentIndex); } } else if (command instanceof PercentType percentCommand) { + if (PercentType.ZERO.equals(percentCommand)) { + localApi.setMasterOn(false, config.segmentIndex); + return; + } + localApi.setGlobalOn(true); localApi.setMasterBrightness(percentCommand, config.segmentIndex); } return; @@ -216,6 +224,7 @@ public class WLedSegmentHandler extends BaseThingHandler { localApi.setPalette(command.toString(), config.segmentIndex); break; case CHANNEL_FX: + localApi.setGlobalOn(true); localApi.setEffect(command.toString(), config.segmentIndex); break; case CHANNEL_SPEED: