]> git.basschouten.com Git - openhab-addons.git/commitdiff
[netatmo] Improve channel helpers (#12851)
authorGaël L'hopital <gael@lhopital.org>
Sat, 11 Jun 2022 18:08:10 +0000 (20:08 +0200)
committerGitHub <noreply@github.com>
Sat, 11 Jun 2022 18:08:10 +0000 (20:08 +0200)
Signed-off-by: clinique <gael@lhopital.org>
38 files changed:
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/NetatmoHandlerFactory.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/ChannelGroup.java [new file with mode: 0644]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/ModuleType.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/AirQualityChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/AirQualityExtChannelHelper.java [deleted file]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/BatteryChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/BatteryExtChannelHelper.java [deleted file]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/CameraChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/ChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/DoorbellChannelHelper.java [deleted file]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/EnergyChannelHelper.java [new file with mode: 0644]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/EventChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/EventDoorbellChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/EventPersonChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HomeEnergyChannelHelper.java [deleted file]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HomeSecurityChannelHelper.java [deleted file]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HumidityChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/LocationChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/MeasuresChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/NoiseChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/PersonChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/PresenceChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/PressureChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/PressureExtChannelHelper.java [deleted file]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/RainChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/RoomChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/SecurityChannelHelper.java [new file with mode: 0644]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/SetpointChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/SignalChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/SirenChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TemperatureChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TemperatureExtChannelHelper.java [deleted file]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TemperatureOutChannelHelper.java [deleted file]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/Therm1ChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TimestampChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TimestampExtChannelHelper.java [deleted file]
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/WindChannelHelper.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/providers/NetatmoThingTypeProvider.java

index 4bd697b859ecc2933ba619dc654a521a28567c08..7bb51383801c01dc0b2e57de00dc99835a31f271 100644 (file)
@@ -112,13 +112,8 @@ public class NetatmoHandlerFactory extends BaseThingHandlerFactory {
         CommonInterface handler = moduleType.isABridge() ? new DeviceHandler((Bridge) thing) : new ModuleHandler(thing);
 
         List<ChannelHelper> helpers = new ArrayList<>();
-        moduleType.channelHelpers.forEach(helperClass -> {
-            try {
-                helpers.add(helperClass.getConstructor().newInstance());
-            } catch (ReflectiveOperationException e) {
-                logger.warn("Error creating or initializing helper class : {}", e.getMessage());
-            }
-        });
+        moduleType.channelGroups
+                .forEach(channelGroup -> channelGroup.getHelperInstance().ifPresent(helper -> helpers.add(helper)));
 
         moduleType.capabilities.forEach(capability -> {
             Capability newCap = null;
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/ChannelGroup.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/data/ChannelGroup.java
new file mode 100644 (file)
index 0000000..fcd5a37
--- /dev/null
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2010-2022 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.netatmo.internal.api.data;
+
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.AirQualityChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.BatteryChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.ChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.EventChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.HumidityChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.LocationChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.MeasuresChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.NoiseChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.SignalChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.TemperatureChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.TimestampChannelHelper;
+import org.openhab.binding.netatmo.internal.providers.NetatmoThingTypeProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The {@link ChannelGroup} makes the link between a channel helper and some group types. It also
+ * defines some standard and common channel groups used by more than one thing.
+ *
+ * @author Gaël L'hopital - Initial contribution
+ *
+ */
+@NonNullByDefault
+public class ChannelGroup {
+    public static final ChannelGroup SIGNAL = new ChannelGroup(SignalChannelHelper.class, GROUP_SIGNAL);
+    public static final ChannelGroup EVENT = new ChannelGroup(EventChannelHelper.class, GROUP_LAST_EVENT);
+    public static final ChannelGroup MEASURE = new ChannelGroup(MeasuresChannelHelper.class);
+    public static final ChannelGroup BATTERY = new ChannelGroup(BatteryChannelHelper.class, GROUP_BATTERY);
+    public static final ChannelGroup LOCATION = new ChannelGroup(LocationChannelHelper.class, GROUP_LOCATION);
+    public static final ChannelGroup BATTERY_EXT = new ChannelGroup(BatteryChannelHelper.class,
+            GROUP_TYPE_BATTERY_EXTENDED);
+    public static final ChannelGroup TSTAMP_EXT = new ChannelGroup(TimestampChannelHelper.class,
+            GROUP_TYPE_TIMESTAMP_EXTENDED);
+    public static final ChannelGroup TEMP_OUTSIDE_EXT = new ChannelGroup(TemperatureChannelHelper.class,
+            MeasureClass.OUTSIDE_TEMPERATURE, GROUP_TYPE_TEMPERATURE_OUTSIDE);
+    public static final ChannelGroup TEMP_INSIDE_EXT = new ChannelGroup(TemperatureChannelHelper.class,
+            MeasureClass.INSIDE_TEMPERATURE, GROUP_TYPE_TEMPERATURE_EXTENDED);
+    public static final ChannelGroup TEMP_INSIDE = new ChannelGroup(TemperatureChannelHelper.class,
+            MeasureClass.INSIDE_TEMPERATURE, GROUP_TEMPERATURE);
+    public static final ChannelGroup AIR_QUALITY = new ChannelGroup(AirQualityChannelHelper.class, MeasureClass.CO2,
+            GROUP_AIR_QUALITY);
+    public static final ChannelGroup NOISE = new ChannelGroup(NoiseChannelHelper.class, MeasureClass.NOISE,
+            GROUP_NOISE);
+    public static final ChannelGroup HUMIDITY = new ChannelGroup(HumidityChannelHelper.class, MeasureClass.HUMIDITY,
+            GROUP_HUMIDITY);
+
+    private final Logger logger = LoggerFactory.getLogger(ChannelGroup.class);
+    private final Class<? extends ChannelHelper> helper;
+    public final Set<String> groupTypes;
+    public final Set<String> extensions;
+
+    ChannelGroup(Class<? extends ChannelHelper> helper, String... groupTypes) {
+        this(helper, Set.of(), groupTypes);
+    }
+
+    ChannelGroup(Class<? extends ChannelHelper> helper, MeasureClass measureClass, String... groupTypes) {
+        this(helper, measureClass.channels.keySet(), groupTypes);
+    }
+
+    private ChannelGroup(Class<? extends ChannelHelper> helper, Set<String> extensions, String... groupTypes) {
+        this.helper = helper;
+        this.groupTypes = Set.of(groupTypes);
+        this.extensions = extensions;
+    }
+
+    public Optional<ChannelHelper> getHelperInstance() {
+        try {
+            return Optional.of(helper.getConstructor(Set.class).newInstance(
+                    groupTypes.stream().map(NetatmoThingTypeProvider::toGroupName).collect(Collectors.toSet())));
+        } catch (ReflectiveOperationException e) {
+            logger.warn("Error creating or initializing helper class : {}", e.getMessage());
+        }
+        return Optional.empty();
+    }
+}
index 34adc622f6fa497f721c46918358f445b2ce0c05..ddfb08608d2d4b7a8edab4ab44192d844c1f5ec0 100644 (file)
  */
 package org.openhab.binding.netatmo.internal.api.data;
 
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.BINDING_ID;
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.*;
 
 import java.net.URI;
 import java.util.EnumSet;
-import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.FeatureArea;
+import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
 import org.openhab.binding.netatmo.internal.handler.capability.AirCareCapability;
 import org.openhab.binding.netatmo.internal.handler.capability.CameraCapability;
 import org.openhab.binding.netatmo.internal.handler.capability.Capability;
@@ -36,36 +38,20 @@ import org.openhab.binding.netatmo.internal.handler.capability.PresenceCapabilit
 import org.openhab.binding.netatmo.internal.handler.capability.RoomCapability;
 import org.openhab.binding.netatmo.internal.handler.capability.WeatherCapability;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.AirQualityChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.AirQualityExtChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.BatteryChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.BatteryExtChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.CameraChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.ChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.DoorbellChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.EventChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.EnergyChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.EventDoorbellChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.EventPersonChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.HomeEnergyChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.HomeSecurityChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.HumidityChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.LocationChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.MeasuresChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.NoiseChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.PersonChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.PresenceChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.PressureChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.PressureExtChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.RainChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.RoomChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.SecurityChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.SetpointChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.SignalChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.SirenChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.TemperatureChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.TemperatureExtChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.TemperatureOutChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.Therm1ChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.TimestampChannelHelper;
-import org.openhab.binding.netatmo.internal.handler.channelhelper.TimestampExtChannelHelper;
 import org.openhab.binding.netatmo.internal.handler.channelhelper.WindChannelHelper;
 import org.openhab.core.thing.ThingTypeUID;
 
@@ -76,111 +62,102 @@ import org.openhab.core.thing.ThingTypeUID;
  */
 @NonNullByDefault
 public enum ModuleType {
-    UNKNOWN(FeatureArea.NONE, "", null, List.of(), List.of()),
-    ACCOUNT(FeatureArea.NONE, "", null, List.of(), List.of()),
+    UNKNOWN(FeatureArea.NONE, "", null, Set.of()),
+    ACCOUNT(FeatureArea.NONE, "", null, Set.of()),
 
     HOME(FeatureArea.NONE, "NAHome", ACCOUNT,
-            List.of(DeviceCapability.class, EventCapability.class, HomeCapability.class, ChannelHelperCapability.class),
-            List.of(HomeSecurityChannelHelper.class, HomeEnergyChannelHelper.class)),
+            Set.of(DeviceCapability.class, EventCapability.class, HomeCapability.class, ChannelHelperCapability.class),
+            new ChannelGroup(SecurityChannelHelper.class, GROUP_SECURITY),
+            new ChannelGroup(EnergyChannelHelper.class, GROUP_ENERGY)),
 
     PERSON(FeatureArea.SECURITY, "NAPerson", HOME,
-            List.of(EventCapability.class, PersonCapability.class, ChannelHelperCapability.class),
-            List.of(PersonChannelHelper.class, EventPersonChannelHelper.class)),
+            Set.of(EventCapability.class, PersonCapability.class, ChannelHelperCapability.class),
+            new ChannelGroup(PersonChannelHelper.class, GROUP_PERSON),
+            new ChannelGroup(EventPersonChannelHelper.class, GROUP_PERSON_LAST_EVENT)),
 
     WELCOME(FeatureArea.SECURITY, "NACamera", HOME,
-            List.of(EventCapability.class, CameraCapability.class, ChannelHelperCapability.class),
-            List.of(CameraChannelHelper.class, SignalChannelHelper.class, EventChannelHelper.class)),
+            Set.of(EventCapability.class, CameraCapability.class, ChannelHelperCapability.class), ChannelGroup.SIGNAL,
+            ChannelGroup.EVENT, new ChannelGroup(CameraChannelHelper.class, GROUP_CAM_STATUS, GROUP_CAM_LIVE)),
 
-    SIREN(FeatureArea.SECURITY, "NIS", WELCOME, List.of(ChannelHelperCapability.class),
-            List.of(SirenChannelHelper.class, BatteryChannelHelper.class, TimestampChannelHelper.class,
-                    SignalChannelHelper.class)),
+    SIREN(FeatureArea.SECURITY, "NIS", WELCOME, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL,
+            ChannelGroup.BATTERY, new ChannelGroup(TimestampChannelHelper.class, GROUP_TIMESTAMP),
+            new ChannelGroup(SirenChannelHelper.class, GROUP_SIREN)),
 
     PRESENCE(FeatureArea.SECURITY, "NOC", HOME,
-            List.of(EventCapability.class, PresenceCapability.class, ChannelHelperCapability.class),
-            List.of(PresenceChannelHelper.class, SignalChannelHelper.class, EventChannelHelper.class)),
+            Set.of(EventCapability.class, PresenceCapability.class, ChannelHelperCapability.class), ChannelGroup.SIGNAL,
+            ChannelGroup.EVENT,
+            new ChannelGroup(PresenceChannelHelper.class, GROUP_CAM_STATUS, GROUP_CAM_LIVE, GROUP_PRESENCE)),
 
     DOORBELL(FeatureArea.SECURITY, "NDB", HOME,
-            List.of(EventCapability.class, CameraCapability.class, ChannelHelperCapability.class),
-            List.of(DoorbellChannelHelper.class, SignalChannelHelper.class, EventDoorbellChannelHelper.class)),
+            Set.of(EventCapability.class, CameraCapability.class, ChannelHelperCapability.class), ChannelGroup.SIGNAL,
+            new ChannelGroup(CameraChannelHelper.class, GROUP_DOORBELL_STATUS, GROUP_DOORBELL_LIVE),
+            new ChannelGroup(EventDoorbellChannelHelper.class, GROUP_DOORBELL_LAST_EVENT, GROUP_DOORBELL_SUB_EVENT)),
 
     WEATHER_STATION(FeatureArea.WEATHER, "NAMain", ACCOUNT,
-            List.of(DeviceCapability.class, WeatherCapability.class, MeasureCapability.class,
+            Set.of(DeviceCapability.class, WeatherCapability.class, MeasureCapability.class,
                     ChannelHelperCapability.class),
-            List.of(PressureExtChannelHelper.class, NoiseChannelHelper.class, HumidityChannelHelper.class,
-                    TemperatureExtChannelHelper.class, AirQualityChannelHelper.class, LocationChannelHelper.class,
-                    TimestampExtChannelHelper.class, MeasuresChannelHelper.class, SignalChannelHelper.class)),
+            ChannelGroup.SIGNAL, ChannelGroup.HUMIDITY, ChannelGroup.TSTAMP_EXT, ChannelGroup.MEASURE,
+            ChannelGroup.AIR_QUALITY, ChannelGroup.LOCATION, ChannelGroup.NOISE, ChannelGroup.TEMP_INSIDE_EXT,
+            new ChannelGroup(PressureChannelHelper.class, MeasureClass.PRESSURE, GROUP_TYPE_PRESSURE_EXTENDED)),
 
     OUTDOOR(FeatureArea.WEATHER, "NAModule1", WEATHER_STATION,
-            List.of(MeasureCapability.class, ChannelHelperCapability.class),
-            List.of(HumidityChannelHelper.class, TemperatureOutChannelHelper.class, BatteryChannelHelper.class,
-                    MeasuresChannelHelper.class, TimestampExtChannelHelper.class, SignalChannelHelper.class)),
+            Set.of(MeasureCapability.class, ChannelHelperCapability.class), ChannelGroup.SIGNAL, ChannelGroup.HUMIDITY,
+            ChannelGroup.TSTAMP_EXT, ChannelGroup.MEASURE, ChannelGroup.BATTERY, ChannelGroup.TEMP_OUTSIDE_EXT),
 
-    WIND(FeatureArea.WEATHER, "NAModule2", WEATHER_STATION, List.of(ChannelHelperCapability.class),
-            List.of(WindChannelHelper.class, BatteryChannelHelper.class, TimestampExtChannelHelper.class,
-                    SignalChannelHelper.class)),
+    WIND(FeatureArea.WEATHER, "NAModule2", WEATHER_STATION, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL,
+            ChannelGroup.TSTAMP_EXT, ChannelGroup.BATTERY, new ChannelGroup(WindChannelHelper.class, GROUP_WIND)),
 
     RAIN(FeatureArea.WEATHER, "NAModule3", WEATHER_STATION,
-            List.of(MeasureCapability.class, ChannelHelperCapability.class),
-            List.of(RainChannelHelper.class, BatteryChannelHelper.class, MeasuresChannelHelper.class,
-                    TimestampExtChannelHelper.class, SignalChannelHelper.class)),
+            Set.of(MeasureCapability.class, ChannelHelperCapability.class), ChannelGroup.SIGNAL,
+            ChannelGroup.TSTAMP_EXT, ChannelGroup.MEASURE, ChannelGroup.BATTERY,
+            new ChannelGroup(RainChannelHelper.class, MeasureClass.RAIN_QUANTITY, GROUP_RAIN)),
 
     INDOOR(FeatureArea.WEATHER, "NAModule4", WEATHER_STATION,
-            List.of(MeasureCapability.class, ChannelHelperCapability.class),
-            List.of(HumidityChannelHelper.class, TemperatureExtChannelHelper.class, AirQualityChannelHelper.class,
-                    BatteryChannelHelper.class, MeasuresChannelHelper.class, TimestampExtChannelHelper.class,
-                    SignalChannelHelper.class)),
+            Set.of(MeasureCapability.class, ChannelHelperCapability.class), ChannelGroup.SIGNAL,
+            ChannelGroup.TSTAMP_EXT, ChannelGroup.MEASURE, ChannelGroup.BATTERY, ChannelGroup.HUMIDITY,
+            ChannelGroup.TEMP_INSIDE_EXT, ChannelGroup.AIR_QUALITY),
 
     HOME_COACH(FeatureArea.AIR_CARE, "NHC", ACCOUNT,
-            List.of(DeviceCapability.class, AirCareCapability.class, MeasureCapability.class,
+            Set.of(DeviceCapability.class, AirCareCapability.class, MeasureCapability.class,
                     ChannelHelperCapability.class),
-            List.of(NoiseChannelHelper.class, HumidityChannelHelper.class, AirQualityExtChannelHelper.class,
-                    TemperatureChannelHelper.class, PressureChannelHelper.class, TimestampExtChannelHelper.class,
-                    SignalChannelHelper.class, MeasuresChannelHelper.class, LocationChannelHelper.class)),
+            ChannelGroup.LOCATION, ChannelGroup.SIGNAL, ChannelGroup.NOISE, ChannelGroup.HUMIDITY,
+            ChannelGroup.TEMP_INSIDE, ChannelGroup.MEASURE, ChannelGroup.TSTAMP_EXT,
+            new ChannelGroup(AirQualityChannelHelper.class, GROUP_TYPE_AIR_QUALITY_EXTENDED),
+            new ChannelGroup(PressureChannelHelper.class, MeasureClass.PRESSURE, GROUP_PRESSURE)),
 
-    PLUG(FeatureArea.ENERGY, "NAPlug", HOME, List.of(ChannelHelperCapability.class),
-            List.of(SignalChannelHelper.class)),
+    PLUG(FeatureArea.ENERGY, "NAPlug", HOME, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL),
 
-    VALVE(FeatureArea.ENERGY, "NRV", PLUG, List.of(ChannelHelperCapability.class),
-            List.of(BatteryExtChannelHelper.class, SignalChannelHelper.class)),
+    VALVE(FeatureArea.ENERGY, "NRV", PLUG, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL,
+            ChannelGroup.BATTERY_EXT),
 
-    THERMOSTAT(FeatureArea.ENERGY, "NATherm1", PLUG, List.of(ChannelHelperCapability.class),
-            List.of(Therm1ChannelHelper.class, BatteryExtChannelHelper.class, SignalChannelHelper.class)),
+    THERMOSTAT(FeatureArea.ENERGY, "NATherm1", PLUG, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL,
+            ChannelGroup.BATTERY_EXT, new ChannelGroup(Therm1ChannelHelper.class, GROUP_TYPE_TH_PROPERTIES)),
 
-    ROOM(FeatureArea.ENERGY, "NARoom", HOME, List.of(RoomCapability.class, ChannelHelperCapability.class),
-            List.of(RoomChannelHelper.class, SetpointChannelHelper.class));
+    ROOM(FeatureArea.ENERGY, "NARoom", HOME, Set.of(RoomCapability.class, ChannelHelperCapability.class),
+            new ChannelGroup(RoomChannelHelper.class, GROUP_TYPE_ROOM_PROPERTIES, GROUP_TYPE_ROOM_TEMPERATURE),
+            new ChannelGroup(SetpointChannelHelper.class, GROUP_SETPOINT));
 
     public static final EnumSet<ModuleType> AS_SET = EnumSet.allOf(ModuleType.class);
 
     private final @Nullable ModuleType bridgeType;
-    public final List<String> groupTypes = new LinkedList<>();
-    public final List<String> extensions = new LinkedList<>();
-    public final List<Class<? extends ChannelHelper>> channelHelpers;
-    public final List<Class<? extends Capability>> capabilities;
+    public final Set<ChannelGroup> channelGroups;
+    public final Set<Class<? extends Capability>> capabilities;
     public final ThingTypeUID thingTypeUID;
     public final FeatureArea feature;
     public final String apiName;
 
     ModuleType(FeatureArea feature, String apiName, @Nullable ModuleType bridge,
-            List<Class<? extends Capability>> capabilities, List<Class<? extends ChannelHelper>> helpers) {
-        this.channelHelpers = helpers;
+            Set<Class<? extends Capability>> capabilities, ChannelGroup... channelGroups) {
         this.bridgeType = bridge;
         this.feature = feature;
         this.capabilities = capabilities;
         this.apiName = apiName;
-        thingTypeUID = new ThingTypeUID(BINDING_ID, name().toLowerCase().replace("_", "-"));
-        try {
-            for (Class<? extends ChannelHelper> helperClass : helpers) {
-                ChannelHelper helper = helperClass.getConstructor().newInstance();
-                groupTypes.addAll(helper.getChannelGroupTypes());
-                extensions.addAll(helper.getExtensibleChannels());
-            }
-        } catch (RuntimeException | ReflectiveOperationException e) {
-            throw new IllegalArgumentException(e);
-        }
+        this.channelGroups = Set.of(channelGroups);
+        this.thingTypeUID = new ThingTypeUID(BINDING_ID, name().toLowerCase().replace("_", "-"));
     }
 
     public boolean isLogical() {
-        return !channelHelpers.contains(SignalChannelHelper.class);
+        return !channelGroups.contains(ChannelGroup.SIGNAL);
     }
 
     public boolean isABridge() {
@@ -192,11 +169,19 @@ public enum ModuleType {
         return false;
     }
 
+    public List<String> getExtensions() {
+        return channelGroups.stream().map(cg -> cg.extensions).flatMap(Set::stream).collect(Collectors.toList());
+    }
+
+    public Set<String> getGroupTypes() {
+        return channelGroups.stream().map(cg -> cg.groupTypes).flatMap(Set::stream).collect(Collectors.toSet());
+    }
+
     public int[] getSignalLevels() {
         if (!isLogical()) {
-            return (channelHelpers.contains(BatteryChannelHelper.class)
-                    || channelHelpers.contains(BatteryExtChannelHelper.class)) ? RADIO_SIGNAL_LEVELS
-                            : WIFI_SIGNAL_LEVELS;
+            return (channelGroups.contains(ChannelGroup.BATTERY) || channelGroups.contains(ChannelGroup.BATTERY_EXT))
+                    ? RADIO_SIGNAL_LEVELS
+                    : WIFI_SIGNAL_LEVELS;
         }
         throw new IllegalArgumentException(
                 "This should not be called for module type : " + name() + ", please file a bug report.");
index 7895d76bede5cd405715a385a81ee676e80cd98e..8257c0d0a47e85934d4dce229036d330626714ec 100644 (file)
@@ -15,10 +15,13 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toQuantityType;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
 import org.openhab.binding.netatmo.internal.api.dto.Dashboard;
+import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.types.State;
 
 /**
@@ -30,16 +33,18 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class AirQualityChannelHelper extends ChannelHelper {
 
-    public AirQualityChannelHelper() {
-        this(GROUP_AIR_QUALITY);
-    }
-
-    protected AirQualityChannelHelper(String groupName) {
-        super(groupName, MeasureClass.CO2);
+    public AirQualityChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
     protected @Nullable State internalGetDashboard(String channelId, Dashboard dashboard) {
-        return CHANNEL_CO2.equals(channelId) ? toQuantityType(dashboard.getCo2(), MeasureClass.CO2) : null;
+        switch (channelId) {
+            case CHANNEL_CO2:
+                return toQuantityType(dashboard.getCo2(), MeasureClass.CO2);
+            case CHANNEL_HEALTH_INDEX:
+                return new DecimalType(dashboard.getHealthIdx());
+        }
+        return null;
     }
 }
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/AirQualityExtChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/AirQualityExtChannelHelper.java
deleted file mode 100644 (file)
index 7cf618f..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Copyright (c) 2010-2022 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.netatmo.internal.handler.channelhelper;
-
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.netatmo.internal.api.dto.Dashboard;
-import org.openhab.core.library.types.DecimalType;
-import org.openhab.core.types.State;
-
-/**
- * The {@link AirQualityExtChannelHelper} handles specific channels of NHC thing.
- *
- * @author Gaël L'hopital - Initial contribution
- *
- */
-@NonNullByDefault
-public class AirQualityExtChannelHelper extends AirQualityChannelHelper {
-
-    public AirQualityExtChannelHelper() {
-        super(GROUP_TYPE_AIR_QUALITY_EXTENDED);
-    }
-
-    @Override
-    protected @Nullable State internalGetDashboard(String channelId, Dashboard dashboard) {
-        return CHANNEL_HEALTH_INDEX.equals(channelId) ? new DecimalType(dashboard.getHealthIdx())
-                : super.internalGetDashboard(channelId, dashboard);
-    }
-}
index beaf93ed90a9bfd02cfc1095465af8eb81c59203..2bebe07bd68cc78ef3e881468dd493d3c3fe62fd 100644 (file)
 package org.openhab.binding.netatmo.internal.handler.channelhelper;
 
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toStringType;
+
+import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.BatteryState;
 import org.openhab.binding.netatmo.internal.api.dto.HomeStatusModule;
 import org.openhab.binding.netatmo.internal.api.dto.Module;
 import org.openhab.binding.netatmo.internal.api.dto.NAThing;
@@ -33,22 +37,22 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class BatteryChannelHelper extends ChannelHelper {
 
-    public BatteryChannelHelper() {
-        super(GROUP_BATTERY);
-    }
-
-    protected BatteryChannelHelper(String groupName) {
-        super(groupName);
+    public BatteryChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
     protected @Nullable State internalGetProperty(String channelId, NAThing naThing, Configuration config) {
         int percent = -1;
+        BatteryState batteryState = BatteryState.UNKNOWN;
         if (naThing instanceof Module) {
             percent = ((Module) naThing).getBatteryPercent();
-        }
-        if (naThing instanceof HomeStatusModule) {
+            batteryState = ((Module) naThing).getBatteryState();
+        } else if (naThing instanceof HomeStatusModule) {
             percent = ((HomeStatusModule) naThing).getBatteryState().level;
+            batteryState = ((HomeStatusModule) naThing).getBatteryState();
+        } else {
+            return null;
         }
         switch (channelId) {
             case CHANNEL_VALUE:
@@ -59,6 +63,8 @@ public class BatteryChannelHelper extends ChannelHelper {
                 if (percent >= 0) {
                     return OnOffType.from(percent < 20);
                 }
+            case CHANNEL_BATTERY_STATUS:
+                return toStringType(batteryState);
         }
         return null;
     }
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/BatteryExtChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/BatteryExtChannelHelper.java
deleted file mode 100644 (file)
index 645601b..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Copyright (c) 2010-2022 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.netatmo.internal.handler.channelhelper;
-
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toStringType;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.netatmo.internal.api.dto.HomeStatusModule;
-import org.openhab.binding.netatmo.internal.api.dto.Module;
-import org.openhab.binding.netatmo.internal.api.dto.NAThing;
-import org.openhab.core.config.core.Configuration;
-import org.openhab.core.types.State;
-
-/**
- * The {@link BatteryExtChannelHelper} handles specific channels of modules using batteries
- * having battery status information available on top of standard information
- *
- * @author Gaël L'hopital - Initial contribution
- *
- */
-@NonNullByDefault
-public class BatteryExtChannelHelper extends BatteryChannelHelper {
-
-    public BatteryExtChannelHelper() {
-        super(GROUP_TYPE_BATTERY_EXTENDED);
-    }
-
-    @Override
-    protected @Nullable State internalGetProperty(String channelId, NAThing naThing, Configuration config) {
-        if (CHANNEL_BATTERY_STATUS.equals(channelId)) {
-            if (naThing instanceof Module) {
-                return toStringType(((Module) naThing).getBatteryState());
-            }
-            if (naThing instanceof HomeStatusModule) {
-                return toStringType(((HomeStatusModule) naThing).getBatteryState());
-            }
-        }
-        return super.internalGetProperty(channelId, naThing, config);
-    }
-}
index 9b63f121853012cb96eaa410c7dff77fbfb93908..849a74635dc9bf697807f8ca959744f9ef02da6b 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.dto.HomeStatusModule;
@@ -38,11 +40,7 @@ public class CameraChannelHelper extends ChannelHelper {
     private @Nullable String vpnUrl;
     private @Nullable String localUrl;
 
-    public CameraChannelHelper() {
-        this(GROUP_CAM_STATUS, GROUP_CAM_LIVE);
-    }
-
-    protected CameraChannelHelper(String... providedGroups) {
+    public CameraChannelHelper(Set<String> providedGroups) {
         super(providedGroups);
     }
 
index 246380bebb66304c825854e8a337b613267504d9..591106e760f31b37b07fce7fee82b0e899c8d84e 100644 (file)
  */
 package org.openhab.binding.netatmo.internal.handler.channelhelper;
 
-import java.util.HashSet;
 import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
 import org.openhab.binding.netatmo.internal.api.dto.Dashboard;
 import org.openhab.binding.netatmo.internal.api.dto.Event;
 import org.openhab.binding.netatmo.internal.api.dto.HomeEvent;
 import org.openhab.binding.netatmo.internal.api.dto.NAObject;
 import org.openhab.binding.netatmo.internal.api.dto.NAThing;
-import org.openhab.binding.netatmo.internal.providers.NetatmoThingTypeProvider;
 import org.openhab.core.config.core.Configuration;
 import org.openhab.core.types.State;
 
@@ -35,19 +32,12 @@ import org.openhab.core.types.State;
  */
 @NonNullByDefault
 public abstract class ChannelHelper {
-    private @Nullable NAObject data;
-    private final Set<String> channelGroupTypes;
-    private final Set<String> channelGroups = new HashSet<>();
-    private Set<String> extensibleChannels = Set.of();
+    private final Set<String> channelGroups;
 
-    ChannelHelper(String... providedGroups) {
-        this.channelGroupTypes = Set.of(providedGroups);
-        channelGroupTypes.forEach(groupType -> channelGroups.add(NetatmoThingTypeProvider.toGroupName(groupType)));
-    }
+    private @Nullable NAObject data;
 
-    ChannelHelper(String providedGroup, MeasureClass measureClass) {
-        this(providedGroup);
-        this.extensibleChannels = measureClass.channels.keySet();
+    public ChannelHelper(Set<String> providedGroups) {
+        channelGroups = providedGroups;
     }
 
     public void setNewData(@Nullable NAObject data) {
@@ -118,12 +108,4 @@ public abstract class ChannelHelper {
     protected @Nullable State internalGetHomeEvent(String channelId, @Nullable String groupId, HomeEvent event) {
         return null;
     }
-
-    public Set<String> getChannelGroupTypes() {
-        return channelGroupTypes;
-    }
-
-    public Set<String> getExtensibleChannels() {
-        return extensibleChannels;
-    }
 }
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/DoorbellChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/DoorbellChannelHelper.java
deleted file mode 100644 (file)
index 9dee8b9..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Copyright (c) 2010-2022 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.netatmo.internal.handler.channelhelper;
-
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-
-/**
- * The {@link DoorbellChannelHelper} handles specific channels of doorbells
- *
- * @author Gaël L'hopital - Initial contribution
- *
- */
-@NonNullByDefault
-public class DoorbellChannelHelper extends CameraChannelHelper {
-
-    public DoorbellChannelHelper() {
-        super(GROUP_DOORBELL_STATUS, GROUP_DOORBELL_LIVE);
-    }
-}
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/EnergyChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/EnergyChannelHelper.java
new file mode 100644 (file)
index 0000000..145d864
--- /dev/null
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2010-2022 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.netatmo.internal.handler.channelhelper;
+
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
+
+import java.time.DayOfWeek;
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.SetpointMode;
+import org.openhab.binding.netatmo.internal.api.dto.HomeData;
+import org.openhab.binding.netatmo.internal.api.dto.NAThing;
+import org.openhab.binding.netatmo.internal.api.dto.ThermProgram;
+import org.openhab.binding.netatmo.internal.api.dto.TimeTableItem;
+import org.openhab.binding.netatmo.internal.api.dto.Zone;
+import org.openhab.core.config.core.Configuration;
+import org.openhab.core.library.types.StringType;
+import org.openhab.core.library.unit.Units;
+import org.openhab.core.types.State;
+import org.openhab.core.types.UnDefType;
+
+/**
+ * The {@link EnergyChannelHelper} handles specific channels of thermostat settings at home level.
+ *
+ * @author Gaël L'hopital - Initial contribution
+ *
+ */
+@NonNullByDefault
+public class EnergyChannelHelper extends ChannelHelper {
+
+    public EnergyChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
+    }
+
+    @Override
+    protected @Nullable State internalGetProperty(String channelId, NAThing data, Configuration config) {
+        if (data instanceof HomeData) {
+            HomeData homeData = (HomeData) data;
+            SetpointMode thermMode = homeData.getThermMode();
+            ThermProgram currentProgram = homeData.getActiveProgram();
+            switch (channelId) {
+                case CHANNEL_SETPOINT_DURATION:
+                    return toQuantityType(homeData.getThermSetpointDefaultDuration(), Units.MINUTE);
+                case CHANNEL_PLANNING:
+                    return (currentProgram != null ? toStringType(currentProgram.getName()) : null);
+                case CHANNEL_SETPOINT_END_TIME:
+                    switch (thermMode) {
+                        case PROGRAM:
+                        case HOME:
+                        case SCHEDULE:
+                            return currentProgram != null ? toDateTimeType(nextProgramTime(currentProgram))
+                                    : UnDefType.UNDEF;
+                        default:
+                            return UnDefType.UNDEF;
+                    }
+                case CHANNEL_SETPOINT_MODE:
+                    switch (thermMode) {
+                        case OFF:
+                        case MAX:
+                        case UNKNOWN:
+                            return UnDefType.UNDEF;
+                        case PROGRAM:
+                        case HOME:
+                        case SCHEDULE:
+                            if (currentProgram != null) {
+                                TimeTableItem currentProgramMode = currentProgramMode(currentProgram);
+                                if (currentProgramMode != null) {
+                                    Zone zone = currentProgram.getZone(String.valueOf(currentProgramMode.getZoneId()));
+                                    if (zone != null) {
+                                        return new StringType(zone.getName());
+                                    }
+                                }
+                            }
+                            return UnDefType.NULL;
+                        default:
+                            return toStringType(thermMode);
+                    }
+            }
+        }
+        return null;
+    }
+
+    private static ZonedDateTime programBaseTimeZdt() {
+        return ZonedDateTime.now().with(DayOfWeek.MONDAY).truncatedTo(ChronoUnit.DAYS);
+    }
+
+    private static long minutesSinceProgramBaseTime() {
+        return ChronoUnit.MINUTES.between(programBaseTimeZdt(), ZonedDateTime.now());
+    }
+
+    private static @Nullable TimeTableItem currentProgramMode(ThermProgram activeProgram) {
+        long diff = minutesSinceProgramBaseTime();
+        return activeProgram.getTimetable().stream().filter(t -> t.getMinuteOffset() < diff)
+                .reduce((first, second) -> second).orElse(null);
+    }
+
+    private static ZonedDateTime nextProgramTime(ThermProgram activeProgram) {
+        long diff = minutesSinceProgramBaseTime();
+        // By default we'll use the first slot of next week - this case will be true if
+        // we are in the last schedule of the week so below loop will not exit by break
+        List<TimeTableItem> timetable = activeProgram.getTimetable();
+        int next = timetable.get(0).getMinuteOffset() + (7 * 24 * 60);
+        for (TimeTableItem timeTable : timetable) {
+            if (timeTable.getMinuteOffset() > diff) {
+                next = timeTable.getMinuteOffset();
+                break;
+            }
+        }
+        return programBaseTimeZdt().plusMinutes(next);
+    }
+}
index e8b8fdc6ff8d9a4e2a820c850fdd464834907d5d..ccdc80961d1433eda065d21bf6883c78f73942ad 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.ModuleType;
@@ -38,11 +40,7 @@ public class EventChannelHelper extends ChannelHelper {
     private @Nullable String vpnUrl, localUrl;
     protected ModuleType moduleType = ModuleType.UNKNOWN;
 
-    public EventChannelHelper() {
-        this(GROUP_LAST_EVENT);
-    }
-
-    protected EventChannelHelper(String... providedGroups) {
+    public EventChannelHelper(Set<String> providedGroups) {
         super(providedGroups);
     }
 
index f024fc78cdf069b977458bf8fbc7c0f6060f5c7f..69639b822d9cef20b2fb421e36e7933d4b7d21a7 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.dto.HomeEvent;
@@ -30,8 +32,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class EventDoorbellChannelHelper extends EventChannelHelper {
 
-    public EventDoorbellChannelHelper() {
-        super(GROUP_DOORBELL_LAST_EVENT, GROUP_DOORBELL_SUB_EVENT);
+    public EventDoorbellChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index bc46b3dae8f319abb136634b4b68a1eb72464209..947576535f4586091c683b329b28e187bd5c5a87 100644 (file)
@@ -12,7 +12,7 @@
  */
 package org.openhab.binding.netatmo.internal.handler.channelhelper;
 
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.CHANNEL_PERSON_AT_HOME;
 
 import java.util.Set;
 
@@ -32,8 +32,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class EventPersonChannelHelper extends EventChannelHelper {
 
-    public EventPersonChannelHelper() {
-        super(GROUP_PERSON_LAST_EVENT);
+    public EventPersonChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HomeEnergyChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HomeEnergyChannelHelper.java
deleted file mode 100644 (file)
index f594c1e..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * Copyright (c) 2010-2022 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.netatmo.internal.handler.channelhelper;
-
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
-
-import java.time.DayOfWeek;
-import java.time.ZonedDateTime;
-import java.time.temporal.ChronoUnit;
-import java.util.List;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.SetpointMode;
-import org.openhab.binding.netatmo.internal.api.dto.HomeData;
-import org.openhab.binding.netatmo.internal.api.dto.NAThing;
-import org.openhab.binding.netatmo.internal.api.dto.ThermProgram;
-import org.openhab.binding.netatmo.internal.api.dto.TimeTableItem;
-import org.openhab.binding.netatmo.internal.api.dto.Zone;
-import org.openhab.core.config.core.Configuration;
-import org.openhab.core.library.types.StringType;
-import org.openhab.core.library.unit.Units;
-import org.openhab.core.types.State;
-import org.openhab.core.types.UnDefType;
-
-/**
- * The {@link HomeEnergyChannelHelper} handles specific channels of thermostat settings at home level.
- *
- * @author Gaël L'hopital - Initial contribution
- *
- */
-@NonNullByDefault
-public class HomeEnergyChannelHelper extends ChannelHelper {
-
-    public HomeEnergyChannelHelper() {
-        super(GROUP_ENERGY);
-    }
-
-    @Override
-    protected @Nullable State internalGetProperty(String channelId, NAThing data, Configuration config) {
-        if (data instanceof HomeData) {
-            HomeData homeData = (HomeData) data;
-            SetpointMode thermMode = homeData.getThermMode();
-            ThermProgram currentProgram = homeData.getActiveProgram();
-            switch (channelId) {
-                case CHANNEL_SETPOINT_DURATION:
-                    return toQuantityType(homeData.getThermSetpointDefaultDuration(), Units.MINUTE);
-                case CHANNEL_PLANNING:
-                    return (currentProgram != null ? toStringType(currentProgram.getName()) : null);
-                case CHANNEL_SETPOINT_END_TIME:
-                    switch (thermMode) {
-                        case PROGRAM:
-                        case HOME:
-                        case SCHEDULE:
-                            return currentProgram != null ? toDateTimeType(nextProgramTime(currentProgram))
-                                    : UnDefType.UNDEF;
-                        default:
-                            return UnDefType.UNDEF;
-                    }
-                case CHANNEL_SETPOINT_MODE:
-                    switch (thermMode) {
-                        case OFF:
-                        case MAX:
-                        case UNKNOWN:
-                            return UnDefType.UNDEF;
-                        case PROGRAM:
-                        case HOME:
-                        case SCHEDULE:
-                            if (currentProgram != null) {
-                                TimeTableItem currentProgramMode = currentProgramMode(currentProgram);
-                                if (currentProgramMode != null) {
-                                    Zone zone = currentProgram.getZone(String.valueOf(currentProgramMode.getZoneId()));
-                                    if (zone != null) {
-                                        return new StringType(zone.getName());
-                                    }
-                                }
-                            }
-                            return UnDefType.NULL;
-                        default:
-                            return toStringType(thermMode);
-                    }
-            }
-        }
-        return null;
-    }
-
-    private static ZonedDateTime programBaseTimeZdt() {
-        return ZonedDateTime.now().with(DayOfWeek.MONDAY).truncatedTo(ChronoUnit.DAYS);
-    }
-
-    private static long minutesSinceProgramBaseTime() {
-        return ChronoUnit.MINUTES.between(programBaseTimeZdt(), ZonedDateTime.now());
-    }
-
-    private static @Nullable TimeTableItem currentProgramMode(ThermProgram activeProgram) {
-        long diff = minutesSinceProgramBaseTime();
-        return activeProgram.getTimetable().stream().filter(t -> t.getMinuteOffset() < diff)
-                .reduce((first, second) -> second).orElse(null);
-    }
-
-    private static ZonedDateTime nextProgramTime(ThermProgram activeProgram) {
-        long diff = minutesSinceProgramBaseTime();
-        // By default we'll use the first slot of next week - this case will be true if
-        // we are in the last schedule of the week so below loop will not exit by break
-        List<TimeTableItem> timetable = activeProgram.getTimetable();
-        int next = timetable.get(0).getMinuteOffset() + (7 * 24 * 60);
-        for (TimeTableItem timeTable : timetable) {
-            if (timeTable.getMinuteOffset() > diff) {
-                next = timeTable.getMinuteOffset();
-                break;
-            }
-        }
-        return programBaseTimeZdt().plusMinutes(next);
-    }
-}
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HomeSecurityChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/HomeSecurityChannelHelper.java
deleted file mode 100644 (file)
index 81140ce..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * Copyright (c) 2010-2022 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.netatmo.internal.handler.channelhelper;
-
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toRawType;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.netatmo.internal.api.dto.HomeData;
-import org.openhab.binding.netatmo.internal.api.dto.HomeStatusPerson;
-import org.openhab.binding.netatmo.internal.api.dto.NAHomeStatus.HomeStatus;
-import org.openhab.binding.netatmo.internal.api.dto.NAObject;
-import org.openhab.binding.netatmo.internal.deserialization.NAObjectMap;
-import org.openhab.core.library.types.DecimalType;
-import org.openhab.core.types.State;
-import org.openhab.core.types.UnDefType;
-
-/**
- * The {@link HomeSecurityChannelHelper} handles specific information for security purpose.
- *
- * @author Gaël L'hopital - Initial contribution
- *
- */
-@NonNullByDefault
-public class HomeSecurityChannelHelper extends ChannelHelper {
-    private long persons = -1;
-    private long unknowns = -1;
-    private @Nullable String unknownSnapshot;
-    private List<String> knownIds = List.of();
-
-    public HomeSecurityChannelHelper() {
-        super(GROUP_SECURITY);
-    }
-
-    @Override
-    public void setNewData(@Nullable NAObject data) {
-        super.setNewData(data);
-        if (data instanceof HomeData) {
-            HomeData homeData = (HomeData) data;
-            knownIds = homeData.getPersons().values().stream().filter(person -> person.isKnown()).map(p -> p.getId())
-                    .collect(Collectors.toList());
-        }
-        if (data instanceof HomeStatus) {
-            HomeStatus status = (HomeStatus) data;
-            NAObjectMap<HomeStatusPerson> allPersons = status.getPersons();
-            List<HomeStatusPerson> present = allPersons.values().stream().filter(p -> !p.isOutOfSight())
-                    .collect(Collectors.toList());
-
-            persons = present.size();
-            unknowns = present.stream().filter(person -> !knownIds.contains(person.getId())).count();
-        }
-    }
-
-    @Override
-    protected @Nullable State internalGetOther(String channelId) {
-        switch (channelId) {
-            case CHANNEL_PERSON_COUNT:
-                return persons != -1 ? new DecimalType(persons) : UnDefType.NULL;
-            case CHANNEL_UNKNOWN_PERSON_COUNT:
-                return unknowns != -1 ? new DecimalType(unknowns) : UnDefType.NULL;
-            case CHANNEL_UNKNOWN_PERSON_PICTURE:
-                return unknownSnapshot != null ? toRawType(unknownSnapshot) : UnDefType.NULL;
-        }
-        return null;
-    }
-}
index 09ba0f7f7c0d83e5982e3459d2153a1e45d9c736..477c2daf4bb4d4d377f4eeb0e56d06d1bee872e7 100644 (file)
@@ -16,6 +16,8 @@ import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toQuantityType;
 import static org.openhab.binding.netatmo.internal.utils.WeatherUtils.*;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
@@ -32,8 +34,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class HumidityChannelHelper extends ChannelHelper {
 
-    public HumidityChannelHelper() {
-        super(GROUP_HUMIDITY, MeasureClass.HUMIDITY);
+    public HumidityChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index 1ece7b4cbb8eb37525c3f4f1aa0e4baba767f6af..b6687c34c7eea14fa373907979e024fff409312a 100644 (file)
@@ -12,7 +12,9 @@
  */
 package org.openhab.binding.netatmo.internal.handler.channelhelper;
 
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.CHANNEL_VALUE;
+
+import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -32,8 +34,8 @@ import org.openhab.core.types.UnDefType;
 @NonNullByDefault
 public class LocationChannelHelper extends ChannelHelper {
 
-    public LocationChannelHelper() {
-        super(GROUP_LOCATION);
+    public LocationChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index f04ca9856c4ffe73db6b489cf92365399615fb88..4aee0ab15f5b5779840bda6935ec7493bcfb7216 100644 (file)
@@ -13,6 +13,7 @@
 package org.openhab.binding.netatmo.internal.handler.channelhelper;
 
 import java.util.Map;
+import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -29,6 +30,10 @@ import org.openhab.core.types.State;
 public class MeasuresChannelHelper extends ChannelHelper {
     private @Nullable Map<String, State> measures;
 
+    public MeasuresChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
+    }
+
     public void setMeasures(Map<String, State> measures) {
         this.measures = measures;
     }
index d0d4a60563327c46200aa6e822062ed891edc8ce..ce16d46a1217c17eb523ccac587d52a3b9fe0752 100644 (file)
  */
 package org.openhab.binding.netatmo.internal.handler.channelhelper;
 
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.CHANNEL_VALUE;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toQuantityType;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
@@ -30,8 +32,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class NoiseChannelHelper extends ChannelHelper {
 
-    public NoiseChannelHelper() {
-        super(GROUP_NOISE, MeasureClass.NOISE);
+    public NoiseChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index c730f290c21e31c92ef18e54aa85c57c6e841ad0..7a535d0c2c0e3565edbd3b5e121d230a24b013d8 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.dto.HomeDataPerson;
@@ -33,8 +35,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class PersonChannelHelper extends ChannelHelper {
 
-    public PersonChannelHelper() {
-        super(GROUP_PERSON);
+    public PersonChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index 13ddd1c53ea12f0337dc2497c785ac806327e26b..0a13d5646c0ad9920d9b8085c7d9406dd4e14b47 100644 (file)
  */
 package org.openhab.binding.netatmo.internal.handler.channelhelper;
 
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.CHANNEL_FLOODLIGHT;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toStringType;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.dto.HomeStatusModule;
@@ -31,8 +33,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class PresenceChannelHelper extends CameraChannelHelper {
 
-    public PresenceChannelHelper() {
-        super(GROUP_CAM_STATUS, GROUP_CAM_LIVE, GROUP_PRESENCE);
+    public PresenceChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index a2432f01584d4a74cd02cbc93552fe3c7bab010e..cef8de7d1c537507871291cf371cab917396af24 100644 (file)
@@ -13,7 +13,9 @@
 package org.openhab.binding.netatmo.internal.handler.channelhelper;
 
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toQuantityType;
+import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
+
+import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -30,12 +32,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class PressureChannelHelper extends ChannelHelper {
 
-    public PressureChannelHelper() {
-        this(GROUP_PRESSURE);
-    }
-
-    protected PressureChannelHelper(String groupName) {
-        super(groupName, MeasureClass.PRESSURE);
+    public PressureChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
@@ -45,6 +43,8 @@ public class PressureChannelHelper extends ChannelHelper {
                 return toQuantityType(dashboard.getPressure(), MeasureClass.PRESSURE);
             case CHANNEL_ABSOLUTE_PRESSURE:
                 return toQuantityType(dashboard.getAbsolutePressure(), MeasureClass.PRESSURE);
+            case CHANNEL_TREND:
+                return toStringType(dashboard.getPressureTrend());
         }
         return null;
     }
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/PressureExtChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/PressureExtChannelHelper.java
deleted file mode 100644 (file)
index 3df7bd9..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Copyright (c) 2010-2022 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.netatmo.internal.handler.channelhelper;
-
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toStringType;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.netatmo.internal.api.dto.Dashboard;
-import org.openhab.core.types.State;
-
-/**
- * The {@link PressureExtChannelHelper} handles specific behavior of modules measuring pressure
- * with pressure trend capability
- *
- * @author Gaël L'hopital - Initial contribution
- *
- */
-@NonNullByDefault
-public class PressureExtChannelHelper extends PressureChannelHelper {
-
-    public PressureExtChannelHelper() {
-        super(GROUP_TYPE_PRESSURE_EXTENDED);
-    }
-
-    @Override
-    protected @Nullable State internalGetDashboard(String channelId, Dashboard dashboard) {
-        return channelId.equals(CHANNEL_TREND) ? toStringType(dashboard.getPressureTrend())
-                : super.internalGetDashboard(channelId, dashboard);
-    }
-}
index 08521bf65c005ec0fb2ebd155d4aee82457e5003..2a6d0308a966646f3701c66807536eb33e79ef58 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toQuantityType;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
@@ -30,8 +32,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class RainChannelHelper extends ChannelHelper {
 
-    public RainChannelHelper() {
-        super(GROUP_RAIN, MeasureClass.RAIN_QUANTITY);
+    public RainChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index 33bb81cba65273cb6e07daca0ff946fe39a52ed3..9d786993651857b66a23c6c8313abb3421908870 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toQuantityType;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
@@ -32,8 +34,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class RoomChannelHelper extends ChannelHelper {
 
-    public RoomChannelHelper() {
-        super(GROUP_TYPE_ROOM_TEMPERATURE, GROUP_TYPE_ROOM_PROPERTIES);
+    public RoomChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/SecurityChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/SecurityChannelHelper.java
new file mode 100644 (file)
index 0000000..51f5f8d
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2010-2022 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.netatmo.internal.handler.channelhelper;
+
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toRawType;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.netatmo.internal.api.dto.HomeData;
+import org.openhab.binding.netatmo.internal.api.dto.HomeStatusPerson;
+import org.openhab.binding.netatmo.internal.api.dto.NAHomeStatus.HomeStatus;
+import org.openhab.binding.netatmo.internal.api.dto.NAObject;
+import org.openhab.binding.netatmo.internal.deserialization.NAObjectMap;
+import org.openhab.core.library.types.DecimalType;
+import org.openhab.core.types.State;
+import org.openhab.core.types.UnDefType;
+
+/**
+ * The {@link SecurityChannelHelper} handles specific information for security purpose.
+ *
+ * @author Gaël L'hopital - Initial contribution
+ *
+ */
+@NonNullByDefault
+public class SecurityChannelHelper extends ChannelHelper {
+    private long persons = -1;
+    private long unknowns = -1;
+    private @Nullable String unknownSnapshot;
+    private List<String> knownIds = List.of();
+
+    public SecurityChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
+    }
+
+    @Override
+    public void setNewData(@Nullable NAObject data) {
+        super.setNewData(data);
+        if (data instanceof HomeData) {
+            HomeData homeData = (HomeData) data;
+            knownIds = homeData.getPersons().values().stream().filter(person -> person.isKnown()).map(p -> p.getId())
+                    .collect(Collectors.toList());
+        }
+        if (data instanceof HomeStatus) {
+            HomeStatus status = (HomeStatus) data;
+            NAObjectMap<HomeStatusPerson> allPersons = status.getPersons();
+            List<HomeStatusPerson> present = allPersons.values().stream().filter(p -> !p.isOutOfSight())
+                    .collect(Collectors.toList());
+
+            persons = present.size();
+            unknowns = present.stream().filter(person -> !knownIds.contains(person.getId())).count();
+        }
+    }
+
+    @Override
+    protected @Nullable State internalGetOther(String channelId) {
+        switch (channelId) {
+            case CHANNEL_PERSON_COUNT:
+                return persons != -1 ? new DecimalType(persons) : UnDefType.NULL;
+            case CHANNEL_UNKNOWN_PERSON_COUNT:
+                return unknowns != -1 ? new DecimalType(unknowns) : UnDefType.NULL;
+            case CHANNEL_UNKNOWN_PERSON_PICTURE:
+                return unknownSnapshot != null ? toRawType(unknownSnapshot) : UnDefType.NULL;
+        }
+        return null;
+    }
+}
index 81b901cd693d33843be4e9870b143fa2d9927b91..70cc0a970a387a0e6c839eee68092deaa406f791 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
@@ -32,8 +34,8 @@ import org.openhab.core.types.UnDefType;
 @NonNullByDefault
 public class SetpointChannelHelper extends ChannelHelper {
 
-    public SetpointChannelHelper() {
-        super(GROUP_SETPOINT);
+    public SetpointChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index 13715ac1a92116ee4f8d60745a25e731ed6d09c6..a3d65f9ad7f8c055d384e1fa657210c39f02061e 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toQuantityType;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.dto.NAThing;
@@ -32,8 +34,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class SignalChannelHelper extends ChannelHelper {
 
-    public SignalChannelHelper() {
-        super(GROUP_SIGNAL);
+    public SignalChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index 96ccdc7ca99394785c252a3345aac21ee7b533d6..ba97c192e87fb88aaa1b8af44966162c866e188f 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toStringType;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.dto.HomeStatusModule;
@@ -32,8 +34,8 @@ import org.openhab.core.types.UnDefType;
 @NonNullByDefault
 public class SirenChannelHelper extends ChannelHelper {
 
-    public SirenChannelHelper() {
-        super(GROUP_SIREN);
+    public SirenChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index bef052b6cb2683030cd3f21ca704bd1785ac08b5..913b5ad13cd0da23e7a7d38b383f7c1ea6ba4636 100644 (file)
@@ -16,6 +16,8 @@ import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
 import static org.openhab.binding.netatmo.internal.utils.WeatherUtils.*;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
@@ -30,17 +32,9 @@ import org.openhab.core.types.State;
  */
 @NonNullByDefault
 public class TemperatureChannelHelper extends ChannelHelper {
-    /*
-     * TemperatureChannelHelper may be used by indoor or outdoor modules. There is no easy way here to decide what is
-     * the handler owning the channelHelper. The usage of OUTSIDE_TEMPERATURE instead of INSIDE_TEMPERATURE is by design
-     * because OUTSIDE_TEMPERATURE has wide value range than INSIDE_TEMPERATURE.
-     */
-    public TemperatureChannelHelper() {
-        this(GROUP_TEMPERATURE, MeasureClass.OUTSIDE_TEMPERATURE);
-    }
 
-    protected TemperatureChannelHelper(String groupName, MeasureClass measureClass) {
-        super(groupName, measureClass);
+    public TemperatureChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
@@ -66,6 +60,8 @@ public class TemperatureChannelHelper extends ChannelHelper {
                 double dewPoint = dewPoint(dashboard.getTemperature(), dashboard.getHumidity());
                 return toQuantityType(dewPointDep(dashboard.getTemperature(), dewPoint),
                         MeasureClass.OUTSIDE_TEMPERATURE);
+            case CHANNEL_TREND:
+                return toStringType(dashboard.getTempTrend());
         }
         return null;
     }
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TemperatureExtChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TemperatureExtChannelHelper.java
deleted file mode 100644 (file)
index b97a154..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Copyright (c) 2010-2022 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.netatmo.internal.handler.channelhelper;
-
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toStringType;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
-import org.openhab.binding.netatmo.internal.api.dto.Dashboard;
-import org.openhab.core.types.State;
-
-/**
- * The {@link TemperatureExtChannelHelper} handles specific channels of modules measuring temperature
- * with temp trend capability
- *
- * @author Gaël L'hopital - Initial contribution
- *
- */
-@NonNullByDefault
-public class TemperatureExtChannelHelper extends TemperatureChannelHelper {
-    public TemperatureExtChannelHelper() {
-        super(GROUP_TYPE_TEMPERATURE_EXTENDED, MeasureClass.INSIDE_TEMPERATURE);
-    }
-
-    @Override
-    protected @Nullable State internalGetDashboard(String channelId, Dashboard dashboard) {
-        return CHANNEL_TREND.equals(channelId) ? toStringType(dashboard.getTempTrend())
-                : super.internalGetDashboard(channelId, dashboard);
-    }
-}
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TemperatureOutChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TemperatureOutChannelHelper.java
deleted file mode 100644 (file)
index af00c75..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Copyright (c) 2010-2022 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.netatmo.internal.handler.channelhelper;
-
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toStringType;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
-import org.openhab.binding.netatmo.internal.api.dto.Dashboard;
-import org.openhab.core.types.State;
-
-/**
- * The {@link TemperatureOutChannelHelper} handles specific channels of modules measuring temperature
- * with temp trend capability
- *
- * @author Gaël L'hopital - Initial contribution
- *
- */
-@NonNullByDefault
-public class TemperatureOutChannelHelper extends TemperatureChannelHelper {
-    public TemperatureOutChannelHelper() {
-        super(GROUP_TYPE_TEMPERATURE_OUTSIDE, MeasureClass.OUTSIDE_TEMPERATURE);
-    }
-
-    @Override
-    protected @Nullable State internalGetDashboard(String channelId, Dashboard dashboard) {
-        return CHANNEL_TREND.equals(channelId) ? toStringType(dashboard.getTempTrend())
-                : super.internalGetDashboard(channelId, dashboard);
-    }
-}
index c78806abf5f6172d8a7480b071b7deae0a74f509..0a7d3d7c089d01bd9bc1cfb3c7224de9f71c566d 100644 (file)
@@ -12,7 +12,9 @@
  */
 package org.openhab.binding.netatmo.internal.handler.channelhelper;
 
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.CHANNEL_THERM_RELAY;
+
+import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -30,8 +32,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class Therm1ChannelHelper extends ChannelHelper {
 
-    public Therm1ChannelHelper() {
-        super(GROUP_TYPE_TH_PROPERTIES);
+    public Therm1ChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index 8c8dbba725578f887b91bcf7c08c3fc523d9d54c..e602fa30341b8ed43046fb8bbf9d668df622d973 100644 (file)
@@ -17,9 +17,11 @@ import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toDate
 
 import java.time.ZonedDateTime;
 import java.util.Optional;
+import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.netatmo.internal.api.dto.Dashboard;
 import org.openhab.binding.netatmo.internal.api.dto.NAThing;
 import org.openhab.core.config.core.Configuration;
 import org.openhab.core.types.State;
@@ -34,12 +36,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class TimestampChannelHelper extends ChannelHelper {
 
-    public TimestampChannelHelper() {
-        this(GROUP_TIMESTAMP);
-    }
-
-    protected TimestampChannelHelper(String groupName) {
-        super(groupName);
+    public TimestampChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
@@ -47,4 +45,9 @@ public class TimestampChannelHelper extends ChannelHelper {
         Optional<ZonedDateTime> lastSeen = naThing.getLastSeen();
         return CHANNEL_LAST_SEEN.equals(channelId) && lastSeen.isPresent() ? toDateTimeType(lastSeen) : null;
     }
+
+    @Override
+    protected @Nullable State internalGetDashboard(String channelId, Dashboard dashboard) {
+        return CHANNEL_MEASURES_TIMESTAMP.equals(channelId) ? toDateTimeType(dashboard.getTimeUtc()) : null;
+    }
 }
diff --git a/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TimestampExtChannelHelper.java b/bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/channelhelper/TimestampExtChannelHelper.java
deleted file mode 100644 (file)
index e3e614e..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Copyright (c) 2010-2022 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.netatmo.internal.handler.channelhelper;
-
-import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
-import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.toDateTimeType;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.netatmo.internal.api.dto.Dashboard;
-import org.openhab.core.types.State;
-
-/**
- * The {@link TimestampExtChannelHelper} handles specific behavior
- * of modules reporting measurement timestamp in dashboard
- *
- * @author Gaël L'hopital - Initial contribution
- *
- */
-@NonNullByDefault
-public class TimestampExtChannelHelper extends TimestampChannelHelper {
-
-    public TimestampExtChannelHelper() {
-        super(GROUP_TYPE_TIMESTAMP_EXTENDED);
-    }
-
-    @Override
-    protected @Nullable State internalGetDashboard(String channelId, Dashboard dashboard) {
-        return CHANNEL_MEASURES_TIMESTAMP.equals(channelId) ? toDateTimeType(dashboard.getTimeUtc()) : null;
-    }
-}
index 8ab2b7bbda4301a2023df6eae3017e944ec3c371..3476519bd4bd4b6e9f24c465d372f60ee227f317 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.netatmo.internal.handler.channelhelper;
 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
 import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
 
+import java.util.Set;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
@@ -30,8 +32,8 @@ import org.openhab.core.types.State;
 @NonNullByDefault
 public class WindChannelHelper extends ChannelHelper {
 
-    public WindChannelHelper() {
-        super(GROUP_WIND);
+    public WindChannelHelper(Set<String> providedGroups) {
+        super(providedGroups);
     }
 
     @Override
index c94ef91802e2dfc996c708f856b1ede68c364da7..263b616b40897c241fddc22bda09398247d00bce 100644 (file)
@@ -75,7 +75,7 @@ public class NetatmoThingTypeProvider implements ThingTypeProvider {
 
                 ThingTypeBuilder thingTypeBuilder = ThingTypeBuilder.instance(thingTypeUID, thingTypeUID.toString())
                         .withRepresentationProperty(NAThingConfiguration.ID)
-                        .withExtensibleChannelTypeIds(moduleType.extensions)
+                        .withExtensibleChannelTypeIds(moduleType.getExtensions())
                         .withChannelGroupDefinitions(getGroupDefinitions(moduleType))
                         .withConfigDescriptionURI(moduleType.getConfigDescription());
 
@@ -94,8 +94,8 @@ public class NetatmoThingTypeProvider implements ThingTypeProvider {
     }
 
     private List<ChannelGroupDefinition> getGroupDefinitions(ModuleType thingType) {
-        return thingType.groupTypes.stream().map(groupTypeName -> new ChannelGroupDefinition(toGroupName(groupTypeName),
-                new ChannelGroupTypeUID(BINDING_ID, groupTypeName))).collect(Collectors.toList());
+        return thingType.getGroupTypes().stream().map(groupType -> new ChannelGroupDefinition(toGroupName(groupType),
+                new ChannelGroupTypeUID(BINDING_ID, groupType))).collect(Collectors.toList());
     }
 
     public static String toGroupName(String groupeTypeName) {