2 * Copyright (c) 2010-2022 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.tado.internal.builder;
15 import static org.openhab.binding.tado.internal.api.TadoApiTypeUtils.*;
17 import java.io.IOException;
18 import java.util.List;
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;
42 * @author Dennis Frommknecht - Initial contribution
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;
50 public GenericZoneSetting build(ZoneStateProvider zoneStateProvider, GenericZoneCapabilities genericCapabilities)
51 throws IOException, ApiException {
52 if (mode == HvacMode.OFF) {
53 return coolingSetting(false);
56 CoolingZoneSetting setting = coolingSetting(true);
57 setting.setMode(getAcMode(mode));
58 if (temperature != null) {
59 setting.setTemperature(temperature(temperature, temperatureUnit));
63 setting.setSwing(swing ? Power.ON : Power.OFF);
67 setting.setLight(light ? Power.ON : Power.OFF);
70 if (fanSpeed != null) {
71 setting.setFanSpeed(getAcFanSpeed(fanSpeed));
74 if (fanLevel != null) {
75 setting.setFanLevel(getFanLevel(fanLevel));
78 if (horizontalSwing != null) {
79 setting.setHorizontalSwing(getHorizontalSwing(horizontalSwing));
82 if (verticalSwing != null) {
83 setting.setVerticalSwing(getVerticalSwing(verticalSwing));
86 addMissingSettingParts(zoneStateProvider, genericCapabilities, setting);
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);
98 AcModeCapabilities capabilities = getModeCapabilities((AirConditioningCapabilities) genericCapabilities,
101 TemperatureRange temperatures = capabilities.getTemperatures();
102 if (temperatures != null && setting.getTemperature() == null) {
103 setting.setTemperature(getCurrentOrDefaultTemperature(zoneStateProvider, temperatures));
106 List<AcFanSpeed> fanSpeeds = capabilities.getFanSpeeds();
107 if (fanSpeeds != null && !fanSpeeds.isEmpty() && setting.getFanSpeed() == null) {
108 setting.setFanSpeed(getCurrentOrDefaultFanSpeed(zoneStateProvider, fanSpeeds));
111 List<Power> swings = capabilities.getSwings();
112 if (swings != null && !swings.isEmpty() && setting.getSwing() == null) {
113 setting.setSwing(getCurrentOrDefaultSwing(zoneStateProvider, swings));
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));
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));
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));
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));
141 private AcMode getCurrentOrDefaultAcMode(ZoneStateProvider zoneStateProvider) throws IOException, ApiException {
142 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
144 return zoneSetting.getMode() != null ? zoneSetting.getMode() : DEFAULT_MODE;
147 private TemperatureObject getCurrentOrDefaultTemperature(ZoneStateProvider zoneStateProvider,
148 TemperatureRange temperatureRanges) throws IOException, ApiException {
149 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
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();
159 Float finalTemperature = temperatureRange.getMax() >= temperature && temperatureRange.getMin() <= temperature
161 : temperatureRange.getMax();
163 return temperature(finalTemperature, temperatureUnit);
166 private AcFanSpeed getCurrentOrDefaultFanSpeed(ZoneStateProvider zoneStateProvider, List<AcFanSpeed> fanSpeeds)
167 throws IOException, ApiException {
168 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
170 if (zoneSetting.getFanSpeed() != null && fanSpeeds.contains(zoneSetting.getFanSpeed())) {
171 return zoneSetting.getFanSpeed();
174 return fanSpeeds.get(0);
177 private Power getCurrentOrDefaultSwing(ZoneStateProvider zoneStateProvider, List<Power> swings)
178 throws IOException, ApiException {
179 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
181 if (zoneSetting.getSwing() != null && swings.contains(zoneSetting.getSwing())) {
182 return zoneSetting.getSwing();
185 return swings.get(0);
188 private Power getCurrentOrDefaultLight(ZoneStateProvider zoneStateProvider, List<Power> lights)
189 throws IOException, ApiException {
190 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
192 if (zoneSetting.getLight() != null && lights.contains(zoneSetting.getLight())) {
193 return zoneSetting.getLight();
196 return lights.get(0);
199 private ACFanLevel getCurrentOrDefaultFanLevel(ZoneStateProvider zoneStateProvider, List<ACFanLevel> fanLevels)
200 throws IOException, ApiException {
201 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
203 if (zoneSetting.getFanLevel() != null && fanLevels.contains(zoneSetting.getFanLevel())) {
204 return zoneSetting.getFanLevel();
207 return fanLevels.get(0);
210 private ACHorizontalSwing getCurrentOrDefaultHorizontalSwing(ZoneStateProvider zoneStateProvider,
211 List<ACHorizontalSwing> horizontalSwings) throws IOException, ApiException {
212 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
214 if (zoneSetting.getHorizontalSwing() != null && horizontalSwings.contains(zoneSetting.getHorizontalSwing())) {
215 return zoneSetting.getHorizontalSwing();
218 return horizontalSwings.get(0);
221 private ACVerticalSwing getCurrentOrDefaultVerticalSwing(ZoneStateProvider zoneStateProvider,
222 List<ACVerticalSwing> verticalSwings) throws IOException, ApiException {
223 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
225 if (zoneSetting.getVerticalSwing() != null && verticalSwings.contains(zoneSetting.getVerticalSwing())) {
226 return zoneSetting.getVerticalSwing();
229 return verticalSwings.get(0);
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);