From e0602e58bb1936c31af3bede0dbb85c9bd00c181 Mon Sep 17 00:00:00 2001 From: Cody Cutrer Date: Wed, 21 Dec 2022 14:43:46 -0700 Subject: [PATCH] [nanoleaf] Handle and provide QuantityType for color-temperature-abs channel (#14026) * [nanoleaf] handle and provide QuantityType for color-temperature-abs channel see https://github.com/openhab/openhab-core/pull/3129 Signed-off-by: Cody Cutrer Signed-off-by: Andras Uhrin --- .../org.openhab.binding.nanoleaf/README.md | 28 +++++++++---------- .../handler/NanoleafControllerHandler.java | 20 ++++++++++--- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/bundles/org.openhab.binding.nanoleaf/README.md b/bundles/org.openhab.binding.nanoleaf/README.md index 74ff0a7bd7643..138456c9ac4a6 100644 --- a/bundles/org.openhab.binding.nanoleaf/README.md +++ b/bundles/org.openhab.binding.nanoleaf/README.md @@ -139,19 +139,19 @@ This discovers all connected panels with their IDs. The controller bridge has the following channels: -| Channel | Item Type | Description | Read Only | -|---------------------|-----------|-----------------------------------------------------------------------------------------------------------|-----------| -| color | Color | Color, power and brightness of all light panels | No | -| colorTemperature | Dimmer | Color temperature (in percent) of all light panels | No | -| colorTemperatureAbs | Number | Color temperature (in Kelvin, 1200 to 6500) of all light panels | No | -| colorMode | String | Color mode of the light panels | Yes | -| effect | String | Selected effect of the light panels | No | -| layout | Image | Shows the layout of your panels with IDs. | Yes | -| rhythmState | Switch | Connection state of the rhythm module | Yes | -| rhythmActive | Switch | Activity state of the rhythm module | Yes | -| rhythmMode | Number | Sound source for the rhythm module. 0=Microphone, 1=Aux cable | No | -| state | Image | Shows the current state of your panels with colors. | Yes | -| swipe | Trigger | [Canvas / Shapes Only] Detects Swipes over the panel.LEFT, RIGHT, UP, DOWN events are supported. | Yes | +| Channel | Item Type | Description | Read Only | +|---------------------|--------------------|-----------------------------------------------------------------------------------------------------------|-----------| +| color | Color | Color, power and brightness of all light panels | No | +| colorTemperature | Dimmer | Color temperature (in percent) of all light panels | No | +| colorTemperatureAbs | Number:Temperature | Color temperature (in Kelvin, 1200 to 6500) of all light panels | No | +| colorMode | String | Color mode of the light panels | Yes | +| effect | String | Selected effect of the light panels | No | +| layout | Image | Shows the layout of your panels with IDs. | Yes | +| rhythmState | Switch | Connection state of the rhythm module | Yes | +| rhythmActive | Switch | Activity state of the rhythm module | Yes | +| rhythmMode | Number | Sound source for the rhythm module. 0=Microphone, 1=Aux cable | No | +| state | Image | Shows the current state of your panels with colors. | Yes | +| swipe | Trigger | [Canvas / Shapes Only] Detects Swipes over the panel.LEFT, RIGHT, UP, DOWN events are supported. | Yes | A lightpanel thing has the following channels: @@ -235,7 +235,7 @@ Dimmer NanoleafBrightness "Brightness [%.0f]" { channel="nanoleaf:controller:MyL String NanoleafHue "Hue [%s]" String NanoleafSaturation "Saturation [%s]" Dimmer NanoleafColorTemp "Color temperature [%.0f]" { channel="nanoleaf:controller:MyLightPanels:colorTemperature" } -Number NanoleafColorTempAbs "Color temperature [%.000f]" { channel="nanoleaf:controller:MyLightPanels:colorTemperatureAbs" } +Number:Temperature NanoleafColorTempAbs "Color temperature [%d K]" { channel="nanoleaf:controller:MyLightPanels:colorTemperatureAbs" } String NanoleafColorMode "Color mode [%s]" { channel="nanoleaf:controller:MyLightPanels:colorMode" } String NanoleafEffect "Effect" { channel="nanoleaf:controller:MyLightPanels:effect" } Switch NanoleafRhythmState "Rhythm connected [MAP(nanoleaf.map):%s]" { channel="nanoleaf:controller:MyLightPanels:rhythmState" } diff --git a/bundles/org.openhab.binding.nanoleaf/src/main/java/org/openhab/binding/nanoleaf/internal/handler/NanoleafControllerHandler.java b/bundles/org.openhab.binding.nanoleaf/src/main/java/org/openhab/binding/nanoleaf/internal/handler/NanoleafControllerHandler.java index 21fbfb325ff11..a9ee48e0c66f4 100644 --- a/bundles/org.openhab.binding.nanoleaf/src/main/java/org/openhab/binding/nanoleaf/internal/handler/NanoleafControllerHandler.java +++ b/bundles/org.openhab.binding.nanoleaf/src/main/java/org/openhab/binding/nanoleaf/internal/handler/NanoleafControllerHandler.java @@ -79,8 +79,10 @@ import org.openhab.core.library.types.IncreaseDecreaseType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.PercentType; +import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.types.RawType; import org.openhab.core.library.types.StringType; +import org.openhab.core.library.unit.Units; import org.openhab.core.thing.Bridge; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; @@ -641,7 +643,7 @@ private void updateFromControllerInfo() throws NanoleafException { int hue; int saturation; if (colorTemperature != null) { - updateState(CHANNEL_COLOR_TEMPERATURE_ABS, new DecimalType(colorTemperature.getValue())); + updateState(CHANNEL_COLOR_TEMPERATURE_ABS, new QuantityType(colorTemperature.getValue(), Units.KELVIN)); Integer min = colorTemperature.getMin(); hue = min == null ? 0 : min; Integer max = colorTemperature.getMax(); @@ -899,15 +901,25 @@ private void sendStateCommand(String channel, Command command) throws NanoleafEx } break; case CHANNEL_COLOR_TEMPERATURE_ABS: + // Color temperature (absolute) + int colorTempKelvin; + + IntegerState state = new Ct(); if (command instanceof DecimalType) { - // Color temperature (absolute) - IntegerState state = new Ct(); state.setValue(((DecimalType) command).intValue()); - stateObject.setState(state); + } else if (command instanceof QuantityType) { + QuantityType tempKelvin = ((QuantityType) command).toInvertibleUnit(Units.KELVIN); + if (tempKelvin == null) { + logger.warn("Cannot convert color temperature {} to Kelvin.", command); + return; + } + state.setValue(tempKelvin.intValue()); } else { logger.warn("Unhandled command type: {}", command.getClass().getName()); return; } + + stateObject.setState(state); break; default: logger.warn("Unhandled command type: {}", command.getClass().getName());