]> git.basschouten.com Git - openhab-addons.git/blob
6a0e9831d36b0768804144ba71736d062b1ab288
[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.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.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;
35
36 /**
37  *
38  *
39  * @author Dennis Frommknecht - Initial contribution
40  */
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;
45
46     @Override
47     public GenericZoneSetting build(ZoneStateProvider zoneStateProvider, GenericZoneCapabilities genericCapabilities)
48             throws IOException, ApiException {
49         if (mode == HvacMode.OFF) {
50             return coolingSetting(false);
51         }
52
53         CoolingZoneSetting setting = coolingSetting(true);
54         setting.setMode(getAcMode(mode));
55         if (temperature != null) {
56             setting.setTemperature(temperature(temperature, temperatureUnit));
57         }
58
59         if (swing != null) {
60             setting.setSwing(swing ? Power.ON : Power.OFF);
61         }
62
63         if (fanSpeed != null) {
64             setting.setFanSpeed(getAcFanSpeed(fanSpeed));
65         }
66
67         addMissingSettingParts(zoneStateProvider, genericCapabilities, setting);
68
69         return setting;
70     }
71
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);
77         }
78
79         AcModeCapabilities capabilities = getModeCapabilities((AirConditioningCapabilities) genericCapabilities,
80                 setting.getMode());
81
82         if (capabilities.getTemperatures() != null && setting.getTemperature() == null) {
83             TemperatureObject targetTemperature = getCurrentOrDefaultTemperature(zoneStateProvider,
84                     capabilities.getTemperatures());
85             setting.setTemperature(targetTemperature);
86         }
87
88         if (capabilities.getFanSpeeds() != null && !capabilities.getFanSpeeds().isEmpty()
89                 && setting.getFanSpeed() == null) {
90             AcFanSpeed fanSpeed = getCurrentOrDefaultFanSpeed(zoneStateProvider, capabilities.getFanSpeeds());
91             setting.setFanSpeed(fanSpeed);
92         }
93
94         if (capabilities.getSwings() != null && !capabilities.getSwings().isEmpty() && setting.getSwing() == null) {
95             Power swing = getCurrentOrDefaultSwing(zoneStateProvider, capabilities.getSwings());
96             setting.setSwing(swing);
97         }
98     }
99
100     private AcMode getCurrentOrDefaultAcMode(ZoneStateProvider zoneStateProvider) throws IOException, ApiException {
101         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
102
103         return zoneSetting.getMode() != null ? zoneSetting.getMode() : DEFAULT_MODE;
104     }
105
106     private TemperatureObject getCurrentOrDefaultTemperature(ZoneStateProvider zoneStateProvider,
107             TemperatureRange temperatureRanges) throws IOException, ApiException {
108         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
109
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();
117
118         Float finalTemperature = temperatureRange.getMax() >= temperature && temperatureRange.getMin() <= temperature
119                 ? temperature
120                 : temperatureRange.getMax();
121
122         return temperature(finalTemperature, temperatureUnit);
123     }
124
125     private AcFanSpeed getCurrentOrDefaultFanSpeed(ZoneStateProvider zoneStateProvider, List<AcFanSpeed> fanSpeeds)
126             throws IOException, ApiException {
127         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
128
129         if (zoneSetting.getFanSpeed() != null && fanSpeeds.contains(zoneSetting.getFanSpeed())) {
130             return zoneSetting.getFanSpeed();
131         }
132
133         return fanSpeeds.get(0);
134     }
135
136     private Power getCurrentOrDefaultSwing(ZoneStateProvider zoneStateProvider, List<Power> swings)
137             throws IOException, ApiException {
138         CoolingZoneSetting zoneSetting = (CoolingZoneSetting) zoneStateProvider.getZoneState().getSetting();
139
140         if (zoneSetting.getSwing() != null && swings.contains(zoneSetting.getSwing())) {
141             return zoneSetting.getSwing();
142         }
143
144         return swings.get(0);
145     }
146
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);
151         return setting;
152     }
153 }