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.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.thing.Bridge;
23 import org.openhab.core.thing.ChannelUID;
24 import org.openhab.core.thing.Thing;
25 import org.openhab.core.thing.ThingStatus;
26 import org.openhab.core.thing.ThingStatusDetail;
27 import org.openhab.core.types.Command;
28 import org.openhab.core.types.RefreshType;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
35 * @author Matt Myers - Initial contribution
38 public class HaywardRelayHandler extends HaywardThingHandler {
39 private final Logger logger = LoggerFactory.getLogger(HaywardRelayHandler.class);
41 public HaywardRelayHandler(Thing thing) {
46 public void getTelemetry(String xmlResponse) throws HaywardException {
47 List<String> systemIDs = new ArrayList<>();
48 List<String> data = new ArrayList<>();
50 Bridge bridge = getBridge();
52 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
53 if (bridgehandler != null) {
54 systemIDs = bridgehandler.evaluateXPath("//Relay/@systemId", xmlResponse);
55 data = bridgehandler.evaluateXPath("//Relay/@relayState", xmlResponse);
56 String thingSystemID = getThing().getUID().getId();
57 for (int i = 0; i < systemIDs.size(); i++) {
58 if (systemIDs.get(i).equals(thingSystemID)) {
59 updateData(HaywardBindingConstants.CHANNEL_RELAY_STATE, data.get(i));
62 this.updateStatus(ThingStatus.ONLINE);
64 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
70 public void handleCommand(ChannelUID channelUID, Command command) {
71 if ((command instanceof RefreshType)) {
75 String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
76 String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
78 Bridge bridge = getBridge();
80 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
81 if (bridgehandler != null) {
82 String cmdString = this.cmdToString(command);
85 switch (channelUID.getId()) {
86 case HaywardBindingConstants.CHANNEL_RELAY_STATE:
87 cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
88 + "<Name>SetUIEquipmentCmd</Name><Parameters>"
89 + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
90 + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
91 + bridgehandler.account.mspSystemID + "</Parameter>"
92 + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
93 + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
94 + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
95 + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
98 logger.warn("haywardCommand Unsupported type {}", channelUID);
102 // *****Send Command to Hayward server
103 String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
104 String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
107 if (!("0".equals(status))) {
108 logger.debug("haywardCommand XML response: {}", xmlResponse);
111 } catch (HaywardException e) {
112 logger.debug("Unable to send command to Hayward's server {}:{}:{}",
113 bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
114 } catch (InterruptedException e) {
117 this.updateStatus(ThingStatus.ONLINE);
119 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);