]> git.basschouten.com Git - openhab-addons.git/blob
75a3d512b389244e880872aa1dddd76a798e7994
[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 Relay Handler
34  *
35  * @author Matt Myers - Initial contribution
36  */
37 @NonNullByDefault
38 public class HaywardRelayHandler extends HaywardThingHandler {
39     private final Logger logger = LoggerFactory.getLogger(HaywardRelayHandler.class);
40
41     public HaywardRelayHandler(Thing thing) {
42         super(thing);
43     }
44
45     @Override
46     public void getTelemetry(String xmlResponse) throws HaywardException {
47         List<String> systemIDs = new ArrayList<>();
48         List<String> data = new ArrayList<>();
49
50         Bridge bridge = getBridge();
51         if (bridge != null) {
52             HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
53             if (bridgehandler != null) {
54                 systemIDs = bridgehandler.evaluateXPath("//Relay/@systemId", xmlResponse);
55                 data = bridgehandler.evaluateXPath("//Relay/@relayState", xmlResponse);
56                 String thingSystemID = getThing().getUID().getId();
57                 for (int i = 0; i < systemIDs.size(); i++) {
58                     if (systemIDs.get(i).equals(thingSystemID)) {
59                         updateData(HaywardBindingConstants.CHANNEL_RELAY_STATE, data.get(i));
60                     }
61                 }
62                 this.updateStatus(ThingStatus.ONLINE);
63             } else {
64                 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
65             }
66         }
67     }
68
69     @Override
70     public void handleCommand(ChannelUID channelUID, Command command) {
71         if ((command instanceof RefreshType)) {
72             return;
73         }
74
75         String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
76         String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
77
78         Bridge bridge = getBridge();
79         if (bridge != null) {
80             HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
81             if (bridgehandler != null) {
82                 String cmdString = this.cmdToString(command);
83                 String cmdURL = null;
84                 try {
85                     switch (channelUID.getId()) {
86                         case HaywardBindingConstants.CHANNEL_RELAY_STATE:
87                             cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
88                                     + "<Name>SetUIEquipmentCmd</Name><Parameters>"
89                                     + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
90                                     + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
91                                     + bridgehandler.account.mspSystemID + "</Parameter>"
92                                     + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
93                                     + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
94                                     + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
95                                     + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
96                             break;
97                         default:
98                             logger.warn("haywardCommand Unsupported type {}", channelUID);
99                             return;
100                     }
101
102                     // *****Send Command to Hayward server
103                     String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
104                     String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
105                             .get(0);
106
107                     if (!("0".equals(status))) {
108                         logger.debug("haywardCommand XML response: {}", xmlResponse);
109                         return;
110                     }
111                 } catch (HaywardException e) {
112                     logger.debug("Unable to send command to Hayward's server {}:{}:{}",
113                             bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
114                 } catch (InterruptedException e) {
115                     return;
116                 }
117                 this.updateStatus(ThingStatus.ONLINE);
118             } else {
119                 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
120             }
121         }
122     }
123 }