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.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 ColorLogic Handler
36 * @author Matt Myers - Initial contribution
39 public class HaywardColorLogicHandler extends HaywardThingHandler {
40 private final Logger logger = LoggerFactory.getLogger(HaywardColorLogicHandler.class);
42 public HaywardColorLogicHandler(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("//ColorLogic-Light/@systemId", xmlResponse);
56 String thingSystemID = getThing().getUID().getId();
57 for (int i = 0; i < systemIDs.size(); i++) {
58 if (systemIDs.get(i).equals(thingSystemID)) {
60 data = bridgehandler.evaluateXPath("//ColorLogic-Light/@lightState", xmlResponse);
61 updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_LIGHTSTATE, data.get(i));
63 if ("0".equals(data.get(i))) {
64 updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_ENABLE, "0");
66 updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_ENABLE, "1");
70 data = bridgehandler.evaluateXPath("//ColorLogic-Light/@currentShow", xmlResponse);
71 updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW, data.get(0));
74 this.updateStatus(ThingStatus.ONLINE);
76 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
82 public void handleCommand(ChannelUID channelUID, Command command) {
83 if ((command instanceof RefreshType)) {
87 String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
88 String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
90 Bridge bridge = getBridge();
92 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
93 if (bridgehandler != null) {
94 String cmdString = this.cmdToString(command);
97 switch (channelUID.getId()) {
98 case HaywardBindingConstants.CHANNEL_COLORLOGIC_ENABLE:
99 if (command == OnOffType.ON) {
104 cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
105 + "<Name>SetUIEquipmentCmd</Name><Parameters>"
106 + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
107 + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
108 + bridgehandler.account.mspSystemID + "</Parameter>"
109 + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
110 + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
111 + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
112 + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
114 case HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW:
115 cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
116 + "<Name>SetStandAloneLightShow</Name><Parameters>"
117 + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
118 + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
119 + bridgehandler.account.mspSystemID + "</Parameter>"
120 + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
121 + "<Parameter name=\"LightID\" dataType=\"int\">" + systemID + "</Parameter>"
122 + "<Parameter name=\"Show\" dataType=\"int\">" + cmdString + "</Parameter>"
123 + "<Parameter name=\"Speed\" dataType=\"byte\">4</Parameter>"
124 + "<Parameter name=\"Brightness\" dataType=\"byte\">4</Parameter>"
125 + "<Parameter name=\"Reserved\" dataType=\"byte\">0</Parameter>"
126 + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
129 logger.warn("haywardCommand Unsupported type {}", channelUID);
133 // *****Send Command to Hayward server
134 String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
135 String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
138 if (!("0".equals(status))) {
139 logger.debug("haywardCommand XML response: {}", xmlResponse);
142 } catch (HaywardException e) {
143 logger.debug("Unable to send command to Hayward's server {}:{}:{}",
144 bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
145 } catch (InterruptedException e) {
148 this.updateStatus(ThingStatus.ONLINE);
150 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);