]> git.basschouten.com Git - openhab-addons.git/blob
2314d1092c1d3eab0f9629d3c1b497528eb1b904
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.netatmo.internal.api.data;
14
15 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
16 import static org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.*;
17
18 import java.net.URI;
19 import java.util.EnumSet;
20 import java.util.List;
21 import java.util.Set;
22 import java.util.stream.Collectors;
23
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.eclipse.jdt.annotation.Nullable;
26 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.FeatureArea;
27 import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
28 import org.openhab.binding.netatmo.internal.handler.capability.AirCareCapability;
29 import org.openhab.binding.netatmo.internal.handler.capability.CameraCapability;
30 import org.openhab.binding.netatmo.internal.handler.capability.Capability;
31 import org.openhab.binding.netatmo.internal.handler.capability.ChannelHelperCapability;
32 import org.openhab.binding.netatmo.internal.handler.capability.DeviceCapability;
33 import org.openhab.binding.netatmo.internal.handler.capability.DoorbellCapability;
34 import org.openhab.binding.netatmo.internal.handler.capability.HomeCapability;
35 import org.openhab.binding.netatmo.internal.handler.capability.MeasureCapability;
36 import org.openhab.binding.netatmo.internal.handler.capability.PersonCapability;
37 import org.openhab.binding.netatmo.internal.handler.capability.PresenceCapability;
38 import org.openhab.binding.netatmo.internal.handler.capability.RoomCapability;
39 import org.openhab.binding.netatmo.internal.handler.capability.SmokeCapability;
40 import org.openhab.binding.netatmo.internal.handler.capability.WeatherCapability;
41 import org.openhab.binding.netatmo.internal.handler.channelhelper.AirQualityChannelHelper;
42 import org.openhab.binding.netatmo.internal.handler.channelhelper.ApiBridgeChannelHelper;
43 import org.openhab.binding.netatmo.internal.handler.channelhelper.CameraChannelHelper;
44 import org.openhab.binding.netatmo.internal.handler.channelhelper.DoorTagChannelHelper;
45 import org.openhab.binding.netatmo.internal.handler.channelhelper.EnergyChannelHelper;
46 import org.openhab.binding.netatmo.internal.handler.channelhelper.EventChannelHelper;
47 import org.openhab.binding.netatmo.internal.handler.channelhelper.EventDoorbellChannelHelper;
48 import org.openhab.binding.netatmo.internal.handler.channelhelper.EventPersonChannelHelper;
49 import org.openhab.binding.netatmo.internal.handler.channelhelper.PersonChannelHelper;
50 import org.openhab.binding.netatmo.internal.handler.channelhelper.PresenceChannelHelper;
51 import org.openhab.binding.netatmo.internal.handler.channelhelper.PressureChannelHelper;
52 import org.openhab.binding.netatmo.internal.handler.channelhelper.RainChannelHelper;
53 import org.openhab.binding.netatmo.internal.handler.channelhelper.RoomChannelHelper;
54 import org.openhab.binding.netatmo.internal.handler.channelhelper.SecurityChannelHelper;
55 import org.openhab.binding.netatmo.internal.handler.channelhelper.SetpointChannelHelper;
56 import org.openhab.binding.netatmo.internal.handler.channelhelper.SirenChannelHelper;
57 import org.openhab.binding.netatmo.internal.handler.channelhelper.Therm1ChannelHelper;
58 import org.openhab.binding.netatmo.internal.handler.channelhelper.WindChannelHelper;
59 import org.openhab.core.thing.ThingTypeUID;
60
61 /**
62  * This enum all handled Netatmo modules and devices along with their capabilities
63  *
64  * @author GaĆ«l L'hopital - Initial contribution
65  */
66 @NonNullByDefault
67 public enum ModuleType {
68     UNKNOWN(FeatureArea.NONE, "", null, Set.of()),
69     ACCOUNT(FeatureArea.NONE, "", null, Set.of(), new ChannelGroup(ApiBridgeChannelHelper.class, GROUP_MONITORING)),
70
71     HOME(FeatureArea.NONE, "NAHome", ACCOUNT,
72             Set.of(DeviceCapability.class, HomeCapability.class, ChannelHelperCapability.class),
73             new ChannelGroup(SecurityChannelHelper.class, GROUP_SECURITY),
74             new ChannelGroup(EnergyChannelHelper.class, GROUP_ENERGY)),
75
76     PERSON(FeatureArea.SECURITY, "NAPerson", HOME, Set.of(PersonCapability.class, ChannelHelperCapability.class),
77             new ChannelGroup(PersonChannelHelper.class, GROUP_PERSON),
78             new ChannelGroup(EventPersonChannelHelper.class, GROUP_PERSON_LAST_EVENT)),
79
80     WELCOME(FeatureArea.SECURITY, "NACamera", HOME, Set.of(CameraCapability.class, ChannelHelperCapability.class),
81             ChannelGroup.SIGNAL, ChannelGroup.EVENT,
82             new ChannelGroup(CameraChannelHelper.class, GROUP_CAM_STATUS, GROUP_CAM_LIVE)),
83
84     TAG(FeatureArea.SECURITY, "NACamDoorTag", WELCOME, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL,
85             ChannelGroup.BATTERY, ChannelGroup.TIMESTAMP, new ChannelGroup(DoorTagChannelHelper.class, GROUP_TAG)),
86
87     SIREN(FeatureArea.SECURITY, "NIS", WELCOME, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL,
88             ChannelGroup.BATTERY, ChannelGroup.TIMESTAMP, new ChannelGroup(SirenChannelHelper.class, GROUP_SIREN)),
89
90     PRESENCE(FeatureArea.SECURITY, "NOC", HOME, Set.of(PresenceCapability.class, ChannelHelperCapability.class),
91             ChannelGroup.SIGNAL, ChannelGroup.EVENT,
92             new ChannelGroup(PresenceChannelHelper.class, GROUP_CAM_STATUS, GROUP_CAM_LIVE, GROUP_PRESENCE)),
93
94     DOORBELL(FeatureArea.SECURITY, "NDB", HOME, Set.of(DoorbellCapability.class, ChannelHelperCapability.class),
95             ChannelGroup.SIGNAL,
96             new ChannelGroup(CameraChannelHelper.class, GROUP_DOORBELL_STATUS, GROUP_DOORBELL_LIVE),
97             new ChannelGroup(EventDoorbellChannelHelper.class, GROUP_DOORBELL_LAST_EVENT, GROUP_DOORBELL_SUB_EVENT)),
98
99     WEATHER_STATION(FeatureArea.WEATHER, "NAMain", ACCOUNT,
100             Set.of(DeviceCapability.class, WeatherCapability.class, MeasureCapability.class,
101                     ChannelHelperCapability.class),
102             ChannelGroup.SIGNAL, ChannelGroup.HUMIDITY, ChannelGroup.TSTAMP_EXT, ChannelGroup.MEASURE,
103             ChannelGroup.AIR_QUALITY, ChannelGroup.LOCATION, ChannelGroup.NOISE, ChannelGroup.TEMP_INSIDE_EXT,
104             new ChannelGroup(PressureChannelHelper.class, MeasureClass.PRESSURE, GROUP_TYPE_PRESSURE_EXTENDED)),
105
106     OUTDOOR(FeatureArea.WEATHER, "NAModule1", WEATHER_STATION,
107             Set.of(MeasureCapability.class, ChannelHelperCapability.class), ChannelGroup.SIGNAL, ChannelGroup.HUMIDITY,
108             ChannelGroup.TSTAMP_EXT, ChannelGroup.MEASURE, ChannelGroup.BATTERY, ChannelGroup.TEMP_OUTSIDE_EXT),
109
110     WIND(FeatureArea.WEATHER, "NAModule2", WEATHER_STATION, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL,
111             ChannelGroup.TSTAMP_EXT, ChannelGroup.BATTERY, new ChannelGroup(WindChannelHelper.class, GROUP_WIND)),
112
113     RAIN(FeatureArea.WEATHER, "NAModule3", WEATHER_STATION,
114             Set.of(MeasureCapability.class, ChannelHelperCapability.class), ChannelGroup.SIGNAL,
115             ChannelGroup.TSTAMP_EXT, ChannelGroup.MEASURE, ChannelGroup.BATTERY,
116             new ChannelGroup(RainChannelHelper.class, MeasureClass.RAIN_QUANTITY, GROUP_RAIN)),
117
118     INDOOR(FeatureArea.WEATHER, "NAModule4", WEATHER_STATION,
119             Set.of(MeasureCapability.class, ChannelHelperCapability.class), ChannelGroup.SIGNAL,
120             ChannelGroup.TSTAMP_EXT, ChannelGroup.MEASURE, ChannelGroup.BATTERY, ChannelGroup.HUMIDITY,
121             ChannelGroup.TEMP_INSIDE_EXT, ChannelGroup.AIR_QUALITY),
122
123     HOME_COACH(FeatureArea.AIR_CARE, "NHC", ACCOUNT,
124             Set.of(DeviceCapability.class, AirCareCapability.class, MeasureCapability.class,
125                     ChannelHelperCapability.class),
126             ChannelGroup.LOCATION, ChannelGroup.SIGNAL, ChannelGroup.NOISE, ChannelGroup.HUMIDITY,
127             ChannelGroup.TEMP_INSIDE, ChannelGroup.MEASURE, ChannelGroup.TSTAMP_EXT,
128             new ChannelGroup(AirQualityChannelHelper.class, GROUP_TYPE_AIR_QUALITY_EXTENDED),
129             new ChannelGroup(PressureChannelHelper.class, MeasureClass.PRESSURE, GROUP_PRESSURE)),
130
131     PLUG(FeatureArea.ENERGY, "NAPlug", HOME, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL),
132
133     VALVE(FeatureArea.ENERGY, "NRV", PLUG, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL,
134             ChannelGroup.BATTERY_EXT),
135
136     THERMOSTAT(FeatureArea.ENERGY, "NATherm1", PLUG, Set.of(ChannelHelperCapability.class), ChannelGroup.SIGNAL,
137             ChannelGroup.BATTERY_EXT, new ChannelGroup(Therm1ChannelHelper.class, GROUP_TYPE_TH_PROPERTIES)),
138
139     ROOM(FeatureArea.ENERGY, "NARoom", HOME, Set.of(RoomCapability.class, ChannelHelperCapability.class),
140             new ChannelGroup(RoomChannelHelper.class, GROUP_TYPE_ROOM_PROPERTIES, GROUP_TYPE_ROOM_TEMPERATURE),
141             new ChannelGroup(SetpointChannelHelper.class, GROUP_SETPOINT)),
142
143     SMOKE_DETECTOR(FeatureArea.SECURITY, "NSD", HOME, Set.of(SmokeCapability.class, ChannelHelperCapability.class),
144             ChannelGroup.SIGNAL, ChannelGroup.TIMESTAMP,
145             new ChannelGroup(EventChannelHelper.class, GROUP_SMOKE_LAST_EVENT));
146
147     public static final EnumSet<ModuleType> AS_SET = EnumSet.allOf(ModuleType.class);
148
149     private final @Nullable ModuleType bridgeType;
150     public final Set<ChannelGroup> channelGroups;
151     public final Set<Class<? extends Capability>> capabilities;
152     public final ThingTypeUID thingTypeUID;
153     public final FeatureArea feature;
154     public final String apiName;
155
156     ModuleType(FeatureArea feature, String apiName, @Nullable ModuleType bridge,
157             Set<Class<? extends Capability>> capabilities, ChannelGroup... channelGroups) {
158         this.bridgeType = bridge;
159         this.feature = feature;
160         this.capabilities = capabilities;
161         this.apiName = apiName;
162         this.channelGroups = Set.of(channelGroups);
163         this.thingTypeUID = new ThingTypeUID(BINDING_ID, name().toLowerCase().replace("_", "-"));
164     }
165
166     public boolean isLogical() {
167         return !channelGroups.contains(ChannelGroup.SIGNAL);
168     }
169
170     public boolean isABridge() {
171         for (ModuleType mt : ModuleType.values()) {
172             if (this.equals(mt.bridgeType)) {
173                 return true;
174             }
175         }
176         return false;
177     }
178
179     public List<String> getExtensions() {
180         return channelGroups.stream().map(cg -> cg.extensions).flatMap(Set::stream).collect(Collectors.toList());
181     }
182
183     public Set<String> getGroupTypes() {
184         return channelGroups.stream().map(cg -> cg.groupTypes).flatMap(Set::stream).collect(Collectors.toSet());
185     }
186
187     public int[] getSignalLevels() {
188         if (!isLogical()) {
189             return (channelGroups.contains(ChannelGroup.BATTERY) || channelGroups.contains(ChannelGroup.BATTERY_EXT))
190                     ? RADIO_SIGNAL_LEVELS
191                     : WIFI_SIGNAL_LEVELS;
192         }
193         throw new IllegalArgumentException(
194                 "This should not be called for module type : " + name() + ", please file a bug report.");
195     }
196
197     public ModuleType getBridge() {
198         ModuleType bridge = bridgeType;
199         return bridge != null ? bridge : ModuleType.UNKNOWN;
200     }
201
202     public URI getConfigDescription() {
203         return URI.create(BINDING_ID + ":"
204                 + (equals(ACCOUNT) ? "api_bridge"
205                         : equals(HOME) ? "home"
206                                 : (isLogical() ? "virtual"
207                                         : ModuleType.UNKNOWN.equals(getBridge()) ? "configurable" : "device")));
208     }
209
210     public int getDepth() {
211         ModuleType parent = bridgeType;
212         return parent == null ? 1 : 1 + parent.getDepth();
213     }
214
215     public static ModuleType from(ThingTypeUID thingTypeUID) {
216         return ModuleType.AS_SET.stream().filter(mt -> mt.thingTypeUID.equals(thingTypeUID)).findFirst()
217                 .orElseThrow(() -> new IllegalArgumentException());
218     }
219 }