From 62e62e66a4c3f9df4889546af3371350938f8db1 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 9 May 2024 04:08:38 -0400 Subject: [PATCH] [haywardomnilogic] Added support ColorLogic V2 Lights, Updated Chlor Enable, Alert, Error, Status (#15478) * Update polling times based on Hayward API recommendations --------- Signed-off-by: Matt Myers --- .../README.md | 65 +++- .../internal/HaywardBindingConstants.java | 9 +- .../internal/HaywardHandlerFactory.java | 1 - .../internal/HaywardThingHandler.java | 9 +- .../discovery/HaywardDiscoveryService.java | 9 + .../handler/HaywardBackyardHandler.java | 120 ++++---- .../internal/handler/HaywardBowHandler.java | 31 +- .../handler/HaywardChlorinatorHandler.java | 220 +++++++------ .../handler/HaywardColorLogicHandler.java | 231 +++++++++++++- .../handler/HaywardFilterHandler.java | 170 +++++------ .../handler/HaywardHeaterHandler.java | 37 ++- .../internal/handler/HaywardPumpHandler.java | 288 +++++++++--------- .../internal/handler/HaywardRelayHandler.java | 93 +++--- .../handler/HaywardVirtualHeaterHandler.java | 176 +++++------ .../OH-INF/i18n/haywardomnilogic.properties | 115 ++++--- .../main/resources/OH-INF/thing/backyard.xml | 7 +- .../src/main/resources/OH-INF/thing/bow.xml | 3 - .../main/resources/OH-INF/thing/bridge.xml | 6 +- .../resources/OH-INF/thing/chlorinator.xml | 34 +-- .../resources/OH-INF/thing/colorlogic.xml | 54 ++-- .../main/resources/OH-INF/thing/filter.xml | 23 +- .../main/resources/OH-INF/thing/heater.xml | 3 - .../src/main/resources/OH-INF/thing/pump.xml | 22 +- .../src/main/resources/OH-INF/thing/relay.xml | 1 - .../resources/OH-INF/thing/virtualHeater.xml | 2 - .../resources/OH-INF/update/instructions.xml | 32 ++ 26 files changed, 986 insertions(+), 775 deletions(-) create mode 100644 bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/update/instructions.xml diff --git a/bundles/org.openhab.binding.haywardomnilogic/README.md b/bundles/org.openhab.binding.haywardomnilogic/README.md index 4f79395284..950939661b 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/README.md +++ b/bundles/org.openhab.binding.haywardomnilogic/README.md @@ -34,8 +34,8 @@ Hayward OmniLogic Connection Parameters: | Host Name | | 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
01 = Short
10 = Open |Current Sensor | +|3:2 |00 = OK
01 = Short
10 = Open |Voltage Sensor | +|5:4 |00 = OK
01 = Short
10 = Open |Cell Temp Sensor | +|7:6 |00 = OK
01 = Short
10 = Open |Board Temp Sensor | +|9:8 |00 = OK
01 = Short
10 = Open |K1 Relay | +|11:10 |00 = OK
01 = Short
10 = Open |K2 Relay | +|13:12 |00 = OK
01 = Type
10 = Authentication
11 = Comm Loss |Cell Errors | +|14 |0 |Aquarite PCB Error | + +### Chlorinator Alert Bit Array + +|Bits |Value |Description | +|------|--------------------------------------------------------------------|-------------------------------| +|1:0 |00 = OK
01 = Salt Low
10 = Salt too Low |Low salt | +|2 |0 = OK
1 = High |High Current | +|3 |0 = OK
1 = Low |Low Voltage | +|5:4 |00 = OK
01 = Low
10 = Scaleback
11 = High |Cell Water Temp | +|7:6 |00 = OK
01 = High
10 = Clearing |Board Temp | +|8 |0 |Not Used | +|10:9 |0 |Not Used | +|12:11 |00 = OK
01 = Clean |Cell Cleaning/Runtime | + +### Chlorinator Status Bit Array + +|Bits |Value |Description | +|------|----------------------------------------------------------------|-------------------------------| +|0 |0 = OK
1 = Error Present |Error Present | +|1 |0 = OK
1 = Alert Present |Alert Present | +|2 |0 = Standy
1 = Generating |Generating | +|3 |0 = Not Paused
1 = Paused
|Paused | +|4 |0 = Local Not Paused
1 = Local Paused
|Local Pause | +|5 |0 = Not Authenticated<>
1 = Authenticated |T-Cell Authenticated | +|6 |0 = K1 Relay Off
1 = K1 Relay On |K1 Relay Active | +|7 |0 = K2 Relay Off
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. diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardBindingConstants.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardBindingConstants.java index 75fd3a4b0f..504469ef71 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardBindingConstants.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardBindingConstants.java @@ -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"; diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardHandlerFactory.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardHandlerFactory.java index f1e96a0ff6..b6738c005d 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardHandlerFactory.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardHandlerFactory.java @@ -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); diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardThingHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardThingHandler.java index 14d971b9a5..8e2c8f31f6 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardThingHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/HaywardThingHandler.java @@ -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) { diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/discovery/HaywardDiscoveryService.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/discovery/HaywardDiscoveryService.java index 0cd34f2e29..109a899bc4 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/discovery/HaywardDiscoveryService.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/discovery/HaywardDiscoveryService.java @@ -129,6 +129,15 @@ public class HaywardDiscoveryService extends AbstractThingHandlerDiscoveryServic final List colorLogicProperty1 = thingHandler.evaluateXPath("//Backyard//ColorLogic-Light/Type/text()", xmlResponse); + final List 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)); diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBackyardHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBackyardHandler.java index a672072ee7..16da7cbb51 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBackyardHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBackyardHandler.java @@ -45,30 +45,27 @@ public class HaywardBackyardHandler extends HaywardThingHandler { List 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 = """ - GetAlarmList\ - \ - """ + bridgehandler.account.token + "" - + "" + bridgehandler.account.mspSystemID - + "" - + "en-us"; - - 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 = """ + GetAlarmList\ + \ + """ + bridgehandler.account.token + "" + + "" + bridgehandler.account.mspSystemID + + "" + + "en-us"; + + 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 { diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBowHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBowHandler.java index e7293f5b13..e1209f255e 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBowHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardBowHandler.java @@ -42,27 +42,24 @@ public class HaywardBowHandler extends HaywardThingHandler { List 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); } } } diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardChlorinatorHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardChlorinatorHandler.java index 906b985bed..3c67d568bb 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardChlorinatorHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardChlorinatorHandler.java @@ -13,12 +13,15 @@ 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 channelStates = new HashMap<>(); public HaywardChlorinatorHandler(Thing thing) { super(thing); @@ -50,61 +53,55 @@ public class HaywardChlorinatorHandler extends HaywardThingHandler { List 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 - + "SetCHLORParams" - + "" + bridgehandler.account.token - + "" + "" - + bridgehandler.account.mspSystemID + "" - + "" + poolID + "" - + "" + systemID - + "" + "" - + chlorCfgState + "" - + "1" - + "1" - + "4" - + "" + chlorTimedPercent - + "" - + "24" - + "24" - + ""; - - // *****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 + "SetCHLORParams" + + "" + bridgehandler.account.token + + "" + "" + + bridgehandler.account.mspSystemID + "" + + "" + poolID + "" + + "" + systemID + + "" + "" + + chlorCfgState + "" + + "1" + + "1" + + "4" + + "" + chlorTimedPercent + + "" + + "24" + + "24" + + ""; + + // *****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); } } } diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardColorLogicHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardColorLogicHandler.java index 2f86b035ce..6c74f876c2 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardColorLogicHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardColorLogicHandler.java @@ -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 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 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 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 + ""; 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 + + "SetStandAloneLightShow" + + "" + + bridgehandler.account.token + "" + + "" + + bridgehandler.account.mspSystemID + "" + + "" + poolID + "" + + "" + systemID + + "" + "" + cmdString + + "" + HaywardBindingConstants.COMMAND_SCHEDULE + + ""; + } else { + brightness = channelStates + .get(HaywardBindingConstants.CHANNEL_COLORLOGIC_BRIGHTNESS).toString(); + speed = channelStates.get(HaywardBindingConstants.CHANNEL_COLORLOGIC_SPEED) + .toString(); + cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + + "SetStandAloneLightShowV2" + + "" + + bridgehandler.account.token + "" + + "" + + bridgehandler.account.mspSystemID + "" + + "" + poolID + "" + + "" + systemID + + "" + "" + cmdString + + "" + "" + speed + + "" + "" + + brightness + "" + HaywardBindingConstants.COMMAND_SCHEDULE + + ""; + + } + } + 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 + + "SetStandAloneLightShowV2" + + "" + bridgehandler.account.token + + "" + "" + + bridgehandler.account.mspSystemID + "" + + "" + poolID + "" + + "" + systemID + "" + + "" + show + "" + + "" + speed + "" + + "" + cmdString + "" + + HaywardBindingConstants.COMMAND_SCHEDULE + ""; + 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 - + "SetStandAloneLightShow" + + "SetStandAloneLightShowV2" + "" + bridgehandler.account.token + "" + "" + bridgehandler.account.mspSystemID + "" + "" + poolID + "" + "" + systemID + "" - + "" + cmdString + "" - + "4" - + "4" - + "0" + + "" + show + "" + + "" + cmdString + "" + + "" + brightness + "" + HaywardBindingConstants.COMMAND_SCHEDULE + ""; 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); } } diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardFilterHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardFilterHandler.java index b5f5347341..b89a76da9d 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardFilterHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardFilterHandler.java @@ -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 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); } } diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardHeaterHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardHeaterHandler.java index 05558a8e13..e7d2ba7a6e 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardHeaterHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardHeaterHandler.java @@ -45,30 +45,27 @@ public class HaywardHeaterHandler extends HaywardThingHandler { List 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); } } } diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardPumpHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardPumpHandler.java index 4a26abc4d0..8e88578de3 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardPumpHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardPumpHandler.java @@ -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 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 - + "SetUIEquipmentCmd" - + "" + bridgehandler.account.token - + "" + "" - + bridgehandler.account.mspSystemID + "" - + "" + poolID + "" - + "" + systemID + "" - + "" + cmdString + "" - + HaywardBindingConstants.COMMAND_SCHEDULE + ""; + String cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + + "SetUIEquipmentCmd" + + "" + bridgehandler.account.token + + "" + "" + + bridgehandler.account.mspSystemID + "" + + "" + poolID + "" + + "" + systemID + "" + + "" + cmdString + "" + + HaywardBindingConstants.COMMAND_SCHEDULE + ""; - // *****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); } } } diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardRelayHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardRelayHandler.java index ba7537a9b4..4792a2e657 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardRelayHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardRelayHandler.java @@ -48,21 +48,18 @@ public class HaywardRelayHandler extends HaywardThingHandler { List 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 - + "SetUIEquipmentCmd" - + "" + bridgehandler.account.token - + "" + "" - + bridgehandler.account.mspSystemID + "" - + "" + poolID + "" - + "" + systemID + "" - + "" + cmdString + "" - + HaywardBindingConstants.COMMAND_SCHEDULE + ""; - 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 + + "SetUIEquipmentCmd" + + "" + bridgehandler.account.token + + "" + "" + + bridgehandler.account.mspSystemID + "" + + "" + poolID + "" + + "" + systemID + "" + + "" + cmdString + "" + + HaywardBindingConstants.COMMAND_SCHEDULE + ""; + 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); } } } diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardVirtualHeaterHandler.java b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardVirtualHeaterHandler.java index 98515f8f29..b9b2e4bc2d 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardVirtualHeaterHandler.java +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/java/org/openhab/binding/haywardomnilogic/internal/handler/HaywardVirtualHeaterHandler.java @@ -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 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 - + "SetHeaterEnable" - + "" + bridgehandler.account.token - + "" + "" - + bridgehandler.account.mspSystemID + "" - + "" + poolID + "" - + "" + systemID + "" - + "" + cmdString + "" - + ""; - 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 + "SetHeaterEnable" + + "" + bridgehandler.account.token + + "" + "" + + bridgehandler.account.mspSystemID + "" + + "" + poolID + "" + + "" + systemID + "" + + "" + cmdString + "" + + ""; + 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 - + "SetUIHeaterCmd" - + "" + bridgehandler.account.token - + "" + "" - + bridgehandler.account.mspSystemID + "" - + "" + poolID + "" - + "" + systemID + "" - + "" + cmdString + "" - + ""; - break; - default: - logger.warn("haywardCommand Unsupported type {}", channelUID); - return; - } + cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + "SetUIHeaterCmd" + + "" + bridgehandler.account.token + + "" + "" + + bridgehandler.account.mspSystemID + "" + + "" + poolID + "" + + "" + systemID + "" + + "" + cmdString + "" + + ""; + 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); } } } diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/i18n/haywardomnilogic.properties b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/i18n/haywardomnilogic.properties index 8a0046ee75..72cfcd05da 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/i18n/haywardomnilogic.properties +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/i18n/haywardomnilogic.properties @@ -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 diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/backyard.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/backyard.xml index 8883111519..4425b44a1e 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/backyard.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/backyard.xml @@ -10,7 +10,6 @@ - The Hayward Backyard @@ -32,14 +31,12 @@ Number:Temperature - Air Temp String - Status @@ -54,7 +51,6 @@ String - State @@ -69,8 +65,7 @@ String - Alarm - + diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bow.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bow.xml index ff786265f9..d2dfdc518f 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bow.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bow.xml @@ -10,7 +10,6 @@ - The Hayward Body of Water @@ -33,14 +32,12 @@ Switch - Flow Sensor Number:Temperature - Water Temp diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bridge.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bridge.xml index 51d0a90868..f71307eb47 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bridge.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/bridge.xml @@ -25,14 +25,14 @@ The password to connect to the server. - + - 12 + 3 How often to request telemetry data from Hayward Server - 60 + 10 How often to request alarm data from Hayward Server. Enter 0 to disable. diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/chlorinator.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/chlorinator.xml index 1173def564..465f7cb835 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/chlorinator.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/chlorinator.xml @@ -10,7 +10,6 @@ - Chlorinator @@ -20,7 +19,7 @@ - + @@ -29,6 +28,7 @@ + 1 systemID @@ -37,10 +37,8 @@ String - Operating Mode - @@ -50,14 +48,12 @@ Number:Dimensionless - Current salt output setting for the chlorinator (%). - + String - scMode @@ -67,41 +63,33 @@ - Number + String - + String - Chlorinator Alert - - - - - + Number:Dimensionless - Average Salt Level - + Number:Dimensionless - Instant Salt Level - + - - Number + + String - Status - + diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/colorlogic.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/colorlogic.xml index 1493810504..657c168643 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/colorlogic.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/colorlogic.xml @@ -10,7 +10,6 @@ - Color Logic Light @@ -28,7 +27,6 @@ String - Light State @@ -39,30 +37,42 @@ - + String - - Current Show + - - - - - - - - - - - - - - - - - + + + + + + + + String + + + + + + + + + + + + + + + + + + String + + + + diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/filter.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/filter.xml index f1182f1957..c4892d0af1 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/filter.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/filter.xml @@ -10,7 +10,6 @@ - Filter Equipment @@ -35,6 +34,7 @@ + 1 systemID @@ -43,7 +43,6 @@ String - Valve Position @@ -56,22 +55,21 @@ Number:Dimensionless - - Filter Speed (%) - + + Filter speed in percentage + - Number - - Filter Speed (RPM) - + Number:Frequency + + Filter speed in rpm + String - Filter Speed States @@ -86,7 +84,6 @@ String - Filter State @@ -108,8 +105,8 @@ Number:Dimensionless - Last Speed (%) - + Last filter speed in percentage + diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/heater.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/heater.xml index b282edaa25..5757d5c4af 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/heater.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/heater.xml @@ -10,7 +10,6 @@ - Heater @@ -28,7 +27,6 @@ String - Heater State @@ -41,7 +39,6 @@ Switch - Heater Enable diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/pump.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/pump.xml index 13ce23f312..ea3dd927b1 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/pump.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/pump.xml @@ -10,7 +10,6 @@ - Pump @@ -33,6 +32,7 @@ + 1 systemID @@ -40,22 +40,21 @@ Number:Dimensionless - - Pump Speed (%) - + + Pump speed in percentage + - Number:Dimensionless - - Pump Speed (RPM) - + Number:Frequency + + Pump speed in rpm + String - Pump Speed States @@ -70,7 +69,6 @@ String - Pump State @@ -92,8 +90,8 @@ Number:Dimensionless - Last Speed (%) - + Last pump speed in percentage + diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/relay.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/relay.xml index 4427011b2d..ec01fda086 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/relay.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/relay.xml @@ -10,7 +10,6 @@ - Relay diff --git a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/virtualHeater.xml b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/virtualHeater.xml index f7fbd6a650..6cd4a82067 100644 --- a/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/virtualHeater.xml +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/thing/virtualHeater.xml @@ -10,7 +10,6 @@ - Virtual Heater @@ -30,7 +29,6 @@ Number:Temperature - Current Setpoint Temperature 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 index 0000000000..90e5d96a4a --- /dev/null +++ b/bundles/org.openhab.binding.haywardomnilogic/src/main/resources/OH-INF/update/instructions.xml @@ -0,0 +1,32 @@ + + + + + + + haywardomnilogic:chlorError + + + haywardomnilogic:chlorStatus + + + + + + + + haywardomnilogic:filterSpeedRpm + + + + + + + + haywardomnilogic:pumpSpeedRpm + + + + -- 2.47.3