]> git.basschouten.com Git - openhab-addons.git/commitdiff
[haywardomnilogic] Added support ColorLogic V2 Lights, Updated Chlor Enable, Alert...
authorMatt <mmyers75@icloud.com>
Thu, 9 May 2024 08:08:38 +0000 (04:08 -0400)
committerGitHub <noreply@github.com>
Thu, 9 May 2024 08:08:38 +0000 (10:08 +0200)
* Update polling times based on Hayward API recommendations

---------

Signed-off-by: Matt Myers <mmyers75@icloud.com>
26 files changed:
bundles/org.openhab.binding.haywardomnilogic/README.md
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardBindingConstants.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardHandlerFactory.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardThingHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/discovery/HaywardDiscoveryService.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBackyardHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBowHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardChlorinatorHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardColorLogicHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardFilterHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardHeaterHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardPumpHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardRelayHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardVirtualHeaterHandler.java
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/i18n/haywardomnilogic.properties
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/backyard.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bow.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bridge.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/chlorinator.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/colorlogic.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/filter.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/heater.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/pump.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/relay.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/virtualHeater.xml
bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/update/instructions.xml [new file with mode: 0644]

index 4f7939528408961e41ed3ddbbcfb62e7b255ffee..950939661b057cb505ecd2f372e9a5d776216fd6 100644 (file)
@@ -34,8 +34,8 @@ Hayward OmniLogic Connection Parameters:
 | 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
 
@@ -65,14 +65,53 @@ Hayward OmniLogic Connection Parameters:
 |-----------------------|----------------------|----------------------------------------------------------|:----------:|
 | 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
 
@@ -88,11 +127,11 @@ Hayward OmniLogic Connection Parameters:
 |---------------------|----------------------|------------------------|:----------:|
 | 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
 
@@ -106,11 +145,11 @@ Hayward OmniLogic Connection Parameters:
 | 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
 
@@ -125,6 +164,8 @@ Hayward OmniLogic Connection Parameters:
 | 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.
index 75fd3a4b0f4ddfce3ccf6998cf5347f4d8224895..504469ef710b3c19a4f8a0768b1ca4086d281072 100644 (file)
@@ -26,7 +26,7 @@ import org.openhab.core.thing.ThingTypeUID;
 @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");
@@ -87,8 +87,13 @@ public class HaywardBindingConstants {
 
     // 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";
 
index f1e96a0ff64ddf072723024e60af4d1d82330c17..b6738c005d90e76bbff33f185ce059f344c69ea5 100644 (file)
@@ -104,7 +104,6 @@ public class HaywardHandlerFactory extends BaseThingHandlerFactory {
         }
         if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_RELAY)) {
             return new HaywardRelayHandler(thing);
-
         }
         if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_VIRTUALHEATER)) {
             return new HaywardVirtualHeaterHandler(thing);
index 14d971b9a5bd2a86e64678f0ac5e1d67565fc088..8e2c8f31f6dfae6073b1e08a7703f0a315b9ada8 100644 (file)
@@ -79,14 +79,19 @@ public abstract class HaywardThingHandler extends BaseThingHandler {
                         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) {
index 0cd34f2e290ee4f2315ec3d5295e305da8cfb52e..109a899bc4fcff7ac88b9b5f624ac1aa1ff03887 100644 (file)
@@ -129,6 +129,15 @@ public class HaywardDiscoveryService extends AbstractThingHandlerDiscoveryServic
         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));
index a672072ee79315396760f889837b96569715d73b..16da7cbb5179328eb299f3a6362abfd01fb56c44 100644 (file)
@@ -45,30 +45,27 @@ public class HaywardBackyardHandler extends HaywardThingHandler {
         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);
         }
     }
 
@@ -79,54 +76,47 @@ public class HaywardBackyardHandler extends HaywardThingHandler {
         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 {
index e7293f5b13a603a113560a3e8a55b3a1ed87bfed..e1209f255ef3e70811a0a66d6dfb0f32282f74bc 100644 (file)
@@ -42,27 +42,24 @@ public class HaywardBowHandler extends HaywardThingHandler {
         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);
         }
     }
 }
index 906b985bed169b38db48173419d994488b61a608..3c67d568bb0f68e0fad3d731b4595b4c343baa58 100644 (file)
 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;
@@ -26,6 +29,7 @@ import org.openhab.core.thing.ThingStatus;
 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;
 
@@ -37,8 +41,7 @@ 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);
@@ -50,61 +53,55 @@ public class HaywardChlorinatorHandler extends HaywardThingHandler {
         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);
         }
     }
 
@@ -121,67 +118,66 @@ public class HaywardChlorinatorHandler extends HaywardThingHandler {
         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);
         }
     }
 }
index 2f86b035ce97ec44ba819634d562b95bc7e9c200..6c74f876c2c72e233589a041fdb5d964e7794d13 100644 (file)
@@ -13,7 +13,9 @@
 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;
@@ -21,12 +23,20 @@ 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.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;
 
@@ -38,11 +48,117 @@ 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<>();
@@ -58,7 +174,7 @@ public class HaywardColorLogicHandler extends HaywardThingHandler {
                     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");
@@ -68,7 +184,25 @@ public class HaywardColorLogicHandler extends HaywardThingHandler {
 
                         // 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);
@@ -86,6 +220,9 @@ public class HaywardColorLogicHandler extends HaywardThingHandler {
 
         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) {
@@ -93,6 +230,7 @@ public class HaywardColorLogicHandler extends HaywardThingHandler {
             if (bridgehandler != null) {
                 String cmdString = this.cmdToString(command);
                 String cmdURL = null;
+
                 try {
                     switch (channelUID.getId()) {
                         case HaywardBindingConstants.CHANNEL_COLORLOGIC_ENABLE:
@@ -112,17 +250,78 @@ public class HaywardColorLogicHandler extends HaywardThingHandler {
                                     + 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:
@@ -131,13 +330,15 @@ public class HaywardColorLogicHandler extends HaywardThingHandler {
                     }
 
                     // *****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 {}:{}:{}",
@@ -146,7 +347,9 @@ public class HaywardColorLogicHandler extends HaywardThingHandler {
                     return;
                 }
                 this.updateStatus(ThingStatus.ONLINE);
-            } else {
+            } else
+
+            {
                 this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
             }
         }
index b5f5347341d0c1251eb771f30dac70bd49e51c63..b89a76da9d59282cb8de67dc26ffebe5cff27bde 100644 (file)
@@ -69,58 +69,55 @@ public class HaywardFilterHandler extends HaywardThingHandler {
         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);
             }
         }
     }
@@ -131,53 +128,50 @@ public class HaywardFilterHandler extends HaywardThingHandler {
         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);
         }
     }
 
index 05558a8e13683ddb32cfcff6f392987a4037c4d2..e7d2ba7a6e57e0b6de244e11823560bd76602356 100644 (file)
@@ -45,30 +45,27 @@ public class HaywardHeaterHandler extends HaywardThingHandler {
         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);
         }
     }
 }
index 4a26abc4d065415551bbd80ceac860550b8c27b8..8e88578de322201970130508d3b90e201be12bb8 100644 (file)
@@ -69,58 +69,55 @@ public class HaywardPumpHandler extends HaywardThingHandler {
         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);
             }
         }
     }
@@ -131,49 +128,45 @@ public class HaywardPumpHandler extends HaywardThingHandler {
         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);
         }
     }
 
@@ -190,79 +183,74 @@ public class HaywardPumpHandler extends HaywardThingHandler {
         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);
         }
     }
 }
index ba7537a9b4e685176f25f7e5fd6594ea3353f86a..4792a2e657c3616ed1d920a7b7102dcc967b6cdc 100644 (file)
@@ -48,21 +48,18 @@ public class HaywardRelayHandler extends HaywardThingHandler {
         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);
         }
     }
 
@@ -76,48 +73,44 @@ public class HaywardRelayHandler extends HaywardThingHandler {
         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);
         }
     }
 }
index 98515f8f299c63b3378a6ece6c536966ac7d1ed1..b9b2e4bc2df79e30033140f1b86e669d77c7227e 100644 (file)
@@ -60,20 +60,17 @@ public class HaywardVirtualHeaterHandler extends HaywardThingHandler {
     @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);
             }
         }
     }
@@ -84,28 +81,25 @@ public class HaywardVirtualHeaterHandler extends HaywardThingHandler {
         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);
         }
     }
 
@@ -123,75 +117,69 @@ public class HaywardVirtualHeaterHandler extends HaywardThingHandler {
                 .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);
         }
     }
 }
index 8a0046ee75089bc5cba5a4abc37e8018106a2c54..72cfcd05da2900a4973453b45d199a3232724ab2 100644 (file)
@@ -6,27 +6,16 @@ addon.haywardomnilogic.description = Binding for the Hayward OmniLogix swimming
 # 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
 
@@ -44,68 +33,41 @@ thing-type.config.haywardomnilogic.bridge.username.description = The username to
 # 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
@@ -119,32 +81,65 @@ channel-type.haywardomnilogic.filterState.state.option.9 = Filter Superchlorinat
 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
index 8883111519dad20167871682e3752ba46ac407f9..4425b44a1e1d63aa3e3680989b393b647809b619 100644 (file)
@@ -10,7 +10,6 @@
                </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>
@@ -54,7 +51,6 @@
        <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>
@@ -69,8 +65,7 @@
        <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>
index ff786265f9e2ced758311ba18ccd487601e8097d..d2dfdc518f451ada12b91f4827a10e8ada31c9ce 100644 (file)
@@ -10,7 +10,6 @@
                </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>
 
index 51d0a90868fcf808cd0334b4319967b998a60ec6..f71307eb473b1397be670e0c91e77b5e3ddd83da 100644 (file)
                                <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>
index 1173def564693d4685fd1a05f9f06a5c481e5619..465f7cb8356f3e2d94b52875ade2d2768e4ac932 100644 (file)
@@ -10,7 +10,6 @@
                </supported-bridge-type-refs>
 
                <label>Chlorinator</label>
-               <description>Chlorinator</description>
                <channels>
                        <channel id="chlorEnable" typeId="system.power"/>
                        <channel id="chlorOperatingMode" typeId="chlorOperatingMode"/>
@@ -20,7 +19,7 @@
                        <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>
@@ -29,6 +28,7 @@
                        <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>
index 14938105040a0b5d77093f6d15f52f5c4402271c..657c1686430b5f663526a6ceabeb2b9f07701880 100644 (file)
@@ -10,7 +10,6 @@
                </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"/>
@@ -28,7 +27,6 @@
        <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>
index f1182f1957d99c951fd75b20f07c1a33335d366a..c4892d0af1b6d3a353a3640a48294b9881daf555 100644 (file)
@@ -10,7 +10,6 @@
                </supported-bridge-type-refs>
 
                <label>Filter</label>
-               <description>Filter Equipment</description>
                <channels>
                        <channel id="filterEnable" typeId="system.power"/>
                        <channel id="filterValvePosition" typeId="valvePosition"/>
@@ -35,6 +34,7 @@
                        <property name="highFilterSpeed"></property>
                        <property name="customFilterSpeed"></property>
                        <property name="freezeProtectOverrideInterval"></property>
+                       <property name="thingTypeVersion">1</property>
                </properties>
                <representation-property>systemID</representation-property>
 
@@ -43,7 +43,6 @@
        <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>
@@ -86,7 +84,6 @@
        <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>
index b282edaa25b2d076c1440a3457dec5ac380df9d9..5757d5c4af717a6eafb5ce262f9357775d1ed40e 100644 (file)
@@ -10,7 +10,6 @@
                </supported-bridge-type-refs>
 
                <label>Heater</label>
-               <description>Heater</description>
                <channels>
                        <channel id="heaterState" typeId="state"/>
                        <channel id="heaterEnable" typeId="enable"/>
@@ -28,7 +27,6 @@
        <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>
@@ -41,7 +39,6 @@
        <channel-type id="enable">
                <item-type>Switch</item-type>
                <label>Heater Enable</label>
-               <description>Heater Enable</description>
                <state readOnly="true"/>
        </channel-type>
 
index 13ce23f3124c88eaf212b1406ac697f0479d4357..ea3dd927b1703ec7dc4b0eea71a2bf079839f63b 100644 (file)
@@ -10,7 +10,6 @@
                </supported-bridge-type-refs>
 
                <label>Pump</label>
-               <description>Pump</description>
                <channels>
                        <channel id="pumpEnable" typeId="system.power"/>
                        <channel id="pumpSpeedPercent" typeId="pumpSpeedPercent"/>
@@ -33,6 +32,7 @@
                        <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>
@@ -70,7 +69,6 @@
        <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>
@@ -92,8 +90,8 @@
        <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>
index 4427011b2da3f9cc115b0f3b81fd93672ad4ec85..ec01fda086e1f080b4c3ffce560e0cc57409ca25 100644 (file)
@@ -10,7 +10,6 @@
                </supported-bridge-type-refs>
 
                <label>Relay</label>
-               <description>Relay</description>
                <channels>
                        <channel id="relayState" typeId="system.power"/>
                </channels>
index f7fbd6a6504db5112f8a3beb6fe42c76ea1359ad..6cd4a82067930a1d8927d3e60c335134add34a07 100644 (file)
@@ -10,7 +10,6 @@
                </supported-bridge-type-refs>
 
                <label>Virtual Heater</label>
-               <description>Virtual Heater</description>
 
                <channels>
                        <channel id="virtualHeaterEnable" typeId="system.power"/>
@@ -30,7 +29,6 @@
        <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>
diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/update/instructions.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/update/instructions.xml
new file mode 100644 (file)
index 0000000..90e5d96
--- /dev/null
@@ -0,0 +1,32 @@
+<?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>