2 * Copyright (c) 2010-2023 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.haywardomnilogic.internal.handler;
15 import java.math.BigDecimal;
16 import java.util.ArrayList;
17 import java.util.List;
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
21 import org.openhab.binding.haywardomnilogic.internal.HaywardException;
22 import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
23 import org.openhab.core.library.types.OnOffType;
24 import org.openhab.core.thing.Bridge;
25 import org.openhab.core.thing.Channel;
26 import org.openhab.core.thing.ChannelUID;
27 import org.openhab.core.thing.Thing;
28 import org.openhab.core.thing.ThingStatus;
29 import org.openhab.core.thing.ThingStatusDetail;
30 import org.openhab.core.types.Command;
31 import org.openhab.core.types.RefreshType;
32 import org.openhab.core.types.StateDescriptionFragment;
33 import org.openhab.core.types.StateDescriptionFragmentBuilder;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
38 * The Virtual Heater Handler
40 * @author Matt Myers - Initial contribution
43 public class HaywardVirtualHeaterHandler extends HaywardThingHandler {
44 private final Logger logger = LoggerFactory.getLogger(HaywardVirtualHeaterHandler.class);
46 public HaywardVirtualHeaterHandler(Thing thing) {
51 public void initialize() {
53 setStateDescriptions();
54 updateStatus(ThingStatus.ONLINE);
55 } catch (HaywardException e) {
56 updateStatus(ThingStatus.OFFLINE);
61 public void setStateDescriptions() throws HaywardException {
62 Bridge bridge = getBridge();
64 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
65 if (bridgehandler != null) {
66 // Set heater min and max speeds
67 Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT);
69 StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
70 .withMinimum(new BigDecimal(getThing().getProperties()
71 .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP)))
72 .withMaximum(new BigDecimal(getThing().getProperties()
73 .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP)))
75 bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
82 public void getTelemetry(String xmlResponse) throws HaywardException {
83 List<String> systemIDs = new ArrayList<>();
84 List<String> data = new ArrayList<>();
86 Bridge bridge = getBridge();
88 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
89 if (bridgehandler != null) {
90 systemIDs = bridgehandler.evaluateXPath("//VirtualHeater/@systemId", xmlResponse);
91 String thingSystemID = getThing().getUID().getId();
92 for (int i = 0; i < systemIDs.size(); i++) {
93 if (systemIDs.get(i).equals(thingSystemID)) {
94 data = bridgehandler.evaluateXPath("//VirtualHeater/@Current-Set-Point", xmlResponse);
95 updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT, data.get(i));
97 data = bridgehandler.evaluateXPath("//VirtualHeater/@enable", xmlResponse);
98 if (data.get(i).equals("yes")) {
99 updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "1");
100 } else if (data.get(i).equals("no")) {
101 updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "0");
105 this.updateStatus(ThingStatus.ONLINE);
107 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
113 public void handleCommand(ChannelUID channelUID, Command command) {
114 if ((command instanceof RefreshType)) {
118 String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
119 String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
120 String heaterMinSetTemp = getThing().getProperties()
121 .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP);
122 String heaterMaxSetTemp = getThing().getProperties()
123 .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP);
125 Bridge bridge = getBridge();
126 if (bridge != null) {
127 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
128 if (bridgehandler != null) {
129 String cmdString = this.cmdToString(command);
130 String cmdURL = null;
132 if (command == OnOffType.ON) {
134 } else if (command == OnOffType.OFF) {
139 switch (channelUID.getId()) {
140 case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE:
141 cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
142 + "<Name>SetHeaterEnable</Name><Parameters>"
143 + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
144 + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
145 + bridgehandler.account.mspSystemID + "</Parameter>"
146 + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
147 + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
148 + "<Parameter name=\"Enabled\" dataType=\"bool\">" + cmdString + "</Parameter>"
149 + "</Parameters></Request>";
152 case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT:
153 if (heaterMinSetTemp != null && heaterMaxSetTemp != null) {
154 if (Integer.parseInt(cmdString) < Integer.parseInt(heaterMinSetTemp)) {
155 cmdString = heaterMinSetTemp;
156 } else if (Integer.parseInt(cmdString) > Integer.parseInt(heaterMaxSetTemp)) {
157 cmdString = heaterMaxSetTemp;
161 cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
162 + "<Name>SetUIHeaterCmd</Name><Parameters>"
163 + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
164 + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
165 + bridgehandler.account.mspSystemID + "</Parameter>"
166 + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
167 + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
168 + "<Parameter name=\"Temp\" dataType=\"int\">" + cmdString + "</Parameter>"
169 + "</Parameters></Request>";
172 logger.warn("haywardCommand Unsupported type {}", channelUID);
176 // *****Send Command to Hayward server
177 String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
178 String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
181 if (!("0".equals(status))) {
182 logger.debug("haywardCommand XML response: {}", xmlResponse);
185 } catch (HaywardException e) {
186 logger.debug("Unable to send command to Hayward's server {}:{}:{}",
187 bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
188 } catch (InterruptedException e) {
191 this.updateStatus(ThingStatus.ONLINE);
193 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);