2 * Copyright (c) 2010-2021 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.util.ArrayList;
16 import java.util.List;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
20 import org.openhab.binding.haywardomnilogic.internal.HaywardException;
21 import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
22 import org.openhab.core.library.types.OnOffType;
23 import org.openhab.core.thing.Bridge;
24 import org.openhab.core.thing.ChannelUID;
25 import org.openhab.core.thing.Thing;
26 import org.openhab.core.thing.ThingStatus;
27 import org.openhab.core.thing.ThingStatusDetail;
28 import org.openhab.core.types.Command;
29 import org.openhab.core.types.RefreshType;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
34 * The Virtual Heater Handler
36 * @author Matt Myers - Initial contribution
39 public class HaywardVirtualHeaterHandler extends HaywardThingHandler {
40 private final Logger logger = LoggerFactory.getLogger(HaywardVirtualHeaterHandler.class);
42 public HaywardVirtualHeaterHandler(Thing thing) {
47 public void getTelemetry(String xmlResponse) throws HaywardException {
48 List<String> systemIDs = new ArrayList<>();
49 List<String> data = new ArrayList<>();
51 Bridge bridge = getBridge();
53 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
54 if (bridgehandler != null) {
55 systemIDs = bridgehandler.evaluateXPath("//VirtualHeater/@systemId", xmlResponse);
56 String thingSystemID = getThing().getUID().getId();
57 for (int i = 0; i < systemIDs.size(); i++) {
58 if (systemIDs.get(i).equals(thingSystemID)) {
59 data = bridgehandler.evaluateXPath("//VirtualHeater/@Current-Set-Point", xmlResponse);
60 updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT, data.get(i));
62 data = bridgehandler.evaluateXPath("//VirtualHeater/@enable", xmlResponse);
63 if (data.get(i).equals("yes")) {
64 updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "1");
65 } else if (data.get(i).equals("no")) {
66 updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "0");
70 this.updateStatus(ThingStatus.ONLINE);
72 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
78 public void handleCommand(ChannelUID channelUID, Command command) {
79 if ((command instanceof RefreshType)) {
83 String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
84 String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
86 Bridge bridge = getBridge();
88 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
89 if (bridgehandler != null) {
90 String cmdString = this.cmdToString(command);
93 if (command == OnOffType.ON) {
95 } else if (command == OnOffType.OFF) {
100 switch (channelUID.getId()) {
101 case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE:
102 cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
103 + "<Name>SetHeaterEnable</Name><Parameters>"
104 + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
105 + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
106 + bridgehandler.account.mspSystemID + "</Parameter>"
107 + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
108 + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
109 + "<Parameter name=\"Enabled\" dataType=\"bool\">" + cmdString + "</Parameter>"
110 + "</Parameters></Request>";
113 case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT:
114 cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
115 + "<Name>SetUIHeaterCmd</Name><Parameters>"
116 + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
117 + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
118 + bridgehandler.account.mspSystemID + "</Parameter>"
119 + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
120 + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
121 + "<Parameter name=\"Temp\" dataType=\"int\">" + cmdString + "</Parameter>"
122 + "</Parameters></Request>";
125 logger.warn("haywardCommand Unsupported type {}", channelUID);
129 // *****Send Command to Hayward server
130 String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
131 String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
134 if (!("0".equals(status))) {
135 logger.debug("haywardCommand XML response: {}", xmlResponse);
138 } catch (HaywardException e) {
139 logger.debug("Unable to send command to Hayward's server {}:{}:{}",
140 bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
141 } catch (InterruptedException e) {
144 this.updateStatus(ThingStatus.ONLINE);
146 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);