]> git.basschouten.com Git - openhab-addons.git/blob
000a3f003c837715f2292e586d036d0a709b66ca
[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.wundergroundupdatereceiver.internal;
14
15 import static org.openhab.binding.wundergroundupdatereceiver.internal.WundergroundUpdateReceiverBindingConstants.*;
16 import static org.openhab.core.library.unit.ImperialUnits.*;
17 import static org.openhab.core.library.unit.Units.*;
18
19 import java.util.Arrays;
20 import java.util.List;
21 import java.util.Optional;
22 import java.util.regex.Pattern;
23
24 import javax.measure.Quantity;
25 import javax.measure.Unit;
26
27 import org.eclipse.jdt.annotation.NonNullByDefault;
28 import org.eclipse.jdt.annotation.Nullable;
29 import org.openhab.core.thing.type.ChannelTypeUID;
30
31 /**
32  * @author Daniel Demus - Initial contribution
33  */
34 @NonNullByDefault
35 public class WundergroundUpdateReceiverParameterMapping {
36
37     public final String parameterName;
38     public final ChannelTypeUID channelTypeId;
39     public final String channelGroup;
40     public final @Nullable Unit<? extends Quantity<?>> unit;
41     public final boolean isIndexable;
42
43     public final @Nullable Pattern pattern;
44
45     private WundergroundUpdateReceiverParameterMapping(String parameterName, ChannelTypeUID channelTypeId,
46             String channelGroup, @Nullable Unit<? extends Quantity<?>> unit, boolean isIndexable,
47             @Nullable Pattern pattern) {
48         this.parameterName = parameterName;
49         this.channelTypeId = channelTypeId;
50         this.channelGroup = channelGroup;
51         this.unit = unit;
52         this.isIndexable = isIndexable;
53         this.pattern = pattern;
54     }
55
56     private static final List<String> UNMAPPED_PARAMETERS = List.of(STATION_ID_PARAMETER, PASSWORD, ACTION,
57             REALTIME_MARKER, LAST_QUERY);
58
59     private static final WundergroundUpdateReceiverParameterMapping[] KNOWN_MAPPINGS = {
60             new WundergroundUpdateReceiverParameterMapping(LAST_RECEIVED, LAST_RECEIVED_DATETIME_CHANNELTYPEUID,
61                     METADATA_GROUP, null, false, null),
62             new WundergroundUpdateReceiverParameterMapping(LAST_QUERY_STATE, LAST_QUERY_STATE_CHANNELTYPEUID,
63                     METADATA_GROUP, null, false, null),
64             new WundergroundUpdateReceiverParameterMapping(LAST_QUERY_TRIGGER, LAST_QUERY_TRIGGER_CHANNELTYPEUID,
65                     METADATA_GROUP, null, false, null),
66             new WundergroundUpdateReceiverParameterMapping(DATEUTC_DATETIME, DATEUTC_DATETIME_CHANNELTYPEUID,
67                     METADATA_GROUP, null, false, null),
68             new WundergroundUpdateReceiverParameterMapping(DATEUTC, DATEUTC_CHANNELTYPEUID, METADATA_GROUP, null, false,
69                     null),
70             new WundergroundUpdateReceiverParameterMapping(SOFTWARE_TYPE, SOFTWARETYPE_CHANNELTYPEUID, METADATA_GROUP,
71                     null, false, null),
72             new WundergroundUpdateReceiverParameterMapping(LOW_BATTERY, LOW_BATTERY_CHANNELTYPEUID, METADATA_GROUP,
73                     null, false, null),
74             new WundergroundUpdateReceiverParameterMapping(REALTIME_FREQUENCY, REALTIME_FREQUENCY_CHANNELTYPEUID,
75                     METADATA_GROUP, null, false, null),
76             new WundergroundUpdateReceiverParameterMapping(WIND_DIRECTION, WIND_DIRECTION_CHANNELTYPEUID, WIND_GROUP,
77                     DEGREE_ANGLE, false, null),
78             new WundergroundUpdateReceiverParameterMapping(WIND_SPEED, WIND_SPEED_CHANNELTYPEUID, WIND_GROUP,
79                     MILES_PER_HOUR, false, null),
80             new WundergroundUpdateReceiverParameterMapping(GUST_SPEED, GUST_SPEED_CHANNELTYPEUID, WIND_GROUP,
81                     MILES_PER_HOUR, false, null),
82             new WundergroundUpdateReceiverParameterMapping(GUST_DIRECTION, GUST_DIRECTION_CHANNELTYPEUID, WIND_GROUP,
83                     DEGREE_ANGLE, false, null),
84             new WundergroundUpdateReceiverParameterMapping(WIND_SPEED_AVG_2MIN, WIND_SPEED_AVG_2MIN_CHANNELTYPEUID,
85                     WIND_GROUP, MILES_PER_HOUR, false, null),
86             new WundergroundUpdateReceiverParameterMapping(WIND_DIRECTION_AVG_2MIN,
87                     WIND_DIRECTION_AVG_2MIN_CHANNELTYPEUID, WIND_GROUP, DEGREE_ANGLE, false, null),
88             new WundergroundUpdateReceiverParameterMapping(GUST_SPEED_AVG_10MIN, GUST_SPEED_10MIN_CHANNELTYPEUID,
89                     WIND_GROUP, MILES_PER_HOUR, false, null),
90             new WundergroundUpdateReceiverParameterMapping(GUST_DIRECTION_AVG_10MIN,
91                     GUST_DIRECTION_10MIN_CHANNELTYPEUID, WIND_GROUP, DEGREE_ANGLE, false, null),
92             new WundergroundUpdateReceiverParameterMapping(TEMPERATURE, TEMPERATURE_CHANNELTYPEUID, TEMPERATURE_GROUP,
93                     FAHRENHEIT, true, Pattern.compile(TEMPERATURE_INDEXED)),
94             new WundergroundUpdateReceiverParameterMapping(INDOOR_TEMPERATURE, INDOOR_TEMPERATURE_CHANNELTYPEUID,
95                     TEMPERATURE_GROUP, FAHRENHEIT, false, null),
96             new WundergroundUpdateReceiverParameterMapping(SOIL_TEMPERATURE, SOIL_TEMPERATURE_CHANNELTYPEUID,
97                     TEMPERATURE_GROUP, FAHRENHEIT, true, Pattern.compile(SOIL_TEMPERATURE_INDEXED)),
98             new WundergroundUpdateReceiverParameterMapping(WIND_CHILL, WIND_CHILL_CHANNELTYPEUID, TEMPERATURE_GROUP,
99                     FAHRENHEIT, false, null),
100             new WundergroundUpdateReceiverParameterMapping(HUMIDITY, HUMIDITY_CHANNELTYPEUID, HUMIDITY_GROUP, PERCENT,
101                     false, null),
102             new WundergroundUpdateReceiverParameterMapping(INDOOR_HUMIDITY, INDOOR_HUMIDITY_CHANNELTYPEUID,
103                     HUMIDITY_GROUP, PERCENT, false, null),
104             new WundergroundUpdateReceiverParameterMapping(DEWPOINT, DEW_POINT_CHANNELTYPEUID, HUMIDITY_GROUP,
105                     FAHRENHEIT, false, null),
106             new WundergroundUpdateReceiverParameterMapping(SOIL_MOISTURE, SOIL_MOISTURE_CHANNELTYPEUID, HUMIDITY_GROUP,
107                     PERCENT, true, Pattern.compile(SOIL_MOISTURE_INDEXED)),
108             new WundergroundUpdateReceiverParameterMapping(LEAF_WETNESS, LEAFWETNESS_CHANNELTYPEUID, HUMIDITY_GROUP,
109                     PERCENT, true, Pattern.compile(LEAF_WETNESS_INDEXED)),
110             new WundergroundUpdateReceiverParameterMapping(RAIN_IN, RAIN_CHANNELTYPEUID, RAIN_GROUP, INCH, false, null),
111             new WundergroundUpdateReceiverParameterMapping(DAILY_RAIN_IN, RAIN_DAILY_CHANNELTYPEUID, RAIN_GROUP, INCH,
112                     false, null),
113             new WundergroundUpdateReceiverParameterMapping(WEEKLY_RAIN_IN, RAIN_WEEKLY_CHANNELTYPEUID, RAIN_GROUP, INCH,
114                     false, null),
115             new WundergroundUpdateReceiverParameterMapping(MONTHLY_RAIN_IN, RAIN_MONTHLY_CHANNELTYPEUID, RAIN_GROUP,
116                     INCH, false, null),
117             new WundergroundUpdateReceiverParameterMapping(YEARLY_RAIN_IN, RAIN_YEARLY_CHANNELTYPEUID, RAIN_GROUP, INCH,
118                     false, null),
119             new WundergroundUpdateReceiverParameterMapping(SOLAR_RADIATION, SOLARRADIATION_CHANNELTYPEUID,
120                     SUNLIGHT_GROUP, IRRADIANCE, false, null),
121             new WundergroundUpdateReceiverParameterMapping(UV, UV_CHANNELTYPEUID, SUNLIGHT_GROUP, null, false, null),
122             new WundergroundUpdateReceiverParameterMapping(VISIBILITY, VISIBILITY_CHANNELTYPEUID, SUNLIGHT_GROUP,
123                     NAUTICAL_MILE, false, null),
124             new WundergroundUpdateReceiverParameterMapping(WEATHER, METAR_CHANNELTYPEUID, SUNLIGHT_GROUP, null, false,
125                     null),
126             new WundergroundUpdateReceiverParameterMapping(CLOUDS, CLOUDS_CHANNELTYPEUID, SUNLIGHT_GROUP, null, false,
127                     null),
128             new WundergroundUpdateReceiverParameterMapping(BAROM_IN, BAROMETRIC_PRESSURE_CHANNELTYPEUID, PRESSURE_GROUP,
129                     INCH_OF_MERCURY, false, null),
130             new WundergroundUpdateReceiverParameterMapping(AQ_NO, NITRIC_OXIDE_CHANNELTYPEUID, POLLUTION_GROUP,
131                     PARTS_PER_BILLION, false, null),
132             new WundergroundUpdateReceiverParameterMapping(AQ_NO2, NITROGEN_DIOXIDE_NOX_NO_CHANNELTYPEUID,
133                     POLLUTION_GROUP, PARTS_PER_BILLION, false, null),
134             new WundergroundUpdateReceiverParameterMapping(AQ_NO2T, NITROGEN_DIOXIDE_MEASURED_CHANNELTYPEUID,
135                     POLLUTION_GROUP, PARTS_PER_BILLION, false, null),
136             new WundergroundUpdateReceiverParameterMapping(AQ_NO2Y, NITROGEN_DIOXIDE_NOY_NO_CHANNELTYPEUID,
137                     POLLUTION_GROUP, PARTS_PER_BILLION, false, null),
138             new WundergroundUpdateReceiverParameterMapping(AQ_NOX, NITROGEN_OXIDES_CHANNELTYPEUID, POLLUTION_GROUP,
139                     PARTS_PER_BILLION, false, null),
140             new WundergroundUpdateReceiverParameterMapping(AQ_NOY, TOTAL_REACTIVE_NITROGEN_CHANNELTYPEUID,
141                     POLLUTION_GROUP, PARTS_PER_BILLION, false, null),
142             new WundergroundUpdateReceiverParameterMapping(AQ_NO3, NO3_ION_CHANNELTYPEUID, POLLUTION_GROUP,
143                     MICROGRAM_PER_CUBICMETRE, false, null),
144             new WundergroundUpdateReceiverParameterMapping(AQ_SO2, SULFUR_DIOXIDE_CHANNELTYPEUID, POLLUTION_GROUP,
145                     PARTS_PER_BILLION, false, null),
146             new WundergroundUpdateReceiverParameterMapping(AQ_SO2T, SULFUR_DIOXIDE_TRACE_LEVELS_CHANNELTYPEUID,
147                     POLLUTION_GROUP, PARTS_PER_BILLION, false, null),
148             new WundergroundUpdateReceiverParameterMapping(AQ_SO4, SO4_ION_CHANNELTYPEUID, POLLUTION_GROUP,
149                     MICROGRAM_PER_CUBICMETRE, false, null),
150             new WundergroundUpdateReceiverParameterMapping(AQ_CO, CARBON_MONOXIDE_CHANNELTYPEUID, POLLUTION_GROUP,
151                     PARTS_PER_MILLION, false, null),
152             new WundergroundUpdateReceiverParameterMapping(AQ_COT, CARBON_MONOXIDE_TRACE_LEVELS_CHANNELTYPEUID,
153                     POLLUTION_GROUP, MICROGRAM_PER_CUBICMETRE, false, null),
154             new WundergroundUpdateReceiverParameterMapping(AQ_EC, ELEMENTAL_CARBON_CHANNELTYPEUID, POLLUTION_GROUP,
155                     MICROGRAM_PER_CUBICMETRE, false, null),
156             new WundergroundUpdateReceiverParameterMapping(AQ_OC, ORGANIC_CARBON_CHANNELTYPEUID, POLLUTION_GROUP,
157                     MICROGRAM_PER_CUBICMETRE, false, null),
158             new WundergroundUpdateReceiverParameterMapping(AQ_BC, BLACK_CARBON_CHANNELTYPEUID, POLLUTION_GROUP,
159                     MICROGRAM_PER_CUBICMETRE, false, null),
160             new WundergroundUpdateReceiverParameterMapping(AQ_UV_AETH, AETHALOMETER_CHANNELTYPEUID, POLLUTION_GROUP,
161                     MICROGRAM_PER_CUBICMETRE, false, null),
162             new WundergroundUpdateReceiverParameterMapping(AQ_PM2_5, PM2_5_MASS_CHANNELTYPEUID, POLLUTION_GROUP,
163                     MICROGRAM_PER_CUBICMETRE, false, null),
164             new WundergroundUpdateReceiverParameterMapping(AQ_PM10, PM10_MASS_CHANNELTYPEUID, POLLUTION_GROUP,
165                     MICROGRAM_PER_CUBICMETRE, false, null),
166             new WundergroundUpdateReceiverParameterMapping(AQ_OZONE, OZONE_CHANNELTYPEUID, POLLUTION_GROUP,
167                     PARTS_PER_BILLION, false, null) };
168
169     public static @Nullable WundergroundUpdateReceiverParameterMapping getOrCreateMapping(String parameterName,
170             String value, WundergroundUpdateReceiverUnknownChannelTypeProvider channelTypeProvider) {
171         if (isExcluded(parameterName)) {
172             return null;
173         }
174         Optional<WundergroundUpdateReceiverParameterMapping> knownMapping = lookupMapping(parameterName);
175         return knownMapping.orElseGet(() -> new WundergroundUpdateReceiverParameterMapping(parameterName,
176                 channelTypeProvider.getOrCreateChannelType(parameterName, value).getUID(), UNCATEGORIZED, null, false,
177                 null));
178     }
179
180     public static boolean isExcluded(String parameter) {
181         return UNMAPPED_PARAMETERS.contains(parameter);
182     }
183
184     public static @Nullable Unit<? extends Quantity<?>> getUnit(String parameterName) {
185         Optional<WundergroundUpdateReceiverParameterMapping> mapping = lookupMapping(parameterName);
186         return mapping
187                 .<Unit<? extends Quantity<?>>> map(
188                         wundergroundUpdateReceiverParameterMapping -> wundergroundUpdateReceiverParameterMapping.unit)
189                 .orElse(null);
190     }
191
192     private static Optional<WundergroundUpdateReceiverParameterMapping> lookupMapping(String parameterName) {
193         return Arrays.stream(KNOWN_MAPPINGS)
194                 .filter((WundergroundUpdateReceiverParameterMapping m) -> m.parameterName.equals(parameterName)
195                         || (m.isIndexable && m.pattern != null && m.pattern.matcher(parameterName).matches()))
196                 .findFirst();
197     }
198 }