]> git.basschouten.com Git - openhab-addons.git/blob
861431665a2e5a62ae745ea31753448ab7eade60
[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.library.types.OnOffType;
23 import org.openhab.core.thing.Bridge;
24 import org.openhab.core.thing.ChannelUID;
25 import org.openhab.core.thing.Thing;
26 import org.openhab.core.thing.ThingStatus;
27 import org.openhab.core.thing.ThingStatusDetail;
28 import org.openhab.core.types.Command;
29 import org.openhab.core.types.RefreshType;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 /**
34  * The ColorLogic Handler
35  *
36  * @author Matt Myers - Initial contribution
37  */
38 @NonNullByDefault
39 public class HaywardColorLogicHandler extends HaywardThingHandler {
40     private final Logger logger = LoggerFactory.getLogger(HaywardColorLogicHandler.class);
41
42     public HaywardColorLogicHandler(Thing thing) {
43         super(thing);
44     }
45
46     @Override
47     public void getTelemetry(String xmlResponse) throws HaywardException {
48         List<String> systemIDs = new ArrayList<>();
49         List<String> data = new ArrayList<>();
50
51         Bridge bridge = getBridge();
52         if (bridge != null) {
53             HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
54             if (bridgehandler != null) {
55                 systemIDs = bridgehandler.evaluateXPath("//ColorLogic-Light/@systemId", xmlResponse);
56                 String thingSystemID = getThing().getUID().getId();
57                 for (int i = 0; i < systemIDs.size(); i++) {
58                     if (systemIDs.get(i).equals(thingSystemID)) {
59                         // Light State
60                         data = bridgehandler.evaluateXPath("//ColorLogic-Light/@lightState", xmlResponse);
61                         updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_LIGHTSTATE, data.get(i));
62
63                         if (data.get(i).equals("0")) {
64                             updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_ENABLE, "0");
65                         } else {
66                             updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_ENABLE, "1");
67                         }
68
69                         // Current Show
70                         data = bridgehandler.evaluateXPath("//ColorLogic-Light/@currentShow", xmlResponse);
71                         updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW, data.get(0));
72                     }
73                 }
74                 this.updateStatus(ThingStatus.ONLINE);
75             } else {
76                 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
77             }
78         }
79     }
80
81     @Override
82     public void handleCommand(ChannelUID channelUID, Command command) {
83         if ((command instanceof RefreshType)) {
84             return;
85         }
86
87         String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
88         String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
89
90         Bridge bridge = getBridge();
91         if (bridge != null) {
92             HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
93             if (bridgehandler != null) {
94                 String cmdString = this.cmdToString(command);
95                 String cmdURL = null;
96                 try {
97                     switch (channelUID.getId()) {
98                         case HaywardBindingConstants.CHANNEL_COLORLOGIC_ENABLE:
99                             if (command == OnOffType.ON) {
100                                 cmdString = "1";
101                             } else {
102                                 cmdString = "0";
103                             }
104                             cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
105                                     + "<Name>SetUIEquipmentCmd</Name><Parameters>"
106                                     + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
107                                     + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
108                                     + bridgehandler.account.mspSystemID + "</Parameter>"
109                                     + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
110                                     + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
111                                     + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
112                                     + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
113                             break;
114                         case HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW:
115                             cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
116                                     + "<Name>SetStandAloneLightShow</Name><Parameters>"
117                                     + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
118                                     + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
119                                     + bridgehandler.account.mspSystemID + "</Parameter>"
120                                     + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
121                                     + "<Parameter name=\"LightID\" dataType=\"int\">" + systemID + "</Parameter>"
122                                     + "<Parameter name=\"Show\" dataType=\"int\">" + cmdString + "</Parameter>"
123                                     + "<Parameter name=\"Speed\" dataType=\"byte\">4</Parameter>"
124                                     + "<Parameter name=\"Brightness\" dataType=\"byte\">4</Parameter>"
125                                     + "<Parameter name=\"Reserved\" dataType=\"byte\">0</Parameter>"
126                                     + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
127                             break;
128                         default:
129                             logger.warn("haywardCommand Unsupported type {}", channelUID);
130                             return;
131                     }
132
133                     // *****Send Command to Hayward server
134                     String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
135                     String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
136                             .get(0);
137
138                     if (!("0".equals(status))) {
139                         logger.debug("haywardCommand XML response: {}", xmlResponse);
140                         return;
141                     }
142                 } catch (HaywardException e) {
143                     logger.debug("Unable to send command to Hayward's server {}:{}:{}",
144                             bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
145                 } catch (InterruptedException e) {
146                     return;
147                 }
148                 this.updateStatus(ThingStatus.ONLINE);
149             } else {
150                 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
151             }
152         }
153     }
154 }