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.AcFanSpeed;
24 import org.openhab.binding.tado.internal.api.model.AcMode;
25 import org.openhab.binding.tado.internal.api.model.AcModeCapabilities;
26 import org.openhab.binding.tado.internal.api.model.AirConditioningCapabilities;
27 import org.openhab.binding.tado.internal.api.model.CoolingZoneSetting;
28 import org.openhab.binding.tado.internal.api.model.GenericZoneCapabilities;
29 import org.openhab.binding.tado.internal.api.model.GenericZoneSetting;
30 import org.openhab.binding.tado.internal.api.model.IntRange;
31 import org.openhab.binding.tado.internal.api.model.Power;
32 import org.openhab.binding.tado.internal.api.model.TadoSystemType;
33 import org.openhab.binding.tado.internal.api.model.TemperatureObject;
34 import org.openhab.binding.tado.internal.api.model.TemperatureRange;
39 * @author Dennis Frommknecht - Initial contribution
41 public class AirConditioningZoneSettingsBuilder extends ZoneSettingsBuilder {
42 private static final AcMode DEFAULT_MODE = AcMode.COOL;
43 private static final float DEFAULT_TEMPERATURE_C = 20.0f;
44 private static final float DEFAULT_TEMPERATURE_F = 68.0f;
47 public GenericZoneSetting build(ZoneStateProvider zoneStateProvider, GenericZoneCapabilities genericCapabilities)
48 throws IOException, ApiException {
49 if (mode == HvacMode.OFF) {
50 return coolingSetting(false);
53 CoolingZoneSetting setting = coolingSetting(true);
54 setting.setMode(getAcMode(mode));
55 if (temperature != null) {
56 setting.setTemperature(temperature(temperature, temperatureUnit));
60 setting.setSwing(swing ? Power.ON : Power.OFF);
63 if (fanSpeed != null) {
64 setting.setFanSpeed(getAcFanSpeed(fanSpeed));
67 addMissingSettingParts(zoneStateProvider, genericCapabilities, setting);
72 private void addMissingSettingParts(ZoneStateProvider zoneStateProvider,
73 GenericZoneCapabilities genericCapabilities, CoolingZoneSetting setting) throws IOException, ApiException {
74 if (setting.getMode() == null) {
75 AcMode targetMode = getCurrentOrDefaultAcMode(zoneStateProvider);
76 setting.setMode(targetMode);
79 AcModeCapabilities capabilities = getModeCapabilities((AirConditioningCapabilities) genericCapabilities,
82 if (capabilities.getTemperatures() != null && setting.getTemperature() == null) {
83 TemperatureObject targetTemperature = getCurrentOrDefaultTemperature(zoneStateProvider,
84 capabilities.getTemperatures());
85 setting.setTemperature(targetTemperature);
88 if (capabilities.getFanSpeeds() != null && !capabilities.getFanSpeeds().isEmpty()
89 && setting.getFanSpeed() == null) {
90 AcFanSpeed fanSpeed = getCurrentOrDefaultFanSpeed(zoneStateProvider, capabilities.getFanSpeeds());
91 setting.setFanSpeed(fanSpeed);
94 if (capabilities.getSwings() != null && !capabilities.getSwings().isEmpty() && setting.getSwing() == null) {
95 Power swing = getCurrentOrDefaultSwing(zoneStateProvider, capabilities.getSwings());
96 setting.setSwing(swing);
100 private AcMode getCurrentOrDefaultAcMode(ZoneStateProvider zoneStateProvider) throws IOException, ApiException {
101 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
103 return zoneSetting.getMode() != null ? zoneSetting.getMode() : DEFAULT_MODE;
106 private TemperatureObject getCurrentOrDefaultTemperature(ZoneStateProvider zoneStateProvider,
107 TemperatureRange temperatureRanges) throws IOException, ApiException {
108 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
110 Float defaultTemperature = temperatureUnit == TemperatureUnit.FAHRENHEIT ? DEFAULT_TEMPERATURE_F
111 : DEFAULT_TEMPERATURE_C;
112 Float temperature = (zoneSetting != null && zoneSetting.getTemperature() != null)
113 ? getTemperatureInUnit(zoneSetting.getTemperature(), temperatureUnit)
114 : defaultTemperature;
115 IntRange temperatureRange = temperatureUnit == TemperatureUnit.FAHRENHEIT ? temperatureRanges.getFahrenheit()
116 : temperatureRanges.getCelsius();
118 Float finalTemperature = temperatureRange.getMax() >= temperature && temperatureRange.getMin() <= temperature
120 : temperatureRange.getMax();
122 return temperature(finalTemperature, temperatureUnit);
125 private AcFanSpeed getCurrentOrDefaultFanSpeed(ZoneStateProvider zoneStateProvider, List<AcFanSpeed> fanSpeeds)
126 throws IOException, ApiException {
127 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
129 if (zoneSetting.getFanSpeed() != null && fanSpeeds.contains(zoneSetting.getFanSpeed())) {
130 return zoneSetting.getFanSpeed();
133 return fanSpeeds.get(0);
136 private Power getCurrentOrDefaultSwing(ZoneStateProvider zoneStateProvider, List<Power> swings)
137 throws IOException, ApiException {
138 CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
140 if (zoneSetting.getSwing() != null && swings.contains(zoneSetting.getSwing())) {
141 return zoneSetting.getSwing();
144 return swings.get(0);
147 private CoolingZoneSetting coolingSetting(boolean powerOn) {
148 CoolingZoneSetting setting = new CoolingZoneSetting();
149 setting.setType(TadoSystemType.AIR_CONDITIONING);
150 setting.setPower(powerOn ? Power.ON : Power.OFF);