]> git.basschouten.com Git - openhab-addons.git/blob
0a5a3c605148f38a008782c43ba206ea4efb4bbb
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 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.tado.internal.builder;
14
15 import static org.openhab.binding.tado.internal.api.TadoApiTypeUtils.*;
16
17 import java.io.IOException;
18 import java.util.List;
19
20 import org.openhab.binding.tado.internal.TadoBindingConstants.HvacMode;
21 import org.openhab.binding.tado.internal.TadoBindingConstants.TemperatureUnit;
22 import org.openhab.binding.tado.internal.api.ApiException;
23 import org.openhab.binding.tado.internal.api.model.ACFanLevel;
24 import org.openhab.binding.tado.internal.api.model.ACHorizontalSwing;
25 import org.openhab.binding.tado.internal.api.model.ACVerticalSwing;
26 import org.openhab.binding.tado.internal.api.model.AcFanSpeed;
27 import org.openhab.binding.tado.internal.api.model.AcMode;
28 import org.openhab.binding.tado.internal.api.model.AcModeCapabilities;
29 import org.openhab.binding.tado.internal.api.model.AirConditioningCapabilities;
30 import org.openhab.binding.tado.internal.api.model.CoolingZoneSetting;
31 import org.openhab.binding.tado.internal.api.model.GenericZoneCapabilities;
32 import org.openhab.binding.tado.internal.api.model.GenericZoneSetting;
33 import org.openhab.binding.tado.internal.api.model.IntRange;
34 import org.openhab.binding.tado.internal.api.model.Power;
35 import org.openhab.binding.tado.internal.api.model.TadoSystemType;
36 import org.openhab.binding.tado.internal.api.model.TemperatureObject;
37 import org.openhab.binding.tado.internal.api.model.TemperatureRange;
38
39 /**
40  *
41  *
42  * @author Dennis Frommknecht - Initial contribution
43  */
44 public class AirConditioningZoneSettingsBuilder extends ZoneSettingsBuilder {
45     private static final AcMode DEFAULT_MODE = AcMode.COOL;
46     private static final float DEFAULT_TEMPERATURE_C = 20.0f;
47     private static final float DEFAULT_TEMPERATURE_F = 68.0f;
48
49     @Override
50     public GenericZoneSetting build(ZoneStateProvider zoneStateProvider, GenericZoneCapabilities genericCapabilities)
51             throws IOException, ApiException {
52         if (mode == HvacMode.OFF) {
53             return coolingSetting(false);
54         }
55
56         CoolingZoneSetting setting = coolingSetting(true);
57         setting.setMode(getAcMode(mode));
58         if (temperature != null) {
59             setting.setTemperature(temperature(temperature, temperatureUnit));
60         }
61
62         if (swing != null) {
63             setting.setSwing(swing ? Power.ON : Power.OFF);
64         }
65
66         if (light != null) {
67             setting.setLight(light ? Power.ON : Power.OFF);
68         }
69
70         if (fanSpeed != null) {
71             setting.setFanSpeed(getAcFanSpeed(fanSpeed));
72         }
73
74         if (fanLevel != null) {
75             setting.setFanLevel(getFanLevel(fanLevel));
76         }
77
78         if (horizontalSwing != null) {
79             setting.setHorizontalSwing(getHorizontalSwing(horizontalSwing));
80         }
81
82         if (verticalSwing != null) {
83             setting.setVerticalSwing(getVerticalSwing(verticalSwing));
84         }
85
86         addMissingSettingParts(zoneStateProvider, genericCapabilities, setting);
87
88         return setting;
89     }
90
91     private void addMissingSettingParts(ZoneStateProvider zoneStateProvider,
92             GenericZoneCapabilities genericCapabilities, CoolingZoneSetting setting) throws IOException, ApiException {
93         if (setting.getMode() == null) {
94             AcMode targetMode = getCurrentOrDefaultAcMode(zoneStateProvider);
95             setting.setMode(targetMode);
96         }
97
98         AcModeCapabilities capabilities = getModeCapabilities((AirConditioningCapabilities) genericCapabilities,
99                 setting.getMode());
100
101         TemperatureRange temperatures = capabilities.getTemperatures();
102         if (temperatures != null && setting.getTemperature() == null) {
103             setting.setTemperature(getCurrentOrDefaultTemperature(zoneStateProvider, temperatures));
104         }
105
106         List<AcFanSpeed> fanSpeeds = capabilities.getFanSpeeds();
107         if (fanSpeeds != null && !fanSpeeds.isEmpty() && setting.getFanSpeed() == null) {
108             setting.setFanSpeed(getCurrentOrDefaultFanSpeed(zoneStateProvider, fanSpeeds));
109         }
110
111         List<Power> swings = capabilities.getSwings();
112         if (swings != null && !swings.isEmpty() && setting.getSwing() == null) {
113             setting.setSwing(getCurrentOrDefaultSwing(zoneStateProvider, swings));
114         }
115
116         // Tado confusingly calls the List / getter method 'fanLevel' / 'getFanLevel()' without 's'
117         List<ACFanLevel> fanLevels = capabilities.getFanLevel();
118         if (fanLevels != null && !fanLevels.isEmpty() && setting.getFanLevel() == null) {
119             setting.setFanLevel(getCurrentOrDefaultFanLevel(zoneStateProvider, fanLevels));
120         }
121
122         // Tado confusingly calls the List / getter method 'horizontalSwing' / 'getHorizontalSwing()' without 's'
123         List<ACHorizontalSwing> horizontalSwings = capabilities.getHorizontalSwing();
124         if (horizontalSwings != null && !horizontalSwings.isEmpty() && setting.getHorizontalSwing() == null) {
125             setting.setHorizontalSwing(getCurrentOrDefaultHorizontalSwing(zoneStateProvider, horizontalSwings));
126         }
127
128         // Tado confusingly calls the List / getter method 'verticalSwing' / 'getVerticalSwing()' without 's'
129         List<ACVerticalSwing> verticalSwings = capabilities.getVerticalSwing();
130         if (verticalSwings != null && !verticalSwings.isEmpty() && setting.getVerticalSwing() == null) {
131             setting.setVerticalSwing(getCurrentOrDefaultVerticalSwing(zoneStateProvider, verticalSwings));
132         }
133
134         // Tado confusingly calls the List / getter method 'light' / 'getLight()' without 's'
135         List<Power> lights = capabilities.getLight();
136         if (lights != null && !lights.isEmpty() && setting.getLight() == null) {
137             setting.setLight(getCurrentOrDefaultLight(zoneStateProvider, lights));
138         }
139     }
140
141     private AcMode getCurrentOrDefaultAcMode(ZoneStateProvider zoneStateProvider) throws IOException, ApiException {
142         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
143
144         return zoneSetting.getMode() != null ? zoneSetting.getMode() : DEFAULT_MODE;
145     }
146
147     private TemperatureObject getCurrentOrDefaultTemperature(ZoneStateProvider zoneStateProvider,
148             TemperatureRange temperatureRanges) throws IOException, ApiException {
149         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
150
151         Float defaultTemperature = temperatureUnit == TemperatureUnit.FAHRENHEIT ? DEFAULT_TEMPERATURE_F
152                 : DEFAULT_TEMPERATURE_C;
153         Float temperature = (zoneSetting != null && zoneSetting.getTemperature() != null)
154                 ? getTemperatureInUnit(zoneSetting.getTemperature(), temperatureUnit)
155                 : defaultTemperature;
156         IntRange temperatureRange = temperatureUnit == TemperatureUnit.FAHRENHEIT ? temperatureRanges.getFahrenheit()
157                 : temperatureRanges.getCelsius();
158
159         Float finalTemperature = temperatureRange.getMax() >= temperature && temperatureRange.getMin() <= temperature
160                 ? temperature
161                 : temperatureRange.getMax();
162
163         return temperature(finalTemperature, temperatureUnit);
164     }
165
166     private AcFanSpeed getCurrentOrDefaultFanSpeed(ZoneStateProvider zoneStateProvider, List<AcFanSpeed> fanSpeeds)
167             throws IOException, ApiException {
168         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
169
170         if (zoneSetting.getFanSpeed() != null && fanSpeeds.contains(zoneSetting.getFanSpeed())) {
171             return zoneSetting.getFanSpeed();
172         }
173
174         return fanSpeeds.get(0);
175     }
176
177     private Power getCurrentOrDefaultSwing(ZoneStateProvider zoneStateProvider, List<Power> swings)
178             throws IOException, ApiException {
179         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
180
181         if (zoneSetting.getSwing() != null && swings.contains(zoneSetting.getSwing())) {
182             return zoneSetting.getSwing();
183         }
184
185         return swings.get(0);
186     }
187
188     private Power getCurrentOrDefaultLight(ZoneStateProvider zoneStateProvider, List<Power> lights)
189             throws IOException, ApiException {
190         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
191
192         if (zoneSetting.getLight() != null && lights.contains(zoneSetting.getLight())) {
193             return zoneSetting.getLight();
194         }
195
196         return lights.get(0);
197     }
198
199     private ACFanLevel getCurrentOrDefaultFanLevel(ZoneStateProvider zoneStateProvider, List<ACFanLevel> fanLevels)
200             throws IOException, ApiException {
201         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
202
203         if (zoneSetting.getFanLevel() != null && fanLevels.contains(zoneSetting.getFanLevel())) {
204             return zoneSetting.getFanLevel();
205         }
206
207         return fanLevels.get(0);
208     }
209
210     private ACHorizontalSwing getCurrentOrDefaultHorizontalSwing(ZoneStateProvider zoneStateProvider,
211             List<ACHorizontalSwing> horizontalSwings) throws IOException, ApiException {
212         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
213
214         if (zoneSetting.getHorizontalSwing() != null && horizontalSwings.contains(zoneSetting.getHorizontalSwing())) {
215             return zoneSetting.getHorizontalSwing();
216         }
217
218         return horizontalSwings.get(0);
219     }
220
221     private ACVerticalSwing getCurrentOrDefaultVerticalSwing(ZoneStateProvider zoneStateProvider,
222             List<ACVerticalSwing> verticalSwings) throws IOException, ApiException {
223         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
224
225         if (zoneSetting.getVerticalSwing() != null && verticalSwings.contains(zoneSetting.getVerticalSwing())) {
226             return zoneSetting.getVerticalSwing();
227         }
228
229         return verticalSwings.get(0);
230     }
231
232     private CoolingZoneSetting coolingSetting(boolean powerOn) {
233         CoolingZoneSetting setting = new CoolingZoneSetting();
234         setting.setType(TadoSystemType.AIR_CONDITIONING);
235         setting.setPower(powerOn ? Power.ON : Power.OFF);
236         return setting;
237     }
238 }