]> git.basschouten.com Git - openhab-addons.git/blob
7a7ec1204c483d6675f5c87bf9b9c4f2847787e3
[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.shelly.internal.discovery;
14
15 import static org.openhab.binding.shelly.internal.ShellyBindingConstants.BINDING_ID;
16 import static org.openhab.binding.shelly.internal.api1.Shelly1ApiJsonDTO.*;
17 import static org.openhab.binding.shelly.internal.util.ShellyUtils.*;
18
19 import java.util.LinkedHashMap;
20 import java.util.Map;
21
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.openhab.core.thing.ThingTypeUID;
24 import org.openhab.core.thing.ThingUID;
25
26 /**
27  * The {@link ShellyThingCreator} maps the device id into the thing type id
28  *
29  * @author Markus Michels - Initial contribution
30  */
31 @NonNullByDefault
32 public class ShellyThingCreator {
33     // Device Types
34     public static final String SHELLYDT_1 = "SHSW-1";
35     public static final String SHELLYDT_1PM = "SHSW-PM";
36     public static final String SHELLYDT_1L = "SHSW-L";
37     public static final String SHELLYDT_SHPLG = "SHPLG-1";
38     public static final String SHELLYDT_SHPLG_S = "SHPLG-S";
39     public static final String SHELLYDT_SHPLG_U1 = "SHPLG-U1";
40     public static final String SHELLYDT_SHELLY2 = "SHSW-21";
41     public static final String SHELLYDT_SHELLY25 = "SHSW-25";
42     public static final String SHELLYDT_SHPRO = "SHSW-44";
43     public static final String SHELLYDT_EM = "SHEM";
44     public static final String SHELLYDT_3EM = "SHEM-3";
45     public static final String SHELLYDT_HT = "SHHT-1";
46     public static final String SHELLYDT_DW = "SHDW-1";
47     public static final String SHELLYDT_DW2 = "SHDW-2";
48     public static final String SHELLYDT_SENSE = "SHSEN-1";
49     public static final String SHELLYDT_MOTION = "SHMOS-01";
50     public static final String SHELLYDT_MOTION2 = "SHMOS-02";
51     public static final String SHELLYDT_GAS = "SHGS-1";
52     public static final String SHELLYDT_DIMMER = "SHDM-1";
53     public static final String SHELLYDT_DIMMER2 = "SHDM-2";
54     public static final String SHELLYDT_IX3 = "SHIX3-1";
55     public static final String SHELLYDT_BULB = "SHBLB-1";
56     public static final String SHELLYDT_DUO = "SHBDUO-1";
57     public static final String SHELLYDT_DUORGBW = "SHCB-1";
58     public static final String SHELLYDT_VINTAGE = "SHVIN-1";
59     public static final String SHELLYDT_RGBW2 = "SHRGBW2";
60     public static final String SHELLYDT_BUTTON1 = "SHBTN-1";
61     public static final String SHELLYDT_BUTTON2 = "SHBTN-2";
62     public static final String SHELLYDT_UNI = "SHUNI-1";
63     public static final String SHELLYDT_TRV = "SHTRV-01";
64
65     // Shelly Plus Series
66     public static final String SHELLYDT_PLUS1 = "SNSW-001X16EU";
67     public static final String SHELLYDT_PLUS1PM = "SNSW-001P16EU";
68     public static final String SHELLYDT_PLUS1UL = "SNSW-001X15UL";
69     public static final String SHELLYDT_PLUS1PMUL = "SNSW-001P15UL";
70     public static final String SHELLYDT_PLUS2PM_RELAY = "SNSW-002P16EU-relay";
71     public static final String SHELLYDT_PLUS2PM_ROLLER = "SNSW-002P16EU-roller";
72     public static final String SHELLYDT_PLUS2PM_RELAY_2 = "SNSW-102P16EU-relay";
73     public static final String SHELLYDT_PLUS2PM_ROLLER_2 = "SNSW-102P16EU-roller";
74     public static final String SHELLYDT_PLUSPLUGUS = "SNPL-00116US";
75     public static final String SHELLYDT_PLUSI4 = "SNSN-0024X";
76     public static final String SHELLYDT_PLUSI4DC = "SNSN-0D24X";
77     public static final String SHELLYDT_PLUSHT = "SNSN-0013A";
78
79     // Shelly Pro Series
80     public static final String SHELLYDT_PRO1 = "SPSW-001XE16EU";
81     public static final String SHELLYDT_PRO1_2 = "SPSW-101XE16EU";
82     public static final String SHELLYDT_PRO1_3 = "SPSW-201XE16EU";
83     public static final String SHELLYDT_PRO1PM = "SPSW-001PE16EU";
84     public static final String SHELLYDT_PRO1PM_2 = "SPSW-101PE16EU";
85     public static final String SHELLYDT_PRO1PM_3 = "SPSW-201PE16EU";
86     public static final String SHELLYDT_PRO2_RELAY = "SPSW-002XE16EU-relay";
87     public static final String SHELLYDT_PRO2_RELAY_2 = "SPSW-102XE16EU-relay";
88     public static final String SHELLYDT_PRO2_RELAY_3 = "SPSW-202XE16EU-relay";
89     public static final String SHELLYDT_PRO2PM_RELAY = "SPSW-002PE16EU-relay";
90     public static final String SHELLYDT_PRO2PM_ROLLER = "SPSW-002PE16EU-roller";
91     public static final String SHELLYDT_PRO2PM_RELAY_2 = "SPSW-102PE16EU-relay";
92     public static final String SHELLYDT_PRO2PM_ROLLER_2 = "SPSW-102PE16EU-roller";
93     public static final String SHELLYDT_PRO2PM_RELAY_3 = "SPSW-202PE16EU-relay";
94     public static final String SHELLYDT_PRO2PM_ROLLER_3 = "SPSW-202PE16EU-roller";
95     public static final String SHELLYDT_PRO3 = "SPSW-003XE16EU";
96     public static final String SHELLYDT_PRO4PM = "SPSW-004PE16EU";
97     public static final String SHELLYDT_PRO4PM_2 = "SPSW-104PE16EU";
98
99     // Thing names
100     public static final String THING_TYPE_SHELLY1_STR = "shelly1";
101     public static final String THING_TYPE_SHELLY1L_STR = "shelly1l";
102     public static final String THING_TYPE_SHELLY1PM_STR = "shelly1pm";
103     public static final String THING_TYPE_SHELLYEM_STR = "shellyem";
104     public static final String THING_TYPE_SHELLY3EM_STR = "shellyem3"; // bad: misspelled product name, it's 3EM
105     public static final String THING_TYPE_SHELLY2_PREFIX = "shellyswitch";
106     public static final String THING_TYPE_SHELLY2_RELAY_STR = "shelly2-relay";
107     public static final String THING_TYPE_SHELLY25_PREFIX = "shellyswitch25";
108     public static final String THING_TYPE_SHELLY25_RELAY_STR = "shelly25-relay";
109     public static final String THING_TYPE_SHELLY25_ROLLER_STR = "shelly25-roller";
110     public static final String THING_TYPE_SHELLY4PRO_STR = "shelly4pro";
111     public static final String THING_TYPE_SHELLYPLUG_STR = "shellyplug";
112     public static final String THING_TYPE_SHELLYPLUGS_STR = "shellyplugs";
113     public static final String THING_TYPE_SHELLYPLUGU1_STR = "shellyplugu1"; // Shely Plug US
114     public static final String THING_TYPE_SHELLYDIMMER_STR = "shellydimmer";
115     public static final String THING_TYPE_SHELLYDIMMER2_STR = "shellydimmer2";
116     public static final String THING_TYPE_SHELLYIX3_STR = "shellyix3";
117     public static final String THING_TYPE_SHELLYBULB_STR = "shellybulb";
118     public static final String THING_TYPE_SHELLYDUO_STR = "shellybulbduo";
119     public static final String THING_TYPE_SHELLYVINTAGE_STR = "shellyvintage";
120     public static final String THING_TYPE_SHELLYRGBW2_PREFIX = "shellyrgbw2";
121     public static final String THING_TYPE_SHELLYRGBW2_COLOR_STR = THING_TYPE_SHELLYRGBW2_PREFIX + "-color";
122     public static final String THING_TYPE_SHELLYRGBW2_WHITE_STR = THING_TYPE_SHELLYRGBW2_PREFIX + "-white";
123     public static final String THING_TYPE_SHELLYDUORGBW_STR = "shellycolorbulb";
124     public static final String THING_TYPE_SHELLYHT_STR = "shellyht";
125     public static final String THING_TYPE_SHELLYSMOKE_STR = "shellysmoke";
126     public static final String THING_TYPE_SHELLYGAS_STR = "shellygas";
127     public static final String THING_TYPE_SHELLYFLOOD_STR = "shellyflood";
128     public static final String THING_TYPE_SHELLYDOORWIN_STR = "shellydw";
129     public static final String THING_TYPE_SHELLYDOORWIN2_STR = "shellydw2";
130     public static final String THING_TYPE_SHELLYEYE_STR = "shellyseye";
131     public static final String THING_TYPE_SHELLYSENSE_STR = "shellysense";
132     public static final String THING_TYPE_SHELLYTRV_STR = "shellytrv";
133     public static final String THING_TYPE_SHELLYMOTION_STR = "shellymotion";
134     public static final String THING_TYPE_SHELLYMOTION2_STR = "shellymotion2";
135     public static final String THING_TYPE_SHELLYBUTTON1_STR = "shellybutton1";
136     public static final String THING_TYPE_SHELLYBUTTON2_STR = "shellybutton2";
137     public static final String THING_TYPE_SHELLYUNI_STR = "shellyuni";
138
139     // Shelly Plus Seriens
140     public static final String THING_TYPE_SHELLYPLUS1_STR = "shellyplus1";
141     public static final String THING_TYPE_SHELLYPLUS1PM_STR = "shellyplus1pm";
142     public static final String THING_TYPE_SHELLYPLUS2PM_RELAY_STR = "shellyplus2pm-relay";
143     public static final String THING_TYPE_SHELLYPLUS2PM_ROLLER_STR = "shellyplus2pm-roller";
144     public static final String THING_TYPE_SHELLYPLUSI4_STR = "shellyplusi4";
145     public static final String THING_TYPE_SHELLYPLUSI4DC_STR = "shellyplusi4dc";
146     public static final String THING_TYPE_SHELLYPLUSHT_STR = "shellyplusht";
147     public static final String THING_TYPE_SHELLYPLUSPLUGUS_STR = "shellyplusplugus";
148
149     // Shelly Pro Series
150     public static final String THING_TYPE_SHELLYPRO1_STR = "shellypro1";
151     public static final String THING_TYPE_SHELLYPRO1PM_STR = "shellypro1pm";
152     public static final String THING_TYPE_SHELLYPRO2_RELAY_STR = "shellypro2-relay";
153     public static final String THING_TYPE_SHELLYPRO2PM_RELAY_STR = "shellypro2pm-relay";
154     public static final String THING_TYPE_SHELLYPRO2PM_ROLLER_STR = "shellypro2pm-roller";
155     public static final String THING_TYPE_SHELLYPRO3_STR = "shellypro3";
156     public static final String THING_TYPE_SHELLYPRO4PM_STR = "shellypro4pm";
157
158     public static final String THING_TYPE_SHELLYPROTECTED_STR = "shellydevice";
159     public static final String THING_TYPE_SHELLYUNKNOWN_STR = "shellyunknown";
160
161     // List of all Thing Type UIDs
162     public static final ThingTypeUID THING_TYPE_SHELLY1 = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLY1_STR);
163     public static final ThingTypeUID THING_TYPE_SHELLY1L = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLY1L_STR);
164     public static final ThingTypeUID THING_TYPE_SHELLY1PM = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLY1PM_STR);
165     public static final ThingTypeUID THING_TYPE_SHELLYEM = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYEM_STR);
166     public static final ThingTypeUID THING_TYPE_SHELLY3EM = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLY3EM_STR);
167     public static final ThingTypeUID THING_TYPE_SHELLY2_RELAY = new ThingTypeUID(BINDING_ID,
168             THING_TYPE_SHELLY2_RELAY_STR);
169     public static final ThingTypeUID THING_TYPE_SHELLY25_RELAY = new ThingTypeUID(BINDING_ID,
170             THING_TYPE_SHELLY25_RELAY_STR);
171     public static final ThingTypeUID THING_TYPE_SHELLY25_ROLLER = new ThingTypeUID(BINDING_ID,
172             THING_TYPE_SHELLY25_ROLLER_STR);
173     public static final ThingTypeUID THING_TYPE_SHELLY4PRO = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLY4PRO_STR);
174     public static final ThingTypeUID THING_TYPE_SHELLYPLUG = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYPLUG_STR);
175     public static final ThingTypeUID THING_TYPE_SHELLYPLUGS = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYPLUGS_STR);
176     public static final ThingTypeUID THING_TYPE_SHELLYPLUGU1 = new ThingTypeUID(BINDING_ID,
177             THING_TYPE_SHELLYPLUGU1_STR);
178     public static final ThingTypeUID THING_TYPE_SHELLYUNI = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYUNI_STR);
179     public static final ThingTypeUID THING_TYPE_SHELLYDIMMER = new ThingTypeUID(BINDING_ID,
180             THING_TYPE_SHELLYDIMMER_STR);
181     public static final ThingTypeUID THING_TYPE_SHELLYDIMMER2 = new ThingTypeUID(BINDING_ID,
182             THING_TYPE_SHELLYDIMMER2_STR);
183     public static final ThingTypeUID THING_TYPE_SHELLYIX3 = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYIX3_STR);
184     public static final ThingTypeUID THING_TYPE_SHELLYBULB = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYBULB_STR);
185     public static final ThingTypeUID THING_TYPE_SHELLYDUO = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYDUO_STR);
186     public static final ThingTypeUID THING_TYPE_SHELLYVINTAGE = new ThingTypeUID(BINDING_ID,
187             THING_TYPE_SHELLYVINTAGE_STR);
188     public static final ThingTypeUID THING_TYPE_SHELLYDUORGBW = new ThingTypeUID(BINDING_ID,
189             THING_TYPE_SHELLYDUORGBW_STR);
190     public static final ThingTypeUID THING_TYPE_SHELLYHT = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYHT_STR);
191     public static final ThingTypeUID THING_TYPE_SHELLYSENSE = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYSENSE_STR);
192     public static final ThingTypeUID THING_TYPE_SHELLYSMOKE = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYSMOKE_STR);
193     public static final ThingTypeUID THING_TYPE_SHELLYGAS = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYGAS_STR);
194     public static final ThingTypeUID THING_TYPE_SHELLYFLOOD = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYFLOOD_STR);
195     public static final ThingTypeUID THING_TYPE_SHELLYDOORWIN = new ThingTypeUID(BINDING_ID,
196             THING_TYPE_SHELLYDOORWIN_STR);
197     public static final ThingTypeUID THING_TYPE_SHELLYDOORWIN2 = new ThingTypeUID(BINDING_ID,
198             THING_TYPE_SHELLYDOORWIN2_STR);
199     public static final ThingTypeUID THING_TYPE_SHELLYTRV = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYTRV_STR);
200     public static final ThingTypeUID THING_TYPE_SHELLYBUTTON1 = new ThingTypeUID(BINDING_ID,
201             THING_TYPE_SHELLYBUTTON1_STR);
202     public static final ThingTypeUID THING_TYPE_SHELLYBUTTON2 = new ThingTypeUID(BINDING_ID,
203             THING_TYPE_SHELLYBUTTON2_STR);
204     public static final ThingTypeUID THING_TYPE_SHELLYEYE = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYEYE_STR);
205     public static final ThingTypeUID THING_TYPE_SHELLMOTION = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYMOTION_STR);
206     public static final ThingTypeUID THING_TYPE_SHELLYRGBW2_COLOR = new ThingTypeUID(BINDING_ID,
207             THING_TYPE_SHELLYRGBW2_COLOR_STR);
208     public static final ThingTypeUID THING_TYPE_SHELLYRGBW2_WHITE = new ThingTypeUID(BINDING_ID,
209             THING_TYPE_SHELLYRGBW2_WHITE_STR);
210     public static final ThingTypeUID THING_TYPE_SHELLYPROTECTED = new ThingTypeUID(BINDING_ID,
211             THING_TYPE_SHELLYPROTECTED_STR);
212     public static final ThingTypeUID THING_TYPE_SHELLYUNKNOWN = new ThingTypeUID(BINDING_ID,
213             THING_TYPE_SHELLYUNKNOWN_STR);
214
215     // Shelly Plus/Pro
216     public static final ThingTypeUID THING_TYPE_SHELLYPLUS1 = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYPLUS1_STR);
217     public static final ThingTypeUID THING_TYPE_SHELLYPLUS1PM = new ThingTypeUID(BINDING_ID,
218             THING_TYPE_SHELLYPLUS1PM_STR);
219     public static final ThingTypeUID THING_TYPE_SHELLYPLUS2PM_RELAY = new ThingTypeUID(BINDING_ID,
220             THING_TYPE_SHELLYPLUS2PM_RELAY_STR);
221     public static final ThingTypeUID THING_TYPE_SHELLYPLUS2PM_ROLLER = new ThingTypeUID(BINDING_ID,
222             THING_TYPE_SHELLYPLUS2PM_ROLLER_STR);
223     public static final ThingTypeUID THING_TYPE_SHELLYPLUSI4 = new ThingTypeUID(BINDING_ID,
224             THING_TYPE_SHELLYPLUSI4_STR);
225     public static final ThingTypeUID THING_TYPE_SHELLYPLUSI4DC = new ThingTypeUID(BINDING_ID,
226             THING_TYPE_SHELLYPLUSI4DC_STR);
227     public static final ThingTypeUID THING_TYPE_SHELLYPLUSHT = new ThingTypeUID(BINDING_ID,
228             THING_TYPE_SHELLYPLUSHT_STR);
229     public static final ThingTypeUID THING_TYPE_SHELLYPLUSPLUGUS = new ThingTypeUID(BINDING_ID,
230             THING_TYPE_SHELLYPLUSPLUGUS_STR);
231     public static final ThingTypeUID THING_TYPE_SHELLYPRO1 = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYPRO1_STR);
232     public static final ThingTypeUID THING_TYPE_SHELLYPRO1PM = new ThingTypeUID(BINDING_ID,
233             THING_TYPE_SHELLYPRO1PM_STR);
234     public static final ThingTypeUID THING_TYPE_SHELLYPRO2_RELAY = new ThingTypeUID(BINDING_ID,
235             THING_TYPE_SHELLYPRO2_RELAY_STR);
236     public static final ThingTypeUID THING_TYPE_SHELLYPRO2PM_RELAY = new ThingTypeUID(BINDING_ID,
237             THING_TYPE_SHELLYPRO2PM_RELAY_STR);
238     public static final ThingTypeUID THING_TYPE_SHELLYPRO2PM_ROLLER = new ThingTypeUID(BINDING_ID,
239             THING_TYPE_SHELLYPRO2PM_ROLLER_STR);
240     public static final ThingTypeUID THING_TYPE_SHELLYPRO3 = new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYPRO3_STR);
241     public static final ThingTypeUID THING_TYPE_SHELLYPRO4PM = new ThingTypeUID(BINDING_ID,
242             THING_TYPE_SHELLYPRO4PM_STR);
243
244     private static final Map<String, String> THING_TYPE_MAPPING = new LinkedHashMap<>();
245     static {
246         // mapping by device type id
247         THING_TYPE_MAPPING.put(SHELLYDT_1PM, THING_TYPE_SHELLY1PM_STR);
248         THING_TYPE_MAPPING.put(SHELLYDT_1L, THING_TYPE_SHELLY1L_STR);
249         THING_TYPE_MAPPING.put(SHELLYDT_1, THING_TYPE_SHELLY1_STR);
250         THING_TYPE_MAPPING.put(SHELLYDT_3EM, THING_TYPE_SHELLY3EM_STR);
251         THING_TYPE_MAPPING.put(SHELLYDT_EM, THING_TYPE_SHELLYEM_STR);
252         THING_TYPE_MAPPING.put(SHELLYDT_SHPLG_S, THING_TYPE_SHELLYPLUGS_STR);
253         THING_TYPE_MAPPING.put(SHELLYDT_SHPLG_U1, THING_TYPE_SHELLYPLUGU1_STR);
254         THING_TYPE_MAPPING.put(SHELLYDT_GAS, THING_TYPE_SHELLYGAS_STR);
255         THING_TYPE_MAPPING.put(SHELLYDT_DW, THING_TYPE_SHELLYDOORWIN_STR);
256         THING_TYPE_MAPPING.put(SHELLYDT_DW2, THING_TYPE_SHELLYDOORWIN2_STR);
257         THING_TYPE_MAPPING.put(SHELLYDT_DUO, THING_TYPE_SHELLYDUO_STR);
258         THING_TYPE_MAPPING.put(SHELLYDT_DUORGBW, THING_TYPE_SHELLYDUORGBW_STR);
259         THING_TYPE_MAPPING.put(SHELLYDT_BULB, THING_TYPE_SHELLYBULB_STR);
260         THING_TYPE_MAPPING.put(SHELLYDT_VINTAGE, THING_TYPE_SHELLYVINTAGE_STR);
261         THING_TYPE_MAPPING.put(SHELLYDT_DIMMER, THING_TYPE_SHELLYDIMMER_STR);
262         THING_TYPE_MAPPING.put(SHELLYDT_DIMMER2, THING_TYPE_SHELLYDIMMER2_STR);
263         THING_TYPE_MAPPING.put(SHELLYDT_IX3, THING_TYPE_SHELLYIX3_STR);
264         THING_TYPE_MAPPING.put(SHELLYDT_BUTTON1, THING_TYPE_SHELLYBUTTON1_STR);
265         THING_TYPE_MAPPING.put(SHELLYDT_BUTTON2, THING_TYPE_SHELLYBUTTON2_STR);
266         THING_TYPE_MAPPING.put(SHELLYDT_UNI, THING_TYPE_SHELLYUNI_STR);
267         THING_TYPE_MAPPING.put(SHELLYDT_HT, THING_TYPE_SHELLYHT_STR);
268         THING_TYPE_MAPPING.put(SHELLYDT_TRV, THING_TYPE_SHELLYTRV_STR);
269         THING_TYPE_MAPPING.put(SHELLYDT_MOTION, THING_TYPE_SHELLYMOTION_STR);
270
271         // Plus Series
272         THING_TYPE_MAPPING.put(SHELLYDT_PLUS1, THING_TYPE_SHELLYPLUS1_STR);
273         THING_TYPE_MAPPING.put(SHELLYDT_PLUS1PM, THING_TYPE_SHELLYPLUS1PM_STR);
274         THING_TYPE_MAPPING.put(SHELLYDT_PLUS1UL, THING_TYPE_SHELLYPLUS1_STR);
275         THING_TYPE_MAPPING.put(SHELLYDT_PLUS1PMUL, THING_TYPE_SHELLYPLUS1PM_STR);
276         THING_TYPE_MAPPING.put(SHELLYDT_PLUS2PM_RELAY, THING_TYPE_SHELLYPLUS2PM_RELAY_STR);
277         THING_TYPE_MAPPING.put(SHELLYDT_PLUS2PM_ROLLER, THING_TYPE_SHELLYPLUS2PM_ROLLER_STR);
278         THING_TYPE_MAPPING.put(SHELLYDT_PLUS2PM_RELAY_2, THING_TYPE_SHELLYPLUS2PM_RELAY_STR);
279         THING_TYPE_MAPPING.put(SHELLYDT_PLUS2PM_ROLLER_2, THING_TYPE_SHELLYPLUS2PM_ROLLER_STR);
280         THING_TYPE_MAPPING.put(SHELLYDT_PLUSPLUGUS, THING_TYPE_SHELLYPLUSPLUGUS_STR);
281         THING_TYPE_MAPPING.put(SHELLYDT_PLUSI4DC, THING_TYPE_SHELLYPLUSI4DC_STR);
282         THING_TYPE_MAPPING.put(SHELLYDT_PLUSI4, THING_TYPE_SHELLYPLUSI4_STR);
283         THING_TYPE_MAPPING.put(SHELLYDT_PLUSHT, THING_TYPE_SHELLYPLUSHT_STR);
284
285         // Pro Series
286         THING_TYPE_MAPPING.put(SHELLYDT_PRO1, THING_TYPE_SHELLYPRO1_STR);
287         THING_TYPE_MAPPING.put(SHELLYDT_PRO1_2, THING_TYPE_SHELLYPRO1_STR);
288         THING_TYPE_MAPPING.put(SHELLYDT_PRO1_3, THING_TYPE_SHELLYPRO1_STR);
289         THING_TYPE_MAPPING.put(SHELLYDT_PRO1PM, THING_TYPE_SHELLYPRO1PM_STR);
290         THING_TYPE_MAPPING.put(SHELLYDT_PRO1PM_2, THING_TYPE_SHELLYPRO1PM_STR);
291         THING_TYPE_MAPPING.put(SHELLYDT_PRO1PM_3, THING_TYPE_SHELLYPRO1PM_STR);
292         THING_TYPE_MAPPING.put(SHELLYDT_PRO2_RELAY, THING_TYPE_SHELLYPRO2_RELAY_STR);
293         THING_TYPE_MAPPING.put(SHELLYDT_PRO2_RELAY_2, THING_TYPE_SHELLYPRO2_RELAY_STR);
294         THING_TYPE_MAPPING.put(SHELLYDT_PRO2_RELAY_3, THING_TYPE_SHELLYPRO2_RELAY_STR);
295         THING_TYPE_MAPPING.put(SHELLYDT_PRO2PM_RELAY, THING_TYPE_SHELLYPRO2PM_RELAY_STR);
296         THING_TYPE_MAPPING.put(SHELLYDT_PRO2PM_RELAY_2, THING_TYPE_SHELLYPRO2PM_RELAY_STR);
297         THING_TYPE_MAPPING.put(SHELLYDT_PRO2PM_RELAY_3, THING_TYPE_SHELLYPRO2PM_RELAY_STR);
298         THING_TYPE_MAPPING.put(SHELLYDT_PRO2PM_ROLLER, THING_TYPE_SHELLYPRO2PM_ROLLER_STR);
299         THING_TYPE_MAPPING.put(SHELLYDT_PRO2PM_ROLLER_2, THING_TYPE_SHELLYPRO2PM_ROLLER_STR);
300         THING_TYPE_MAPPING.put(SHELLYDT_PRO2PM_ROLLER_3, THING_TYPE_SHELLYPRO2PM_ROLLER_STR);
301         THING_TYPE_MAPPING.put(SHELLYDT_PRO3, THING_TYPE_SHELLYPRO3_STR);
302         THING_TYPE_MAPPING.put(SHELLYDT_PRO4PM, THING_TYPE_SHELLYPRO4PM_STR);
303         THING_TYPE_MAPPING.put(SHELLYDT_PRO4PM_2, THING_TYPE_SHELLYPRO4PM_STR);
304
305         // mapping by thing type
306         THING_TYPE_MAPPING.put(THING_TYPE_SHELLY1_STR, THING_TYPE_SHELLY1_STR);
307         THING_TYPE_MAPPING.put(THING_TYPE_SHELLY1PM_STR, THING_TYPE_SHELLY1PM_STR);
308         THING_TYPE_MAPPING.put(THING_TYPE_SHELLY1L_STR, THING_TYPE_SHELLY1L_STR);
309         THING_TYPE_MAPPING.put(THING_TYPE_SHELLY4PRO_STR, THING_TYPE_SHELLY4PRO_STR);
310         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYDIMMER2_STR, THING_TYPE_SHELLYDIMMER2_STR);
311         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYDIMMER_STR, THING_TYPE_SHELLYDIMMER_STR);
312         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYIX3_STR, THING_TYPE_SHELLYIX3_STR);
313         THING_TYPE_MAPPING.put(THING_TYPE_SHELLY3EM_STR, THING_TYPE_SHELLY3EM_STR);
314         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYEM_STR, THING_TYPE_SHELLYEM_STR);
315         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYDUORGBW_STR, THING_TYPE_SHELLYDUORGBW_STR);
316         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYDUO_STR, THING_TYPE_SHELLYDUO_STR);
317         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYVINTAGE_STR, THING_TYPE_SHELLYVINTAGE_STR);
318         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYBULB_STR, THING_TYPE_SHELLYBULB_STR);
319         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYDUO_STR, THING_TYPE_SHELLYDUO_STR);
320         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYHT_STR, THING_TYPE_SHELLYHT_STR);
321         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYSMOKE_STR, THING_TYPE_SHELLYSMOKE_STR);
322         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYGAS_STR, THING_TYPE_SHELLYGAS_STR);
323         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYFLOOD_STR, THING_TYPE_SHELLYFLOOD_STR);
324         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYTRV_STR, THING_TYPE_SHELLYTRV_STR);
325         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYDOORWIN_STR, THING_TYPE_SHELLYDOORWIN_STR);
326         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYDOORWIN2_STR, THING_TYPE_SHELLYDOORWIN2_STR);
327         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYSENSE_STR, THING_TYPE_SHELLYSENSE_STR);
328         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYEYE_STR, THING_TYPE_SHELLYEYE_STR);
329         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYBUTTON1_STR, THING_TYPE_SHELLYBUTTON1_STR);
330         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYBUTTON2_STR, THING_TYPE_SHELLYBUTTON2_STR);
331         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYUNI_STR, THING_TYPE_SHELLYUNI_STR);
332         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYMOTION2_STR, THING_TYPE_SHELLYMOTION_STR);
333
334         THING_TYPE_MAPPING.put(THING_TYPE_SHELLYPROTECTED_STR, THING_TYPE_SHELLYPROTECTED_STR);
335     }
336
337     public static ThingUID getThingUID(String serviceName, String deviceType, String mode, boolean unknown) {
338         String devid = substringAfterLast(serviceName, "-");
339         if (devid.isEmpty()) {
340             throw new IllegalArgumentException("serviceName has improper format: " + serviceName);
341         }
342         return new ThingUID(!unknown ? getThingTypeUID(serviceName, deviceType, mode)
343                 : getThingTypeUID(THING_TYPE_SHELLYPROTECTED_STR + "-" + devid, deviceType, mode), devid);
344     }
345
346     public static ThingTypeUID getThingTypeUID(String serviceName, String deviceType, String mode) {
347         return new ThingTypeUID(BINDING_ID, getThingType(serviceName, deviceType, mode));
348     }
349
350     public static ThingTypeUID getUnknownTTUID() {
351         return new ThingTypeUID(BINDING_ID, THING_TYPE_SHELLYPROTECTED_STR);
352     }
353
354     public static String getThingType(String hostname, String deviceType, String mode) {
355         if (THING_TYPE_SHELLYPROTECTED_STR.equals(hostname)) {
356             return THING_TYPE_SHELLYPROTECTED_STR;
357         }
358         String name = hostname.toLowerCase();
359         String type = substringBefore(name, "-").toLowerCase();
360         String devid = substringAfterLast(name, "-");
361         if (devid.isEmpty() || type.isEmpty()) {
362             throw new IllegalArgumentException("Invalid device name format: " + hostname);
363         }
364
365         // First check for special handling
366         if (name.startsWith(THING_TYPE_SHELLY25_PREFIX)) { // Shelly v2.5
367             return mode.equals(SHELLY_MODE_RELAY) ? THING_TYPE_SHELLY25_RELAY_STR : THING_TYPE_SHELLY25_ROLLER_STR;
368         }
369         if (name.startsWith(THING_TYPE_SHELLY2_PREFIX)) { // Shelly v2
370             return THING_TYPE_SHELLY2_RELAY_STR;
371         }
372         if (name.startsWith(THING_TYPE_SHELLYPLUG_STR)) {
373             // shellyplug-s needs to be mapped to shellyplugs to follow the schema
374             // for the thing types: <thing type>-<mode>
375             if (name.startsWith(THING_TYPE_SHELLYPLUGS_STR) || name.contains("-s")) {
376                 return THING_TYPE_SHELLYPLUGS_STR;
377             }
378             if (name.startsWith(THING_TYPE_SHELLYPLUGU1_STR)) {
379                 return THING_TYPE_SHELLYPLUGU1_STR;
380             }
381             return THING_TYPE_SHELLYPLUG_STR;
382         }
383         if (name.startsWith(THING_TYPE_SHELLYRGBW2_PREFIX)) {
384             return mode.equals(SHELLY_MODE_COLOR) ? THING_TYPE_SHELLYRGBW2_COLOR_STR : THING_TYPE_SHELLYRGBW2_WHITE_STR;
385         }
386         if (name.startsWith(THING_TYPE_SHELLYMOTION_STR)) {
387             // depending on firmware release the Motion advertises under shellymotion-xxx or shellymotionsensor-xxxx
388             return THING_TYPE_SHELLYMOTION_STR;
389         }
390
391         // Check general mapping
392         if (!deviceType.isEmpty()) {
393             String res = THING_TYPE_MAPPING.get(deviceType); // by device type
394             if (res != null) {
395                 return res;
396             }
397
398             String dt = mode.equals(SHELLY_MODE_RELAY) || mode.equals(SHELLY_MODE_ROLLER) ? deviceType + "-" + mode
399                     : deviceType;
400             res = THING_TYPE_MAPPING.get(dt); // <DT>-relay / <DT>-roller
401             if (res != null) {
402                 return res;
403             }
404         }
405
406         String res = THING_TYPE_MAPPING.get(type);
407         if (res != null) {
408             return res;
409         }
410         return THING_TYPE_SHELLYUNKNOWN_STR;
411     }
412 }