]> git.basschouten.com Git - openhab-addons.git/blob
ef15ceb907d2c71dcac116a2b59378eb33399a57
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.haywardomnilogic.internal.handler;
14
15 import java.util.ArrayList;
16 import java.util.List;
17
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;
31
32 /**
33  * The Chlorinator Handler
34  *
35  * @author Matt Myers - Initial contribution
36  */
37 @NonNullByDefault
38 public class HaywardChlorinatorHandler extends HaywardThingHandler {
39     private final Logger logger = LoggerFactory.getLogger(HaywardChlorinatorHandler.class);
40     public String chlorTimedPercent = "";
41     public String chlorState = "";
42
43     public HaywardChlorinatorHandler(Thing thing) {
44         super(thing);
45     }
46
47     @Override
48     public void getTelemetry(String xmlResponse) throws HaywardException {
49         List<String> systemIDs = new ArrayList<>();
50         List<String> data = new ArrayList<>();
51
52         Bridge bridge = getBridge();
53         if (bridge != null) {
54             HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
55             if (bridgehandler != null) {
56                 systemIDs = bridgehandler.evaluateXPath("//Chlorinator/@systemId", xmlResponse);
57                 String thingSystemID = getThing().getUID().getId();
58                 for (int i = 0; i < systemIDs.size(); i++) {
59                     if (systemIDs.get(i).equals(thingSystemID)) {
60                         // Operating Mode
61                         data = bridgehandler.evaluateXPath("//Chlorinator/@operatingMode", xmlResponse);
62                         updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_OPERATINGMODE, data.get(i));
63
64                         // Timed Percent
65                         data = bridgehandler.evaluateXPath("//Chlorinator/@Timed-Percent", xmlResponse);
66                         updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT, data.get(i));
67                         this.chlorTimedPercent = data.get(0);
68
69                         // scMode
70                         data = bridgehandler.evaluateXPath("//Chlorinator/@scMode", xmlResponse);
71                         updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_SCMODE, data.get(i));
72
73                         // Error
74                         data = bridgehandler.evaluateXPath("//Chlorinator/@chlrError", xmlResponse);
75                         updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ERROR, data.get(i));
76
77                         // Alert
78                         data = bridgehandler.evaluateXPath("//Chlorinator/@chlrAlert", xmlResponse);
79                         updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ALERT, data.get(i));
80
81                         // Average Salt Level
82                         data = bridgehandler.evaluateXPath("//Chlorinator/@avgSaltLevel", xmlResponse);
83                         updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_AVGSALTLEVEL, data.get(i));
84
85                         // Instant Salt Level
86                         data = bridgehandler.evaluateXPath("//Chlorinator/@instantSaltLevel", xmlResponse);
87                         updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_INSTANTSALTLEVEL, data.get(i));
88
89                         // Status
90                         data = bridgehandler.evaluateXPath("//Chlorinator/@status", xmlResponse);
91                         updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_STATUS, data.get(i));
92
93                         if (data.get(i).equals("0")) {
94                             updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE, "0");
95                             // chlorState is used to set the chlorinator cfgState in the timedPercent command
96                             this.chlorState = "2";
97                         } else {
98                             updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE, "1");
99                             // chlorState is used to set the chlorinator cfgState in the timedPercent command
100                             this.chlorState = "3";
101                         }
102                     }
103                 }
104                 this.updateStatus(ThingStatus.ONLINE);
105             } else {
106                 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
107             }
108         }
109     }
110
111     @Override
112     public void handleCommand(ChannelUID channelUID, Command command) {
113         if ((command instanceof RefreshType)) {
114             return;
115         }
116
117         String chlorCfgState = null;
118         String chlorTimedPercent = "0";
119
120         String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
121         String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
122
123         Bridge bridge = getBridge();
124         if (bridge != null) {
125             HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
126             if (bridgehandler != null) {
127                 String cmdString = this.cmdToString(command);
128                 try {
129                     switch (channelUID.getId()) {
130                         case HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE:
131                             if ("1".equals(cmdString)) {
132                                 chlorCfgState = "3";
133                                 chlorTimedPercent = this.chlorTimedPercent;
134                             } else {
135                                 chlorCfgState = "2";
136                                 chlorTimedPercent = this.chlorTimedPercent;
137                             }
138                             break;
139                         case HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT:
140                             chlorCfgState = this.chlorState;
141                             chlorTimedPercent = cmdString;
142                             break;
143                         default:
144                             logger.warn("haywardCommand Unsupported type {}", channelUID);
145                             return;
146                     }
147
148                     String cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
149                             + "<Name>SetCHLORParams</Name><Parameters>"
150                             + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
151                             + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
152                             + bridgehandler.account.mspSystemID + "</Parameter>"
153                             + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
154                             + "<Parameter name=\"ChlorID\" dataType=\"int\" alias=\"EquipmentID\">" + systemID
155                             + "</Parameter>" + "<Parameter name=\"CfgState\" dataType=\"byte\" alias=\"Data1\">"
156                             + chlorCfgState + "</Parameter>"
157                             + "<Parameter name=\"OpMode\" dataType=\"byte\" alias=\"Data2\">1</Parameter>"
158                             + "<Parameter name=\"BOWType\" dataType=\"byte\" alias=\"Data3\">1</Parameter>"
159                             + "<Parameter name=\"CellType\" dataType=\"byte\" alias=\"Data4\">4</Parameter>"
160                             + "<Parameter name=\"TimedPercent\" dataType=\"byte\" alias=\"Data5\">" + chlorTimedPercent
161                             + "</Parameter>"
162                             + "<Parameter name=\"SCTimeout\" dataType=\"byte\" unit=\"hour\" alias=\"Data6\">24</Parameter>"
163                             + "<Parameter name=\"ORPTimout\" dataType=\"byte\" unit=\"hour\" alias=\"Data7\">24</Parameter>"
164                             + "</Parameters></Request>";
165
166                     // *****Send Command to Hayward server
167                     String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
168                     String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
169                             .get(0);
170
171                     if (!("0".equals(status))) {
172                         logger.debug("haywardCommand XML response: {}", xmlResponse);
173                         return;
174                     }
175                 } catch (HaywardException e) {
176                     logger.debug("Unable to send command to Hayward's server {}:{}:{}",
177                             bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
178                 } catch (InterruptedException e) {
179                     return;
180                 }
181                 this.updateStatus(ThingStatus.ONLINE);
182             } else {
183                 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
184             }
185         }
186     }
187 }