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)),
69 new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
70 DeviceCommand.RETURN)),
72 new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
73 DeviceCommand.RETURN)),
75 new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
76 DeviceCommand.RETURN)),
78 new DeviceStatus("returning-to-dock-battery-low", EnumSet.of(DeviceStateAttribute.ACTIVE),
79 DeviceCommand.RETURN)),
81 new DeviceStatus("returning-to-dock-calendar-timeslot-ended",
82 EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.RETURN)),
84 new DeviceStatus("returning-to-dock-battery-temp-range", EnumSet.of(DeviceStateAttribute.ACTIVE),
85 DeviceCommand.RETURN)),
87 new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
88 DeviceCommand.RETURN)),
89 entry(775, new DeviceStatus("returning-to-dock-lawn-complete",
90 EnumSet.of(DeviceStateAttribute.ACTIVE, DeviceStateAttribute.COMPLETED), DeviceCommand.RETURN)),
92 new DeviceStatus("returning-to-dock-relocalising", EnumSet.of(DeviceStateAttribute.ACTIVE),
93 DeviceCommand.RETURN)),
94 entry(1025, new DeviceStatus("diagnostic-mode", EnumSet.noneOf(DeviceStateAttribute.class), null)),
95 entry(1026, new DeviceStatus("end-of-life", EnumSet.noneOf(DeviceStateAttribute.class), null)),
96 entry(1281, new DeviceStatus("software-update", EnumSet.noneOf(DeviceStateAttribute.class), null)),
98 new DeviceStatus("energy-save-mode", EnumSet.of(DeviceStateAttribute.READY_TO_MOW),
99 DeviceCommand.RETURN)),
100 entry(64513, new DeviceStatus("docked",
101 EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.READY_TO_MOW), DeviceCommand.RETURN)));
103 private String textKey;
105 private EnumSet<DeviceStateAttribute> attributes;
107 private @Nullable DeviceCommand associatedCommand;
109 private DeviceStatus(String textKey, EnumSet<DeviceStateAttribute> attributes,
110 @Nullable DeviceCommand associatedCommand) {
111 this.textKey = textKey;
112 this.attributes = attributes;
113 this.associatedCommand = associatedCommand;
117 * Returns a {@link DeviceStatus} instance describing the status code.
119 * @param code the status code
120 * @return the {@link DeviceStatus} providing additional context for the code
122 public static DeviceStatus fromCode(int code) {
123 DeviceStatus status = STATUS_MAP.get(code);
124 if (status != null) {
128 DeviceCommand command = null;
129 EnumSet<DeviceStateAttribute> attributes = EnumSet.noneOf(DeviceStateAttribute.class);
130 switch (code & 0xff00) {
132 command = DeviceCommand.RETURN;
135 command = DeviceCommand.MOW;
136 attributes.add(DeviceStateAttribute.ACTIVE);
139 command = DeviceCommand.RETURN;
140 attributes.add(DeviceStateAttribute.ACTIVE);
144 return new DeviceStatus(String.valueOf(code), attributes, command);
148 * Returns a localized description for this {@link DeviceStatus}.
150 * @param translationProvider
151 * @return localized status description
153 public String getMessage(BoschIndegoTranslationProvider translationProvider) {
154 String textualState = translationProvider.getText(STATE_PREFIX + textKey);
155 if (textualState == null) {
156 textualState = String.format(translationProvider.getText(STATE_PREFIX + STATE_UNKNOWN, textKey), textKey);
161 public boolean isReadyToMow() {
162 return attributes.contains(DeviceStateAttribute.READY_TO_MOW);
165 public boolean isActive() {
166 return attributes.contains(DeviceStateAttribute.ACTIVE);
169 public boolean isCharging() {
170 return attributes.contains(DeviceStateAttribute.CHARGING);
173 public boolean isDocked() {
174 return attributes.contains(DeviceStateAttribute.DOCKED);
177 public boolean isCompleted() {
178 return attributes.contains(DeviceStateAttribute.COMPLETED);
181 public @Nullable DeviceCommand getAssociatedCommand() {
182 return associatedCommand;