diff --git a/README.md b/README.md index a1b4a75..2e1344f 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ There's no global configuration for this binding. | sched_fri | Switch | Scheduled clean enabled for Friday | N | | sched_sat | Switch | Scheduled clean enabled for Saturday | N | | sched_sun | Switch | Scheduled clean enabled for Sunday | N | +| schedule | Number | Schedule bitmask for use in scripts. 7 bits, bit #0 corresponds to Sunday | N | | edge_clean | Switch | Seek out and clean along walls and furniture legs | N | | always_finish | Switch | Whether to keep cleaning if the bin becomes full | N | | power_boost | String | Power boost mode: "auto", "performance", "eco" | N | diff --git a/org.openhab.binding.vacuum/src/main/java/org/openhab/binding/irobot/IRobotBindingConstants.java b/org.openhab.binding.vacuum/src/main/java/org/openhab/binding/irobot/IRobotBindingConstants.java index 5508eca..1873fab 100644 --- a/org.openhab.binding.vacuum/src/main/java/org/openhab/binding/irobot/IRobotBindingConstants.java +++ b/org.openhab.binding.vacuum/src/main/java/org/openhab/binding/irobot/IRobotBindingConstants.java @@ -35,6 +35,7 @@ public class IRobotBindingConstants { public final static String CHANNEL_SCHED_SWITCH_PREFIX = "sched_"; public final static String[] CHANNEL_SCHED_SWITCH = { "sched_sun", "sched_mon", "sched_tue", "sched_wed", "sched_thu", "sched_fri", "sched_sat" }; + public final static String CHANNEL_SCHEDULE = "schedule"; public final static String CHANNEL_EDGE_CLEAN = "edge_clean"; public final static String CHANNEL_ALWAYS_FINISH = "always_finish"; public final static String CHANNEL_POWER_BOOST = "power_boost"; diff --git a/org.openhab.binding.vacuum/src/main/java/org/openhab/binding/irobot/handler/RoombaHandler.java b/org.openhab.binding.vacuum/src/main/java/org/openhab/binding/irobot/handler/RoombaHandler.java index f6236c1..95cfce6 100644 --- a/org.openhab.binding.vacuum/src/main/java/org/openhab/binding/irobot/handler/RoombaHandler.java +++ b/org.openhab.binding.vacuum/src/main/java/org/openhab/binding/irobot/handler/RoombaHandler.java @@ -134,15 +134,26 @@ public void handleCommand(ChannelUID channelUID, Command command) { for (int i = 0; i < CHANNEL_SCHED_SWITCH.length; i++) { if (ch.equals(CHANNEL_SCHED_SWITCH[i])) { JSONArray cycle = schedule.getJSONArray("cycle"); - cycle.put(i, command.equals(OnOffType.ON) ? "start" : "none"); - JSONObject state = new JSONObject(); - state.put("cleanSchedule", schedule); - sendDelta(state); + enableCycle(cycle, i, command.equals(OnOffType.ON)); + sendSchedule(schedule); break; } } } + } else if (ch.equals(CHANNEL_SCHEDULE)) { + if (command instanceof DecimalType) { + int bitmask = ((DecimalType) command).intValue(); + JSONArray cycle = new JSONArray(); + + for (int i = 0; i < CHANNEL_SCHED_SWITCH.length; i++) { + enableCycle(cycle, i, (bitmask & (1 << i)) != 0); + } + + JSONObject schedule = new JSONObject(); + schedule.put("cycle", cycle); + sendSchedule(schedule); + } } else if (ch.equals(CHANNEL_EDGE_CLEAN)) { if (command instanceof OnOffType) { JSONObject state = new JSONObject(); @@ -174,6 +185,16 @@ public void handleCommand(ChannelUID channelUID, Command command) { } } + private void enableCycle(JSONArray cycle, int i, boolean enable) { + cycle.put(i, enable ? "start" : "none"); + } + + private void sendSchedule(JSONObject schedule) { + JSONObject state = new JSONObject(); + state.put("cleanSchedule", schedule); + sendDelta(state); + } + private void sendDelta(JSONObject state) { // Huge thanks to Dorita980 author(s) for an insight on this JSONObject request = new JSONObject(); @@ -388,10 +409,18 @@ public void processMessage(String topic, byte[] payload) { if (schedule.has("cycle")) { JSONArray cycle = schedule.getJSONArray("cycle"); + int binary = 0; for (int i = 0; i < cycle.length(); i++) { - reportSwitch(CHANNEL_SCHED_SWITCH[i], cycle.getString(i).equals("start")); + boolean on = cycle.getString(i).equals("start"); + + reportSwitch(CHANNEL_SCHED_SWITCH[i], on); + if (on) { + binary |= (1 << i); + } } + + reportInt(CHANNEL_SCHEDULE, binary); } lastSchedule = schedule; diff --git a/org.openhab.binding.vacuum/src/main/resources/ESH-INF/thing/thing-types.xml b/org.openhab.binding.vacuum/src/main/resources/ESH-INF/thing/thing-types.xml index 81c5e04..e8459c1 100644 --- a/org.openhab.binding.vacuum/src/main/resources/ESH-INF/thing/thing-types.xml +++ b/org.openhab.binding.vacuum/src/main/resources/ESH-INF/thing/thing-types.xml @@ -46,6 +46,7 @@ Sunday schedule active + @@ -203,6 +204,12 @@ Switch + + Number + + Schedule bitmask for use in scripts: Sun Mon Tue Wed Thu Fri Sat + + Number