Skip to content
This repository has been archived by the owner on May 7, 2020. It is now read-only.

Commit

Permalink
[WIP] [Tradfri] Support for new RGB bulbs #4251
Browse files Browse the repository at this point in the history
Signed-off-by: Holger Reichert <mail@h0lger.de>
  • Loading branch information
hreichert committed Sep 15, 2017
1 parent ff901eb commit 74f1c1b
Show file tree
Hide file tree
Showing 9 changed files with 473 additions and 41 deletions.
Expand Up @@ -81,9 +81,10 @@ public void cleanUp() {

@Test
public void correctSupportedTypes() {
assertThat(discovery.getSupportedThingTypes().size(), is(2));
assertThat(discovery.getSupportedThingTypes().size(), is(3));
assertTrue(discovery.getSupportedThingTypes().contains(TradfriBindingConstants.THING_TYPE_DIMMABLE_LIGHT));
assertTrue(discovery.getSupportedThingTypes().contains(TradfriBindingConstants.THING_TYPE_COLOR_TEMP_LIGHT));
assertTrue(discovery.getSupportedThingTypes().contains(TradfriBindingConstants.THING_TYPE_COLOR_LIGHT));
}

@Test
Expand All @@ -101,4 +102,21 @@ public void validDiscoveryResult() {
assertThat(discoveryResult.getProperties().get(DeviceConfig.ID), is(65537));
assertThat(discoveryResult.getRepresentationProperty(), is(DeviceConfig.ID));
}

@Test
public void validDiscoveryResultColorLightCWS() {
String json = "{\"9001\":\"TRADFRI bulb E27 CWS opal 600lm\",\"9002\":1505151864,\"9020\":1505433527,\"9003\":65550,\"9019\":1,\"9054\":0,\"5750\":2,\"3\":{\"0\":\"IKEA of Sweden\",\"1\":\"TRADFRI bulb E27 CWS opal 600lm\",\"2\":\"\",\"3\":\"1.3.002\",\"6\":1},\"3311\":[{\"5850\":1,\"5708\":0,\"5851\":254,\"5707\":0,\"5709\":33137,\"5710\":27211,\"5711\":0,\"5706\":\"efd275\",\"9003\":0}]}";
JsonObject data = new JsonParser().parse(json).getAsJsonObject();

discovery.onUpdate("65550", data);

assertNotNull(discoveryResult);
assertThat(discoveryResult.getFlag(), is(DiscoveryResultFlag.NEW));
assertThat(discoveryResult.getThingUID(), is(new ThingUID("tradfri:0200:1:65550")));
assertThat(discoveryResult.getThingTypeUID(), is(TradfriBindingConstants.THING_TYPE_COLOR_LIGHT));
assertThat(discoveryResult.getBridgeUID(), is(new ThingUID("tradfri:gateway:1")));
assertThat(discoveryResult.getProperties().get(DeviceConfig.ID), is(65550));
assertThat(discoveryResult.getRepresentationProperty(), is(DeviceConfig.ID));
}

}
@@ -0,0 +1,80 @@
/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.binding.tradfri.internal;

import static org.junit.Assert.*;

import org.eclipse.smarthome.core.library.types.HSBType;
import org.junit.Test;

/**
* Tests for {@link TradfriColor}.
*
* @author Holger Reichert - Initial contribution
*/
public class TradfriColorTest {

@Test
public void testFromCieKnownGood1() {
TradfriColor color = TradfriColor.fromCie(29577, 12294, 254);
assertNotNull(color);
assertEquals(255, color.rgbR);
assertEquals(21, color.rgbG);
assertEquals(207, color.rgbB);
assertEquals(29577, color.xyX);
assertEquals(12294, color.xyY);
assertEquals(254, color.brightness);
}

@Test
public void testFromCieKnownGood2() {
TradfriColor color = TradfriColor.fromCie(19983, 37417, 84);
assertNotNull(color);
assertEquals(110, color.rgbR);
assertEquals(174, color.rgbG);
assertEquals(58, color.rgbB);
assertEquals(19983, color.xyX);
assertEquals(37417, color.xyY);
assertEquals(84, color.brightness);
}

@Test
public void testFromHSBTypeKnownGood1() {
TradfriColor color = TradfriColor.fromHSBType(HSBType.RED);
assertNotNull(color);
assertEquals(254, color.rgbR);
assertEquals(0, color.rgbG);
assertEquals(0, color.rgbB);
assertEquals(45914, color.xyX);
assertEquals(19615, color.xyY);
assertEquals(254, color.brightness);
}

@Test
public void testConversionReverse() {
// convert from HSBType
TradfriColor color = TradfriColor.fromHSBType(HSBType.GREEN);
assertNotNull(color);
assertEquals(0, color.rgbR);
assertEquals(254, color.rgbG); // 254 instead of 255 - only approximated calculation
assertEquals(0, color.rgbB);
assertEquals(11299, color.xyX);
assertEquals(48941, color.xyY);
assertEquals(254, color.brightness);
// convert the result again based on the XY values
TradfriColor reverse = TradfriColor.fromCie(color.xyX, color.xyY, color.brightness);
assertNotNull(reverse);
assertEquals(0, reverse.rgbR);
assertEquals(255, reverse.rgbG); // 255 instead of 254 - only approximated calculation
assertEquals(0, reverse.rgbB);
assertEquals(11299, reverse.xyX);
assertEquals(48941, reverse.xyY);
assertEquals(254, reverse.brightness);
}

}
Expand Up @@ -9,6 +9,8 @@ thing-type.tradfri.0100.label = Dimmbare Lampe (wei
thing-type.tradfri.0100.description = Dimmbare Lampe mit fester Farbtemperatur.
thing-type.tradfri.0220.label = Farbtemperatur Lampe (weiß)
thing-type.tradfri.0220.description = Dimmbare Lampe mit einstellbarer Farbtemperatur.
thing-type.tradfri.0200.label = Farbspektrum Lampe
thing-type.tradfri.0200.description = Dimmbare Lampe mit einstellbarer Farbe und Farbtemperatur.

# thing type configuration
thing-type.config.tradfri.gateway.host.label = IP-Adresse
Expand All @@ -21,9 +23,13 @@ thing-type.config.tradfri.0100.id.label = ID der Lampe
thing-type.config.tradfri.0100.id.description = ID zur Identifikation der Lampe.
thing-type.config.tradfri.0220.id.label = ID der Lampe
thing-type.config.tradfri.0220.id.description = ID zur Identifikation der Lampe.
thing-type.config.tradfri.0200.id.label = ID der Lampe
thing-type.config.tradfri.0200.id.description = ID zur Identifikation der Lampe.

# channel types
channel-type.tradfri.brightness.label = Helligkeit
channel-type.tradfri.brightness.description = Ermöglicht die Steuerung der Helligkeit. Ermöglicht ebenfalls die Lampe ein- und auszuschalten.
channel-type.tradfri.color_temperature.label = Farbtemperatur
channel-type.tradfri.color_temperature.description = Ermöglicht die Steuerung der Farbtemperatur. Von Tageslichtweiß (0) bis Warmweiß (100).
channel-type.tradfri.color.label = Farbe
channel-type.tradfri.color.description = Ermöglicht die Steuerung der Farbe.
Expand Up @@ -71,6 +71,28 @@
</config-description>
</thing-type>

<thing-type id="0200">
<supported-bridge-type-refs>
<bridge-type-ref id="gateway"/>
</supported-bridge-type-refs>

<label>Color Light</label>
<description>A dimmable light that supports full colors and color temperature settings.</description>

<channels>
<channel id="brightness" typeId="brightness"/>
<channel id="color_temperature" typeId="color_temperature"/>
<channel id="color" typeId="color"/>
</channels>

<config-description>
<parameter name="id" type="integer" required="true">
<label>ID</label>
<description>The identifier of the light on the gateway</description>
</parameter>
</config-description>
</thing-type>

<!-- note that this isn't yet supported by the code as we do not receive any data from the gateway for it -->
<thing-type id="0820" listed="false">
<supported-bridge-type-refs>
Expand Down Expand Up @@ -108,4 +130,11 @@
<category>ColorLight</category>
</channel-type>

<channel-type id="color">
<item-type>Color</item-type>
<label>Color</label>
<description>Control the color of the light.</description>
<category>ColorLight</category>
</channel-type>

</thing:thing-descriptions>
15 changes: 11 additions & 4 deletions extensions/binding/org.eclipse.smarthome.binding.tradfri/README.md
Expand Up @@ -12,14 +12,15 @@ The thing type ids are defined according to the lighting devices defined for Zig
|--------------------------|------------------|------------|
| Dimmable Light | 0x0100 | 0100 |
| Colour Temperature Light | 0x0220 | 0220 |

| Colour Light | 0x0200 | 0200 |

The following matrix lists the capabilities (channels) for each of the supported lighting device types:

| Thing type | On/Off | Brightness | Color | Color Temperature |
|-------------|:------:|:----------:|:-----:|:-----------------:|
| 0100 | X | X | | |
| 0220 | X | X | | X |
| 0200 | X | X | X | X |

## Thing Configuration

Expand All @@ -29,12 +30,15 @@ The devices require only a single (integer) parameter, which is their instance i

## Channels

All devices support the `brightness` channel, while the white spectrum bulbs additionally also support the `color_temperature` channel (refer to the matrix above).
All devices support the `brightness` channel.
The white spectrum bulbs additionally also support the `color_temperature` channel. Full color bulbs additionally also support the `color` channel.
Refer to the matrix above.

| Channel Type ID | Item Type | Description |
|-------------------|-----------|---------------------------------------------|
| brightness | Dimmer | The brightness of the bulb in percent |
| color_temperature | Dimmer | color temperature from 0%=cold to 100%=warm |
| color | Color | full color |

## Full Example

Expand All @@ -43,14 +47,16 @@ demo.things:
```
Bridge tradfri:gateway:mygateway [ host="192.168.0.177", code="EHPW5rIJKyXFgjH3" ] {
0100 myDimmableBulb [ id=65537 ]
0220 myColorTempBulb [ id=65538 ]
0220 myColorTempBulb [ id=65538 ]
0200 myColorBulb [ id=65539 ]
}
```

demo.items:

```
Dimmer Light { channel="tradfri:0100:mygateway:myDimmableBulb:brightness" }
Dimmer Light { channel="tradfri:0100:mygateway:myDimmableBulb:brightness" }
Color ColorLight { channel="tradfri:0200:mygateway:myColorBulb:color" }
```

demo.sitemap:
Expand All @@ -60,6 +66,7 @@ sitemap demo label="Main Menu"
{
Frame {
Slider item=Light label="Brightness [%.1f %%]"
Colorpicker item=ColorLight
}
}
```
Expand Up @@ -29,17 +29,20 @@ public class TradfriBindingConstants {

public final static ThingTypeUID THING_TYPE_DIMMABLE_LIGHT = new ThingTypeUID(BINDING_ID, "0100");
public final static ThingTypeUID THING_TYPE_COLOR_TEMP_LIGHT = new ThingTypeUID(BINDING_ID, "0220");
public final static ThingTypeUID THING_TYPE_COLOR_LIGHT = new ThingTypeUID(BINDING_ID, "0200");
public final static ThingTypeUID THING_TYPE_DIMMER = new ThingTypeUID(BINDING_ID, "0820");

public static final Set<ThingTypeUID> SUPPORTED_LIGHT_TYPES_UIDS = Collections.unmodifiableSet(
Stream.of(THING_TYPE_DIMMABLE_LIGHT, THING_TYPE_COLOR_TEMP_LIGHT).collect(Collectors.toSet()));
public static final Set<ThingTypeUID> SUPPORTED_LIGHT_TYPES_UIDS = Collections
.unmodifiableSet(Stream.of(THING_TYPE_DIMMABLE_LIGHT, THING_TYPE_COLOR_TEMP_LIGHT, THING_TYPE_COLOR_LIGHT)
.collect(Collectors.toSet()));

// Not yet used - included for future support
public static final Set<ThingTypeUID> SUPPORTED_CONTROLLER_TYPES_UIDS = Collections.singleton(THING_TYPE_DIMMER);

// List of all Channel IDs
public static final String CHANNEL_BRIGHTNESS = "brightness";
public static final String CHANNEL_COLOR_TEMPERATURE = "color_temperature";
public static final String CHANNEL_COLOR = "color";

// IPSO Objects
public static final String DEVICES = "15001";
Expand Down

0 comments on commit 74f1c1b

Please sign in to comment.