]> git.basschouten.com Git - openhab-addons.git/commitdiff
[mqtt.homeassistant] More readable label for discovered things (#13402)
authorSami Salonen <ssalonen@gmail.com>
Sun, 18 Sep 2022 19:22:06 +0000 (22:22 +0300)
committerGitHub <noreply@github.com>
Sun, 18 Sep 2022 19:22:06 +0000 (21:22 +0200)
* [mqtt.openassistant] Better labels for discoverd things

This PR introduces more simple label for things, instead of
"My Sensor (Sensor, Sensor, Sensor, Sensor, Sensor, Switch)" we have
simply "Me Sensor (5x Sensor, Switch)".

Signed-off-by: Sami Salonen <ssalonen@gmail.com>
bundles/org.openhab.binding.mqtt.homeassistant/src/main/java/org/openhab/binding/mqtt/homeassistant/internal/discovery/HomeAssistantDiscovery.java
bundles/org.openhab.binding.mqtt.homeassistant/src/test/java/org/openhab/binding/mqtt/homeassistant/internal/discovery/HomeAssistantDiscoveryTests.java

index b8b9ae5975150fb6d5a7c28c09647c7dfab6ea4e..3d90235cb816580a449e86ccc234f2452a245868 100644 (file)
@@ -26,7 +26,10 @@ import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.stream.Collector;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -128,6 +131,33 @@ public class HomeAssistantDiscovery extends AbstractMQTTDiscovery {
         return typeProvider.getThingTypeUIDs();
     }
 
+    /**
+     * Summarize components such as {Switch, Switch, Sensor} into string "Sensor, 2x Switch"
+     *
+     * @param componentNames stream of component names
+     * @return summary string of component names and their counts
+     */
+    static String getComponentNamesSummary(Stream<String> componentNames) {
+        StringBuilder summary = new StringBuilder();
+        Collector<String, ?, Long> countingCollector = Collectors.counting();
+        Map<String, Long> componentCounts = componentNames
+                .collect(Collectors.groupingBy(Function.identity(), countingCollector));
+        componentCounts.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach(entry -> {
+            String componentName = entry.getKey();
+            long count = entry.getValue();
+            if (summary.length() > 0) {
+                // not the first entry, so let's add the separating comma
+                summary.append(", ");
+            }
+            if (count > 1) {
+                summary.append(count);
+                summary.append("x ");
+            }
+            summary.append(componentName);
+        });
+        return summary.toString();
+    }
+
     @Override
     public void receivedMessage(ThingUID connectionBridge, MqttBrokerConnection connection, String topic,
             byte[] payload) {
@@ -184,8 +214,8 @@ public class HomeAssistantDiscovery extends AbstractMQTTDiscovery {
                 components.sort(Comparator.comparing(HaID::toString));
             }
 
-            final String componentNames = components.stream().map(id -> id.component)
-                    .map(c -> HA_COMP_TO_NAME.getOrDefault(c, c)).collect(Collectors.joining(", "));
+            final String componentNames = getComponentNamesSummary(
+                    components.stream().map(id -> id.component).map(c -> HA_COMP_TO_NAME.getOrDefault(c, c)));
 
             final List<String> topics = components.stream().map(HaID::toShortTopic).collect(Collectors.toList());
 
index d8614eaa3520969b7e8a8e125c6e2c486c41742d..3ac574196c82ed88ee984aeea340dab0e40dca01 100644 (file)
@@ -21,6 +21,7 @@ import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -54,6 +55,14 @@ public class HomeAssistantDiscoveryTests extends AbstractHomeAssistantTests {
         discovery = new TestHomeAssistantDiscovery(channelTypeProvider);
     }
 
+    @Test
+    public void testComponentNameSummary() {
+        assertThat(
+                HomeAssistantDiscovery.getComponentNamesSummary(
+                        Stream.of("Sensor", "Switch", "Sensor", "Foobar", "Foobar", "Foobar")), //
+                is("3x Foobar, 2x Sensor, Switch"));
+    }
+
     @Test
     public void testOneThingDiscovery() throws Exception {
         var discoveryListener = new LatchDiscoveryListener();
@@ -79,6 +88,7 @@ public class HomeAssistantDiscoveryTests extends AbstractHomeAssistantTests {
         assertThat(result.getProperties().get(Thing.PROPERTY_VENDOR), is("TuYa"));
         assertThat(result.getProperties().get(Thing.PROPERTY_FIRMWARE_VERSION), is("Zigbee2MQTT 1.18.2"));
         assertThat(result.getProperties().get(HandlerConfiguration.PROPERTY_BASETOPIC), is("homeassistant"));
+        assertThat(result.getLabel(), is("th1 (Climate Control, Switch)"));
         assertThat((List<String>) result.getProperties().get(HandlerConfiguration.PROPERTY_TOPICS), hasItems(
                 "climate/0x847127fffe11dd6a_climate_zigbee2mqtt", "switch/0x847127fffe11dd6a_auto_lock_zigbee2mqtt"));
     }