]> git.basschouten.com Git - openhab-addons.git/blob
6abf84e7f982937f83581af197bdf4a1b95e6cb8
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 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.draytonwiser.internal.handler;
14
15 import static org.openhab.binding.draytonwiser.internal.DraytonWiserBindingConstants.*;
16
17 import java.util.List;
18
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.eclipse.jdt.annotation.Nullable;
21 import org.openhab.binding.draytonwiser.internal.DraytonWiserBindingConstants.SignalStrength;
22 import org.openhab.binding.draytonwiser.internal.api.DraytonWiserApiException;
23 import org.openhab.binding.draytonwiser.internal.handler.ControllerHandler.ControllerData;
24 import org.openhab.binding.draytonwiser.internal.model.DeviceDTO;
25 import org.openhab.binding.draytonwiser.internal.model.DraytonWiserDTO;
26 import org.openhab.binding.draytonwiser.internal.model.HeatingChannelDTO;
27 import org.openhab.binding.draytonwiser.internal.model.HotWaterDTO;
28 import org.openhab.binding.draytonwiser.internal.model.StationDTO;
29 import org.openhab.binding.draytonwiser.internal.model.SystemDTO;
30 import org.openhab.core.library.types.DecimalType;
31 import org.openhab.core.library.types.OnOffType;
32 import org.openhab.core.library.types.QuantityType;
33 import org.openhab.core.library.types.StringType;
34 import org.openhab.core.library.unit.Units;
35 import org.openhab.core.thing.Thing;
36 import org.openhab.core.types.Command;
37 import org.openhab.core.types.State;
38 import org.openhab.core.types.UnDefType;
39
40 /**
41  * The {@link ControllerHandler} is responsible for handling commands, which are
42  * sent to one of the channels.
43  *
44  * @author Andrew Schofield - Initial contribution
45  * @author Hilbrand Bouwkamp - Simplified handler to handle null data
46  */
47 @NonNullByDefault
48 public class ControllerHandler extends DraytonWiserThingHandler<ControllerData> {
49
50     public ControllerHandler(final Thing thing) {
51         super(thing);
52     }
53
54     @Override
55     protected void handleCommand(final String channelId, final Command command) throws DraytonWiserApiException {
56         if (command instanceof OnOffType) {
57             final boolean onOffState = OnOffType.ON.equals(command);
58
59             if (CHANNEL_AWAY_MODE_STATE.equals(channelId)) {
60                 setAwayMode(onOffState);
61             } else if (CHANNEL_ECO_MODE_STATE.equals(channelId)) {
62                 setEcoMode(onOffState);
63             } else if (CHANNEL_COMFORT_MODE_STATE.equals(channelId)) {
64                 setComfortMode(onOffState);
65             }
66         }
67     }
68
69     @Override
70     protected void refresh() {
71         updateState(CHANNEL_HEATING_OVERRIDE, this::getHeatingOverride);
72         updateState(CHANNEL_CURRENT_SIGNAL_RSSI, this::getRSSI);
73         updateState(CHANNEL_CURRENT_WISER_SIGNAL_STRENGTH, this::getWiserSignalStrength);
74         updateState(CHANNEL_CURRENT_SIGNAL_STRENGTH, this::getSignalStrength);
75         updateState(CHANNEL_HEATCHANNEL_1_DEMAND, this::getHeatChannel1Demand);
76         updateState(CHANNEL_HEATCHANNEL_2_DEMAND, this::getHeatChannel2Demand);
77         updateState(CHANNEL_HEATCHANNEL_1_DEMAND_STATE, this::getHeatChannel1DemandState);
78         updateState(CHANNEL_HEATCHANNEL_2_DEMAND_STATE, this::getHeatChannel2DemandState);
79         updateState(CHANNEL_AWAY_MODE_STATE, this::getAwayModeState);
80         updateState(CHANNEL_ECO_MODE_STATE, this::getEcoModeState);
81         updateState(CHANNEL_COMFORT_MODE_STATE, this::getComfortModeState);
82     }
83
84     @Override
85     protected @Nullable ControllerData collectData(final DraytonWiserDTO domainDTOProxy)
86             throws DraytonWiserApiException {
87         final StationDTO station = getApi().getStation();
88         final DeviceDTO device = domainDTOProxy.getExtendedDeviceProperties(0);
89         final SystemDTO system = domainDTOProxy.getSystem();
90         final List<HeatingChannelDTO> heatingChannels = domainDTOProxy.getHeatingChannels();
91         final List<HotWaterDTO> hotWaterChannels = domainDTOProxy.getHotWater();
92
93         return station != null && device != null && system != null
94                 ? new ControllerData(device, system, station, heatingChannels, hotWaterChannels)
95                 : null;
96     }
97
98     private State getHeatingOverride() {
99         return OnOffType.from("ON".equalsIgnoreCase(getData().system.getHeatingButtonOverrideState()));
100     }
101
102     private State getRSSI() {
103         return new DecimalType(getData().station.getRSSI().getCurrent());
104     }
105
106     private State getWiserSignalStrength() {
107         return new StringType(getData().device.getDisplayedSignalStrength());
108     }
109
110     private State getSignalStrength() {
111         return SignalStrength.toSignalStrength(getData().device.getDisplayedSignalStrength());
112     }
113
114     private State getHeatChannel1Demand() {
115         return getData().heatingChannels.size() >= 1
116                 ? new QuantityType<>(getData().heatingChannels.get(0).getPercentageDemand(), Units.PERCENT)
117                 : UnDefType.UNDEF;
118     }
119
120     private State getHeatChannel2Demand() {
121         return getData().heatingChannels.size() >= 2
122                 ? new QuantityType<>(getData().heatingChannels.get(1).getPercentageDemand(), Units.PERCENT)
123                 : UnDefType.UNDEF;
124     }
125
126     private State getHeatChannel1DemandState() {
127         return OnOffType.from(getData().heatingChannels.size() >= 1
128                 && "ON".equalsIgnoreCase(getData().heatingChannels.get(0).getHeatingRelayState()));
129     }
130
131     private State getHeatChannel2DemandState() {
132         return OnOffType.from(getData().heatingChannels.size() >= 2
133                 && "ON".equalsIgnoreCase(getData().heatingChannels.get(1).getHeatingRelayState()));
134     }
135
136     private State getAwayModeState() {
137         return OnOffType.from(getData().system.getOverrideType() != null
138                 && "AWAY".equalsIgnoreCase(getData().system.getOverrideType()));
139     }
140
141     private State getEcoModeState() {
142         return OnOffType.from(getData().system.getEcoModeEnabled() != null && getData().system.getEcoModeEnabled());
143     }
144
145     private State getComfortModeState() {
146         return OnOffType
147                 .from(getData().system.getComfortModeEnabled() != null && getData().system.getComfortModeEnabled());
148     }
149
150     private void setAwayMode(final Boolean awayMode) throws DraytonWiserApiException {
151         getApi().setAwayMode(awayMode);
152     }
153
154     private void setEcoMode(final Boolean ecoMode) throws DraytonWiserApiException {
155         getApi().setEcoMode(ecoMode);
156     }
157
158     private void setComfortMode(final Boolean comfortMode) throws DraytonWiserApiException {
159         getApi().setComfortMode(comfortMode);
160     }
161
162     static class ControllerData {
163         public final DeviceDTO device;
164         public final SystemDTO system;
165         public final StationDTO station;
166         public final List<HeatingChannelDTO> heatingChannels;
167         public final List<HotWaterDTO> hotWaterChannels;
168
169         public ControllerData(final DeviceDTO device, final SystemDTO system, final StationDTO station,
170                 final List<HeatingChannelDTO> heatingChannels, final List<HotWaterDTO> hotWaterChannels) {
171             this.device = device;
172             this.system = system;
173             this.station = station;
174             this.heatingChannels = heatingChannels;
175             this.hotWaterChannels = hotWaterChannels;
176         }
177     }
178 }