2 * Copyright (c) 2010-2021 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.netatmo.internal.station;
15 import static org.openhab.binding.netatmo.internal.ChannelTypeUtils.*;
16 import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
18 import java.util.ArrayList;
19 import java.util.List;
21 import java.util.Optional;
22 import java.util.concurrent.ConcurrentHashMap;
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;
31 import io.swagger.client.model.NADashboardData;
32 import io.swagger.client.model.NAStationModule;
35 * {@link NAModule1Handler} is the class used to handle the outdoor module
36 * capable of reporting temperature and humidity
38 * @author Gaƫl L'hopital - Initial contribution
39 * @author Rob Nielsen - Added day, week, and month measurements to the weather station and modules
43 public class NAModule1Handler extends NetatmoModuleHandler<NAStationModule> {
44 private Map<String, Float> channelMeasurements = new ConcurrentHashMap<>();
46 public NAModule1Handler(Thing thing, final TimeZoneProvider timeZoneProvider) {
47 super(thing, timeZoneProvider);
51 protected void updateProperties(NAStationModule moduleData) {
52 updateProperties(moduleData.getFirmware(), moduleData.getType());
56 public void updateMeasurements() {
57 updateDayMeasurements();
58 updateWeekMeasurements();
59 updateMonthMeasurements();
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);
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);
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);
107 protected State getNAThingProperty(String channelId) {
108 NADashboardData dashboardData = getModule().map(m -> m.getDashboardData()).orElse(null);
109 if (dashboardData != null) {
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);
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());
172 return super.getNAThingProperty(channelId);
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;