]> git.basschouten.com Git - openhab-addons.git/blob
16d4bb947aa13b5bf031654a176d845c95c20dfc
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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;
14
15 import java.io.IOException;
16
17 import org.eclipse.jdt.annotation.NonNullByDefault;
18 import org.openhab.binding.tado.internal.TadoBindingConstants.FanLevel;
19 import org.openhab.binding.tado.internal.TadoBindingConstants.FanSpeed;
20 import org.openhab.binding.tado.internal.TadoBindingConstants.HorizontalSwing;
21 import org.openhab.binding.tado.internal.TadoBindingConstants.HvacMode;
22 import org.openhab.binding.tado.internal.TadoBindingConstants.OperationMode;
23 import org.openhab.binding.tado.internal.TadoBindingConstants.VerticalSwing;
24 import org.openhab.binding.tado.internal.api.ApiException;
25 import org.openhab.binding.tado.internal.api.model.GenericZoneSetting;
26 import org.openhab.binding.tado.internal.api.model.Overlay;
27 import org.openhab.binding.tado.internal.api.model.OverlayTerminationCondition;
28 import org.openhab.binding.tado.internal.api.model.OverlayTerminationConditionType;
29 import org.openhab.binding.tado.internal.builder.TerminationConditionBuilder;
30 import org.openhab.binding.tado.internal.builder.ZoneSettingsBuilder;
31 import org.openhab.binding.tado.internal.builder.ZoneStateProvider;
32 import org.openhab.binding.tado.internal.handler.TadoZoneHandler;
33 import org.openhab.core.thing.Thing;
34 import org.openhab.core.thing.binding.ThingHandler;
35
36 /**
37  * Builder for incremental creation of zone overlays.
38  *
39  * @author Dennis Frommknecht - Initial contribution
40  */
41 @NonNullByDefault
42 public class TadoHvacChange {
43
44     private final TadoZoneHandler zoneHandler;
45     private final TerminationConditionBuilder terminationConditionBuilder;
46     private final ZoneSettingsBuilder settingsBuilder;
47
48     private boolean followSchedule = false;
49
50     public TadoHvacChange(Thing zoneThing) {
51         ThingHandler handler = zoneThing.getHandler();
52         if (!(handler instanceof TadoZoneHandler)) {
53             throw new IllegalArgumentException("TadoZoneThing expected, but instead got " + zoneThing);
54         }
55         zoneHandler = (TadoZoneHandler) handler;
56         terminationConditionBuilder = TerminationConditionBuilder.of(zoneHandler);
57         settingsBuilder = ZoneSettingsBuilder.of(zoneHandler);
58     }
59
60     public TadoHvacChange withOperationMode(OperationMode operationMode) {
61         switch (operationMode) {
62             case SCHEDULE:
63                 return followSchedule();
64             case MANUAL:
65                 return activeForever();
66             case TIMER:
67                 return activeForMinutes(0);
68             case UNTIL_CHANGE:
69                 return activeUntilChange();
70         }
71         return this;
72     }
73
74     public TadoHvacChange followSchedule() {
75         followSchedule = true;
76         return this;
77     }
78
79     public TadoHvacChange activeForever() {
80         terminationConditionBuilder.withTerminationType(OverlayTerminationConditionType.MANUAL);
81         return this;
82     }
83
84     public TadoHvacChange activeUntilChange() {
85         terminationConditionBuilder.withTerminationType(OverlayTerminationConditionType.TADO_MODE);
86         return this;
87     }
88
89     public TadoHvacChange activeForMinutes(int minutes) {
90         terminationConditionBuilder.withTerminationType(OverlayTerminationConditionType.TIMER);
91         terminationConditionBuilder.withTimerDurationInSeconds(minutes * 60);
92         return this;
93     }
94
95     public TadoHvacChange withTemperature(float temperatureValue) {
96         settingsBuilder.withTemperature(temperatureValue, zoneHandler.getTemperatureUnit());
97         return this;
98     }
99
100     public TadoHvacChange withHvacMode(HvacMode mode) {
101         settingsBuilder.withMode(mode);
102         return this;
103     }
104
105     public TadoHvacChange withHvacMode(String mode) {
106         return withHvacMode(HvacMode.valueOf(mode.toUpperCase()));
107     }
108
109     public TadoHvacChange withSwing(boolean swingOn) {
110         settingsBuilder.withSwing(swingOn);
111         return this;
112     }
113
114     public TadoHvacChange withFanSpeed(FanSpeed fanSpeed) {
115         settingsBuilder.withFanSpeed(fanSpeed);
116         return this;
117     }
118
119     public TadoHvacChange withFanSpeed(String fanSpeed) {
120         withFanSpeed(FanSpeed.valueOf(fanSpeed.toUpperCase()));
121         return this;
122     }
123
124     public TadoHvacChange withFanLevel(FanLevel fanLevel) {
125         settingsBuilder.withFanLevel(fanLevel);
126         return this;
127     }
128
129     public TadoHvacChange withHorizontalSwing(HorizontalSwing horizontalSwing) {
130         settingsBuilder.withHorizontalSwing(horizontalSwing);
131         return this;
132     }
133
134     public TadoHvacChange withVerticalSwing(VerticalSwing verticalSwing) {
135         settingsBuilder.withVerticalSwing(verticalSwing);
136         return this;
137     }
138
139     public void apply() throws IOException, ApiException {
140         if (followSchedule) {
141             zoneHandler.removeOverlay();
142         } else {
143             Overlay overlay = buildOverlay();
144             zoneHandler.setOverlay(overlay);
145         }
146     }
147
148     private Overlay buildOverlay() throws IOException, ApiException {
149         ZoneStateProvider zoneStateProvider = new ZoneStateProvider(zoneHandler);
150         OverlayTerminationCondition terminationCondition = terminationConditionBuilder.build(zoneStateProvider);
151         GenericZoneSetting setting = settingsBuilder.build(zoneStateProvider, zoneHandler.getZoneCapabilities());
152
153         Overlay overlay = new Overlay();
154         overlay.setTermination(terminationCondition);
155         overlay.setSetting(setting);
156
157         return overlay;
158     }
159
160     public TadoHvacChange withLight(boolean lightOn) {
161         settingsBuilder.withLight(lightOn);
162         return this;
163     }
164 }