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.HashMap;
17 import java.util.List;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
22 import org.openhab.binding.haywardomnilogic.internal.HaywardException;
23 import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
24 import org.openhab.core.library.types.OnOffType;
25 import org.openhab.core.thing.Bridge;
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.State;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
37 * The Chlorinator Handler
39 * @author Matt Myers - Initial contribution
42 public class HaywardChlorinatorHandler extends HaywardThingHandler {
43 private final Logger logger = LoggerFactory.getLogger(HaywardChlorinatorHandler.class);
44 private Map<String, State> channelStates = new HashMap<>();
46 public HaywardChlorinatorHandler(Thing thing) {
51 public void getTelemetry(String xmlResponse) throws HaywardException {
52 List<String> systemIDs = new ArrayList<>();
53 List<String> data = new ArrayList<>();
55 Bridge bridge = getBridge();
56 if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
57 systemIDs = bridgehandler.evaluateXPath("//Chlorinator/@systemId", xmlResponse);
58 String thingSystemID = getThing().getUID().getId();
59 for (int i = 0; i < systemIDs.size(); i++) {
60 if (systemIDs.get(i).equals(thingSystemID)) {
62 data = bridgehandler.evaluateXPath("//Chlorinator/@enable", xmlResponse);
63 updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE, data.get(i));
66 data = bridgehandler.evaluateXPath("//Chlorinator/@operatingMode", xmlResponse);
67 updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_OPERATINGMODE, data.get(i));
70 data = bridgehandler.evaluateXPath("//Chlorinator/@Timed-Percent", xmlResponse);
72 .putAll(updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT, data.get(i)));
75 data = bridgehandler.evaluateXPath("//Chlorinator/@scMode", xmlResponse);
76 updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_SCMODE, data.get(i));
79 data = bridgehandler.evaluateXPath("//Chlorinator/@chlrError", xmlResponse);
80 updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ERROR, String
81 .format("%16s", Integer.toBinaryString(Integer.parseInt(data.get(i)))).replace(" ", "0"));
84 data = bridgehandler.evaluateXPath("//Chlorinator/@chlrAlert", xmlResponse);
85 updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ALERT, String
86 .format("%16s", Integer.toBinaryString(Integer.parseInt(data.get(i)))).replace(" ", "0"));
89 data = bridgehandler.evaluateXPath("//Chlorinator/@avgSaltLevel", xmlResponse);
90 updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_AVGSALTLEVEL, data.get(i));
93 data = bridgehandler.evaluateXPath("//Chlorinator/@instantSaltLevel", xmlResponse);
94 updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_INSTANTSALTLEVEL, data.get(i));
97 data = bridgehandler.evaluateXPath("//Chlorinator/@status", xmlResponse);
98 updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_STATUS, String
99 .format("%16s", Integer.toBinaryString(Integer.parseInt(data.get(i)))).replace(" ", "0"));
102 this.updateStatus(ThingStatus.ONLINE);
104 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
109 public void handleCommand(ChannelUID channelUID, Command command) {
110 if ((command instanceof RefreshType)) {
114 String chlorCfgState = null;
115 String chlorTimedPercent = "0";
117 String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
118 String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
120 Bridge bridge = getBridge();
121 if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
122 String cmdString = this.cmdToString(command);
124 switch (channelUID.getId()) {
125 case HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE:
126 chlorTimedPercent = channelStates.get(HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT)
128 if ("1".equals(cmdString)) {
134 case HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT:
135 if (channelStates.get(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE) == OnOffType.ON) {
140 chlorTimedPercent = cmdString;
143 logger.warn("haywardCommand Unsupported type {}", channelUID);
147 String cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + "<Name>SetCHLORParams</Name><Parameters>"
148 + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
149 + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
150 + bridgehandler.account.mspSystemID + "</Parameter>"
151 + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
152 + "<Parameter name=\"ChlorID\" dataType=\"int\" alias=\"EquipmentID\">" + systemID
153 + "</Parameter>" + "<Parameter name=\"CfgState\" dataType=\"byte\" alias=\"Data1\">"
154 + chlorCfgState + "</Parameter>"
155 + "<Parameter name=\"OpMode\" dataType=\"byte\" alias=\"Data2\">1</Parameter>"
156 + "<Parameter name=\"BOWType\" dataType=\"byte\" alias=\"Data3\">1</Parameter>"
157 + "<Parameter name=\"CellType\" dataType=\"byte\" alias=\"Data4\">4</Parameter>"
158 + "<Parameter name=\"TimedPercent\" dataType=\"byte\" alias=\"Data5\">" + chlorTimedPercent
160 + "<Parameter name=\"SCTimeout\" dataType=\"byte\" unit=\"hour\" alias=\"Data6\">24</Parameter>"
161 + "<Parameter name=\"ORPTimout\" dataType=\"byte\" unit=\"hour\" alias=\"Data7\">24</Parameter>"
162 + "</Parameters></Request>";
164 // *****Send Command to Hayward server
165 String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
166 String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse).get(0);
168 if (!("0".equals(status))) {
169 logger.debug("haywardCommand XML response: {}", xmlResponse);
172 } catch (HaywardException e) {
173 logger.debug("Unable to send command to Hayward's server {}:{}:{}", bridgehandler.config.endpointUrl,
174 bridgehandler.config.username, e.getMessage());
175 } catch (InterruptedException e) {
178 this.updateStatus(ThingStatus.ONLINE);
180 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);