2 * Copyright (c) 2010-2021 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.haywardomnilogic.internal.handler;
15 import java.util.ArrayList;
16 import java.util.List;
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;
36 * @author Matt Myers - Initial contribution
39 public class HaywardFilterHandler extends HaywardThingHandler {
40 private final Logger logger = LoggerFactory.getLogger(HaywardFilterHandler.class);
42 public HaywardFilterHandler(Thing thing) {
47 public void initialize() {
48 updateStatus(ThingStatus.ONLINE);
52 public void getTelemetry(String xmlResponse) throws HaywardException {
53 List<String> systemIDs = new ArrayList<>();
54 List<String> data = new ArrayList<>();
56 Bridge bridge = getBridge();
58 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
59 if (bridgehandler != null) {
60 systemIDs = bridgehandler.evaluateXPath("//Filter/@systemId", xmlResponse);
61 String thingSystemID = getThing().getUID().getId();
62 for (int i = 0; i < systemIDs.size(); i++) {
63 if (systemIDs.get(i).equals(thingSystemID)) {
65 data = bridgehandler.evaluateXPath("//Filter/@valvePosition", xmlResponse);
66 updateData(HaywardBindingConstants.CHANNEL_FILTER_VALVEPOSITION, data.get(i));
69 data = bridgehandler.evaluateXPath("//Filter/@filterSpeed", xmlResponse);
70 updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEED, data.get(i));
72 if (data.get(i).equals("0")) {
73 updateData(HaywardBindingConstants.CHANNEL_FILTER_ENABLE, "0");
75 updateData(HaywardBindingConstants.CHANNEL_FILTER_ENABLE, "1");
79 data = bridgehandler.evaluateXPath("//Filter/@filterState", xmlResponse);
80 updateData(HaywardBindingConstants.CHANNEL_FILTER_STATE, data.get(i));
83 data = bridgehandler.evaluateXPath("//Filter/@lastSpeed", xmlResponse);
84 updateData(HaywardBindingConstants.CHANNEL_FILTER_LASTSPEED, data.get(i));
87 this.updateStatus(ThingStatus.ONLINE);
89 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
95 public void handleCommand(ChannelUID channelUID, Command command) {
96 if ((command instanceof RefreshType)) {
100 String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
101 String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
103 Bridge bridge = getBridge();
104 if (bridge != null) {
105 HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
106 if (bridgehandler != null) {
107 String cmdString = this.cmdToString(command);
109 switch (channelUID.getId()) {
110 case HaywardBindingConstants.CHANNEL_FILTER_ENABLE:
111 if (command == OnOffType.ON) {
117 case HaywardBindingConstants.CHANNEL_FILTER_SPEED:
120 logger.warn("haywardCommand Unsupported type {}", channelUID);
124 String cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
125 + "<Name>SetUIEquipmentCmd</Name><Parameters>"
126 + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
127 + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
128 + bridgehandler.account.mspSystemID + "</Parameter>"
129 + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
130 + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
131 + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
132 + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
134 // *****Send Command to Hayward server
135 String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
136 String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
139 if (!("0".equals(status))) {
140 logger.debug("haywardCommand XML response: {}", xmlResponse);
143 } catch (HaywardException e) {
144 logger.debug("Unable to send command to Hayward's server {}:{}:{}",
145 bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
146 } catch (InterruptedException e) {
149 this.updateStatus(ThingStatus.ONLINE);
151 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);