]> git.basschouten.com Git - openhab-addons.git/blob
f8ace9c5744d497f9e980fa15a6ae7ac4be2af7c
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.boschindego.internal;
14
15 import static java.util.Map.entry;
16
17 import java.util.EnumSet;
18 import java.util.Map;
19
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.eclipse.jdt.annotation.Nullable;
22 import org.openhab.binding.boschindego.internal.dto.DeviceCommand;
23
24 /**
25  * {@link DeviceStatus} describes status codes from the device with corresponding
26  * characteristics and associated command.
27  * 
28  * @author Jacob Laursen - Initial contribution
29  */
30 @NonNullByDefault
31 public class DeviceStatus {
32
33     private static final String STATE_PREFIX = "indego.state.";
34     private static final String STATE_UNKNOWN = "unknown";
35
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)),
39             entry(257,
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)),
44             entry(259,
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)),
51             entry(262,
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)),
56             entry(266,
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)),
65             entry(519,
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)),
69             entry(768,
70                     new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
71                             DeviceCommand.RETURN)),
72             entry(769,
73                     new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
74                             DeviceCommand.RETURN)),
75             entry(770,
76                     new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
77                             DeviceCommand.RETURN)),
78             entry(771,
79                     new DeviceStatus("returning-to-dock-battery-low", EnumSet.of(DeviceStateAttribute.ACTIVE),
80                             DeviceCommand.RETURN)),
81             entry(772,
82                     new DeviceStatus("returning-to-dock-calendar-timeslot-ended",
83                             EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.RETURN)),
84             entry(773,
85                     new DeviceStatus("returning-to-dock-battery-temp-range", EnumSet.of(DeviceStateAttribute.ACTIVE),
86                             DeviceCommand.RETURN)),
87             entry(774,
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)),
92             entry(776,
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)),
98             entry(1537,
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)));
103
104     private String textKey;
105
106     private EnumSet<DeviceStateAttribute> attributes;
107
108     private @Nullable DeviceCommand associatedCommand;
109
110     private DeviceStatus(String textKey, EnumSet<DeviceStateAttribute> attributes,
111             @Nullable DeviceCommand associatedCommand) {
112         this.textKey = textKey;
113         this.attributes = attributes;
114         this.associatedCommand = associatedCommand;
115     }
116
117     /**
118      * Returns a {@link DeviceStatus} instance describing the status code.
119      * 
120      * @param code the status code
121      * @return the {@link DeviceStatus} providing additional context for the code
122      */
123     public static DeviceStatus fromCode(int code) {
124         DeviceStatus status = STATUS_MAP.get(code);
125         if (status != null) {
126             return status;
127         }
128
129         DeviceCommand command = null;
130         EnumSet<DeviceStateAttribute> attributes = EnumSet.noneOf(DeviceStateAttribute.class);
131         switch (code & 0xff00) {
132             case 0x100:
133                 command = DeviceCommand.RETURN;
134                 break;
135             case 0x200:
136                 command = DeviceCommand.MOW;
137                 attributes.add(DeviceStateAttribute.ACTIVE);
138                 break;
139             case 0x300:
140                 command = DeviceCommand.RETURN;
141                 attributes.add(DeviceStateAttribute.ACTIVE);
142                 break;
143         }
144
145         return new DeviceStatus(String.valueOf(code), attributes, command);
146     }
147
148     /**
149      * Returns a localized description for this {@link DeviceStatus}.
150      * 
151      * @param translationProvider
152      * @return localized status description
153      */
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);
158         }
159         return textualState;
160     }
161
162     public boolean isReadyToMow() {
163         return attributes.contains(DeviceStateAttribute.READY_TO_MOW);
164     }
165
166     public boolean isActive() {
167         return attributes.contains(DeviceStateAttribute.ACTIVE);
168     }
169
170     public boolean isCharging() {
171         return attributes.contains(DeviceStateAttribute.CHARGING);
172     }
173
174     public boolean isDocked() {
175         return attributes.contains(DeviceStateAttribute.DOCKED);
176     }
177
178     public boolean isCompleted() {
179         return attributes.contains(DeviceStateAttribute.COMPLETED);
180     }
181
182     public @Nullable DeviceCommand getAssociatedCommand() {
183         return associatedCommand;
184     }
185 }