]> git.basschouten.com Git - openhab-addons.git/commitdiff
Refactor dynamic creation of zone channels (#16763)
authorJacob Laursen <jacob-github@vindvejr.dk>
Tue, 14 May 2024 20:42:57 +0000 (22:42 +0200)
committerGitHub <noreply@github.com>
Tue, 14 May 2024 20:42:57 +0000 (22:42 +0200)
Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
bundles/org.openhab.binding.denonmarantz/src/main/java/org/openhab/binding/denonmarantz/internal/DenonMarantzBindingConstants.java
bundles/org.openhab.binding.denonmarantz/src/main/java/org/openhab/binding/denonmarantz/internal/handler/DenonMarantzHandler.java

index ae29e8523c6e60e5decf2c552b285929932e5793..88d8391d3691ad3869a12d72059e75271711abbe 100644 (file)
@@ -13,8 +13,6 @@
 package org.openhab.binding.denonmarantz.internal;
 
 import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -79,55 +77,28 @@ public class DenonMarantzBindingConstants {
     public static final String CHANNEL_ZONE4_INPUT = "zone4#input";
 
     // Map of Zone2 Channel Type UIDs (to be added to Thing later when needed)
-    public static final Map<String, ChannelTypeUID> ZONE2_CHANNEL_TYPES = new LinkedHashMap<>();
-    static {
-        ZONE2_CHANNEL_TYPES.put(CHANNEL_ZONE2_POWER, new ChannelTypeUID(BINDING_ID, "zonePower"));
-        ZONE2_CHANNEL_TYPES.put(CHANNEL_ZONE2_VOLUME, new ChannelTypeUID(BINDING_ID, "volume"));
-        ZONE2_CHANNEL_TYPES.put(CHANNEL_ZONE2_VOLUME_DB, new ChannelTypeUID(BINDING_ID, "volumeDB"));
-        ZONE2_CHANNEL_TYPES.put(CHANNEL_ZONE2_MUTE, new ChannelTypeUID(BINDING_ID, "mute"));
-        ZONE2_CHANNEL_TYPES.put(CHANNEL_ZONE2_INPUT, new ChannelTypeUID(BINDING_ID, "input"));
-    }
+    public static final Map<String, ChannelTypeUID> ZONE2_CHANNEL_TYPES = Map.ofEntries(
+            Map.entry(CHANNEL_ZONE2_POWER, new ChannelTypeUID(BINDING_ID, "zonePower")),
+            Map.entry(CHANNEL_ZONE2_VOLUME, new ChannelTypeUID(BINDING_ID, "volume")),
+            Map.entry(CHANNEL_ZONE2_VOLUME_DB, new ChannelTypeUID(BINDING_ID, "volumeDB")),
+            Map.entry(CHANNEL_ZONE2_MUTE, new ChannelTypeUID(BINDING_ID, "mute")),
+            Map.entry(CHANNEL_ZONE2_INPUT, new ChannelTypeUID(BINDING_ID, "input")));
 
     // Map of Zone3 Channel Type UIDs (to be added to Thing later when needed)
-    public static final Map<String, ChannelTypeUID> ZONE3_CHANNEL_TYPES = new LinkedHashMap<>();
-    static {
-        ZONE3_CHANNEL_TYPES.put(CHANNEL_ZONE3_POWER, new ChannelTypeUID(BINDING_ID, "zonePower"));
-        ZONE3_CHANNEL_TYPES.put(CHANNEL_ZONE3_VOLUME, new ChannelTypeUID(BINDING_ID, "volume"));
-        ZONE3_CHANNEL_TYPES.put(CHANNEL_ZONE3_VOLUME_DB, new ChannelTypeUID(BINDING_ID, "volumeDB"));
-        ZONE3_CHANNEL_TYPES.put(CHANNEL_ZONE3_MUTE, new ChannelTypeUID(BINDING_ID, "mute"));
-        ZONE3_CHANNEL_TYPES.put(CHANNEL_ZONE3_INPUT, new ChannelTypeUID(BINDING_ID, "input"));
-    }
+    public static final Map<String, ChannelTypeUID> ZONE3_CHANNEL_TYPES = Map.ofEntries(
+            Map.entry(CHANNEL_ZONE3_POWER, new ChannelTypeUID(BINDING_ID, "zonePower")),
+            Map.entry(CHANNEL_ZONE3_VOLUME, new ChannelTypeUID(BINDING_ID, "volume")),
+            Map.entry(CHANNEL_ZONE3_VOLUME_DB, new ChannelTypeUID(BINDING_ID, "volumeDB")),
+            Map.entry(CHANNEL_ZONE3_MUTE, new ChannelTypeUID(BINDING_ID, "mute")),
+            Map.entry(CHANNEL_ZONE3_INPUT, new ChannelTypeUID(BINDING_ID, "input")));
 
     // Map of Zone4 Channel Type UIDs (to be added to Thing later when needed)
-    public static final Map<String, ChannelTypeUID> ZONE4_CHANNEL_TYPES = new LinkedHashMap<>();
-    static {
-        ZONE4_CHANNEL_TYPES.put(CHANNEL_ZONE4_POWER, new ChannelTypeUID(BINDING_ID, "zonePower"));
-        ZONE4_CHANNEL_TYPES.put(CHANNEL_ZONE4_VOLUME, new ChannelTypeUID(BINDING_ID, "volume"));
-        ZONE4_CHANNEL_TYPES.put(CHANNEL_ZONE4_VOLUME_DB, new ChannelTypeUID(BINDING_ID, "volumeDB"));
-        ZONE4_CHANNEL_TYPES.put(CHANNEL_ZONE4_MUTE, new ChannelTypeUID(BINDING_ID, "mute"));
-        ZONE4_CHANNEL_TYPES.put(CHANNEL_ZONE4_INPUT, new ChannelTypeUID(BINDING_ID, "input"));
-    }
-
-    /**
-     * Static mapping of ChannelType-to-ItemType (workaround while waiting for
-     * https://github.com/eclipse/smarthome/issues/4950 as yet there is no convenient way to extract the item type from
-     * thing-types.xml)
-     * See https://github.com/eclipse/smarthome/pull/4787#issuecomment-362287430
-     */
-    public static final Map<String, String> CHANNEL_ITEM_TYPES = new HashMap<>();
-    static {
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE2_POWER, "Switch");
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE2_VOLUME, "Dimmer");
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE2_VOLUME_DB, "Number");
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE2_MUTE, "Switch");
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE2_INPUT, "String");
-
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE3_POWER, "Switch");
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE3_VOLUME, "Dimmer");
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE3_VOLUME_DB, "Number");
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE3_MUTE, "Switch");
-        CHANNEL_ITEM_TYPES.put(CHANNEL_ZONE3_INPUT, "String");
-    }
+    public static final Map<String, ChannelTypeUID> ZONE4_CHANNEL_TYPES = Map.ofEntries(
+            Map.entry(CHANNEL_ZONE4_POWER, new ChannelTypeUID(BINDING_ID, "zonePower")),
+            Map.entry(CHANNEL_ZONE4_VOLUME, new ChannelTypeUID(BINDING_ID, "volume")),
+            Map.entry(CHANNEL_ZONE4_VOLUME_DB, new ChannelTypeUID(BINDING_ID, "volumeDB")),
+            Map.entry(CHANNEL_ZONE4_MUTE, new ChannelTypeUID(BINDING_ID, "mute")),
+            Map.entry(CHANNEL_ZONE4_INPUT, new ChannelTypeUID(BINDING_ID, "input")));
 
     // Offset in dB from the actual dB value to the volume as presented by the AVR (0 == -80 dB)
     public static final BigDecimal DB_OFFSET = new BigDecimal("80");
index 1ba7dcc5ed27c45f0a8b4a275aa97d31a5f4f9d3..e37d55e2893fa8f8bb0808610134e64faaf2a271 100644 (file)
@@ -53,7 +53,8 @@ import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingStatus;
 import org.openhab.core.thing.ThingStatusDetail;
 import org.openhab.core.thing.binding.BaseThingHandler;
-import org.openhab.core.thing.binding.builder.ChannelBuilder;
+import org.openhab.core.thing.binding.ThingHandlerCallback;
+import org.openhab.core.thing.type.ChannelKind;
 import org.openhab.core.thing.type.ChannelTypeUID;
 import org.openhab.core.types.Command;
 import org.openhab.core.types.RefreshType;
@@ -376,14 +377,17 @@ public class DenonMarantzHandler extends BaseThingHandler implements DenonMarant
 
             // add the channels that were not yet added
             if (!channelsToAdd.isEmpty()) {
-                for (Entry<String, ChannelTypeUID> entry : channelsToAdd) {
-                    String itemType = CHANNEL_ITEM_TYPES.get(entry.getKey());
-                    Channel channel = ChannelBuilder
-                            .create(new ChannelUID(this.getThing().getUID(), entry.getKey()), itemType)
-                            .withType(entry.getValue()).build();
-                    channels.add(channel);
+                ThingHandlerCallback callback = getCallback();
+                if (callback != null) {
+                    for (Entry<String, ChannelTypeUID> entry : channelsToAdd) {
+                        ChannelUID channelUID = new ChannelUID(this.getThing().getUID(), entry.getKey());
+                        channels.add(callback.createChannelBuilder(channelUID, entry.getValue())
+                                .withKind(ChannelKind.STATE).build());
+                    }
+                    channelsUpdated = true;
+                } else {
+                    logger.warn("Could not create zone channels");
                 }
-                channelsUpdated = true;
             } else {
                 logger.debug("No zone channels have been added");
             }