]> git.basschouten.com Git - openhab-addons.git/blob
3c67d568bb0f68e0fad3d731b4595b4c343baa58
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 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.HashMap;
17 import java.util.List;
18 import java.util.Map;
19
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;
35
36 /**
37  * The Chlorinator Handler
38  *
39  * @author Matt Myers - Initial contribution
40  */
41 @NonNullByDefault
42 public class HaywardChlorinatorHandler extends HaywardThingHandler {
43     private final Logger logger = LoggerFactory.getLogger(HaywardChlorinatorHandler.class);
44     private Map<String, State> channelStates = new HashMap<>();
45
46     public HaywardChlorinatorHandler(Thing thing) {
47         super(thing);
48     }
49
50     @Override
51     public void getTelemetry(String xmlResponse) throws HaywardException {
52         List<String> systemIDs = new ArrayList<>();
53         List<String> data = new ArrayList<>();
54
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)) {
61                     // Enable
62                     data = bridgehandler.evaluateXPath("//Chlorinator/@enable", xmlResponse);
63                     updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE, data.get(i));
64
65                     // Operating Mode
66                     data = bridgehandler.evaluateXPath("//Chlorinator/@operatingMode", xmlResponse);
67                     updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_OPERATINGMODE, data.get(i));
68
69                     // Timed Percent
70                     data = bridgehandler.evaluateXPath("//Chlorinator/@Timed-Percent", xmlResponse);
71                     channelStates
72                             .putAll(updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT, data.get(i)));
73
74                     // scMode
75                     data = bridgehandler.evaluateXPath("//Chlorinator/@scMode", xmlResponse);
76                     updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_SCMODE, data.get(i));
77
78                     // Error Bit Array
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"));
82
83                     // Alert Bit Array
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"));
87
88                     // Average Salt Level
89                     data = bridgehandler.evaluateXPath("//Chlorinator/@avgSaltLevel", xmlResponse);
90                     updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_AVGSALTLEVEL, data.get(i));
91
92                     // Instant Salt Level
93                     data = bridgehandler.evaluateXPath("//Chlorinator/@instantSaltLevel", xmlResponse);
94                     updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_INSTANTSALTLEVEL, data.get(i));
95
96                     // Status Bit Array
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"));
100                 }
101             }
102             this.updateStatus(ThingStatus.ONLINE);
103         } else {
104             this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
105         }
106     }
107
108     @Override
109     public void handleCommand(ChannelUID channelUID, Command command) {
110         if ((command instanceof RefreshType)) {
111             return;
112         }
113
114         String chlorCfgState = null;
115         String chlorTimedPercent = "0";
116
117         String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
118         String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
119
120         Bridge bridge = getBridge();
121         if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
122             String cmdString = this.cmdToString(command);
123             try {
124                 switch (channelUID.getId()) {
125                     case HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE:
126                         chlorTimedPercent = channelStates.get(HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT)
127                                 .format("%d");
128                         if ("1".equals(cmdString)) {
129                             chlorCfgState = "3";
130                         } else {
131                             chlorCfgState = "2";
132                         }
133                         break;
134                     case HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT:
135                         if (channelStates.get(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE) == OnOffType.ON) {
136                             chlorCfgState = "3";
137                         } else {
138                             chlorCfgState = "2";
139                         }
140                         chlorTimedPercent = cmdString;
141                         break;
142                     default:
143                         logger.warn("haywardCommand Unsupported type {}", channelUID);
144                         return;
145                 }
146
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
159                         + "</Parameter>"
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>";
163
164                 // *****Send Command to Hayward server
165                 String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
166                 String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse).get(0);
167
168                 if (!("0".equals(status))) {
169                     logger.debug("haywardCommand XML response: {}", xmlResponse);
170                     return;
171                 }
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) {
176                 return;
177             }
178             this.updateStatus(ThingStatus.ONLINE);
179         } else {
180             this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
181         }
182     }
183 }