2 * Copyright (c) 2010-2024 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);
63 } else if (CHANNEL_COMFORT_MODE_STATE.equals(channelId)) {
64 setComfortMode(onOffState);
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);
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();
93 return station != null && device != null && system != null
94 ? new ControllerData(device, system, station, heatingChannels, hotWaterChannels)
98 private State getHeatingOverride() {
99 return OnOffType.from("ON".equalsIgnoreCase(getData().system.getHeatingButtonOverrideState()));
102 private State getRSSI() {
103 return new DecimalType(getData().station.getRSSI().getCurrent());
106 private State getWiserSignalStrength() {
107 return new StringType(getData().device.getDisplayedSignalStrength());
110 private State getSignalStrength() {
111 return SignalStrength.toSignalStrength(getData().device.getDisplayedSignalStrength());
114 private State getHeatChannel1Demand() {
115 return getData().heatingChannels.size() >= 1
116 ? new QuantityType<>(getData().heatingChannels.get(0).getPercentageDemand(), Units.PERCENT)
120 private State getHeatChannel2Demand() {
121 return getData().heatingChannels.size() >= 2
122 ? new QuantityType<>(getData().heatingChannels.get(1).getPercentageDemand(), Units.PERCENT)
126 private State getHeatChannel1DemandState() {
127 return OnOffType.from(getData().heatingChannels.size() >= 1
128 && "ON".equalsIgnoreCase(getData().heatingChannels.get(0).getHeatingRelayState()));
131 private State getHeatChannel2DemandState() {
132 return OnOffType.from(getData().heatingChannels.size() >= 2
133 && "ON".equalsIgnoreCase(getData().heatingChannels.get(1).getHeatingRelayState()));
136 private State getAwayModeState() {
137 return OnOffType.from(getData().system.getOverrideType() != null
138 && "AWAY".equalsIgnoreCase(getData().system.getOverrideType()));
141 private State getEcoModeState() {
142 return OnOffType.from(getData().system.getEcoModeEnabled() != null && getData().system.getEcoModeEnabled());
145 private State getComfortModeState() {
147 .from(getData().system.getComfortModeEnabled() != null && getData().system.getComfortModeEnabled());
150 private void setAwayMode(final Boolean awayMode) throws DraytonWiserApiException {
151 getApi().setAwayMode(awayMode);
154 private void setEcoMode(final Boolean ecoMode) throws DraytonWiserApiException {
155 getApi().setEcoMode(ecoMode);
158 private void setComfortMode(final Boolean comfortMode) throws DraytonWiserApiException {
159 getApi().setComfortMode(comfortMode);
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;
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;