*/
@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<String> 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();
}
// 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()));
@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() + "]]}]}"));
}
@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() + "]]}]}");
}
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;
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 {
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;
localApi.setPalette(command.toString(), config.segmentIndex);
break;
case CHANNEL_FX:
+ localApi.setGlobalOn(true);
localApi.setEffect(command.toString(), config.segmentIndex);
break;
case CHANNEL_SPEED: