2 * Copyright (c) 2010-2020 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.draytonwiser.internal.handler;
15 import static org.openhab.binding.draytonwiser.internal.DraytonWiserBindingConstants.*;
17 import java.util.List;
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;
41 * The {@link ControllerHandler} is responsible for handling commands, which are
42 * sent to one of the channels.
44 * @author Andrew Schofield - Initial contribution
45 * @author Hilbrand Bouwkamp - Simplified handler to handle null data
48 public class ControllerHandler extends DraytonWiserThingHandler<ControllerData> {
50 public ControllerHandler(final Thing thing) {
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);
59 if (CHANNEL_AWAY_MODE_STATE.equals(channelId)) {
60 setAwayMode(onOffState);
61 } else if (CHANNEL_ECO_MODE_STATE.equals(channelId)) {
62 setEcoMode(onOffState);
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);
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();
90 return station != null && device != null && system != null
91 ? new ControllerData(device, system, station, heatingChannels, hotWaterChannels)
95 private State getHeatingOverride() {
96 return OnOffType.from("ON".equalsIgnoreCase(getData().system.getHeatingButtonOverrideState()));
99 private State getRSSI() {
100 return new DecimalType(getData().station.getRSSI().getCurrent());
103 private State getWiserSignalStrength() {
104 return new StringType(getData().device.getDisplayedSignalStrength());
107 private State getSignalStrength() {
108 return SignalStrength.toSignalStrength(getData().device.getDisplayedSignalStrength());
111 private State getHeatChannel1Demand() {
112 return getData().heatingChannels.size() >= 1
113 ? new QuantityType<>(getData().heatingChannels.get(0).getPercentageDemand(), Units.PERCENT)
117 private State getHeatChannel2Demand() {
118 return getData().heatingChannels.size() >= 2
119 ? new QuantityType<>(getData().heatingChannels.get(1).getPercentageDemand(), Units.PERCENT)
123 private State getHeatChannel1DemandState() {
124 return OnOffType.from(getData().heatingChannels.size() >= 1
125 && "ON".equalsIgnoreCase(getData().heatingChannels.get(0).getHeatingRelayState()));
128 private State getHeatChannel2DemandState() {
129 return OnOffType.from(getData().heatingChannels.size() >= 2
130 && "ON".equalsIgnoreCase(getData().heatingChannels.get(1).getHeatingRelayState()));
133 private State getAwayModeState() {
134 return OnOffType.from(getData().system.getOverrideType() != null
135 && "AWAY".equalsIgnoreCase(getData().system.getOverrideType()));
138 private State getEcoModeState() {
139 return OnOffType.from(getData().system.getEcoModeEnabled() != null && getData().system.getEcoModeEnabled());
142 private void setAwayMode(final Boolean awayMode) throws DraytonWiserApiException {
143 getApi().setAwayMode(awayMode);
146 private void setEcoMode(final Boolean ecoMode) throws DraytonWiserApiException {
147 getApi().setEcoMode(ecoMode);
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;
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;