]> git.basschouten.com Git - openhab-addons.git/blob
2550af311da44a610c6873144a86072089d59a78
[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(768,
69                     new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
70                             DeviceCommand.RETURN)),
71             entry(769,
72                     new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
73                             DeviceCommand.RETURN)),
74             entry(770,
75                     new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
76                             DeviceCommand.RETURN)),
77             entry(771,
78                     new DeviceStatus("returning-to-dock-battery-low", EnumSet.of(DeviceStateAttribute.ACTIVE),
79                             DeviceCommand.RETURN)),
80             entry(772,
81                     new DeviceStatus("returning-to-dock-calendar-timeslot-ended",
82                             EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.RETURN)),
83             entry(773,
84                     new DeviceStatus("returning-to-dock-battery-temp-range", EnumSet.of(DeviceStateAttribute.ACTIVE),
85                             DeviceCommand.RETURN)),
86             entry(774,
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)),
91             entry(776,
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)),
97             entry(1537,
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)));
102
103     private String textKey;
104
105     private EnumSet<DeviceStateAttribute> attributes;
106
107     private @Nullable DeviceCommand associatedCommand;
108
109     private DeviceStatus(String textKey, EnumSet<DeviceStateAttribute> attributes,
110             @Nullable DeviceCommand associatedCommand) {
111         this.textKey = textKey;
112         this.attributes = attributes;
113         this.associatedCommand = associatedCommand;
114     }
115
116     /**
117      * Returns a {@link DeviceStatus} instance describing the status code.
118      * 
119      * @param code the status code
120      * @return the {@link DeviceStatus} providing additional context for the code
121      */
122     public static DeviceStatus fromCode(int code) {
123         DeviceStatus status = STATUS_MAP.get(code);
124         if (status != null) {
125             return status;
126         }
127
128         DeviceCommand command = null;
129         EnumSet<DeviceStateAttribute> attributes = EnumSet.noneOf(DeviceStateAttribute.class);
130         switch (code & 0xff00) {
131             case 0x100:
132                 command = DeviceCommand.RETURN;
133                 break;
134             case 0x200:
135                 command = DeviceCommand.MOW;
136                 attributes.add(DeviceStateAttribute.ACTIVE);
137                 break;
138             case 0x300:
139                 command = DeviceCommand.RETURN;
140                 attributes.add(DeviceStateAttribute.ACTIVE);
141                 break;
142         }
143
144         return new DeviceStatus(String.valueOf(code), attributes, command);
145     }
146
147     /**
148      * Returns a localized description for this {@link DeviceStatus}.
149      * 
150      * @param translationProvider
151      * @return localized status description
152      */
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);
157         }
158         return textualState;
159     }
160
161     public boolean isReadyToMow() {
162         return attributes.contains(DeviceStateAttribute.READY_TO_MOW);
163     }
164
165     public boolean isActive() {
166         return attributes.contains(DeviceStateAttribute.ACTIVE);
167     }
168
169     public boolean isCharging() {
170         return attributes.contains(DeviceStateAttribute.CHARGING);
171     }
172
173     public boolean isDocked() {
174         return attributes.contains(DeviceStateAttribute.DOCKED);
175     }
176
177     public boolean isCompleted() {
178         return attributes.contains(DeviceStateAttribute.COMPLETED);
179     }
180
181     public @Nullable DeviceCommand getAssociatedCommand() {
182         return associatedCommand;
183     }
184 }