From 7b45c5d23259590ad113779b5f200ad92e2fe7a6 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Fri, 28 Feb 2025 11:24:12 +0000 Subject: [PATCH 01/15] hue dynamic equipment tagging Signed-off-by: Andrew Fiddian-Green --- .../internal/handler/Clip2ThingHandler.java | 54 +++++++++++++++++++ .../resources/OH-INF/thing/Clip2Thing.xml | 1 + .../main/resources/OH-INF/thing/bridge.xml | 1 + 3 files changed, 56 insertions(+) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index a21504985a268..24f2ef4079888 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -51,6 +51,7 @@ import org.openhab.binding.hue.internal.api.dto.clip2.Resources; import org.openhab.binding.hue.internal.api.dto.clip2.TimedEffects; import org.openhab.binding.hue.internal.api.dto.clip2.enums.ActionType; +import org.openhab.binding.hue.internal.api.dto.clip2.enums.Archetype; import org.openhab.binding.hue.internal.api.dto.clip2.enums.ContentType; import org.openhab.binding.hue.internal.api.dto.clip2.enums.EffectType; import org.openhab.binding.hue.internal.api.dto.clip2.enums.ResourceType; @@ -109,6 +110,9 @@ public class Clip2ThingHandler extends BaseThingHandler { private static final Set SUPPORTED_SCENE_TYPES = Set.of(ResourceType.SCENE, ResourceType.SMART_SCENE); + private static final Set STRIPLIGHT_ARCHETYPES = Set.of(Archetype.HUE_LIGHTSTRIP, + Archetype.HUE_LIGHTSTRIP_TV, Archetype.HUE_TUBE, Archetype.STRING_LIGHT, Archetype.CHRISTMAS_TREE); + private static final Duration DYNAMICS_ACTIVE_WINDOW = Duration.ofSeconds(10); private static final String LK_WISER_DIMMER_MODEL_ID = "LK Dimmer"; @@ -1069,6 +1073,7 @@ private synchronized void updateDependencies() { updateServiceContributors(); updateChannelList(); updateChannelItemLinksFromLegacy(); + updateSemanticEquipmentTag(); if (!hasConnectivityIssue) { updateStatus(ThingStatus.ONLINE); } @@ -1411,4 +1416,53 @@ private void updateThingFromLegacy() { } } } + + /** + * Update the thing's semantic equipment tag. The main determinant for the equipment type is the supported channels. + * For lights use the product archetype to split between light bulbs and strip lights. Rooms and Zones are + * considered to be (groups of) light bulbs. + */ + // TODO use the semantic tag constants from OH core + private void updateSemanticEquipmentTag() { + String semanticEquipmentTag = null; + + // sensor equipment + if (supportedChannelIdSet.contains(CHANNEL_2_LIGHT_LEVEL) // + || supportedChannelIdSet.contains(CHANNEL_2_MOTION) + || supportedChannelIdSet.contains(CHANNEL_2_TEMPERATURE)) { + semanticEquipmentTag = "Sensor"; + } else + + // security equipment + if (supportedChannelIdSet.contains(CHANNEL_2_SECURITY_CONTACT)) { + semanticEquipmentTag = "Security"; + } else + + // button equipment + if (supportedChannelIdSet.contains(CHANNEL_2_BUTTON_LAST_EVENT)) { + semanticEquipmentTag = "Button"; + } else + + // rotary dial equipment + if (supportedChannelIdSet.contains(CHANNEL_2_ROTARY_STEPS)) { + semanticEquipmentTag = "RotaryDial"; + } else + + // rooms and zones are a super-set of light bulb equipment + if (thisResource.getType() != ResourceType.DEVICE) { + semanticEquipmentTag = "LightBulb"; + } else + + // everything else is individual light equipment + if (thisResource.getProductData() instanceof ProductData productData) { + if (STRIPLIGHT_ARCHETYPES.contains(productData.getProductArchetype())) { + semanticEquipmentTag = "LightStrip"; + } else { + semanticEquipmentTag = "LightBulb"; + } + } + + logger.debug("{} -> updateSemanticEquipmentTag({})", resourceId, semanticEquipmentTag); + updateThing(editThing().withSemanticEquipmentTag(semanticEquipmentTag).build()); + } } diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml index 51af718caf5d6..2b0563e49b0d8 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml @@ -11,6 +11,7 @@ A Hue API v2 device with channels depending on its actual capabilities. + LightBulb diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml index f763a8d23cd0a..62d590b942653 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml @@ -66,6 +66,7 @@ The Hue Bridge represents a Philips Hue Bridge supporting API v2. + Bridge From a5b2445f3422807b84e81a9b50f6dd16d2a04a6c Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Fri, 28 Feb 2025 12:03:30 +0000 Subject: [PATCH 02/15] add ToDo's Signed-off-by: Andrew Fiddian-Green --- .../binding/hue/internal/handler/Clip2ThingHandler.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index 24f2ef4079888..9a6bb8e6a0985 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -1424,45 +1424,54 @@ private void updateThingFromLegacy() { */ // TODO use the semantic tag constants from OH core private void updateSemanticEquipmentTag() { + // TODO SemanticTag semanticEquipmentTag = null; String semanticEquipmentTag = null; // sensor equipment if (supportedChannelIdSet.contains(CHANNEL_2_LIGHT_LEVEL) // || supportedChannelIdSet.contains(CHANNEL_2_MOTION) || supportedChannelIdSet.contains(CHANNEL_2_TEMPERATURE)) { + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.SENSOR semanticEquipmentTag = "Sensor"; } else // security equipment if (supportedChannelIdSet.contains(CHANNEL_2_SECURITY_CONTACT)) { + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.ALARM_SYSTEM semanticEquipmentTag = "Security"; } else // button equipment if (supportedChannelIdSet.contains(CHANNEL_2_BUTTON_LAST_EVENT)) { + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.WALL_SWITCH semanticEquipmentTag = "Button"; } else // rotary dial equipment if (supportedChannelIdSet.contains(CHANNEL_2_ROTARY_STEPS)) { + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.TBD ** semanticEquipmentTag = "RotaryDial"; } else // rooms and zones are a super-set of light bulb equipment if (thisResource.getType() != ResourceType.DEVICE) { + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHTBULB semanticEquipmentTag = "LightBulb"; } else // everything else is individual light equipment if (thisResource.getProductData() instanceof ProductData productData) { if (STRIPLIGHT_ARCHETYPES.contains(productData.getProductArchetype())) { + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHT_STRIPE semanticEquipmentTag = "LightStrip"; } else { + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHTBULB semanticEquipmentTag = "LightBulb"; } } logger.debug("{} -> updateSemanticEquipmentTag({})", resourceId, semanticEquipmentTag); + // TODO updateThing(editThing().withSemanticEquipmentTag(semanticEquipmentTag.getName()).build()); updateThing(editThing().withSemanticEquipmentTag(semanticEquipmentTag).build()); } } From 69506ebf41844ed3d330dd5ccbcd7c9d2a5fa0fa Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Fri, 28 Feb 2025 13:06:09 +0000 Subject: [PATCH 03/15] playing with tag values Signed-off-by: Andrew Fiddian-Green --- .../hue/internal/handler/Clip2ThingHandler.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index 9a6bb8e6a0985..33ffb35dfa8b5 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -1422,7 +1422,6 @@ private void updateThingFromLegacy() { * For lights use the product archetype to split between light bulbs and strip lights. Rooms and Zones are * considered to be (groups of) light bulbs. */ - // TODO use the semantic tag constants from OH core private void updateSemanticEquipmentTag() { // TODO SemanticTag semanticEquipmentTag = null; String semanticEquipmentTag = null; @@ -1437,26 +1436,26 @@ private void updateSemanticEquipmentTag() { // security equipment if (supportedChannelIdSet.contains(CHANNEL_2_SECURITY_CONTACT)) { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.ALARM_SYSTEM - semanticEquipmentTag = "Security"; + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.ALARM_DEVICE ** TBD ** + semanticEquipmentTag = "AlarmDevice"; } else // button equipment if (supportedChannelIdSet.contains(CHANNEL_2_BUTTON_LAST_EVENT)) { // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.WALL_SWITCH - semanticEquipmentTag = "Button"; + semanticEquipmentTag = "WallSwitch"; } else // rotary dial equipment if (supportedChannelIdSet.contains(CHANNEL_2_ROTARY_STEPS)) { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.TBD ** + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.WALL_DEVICE ** TBD ** semanticEquipmentTag = "RotaryDial"; } else // rooms and zones are a super-set of light bulb equipment if (thisResource.getType() != ResourceType.DEVICE) { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHTBULB - semanticEquipmentTag = "LightBulb"; + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHTING ** TBD ** + semanticEquipmentTag = "Lighting"; } else // everything else is individual light equipment @@ -1465,7 +1464,7 @@ private void updateSemanticEquipmentTag() { // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHT_STRIPE semanticEquipmentTag = "LightStrip"; } else { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHTBULB + // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHT_BULB ** TBD ** semanticEquipmentTag = "LightBulb"; } } From ea0f25e2b0af441f88e5cd4bf83b0dc3a693307d Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Fri, 28 Feb 2025 14:49:18 +0000 Subject: [PATCH 04/15] change bridge semantic tag Signed-off-by: Andrew Fiddian-Green --- .../src/main/resources/OH-INF/thing/bridge.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml index 62d590b942653..45a8fae35d9c4 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml @@ -66,7 +66,7 @@ The Hue Bridge represents a Philips Hue Bridge supporting API v2. - Bridge + NetworkDevice From 654522f18aa741a7383c65b4cf2fa8f434db6530 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Sat, 1 Mar 2025 10:51:46 +0000 Subject: [PATCH 05/15] adopt oh core #4626 Signed-off-by: Andrew Fiddian-Green --- .../internal/handler/Clip2ThingHandler.java | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index 33ffb35dfa8b5..23fc0d5252ac5 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -72,6 +72,8 @@ import org.openhab.core.library.types.StringType; import org.openhab.core.library.unit.MetricPrefix; import org.openhab.core.library.unit.Units; +import org.openhab.core.semantics.SemanticTag; +import org.openhab.core.semantics.model.DefaultSemanticTags; import org.openhab.core.thing.Bridge; import org.openhab.core.thing.Channel; import org.openhab.core.thing.ChannelUID; @@ -1423,54 +1425,48 @@ private void updateThingFromLegacy() { * considered to be (groups of) light bulbs. */ private void updateSemanticEquipmentTag() { - // TODO SemanticTag semanticEquipmentTag = null; - String semanticEquipmentTag = null; + SemanticTag equipmentTag = null; // sensor equipment if (supportedChannelIdSet.contains(CHANNEL_2_LIGHT_LEVEL) // || supportedChannelIdSet.contains(CHANNEL_2_MOTION) || supportedChannelIdSet.contains(CHANNEL_2_TEMPERATURE)) { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.SENSOR - semanticEquipmentTag = "Sensor"; + equipmentTag = DefaultSemanticTags.Equipment.SENSOR; } else // security equipment if (supportedChannelIdSet.contains(CHANNEL_2_SECURITY_CONTACT)) { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.ALARM_DEVICE ** TBD ** - semanticEquipmentTag = "AlarmDevice"; + equipmentTag = DefaultSemanticTags.Equipment.ALARM_SYSTEM; // TODO other tag } else // button equipment if (supportedChannelIdSet.contains(CHANNEL_2_BUTTON_LAST_EVENT)) { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.WALL_SWITCH - semanticEquipmentTag = "WallSwitch"; + equipmentTag = DefaultSemanticTags.Equipment.WALL_SWITCH; } else // rotary dial equipment if (supportedChannelIdSet.contains(CHANNEL_2_ROTARY_STEPS)) { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.WALL_DEVICE ** TBD ** - semanticEquipmentTag = "RotaryDial"; + equipmentTag = DefaultSemanticTags.Equipment.WALL_SWITCH; // TODO other tag } else // rooms and zones are a super-set of light bulb equipment if (thisResource.getType() != ResourceType.DEVICE) { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHTING ** TBD ** - semanticEquipmentTag = "Lighting"; + equipmentTag = DefaultSemanticTags.Equipment.LIGHTBULB; // TODO snake case } else // everything else is individual light equipment if (thisResource.getProductData() instanceof ProductData productData) { if (STRIPLIGHT_ARCHETYPES.contains(productData.getProductArchetype())) { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHT_STRIPE - semanticEquipmentTag = "LightStrip"; + equipmentTag = DefaultSemanticTags.Equipment.LIGHT_STRIPE; // TODO light strip ?? } else { - // TODO semanticEquipmentTag = o.o.c.semantics.model.DefaultSemanticTags.Equipment.LIGHT_BULB ** TBD ** - semanticEquipmentTag = "LightBulb"; + equipmentTag = DefaultSemanticTags.Equipment.LIGHTBULB; // TODO snake case } } - logger.debug("{} -> updateSemanticEquipmentTag({})", resourceId, semanticEquipmentTag); - // TODO updateThing(editThing().withSemanticEquipmentTag(semanticEquipmentTag.getName()).build()); - updateThing(editThing().withSemanticEquipmentTag(semanticEquipmentTag).build()); + if (equipmentTag != null) { + String equipmentTagName = equipmentTag.getName(); + logger.debug("{} -> updateSemanticEquipmentTag({})", resourceId, equipmentTagName); + updateThing(editThing().withSemanticEquipmentTag(equipmentTagName).build()); + } } } From bff426cc051e6fe7a3c5ec727ca17e74023a5fc3 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Tue, 8 Apr 2025 19:05:14 +0100 Subject: [PATCH 06/15] update to match core Signed-off-by: Andrew Fiddian-Green --- .../internal/handler/Clip2ThingHandler.java | 84 +++++++++---------- .../main/resources/OH-INF/thing/bridge.xml | 2 +- .../main/resources/OH-INF/thing/channels.xml | 61 +++++++++++++- 3 files changed, 98 insertions(+), 49 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index 23fc0d5252ac5..f3c7054651576 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -73,7 +73,7 @@ import org.openhab.core.library.unit.MetricPrefix; import org.openhab.core.library.unit.Units; import org.openhab.core.semantics.SemanticTag; -import org.openhab.core.semantics.model.DefaultSemanticTags; +import org.openhab.core.semantics.model.DefaultSemanticTags.Equipment; import org.openhab.core.thing.Bridge; import org.openhab.core.thing.Channel; import org.openhab.core.thing.ChannelUID; @@ -1075,7 +1075,7 @@ private synchronized void updateDependencies() { updateServiceContributors(); updateChannelList(); updateChannelItemLinksFromLegacy(); - updateSemanticEquipmentTag(); + updateEquipmentTag(); if (!hasConnectivityIssue) { updateStatus(ThingStatus.ONLINE); } @@ -1424,49 +1424,45 @@ private void updateThingFromLegacy() { * For lights use the product archetype to split between light bulbs and strip lights. Rooms and Zones are * considered to be (groups of) light bulbs. */ - private void updateSemanticEquipmentTag() { - SemanticTag equipmentTag = null; - - // sensor equipment - if (supportedChannelIdSet.contains(CHANNEL_2_LIGHT_LEVEL) // - || supportedChannelIdSet.contains(CHANNEL_2_MOTION) - || supportedChannelIdSet.contains(CHANNEL_2_TEMPERATURE)) { - equipmentTag = DefaultSemanticTags.Equipment.SENSOR; - } else - - // security equipment - if (supportedChannelIdSet.contains(CHANNEL_2_SECURITY_CONTACT)) { - equipmentTag = DefaultSemanticTags.Equipment.ALARM_SYSTEM; // TODO other tag - } else - - // button equipment - if (supportedChannelIdSet.contains(CHANNEL_2_BUTTON_LAST_EVENT)) { - equipmentTag = DefaultSemanticTags.Equipment.WALL_SWITCH; - } else - - // rotary dial equipment - if (supportedChannelIdSet.contains(CHANNEL_2_ROTARY_STEPS)) { - equipmentTag = DefaultSemanticTags.Equipment.WALL_SWITCH; // TODO other tag - } else - - // rooms and zones are a super-set of light bulb equipment - if (thisResource.getType() != ResourceType.DEVICE) { - equipmentTag = DefaultSemanticTags.Equipment.LIGHTBULB; // TODO snake case - } else - - // everything else is individual light equipment - if (thisResource.getProductData() instanceof ProductData productData) { - if (STRIPLIGHT_ARCHETYPES.contains(productData.getProductArchetype())) { - equipmentTag = DefaultSemanticTags.Equipment.LIGHT_STRIPE; // TODO light strip ?? - } else { - equipmentTag = DefaultSemanticTags.Equipment.LIGHTBULB; // TODO snake case - } - } + private void updateEquipmentTag() { + if (!disposing) { + int sensorCount = 0; + SemanticTag equipmentTag = Equipment.LIGHTBULB; // default; - if (equipmentTag != null) { - String equipmentTagName = equipmentTag.getName(); - logger.debug("{} -> updateSemanticEquipmentTag({})", resourceId, equipmentTagName); - updateThing(editThing().withSemanticEquipmentTag(equipmentTagName).build()); + if (thisResource.getType() == ResourceType.ROOM // + || thisResource.getType() == ResourceType.ZONE) { + equipmentTag = Equipment.LIGHT_SOURCE; + } + if (thisResource.getProductData() instanceof ProductData productData + && STRIPLIGHT_ARCHETYPES.contains(productData.getProductArchetype())) { + equipmentTag = Equipment.LIGHT_STRIP; + } + if (thing.getChannel(CHANNEL_2_BUTTON_LAST_EVENT) != null) { + equipmentTag = Equipment.BUTTON; + } + if (thing.getChannel(CHANNEL_2_ROTARY_STEPS) != null) { + equipmentTag = Equipment.DIAL; + } + if (thing.getChannel(CHANNEL_2_SECURITY_CONTACT) != null) { + equipmentTag = Equipment.ALARM_DEVICE; + } + if (thing.getChannel(CHANNEL_2_MOTION) != null) { + sensorCount++; + equipmentTag = Equipment.MOTION_DETECTOR; + } + if (thing.getChannel(CHANNEL_2_LIGHT_LEVEL) != null) { + sensorCount++; + equipmentTag = Equipment.ILLUMINANCE_SENSOR; + } + if (thing.getChannel(CHANNEL_2_TEMPERATURE) != null) { + sensorCount++; + equipmentTag = Equipment.TEMPERATURE_SENSOR; + } + if (sensorCount > 1) { + equipmentTag = Equipment.SENSOR; + } + logger.debug("{} -> updateEquipmentTag({})", resourceId, equipmentTag.getName()); + updateThing(editThing().withSemanticEquipmentTag(equipmentTag.getName()).build()); } } } diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml index 45a8fae35d9c4..fae9f8ba08975 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/bridge.xml @@ -66,7 +66,7 @@ The Hue Bridge represents a Philips Hue Bridge supporting API v2. - NetworkDevice + NetworkAppliance diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml index 5193bb495d28a..11336722a144d 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml @@ -8,6 +8,10 @@ The date and time when the sensor was last updated. Time + + Status + Timestamp + @@ -17,7 +21,7 @@ Current illuminance. Measurement - Light + Illuminance @@ -26,6 +30,10 @@ Number Current light level. + + Measurement + Illuminance + @@ -142,7 +150,8 @@ The alert channel allows a temporary change to the bulb’s state. - Alarm + Switch + Mode @@ -159,6 +168,10 @@ The effect channel allows putting the bulb in a color looping mode. ColorLight + + Switch + Mode + @@ -179,6 +192,10 @@ String The scene channel allows recalling a scene to all lights that belong to the scene. + + Control + Mode + @@ -200,12 +217,20 @@ Switch Lock + + Switch + EnabledDisabled + String MediaControl + + Control + Mode + veto @@ -215,12 +240,20 @@ The date and time when the thing was last updated. Time + + Status + Timestamp + String + + Control + Mode + veto @@ -228,6 +261,10 @@ String + + Control + Mode + veto @@ -237,6 +274,10 @@ The duration (ms) of dynamic transitions between light or scene states. Time + + Control + Duration + @@ -247,7 +288,7 @@ ColorLight Control - Light + Color veto @@ -259,7 +300,7 @@ Light Control - Light + Brightness veto @@ -281,18 +322,30 @@ Contact Lock + + Alarm + OpenClosed + Contact Siren + + Alarm + Tampered + Switch Switch + + Switch + EnabledDisabled + From 1f06b15b844b3d824167f379b000b3cd682ecbf7 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Wed, 9 Apr 2025 11:16:12 +0100 Subject: [PATCH 07/15] use overloaded tag setter Signed-off-by: Andrew Fiddian-Green --- .../binding/hue/internal/handler/Clip2ThingHandler.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index f3c7054651576..db3210e2be190 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -1429,8 +1429,7 @@ private void updateEquipmentTag() { int sensorCount = 0; SemanticTag equipmentTag = Equipment.LIGHTBULB; // default; - if (thisResource.getType() == ResourceType.ROOM // - || thisResource.getType() == ResourceType.ZONE) { + if (Set.of(ResourceType.ROOM, ResourceType.ZONE).contains(thisResource.getType())) { equipmentTag = Equipment.LIGHT_SOURCE; } if (thisResource.getProductData() instanceof ProductData productData @@ -1462,7 +1461,7 @@ private void updateEquipmentTag() { equipmentTag = Equipment.SENSOR; } logger.debug("{} -> updateEquipmentTag({})", resourceId, equipmentTag.getName()); - updateThing(editThing().withSemanticEquipmentTag(equipmentTag.getName()).build()); + updateThing(editThing().withSemanticEquipmentTag(equipmentTag).build()); } } } From b3604eff40c891829339251dff34e892384530b5 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Wed, 9 Apr 2025 11:32:42 +0100 Subject: [PATCH 08/15] change default thing equipment tag Signed-off-by: Andrew Fiddian-Green --- .../src/main/resources/OH-INF/thing/Clip2Thing.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml index 2b0563e49b0d8..c5f49a45cdbff 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml @@ -11,7 +11,7 @@ A Hue API v2 device with channels depending on its actual capabilities. - LightBulb + LightSource From 800f381ef9e47eee94061447cc32ff5b112cfc7b Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Thu, 10 Apr 2025 18:39:55 +0100 Subject: [PATCH 09/15] corrections Signed-off-by: Andrew Fiddian-Green --- .../src/main/resources/OH-INF/thing/channels.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml index 11336722a144d..835500377547e 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml @@ -313,7 +313,7 @@ Switch Switch - Power + OnOff veto @@ -324,7 +324,7 @@ Lock Alarm - OpenClosed + OpenState From f619d0606c10d6b89bfa4a67e219257684a982f4 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Fri, 11 Apr 2025 11:53:40 +0100 Subject: [PATCH 10/15] [hue] change equipment to contact sensor Signed-off-by: Andrew Fiddian-Green --- .../openhab/binding/hue/internal/handler/Clip2ThingHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index db3210e2be190..b8727c5975e40 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -1443,7 +1443,7 @@ private void updateEquipmentTag() { equipmentTag = Equipment.DIAL; } if (thing.getChannel(CHANNEL_2_SECURITY_CONTACT) != null) { - equipmentTag = Equipment.ALARM_DEVICE; + equipmentTag = Equipment.CONTACT_SENSOR; } if (thing.getChannel(CHANNEL_2_MOTION) != null) { sensorCount++; From a568a762859d92c3abcdff6f7e381809f67cc557 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Sat, 12 Apr 2025 17:09:36 +0100 Subject: [PATCH 11/15] fix a-or-b tags Signed-off-by: Andrew Fiddian-Green --- .../src/main/resources/OH-INF/thing/channels.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml index 835500377547e..e648f17de926f 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml @@ -313,7 +313,7 @@ Switch Switch - OnOff + Power veto @@ -344,7 +344,7 @@ Switch Switch - EnabledDisabled + Enabled From 7308f090136ea82a22332fe33d775c8cc897a491 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Thu, 17 Apr 2025 08:39:38 +0100 Subject: [PATCH 12/15] fix property Signed-off-by: Andrew Fiddian-Green --- .../src/main/resources/OH-INF/thing/channels.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml index e648f17de926f..31c4e5a06378a 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/channels.xml @@ -219,7 +219,7 @@ Lock Switch - EnabledDisabled + Mode From 756ef8894fe6a6e36b84ed02229acb66a040fd57 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Wed, 23 Apr 2025 13:16:22 +0100 Subject: [PATCH 13/15] use new zone tag Signed-off-by: Andrew Fiddian-Green --- .../openhab/binding/hue/internal/handler/Clip2ThingHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index b8727c5975e40..c2b5ff8d27579 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -1430,7 +1430,7 @@ private void updateEquipmentTag() { SemanticTag equipmentTag = Equipment.LIGHTBULB; // default; if (Set.of(ResourceType.ROOM, ResourceType.ZONE).contains(thisResource.getType())) { - equipmentTag = Equipment.LIGHT_SOURCE; + equipmentTag = Equipment.ZONE; } if (thisResource.getProductData() instanceof ProductData productData && STRIPLIGHT_ARCHETYPES.contains(productData.getProductArchetype())) { From ecc73e921a50b32c5ba4a916923fbdac889550d6 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Mon, 12 May 2025 23:31:41 +0100 Subject: [PATCH 14/15] adopt reviewer suggestion Signed-off-by: Andrew Fiddian-Green --- .../binding/hue/internal/handler/Clip2ThingHandler.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index c2b5ff8d27579..013898505b135 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -1432,9 +1432,11 @@ private void updateEquipmentTag() { if (Set.of(ResourceType.ROOM, ResourceType.ZONE).contains(thisResource.getType())) { equipmentTag = Equipment.ZONE; } - if (thisResource.getProductData() instanceof ProductData productData - && STRIPLIGHT_ARCHETYPES.contains(productData.getProductArchetype())) { - equipmentTag = Equipment.LIGHT_STRIP; + if ((thing.getChannel(CHANNEL_2_COLOR) != null) || (thing.getChannel(CHANNEL_2_BRIGHTNESS) != null) + || (thing.getChannel(CHANNEL_2_SWITCH) != null)) { + equipmentTag = (thisResource.getProductData() instanceof ProductData productData) + && STRIPLIGHT_ARCHETYPES.contains(productData.getProductArchetype()) ? Equipment.LIGHT_STRIP + : Equipment.LIGHTBULB; } if (thing.getChannel(CHANNEL_2_BUTTON_LAST_EVENT) != null) { equipmentTag = Equipment.BUTTON; From 315acc1294188ed691533c9e3342dcf8fa829ab6 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Tue, 13 May 2025 19:30:22 +0100 Subject: [PATCH 15/15] remove default equipment tags Signed-off-by: Andrew Fiddian-Green --- .../hue/internal/handler/Clip2ThingHandler.java | 10 ++++++---- .../src/main/resources/OH-INF/thing/Clip2Thing.xml | 1 - 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java index 013898505b135..15e6bc03ce0e1 100644 --- a/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java +++ b/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/Clip2ThingHandler.java @@ -1422,12 +1422,12 @@ private void updateThingFromLegacy() { /** * Update the thing's semantic equipment tag. The main determinant for the equipment type is the supported channels. * For lights use the product archetype to split between light bulbs and strip lights. Rooms and Zones are - * considered to be (groups of) light bulbs. + * considered to be zones. */ private void updateEquipmentTag() { if (!disposing) { int sensorCount = 0; - SemanticTag equipmentTag = Equipment.LIGHTBULB; // default; + SemanticTag equipmentTag = null; if (Set.of(ResourceType.ROOM, ResourceType.ZONE).contains(thisResource.getType())) { equipmentTag = Equipment.ZONE; @@ -1462,8 +1462,10 @@ private void updateEquipmentTag() { if (sensorCount > 1) { equipmentTag = Equipment.SENSOR; } - logger.debug("{} -> updateEquipmentTag({})", resourceId, equipmentTag.getName()); - updateThing(editThing().withSemanticEquipmentTag(equipmentTag).build()); + if (equipmentTag != null) { + logger.debug("{} -> updateEquipmentTag({})", resourceId, equipmentTag.getName()); + updateThing(editThing().withSemanticEquipmentTag(equipmentTag).build()); + } } } } diff --git a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml index c5f49a45cdbff..51af718caf5d6 100644 --- a/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml +++ b/bundles/org.openhab.binding.hue/src/main/resources/OH-INF/thing/Clip2Thing.xml @@ -11,7 +11,6 @@ A Hue API v2 device with channels depending on its actual capabilities. - LightSource