| Host Name | <https://app1.haywardomnilogic.com/HAAPI/HomeAutomation/API.ash> | Yes | Host name of the Hayward API server |
| User Name | None | Yes | Your Hayward User Name (not email address) |
| Password | None | Yes | Your Hayward User Password |
-| Telemetry Poll Delay | 12 | Yes | Telemetry Poll Delay (10-60 seconds) |
-| Alarm Poll Delay | 60 | Yes | Alarm Poll Delay (0-120 seconds, 0 disabled) |
+| Telemetry Poll Delay | 3 | Yes | Telemetry Poll Delay (2-60 seconds) |
+| Alarm Poll Delay | 10 | Yes | Alarm Poll Delay (0-120 seconds, 0 disabled) |
## Channels
|-----------------------|----------------------|----------------------------------------------------------|:----------:|
| chlorEnable | Switch | Chlorinator enable | R/W |
| chlorOperatingMode | String | Chlorinator operating mode | R |
-| chlorTimedPercent | Number:Dimensionless | Chlorinator timed percent | R/W |
+| chlorTimedPercent | Number:Dimensionless | Chlorinator salt output (%) | R/W |
| chlorOperatingState | Number | Chlorinator operating state | R |
| chlorScMode | String | Chlorinator super chlorinate mode | R |
-| chlorError | Number | Chlorinator error | R |
-| chlorAlert | String | Chlorinator alert | R |
+| chlorError | String | Chlorinator error bit array | R |
+| chlorAlert | String | Chlorinator alert bit array | R |
| chlorAvgSaltLevel | Number:Dimensionless | Chlorinator average salt level in Part per Million (ppm) | R |
| chlorInstantSaltLevel | Number:Dimensionless | Chlorinator instant salt level in Part per Million (ppm) | R |
-| chlorStatus | Number | Chlorinator K1/K2 relay status | R |
+| chlorStatus | String | Chlorinator status bit array | R |
+
+### Chlorinator Error Bit Array
+
+|Bits |Value |Description |
+|------|--------------------------------------------------------------------|-------------------------------|
+|1:0 |00 = OK<br> 01 = Short<br> 10 = Open |Current Sensor |
+|3:2 |00 = OK<br> 01 = Short<br> 10 = Open |Voltage Sensor |
+|5:4 |00 = OK<br> 01 = Short<br> 10 = Open |Cell Temp Sensor |
+|7:6 |00 = OK<br> 01 = Short<br> 10 = Open |Board Temp Sensor |
+|9:8 |00 = OK<br> 01 = Short<br> 10 = Open |K1 Relay |
+|11:10 |00 = OK<br> 01 = Short<br> 10 = Open |K2 Relay |
+|13:12 |00 = OK<br> 01 = Type<br> 10 = Authentication <br> 11 = Comm Loss |Cell Errors |
+|14 |0 |Aquarite PCB Error |
+
+### Chlorinator Alert Bit Array
+
+|Bits |Value |Description |
+|------|--------------------------------------------------------------------|-------------------------------|
+|1:0 |00 = OK<br> 01 = Salt Low<br> 10 = Salt too Low |Low salt |
+|2 |0 = OK<br> 1 = High |High Current |
+|3 |0 = OK<br> 1 = Low |Low Voltage |
+|5:4 |00 = OK<br> 01 = Low<br> 10 = Scaleback<br> 11 = High |Cell Water Temp |
+|7:6 |00 = OK<br> 01 = High<br> 10 = Clearing |Board Temp |
+|8 |0 |Not Used |
+|10:9 |0 |Not Used |
+|12:11 |00 = OK<br> 01 = Clean |Cell Cleaning/Runtime |
+
+### Chlorinator Status Bit Array
+
+|Bits |Value |Description |
+|------|----------------------------------------------------------------|-------------------------------|
+|0 |0 = OK<br>1 = Error Present |Error Present |
+|1 |0 = OK<br>1 = Alert Present |Alert Present |
+|2 |0 = Standy<br>1 = Generating |Generating |
+|3 |0 = Not Paused<br>1 = Paused<br> |Paused |
+|4 |0 = Local Not Paused<br>1 = Local Paused<br> |Local Pause |
+|5 |0 = Not Authenticated<><BR>1 = Authenticated |T-Cell Authenticated |
+|6 |0 = K1 Relay Off<br> 1 = K1 Relay On |K1 Relay Active |
+|7 |0 = K2 Relay Off<br> 1 = K2 Relay On |K2 Relay Active |
### Colorlogic Light Channels
|---------------------|----------------------|------------------------|:----------:|
| filterEnable | Switch | Filter enable | R/W |
| filterValvePosition | String | Filter valve position | R |
-| filterSpeedPercent | Number:Dimensionless | Filter speed in % | R/W |
-| filterSpeedRpm | Number | Filter speed in RPM | R/W |
+| filterSpeedPercent | Number:Dimensionless | Filter speed (%) | R/W |
+| filterSpeedRpm | Number:Frequency | Filter speed (rpm) | R/W |
| filterSpeedSelect | String | Filter speed presets | R/W |
| filterState | String | Filter state | R |
-| filterLastSpeed | Number:Dimensionless | Filter last speed in % | R |
+| filterLastSpeed | Number:Dimensionless | Filter last speed (%) | R |
### Heater Channels
| Channel Type ID | Item Type | Description | Read Write |
|------------------|----------------------|----------------------|:----------:|
| pumpEnable | Switch | Pump enable | R/W |
-| pumpSpeedPercent | Number:Dimensionless | Pump speed in % | R/W |
-| pumpSpeedRpm | Number | Pump speed in RPM | R/W |
+| pumpSpeedPercent | Number:Dimensionless | Pump speed (%) | R/W |
+| pumpSpeedRpm | Number: Frequency | Pump speed in rpm | R/W |
| pumpSpeedSelect | String | Pump speed presets | R/W |
| pumpState | String | Pump state | R |
-| pumpLastSpeed | Number:Dimensionless | Pump last speed in % | R |
+| pumpLastSpeed | Number:Dimensionless | Pump last speed (%) | R |
### Relay Channels
| heaterEnable | Switch | Heater enable | R |
| heaterCurrentSetpoint | Number:Temperature | Heater Current Setpoint | R/W |
+**Item Types Number:Dimensionless should have the units (i.e. %, ppm) defined in the Unit metadata
+
## Full Example
After installing the binding, you will need to manually add the Hayward Connection thing and enter your credentials.
@NonNullByDefault
public class HaywardBindingConstants {
- private static final String BINDING_ID = "haywardomnilogic";
+ public static final String BINDING_ID = "haywardomnilogic";
// List of all Thing Type UIDs
public static final ThingTypeUID THING_TYPE_BACKYARD = new ThingTypeUID(BINDING_ID, "backyard");
// List of all Channel ids (colorlogic)
public static final String CHANNEL_COLORLOGIC_ENABLE = "colorLogicLightEnable";
- public static final String CHANNEL_COLORLOGIC_LIGHTSTATE = "colorLogicLightState";
+ public static final String CHANNEL_COLORLOGIC_STATE = "colorLogicLightState";
public static final String CHANNEL_COLORLOGIC_CURRENTSHOW = "colorLogicLightCurrentShow";
+ public static final String CHANNEL_COLORLOGIC_BRIGHTNESS = "colorLogicLightBrightness";
+ public static final String CHANNEL_COLORLOGIC_SPEED = "colorLogicLightSpeed";
+
+ public static final String TYPE_COLORLOGIC_LIGHTBRIGHTNESS = "lightBrightness";
+ public static final String TYPE_COLORLOGIC_LIGHTSPEED = "lightSpeed";
public static final String PROPERTY_COLORLOGIC_TYPE = "colorlogicType";
}
if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_RELAY)) {
return new HaywardRelayHandler(thing);
-
}
if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_VIRTUALHEATER)) {
return new HaywardVirtualHeaterHandler(thing);
return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
case HaywardBindingConstants.CHANNEL_FILTER_SPEEDPERCENT:
return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
- case HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM:
case HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED:
return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
case HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT:
return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
- case HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM:
}
return StringType.valueOf(value);
+ case "Number:Frequency":
+ switch (channelID) {
+ case HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM:
+ return new QuantityType<>(Integer.parseInt(value), Units.RPM);
+ case HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM:
+ return new QuantityType<>(Integer.parseInt(value), Units.RPM);
+ }
case "Number:Temperature":
Bridge bridge = getBridge();
if (bridge != null) {
final List<String> colorLogicProperty1 = thingHandler.evaluateXPath("//Backyard//ColorLogic-Light/Type/text()",
xmlResponse);
+ final List<String> colorLogicProperty2 = thingHandler
+ .evaluateXPath("//Backyard//ColorLogic-Light/V2-Active/text()", xmlResponse);
+
+ for (int i = 0; i < colorLogicProperty2.size(); i++) {
+ if (colorLogicProperty1.get(i).equals("COLOR_LOGIC_UCL") && colorLogicProperty2.get(i).equals("yes")) {
+ colorLogicProperty1.set(i, "COLOR_LOGIC_UCL_V2");
+ }
+ }
+
discoverDevices(thingHandler, xmlResponse, "ColorLogic-Light", HaywardTypeToRequest.COLORLOGIC,
HaywardBindingConstants.THING_TYPE_COLORLOGIC, (props, i) -> {
props.put(HaywardBindingConstants.PROPERTY_COLORLOGIC_TYPE, colorLogicProperty1.get(i));
List<String> systemIDs = new ArrayList<>();
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- systemIDs = bridgehandler.evaluateXPath("//Backyard/@systemId", xmlResponse);
- String thingSystemID = getThing().getUID().getId();
- for (int i = 0; i < systemIDs.size(); i++) {
- if (systemIDs.get(i).equals(thingSystemID)) {
- // Air temp
- data = bridgehandler.evaluateXPath("//Backyard/@airTemp", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_BACKYARD_AIRTEMP, data.get(0));
-
- // Status
- data = bridgehandler.evaluateXPath("//Backyard/@status", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_BACKYARD_STATUS, data.get(0));
-
- // State
- data = bridgehandler.evaluateXPath("//Backyard/@state", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_BACKYARD_STATE, data.get(0));
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ systemIDs = bridgehandler.evaluateXPath("//Backyard/@systemId", xmlResponse);
+ String thingSystemID = getThing().getUID().getId();
+ for (int i = 0; i < systemIDs.size(); i++) {
+ if (systemIDs.get(i).equals(thingSystemID)) {
+ // Air temp
+ data = bridgehandler.evaluateXPath("//Backyard/@airTemp", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_BACKYARD_AIRTEMP, data.get(0));
+
+ // Status
+ data = bridgehandler.evaluateXPath("//Backyard/@status", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_BACKYARD_STATUS, data.get(0));
+
+ // State
+ data = bridgehandler.evaluateXPath("//Backyard/@state", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_BACKYARD_STATE, data.get(0));
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
String alarmStr;
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- // *****Request Alarm List from Hayward server
- String urlParameters = """
- <?xml version="1.0" encoding="utf-8"?><Request><Name>GetAlarmList</Name><Parameters>\
- <Parameter name="Token" dataType="String">\
- """ + bridgehandler.account.token + "</Parameter>"
- + "<Parameter name=\"MspSystemID\" dataType=\"int\">" + bridgehandler.account.mspSystemID
- + "</Parameter>"
- + "<Parameter name=\"CultureInfoName\" dataType=\"String\">en-us</Parameter></Parameters></Request>";
-
- try {
- String xmlResponse = bridgehandler.httpXmlResponse(urlParameters);
-
- if (xmlResponse.isEmpty()) {
- logger.debug("Hayward getAlarmList XML response was empty");
- return false;
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ // *****Request Alarm List from Hayward server
+ String urlParameters = """
+ <?xml version="1.0" encoding="utf-8"?><Request><Name>GetAlarmList</Name><Parameters>\
+ <Parameter name="Token" dataType="String">\
+ """ + bridgehandler.account.token + "</Parameter>"
+ + "<Parameter name=\"MspSystemID\" dataType=\"int\">" + bridgehandler.account.mspSystemID
+ + "</Parameter>"
+ + "<Parameter name=\"CultureInfoName\" dataType=\"String\">en-us</Parameter></Parameters></Request>";
+
+ try {
+ String xmlResponse = bridgehandler.httpXmlResponse(urlParameters);
+
+ if (xmlResponse.isEmpty()) {
+ logger.debug("Hayward getAlarmList XML response was empty");
+ return false;
+ }
- String status = bridgehandler
- .evaluateXPath("/Response/Parameters//Parameter[@name='Status']/text()", xmlResponse)
- .get(0);
+ String status = bridgehandler
+ .evaluateXPath("/Response/Parameters//Parameter[@name='Status']/text()", xmlResponse).get(0);
- if (!("0".equals(status))) {
- logger.trace("Hayward getAlarm XML response: {}", xmlResponse);
- return false;
- }
+ if (!("0".equals(status))) {
+ logger.trace("Hayward getAlarm XML response: {}", xmlResponse);
+ return false;
+ }
- bowID = bridgehandler.evaluateXPath("//Property[@name='BowID']/text()", xmlResponse);
- parameter1 = bridgehandler.evaluateXPath("//Property[@name='Parameter1']/text()", xmlResponse);
- message = bridgehandler.evaluateXPath("//Property[@name='Message']/text()", xmlResponse);
-
- for (int i = 0; i < 5; i++) {
- if (i < bowID.size()) {
- alarmStr = parameter1.get(i) + ": " + message.get(i);
- } else {
- alarmStr = "";
- }
- updateData("backyardAlarm" + String.format("%01d", i + 1), alarmStr);
+ bowID = bridgehandler.evaluateXPath("//Property[@name='BowID']/text()", xmlResponse);
+ parameter1 = bridgehandler.evaluateXPath("//Property[@name='Parameter1']/text()", xmlResponse);
+ message = bridgehandler.evaluateXPath("//Property[@name='Message']/text()", xmlResponse);
+
+ for (int i = 0; i < 5; i++) {
+ if (i < bowID.size()) {
+ alarmStr = parameter1.get(i) + ": " + message.get(i);
+ } else {
+ alarmStr = "";
}
- this.updateStatus(ThingStatus.ONLINE);
- return true;
- } catch (InterruptedException e) {
- return false;
+ updateData("backyardAlarm" + String.format("%01d", i + 1), alarmStr);
}
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
+ this.updateStatus(ThingStatus.ONLINE);
+ return true;
+ } catch (InterruptedException e) {
return false;
}
} else {
List<String> data = new ArrayList<>();
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- systemIDs = bridgehandler.evaluateXPath("//BodyOfWater/@systemId", xmlResponse);
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ systemIDs = bridgehandler.evaluateXPath("//BodyOfWater/@systemId", xmlResponse);
- String thingSystemID = getThing().getUID().getId();
- for (int i = 0; i < systemIDs.size(); i++) {
- if (systemIDs.get(i).equals(thingSystemID)) {
- // Flow
- data = bridgehandler.evaluateXPath("//BodyOfWater/@flow", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_BOW_FLOW, data.get(i));
+ String thingSystemID = getThing().getUID().getId();
+ for (int i = 0; i < systemIDs.size(); i++) {
+ if (systemIDs.get(i).equals(thingSystemID)) {
+ // Flow
+ data = bridgehandler.evaluateXPath("//BodyOfWater/@flow", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_BOW_FLOW, data.get(i));
- // Water Temp
- data = bridgehandler.evaluateXPath("//BodyOfWater/@waterTemp", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_BOW_WATERTEMP, data.get(i));
- }
+ // Water Temp
+ data = bridgehandler.evaluateXPath("//BodyOfWater/@waterTemp", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_BOW_WATERTEMP, data.get(i));
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
}
package org.openhab.binding.haywardomnilogic.internal.handler;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
import org.openhab.binding.haywardomnilogic.internal.HaywardException;
import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
+import org.openhab.core.library.types.OnOffType;
import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatusDetail;
import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType;
+import org.openhab.core.types.State;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@NonNullByDefault
public class HaywardChlorinatorHandler extends HaywardThingHandler {
private final Logger logger = LoggerFactory.getLogger(HaywardChlorinatorHandler.class);
- public String chlorTimedPercent = "";
- public String chlorState = "";
+ private Map<String, State> channelStates = new HashMap<>();
public HaywardChlorinatorHandler(Thing thing) {
super(thing);
List<String> data = new ArrayList<>();
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- systemIDs = bridgehandler.evaluateXPath("//Chlorinator/@systemId", xmlResponse);
- String thingSystemID = getThing().getUID().getId();
- for (int i = 0; i < systemIDs.size(); i++) {
- if (systemIDs.get(i).equals(thingSystemID)) {
- // Operating Mode
- data = bridgehandler.evaluateXPath("//Chlorinator/@operatingMode", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_OPERATINGMODE, data.get(i));
-
- // Timed Percent
- data = bridgehandler.evaluateXPath("//Chlorinator/@Timed-Percent", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT, data.get(i));
- this.chlorTimedPercent = data.get(0);
-
- // scMode
- data = bridgehandler.evaluateXPath("//Chlorinator/@scMode", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_SCMODE, data.get(i));
-
- // Error
- data = bridgehandler.evaluateXPath("//Chlorinator/@chlrError", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ERROR, data.get(i));
-
- // Alert
- data = bridgehandler.evaluateXPath("//Chlorinator/@chlrAlert", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ALERT, data.get(i));
-
- // Average Salt Level
- data = bridgehandler.evaluateXPath("//Chlorinator/@avgSaltLevel", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_AVGSALTLEVEL, data.get(i));
-
- // Instant Salt Level
- data = bridgehandler.evaluateXPath("//Chlorinator/@instantSaltLevel", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_INSTANTSALTLEVEL, data.get(i));
-
- // Status
- data = bridgehandler.evaluateXPath("//Chlorinator/@status", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_STATUS, data.get(i));
-
- if ("0".equals(data.get(i))) {
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE, "0");
- // chlorState is used to set the chlorinator cfgState in the timedPercent command
- this.chlorState = "2";
- } else {
- updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE, "1");
- // chlorState is used to set the chlorinator cfgState in the timedPercent command
- this.chlorState = "3";
- }
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ systemIDs = bridgehandler.evaluateXPath("//Chlorinator/@systemId", xmlResponse);
+ String thingSystemID = getThing().getUID().getId();
+ for (int i = 0; i < systemIDs.size(); i++) {
+ if (systemIDs.get(i).equals(thingSystemID)) {
+ // Enable
+ data = bridgehandler.evaluateXPath("//Chlorinator/@enable", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE, data.get(i));
+
+ // Operating Mode
+ data = bridgehandler.evaluateXPath("//Chlorinator/@operatingMode", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_OPERATINGMODE, data.get(i));
+
+ // Timed Percent
+ data = bridgehandler.evaluateXPath("//Chlorinator/@Timed-Percent", xmlResponse);
+ channelStates
+ .putAll(updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT, data.get(i)));
+
+ // scMode
+ data = bridgehandler.evaluateXPath("//Chlorinator/@scMode", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_SCMODE, data.get(i));
+
+ // Error Bit Array
+ data = bridgehandler.evaluateXPath("//Chlorinator/@chlrError", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ERROR, String
+ .format("%16s", Integer.toBinaryString(Integer.parseInt(data.get(i)))).replace(" ", "0"));
+
+ // Alert Bit Array
+ data = bridgehandler.evaluateXPath("//Chlorinator/@chlrAlert", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_ALERT, String
+ .format("%16s", Integer.toBinaryString(Integer.parseInt(data.get(i)))).replace(" ", "0"));
+
+ // Average Salt Level
+ data = bridgehandler.evaluateXPath("//Chlorinator/@avgSaltLevel", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_AVGSALTLEVEL, data.get(i));
+
+ // Instant Salt Level
+ data = bridgehandler.evaluateXPath("//Chlorinator/@instantSaltLevel", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_INSTANTSALTLEVEL, data.get(i));
+
+ // Status Bit Array
+ data = bridgehandler.evaluateXPath("//Chlorinator/@status", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_CHLORINATOR_STATUS, String
+ .format("%16s", Integer.toBinaryString(Integer.parseInt(data.get(i)))).replace(" ", "0"));
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- String cmdString = this.cmdToString(command);
- try {
- switch (channelUID.getId()) {
- case HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE:
- if ("1".equals(cmdString)) {
- chlorCfgState = "3";
- chlorTimedPercent = this.chlorTimedPercent;
- } else {
- chlorCfgState = "2";
- chlorTimedPercent = this.chlorTimedPercent;
- }
- break;
- case HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT:
- chlorCfgState = this.chlorState;
- chlorTimedPercent = cmdString;
- break;
- default:
- logger.warn("haywardCommand Unsupported type {}", channelUID);
- return;
- }
-
- String cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
- + "<Name>SetCHLORParams</Name><Parameters>"
- + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
- + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
- + bridgehandler.account.mspSystemID + "</Parameter>"
- + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
- + "<Parameter name=\"ChlorID\" dataType=\"int\" alias=\"EquipmentID\">" + systemID
- + "</Parameter>" + "<Parameter name=\"CfgState\" dataType=\"byte\" alias=\"Data1\">"
- + chlorCfgState + "</Parameter>"
- + "<Parameter name=\"OpMode\" dataType=\"byte\" alias=\"Data2\">1</Parameter>"
- + "<Parameter name=\"BOWType\" dataType=\"byte\" alias=\"Data3\">1</Parameter>"
- + "<Parameter name=\"CellType\" dataType=\"byte\" alias=\"Data4\">4</Parameter>"
- + "<Parameter name=\"TimedPercent\" dataType=\"byte\" alias=\"Data5\">" + chlorTimedPercent
- + "</Parameter>"
- + "<Parameter name=\"SCTimeout\" dataType=\"byte\" unit=\"hour\" alias=\"Data6\">24</Parameter>"
- + "<Parameter name=\"ORPTimout\" dataType=\"byte\" unit=\"hour\" alias=\"Data7\">24</Parameter>"
- + "</Parameters></Request>";
-
- // *****Send Command to Hayward server
- String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
- String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
- .get(0);
-
- if (!("0".equals(status))) {
- logger.debug("haywardCommand XML response: {}", xmlResponse);
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ String cmdString = this.cmdToString(command);
+ try {
+ switch (channelUID.getId()) {
+ case HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE:
+ chlorTimedPercent = channelStates.get(HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT)
+ .format("%d");
+ if ("1".equals(cmdString)) {
+ chlorCfgState = "3";
+ } else {
+ chlorCfgState = "2";
+ }
+ break;
+ case HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT:
+ if (channelStates.get(HaywardBindingConstants.CHANNEL_CHLORINATOR_ENABLE) == OnOffType.ON) {
+ chlorCfgState = "3";
+ } else {
+ chlorCfgState = "2";
+ }
+ chlorTimedPercent = cmdString;
+ break;
+ default:
+ logger.warn("haywardCommand Unsupported type {}", channelUID);
return;
- }
- } catch (HaywardException e) {
- logger.debug("Unable to send command to Hayward's server {}:{}:{}",
- bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
- } catch (InterruptedException e) {
+ }
+
+ String cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + "<Name>SetCHLORParams</Name><Parameters>"
+ + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ + bridgehandler.account.mspSystemID + "</Parameter>"
+ + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ + "<Parameter name=\"ChlorID\" dataType=\"int\" alias=\"EquipmentID\">" + systemID
+ + "</Parameter>" + "<Parameter name=\"CfgState\" dataType=\"byte\" alias=\"Data1\">"
+ + chlorCfgState + "</Parameter>"
+ + "<Parameter name=\"OpMode\" dataType=\"byte\" alias=\"Data2\">1</Parameter>"
+ + "<Parameter name=\"BOWType\" dataType=\"byte\" alias=\"Data3\">1</Parameter>"
+ + "<Parameter name=\"CellType\" dataType=\"byte\" alias=\"Data4\">4</Parameter>"
+ + "<Parameter name=\"TimedPercent\" dataType=\"byte\" alias=\"Data5\">" + chlorTimedPercent
+ + "</Parameter>"
+ + "<Parameter name=\"SCTimeout\" dataType=\"byte\" unit=\"hour\" alias=\"Data6\">24</Parameter>"
+ + "<Parameter name=\"ORPTimout\" dataType=\"byte\" unit=\"hour\" alias=\"Data7\">24</Parameter>"
+ + "</Parameters></Request>";
+
+ // *****Send Command to Hayward server
+ String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
+ String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse).get(0);
+
+ if (!("0".equals(status))) {
+ logger.debug("haywardCommand XML response: {}", xmlResponse);
return;
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
+ } catch (HaywardException e) {
+ logger.debug("Unable to send command to Hayward's server {}:{}:{}", bridgehandler.config.endpointUrl,
+ bridgehandler.config.username, e.getMessage());
+ } catch (InterruptedException e) {
+ return;
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
}
package org.openhab.binding.haywardomnilogic.internal.handler;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.thing.Bridge;
+import org.openhab.core.thing.Channel;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingStatusDetail;
+import org.openhab.core.thing.binding.builder.ChannelBuilder;
+import org.openhab.core.thing.binding.builder.ThingBuilder;
+import org.openhab.core.thing.type.ChannelTypeUID;
import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType;
+import org.openhab.core.types.State;
+import org.openhab.core.types.StateDescriptionFragment;
+import org.openhab.core.types.StateDescriptionFragmentBuilder;
+import org.openhab.core.types.StateOption;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@NonNullByDefault
public class HaywardColorLogicHandler extends HaywardThingHandler {
private final Logger logger = LoggerFactory.getLogger(HaywardColorLogicHandler.class);
+ private Map<String, State> channelStates = new HashMap<>();
public HaywardColorLogicHandler(Thing thing) {
super(thing);
}
+ @Override
+ public void initialize() {
+ try {
+ setStateDescriptions();
+ if ("COLOR_LOGIC_UCL_V2"
+ .equals(getThing().getProperties().get(HaywardBindingConstants.PROPERTY_COLORLOGIC_TYPE))) {
+ addV2Channels();
+ }
+ updateStatus(ThingStatus.ONLINE);
+ } catch (HaywardException e) {
+ updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR,
+ "Unable to set ColorLogixHandler StateDescriptions");
+ }
+ }
+
+ protected void addV2Channels() {
+ if (thing.getChannel(HaywardBindingConstants.CHANNEL_COLORLOGIC_BRIGHTNESS) == null) {
+ ThingBuilder thingBuilder = editThing();
+ ChannelUID uid = new ChannelUID(thing.getUID(), HaywardBindingConstants.CHANNEL_COLORLOGIC_BRIGHTNESS);
+ ChannelBuilder chnBuilder = ChannelBuilder.create(uid, "String");
+ chnBuilder.withType(new ChannelTypeUID(HaywardBindingConstants.BINDING_ID,
+ HaywardBindingConstants.TYPE_COLORLOGIC_LIGHTBRIGHTNESS));
+ chnBuilder.withLabel("Brightness");
+ chnBuilder.withDescription("Brightness");
+ Channel channel = chnBuilder.build();
+ thingBuilder.withChannel(channel);
+ updateThing(thingBuilder.build());
+ }
+
+ if (thing.getChannel(HaywardBindingConstants.CHANNEL_COLORLOGIC_SPEED) == null) {
+ ThingBuilder thingBuilder = editThing();
+ ChannelUID uid = new ChannelUID(thing.getUID(), HaywardBindingConstants.CHANNEL_COLORLOGIC_SPEED);
+ ChannelBuilder chnBuilder = ChannelBuilder.create(uid, "String");
+ chnBuilder.withType(new ChannelTypeUID(HaywardBindingConstants.BINDING_ID,
+ HaywardBindingConstants.TYPE_COLORLOGIC_LIGHTSPEED));
+ chnBuilder.withLabel("Speed");
+ chnBuilder.withDescription("Speed");
+ Channel channel = chnBuilder.build();
+ thingBuilder.withChannel(channel);
+ updateThing(thingBuilder.build());
+ }
+ }
+
+ @Override
+ public void setStateDescriptions() throws HaywardException {
+ List<StateOption> options = new ArrayList<>();
+ Bridge bridge = getBridge();
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ // Set Light Shows based on light type
+ Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW);
+ if (ch != null) {
+ String lightType = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_COLORLOGIC_TYPE);
+ if (lightType != null) {
+ if ("COLOR_LOGIC_2_5".equals(lightType) || "COLOR_LOGIC_4_0".equals(lightType)) {
+ options.add(new StateOption("0", "Voodoo Lounge"));
+ options.add(new StateOption("1", "Deep Blue Sea"));
+ options.add(new StateOption("2", "Afternoon Sky"));
+ options.add(new StateOption("3", "Emerald"));
+ options.add(new StateOption("4", "Sangria"));
+ options.add(new StateOption("5", "Cloud White"));
+ options.add(new StateOption("6", "Twilight"));
+ options.add(new StateOption("7", "Tranquility"));
+ options.add(new StateOption("8", "Gemstone"));
+ options.add(new StateOption("9", "USA"));
+ options.add(new StateOption("10", "Mardi Gras"));
+ options.add(new StateOption("11", "Cool Cabaret"));
+ } else if (lightType.contains("COLOR_LOGIC_UCL")) {
+ options.add(new StateOption("0", "Voodoo Lounge"));
+ options.add(new StateOption("1", "Deep Blue Sea"));
+ options.add(new StateOption("2", "Royal Blue"));
+ options.add(new StateOption("3", "Afternoon Sky"));
+ options.add(new StateOption("4", "Aqua Green"));
+ options.add(new StateOption("5", "Emerald"));
+ options.add(new StateOption("6", "Cloud White"));
+ options.add(new StateOption("7", "Warm Red"));
+ options.add(new StateOption("8", "Flamingo"));
+ options.add(new StateOption("9", "Vivid Violet"));
+ options.add(new StateOption("10", "Sangria"));
+ options.add(new StateOption("11", "Twilight"));
+ options.add(new StateOption("12", "Tranquility"));
+ options.add(new StateOption("13", "Gemstone"));
+ options.add(new StateOption("14", "USA"));
+ options.add(new StateOption("15", "Mardi Gras"));
+ options.add(new StateOption("16", "Cool Cabaret"));
+ }
+ if ("COLOR_LOGIC_UCL_V2".equals(lightType)) {
+ options.add(new StateOption("17", "Yellow"));
+ options.add(new StateOption("18", "Orange"));
+ options.add(new StateOption("19", "Gold"));
+ options.add(new StateOption("20", "Mint"));
+ options.add(new StateOption("21", "Teal"));
+ options.add(new StateOption("22", "Burnt Orange"));
+ options.add(new StateOption("23", "Pure White"));
+ options.add(new StateOption("24", "Crisp White"));
+ options.add(new StateOption("25", "Warm White"));
+ options.add(new StateOption("26", "Bright Yellow"));
+ }
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withOptions(options).build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
+ }
+ }
+ }
+
@Override
public void getTelemetry(String xmlResponse) throws HaywardException {
List<String> systemIDs = new ArrayList<>();
if (systemIDs.get(i).equals(thingSystemID)) {
// Light State
data = bridgehandler.evaluateXPath("//ColorLogic-Light/@lightState", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_LIGHTSTATE, data.get(i));
+ updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_STATE, data.get(i));
if ("0".equals(data.get(i))) {
updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_ENABLE, "0");
// Current Show
data = bridgehandler.evaluateXPath("//ColorLogic-Light/@currentShow", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW, data.get(0));
+ channelStates.putAll(
+ updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW, data.get(0)));
+
+ // V2 Light Features
+ String lightType = getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_COLORLOGIC_TYPE);
+ if (lightType != null) {
+ if ("COLOR_LOGIC_UCL_V2".equals(lightType)) {
+ // Brightness
+ data = bridgehandler.evaluateXPath("//ColorLogic-Light/@brightness", xmlResponse);
+ channelStates.putAll(
+ updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_BRIGHTNESS, data.get(0)));
+
+ // Speed
+ data = bridgehandler.evaluateXPath("//ColorLogic-Light/@speed", xmlResponse);
+ channelStates.putAll(
+ updateData(HaywardBindingConstants.CHANNEL_COLORLOGIC_SPEED, data.get(0)));
+ }
+ }
}
}
this.updateStatus(ThingStatus.ONLINE);
String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
+ String show = channelStates.get(HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW).toString();
+ String brightness = null;
+ String speed = null;
Bridge bridge = getBridge();
if (bridge != null) {
if (bridgehandler != null) {
String cmdString = this.cmdToString(command);
String cmdURL = null;
+
try {
switch (channelUID.getId()) {
case HaywardBindingConstants.CHANNEL_COLORLOGIC_ENABLE:
+ HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
break;
case HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW:
+ String lightType = getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_COLORLOGIC_TYPE);
+ if (lightType != null) {
+ if (!"COLOR_LOGIC_UCL_V2".equals(lightType)) {
+ cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
+ + "<Name>SetStandAloneLightShow</Name><Parameters>"
+ + "<Parameter name=\"Token\" dataType=\"String\">"
+ + bridgehandler.account.token + "</Parameter>"
+ + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ + bridgehandler.account.mspSystemID + "</Parameter>"
+ + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ + "<Parameter name=\"LightID\" dataType=\"int\">" + systemID
+ + "</Parameter>" + "<Parameter name=\"Show\" dataType=\"int\">" + cmdString
+ + "</Parameter>" + HaywardBindingConstants.COMMAND_SCHEDULE
+ + "</Parameters></Request>";
+ } else {
+ brightness = channelStates
+ .get(HaywardBindingConstants.CHANNEL_COLORLOGIC_BRIGHTNESS).toString();
+ speed = channelStates.get(HaywardBindingConstants.CHANNEL_COLORLOGIC_SPEED)
+ .toString();
+ cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
+ + "<Name>SetStandAloneLightShowV2</Name><Parameters>"
+ + "<Parameter name=\"Token\" dataType=\"String\">"
+ + bridgehandler.account.token + "</Parameter>"
+ + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ + bridgehandler.account.mspSystemID + "</Parameter>"
+ + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ + "<Parameter name=\"LightID\" dataType=\"int\">" + systemID
+ + "</Parameter>" + "<Parameter name=\"Show\" dataType=\"int\">" + cmdString
+ + "</Parameter>" + "<Parameter name=\"Speed\" dataType=\"byte\">" + speed
+ + "</Parameter>" + "<Parameter name=\"Brightness\" dataType=\"byte\">"
+ + brightness + "</Parameter>" + HaywardBindingConstants.COMMAND_SCHEDULE
+ + "</Parameters></Request>";
+
+ }
+ }
+ break;
+ case HaywardBindingConstants.CHANNEL_COLORLOGIC_BRIGHTNESS:
+ show = channelStates.get(HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW).toString();
+ speed = channelStates.get(HaywardBindingConstants.CHANNEL_COLORLOGIC_SPEED).toString();
+ if (Integer.parseInt(cmdString) > 4) {
+ cmdString = "4";
+ }
+ cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
+ + "<Name>SetStandAloneLightShowV2</Name><Parameters>"
+ + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ + bridgehandler.account.mspSystemID + "</Parameter>"
+ + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ + "<Parameter name=\"LightID\" dataType=\"int\">" + systemID + "</Parameter>"
+ + "<Parameter name=\"Show\" dataType=\"int\">" + show + "</Parameter>"
+ + "<Parameter name=\"Speed\" dataType=\"byte\">" + speed + "</Parameter>"
+ + "<Parameter name=\"Brightness\" dataType=\"byte\">" + cmdString + "</Parameter>"
+ + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
+ break;
+ case HaywardBindingConstants.CHANNEL_COLORLOGIC_SPEED:
+ brightness = channelStates.get(HaywardBindingConstants.CHANNEL_COLORLOGIC_BRIGHTNESS)
+ .toString();
+ show = channelStates.get(HaywardBindingConstants.CHANNEL_COLORLOGIC_CURRENTSHOW).toString();
+ if (Integer.parseInt(cmdString) > 8) {
+ cmdString = "8";
+ }
cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
- + "<Name>SetStandAloneLightShow</Name><Parameters>"
+ + "<Name>SetStandAloneLightShowV2</Name><Parameters>"
+ "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ bridgehandler.account.mspSystemID + "</Parameter>"
+ "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ "<Parameter name=\"LightID\" dataType=\"int\">" + systemID + "</Parameter>"
- + "<Parameter name=\"Show\" dataType=\"int\">" + cmdString + "</Parameter>"
- + "<Parameter name=\"Speed\" dataType=\"byte\">4</Parameter>"
- + "<Parameter name=\"Brightness\" dataType=\"byte\">4</Parameter>"
- + "<Parameter name=\"Reserved\" dataType=\"byte\">0</Parameter>"
+ + "<Parameter name=\"Show\" dataType=\"int\">" + show + "</Parameter>"
+ + "<Parameter name=\"Speed\" dataType=\"byte\">" + cmdString + "</Parameter>"
+ + "<Parameter name=\"Brightness\" dataType=\"byte\">" + brightness + "</Parameter>"
+ HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
break;
default:
}
// *****Send Command to Hayward server
- String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
- String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
- .get(0);
+ if (cmdURL != null) {
+ String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
+ String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
+ .get(0);
- if (!("0".equals(status))) {
- logger.debug("haywardCommand XML response: {}", xmlResponse);
- return;
+ if (!("0".equals(status))) {
+ logger.debug("haywardCommand XML response: {}", xmlResponse);
+ return;
+ }
}
} catch (HaywardException e) {
logger.debug("Unable to send command to Hayward's server {}:{}:{}",
return;
}
this.updateStatus(ThingStatus.ONLINE);
- } else {
+ } else
+
+ {
this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
String option;
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- // Set Filter Speed % min and max speeds
- Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_FILTER_SPEEDPERCENT);
- if (ch != null) {
- StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
- .withMinimum(new BigDecimal(
- getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MINSPEED)))
- .withMaximum(new BigDecimal(
- getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MAXSPEED)))
- .build();
- bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
- }
-
- // Set Filter Speed RPM min and max speeds
- ch = thing.getChannel(HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM);
- if (ch != null) {
- StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
- .withMinimum(new BigDecimal(
- getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MINRPM)))
- .withMaximum(new BigDecimal(
- getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MAXRPM)))
- .build();
- bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ // Set Filter Speed % min and max speeds
+ Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_FILTER_SPEEDPERCENT);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MINSPEED)))
+ .withMaximum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MAXSPEED)))
+ .withPattern("%d %%").withStep(new BigDecimal(5)).withReadOnly(false).build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
- // Set Filter Speed States
- ch = thing.getChannel(HaywardBindingConstants.CHANNEL_FILTER_SPEEDSELECT);
- if (ch != null) {
- options.add(new StateOption("0", "Off"));
- option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_LOWSPEED);
- if (option != null) {
- options.add(new StateOption(option, "Low"));
- }
- option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MEDSPEED);
- if (option != null) {
- options.add(new StateOption(option, "Medium"));
- }
- option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_HIGHSPEED);
- if (option != null) {
- options.add(new StateOption(option, "High"));
- }
- option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_CUSTOMSPEED);
- if (option != null) {
- options.add(new StateOption(option, "Custom"));
- }
+ // Set Filter Speed RPM min and max speeds
+ ch = thing.getChannel(HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MINRPM)))
+ .withMaximum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MAXRPM)))
+ .withPattern("%d rpm").withStep(new BigDecimal(200)).withReadOnly(false).build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
- StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
- .withOptions(options).build();
- bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ // Set Filter Speed States
+ ch = thing.getChannel(HaywardBindingConstants.CHANNEL_FILTER_SPEEDSELECT);
+ if (ch != null) {
+ options.add(new StateOption("0", "Off"));
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_LOWSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Low"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MEDSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Medium"));
}
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_HIGHSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "High"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_CUSTOMSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Custom"));
+ }
+
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withOptions(options).build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
}
}
}
List<String> data = new ArrayList<>();
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- systemIDs = bridgehandler.evaluateXPath("//Filter/@systemId", xmlResponse);
- String thingSystemID = getThing().getUID().getId();
- for (int i = 0; i < systemIDs.size(); i++) {
- if (systemIDs.get(i).equals(thingSystemID)) {
- // Valve Position
- data = bridgehandler.evaluateXPath("//Filter/@valvePosition", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_FILTER_VALVEPOSITION, data.get(i));
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ systemIDs = bridgehandler.evaluateXPath("//Filter/@systemId", xmlResponse);
+ String thingSystemID = getThing().getUID().getId();
+ for (int i = 0; i < systemIDs.size(); i++) {
+ if (systemIDs.get(i).equals(thingSystemID)) {
+ // Valve Position
+ data = bridgehandler.evaluateXPath("//Filter/@valvePosition", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_VALVEPOSITION, data.get(i));
- // Speed percent
- data = bridgehandler.evaluateXPath("//Filter/@filterSpeed", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEEDPERCENT, data.get(i));
+ // Speed percent
+ data = bridgehandler.evaluateXPath("//Filter/@filterSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEEDPERCENT, data.get(i));
- // Speed rpm
- String filterMaxRpm = getThing().getProperties()
- .get(HaywardBindingConstants.PROPERTY_FILTER_MAXRPM);
- if (filterMaxRpm != null) {
- Integer rpmSpeed = (Integer.parseInt(data.get(i))) * (Integer.parseInt(filterMaxRpm)) / 100;
- updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM, rpmSpeed.toString());
- }
+ // Speed rpm
+ String filterMaxRpm = getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_FILTER_MAXRPM);
+ if (filterMaxRpm != null) {
+ Integer rpmSpeed = (Integer.parseInt(data.get(i))) * (Integer.parseInt(filterMaxRpm)) / 100;
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM, rpmSpeed.toString());
+ }
- if ("0".equals(data.get(i))) {
- updateData(HaywardBindingConstants.CHANNEL_FILTER_ENABLE, "0");
- } else {
- updateData(HaywardBindingConstants.CHANNEL_FILTER_ENABLE, "1");
- }
+ if ("0".equals(data.get(i))) {
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_ENABLE, "0");
+ } else {
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_ENABLE, "1");
+ }
- // Speed Select
- data = bridgehandler.evaluateXPath("//Filter/@filterSpeed", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEEDSELECT, data.get(i));
+ // Speed Select
+ data = bridgehandler.evaluateXPath("//Filter/@filterSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEEDSELECT, data.get(i));
- // State
- data = bridgehandler.evaluateXPath("//Filter/@filterState", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_FILTER_STATE, data.get(i));
+ // State
+ data = bridgehandler.evaluateXPath("//Filter/@filterState", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_STATE, data.get(i));
- // lastSpeed
- data = bridgehandler.evaluateXPath("//Filter/@lastSpeed", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_FILTER_LASTSPEED, data.get(i));
- channelStates.putAll(updateData(HaywardBindingConstants.CHANNEL_FILTER_LASTSPEED, data.get(i)));
- }
+ // lastSpeed
+ data = bridgehandler.evaluateXPath("//Filter/@lastSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_LASTSPEED, data.get(i));
+ channelStates.putAll(updateData(HaywardBindingConstants.CHANNEL_FILTER_LASTSPEED, data.get(i)));
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
List<String> data = new ArrayList<>();
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- systemIDs = bridgehandler.evaluateXPath("//Heater/@systemId", xmlResponse);
- String thingSystemID = getThing().getUID().getId();
- for (int i = 0; i < systemIDs.size(); i++) {
- if (systemIDs.get(i).equals(thingSystemID)) {
- // State
- data = bridgehandler.evaluateXPath("//Heater/@heaterState", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_HEATER_STATE, data.get(i));
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ systemIDs = bridgehandler.evaluateXPath("//Heater/@systemId", xmlResponse);
+ String thingSystemID = getThing().getUID().getId();
+ for (int i = 0; i < systemIDs.size(); i++) {
+ if (systemIDs.get(i).equals(thingSystemID)) {
+ // State
+ data = bridgehandler.evaluateXPath("//Heater/@heaterState", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_HEATER_STATE, data.get(i));
- // Enable
- data = bridgehandler.evaluateXPath("//Heater/@enable", xmlResponse);
- if ("0".equals(data.get(i))) {
- updateData(HaywardBindingConstants.CHANNEL_HEATER_ENABLE, "0");
- } else {
- updateData(HaywardBindingConstants.CHANNEL_HEATER_ENABLE, "1");
- }
+ // Enable
+ data = bridgehandler.evaluateXPath("//Heater/@enable", xmlResponse);
+ if ("0".equals(data.get(i))) {
+ updateData(HaywardBindingConstants.CHANNEL_HEATER_ENABLE, "0");
+ } else {
+ updateData(HaywardBindingConstants.CHANNEL_HEATER_ENABLE, "1");
}
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
}
String option;
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- // Set Pump % min and max speeds
- Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT);
- if (ch != null) {
- StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
- .withMinimum(new BigDecimal(
- getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MINSPEED)))
- .withMaximum(new BigDecimal(
- getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXSPEED)))
- .build();
- bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
- }
-
- // Set Pump Speed RPM min and max speeds
- ch = thing.getChannel(HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM);
- if (ch != null) {
- StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
- .withMinimum(new BigDecimal(
- getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MINRPM)))
- .withMaximum(new BigDecimal(
- getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXRPM)))
- .build();
- bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ // Set Pump % min and max speeds
+ Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MINSPEED)))
+ .withMaximum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXSPEED)))
+ .withPattern("%d %%").withStep(new BigDecimal(5)).withReadOnly(false).build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
- // Set Pump Speed States
- ch = thing.getChannel(HaywardBindingConstants.CHANNEL_PUMP_SPEEDSELECT);
- if (ch != null) {
- options.add(new StateOption("0", "Off"));
- option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_LOWSPEED);
- if (option != null) {
- options.add(new StateOption(option, "Low"));
- }
- option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MEDSPEED);
- if (option != null) {
- options.add(new StateOption(option, "Medium"));
- }
- option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_HIGHSPEED);
- if (option != null) {
- options.add(new StateOption(option, "High"));
- }
- option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_CUSTOMSPEED);
- if (option != null) {
- options.add(new StateOption(option, "Custom"));
- }
+ // Set Pump Speed RPM min and max speeds
+ ch = thing.getChannel(HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MINRPM)))
+ .withMaximum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXRPM)))
+ .withPattern("%d rpm").withStep(new BigDecimal(200)).withReadOnly(false).build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
- StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
- .withOptions(options).build();
- bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ // Set Pump Speed States
+ ch = thing.getChannel(HaywardBindingConstants.CHANNEL_PUMP_SPEEDSELECT);
+ if (ch != null) {
+ options.add(new StateOption("0", "Off"));
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_LOWSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Low"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MEDSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Medium"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_HIGHSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "High"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_CUSTOMSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Custom"));
}
+
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withOptions(options).build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
}
}
}
List<String> data = new ArrayList<>();
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- systemIDs = bridgehandler.evaluateXPath("//Pump/@systemId", xmlResponse);
- String thingSystemID = getThing().getUID().getId();
- for (int i = 0; i < systemIDs.size(); i++) {
- if (systemIDs.get(i).equals(thingSystemID)) {
- // Speed percent
- data = bridgehandler.evaluateXPath("//Pump/@pumpSpeed", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT, data.get(i));
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ systemIDs = bridgehandler.evaluateXPath("//Pump/@systemId", xmlResponse);
+ String thingSystemID = getThing().getUID().getId();
+ for (int i = 0; i < systemIDs.size(); i++) {
+ if (systemIDs.get(i).equals(thingSystemID)) {
+ // Speed percent
+ data = bridgehandler.evaluateXPath("//Pump/@pumpSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT, data.get(i));
- // Speed rpm
- String pumpMaxRpm = getThing().getProperties()
- .get(HaywardBindingConstants.PROPERTY_PUMP_MAXRPM);
- if (pumpMaxRpm != null) {
- Integer rpmSpeed = (Integer.parseInt(data.get(i))) * (Integer.parseInt(pumpMaxRpm)) / 100;
- updateData(HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM, rpmSpeed.toString());
- }
+ // Speed rpm
+ String pumpMaxRpm = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXRPM);
+ if (pumpMaxRpm != null) {
+ Integer rpmSpeed = (Integer.parseInt(data.get(i))) * (Integer.parseInt(pumpMaxRpm)) / 100;
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM, rpmSpeed.toString());
+ }
- if ("0".equals(data.get(i))) {
- updateData(HaywardBindingConstants.CHANNEL_PUMP_ENABLE, "0");
- } else {
- updateData(HaywardBindingConstants.CHANNEL_PUMP_ENABLE, "1");
- }
+ if ("0".equals(data.get(i))) {
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_ENABLE, "0");
+ } else {
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_ENABLE, "1");
+ }
- // Speed Select
- data = bridgehandler.evaluateXPath("//Pump/@pumpSpeed", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_PUMP_SPEEDSELECT, data.get(i));
+ // Speed Select
+ data = bridgehandler.evaluateXPath("//Pump/@pumpSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_SPEEDSELECT, data.get(i));
- // State
- data = bridgehandler.evaluateXPath("//Pump/@pumpState", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_PUMP_STATE, data.get(i));
+ // State
+ data = bridgehandler.evaluateXPath("//Pump/@pumpState", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_STATE, data.get(i));
- // lastSpeed
- data = bridgehandler.evaluateXPath("//Pump/@lastSpeed", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED, data.get(i));
- channelStates.putAll(updateData(HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED, data.get(i)));
- }
+ // lastSpeed
+ data = bridgehandler.evaluateXPath("//Pump/@lastSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED, data.get(i));
+ channelStates.putAll(updateData(HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED, data.get(i)));
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
String pumpMaxRpm = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXRPM);
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- String cmdString = this.cmdToString(command);
- try {
- switch (channelUID.getId()) {
- case HaywardBindingConstants.CHANNEL_PUMP_ENABLE:
- if (command == OnOffType.ON) {
- cmdString = channelStates.get(HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED)
- .format("%d");
- } else {
- cmdString = "0";
- }
- break;
- case HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT:
- if (pumpMinSpeed != null && pumpMaxSpeed != null) {
- if (Integer.parseInt(cmdString) > 0
- && Integer.parseInt(cmdString) < Integer.parseInt(pumpMinSpeed)) {
- cmdString = pumpMinSpeed;
- } else if (Integer.parseInt(cmdString) > Integer.parseInt(pumpMaxSpeed)) {
- cmdString = pumpMaxSpeed;
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ String cmdString = this.cmdToString(command);
+ try {
+ switch (channelUID.getId()) {
+ case HaywardBindingConstants.CHANNEL_PUMP_ENABLE:
+ if (command == OnOffType.ON) {
+ cmdString = channelStates.get(HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED).format("%d");
+ } else {
+ cmdString = "0";
+ }
+ break;
+ case HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT:
+ if (pumpMinSpeed != null && pumpMaxSpeed != null) {
+ if (Integer.parseInt(cmdString) > 0
+ && Integer.parseInt(cmdString) < Integer.parseInt(pumpMinSpeed)) {
+ cmdString = pumpMinSpeed;
+ } else if (Integer.parseInt(cmdString) > Integer.parseInt(pumpMaxSpeed)) {
+ cmdString = pumpMaxSpeed;
}
- break;
- case HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM:
- // Convert cmdString from RPM to Percent
- if (pumpMaxRpm != null && pumpMaxSpeed != null && pumpMinSpeed != null) {
- cmdString = Integer
- .toString((Integer.parseInt(cmdString) * 100 / Integer.parseInt(pumpMaxSpeed)));
- if (Integer.parseInt(cmdString) > 0
- && Integer.parseInt(cmdString) < Integer.parseInt(pumpMinSpeed)) {
- cmdString = pumpMinSpeed;
- } else if (Integer.parseInt(cmdString) > Integer.parseInt(pumpMaxSpeed)) {
- cmdString = pumpMaxSpeed;
- }
+ }
+ break;
+ case HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM:
+ // Convert cmdString from RPM to Percent
+ if (pumpMaxRpm != null && pumpMaxSpeed != null && pumpMinSpeed != null) {
+ cmdString = Integer
+ .toString((Integer.parseInt(cmdString) * 100 / Integer.parseInt(pumpMaxRpm)));
+ if (Integer.parseInt(cmdString) > 0
+ && Integer.parseInt(cmdString) < Integer.parseInt(pumpMinSpeed)) {
+ cmdString = pumpMinSpeed;
+ } else if (Integer.parseInt(cmdString) > Integer.parseInt(pumpMaxSpeed)) {
+ cmdString = pumpMaxSpeed;
}
- break;
- case HaywardBindingConstants.CHANNEL_PUMP_SPEEDSELECT:
- break;
- default:
- logger.warn("haywardCommand Unsupported type {}", channelUID);
- return;
- }
+ }
+ break;
+ case HaywardBindingConstants.CHANNEL_PUMP_SPEEDSELECT:
+ break;
+ default:
+ logger.warn("haywardCommand Unsupported type {}", channelUID);
+ return;
+ }
- String cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
- + "<Name>SetUIEquipmentCmd</Name><Parameters>"
- + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
- + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
- + bridgehandler.account.mspSystemID + "</Parameter>"
- + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
- + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
- + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
- + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
+ String cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
+ + "<Name>SetUIEquipmentCmd</Name><Parameters>"
+ + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ + bridgehandler.account.mspSystemID + "</Parameter>"
+ + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
+ + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
+ + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
- // *****Send Command to Hayward server
- String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
- String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
- .get(0);
+ // *****Send Command to Hayward server
+ String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
+ String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse).get(0);
- if (!("0".equals(status))) {
- logger.debug("haywardCommand XML response: {}", xmlResponse);
- return;
- }
- } catch (HaywardException e) {
- logger.debug("Unable to send command to Hayward's server {}:{}:{}",
- bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
- } catch (InterruptedException e) {
+ if (!("0".equals(status))) {
+ logger.debug("haywardCommand XML response: {}", xmlResponse);
return;
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
+ } catch (HaywardException e) {
+ logger.debug("Unable to send command to Hayward's server {}:{}:{}", bridgehandler.config.endpointUrl,
+ bridgehandler.config.username, e.getMessage());
+ } catch (InterruptedException e) {
+ return;
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
}
List<String> data = new ArrayList<>();
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- systemIDs = bridgehandler.evaluateXPath("//Relay/@systemId", xmlResponse);
- data = bridgehandler.evaluateXPath("//Relay/@relayState", xmlResponse);
- String thingSystemID = getThing().getUID().getId();
- for (int i = 0; i < systemIDs.size(); i++) {
- if (systemIDs.get(i).equals(thingSystemID)) {
- updateData(HaywardBindingConstants.CHANNEL_RELAY_STATE, data.get(i));
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ systemIDs = bridgehandler.evaluateXPath("//Relay/@systemId", xmlResponse);
+ data = bridgehandler.evaluateXPath("//Relay/@relayState", xmlResponse);
+ String thingSystemID = getThing().getUID().getId();
+ for (int i = 0; i < systemIDs.size(); i++) {
+ if (systemIDs.get(i).equals(thingSystemID)) {
+ updateData(HaywardBindingConstants.CHANNEL_RELAY_STATE, data.get(i));
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- String cmdString = this.cmdToString(command);
- String cmdURL = null;
- try {
- switch (channelUID.getId()) {
- case HaywardBindingConstants.CHANNEL_RELAY_STATE:
- cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
- + "<Name>SetUIEquipmentCmd</Name><Parameters>"
- + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
- + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
- + bridgehandler.account.mspSystemID + "</Parameter>"
- + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
- + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
- + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
- + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
- break;
- default:
- logger.warn("haywardCommand Unsupported type {}", channelUID);
- return;
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ String cmdString = this.cmdToString(command);
+ String cmdURL = null;
+ try {
+ switch (channelUID.getId()) {
+ case HaywardBindingConstants.CHANNEL_RELAY_STATE:
+ cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
+ + "<Name>SetUIEquipmentCmd</Name><Parameters>"
+ + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ + bridgehandler.account.mspSystemID + "</Parameter>"
+ + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
+ + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
+ + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
+ break;
+ default:
+ logger.warn("haywardCommand Unsupported type {}", channelUID);
+ return;
+ }
- // *****Send Command to Hayward server
- String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
- String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
- .get(0);
+ // *****Send Command to Hayward server
+ String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
+ String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse).get(0);
- if (!("0".equals(status))) {
- logger.debug("haywardCommand XML response: {}", xmlResponse);
- return;
- }
- } catch (HaywardException e) {
- logger.debug("Unable to send command to Hayward's server {}:{}:{}",
- bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
- } catch (InterruptedException e) {
+ if (!("0".equals(status))) {
+ logger.debug("haywardCommand XML response: {}", xmlResponse);
return;
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
+ } catch (HaywardException e) {
+ logger.debug("Unable to send command to Hayward's server {}:{}:{}", bridgehandler.config.endpointUrl,
+ bridgehandler.config.username, e.getMessage());
+ } catch (InterruptedException e) {
+ return;
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
}
@Override
public void setStateDescriptions() throws HaywardException {
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- // Set heater min and max speeds
- Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT);
- if (ch != null) {
- StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
- .withMinimum(new BigDecimal(getThing().getProperties()
- .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP)))
- .withMaximum(new BigDecimal(getThing().getProperties()
- .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP)))
- .build();
- bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ // Set heater min and max speeds
+ Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP)))
+ .withMaximum(new BigDecimal(getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP)))
+ .build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
}
}
}
List<String> data = new ArrayList<>();
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- systemIDs = bridgehandler.evaluateXPath("//VirtualHeater/@systemId", xmlResponse);
- String thingSystemID = getThing().getUID().getId();
- for (int i = 0; i < systemIDs.size(); i++) {
- if (systemIDs.get(i).equals(thingSystemID)) {
- data = bridgehandler.evaluateXPath("//VirtualHeater/@Current-Set-Point", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT, data.get(i));
-
- data = bridgehandler.evaluateXPath("//VirtualHeater/@enable", xmlResponse);
- if ("yes".equals(data.get(i))) {
- updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "1");
- } else if ("no".equals(data.get(i))) {
- updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "0");
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ systemIDs = bridgehandler.evaluateXPath("//VirtualHeater/@systemId", xmlResponse);
+ String thingSystemID = getThing().getUID().getId();
+ for (int i = 0; i < systemIDs.size(); i++) {
+ if (systemIDs.get(i).equals(thingSystemID)) {
+ data = bridgehandler.evaluateXPath("//VirtualHeater/@Current-Set-Point", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT, data.get(i));
+
+ data = bridgehandler.evaluateXPath("//VirtualHeater/@enable", xmlResponse);
+ if ("yes".equals(data.get(i))) {
+ updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "1");
+ } else if ("no".equals(data.get(i))) {
+ updateData(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE, "0");
}
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
.get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP);
Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- String cmdString = this.cmdToString(command);
- String cmdURL = null;
-
- if (command == OnOffType.ON) {
- cmdString = "True";
- } else if (command == OnOffType.OFF) {
- cmdString = "False";
- }
+ if (bridge != null && bridge.getHandler() instanceof HaywardBridgeHandler bridgehandler) {
+ String cmdString = this.cmdToString(command);
+ String cmdURL = null;
+
+ if (command == OnOffType.ON) {
+ cmdString = "True";
+ } else if (command == OnOffType.OFF) {
+ cmdString = "False";
+ }
- try {
- switch (channelUID.getId()) {
- case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE:
- cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
- + "<Name>SetHeaterEnable</Name><Parameters>"
- + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
- + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
- + bridgehandler.account.mspSystemID + "</Parameter>"
- + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
- + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
- + "<Parameter name=\"Enabled\" dataType=\"bool\">" + cmdString + "</Parameter>"
- + "</Parameters></Request>";
- break;
-
- case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT:
- if (heaterMinSetTemp != null && heaterMaxSetTemp != null) {
- if (Integer.parseInt(cmdString) < Integer.parseInt(heaterMinSetTemp)) {
- cmdString = heaterMinSetTemp;
- } else if (Integer.parseInt(cmdString) > Integer.parseInt(heaterMaxSetTemp)) {
- cmdString = heaterMaxSetTemp;
- }
+ try {
+ switch (channelUID.getId()) {
+ case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE:
+ cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + "<Name>SetHeaterEnable</Name><Parameters>"
+ + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ + bridgehandler.account.mspSystemID + "</Parameter>"
+ + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
+ + "<Parameter name=\"Enabled\" dataType=\"bool\">" + cmdString + "</Parameter>"
+ + "</Parameters></Request>";
+ break;
+
+ case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT:
+ if (heaterMinSetTemp != null && heaterMaxSetTemp != null) {
+ if (Integer.parseInt(cmdString) < Integer.parseInt(heaterMinSetTemp)) {
+ cmdString = heaterMinSetTemp;
+ } else if (Integer.parseInt(cmdString) > Integer.parseInt(heaterMaxSetTemp)) {
+ cmdString = heaterMaxSetTemp;
}
+ }
- cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
- + "<Name>SetUIHeaterCmd</Name><Parameters>"
- + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
- + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
- + bridgehandler.account.mspSystemID + "</Parameter>"
- + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
- + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
- + "<Parameter name=\"Temp\" dataType=\"int\">" + cmdString + "</Parameter>"
- + "</Parameters></Request>";
- break;
- default:
- logger.warn("haywardCommand Unsupported type {}", channelUID);
- return;
- }
+ cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + "<Name>SetUIHeaterCmd</Name><Parameters>"
+ + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ + bridgehandler.account.mspSystemID + "</Parameter>"
+ + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ + "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
+ + "<Parameter name=\"Temp\" dataType=\"int\">" + cmdString + "</Parameter>"
+ + "</Parameters></Request>";
+ break;
+ default:
+ logger.warn("haywardCommand Unsupported type {}", channelUID);
+ return;
+ }
- // *****Send Command to Hayward server
- String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
- String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
- .get(0);
+ // *****Send Command to Hayward server
+ String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
+ String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse).get(0);
- if (!("0".equals(status))) {
- logger.debug("haywardCommand XML response: {}", xmlResponse);
- return;
- }
- } catch (HaywardException e) {
- logger.debug("Unable to send command to Hayward's server {}:{}:{}",
- bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
- } catch (InterruptedException e) {
+ if (!("0".equals(status))) {
+ logger.debug("haywardCommand XML response: {}", xmlResponse);
return;
}
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
+ } catch (HaywardException e) {
+ logger.debug("Unable to send command to Hayward's server {}:{}:{}", bridgehandler.config.endpointUrl,
+ bridgehandler.config.username, e.getMessage());
+ } catch (InterruptedException e) {
+ return;
}
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
}
}
}
# thing types
thing-type.haywardomnilogic.backyard.label = Backyard
-thing-type.haywardomnilogic.backyard.description = The Hayward Backyard
thing-type.haywardomnilogic.bow.label = Body of Water
-thing-type.haywardomnilogic.bow.description = The Hayward Body of Water
thing-type.haywardomnilogic.bridge.label = Hayward OmniLogix Connection
thing-type.haywardomnilogic.bridge.description = Connection to Hayward's Server
thing-type.haywardomnilogic.chlorinator.label = Chlorinator
-thing-type.haywardomnilogic.chlorinator.description = Chlorinator
thing-type.haywardomnilogic.colorlogic.label = Color Logic Light
-thing-type.haywardomnilogic.colorlogic.description = Color Logic Light
thing-type.haywardomnilogic.filter.label = Filter
-thing-type.haywardomnilogic.filter.description = Filter Equipment
thing-type.haywardomnilogic.heater.label = Heater
-thing-type.haywardomnilogic.heater.description = Heater
thing-type.haywardomnilogic.pump.label = Pump
-thing-type.haywardomnilogic.pump.description = Pump
thing-type.haywardomnilogic.relay.label = Relay
-thing-type.haywardomnilogic.relay.description = Relay
-thing-type.haywardomnilogic.sensor.label = Sensor
-thing-type.haywardomnilogic.sensor.description = Sensor
thing-type.haywardomnilogic.virtualHeater.label = Virtual Heater
-thing-type.haywardomnilogic.virtualHeater.description = Virtual Heater
# thing types config
# channel types
channel-type.haywardomnilogic.airTemp.label = Air Temp
-channel-type.haywardomnilogic.airTemp.description = Air Temp
channel-type.haywardomnilogic.alarm.label = Alarm
-channel-type.haywardomnilogic.alarm.description = Alarm
channel-type.haywardomnilogic.avgSaltLevel.label = Average Salt Level
-channel-type.haywardomnilogic.avgSaltLevel.description = Average Salt Level
channel-type.haywardomnilogic.backyardstate.label = State
-channel-type.haywardomnilogic.backyardstate.description = State
channel-type.haywardomnilogic.backyardstate.state.option.0 = Powered Off
channel-type.haywardomnilogic.backyardstate.state.option.1 = Normal
channel-type.haywardomnilogic.backyardstate.state.option.2 = Service Mode
channel-type.haywardomnilogic.backyardstate.state.option.3 = Config Mode
channel-type.haywardomnilogic.backyardstate.state.option.4 = Timed Service Mode
channel-type.haywardomnilogic.backyardstatus.label = Status
-channel-type.haywardomnilogic.backyardstatus.description = Status
channel-type.haywardomnilogic.backyardstatus.state.option.1 = Normal
channel-type.haywardomnilogic.backyardstatus.state.option.2 = Alarm
channel-type.haywardomnilogic.backyardstatus.state.option.3 = Expired
channel-type.haywardomnilogic.backyardstatus.state.option.4 = Lost Link
channel-type.haywardomnilogic.backyardstatus.state.option.5 = Service Mode
-channel-type.haywardomnilogic.bow.label = Body of Water
-channel-type.haywardomnilogic.bow.description = The Body of Water ID
channel-type.haywardomnilogic.chlorAlert.label = Chlorinator Alert
-channel-type.haywardomnilogic.chlorAlert.description = Chlorinator Alert
-channel-type.haywardomnilogic.chlorAlert.state.option.0 = None
-channel-type.haywardomnilogic.chlorAlert.state.option.16 = Low T-Cell Temperature
channel-type.haywardomnilogic.chlorError.label = Chlorinator Error
channel-type.haywardomnilogic.chlorOperatingMode.label = Operating Mode
-channel-type.haywardomnilogic.chlorOperatingMode.description = Operating Mode
-channel-type.haywardomnilogic.chlorOperatingMode.state.option.0 = Off
channel-type.haywardomnilogic.chlorOperatingMode.state.option.1 = Timed Percent
channel-type.haywardomnilogic.chlorOperatingMode.state.option.2 = ORP Autosense
channel-type.haywardomnilogic.currentSetpoint.label = Current Setpoint
-channel-type.haywardomnilogic.currentSetpoint.description = Current Setpoint
channel-type.haywardomnilogic.currentShow.label = Current Show
-channel-type.haywardomnilogic.currentShow.description = Current Show
-channel-type.haywardomnilogic.currentShow.state.option.0 = Voodoo Lounge
-channel-type.haywardomnilogic.currentShow.state.option.1 = Deep Blue Sea
-channel-type.haywardomnilogic.currentShow.state.option.2 = Royal Blue
-channel-type.haywardomnilogic.currentShow.state.option.3 = Afternoon Sky
-channel-type.haywardomnilogic.currentShow.state.option.4 = Aqua Green
-channel-type.haywardomnilogic.currentShow.state.option.5 = Emerald
-channel-type.haywardomnilogic.currentShow.state.option.6 = Cloud White
-channel-type.haywardomnilogic.currentShow.state.option.7 = Warm Red
-channel-type.haywardomnilogic.currentShow.state.option.8 = Flamingo
-channel-type.haywardomnilogic.currentShow.state.option.9 = Vivid Violet
-channel-type.haywardomnilogic.currentShow.state.option.10 = Sangria
-channel-type.haywardomnilogic.currentShow.state.option.11 = Twilight
-channel-type.haywardomnilogic.currentShow.state.option.12 = Tranquility
-channel-type.haywardomnilogic.currentShow.state.option.13 = Gemstone
-channel-type.haywardomnilogic.currentShow.state.option.14 = USA
-channel-type.haywardomnilogic.currentShow.state.option.15 = Mardi Gras
-channel-type.haywardomnilogic.currentShow.state.option.16 = Cool Cabaret
-channel-type.haywardomnilogic.data.label = Data
-channel-type.haywardomnilogic.data.description = Sensor Data
channel-type.haywardomnilogic.enable.label = Heater Enable
-channel-type.haywardomnilogic.enable.description = Heater Enable
channel-type.haywardomnilogic.filterLastSpeed.label = Last Speed
-channel-type.haywardomnilogic.filterLastSpeed.description = Last Speed
-channel-type.haywardomnilogic.filterSpeed.label = Filter Speed
-channel-type.haywardomnilogic.filterSpeed.description = Filter Speed in %
+channel-type.haywardomnilogic.filterLastSpeed.description = Last filter speed in percentage
+channel-type.haywardomnilogic.filterSpeedPercent.label = Filter Speed
+channel-type.haywardomnilogic.filterSpeedPercent.description = Filter speed in percentage
+channel-type.haywardomnilogic.filterSpeedRpm.label = Filter Speed
+channel-type.haywardomnilogic.filterSpeedRpm.description = Filter speed in rpm
+channel-type.haywardomnilogic.filterSpeedSelect.label = Filter Speed States
+channel-type.haywardomnilogic.filterSpeedSelect.state.option.0 = Off
+channel-type.haywardomnilogic.filterSpeedSelect.state.option.33 = Low
+channel-type.haywardomnilogic.filterSpeedSelect.state.option.66 = Medium
+channel-type.haywardomnilogic.filterSpeedSelect.state.option.100 = High
+channel-type.haywardomnilogic.filterSpeedSelect.state.option.100 = Custom
channel-type.haywardomnilogic.filterState.label = Filter State
-channel-type.haywardomnilogic.filterState.description = Filter State
channel-type.haywardomnilogic.filterState.state.option.0 = Off
channel-type.haywardomnilogic.filterState.state.option.1 = Running
channel-type.haywardomnilogic.filterState.state.option.2 = Priming
channel-type.haywardomnilogic.filterState.state.option.10 = Filter Force Priming
channel-type.haywardomnilogic.filterState.state.option.11 = Filter Waiting for Pump to Turn Off
channel-type.haywardomnilogic.instantSaltLevel.label = Instant Salt Level
-channel-type.haywardomnilogic.instantSaltLevel.description = Instant Salt Level
+channel-type.haywardomnilogic.lightBrightness.label = Light Brightness
+channel-type.haywardomnilogic.lightBrightness.state.option.0 = 20%
+channel-type.haywardomnilogic.lightBrightness.state.option.1 = 40%
+channel-type.haywardomnilogic.lightBrightness.state.option.2 = 60%
+channel-type.haywardomnilogic.lightBrightness.state.option.3 = 80%
+channel-type.haywardomnilogic.lightBrightness.state.option.4 = 100%
+channel-type.haywardomnilogic.lightSpeed.label = Light Speed
+channel-type.haywardomnilogic.lightSpeed.state.option.0 = 1/16x
+channel-type.haywardomnilogic.lightSpeed.state.option.1 = 1/8x
+channel-type.haywardomnilogic.lightSpeed.state.option.2 = 1/4x
+channel-type.haywardomnilogic.lightSpeed.state.option.3 = 1/2x
+channel-type.haywardomnilogic.lightSpeed.state.option.4 = 1x
+channel-type.haywardomnilogic.lightSpeed.state.option.5 = 2x
+channel-type.haywardomnilogic.lightSpeed.state.option.6 = 4x
+channel-type.haywardomnilogic.lightSpeed.state.option.7 = 8x
+channel-type.haywardomnilogic.lightSpeed.state.option.8 = 16x
channel-type.haywardomnilogic.lightState.label = Light State
-channel-type.haywardomnilogic.lightState.description = Light State
channel-type.haywardomnilogic.lightState.state.option.0 = Off
channel-type.haywardomnilogic.lightState.state.option.1 = On
channel-type.haywardomnilogic.lightState.state.option.4 = 15 Sec White Light
channel-type.haywardomnilogic.lightState.state.option.7 = Powering Off
-channel-type.haywardomnilogic.pumpSpeed.label = Pump Speed in %
-channel-type.haywardomnilogic.pumpSpeed.description = Pump Speed
+channel-type.haywardomnilogic.pumpLastSpeed.label = Last Speed
+channel-type.haywardomnilogic.pumpLastSpeed.description = Last pump speed in percentage
+channel-type.haywardomnilogic.pumpSpeedPercent.label = Pump Speed
+channel-type.haywardomnilogic.pumpSpeedPercent.description = Pump speed in percentage
+channel-type.haywardomnilogic.pumpSpeedRpm.label = Pump Speed
+channel-type.haywardomnilogic.pumpSpeedRpm.description = Pump speed in rpm
+channel-type.haywardomnilogic.pumpSpeedSelect.label = Pump Speed States
+channel-type.haywardomnilogic.pumpSpeedSelect.state.option.0 = Off
+channel-type.haywardomnilogic.pumpSpeedSelect.state.option.33 = Low
+channel-type.haywardomnilogic.pumpSpeedSelect.state.option.66 = Medium
+channel-type.haywardomnilogic.pumpSpeedSelect.state.option.100 = High
+channel-type.haywardomnilogic.pumpSpeedSelect.state.option.100 = Custom
+channel-type.haywardomnilogic.pumpState.label = Pump State
+channel-type.haywardomnilogic.pumpState.state.option.0 = Off
+channel-type.haywardomnilogic.pumpState.state.option.1 = Running
+channel-type.haywardomnilogic.pumpState.state.option.2 = Priming
+channel-type.haywardomnilogic.pumpState.state.option.3 = Waiting to Turn Off
+channel-type.haywardomnilogic.pumpState.state.option.4 = Waiting to Turn Off Manual
+channel-type.haywardomnilogic.pumpState.state.option.5 = Heater Extend
+channel-type.haywardomnilogic.pumpState.state.option.6 = Heater Cool Down
+channel-type.haywardomnilogic.pumpState.state.option.7 = Suspended
+channel-type.haywardomnilogic.pumpState.state.option.8 = CSAD Extend
+channel-type.haywardomnilogic.pumpState.state.option.9 = Superchlorinate
+channel-type.haywardomnilogic.pumpState.state.option.10 = Force Priming
+channel-type.haywardomnilogic.pumpState.state.option.11 = Waiting for Pump to Turn Off
channel-type.haywardomnilogic.scMode.label = scMode
-channel-type.haywardomnilogic.scMode.description = scMode
channel-type.haywardomnilogic.scMode.state.option.0 = Off
channel-type.haywardomnilogic.scMode.state.option.1 = Super Chlorinating
channel-type.haywardomnilogic.state.label = Heater State
-channel-type.haywardomnilogic.state.description = Heater State
+channel-type.haywardomnilogic.state.state.option.0 = Off
+channel-type.haywardomnilogic.state.state.option.1 = Heating
+channel-type.haywardomnilogic.state.state.option.2 = Paused
channel-type.haywardomnilogic.status.label = Status
-channel-type.haywardomnilogic.status.description = Status
channel-type.haywardomnilogic.timedPercent.label = Salt Output (%)
-channel-type.haywardomnilogic.timedPercent.description = Current salt output setting for the chlorinator (%).
channel-type.haywardomnilogic.valvePosition.label = Valve Position
-channel-type.haywardomnilogic.valvePosition.description = Valve Position
channel-type.haywardomnilogic.valvePosition.state.option.0 = Off
channel-type.haywardomnilogic.valvePosition.state.option.1 = Pool Only
channel-type.haywardomnilogic.valvePosition.state.option.2 = Spa Only
channel-type.haywardomnilogic.valvePosition.state.option.3 = Spill Over
channel-type.haywardomnilogic.waterFlow.label = Flow Sensor
-channel-type.haywardomnilogic.waterFlow.description = Flow Sensor
channel-type.haywardomnilogic.waterTemp.label = Water Temp
-channel-type.haywardomnilogic.waterTemp.description = Water Temp
</supported-bridge-type-refs>
<label>Backyard</label>
- <description>The Hayward Backyard</description>
<channels>
<channel id="backyardAirTemp" typeId="airTemp"/>
<channel id="backyardStatus" typeId="backyardstatus"/>
<channel-type id="airTemp">
<item-type>Number:Temperature</item-type>
<label>Air Temp</label>
- <description>Air Temp</description>
<state pattern="%d %unit%" readOnly="true"/>
</channel-type>
<channel-type id="backyardstatus">
<item-type>String</item-type>
<label>Status</label>
- <description>Status</description>
<state readOnly="true">
<options>
<option value="1">Normal</option>
<channel-type id="backyardstate">
<item-type>String</item-type>
<label>State</label>
- <description>State</description>
<state readOnly="true">
<options>
<option value="0">Powered Off</option>
<channel-type id="alarm">
<item-type>String</item-type>
<label>Alarm</label>
- <description>Alarm</description>
- <state readOnly="true"/>
+ <state pattern="%s" readOnly="true"/>
</channel-type>
</thing:thing-descriptions>
</supported-bridge-type-refs>
<label>Body of Water</label>
- <description>The Hayward Body of Water</description>
<channels>
<channel id="bowFlow" typeId="waterFlow"/>
<channel id="bowWaterTemp" typeId="waterTemp"/>
<channel-type id="waterFlow">
<item-type>Switch</item-type>
<label>Flow Sensor</label>
- <description>Flow Sensor</description>
<state readOnly="true"/>
</channel-type>
<channel-type id="waterTemp">
<item-type>Number:Temperature</item-type>
<label>Water Temp</label>
- <description>Water Temp</description>
<state pattern="%d %unit%" readOnly="true"/>
</channel-type>
<label>Password</label>
<description>The password to connect to the server.</description>
</parameter>
- <parameter name="telemetryPollTime" type="integer" min="10" max="60" unit="s" required="true">
+ <parameter name="telemetryPollTime" type="integer" min="2" max="60" unit="s" required="true">
<label>Telemetry Poll Delay</label>
- <default>12</default>
+ <default>3</default>
<description>How often to request telemetry data from Hayward Server</description>
</parameter>
<parameter name="alarmPollTime" type="integer" min="0" max="120" unit="s" required="true">
<label>Alarm Poll Delay</label>
- <default>60</default>
+ <default>10</default>
<description>How often to request alarm data from Hayward Server. Enter 0 to disable.</description>
</parameter>
</config-description>
</supported-bridge-type-refs>
<label>Chlorinator</label>
- <description>Chlorinator</description>
<channels>
<channel id="chlorEnable" typeId="system.power"/>
<channel id="chlorOperatingMode" typeId="chlorOperatingMode"/>
<channel id="chlorAlert" typeId="chlorAlert"/>
<channel id="chlorAvgSaltLevel" typeId="avgSaltLevel"/>
<channel id="chlorInstantSaltLevel" typeId="instantSaltLevel"/>
- <channel id="chlorStatus" typeId="status"/>
+ <channel id="chlorStatus" typeId="chlorStatus"/>
</channels>
<properties>
<property name="chlorMode"></property>
<property name="cellType"></property>
<property name="dispenserType"></property>
+ <property name="thingTypeVersion">1</property>
</properties>
<representation-property>systemID</representation-property>
<channel-type id="chlorOperatingMode">
<item-type>String</item-type>
<label>Operating Mode</label>
- <description>Operating Mode</description>
<state readOnly="true">
<options>
- <option value="0">Off</option>
<option value="1">Timed Percent</option>
<option value="2">ORP Autosense</option>
</options>
<channel-type id="timedPercent">
<item-type>Number:Dimensionless</item-type>
<label>Salt Output (%)</label>
- <description>Current salt output setting for the chlorinator (%).</description>
- <state min="0" max="100" step="1.0" pattern="%d %unit%" readOnly="false"/>
+ <state min="0" max="100" step="1.0" pattern="%d %" readOnly="false"/>
</channel-type>
<channel-type id="scMode">
<item-type>String</item-type>
<label>scMode</label>
- <description>scMode</description>
<state readOnly="true">
<options>
<option value="0">Off</option>
</channel-type>
<channel-type id="chlorError">
- <item-type>Number</item-type>
+ <item-type>String</item-type>
<label>Chlorinator Error</label>
- <state readOnly="true"/>
+ <state pattern="%s" readOnly="true"/>
</channel-type>
<channel-type id="chlorAlert">
<item-type>String</item-type>
<label>Chlorinator Alert</label>
- <description>Chlorinator Alert</description>
- <state readOnly="true">
- <options>
- <option value="0">None</option>
- <option value="16">Low T-Cell Temperature</option>
- </options>
+ <state pattern="%s" readOnly="true">
</state>
</channel-type>
<channel-type id="avgSaltLevel">
<item-type>Number:Dimensionless</item-type>
<label>Average Salt Level</label>
- <description>Average Salt Level</description>
- <state pattern="%d %unit%" readOnly="true"/>
+ <state pattern="%,d ppm" readOnly="true"/>
</channel-type>
<channel-type id="instantSaltLevel">
<item-type>Number:Dimensionless</item-type>
<label>Instant Salt Level</label>
- <description>Instant Salt Level</description>
- <state pattern="%d %unit%" readOnly="true"/>
+ <state pattern="%,d ppm" readOnly="true"/>
</channel-type>
- <channel-type id="status">
- <item-type>Number</item-type>
+ <channel-type id="chlorStatus">
+ <item-type>String</item-type>
<label>Status</label>
- <description>Status</description>
- <state pattern="%d" readOnly="true"/>
+ <state pattern="%s" readOnly="true"/>
</channel-type>
</thing:thing-descriptions>
</supported-bridge-type-refs>
<label>Color Logic Light</label>
- <description>Color Logic Light</description>
<channels>
<channel id="colorLogicLightEnable" typeId="system.power"/>
<channel id="colorLogicLightState" typeId="lightState"/>
<channel-type id="lightState">
<item-type>String</item-type>
<label>Light State</label>
- <description>Light State</description>
<state readOnly="true">
<options>
<option value="0">Off</option>
</state>
</channel-type>
- <channel-type id="currentShow">
+ <channel-type id="lightBrightness">
<item-type>String</item-type>
- <label>Current Show</label>
- <description>Current Show</description>
+ <label>Light Brightness</label>
<state readOnly="false">
<options>
- <option value="0">Voodoo Lounge</option>
- <option value="1">Deep Blue Sea</option>
- <option value="2">Royal Blue</option>
- <option value="3">Afternoon Sky</option>
- <option value="4">Aqua Green</option>
- <option value="5">Emerald</option>
- <option value="6">Cloud White</option>
- <option value="7">Warm Red</option>
- <option value="8">Flamingo</option>
- <option value="9">Vivid Violet</option>
- <option value="10">Sangria</option>
- <option value="11">Twilight</option>
- <option value="12">Tranquility</option>
- <option value="13">Gemstone</option>
- <option value="14">USA</option>
- <option value="15">Mardi Gras</option>
- <option value="16">Cool Cabaret</option>
+ <option value="0">20%</option>
+ <option value="1">40%</option>
+ <option value="2">60%</option>
+ <option value="3">80%</option>
+ <option value="4">100%</option>
</options>
</state>
</channel-type>
+
+ <channel-type id="lightSpeed">
+ <item-type>String</item-type>
+ <label>Light Speed</label>
+ <state readOnly="false">
+ <options>
+ <option value="0">1/16x</option>
+ <option value="1">1/8x</option>
+ <option value="2">1/4x</option>
+ <option value="3">1/2x</option>
+ <option value="4">1x</option>
+ <option value="5">2x</option>
+ <option value="6">4x</option>
+ <option value="7">8x</option>
+ <option value="8">16x</option>
+ </options>
+ </state>
+ </channel-type>
+
+ <channel-type id="currentShow">
+ <item-type>String</item-type>
+ <label>Current Show</label>
+ <state pattern="%s" readOnly="false">
+ </state>
+ </channel-type>
</thing:thing-descriptions>
</supported-bridge-type-refs>
<label>Filter</label>
- <description>Filter Equipment</description>
<channels>
<channel id="filterEnable" typeId="system.power"/>
<channel id="filterValvePosition" typeId="valvePosition"/>
<property name="highFilterSpeed"></property>
<property name="customFilterSpeed"></property>
<property name="freezeProtectOverrideInterval"></property>
+ <property name="thingTypeVersion">1</property>
</properties>
<representation-property>systemID</representation-property>
<channel-type id="valvePosition">
<item-type>String</item-type>
<label>Valve Position</label>
- <description>Valve Position</description>
<state readOnly="true">
<options>
<option value="0">Off</option>
<channel-type id="filterSpeedPercent">
<item-type>Number:Dimensionless</item-type>
- <label>Filter Speed %</label>
- <description>Filter Speed (%)</description>
- <state min="0" max="100" step="5" pattern="%d %unit%" readOnly="false"/>
+ <label>Filter Speed</label>
+ <description>Filter speed in percentage</description>
+ <state min="0" max="100" step="5" pattern="%d %%" readOnly="false"/>
</channel-type>
<channel-type id="filterSpeedRpm">
- <item-type>Number</item-type>
- <label>Filter Speed RPM</label>
- <description>Filter Speed (RPM)</description>
- <state min="0" max="3600" step="200" pattern="%d" readOnly="false"/>
+ <item-type>Number:Frequency</item-type>
+ <label>Filter Speed</label>
+ <description>Filter speed in rpm</description>
+ <state min="0" max="3600" step="200" pattern="%d rpm" readOnly="false"/>
</channel-type>
<channel-type id="filterSpeedSelect">
<item-type>String</item-type>
<label>Filter Speed States</label>
- <description>Filter Speed States</description>
<state readOnly="false">
<options>
<option value="0">Off</option>
<channel-type id="filterState">
<item-type>String</item-type>
<label>Filter State</label>
- <description>Filter State</description>
<state readOnly="true">
<options>
<option value="0">Off</option>
<channel-type id="filterLastSpeed">
<item-type>Number:Dimensionless</item-type>
<label>Last Speed</label>
- <description>Last Speed (%)</description>
- <state pattern="%d %unit%" readOnly="true"/>
+ <description>Last filter speed in percentage</description>
+ <state pattern="%d %%" readOnly="true"/>
</channel-type>
</thing:thing-descriptions>
</supported-bridge-type-refs>
<label>Heater</label>
- <description>Heater</description>
<channels>
<channel id="heaterState" typeId="state"/>
<channel id="heaterEnable" typeId="enable"/>
<channel-type id="state">
<item-type>String</item-type>
<label>Heater State</label>
- <description>Heater State</description>
<state readOnly="true">
<options>
<option value="0">Off</option>
<channel-type id="enable">
<item-type>Switch</item-type>
<label>Heater Enable</label>
- <description>Heater Enable</description>
<state readOnly="true"/>
</channel-type>
</supported-bridge-type-refs>
<label>Pump</label>
- <description>Pump</description>
<channels>
<channel id="pumpEnable" typeId="system.power"/>
<channel id="pumpSpeedPercent" typeId="pumpSpeedPercent"/>
<property name="mediumPumpSpeed"></property>
<property name="highPumpSpeed"></property>
<property name="customPumpSpeed"></property>
+ <property name="thingTypeVersion">1</property>
</properties>
<representation-property>systemID</representation-property>
<channel-type id="pumpSpeedPercent">
<item-type>Number:Dimensionless</item-type>
- <label>Pump Speed %</label>
- <description>Pump Speed (%)</description>
- <state min="0" max="100" step="1" pattern="%d %unit%" readOnly="false"/>
+ <label>Pump Speed</label>
+ <description>Pump speed in percentage</description>
+ <state min="0" max="100" step="1" pattern="%d %%" readOnly="false"/>
</channel-type>
<channel-type id="pumpSpeedRpm">
- <item-type>Number:Dimensionless</item-type>
- <label>Pump Speed RPM</label>
- <description>Pump Speed (RPM)</description>
- <state min="0" max="3600" step="200" pattern="%d" readOnly="false"/>
+ <item-type>Number:Frequency</item-type>
+ <label>Pump Speed</label>
+ <description>Pump speed in rpm</description>
+ <state min="0" max="3600" step="200" pattern="%d rpm" readOnly="false"/>
</channel-type>
<channel-type id="pumpSpeedSelect">
<item-type>String</item-type>
<label>Pump Speed States</label>
- <description>Pump Speed States</description>
<state readOnly="false">
<options>
<option value="0">Off</option>
<channel-type id="pumpState">
<item-type>String</item-type>
<label>Pump State</label>
- <description>Pump State</description>
<state readOnly="true">
<options>
<option value="0">Off</option>
<channel-type id="pumpLastSpeed">
<item-type>Number:Dimensionless</item-type>
<label>Last Speed</label>
- <description>Last Speed (%)</description>
- <state pattern="%d %unit%" readOnly="true"/>
+ <description>Last pump speed in percentage</description>
+ <state pattern="%d %%" readOnly="true"/>
</channel-type>
</thing:thing-descriptions>
</supported-bridge-type-refs>
<label>Relay</label>
- <description>Relay</description>
<channels>
<channel id="relayState" typeId="system.power"/>
</channels>
</supported-bridge-type-refs>
<label>Virtual Heater</label>
- <description>Virtual Heater</description>
<channels>
<channel id="virtualHeaterEnable" typeId="system.power"/>
<channel-type id="currentSetpoint">
<item-type>Number:Temperature</item-type>
<label>Current Setpoint</label>
- <description>Current Setpoint</description>
<category>Temperature</category>
<state min="65" max="90" step="1.0" pattern="%d %unit%" readOnly="false"/>
</channel-type>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<update:update-descriptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:update="https://openhab.org/schemas/update-description/v1.0.0"
+ xsi:schemaLocation="https://openhab.org/schemas/update-description/v1.0.0 https://openhab.org/schemas/update-description-1.0.0.xsd">
+
+ <thing-type uid="haywardomnilogic:chlorinator">
+ <instruction-set targetVersion="1">
+ <update-channel id="chlorError">
+ <type>haywardomnilogic:chlorError</type>
+ </update-channel>
+ <update-channel id="chlorStatus">
+ <type>haywardomnilogic:chlorStatus</type>
+ </update-channel>
+ </instruction-set>
+ </thing-type>
+
+ <thing-type uid="haywardomnilogic:filter">
+ <instruction-set targetVersion="1">
+ <update-channel id="filterSpeedRpm">
+ <type>haywardomnilogic:filterSpeedRpm</type>
+ </update-channel>
+ </instruction-set>
+ </thing-type>
+
+ <thing-type uid="haywardomnilogic:pump">
+ <instruction-set targetVersion="1">
+ <update-channel id="pumpSpeedRpm">
+ <type>haywardomnilogic:pumpSpeedRpm</type>
+ </update-channel>
+ </instruction-set>
+ </thing-type>
+</update:update-descriptions>