]> git.basschouten.com Git - openhab-addons.git/blob
dbd271a3986ae6b5dfb71c899b6e722cce83e594
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.station;
14
15 import static org.openhab.binding.netatmo.internal.ChannelTypeUtils.*;
16 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.Optional;
22 import java.util.concurrent.ConcurrentHashMap;
23
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.openhab.binding.netatmo.internal.WeatherUtils;
26 import org.openhab.binding.netatmo.internal.handler.NetatmoModuleHandler;
27 import org.openhab.core.i18n.TimeZoneProvider;
28 import org.openhab.core.thing.Thing;
29 import org.openhab.core.types.State;
30
31 import io.swagger.client.model.NADashboardData;
32 import io.swagger.client.model.NAStationModule;
33
34 /**
35  * {@link NAModule1Handler} is the class used to handle the outdoor module
36  * capable of reporting temperature and humidity
37  *
38  * @author GaĆ«l L'hopital - Initial contribution
39  * @author Rob Nielsen - Added day, week, and month measurements to the weather station and modules
40  *
41  */
42 @NonNullByDefault
43 public class NAModule1Handler extends NetatmoModuleHandler<NAStationModule> {
44     private Map<String, Float> channelMeasurements = new ConcurrentHashMap<>();
45
46     public NAModule1Handler(Thing thing, final TimeZoneProvider timeZoneProvider) {
47         super(thing, timeZoneProvider);
48     }
49
50     @Override
51     protected void updateProperties(NAStationModule moduleData) {
52         updateProperties(moduleData.getFirmware(), moduleData.getType());
53     }
54
55     @Override
56     public void updateMeasurements() {
57         updateDayMeasurements();
58         updateWeekMeasurements();
59         updateMonthMeasurements();
60     }
61
62     private void updateDayMeasurements() {
63         List<String> channels = new ArrayList<>();
64         List<String> types = new ArrayList<>();
65         addMeasurement(channels, types, CHANNEL_MIN_HUMIDITY, MIN_HUM);
66         addMeasurement(channels, types, CHANNEL_MAX_HUMIDITY, MAX_HUM);
67         addMeasurement(channels, types, CHANNEL_DATE_MIN_HUMIDITY, DATE_MIN_HUM);
68         addMeasurement(channels, types, CHANNEL_DATE_MAX_HUMIDITY, DATE_MAX_HUM);
69         if (!channels.isEmpty()) {
70             getMeasurements(getParentId(), getId(), ONE_DAY, types, channels, channelMeasurements);
71         }
72     }
73
74     private void updateWeekMeasurements() {
75         List<String> channels = new ArrayList<>();
76         List<String> types = new ArrayList<>();
77         addMeasurement(channels, types, CHANNEL_MIN_HUMIDITY_THIS_WEEK, MIN_HUM);
78         addMeasurement(channels, types, CHANNEL_MAX_HUMIDITY_THIS_WEEK, MAX_HUM);
79         addMeasurement(channels, types, CHANNEL_MIN_TEMP_THIS_WEEK, MIN_TEMP);
80         addMeasurement(channels, types, CHANNEL_MAX_TEMP_THIS_WEEK, MAX_TEMP);
81         addMeasurement(channels, types, CHANNEL_DATE_MIN_HUMIDITY_THIS_WEEK, DATE_MIN_HUM);
82         addMeasurement(channels, types, CHANNEL_DATE_MAX_HUMIDITY_THIS_WEEK, DATE_MAX_HUM);
83         addMeasurement(channels, types, CHANNEL_DATE_MIN_TEMP_THIS_WEEK, DATE_MIN_TEMP);
84         addMeasurement(channels, types, CHANNEL_DATE_MAX_TEMP_THIS_WEEK, DATE_MAX_TEMP);
85         if (!channels.isEmpty()) {
86             getMeasurements(getParentId(), getId(), ONE_WEEK, types, channels, channelMeasurements);
87         }
88     }
89
90     private void updateMonthMeasurements() {
91         List<String> channels = new ArrayList<>();
92         List<String> types = new ArrayList<>();
93         addMeasurement(channels, types, CHANNEL_MIN_HUMIDITY_THIS_MONTH, MIN_HUM);
94         addMeasurement(channels, types, CHANNEL_MAX_HUMIDITY_THIS_MONTH, MAX_HUM);
95         addMeasurement(channels, types, CHANNEL_MIN_TEMP_THIS_MONTH, MIN_TEMP);
96         addMeasurement(channels, types, CHANNEL_MAX_TEMP_THIS_MONTH, MAX_TEMP);
97         addMeasurement(channels, types, CHANNEL_DATE_MIN_HUMIDITY_THIS_MONTH, DATE_MIN_HUM);
98         addMeasurement(channels, types, CHANNEL_DATE_MAX_HUMIDITY_THIS_MONTH, DATE_MAX_HUM);
99         addMeasurement(channels, types, CHANNEL_DATE_MIN_TEMP_THIS_MONTH, DATE_MIN_TEMP);
100         addMeasurement(channels, types, CHANNEL_DATE_MAX_TEMP_THIS_MONTH, DATE_MAX_TEMP);
101         if (!channels.isEmpty()) {
102             getMeasurements(getParentId(), getId(), ONE_MONTH, types, channels, channelMeasurements);
103         }
104     }
105
106     @Override
107     protected State getNAThingProperty(String channelId) {
108         NADashboardData dashboardData = getModule().map(m -> m.getDashboardData()).orElse(null);
109         if (dashboardData != null) {
110             switch (channelId) {
111                 case CHANNEL_TEMP_TREND:
112                     return toStringType(dashboardData.getTempTrend());
113                 case CHANNEL_TEMPERATURE:
114                     return toQuantityType(dashboardData.getTemperature(), API_TEMPERATURE_UNIT);
115                 case CHANNEL_DATE_MIN_TEMP:
116                     return toDateTimeType(dashboardData.getDateMinTemp(), timeZoneProvider.getTimeZone());
117                 case CHANNEL_DATE_MAX_TEMP:
118                     return toDateTimeType(dashboardData.getDateMaxTemp(), timeZoneProvider.getTimeZone());
119                 case CHANNEL_MIN_TEMP:
120                     return toQuantityType(dashboardData.getMinTemp(), API_TEMPERATURE_UNIT);
121                 case CHANNEL_MAX_TEMP:
122                     return toQuantityType(dashboardData.getMaxTemp(), API_TEMPERATURE_UNIT);
123                 case CHANNEL_HUMIDITY:
124                     return toQuantityType(dashboardData.getHumidity(), API_HUMIDITY_UNIT);
125                 case CHANNEL_TIMEUTC:
126                     return toDateTimeType(dashboardData.getTimeUtc(), timeZoneProvider.getTimeZone());
127                 case CHANNEL_HUMIDEX:
128                     return toDecimalType(
129                             WeatherUtils.getHumidex(dashboardData.getTemperature(), dashboardData.getHumidity()));
130                 case CHANNEL_HEATINDEX:
131                     return toQuantityType(
132                             WeatherUtils.getHeatIndex(dashboardData.getTemperature(), dashboardData.getHumidity()),
133                             API_TEMPERATURE_UNIT);
134                 case CHANNEL_DEWPOINT:
135                     return toQuantityType(
136                             WeatherUtils.getDewPoint(dashboardData.getTemperature(), dashboardData.getHumidity()),
137                             API_TEMPERATURE_UNIT);
138                 case CHANNEL_DEWPOINTDEP:
139                     Double dewpoint = WeatherUtils.getDewPoint(dashboardData.getTemperature(),
140                             dashboardData.getHumidity());
141                     return toQuantityType(WeatherUtils.getDewPointDep(dashboardData.getTemperature(), dewpoint),
142                             API_TEMPERATURE_UNIT);
143             }
144         }
145
146         switch (channelId) {
147             case CHANNEL_MIN_HUMIDITY:
148             case CHANNEL_MIN_HUMIDITY_THIS_WEEK:
149             case CHANNEL_MIN_HUMIDITY_THIS_MONTH:
150             case CHANNEL_MAX_HUMIDITY:
151             case CHANNEL_MAX_HUMIDITY_THIS_WEEK:
152             case CHANNEL_MAX_HUMIDITY_THIS_MONTH:
153                 return toQuantityType(channelMeasurements.get(channelId), API_HUMIDITY_UNIT);
154             case CHANNEL_MIN_TEMP_THIS_WEEK:
155             case CHANNEL_MIN_TEMP_THIS_MONTH:
156             case CHANNEL_MAX_TEMP_THIS_WEEK:
157             case CHANNEL_MAX_TEMP_THIS_MONTH:
158                 return toQuantityType(channelMeasurements.get(channelId), API_TEMPERATURE_UNIT);
159             case CHANNEL_DATE_MIN_HUMIDITY:
160             case CHANNEL_DATE_MIN_HUMIDITY_THIS_WEEK:
161             case CHANNEL_DATE_MIN_HUMIDITY_THIS_MONTH:
162             case CHANNEL_DATE_MAX_HUMIDITY:
163             case CHANNEL_DATE_MAX_HUMIDITY_THIS_WEEK:
164             case CHANNEL_DATE_MAX_HUMIDITY_THIS_MONTH:
165             case CHANNEL_DATE_MIN_TEMP_THIS_WEEK:
166             case CHANNEL_DATE_MIN_TEMP_THIS_MONTH:
167             case CHANNEL_DATE_MAX_TEMP_THIS_WEEK:
168             case CHANNEL_DATE_MAX_TEMP_THIS_MONTH:
169                 return toDateTimeType(channelMeasurements.get(channelId), timeZoneProvider.getTimeZone());
170         }
171
172         return super.getNAThingProperty(channelId);
173     }
174
175     @Override
176     protected boolean isReachable() {
177         boolean result = false;
178         Optional<NAStationModule> module = getModule();
179         if (module.isPresent()) {
180             Boolean reachable = module.get().isReachable();
181             result = reachable != null ? reachable.booleanValue() : false;
182         }
183         return result;
184     }
185 }