]> git.basschouten.com Git - openhab-addons.git/blob
98515f8f299c63b3378a6ece6c536966ac7d1ed1
[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.math.BigDecimal;
16 import java.util.ArrayList;
17 import java.util.List;
18
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
21 import org.openhab.binding.haywardomnilogic.internal.HaywardException;
22 import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
23 import org.openhab.core.library.types.OnOffType;
24 import org.openhab.core.thing.Bridge;
25 import org.openhab.core.thing.Channel;
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.StateDescriptionFragment;
33 import org.openhab.core.types.StateDescriptionFragmentBuilder;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 /**
38  * The Virtual Heater Handler
39  *
40  * @author Matt Myers - Initial contribution
41  */
42 @NonNullByDefault
43 public class HaywardVirtualHeaterHandler extends HaywardThingHandler {
44     private final Logger logger = LoggerFactory.getLogger(HaywardVirtualHeaterHandler.class);
45
46     public HaywardVirtualHeaterHandler(Thing thing) {
47         super(thing);
48     }
49
50     @Override
51     public void initialize() {
52         try {
53             setStateDescriptions();
54             updateStatus(ThingStatus.ONLINE);
55         } catch (HaywardException e) {
56             updateStatus(ThingStatus.OFFLINE);
57         }
58     }
59
60     @Override
61     public void setStateDescriptions() throws HaywardException {
62         Bridge bridge = getBridge();
63         if (bridge != null) {
64             HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
65             if (bridgehandler != null) {
66                 // Set heater min and max speeds
67                 Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT);
68                 if (ch != null) {
69                     StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
70                             .withMinimum(new BigDecimal(getThing().getProperties()
71                                     .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP)))
72                             .withMaximum(new BigDecimal(getThing().getProperties()
73                                     .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP)))
74                             .build();
75                     bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
76                 }
77             }
78         }
79     }
80
81     @Override
82     public void getTelemetry(String xmlResponse) throws HaywardException {
83         List<String> systemIDs = new ArrayList<>();
84         List<String> data = new ArrayList<>();
85
86         Bridge bridge = getBridge();
87         if (bridge != null) {
88             HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
89             if (bridgehandler != null) {
90                 systemIDs = bridgehandler.evaluateXPath("//VirtualHeater/@systemId", xmlResponse);
91                 String thingSystemID = getThing().getUID().getId();
92                 for (int i = 0; i < systemIDs.size(); i++) {
93                     if (systemIDs.get(i).equals(thingSystemID)) {
94                         data = bridgehandler.evaluateXPath("//VirtualHeater/@Current-Set-Point", xmlResponse);
95                         updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT, data.get(i));
96
97                         data = bridgehandler.evaluateXPath("//VirtualHeater/@enable", xmlResponse);
98                         if ("yes".equals(data.get(i))) {
99                             updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "1");
100                         } else if ("no".equals(data.get(i))) {
101                             updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "0");
102                         }
103                     }
104                 }
105                 this.updateStatus(ThingStatus.ONLINE);
106             } else {
107                 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
108             }
109         }
110     }
111
112     @Override
113     public void handleCommand(ChannelUID channelUID, Command command) {
114         if ((command instanceof RefreshType)) {
115             return;
116         }
117
118         String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
119         String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
120         String heaterMinSetTemp = getThing().getProperties()
121                 .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP);
122         String heaterMaxSetTemp = getThing().getProperties()
123                 .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP);
124
125         Bridge bridge = getBridge();
126         if (bridge != null) {
127             HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
128             if (bridgehandler != null) {
129                 String cmdString = this.cmdToString(command);
130                 String cmdURL = null;
131
132                 if (command == OnOffType.ON) {
133                     cmdString = "True";
134                 } else if (command == OnOffType.OFF) {
135                     cmdString = "False";
136                 }
137
138                 try {
139                     switch (channelUID.getId()) {
140                         case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE:
141                             cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
142                                     + "<Name>SetHeaterEnable</Name><Parameters>"
143                                     + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
144                                     + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
145                                     + bridgehandler.account.mspSystemID + "</Parameter>"
146                                     + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
147                                     + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
148                                     + "<Parameter name=\"Enabled\" dataType=\"bool\">" + cmdString + "</Parameter>"
149                                     + "</Parameters></Request>";
150                             break;
151
152                         case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT:
153                             if (heaterMinSetTemp != null && heaterMaxSetTemp != null) {
154                                 if (Integer.parseInt(cmdString) < Integer.parseInt(heaterMinSetTemp)) {
155                                     cmdString = heaterMinSetTemp;
156                                 } else if (Integer.parseInt(cmdString) > Integer.parseInt(heaterMaxSetTemp)) {
157                                     cmdString = heaterMaxSetTemp;
158                                 }
159                             }
160
161                             cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
162                                     + "<Name>SetUIHeaterCmd</Name><Parameters>"
163                                     + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
164                                     + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
165                                     + bridgehandler.account.mspSystemID + "</Parameter>"
166                                     + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
167                                     + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
168                                     + "<Parameter name=\"Temp\" dataType=\"int\">" + cmdString + "</Parameter>"
169                                     + "</Parameters></Request>";
170                             break;
171                         default:
172                             logger.warn("haywardCommand Unsupported type {}", channelUID);
173                             return;
174                     }
175
176                     // *****Send Command to Hayward server
177                     String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
178                     String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
179                             .get(0);
180
181                     if (!("0".equals(status))) {
182                         logger.debug("haywardCommand XML response: {}", xmlResponse);
183                         return;
184                     }
185                 } catch (HaywardException e) {
186                     logger.debug("Unable to send command to Hayward's server {}:{}:{}",
187                             bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
188                 } catch (InterruptedException e) {
189                     return;
190                 }
191                 this.updateStatus(ThingStatus.ONLINE);
192             } else {
193                 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
194             }
195         }
196     }
197 }