2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.boschindego.internal;
15 import static java.util.Map.entry;
17 import java.util.EnumSet;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.eclipse.jdt.annotation.Nullable;
22 import org.openhab.binding.boschindego.internal.dto.DeviceCommand;
25 * {@link DeviceStatus} describes status codes from the device with corresponding
26 * characteristics and associated command.
28 * @author Jacob Laursen - Initial contribution
31 public class DeviceStatus {
33 private static final String STATE_PREFIX = "indego.state.";
34 private static final String STATE_UNKNOWN = "unknown";
36 private static final Map<Integer, DeviceStatus> STATUS_MAP = Map.ofEntries(
37 entry(0, new DeviceStatus("reading-status", EnumSet.noneOf(DeviceStateAttribute.class),
38 DeviceCommand.RETURN)),
40 new DeviceStatus("charging", EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.CHARGING),
41 DeviceCommand.RETURN)),
42 entry(258, new DeviceStatus("docked",
43 EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.READY_TO_MOW), DeviceCommand.RETURN)),
45 new DeviceStatus("docked-software-update", EnumSet.of(DeviceStateAttribute.DOCKED),
46 DeviceCommand.RETURN)),
47 entry(260, new DeviceStatus("docked",
48 EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.READY_TO_MOW), DeviceCommand.RETURN)),
49 entry(261, new DeviceStatus("docked",
50 EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.READY_TO_MOW), DeviceCommand.RETURN)),
52 new DeviceStatus("docked-loading-map",
53 EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.ACTIVE), DeviceCommand.MOW)),
54 entry(263, new DeviceStatus("docked-saving-map",
55 EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.ACTIVE), DeviceCommand.RETURN)),
57 new DeviceStatus("leaving-dock",
58 EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.ACTIVE), DeviceCommand.MOW)),
59 entry(513, new DeviceStatus("mowing", EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.MOW)),
60 entry(514, new DeviceStatus("relocalising", EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.MOW)),
61 entry(515, new DeviceStatus("loading-map", EnumSet.noneOf(DeviceStateAttribute.class), DeviceCommand.MOW)),
62 entry(516, new DeviceStatus("learning-lawn", EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.MOW)),
63 entry(517, new DeviceStatus("paused", EnumSet.of(DeviceStateAttribute.READY_TO_MOW), DeviceCommand.PAUSE)),
64 entry(518, new DeviceStatus("border-cut", EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.MOW)),
66 new DeviceStatus("idle-in-lawn", EnumSet.of(DeviceStateAttribute.READY_TO_MOW), DeviceCommand.MOW)),
67 entry(523, new DeviceStatus("spotmow", EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.MOW)),
68 entry(524, new DeviceStatus("mowing-randomly", EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.MOW)),
70 new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
71 DeviceCommand.RETURN)),
73 new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
74 DeviceCommand.RETURN)),
76 new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
77 DeviceCommand.RETURN)),
79 new DeviceStatus("returning-to-dock-battery-low", EnumSet.of(DeviceStateAttribute.ACTIVE),
80 DeviceCommand.RETURN)),
82 new DeviceStatus("returning-to-dock-calendar-timeslot-ended",
83 EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.RETURN)),
85 new DeviceStatus("returning-to-dock-battery-temp-range", EnumSet.of(DeviceStateAttribute.ACTIVE),
86 DeviceCommand.RETURN)),
88 new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
89 DeviceCommand.RETURN)),
90 entry(775, new DeviceStatus("returning-to-dock-lawn-complete",
91 EnumSet.of(DeviceStateAttribute.ACTIVE, DeviceStateAttribute.COMPLETED), DeviceCommand.RETURN)),
93 new DeviceStatus("returning-to-dock-relocalising", EnumSet.of(DeviceStateAttribute.ACTIVE),
94 DeviceCommand.RETURN)),
95 entry(1025, new DeviceStatus("diagnostic-mode", EnumSet.noneOf(DeviceStateAttribute.class), null)),
96 entry(1026, new DeviceStatus("end-of-life", EnumSet.noneOf(DeviceStateAttribute.class), null)),
97 entry(1281, new DeviceStatus("software-update", EnumSet.noneOf(DeviceStateAttribute.class), null)),
99 new DeviceStatus("energy-save-mode", EnumSet.of(DeviceStateAttribute.READY_TO_MOW),
100 DeviceCommand.RETURN)),
101 entry(64513, new DeviceStatus("docked",
102 EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.READY_TO_MOW), DeviceCommand.RETURN)));
104 private String textKey;
106 private EnumSet<DeviceStateAttribute> attributes;
108 private @Nullable DeviceCommand associatedCommand;
110 private DeviceStatus(String textKey, EnumSet<DeviceStateAttribute> attributes,
111 @Nullable DeviceCommand associatedCommand) {
112 this.textKey = textKey;
113 this.attributes = attributes;
114 this.associatedCommand = associatedCommand;
118 * Returns a {@link DeviceStatus} instance describing the status code.
120 * @param code the status code
121 * @return the {@link DeviceStatus} providing additional context for the code
123 public static DeviceStatus fromCode(int code) {
124 DeviceStatus status = STATUS_MAP.get(code);
125 if (status != null) {
129 DeviceCommand command = null;
130 EnumSet<DeviceStateAttribute> attributes = EnumSet.noneOf(DeviceStateAttribute.class);
131 switch (code & 0xff00) {
133 command = DeviceCommand.RETURN;
136 command = DeviceCommand.MOW;
137 attributes.add(DeviceStateAttribute.ACTIVE);
140 command = DeviceCommand.RETURN;
141 attributes.add(DeviceStateAttribute.ACTIVE);
145 return new DeviceStatus(String.valueOf(code), attributes, command);
149 * Returns a localized description for this {@link DeviceStatus}.
151 * @param translationProvider
152 * @return localized status description
154 public String getMessage(BoschIndegoTranslationProvider translationProvider) {
155 String textualState = translationProvider.getText(STATE_PREFIX + textKey);
156 if (textualState == null) {
157 textualState = String.format(translationProvider.getText(STATE_PREFIX + STATE_UNKNOWN, textKey), textKey);
162 public boolean isReadyToMow() {
163 return attributes.contains(DeviceStateAttribute.READY_TO_MOW);
166 public boolean isActive() {
167 return attributes.contains(DeviceStateAttribute.ACTIVE);
170 public boolean isCharging() {
171 return attributes.contains(DeviceStateAttribute.CHARGING);
174 public boolean isDocked() {
175 return attributes.contains(DeviceStateAttribute.DOCKED);
178 public boolean isCompleted() {
179 return attributes.contains(DeviceStateAttribute.COMPLETED);
182 public @Nullable DeviceCommand getAssociatedCommand() {
183 return associatedCommand;