]> git.basschouten.com Git - openhab-addons.git/blob
a15779fa0cee1042c1f642b22557edb2f78639c4
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 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             }
64         }
65     }
66
67     @Override
68     protected void refresh() {
69         updateState(CHANNEL_HEATING_OVERRIDE, this::getHeatingOverride);
70         updateState(CHANNEL_CURRENT_SIGNAL_RSSI, this::getRSSI);
71         updateState(CHANNEL_CURRENT_WISER_SIGNAL_STRENGTH, this::getWiserSignalStrength);
72         updateState(CHANNEL_CURRENT_SIGNAL_STRENGTH, this::getSignalStrength);
73         updateState(CHANNEL_HEATCHANNEL_1_DEMAND, this::getHeatChannel1Demand);
74         updateState(CHANNEL_HEATCHANNEL_2_DEMAND, this::getHeatChannel2Demand);
75         updateState(CHANNEL_HEATCHANNEL_1_DEMAND_STATE, this::getHeatChannel1DemandState);
76         updateState(CHANNEL_HEATCHANNEL_2_DEMAND_STATE, this::getHeatChannel2DemandState);
77         updateState(CHANNEL_AWAY_MODE_STATE, this::getAwayModeState);
78         updateState(CHANNEL_ECO_MODE_STATE, this::getEcoModeState);
79     }
80
81     @Override
82     protected @Nullable ControllerData collectData(final DraytonWiserDTO domainDTOProxy)
83             throws DraytonWiserApiException {
84         final StationDTO station = getApi().getStation();
85         final DeviceDTO device = domainDTOProxy.getExtendedDeviceProperties(0);
86         final SystemDTO system = domainDTOProxy.getSystem();
87         final List<HeatingChannelDTO> heatingChannels = domainDTOProxy.getHeatingChannels();
88         final List<HotWaterDTO> hotWaterChannels = domainDTOProxy.getHotWater();
89
90         return station != null && device != null && system != null
91                 ? new ControllerData(device, system, station, heatingChannels, hotWaterChannels)
92                 : null;
93     }
94
95     private State getHeatingOverride() {
96         return OnOffType.from("ON".equalsIgnoreCase(getData().system.getHeatingButtonOverrideState()));
97     }
98
99     private State getRSSI() {
100         return new DecimalType(getData().station.getRSSI().getCurrent());
101     }
102
103     private State getWiserSignalStrength() {
104         return new StringType(getData().device.getDisplayedSignalStrength());
105     }
106
107     private State getSignalStrength() {
108         return SignalStrength.toSignalStrength(getData().device.getDisplayedSignalStrength());
109     }
110
111     private State getHeatChannel1Demand() {
112         return getData().heatingChannels.size() >= 1
113                 ? new QuantityType<>(getData().heatingChannels.get(0).getPercentageDemand(), Units.PERCENT)
114                 : UnDefType.UNDEF;
115     }
116
117     private State getHeatChannel2Demand() {
118         return getData().heatingChannels.size() >= 2
119                 ? new QuantityType<>(getData().heatingChannels.get(1).getPercentageDemand(), Units.PERCENT)
120                 : UnDefType.UNDEF;
121     }
122
123     private State getHeatChannel1DemandState() {
124         return OnOffType.from(getData().heatingChannels.size() >= 1
125                 && "ON".equalsIgnoreCase(getData().heatingChannels.get(0).getHeatingRelayState()));
126     }
127
128     private State getHeatChannel2DemandState() {
129         return OnOffType.from(getData().heatingChannels.size() >= 2
130                 && "ON".equalsIgnoreCase(getData().heatingChannels.get(1).getHeatingRelayState()));
131     }
132
133     private State getAwayModeState() {
134         return OnOffType.from(getData().system.getOverrideType() != null
135                 && "AWAY".equalsIgnoreCase(getData().system.getOverrideType()));
136     }
137
138     private State getEcoModeState() {
139         return OnOffType.from(getData().system.getEcoModeEnabled() != null && getData().system.getEcoModeEnabled());
140     }
141
142     private void setAwayMode(final Boolean awayMode) throws DraytonWiserApiException {
143         getApi().setAwayMode(awayMode);
144     }
145
146     private void setEcoMode(final Boolean ecoMode) throws DraytonWiserApiException {
147         getApi().setEcoMode(ecoMode);
148     }
149
150     static class ControllerData {
151         public final DeviceDTO device;
152         public final SystemDTO system;
153         public final StationDTO station;
154         public final List<HeatingChannelDTO> heatingChannels;
155         public final List<HotWaterDTO> hotWaterChannels;
156
157         public ControllerData(final DeviceDTO device, final SystemDTO system, final StationDTO station,
158                 final List<HeatingChannelDTO> heatingChannels, final List<HotWaterDTO> hotWaterChannels) {
159             this.device = device;
160             this.system = system;
161             this.station = station;
162             this.heatingChannels = heatingChannels;
163             this.hotWaterChannels = hotWaterChannels;
164         }
165     }
166 }