Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
import org.openhab.binding.haywardomnilogic.internal.HaywardException;
import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
import org.openhab.binding.haywardomnilogic.internal.net.CommandBuilder;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.Channel;
Expand Down Expand Up @@ -130,14 +131,9 @@ public void handleCommand(ChannelUID channelUID, Command command) {
try {
switch (channelUID.getId()) {
case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE:
cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + "<Name>SetHeaterEnable</Name><Parameters>"
+ "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ bridgehandler.account.mspSystemID + "</Parameter>"
+ "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
+ "<Parameter name=\"Enabled\" dataType=\"bool\">" + cmdString + "</Parameter>"
+ "</Parameters></Request>";
cmdURL = CommandBuilder.buildSetHeaterEnable(HaywardBindingConstants.COMMAND_PARAMETERS,
bridgehandler.account.token, bridgehandler.account.mspSystemID, poolID, systemID,
cmdString);
break;

case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT:
Expand All @@ -149,14 +145,9 @@ public void handleCommand(ChannelUID channelUID, Command command) {
}
}

cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + "<Name>SetUIHeaterCmd</Name><Parameters>"
+ "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ bridgehandler.account.mspSystemID + "</Parameter>"
+ "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
+ "<Parameter name=\"Temp\" dataType=\"int\">" + cmdString + "</Parameter>"
+ "</Parameters></Request>";
cmdURL = CommandBuilder.buildSetUIHeaterCmd(HaywardBindingConstants.COMMAND_PARAMETERS,
bridgehandler.account.token, bridgehandler.account.mspSystemID, poolID, systemID,
cmdString);
break;
default:
logger.warn("haywardCommand Unsupported type {}", channelUID);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package org.openhab.binding.haywardomnilogic.internal.net;

import org.eclipse.jdt.annotation.NonNullByDefault;

/**
* Helper for building XML command strings sent to the Hayward cloud.
*/
@NonNullByDefault
public class CommandBuilder {

private static final String SET_HEATER_ENABLE = """
<Name>SetHeaterEnable</Name>
<Parameters>
<Parameter name=\"Token\" dataType=\"String\">%s</Parameter>
<Parameter name=\"MspSystemID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"PoolID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"HeaterID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"Enabled\" dataType=\"bool\">%s</Parameter>
</Parameters>
""";

private static final String SET_UI_HEATER_CMD = """
<Name>SetUIHeaterCmd</Name>
<Parameters>
<Parameter name=\"Token\" dataType=\"String\">%s</Parameter>
<Parameter name=\"MspSystemID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"PoolID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"HeaterID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"Temp\" dataType=\"int\">%s</Parameter>
</Parameters>
""";

private CommandBuilder() {
// utility class
}

public static String buildSetHeaterEnable(String prefix, String token, int mspSystemID, String poolID,
String heaterID, String enabled) {
return prefix
+ String.format(SET_HEATER_ENABLE, token, mspSystemID, poolID, heaterID, enabled)
+ closingTag(prefix);
}

public static String buildSetUIHeaterCmd(String prefix, String token, int mspSystemID, String poolID,
String heaterID, String temp) {
return prefix + String.format(SET_UI_HEATER_CMD, token, mspSystemID, poolID, heaterID, temp)
Comment on lines +37 to +46

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P0] Align mspSystemID parameter type with callers

The new CommandBuilder expects int mspSystemID in both buildSetHeaterEnable and buildSetUIHeaterCmd, but HaywardAccount.mspSystemID is defined as a String and the handlers pass that string directly. This mismatch means the binding no longer compiles because there is no implicit conversion from String to int. Either accept a String here or parse it at the call site before invoking the builder.

Useful? React with 👍 / 👎.

+ closingTag(prefix);
}

private static String closingTag(String prefix) {
if (prefix.contains("<Request>")) {
return "</Request>";
} else if (prefix.contains("<GetTelemetry>")) {
return "</GetTelemetry>";
} else {
return "";
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.openhab.binding.haywardomnilogiclocal.internal.HaywardBindingConstants;
import org.openhab.binding.haywardomnilogiclocal.internal.HaywardException;
import org.openhab.binding.haywardomnilogiclocal.internal.HaywardThingHandler;
import org.openhab.binding.haywardomnilogiclocal.internal.net.CommandBuilder;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.Channel;
Expand Down Expand Up @@ -130,14 +131,9 @@ public void handleCommand(ChannelUID channelUID, Command command) {
try {
switch (channelUID.getId()) {
case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_ENABLE:
cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + "<Name>SetHeaterEnable</Name><Parameters>"
+ "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ bridgehandler.account.mspSystemID + "</Parameter>"
+ "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
+ "<Parameter name=\"Enabled\" dataType=\"bool\">" + cmdString + "</Parameter>"
+ "</Parameters></GetTelemetry>";
cmdURL = CommandBuilder.buildSetHeaterEnable(HaywardBindingConstants.COMMAND_PARAMETERS,
bridgehandler.account.token, bridgehandler.account.mspSystemID, poolID, systemID,
cmdString);
break;

case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT:
Expand All @@ -149,14 +145,9 @@ public void handleCommand(ChannelUID channelUID, Command command) {
}
}

cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS + "<Name>SetUIHeaterCmd</Name><Parameters>"
+ "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ bridgehandler.account.mspSystemID + "</Parameter>"
+ "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ "<Parameter name=\"HeaterID\" dataType=\"int\">" + systemID + "</Parameter>"
+ "<Parameter name=\"Temp\" dataType=\"int\">" + cmdString + "</Parameter>"
+ "</Parameters></GetTelemetry>";
cmdURL = CommandBuilder.buildSetUIHeaterCmd(HaywardBindingConstants.COMMAND_PARAMETERS,
bridgehandler.account.token, bridgehandler.account.mspSystemID, poolID, systemID,
cmdString);
break;
default:
logger.warn("haywardCommand Unsupported type {}", channelUID);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package org.openhab.binding.haywardomnilogiclocal.internal.net;

import org.eclipse.jdt.annotation.NonNullByDefault;

/**
* Helper for building XML command strings sent to the Hayward controller.
*/
@NonNullByDefault
public class CommandBuilder {

private static final String SET_HEATER_ENABLE = """
<Name>SetHeaterEnable</Name>
<Parameters>
<Parameter name=\"Token\" dataType=\"String\">%s</Parameter>
<Parameter name=\"MspSystemID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"PoolID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"HeaterID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"Enabled\" dataType=\"bool\">%s</Parameter>
</Parameters>
""";

private static final String SET_UI_HEATER_CMD = """
<Name>SetUIHeaterCmd</Name>
<Parameters>
<Parameter name=\"Token\" dataType=\"String\">%s</Parameter>
<Parameter name=\"MspSystemID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"PoolID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"HeaterID\" dataType=\"int\">%s</Parameter>
<Parameter name=\"Temp\" dataType=\"int\">%s</Parameter>
</Parameters>
""";

private CommandBuilder() {
// utility class
}

public static String buildSetHeaterEnable(String prefix, String token, int mspSystemID, String poolID,
String heaterID, String enabled) {
return prefix
+ String.format(SET_HEATER_ENABLE, token, mspSystemID, poolID, heaterID, enabled)
+ closingTag(prefix);
}

public static String buildSetUIHeaterCmd(String prefix, String token, int mspSystemID, String poolID,
String heaterID, String temp) {
return prefix + String.format(SET_UI_HEATER_CMD, token, mspSystemID, poolID, heaterID, temp)
Comment on lines +37 to +46

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P0] Use String for mspSystemID in local command builder

The local variant of CommandBuilder repeats the same int mspSystemID signature even though HaywardAccount.mspSystemID is a String. Calls from HaywardVirtualHeaterHandler now fail to compile because a String cannot be passed to these methods. The parameter should be a string (or callers should parse it to an integer) so the module builds.

Useful? React with 👍 / 👎.

+ closingTag(prefix);
}

private static String closingTag(String prefix) {
if (prefix.contains("<Request>")) {
return "</Request>";
} else if (prefix.contains("<GetTelemetry>")) {
return "</GetTelemetry>";
} else {
return "";
}
}
}