2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.wundergroundupdatereceiver.internal;
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.*;
19 import java.util.Arrays;
20 import java.util.List;
21 import java.util.Optional;
22 import java.util.regex.Pattern;
24 import javax.measure.Quantity;
25 import javax.measure.Unit;
27 import org.eclipse.jdt.annotation.NonNullByDefault;
28 import org.eclipse.jdt.annotation.Nullable;
29 import org.openhab.core.thing.type.ChannelTypeUID;
32 * @author Daniel Demus - Initial contribution
35 public class WundergroundUpdateReceiverParameterMapping {
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;
43 public final @Nullable Pattern pattern;
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;
52 this.isIndexable = isIndexable;
53 this.pattern = pattern;
56 private static final List<String> UNMAPPED_PARAMETERS = List.of(STATION_ID_PARAMETER, PASSWORD, ACTION,
57 REALTIME_MARKER, LAST_QUERY);
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,
70 new WundergroundUpdateReceiverParameterMapping(SOFTWARE_TYPE, SOFTWARETYPE_CHANNELTYPEUID, METADATA_GROUP,
72 new WundergroundUpdateReceiverParameterMapping(LOW_BATTERY, LOW_BATTERY_CHANNELTYPEUID, METADATA_GROUP,
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,
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,
113 new WundergroundUpdateReceiverParameterMapping(WEEKLY_RAIN_IN, RAIN_WEEKLY_CHANNELTYPEUID, RAIN_GROUP, INCH,
115 new WundergroundUpdateReceiverParameterMapping(MONTHLY_RAIN_IN, RAIN_MONTHLY_CHANNELTYPEUID, RAIN_GROUP,
117 new WundergroundUpdateReceiverParameterMapping(YEARLY_RAIN_IN, RAIN_YEARLY_CHANNELTYPEUID, RAIN_GROUP, INCH,
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,
126 new WundergroundUpdateReceiverParameterMapping(CLOUDS, CLOUDS_CHANNELTYPEUID, SUNLIGHT_GROUP, null, false,
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) };
169 public static @Nullable WundergroundUpdateReceiverParameterMapping getOrCreateMapping(String parameterName,
170 String value, WundergroundUpdateReceiverUnknownChannelTypeProvider channelTypeProvider) {
171 if (isExcluded(parameterName)) {
174 Optional<WundergroundUpdateReceiverParameterMapping> knownMapping = lookupMapping(parameterName);
175 return knownMapping.orElseGet(() -> new WundergroundUpdateReceiverParameterMapping(parameterName,
176 channelTypeProvider.getOrCreateChannelType(parameterName, value).getUID(), UNCATEGORIZED, null, false,
180 public static boolean isExcluded(String parameter) {
181 return UNMAPPED_PARAMETERS.contains(parameter);
184 public static @Nullable Unit<? extends Quantity<?>> getUnit(String parameterName) {
185 Optional<WundergroundUpdateReceiverParameterMapping> mapping = lookupMapping(parameterName);
187 .<Unit<? extends Quantity<?>>> map(
188 wundergroundUpdateReceiverParameterMapping -> wundergroundUpdateReceiverParameterMapping.unit)
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()))