diff --git a/bundles/org.openhab.binding.bambulab/pom.xml b/bundles/org.openhab.binding.bambulab/pom.xml
index dec64ecca0..498b284a3e 100644
--- a/bundles/org.openhab.binding.bambulab/pom.xml
+++ b/bundles/org.openhab.binding.bambulab/pom.xml
@@ -18,7 +18,7 @@
pl.grzeslowski
JBambuAPI
- 1.3.0
+ 1.4.0
org.eclipse.paho
diff --git a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/AmsDeviceHandler.java b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/AmsDeviceHandler.java
index 6805c6e8bf..5b0d48c737 100644
--- a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/AmsDeviceHandler.java
+++ b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/AmsDeviceHandler.java
@@ -12,10 +12,11 @@
*/
package org.openhab.binding.bambulab.internal;
+import static java.util.Arrays.stream;
import static java.util.Objects.requireNonNull;
-import static org.openhab.binding.bambulab.internal.BambuLabBindingConstants.AmsChannel.MAX_AMS_TRAYS;
import static org.openhab.core.thing.ThingStatus.*;
import static org.openhab.core.thing.ThingStatusDetail.BRIDGE_UNINITIALIZED;
+import static org.openhab.core.types.UnDefType.UNDEF;
import java.util.Collection;
import java.util.Map;
@@ -83,9 +84,14 @@ public class AmsDeviceHandler extends BaseThingHandler {
@Override
public void handleCommand(ChannelUID channelUID, Command command) {
if (command == RefreshType.REFRESH) {
+ var amsChannel = AmsChannel.findAmsChannel(channelUID);
+ if (amsChannel.isEmpty()) {
+ logger.warn("Could not find AmsChannel for channel UUID: [{}]!", channelUID);
+ return;
+ }
Optional.ofNullable(printer)//
.flatMap(p -> p.findLatestAms(getAmsNumber()))//
- .ifPresent(this::updateAms);
+ .ifPresent(ams -> updateAms(amsChannel.get(), ams));
}
}
@@ -97,6 +103,10 @@ public class AmsDeviceHandler extends BaseThingHandler {
.orElse("?!");
logger.debug("Updating AMS #{}", number);
}
+ stream(AmsChannel.values()).forEach(channel -> updateAms(channel, ams));
+ }
+
+ private void updateAms(AmsChannel channel, Map ams) {
Optional.of(ams)//
.map(map -> map.get("tray"))//
.filter(obj -> obj instanceof Collection>)//
@@ -105,117 +115,56 @@ public class AmsDeviceHandler extends BaseThingHandler {
.flatMap(Collection::stream)//
.filter(obj -> obj instanceof Map, ?>)//
.map(obj -> (Map, ?>) obj)//
- .forEach(this::updateAmsTray);
+ .forEach(map -> updateAmsTray(channel, map));
}
- private void updateAmsTray(Map, ?> map) {
+ @SuppressWarnings("DuplicateBranchesInSwitch")
+ private void updateAmsTray(AmsChannel channel, Map, ?> map) {
var someId = findKey(map, "id")//
.map(Object::toString)//
- .map(Integer::parseInt)
- // tray ID in api starts from 0 and for channels it starts for 1
- .map(t -> t + 1);
+ .map(Integer::parseInt)//
+ .flatMap(AmsChannel.TrayId::parseFromApi);
if (someId.isEmpty()) {
logger.warn("There is no tray ID in {}", map);
return;
}
- int trayId = someId.get();
- if (trayId > MAX_AMS_TRAYS) {
- logger.warn("Tray ID needs to be lower that {}. Was {}", MAX_AMS_TRAYS, trayId);
- return;
- }
-
- findKey(map, "tray_type")//
- .map(Object::toString)//
- .flatMap(AmsChannel.TrayType::findTrayType)//
- .map(Enum::name)//
- .map(value -> (State) StringType.valueOf(value))//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTrayTypeChannel(trayId), value));
- findKey(map, "tray_color")//
- .map(Object::toString)//
- .map(StateParserHelper::parseColor)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTrayColorChannel(trayId), value));
- findKey(map, "nozzle_temp_max")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseTemperatureType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getNozzleTemperatureMaxChannel(trayId), value));
- findKey(map, "nozzle_temp_min")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseTemperatureType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getNozzleTemperatureMinChannel(trayId), value));
- findKey(map, "remain")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parsePercentType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getRemainChannel(trayId), value));
- findKey(map, "k")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseDecimalType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getKChannel(trayId), value));
- findKey(map, "n")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseDecimalType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getNChannel(trayId), value));
- findKey(map, "tag_uuid")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseStringType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTagUuidChannel(trayId), value));
- findKey(map, "tray_id_name")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseStringType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTrayIdNameChannel(trayId), value));
- findKey(map, "tray_info_idx")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseStringType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTrayInfoIdxChannel(trayId), value));
- findKey(map, "tray_sub_brands")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseStringType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTraySubBrandsChannel(trayId), value));
- findKey(map, "tray_weight")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseDecimalType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTrayWeightChannel(trayId), value));
- findKey(map, "tray_diameter")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseDecimalType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTrayDiameterChannel(trayId), value));
- findKey(map, "tray_temp")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseTemperatureType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTrayTemperatureChannel(trayId), value));
- findKey(map, "tray_time")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseDecimalType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getTrayTimeChannel(trayId), value));
- findKey(map, "bed_temp_type")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseStringType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getBedTemperatureTypeChannel(trayId), value));
- findKey(map, "bed_temp")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseTemperatureType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getBedTemperatureChannel(trayId), value));
- findKey(map, "ctype")//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseDecimalType)//
- .or(StateParserHelper::undef)//
- .ifPresent(value -> updateState(AmsChannel.getCtypeChannel(trayId), value));
+ var trayId = someId.get();
+ var key = findKey(map, channel.getJsonKey()).map(Object::toString);
+ var state = switch (channel) {
+ case CHANNEL_TRAY_TYPE -> //
+ key.flatMap(name -> {
+ var trayType = AmsChannel.TrayType.findTrayType(name);
+ if (trayType.isEmpty()) {
+ var msg = "Cannot parse tray type from [{}]! Please report this on https://github.com/openhab/openhab-addons .";
+ if (logger.isDebugEnabled()) {
+ logger.debug(msg + " Full map: {}", name, map);
+ } else {
+ logger.warn(msg, name);
+ }
+ }
+ return trayType;
+ })//
+ .map(Enum::name)//
+ .map(value -> (State) StringType.valueOf(value));
+ case CHANNEL_TRAY_COLOR -> key.map(StateParserHelper::parseColor);
+ case CHANNEL_NOZZLE_TEMPERATURE_MAX -> key.flatMap(StateParserHelper::parseTemperatureType);
+ case CHANNEL_NOZZLE_TEMPERATURE_MIN -> key.flatMap(StateParserHelper::parseTemperatureType);
+ case CHANNEL_REMAIN -> key.flatMap(StateParserHelper::parsePercentType);
+ case CHANNEL_K -> key.flatMap(StateParserHelper::parseDecimalType);
+ case CHANNEL_N -> key.flatMap(StateParserHelper::parseDecimalType);
+ case CHANNEL_TAG_UUID -> key.flatMap(StateParserHelper::parseStringType);
+ case CHANNEL_TRAY_ID_NAME -> key.flatMap(StateParserHelper::parseStringType);
+ case CHANNEL_TRAY_INFO_IDX -> key.flatMap(StateParserHelper::parseStringType);
+ case CHANNEL_TRAY_SUB_BRANDS -> key.flatMap(StateParserHelper::parseStringType);
+ case CHANNEL_TRAY_WEIGHT -> key.flatMap(StateParserHelper::parseDecimalType);
+ case CHANNEL_TRAY_DIAMETER -> key.flatMap(StateParserHelper::parseDecimalType);
+ case CHANNEL_TRAY_TEMPERATURE -> key.flatMap(StateParserHelper::parseTemperatureType);
+ case CHANNEL_TRAY_TIME -> key.flatMap(StateParserHelper::parseDecimalType);
+ case CHANNEL_BED_TEMPERATURE_TYPE -> key.flatMap(StateParserHelper::parseStringType);
+ case CHANNEL_BED_TEMPERATURE -> key.flatMap(StateParserHelper::parseTemperatureType);
+ case CHANNEL_CTYPE -> key.flatMap(StateParserHelper::parseDecimalType);
+ };
+ updateState(channel.findType(trayId), requireNonNull(state.orElse(UNDEF)));
}
private static Optional> findKey(Map, ?> map, String key) {
diff --git a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/BambuLabBindingConstants.java b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/BambuLabBindingConstants.java
index 5d6fe3c997..e0bda64991 100644
--- a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/BambuLabBindingConstants.java
+++ b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/BambuLabBindingConstants.java
@@ -130,98 +130,83 @@ public class BambuLabBindingConstants {
}
}
- public static class AmsChannel {
+ public enum AmsChannel {
+ CHANNEL_TRAY_TYPE("ams-tray-type", "tray_type"),
+ CHANNEL_TRAY_COLOR("ams-tray-color", "tray_color"),
+ CHANNEL_NOZZLE_TEMPERATURE_MAX("ams-nozzle-temperature-max", "nozzle_temp_max"),
+ CHANNEL_NOZZLE_TEMPERATURE_MIN("ams-nozzle-temperature-min", "nozzle_temp_min"),
+ CHANNEL_REMAIN("ams-remain", "remain"),
+ CHANNEL_K("ams-k", "k"),
+ CHANNEL_N("ams-n", "n"),
+ CHANNEL_TAG_UUID("ams-tag-uuid", "tag_uuid"),
+ CHANNEL_TRAY_ID_NAME("ams-tray-id-name", "tray_id_name"),
+ CHANNEL_TRAY_INFO_IDX("ams-tray-info-idx", "tray_info_idx"),
+ CHANNEL_TRAY_SUB_BRANDS("ams-tray-sub-brands", "tray_sub_brands"),
+ CHANNEL_TRAY_WEIGHT("ams-tray-weight", "tray_weight"),
+ CHANNEL_TRAY_DIAMETER("ams-tray-diameter", "tray_diameter"),
+ CHANNEL_TRAY_TEMPERATURE("ams-tray-temperature", "tray_temp"),
+ CHANNEL_TRAY_TIME("ams-tray-time", "tray_time"),
+ CHANNEL_BED_TEMPERATURE_TYPE("ams-bed-temp-type", "bed_temp_type"),
+ CHANNEL_BED_TEMPERATURE("ams-bed-temperature", "bed_temp"),
+ CHANNEL_CTYPE("ams-ctype", "ctype");
+
public static final int MIN_AMS = 1;
/**
* According to Bambu Lab documentation, you can attach up to 4 AMS
*/
public static final int MAX_AMS = 4;
- /**
- * Each AMS device has 4 trays
- */
- public static final int MAX_AMS_TRAYS = 4;
+ private final String group;
+ private final String jsonKey;
- public static String getTrayTypeChannel(int trayId) {
- return prefix(trayId) + "ams-tray-type";
+ AmsChannel(String group, String jsonKey) {
+ this.group = group;
+ this.jsonKey = jsonKey;
}
- public static String getTrayColorChannel(int trayId) {
- return prefix(trayId) + "ams-tray-color";
+ public String getJsonKey() {
+ return jsonKey;
}
- public static String getNozzleTemperatureMaxChannel(int trayId) {
- return prefix(trayId) + "ams-nozzle-temperature-max";
+ public String findType(TrayId trayId) {
+ return "ams-tray-%s#%s".formatted(trayId.getIdx(), group);
}
- public static String getNozzleTemperatureMinChannel(int trayId) {
- return prefix(trayId) + "ams-nozzle-temperature-min";
+ public static Optional findAmsChannel(ChannelUID channel) {
+ return Optional.of(channel)//
+ .map(ChannelUID::getGroupId)//
+ .flatMap(group -> stream(values()).filter(c -> c.group.equals(group)).findAny());
}
- public static String getRemainChannel(int trayId) {
- return prefix(trayId) + "ams-remain";
- }
+ public static enum TrayId {
+ TRAY_1(1),
+ TRAY_2(2),
+ TRAY_3(3),
+ TRAY_4(4);
- public static String getKChannel(int trayId) {
- return prefix(trayId) + "ams-k";
- }
+ /**
+ * Each AMS device has 4 trays
+ */
+ public static final int MAX_AMS_TRAYS = values().length;
- public static String getNChannel(int trayId) {
- return prefix(trayId) + "ams-n";
- }
+ private final int idx;
- public static String getTagUuidChannel(int trayId) {
- return prefix(trayId) + "ams-tag-uuid";
- }
+ TrayId(int idx) {
+ this.idx = idx;
+ }
- public static String getTrayIdNameChannel(int trayId) {
- return prefix(trayId) + "ams-tray-id-name";
- }
+ public int getIdx() {
+ return idx;
+ }
- public static String getTrayInfoIdxChannel(int trayId) {
- return prefix(trayId) + "ams-tray-info-idx";
- }
-
- public static String getTraySubBrandsChannel(int trayId) {
- return prefix(trayId) + "ams-tray-sub-brands";
- }
-
- public static String getTrayWeightChannel(int trayId) {
- return prefix(trayId) + "ams-tray-weight";
- }
-
- public static String getTrayDiameterChannel(int trayId) {
- return prefix(trayId) + "ams-tray-diameter";
- }
-
- public static String getTrayTemperatureChannel(int trayId) {
- return prefix(trayId) + "ams-tray-temperature";
- }
-
- public static String getTrayTimeChannel(int trayId) {
- return prefix(trayId) + "ams-tray-time";
- }
-
- public static String getBedTemperatureTypeChannel(int trayId) {
- return prefix(trayId) + "ams-bed-temp-type";
- }
-
- public static String getBedTemperatureChannel(int trayId) {
- return prefix(trayId) + "ams-bed-temperature";
- }
-
- public static String getCtypeChannel(int trayId) {
- return prefix(trayId) + "ams-ctype";
- }
-
- private static String prefix(int trayId) {
- checkTrayId(trayId);
- return "ams-tray-%s#".formatted(trayId + 1);
- }
-
- private static void checkTrayId(int trayId) {
- if (trayId <= 0 || trayId > MAX_AMS_TRAYS) {
- throw new IllegalArgumentException(
- "Invalid tray ID: %d. Allowed range: 1 to %d.".formatted(trayId, MAX_AMS_TRAYS));
+ public static Optional parseFromApi(int idx) {
+ // tray ID in api starts from 0 and for channels it starts for 1
+ return switch (idx) {
+ case 0 -> Optional.of(TRAY_1);
+ case 1 -> Optional.of(TRAY_2);
+ case 2 -> Optional.of(TRAY_3);
+ case 3 -> Optional.of(TRAY_4);
+ default -> Optional.empty();
+ };
}
}
@@ -239,11 +224,9 @@ public class BambuLabBindingConstants {
private static final Logger log = LoggerFactory.getLogger(TrayType.class);
public static Optional findTrayType(String name) {
- var any = stream(values()).filter(t -> t.name().equalsIgnoreCase(name)).findAny();
- if (any.isEmpty()) {
- log.warn("Cannot parse TrayType from {}!", name);
- }
- return any;
+ return stream(values())//
+ .filter(t -> t.name().equalsIgnoreCase(name))//
+ .findAny();
}
}
}
diff --git a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/CommandParser.java b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/CommandParser.java
index 927ca038c9..65a9a41d5e 100644
--- a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/CommandParser.java
+++ b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/CommandParser.java
@@ -143,7 +143,7 @@ public class CommandParser {
private static PrinterClient.Channel.PrintSpeedCommand parsePrintSpeedCommand(String[] commandLine) {
requireLength(commandLine, 1);
- return PrinterClient.Channel.PrintSpeedCommand.valueOf(commandLine[0]);
+ return PrinterClient.Channel.PrintSpeedCommand.findByName(commandLine[0]);
}
private static PrinterClient.Channel.GCodeFileCommand parseGCodeFileCommand(String[] commandLine) {
diff --git a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/PrinterHandler.java b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/PrinterHandler.java
index b618ccaa5f..add54e90c6 100644
--- a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/PrinterHandler.java
+++ b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/PrinterHandler.java
@@ -109,10 +109,12 @@ public class PrinterHandler extends BaseBridgeHandler
var bambuCommand = new GCodeFileCommand(command.toString());
sendCommand(bambuCommand);
} else if (CHANNEL_SPEED_LEVEL.is(channelUID) && command instanceof StringType) {
- stream(PrintSpeedCommand.values())//
- .filter(type -> type.name().equalsIgnoreCase(command.toString()))//
- .findAny()//
- .ifPresent(this::sendCommand);
+ var bambuCommand = PrintSpeedCommand.findByName(command.toString());
+ if (bambuCommand.canSend()) {
+ sendCommand(bambuCommand);
+ } else {
+ logger.warn("Cannot send command: {}", bambuCommand);
+ }
} else if (CHANNEL_CAMERA_RECORD.is(channelUID) && command instanceof OnOffType onOffCommand) {
requireNonNull(camera).handleCommand(onOffCommand);
} else if (CHANNEL_COMMAND.is(channelUID) && command instanceof StringType) {
@@ -323,6 +325,13 @@ public class PrinterHandler extends BaseBridgeHandler
}
stream(PrinterChannel.values()).forEach(channel -> updateState(channel, print));
+ Optional.of(print)//
+ .map(Report.Print::ams)//
+ .map(Report.Print.Ams::ams)//
+ .stream()//
+ .flatMap(Collection::stream)//
+ .forEach(this::updateAms);
+
// if got new Printer state (and not failed) then make sure that thing status in ONLINE
updateStatus(ONLINE);
}
diff --git a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/StateParserHelper.java b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/StateParserHelper.java
index 6dd45cf4cd..3b6aa537a7 100644
--- a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/StateParserHelper.java
+++ b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/StateParserHelper.java
@@ -141,8 +141,12 @@ public class StateParserHelper {
public static Optional parseSpeedLevel(@Nullable Integer speedLvl) {
return Optional.ofNullable(speedLvl)//
.map(PrintSpeedCommand::findByLevel)//
- .map(Object::toString)//
- .flatMap(StateParserHelper::parseStringType);
+ .map(lvl -> {
+ if (!lvl.canSend()) {
+ return UNDEF;
+ }
+ return new StringType(lvl.getName());
+ });
}
public static Optional parseTrayType(@Nullable String trayType) {
diff --git a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/TrayHelper.java b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/TrayHelper.java
index 64e55f4842..c31854abd0 100644
--- a/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/TrayHelper.java
+++ b/bundles/org.openhab.binding.bambulab/src/main/java/org/openhab/binding/bambulab/internal/TrayHelper.java
@@ -14,6 +14,7 @@ package org.openhab.binding.bambulab.internal;
import static java.lang.Integer.parseInt;
import static org.openhab.binding.bambulab.internal.BambuLabBindingConstants.AmsChannel.*;
+import static org.openhab.binding.bambulab.internal.BambuLabBindingConstants.AmsChannel.TrayId.MAX_AMS_TRAYS;
import static org.openhab.core.types.UnDefType.UNDEF;
import java.util.Optional;
diff --git a/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/CommandParserTest.java b/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/CommandParserTest.java
index 5e6bf1148b..09f5ec32dd 100644
--- a/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/CommandParserTest.java
+++ b/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/CommandParserTest.java
@@ -15,6 +15,7 @@ package org.openhab.binding.bambulab.internal;
import static org.assertj.core.api.Assertions.*;
import static pl.grzeslowski.jbambuapi.mqtt.PrinterClient.Channel.LedControlCommand.LedMode.*;
import static pl.grzeslowski.jbambuapi.mqtt.PrinterClient.Channel.LedControlCommand.LedNode.*;
+import static pl.grzeslowski.jbambuapi.mqtt.PrinterClient.Channel.PrintSpeedCommand.*;
import java.util.Arrays;
import java.util.List;
@@ -101,8 +102,8 @@ class CommandParserTest {
new PrinterClient.Channel.AmsFilamentSettingCommand(11, 22, "s3", "s4", 55, 66, "s7")));
var amsControlCommandStream = Arrays.stream(PrinterClient.Channel.AmsControlCommand.values())//
.map(value -> Arguments.of("AmsControl:" + value.name(), value));
- var printSpeedCommandStream = Arrays.stream(PrinterClient.Channel.PrintSpeedCommand.values())//
- .map(value -> Arguments.of("PrintSpeed:" + value.name(), value));
+ var printSpeedCommandStream = Stream.of(SILENT, STANDARD, SPORT, LUDICROUS)//
+ .map(value -> Arguments.of("PrintSpeed:" + value.getName(), value));
var gCodeFileCommandStream = stream(
Arguments.of("GCodeFile:s1", new PrinterClient.Channel.GCodeFileCommand("s1")));
var gCodeLineCommandStream = stream(Arguments.of("""
diff --git a/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/PrinterHandlerTest.java b/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/PrinterHandlerTest.java
index 95d44e7203..22b58ea917 100644
--- a/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/PrinterHandlerTest.java
+++ b/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/PrinterHandlerTest.java
@@ -18,6 +18,7 @@ import static org.mockito.Mockito.*;
import static org.openhab.binding.bambulab.internal.BambuLabBindingConstants.PrinterChannel.*;
import static pl.grzeslowski.jbambuapi.mqtt.PrinterClient.Channel.LedControlCommand.*;
import static pl.grzeslowski.jbambuapi.mqtt.PrinterClient.Channel.LedControlCommand.LedNode.*;
+import static pl.grzeslowski.jbambuapi.mqtt.PrinterClient.Channel.PrintSpeedCommand.*;
import java.util.stream.Stream;
@@ -103,8 +104,8 @@ class PrinterHandlerTest {
}
static Stream speedLevel() {
- return stream(PrintSpeedCommand.values())//
- .map(command -> Arguments.of(command.name(), command));
+ return Stream.of(SILENT, STANDARD, SPORT, LUDICROUS)//
+ .map(command -> Arguments.of(command.getName(), command));
}
@ParameterizedTest(name = "Command to channel {0} should not invoke `client.sendCommand`")
diff --git a/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/StateParserHelperTest.java b/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/StateParserHelperTest.java
index dbf4564543..d1252d80ab 100644
--- a/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/StateParserHelperTest.java
+++ b/bundles/org.openhab.binding.bambulab/src/test/java/org/openhab/binding/bambulab/internal/StateParserHelperTest.java
@@ -16,15 +16,23 @@ import static org.assertj.core.api.Assertions.*;
import static org.openhab.core.library.unit.SIUnits.CELSIUS;
import static org.openhab.core.library.unit.Units.DECIBEL_MILLIWATTS;
import static org.openhab.core.types.UnDefType.UNDEF;
+import static pl.grzeslowski.jbambuapi.mqtt.PrinterClient.Channel.PrintSpeedCommand.*;
import static tech.units.indriya.unit.Units.PERCENT;
+import java.util.stream.Stream;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.library.types.StringType;
+import pl.grzeslowski.jbambuapi.mqtt.PrinterClient;
+
/**
* @author Martin GrzeĊlowski - Initial contribution
*/
@@ -521,4 +529,52 @@ class StateParserHelperTest {
assertThat(quantityType.doubleValue()).isEqualTo(Double.MIN_VALUE);
assertThat(quantityType.getUnit()).isEqualTo(PERCENT);
}
+
+ @ParameterizedTest(name = "{index}: should properly parse {0}")
+ @MethodSource
+ void speedLevel(PrinterClient.Channel.PrintSpeedCommand command) {
+ // Given
+ var speedLevel = command.getLevel();
+
+ // When
+ var result = StateParserHelper.parseSpeedLevel(speedLevel);
+
+ // Then
+ assertThat(result).isPresent();
+ assertThat(result.get()).isInstanceOf(StringType.class);
+ assertThat(((StringType) result.get()).toString()).isEqualTo(command.getName());
+ }
+
+ static Stream speedLevel() {
+ return Stream.of(SILENT, STANDARD, SPORT, LUDICROUS).map(Arguments::of);
+ }
+
+ // Handles null input by returning empty Optional
+ @Test
+ @DisplayName("Given null input, when parseSpeedLevel is called, then returns empty Optional")
+ public void testHandlesNullInput() {
+ // Given
+ Integer speedLevel = null;
+
+ // When
+ var result = StateParserHelper.parseSpeedLevel(speedLevel);
+
+ // Then
+ assertThat(result).isEmpty();
+ }
+
+ // Returns UNDEF for non-basic speed levels
+ @Test
+ @DisplayName("Given non-basic speed level, when parseSpeedLevel is called, then returns UNDEF")
+ public void testReturnsUndefForNonBasicSpeedLevels() {
+ // Given
+ var speedLevel = 101;
+
+ // When
+ var result = StateParserHelper.parseSpeedLevel(speedLevel);
+
+ // Then
+ assertThat(result).isPresent();
+ assertThat(result.get()).isEqualTo(UNDEF);
+ }
}