From 870405e2c8ea9488ae4db9b0579ba87e24bbe492 Mon Sep 17 00:00:00 2001 From: Nuesel Date: Thu, 16 Dec 2021 08:53:30 +0100 Subject: [PATCH] iRobot zone support added (#11783) Signed-off-by: Nuesel --- bundles/org.openhab.binding.irobot/README.md | 7 ++-- .../irobot/internal/dto/MQTTProtocol.java | 18 ++++++---- .../internal/handler/RoombaHandler.java | 35 +++++++++++++++++-- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/bundles/org.openhab.binding.irobot/README.md b/bundles/org.openhab.binding.irobot/README.md index 9ab3f647b482..e68bcd842778 100644 --- a/bundles/org.openhab.binding.irobot/README.md +++ b/bundles/org.openhab.binding.irobot/README.md @@ -150,10 +150,13 @@ Error codes. Data type is string in order to be able to utilize mapping to human You can clean one or many specific regions of a given map by sending the following String to the command channel: ``` - cleanRegions:;,,.. + cleanRegions:;[r=],[r=],z=,...;[] ``` -The easiest way to determine the pmapId and region_ids is to monitor the last_command channel while starting a new mission for the specific region with the iRobot-App. +Some devices support cleaning rooms (aka regions). Additionally, support for cleaning rectangle areas previously defined in the iRobot-App (aka zones) may be available. +If the type string such as `r=` (region) or `z=` (zone) is omnitted, the type defaults to region. + +The easiest way to determine the pmapId, region_ids/zoneids and userPmapvId is to monitor the last_command channel while starting a new mission for the specific region or zone with the iRobot-App. ## Known Problems / Caveats diff --git a/bundles/org.openhab.binding.irobot/src/main/java/org/openhab/binding/irobot/internal/dto/MQTTProtocol.java b/bundles/org.openhab.binding.irobot/src/main/java/org/openhab/binding/irobot/internal/dto/MQTTProtocol.java index fd9103590756..a04dd7754453 100644 --- a/bundles/org.openhab.binding.irobot/src/main/java/org/openhab/binding/irobot/internal/dto/MQTTProtocol.java +++ b/bundles/org.openhab.binding.irobot/src/main/java/org/openhab/binding/irobot/internal/dto/MQTTProtocol.java @@ -12,9 +12,8 @@ */ package org.openhab.binding.irobot.internal.dto; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import com.google.gson.JsonElement; import com.google.gson.annotations.SerializedName; @@ -35,13 +34,20 @@ public static class CleanRoomsRequest extends CommandRequest { public int ordered; @SerializedName("pmap_id") public String pmapId; + @SerializedName("user_pmapv_id") + public String userPmapvId; public List regions; - public CleanRoomsRequest(String cmd, String mapId, String[] regions) { + public CleanRoomsRequest(String cmd, String mapId, String[] pregions, String[] types, String userPmapvId) { super(cmd); ordered = 1; pmapId = mapId; - this.regions = Arrays.stream(regions).map(i -> new Region(i)).collect(Collectors.toList()); + this.userPmapvId = userPmapvId; + + regions = new ArrayList(); + for (int i = 0; (i < pregions.length) && (i < types.length); i++) { + regions.add(new Region(pregions[i], types[i])); + } } public static class Region { @@ -49,9 +55,9 @@ public static class Region { public String regionId; public String type; - public Region(String id) { + public Region(String id, String type) { this.regionId = id; - this.type = "rid"; + this.type = type; } } } diff --git a/bundles/org.openhab.binding.irobot/src/main/java/org/openhab/binding/irobot/internal/handler/RoombaHandler.java b/bundles/org.openhab.binding.irobot/src/main/java/org/openhab/binding/irobot/internal/handler/RoombaHandler.java index 78d7f4e1ba75..ae0c02f2ca9b 100644 --- a/bundles/org.openhab.binding.irobot/src/main/java/org/openhab/binding/irobot/internal/handler/RoombaHandler.java +++ b/bundles/org.openhab.binding.irobot/src/main/java/org/openhab/binding/irobot/internal/handler/RoombaHandler.java @@ -189,9 +189,38 @@ public void handleCommand(ChannelUID channelUID, Command command) { String[] params = cmds[1].split(";"); String mapId = params[0]; - String[] regionIds = params[1].split(","); - - MQTTProtocol.Request request = new MQTTProtocol.CleanRoomsRequest("start", mapId, regionIds); + String userPmapvId; + if (params.length >= 3) { + userPmapvId = params[2]; + } else { + userPmapvId = null; + } + + String[] regions = params[1].split(","); + String regionIds[] = new String[regions.length]; + String regionTypes[] = new String[regions.length]; + + for (int i = 0; i < regions.length; i++) { + String[] regionDetails = regions[i].split("="); + + if (regionDetails.length >= 2) { + if (regionDetails[0].equals("r")) { + regionIds[i] = regionDetails[1]; + regionTypes[i] = "rid"; + } else if (regionDetails[0].equals("z")) { + regionIds[i] = regionDetails[1]; + regionTypes[i] = "zid"; + } else { + regionIds[i] = regionDetails[0]; + regionTypes[i] = "rid"; + } + } else { + regionIds[i] = regionDetails[0]; + regionTypes[i] = "rid"; + } + } + MQTTProtocol.Request request = new MQTTProtocol.CleanRoomsRequest("start", mapId, regionIds, + regionTypes, userPmapvId); connection.send(request.getTopic(), gson.toJson(request)); } else { logger.warn("Invalid request: {}", cmd);