]> git.basschouten.com Git - openhab-addons.git/blob
4a89da90bb5372400e4c18cb386f95d9a03fa210
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 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(769,
69                     new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
70                             DeviceCommand.RETURN)),
71             entry(770,
72                     new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
73                             DeviceCommand.RETURN)),
74             entry(771,
75                     new DeviceStatus("returning-to-dock-battery-low", EnumSet.of(DeviceStateAttribute.ACTIVE),
76                             DeviceCommand.RETURN)),
77             entry(772,
78                     new DeviceStatus("returning-to-dock-calendar-timeslot-ended",
79                             EnumSet.of(DeviceStateAttribute.ACTIVE), DeviceCommand.RETURN)),
80             entry(773,
81                     new DeviceStatus("returning-to-dock-battery-temp-range", EnumSet.of(DeviceStateAttribute.ACTIVE),
82                             DeviceCommand.RETURN)),
83             entry(774,
84                     new DeviceStatus("returning-to-dock", EnumSet.of(DeviceStateAttribute.ACTIVE),
85                             DeviceCommand.RETURN)),
86             entry(775, new DeviceStatus("returning-to-dock-lawn-complete",
87                     EnumSet.of(DeviceStateAttribute.ACTIVE, DeviceStateAttribute.COMPLETED), DeviceCommand.RETURN)),
88             entry(776,
89                     new DeviceStatus("returning-to-dock-relocalising", EnumSet.of(DeviceStateAttribute.ACTIVE),
90                             DeviceCommand.RETURN)),
91             entry(1025, new DeviceStatus("diagnostic-mode", EnumSet.noneOf(DeviceStateAttribute.class), null)),
92             entry(1026, new DeviceStatus("end-of-life", EnumSet.noneOf(DeviceStateAttribute.class), null)),
93             entry(1281, new DeviceStatus("software-update", EnumSet.noneOf(DeviceStateAttribute.class), null)),
94             entry(1537,
95                     new DeviceStatus("energy-save-mode", EnumSet.of(DeviceStateAttribute.READY_TO_MOW),
96                             DeviceCommand.RETURN)),
97             entry(64513, new DeviceStatus("docked",
98                     EnumSet.of(DeviceStateAttribute.DOCKED, DeviceStateAttribute.READY_TO_MOW), DeviceCommand.RETURN)));
99
100     private String textKey;
101
102     private EnumSet<DeviceStateAttribute> attributes;
103
104     private @Nullable DeviceCommand associatedCommand;
105
106     private DeviceStatus(String textKey, EnumSet<DeviceStateAttribute> attributes,
107             @Nullable DeviceCommand associatedCommand) {
108         this.textKey = textKey;
109         this.attributes = attributes;
110         this.associatedCommand = associatedCommand;
111     }
112
113     /**
114      * Returns a {@link DeviceStatus} instance describing the status code.
115      * 
116      * @param code the status code
117      * @return the {@link DeviceStatus} providing additional context for the code
118      */
119     public static DeviceStatus fromCode(int code) {
120         DeviceStatus status = STATUS_MAP.get(code);
121         if (status != null) {
122             return status;
123         }
124
125         DeviceCommand command = null;
126         EnumSet<DeviceStateAttribute> attributes = EnumSet.noneOf(DeviceStateAttribute.class);
127         switch (code & 0xff00) {
128             case 0x100:
129                 command = DeviceCommand.RETURN;
130                 break;
131             case 0x200:
132                 command = DeviceCommand.MOW;
133                 attributes.add(DeviceStateAttribute.ACTIVE);
134                 break;
135             case 0x300:
136                 command = DeviceCommand.RETURN;
137                 attributes.add(DeviceStateAttribute.ACTIVE);
138                 break;
139         }
140
141         return new DeviceStatus(String.valueOf(code), attributes, command);
142     }
143
144     /**
145      * Returns a localized description for this {@link DeviceStatus}.
146      * 
147      * @param translationProvider
148      * @return localized status description
149      */
150     public String getMessage(BoschIndegoTranslationProvider translationProvider) {
151         String textualState = translationProvider.getText(STATE_PREFIX + textKey);
152         if (textualState == null) {
153             textualState = String.format(translationProvider.getText(STATE_PREFIX + STATE_UNKNOWN, textKey), textKey);
154         }
155         return textualState;
156     }
157
158     public boolean isReadyToMow() {
159         return attributes.contains(DeviceStateAttribute.READY_TO_MOW);
160     }
161
162     public boolean isActive() {
163         return attributes.contains(DeviceStateAttribute.ACTIVE);
164     }
165
166     public boolean isCharging() {
167         return attributes.contains(DeviceStateAttribute.CHARGING);
168     }
169
170     public boolean isDocked() {
171         return attributes.contains(DeviceStateAttribute.DOCKED);
172     }
173
174     public boolean isCompleted() {
175         return attributes.contains(DeviceStateAttribute.COMPLETED);
176     }
177
178     public @Nullable DeviceCommand getAssociatedCommand() {
179         return associatedCommand;
180     }
181 }