]> git.basschouten.com Git - openhab-addons.git/blob
562bf8582dbad71d9ecec886bb923052006b740d
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.enocean.internal.eep;
14
15 import static org.openhab.binding.enocean.internal.EnOceanBindingConstants.*;
16
17 import java.util.Collections;
18 import java.util.Hashtable;
19 import java.util.Map;
20
21 import org.eclipse.jdt.annotation.NonNull;
22 import org.openhab.binding.enocean.internal.EnOceanChannelDescription;
23 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_01;
24 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_02;
25 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_03;
26 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_04;
27 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_05;
28 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_06;
29 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_07;
30 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_08;
31 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_09;
32 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_0A;
33 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_0B;
34 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_10;
35 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_11;
36 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_12;
37 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_13;
38 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_14;
39 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_15;
40 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_16;
41 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_17;
42 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_18;
43 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_19;
44 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_1A;
45 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_1B;
46 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_20;
47 import org.openhab.binding.enocean.internal.eep.A5_02.A5_02_30;
48 import org.openhab.binding.enocean.internal.eep.A5_04.A5_04_01;
49 import org.openhab.binding.enocean.internal.eep.A5_04.A5_04_02;
50 import org.openhab.binding.enocean.internal.eep.A5_04.A5_04_02_Eltako;
51 import org.openhab.binding.enocean.internal.eep.A5_04.A5_04_03;
52 import org.openhab.binding.enocean.internal.eep.A5_06.A5_06_01;
53 import org.openhab.binding.enocean.internal.eep.A5_06.A5_06_01_ELTAKO;
54 import org.openhab.binding.enocean.internal.eep.A5_07.A5_07_01;
55 import org.openhab.binding.enocean.internal.eep.A5_07.A5_07_02;
56 import org.openhab.binding.enocean.internal.eep.A5_07.A5_07_03;
57 import org.openhab.binding.enocean.internal.eep.A5_08.A5_08_01;
58 import org.openhab.binding.enocean.internal.eep.A5_08.A5_08_01_FXBH;
59 import org.openhab.binding.enocean.internal.eep.A5_08.A5_08_02;
60 import org.openhab.binding.enocean.internal.eep.A5_08.A5_08_03;
61 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_01;
62 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_02;
63 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_03;
64 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_04;
65 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_05;
66 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_06;
67 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_07;
68 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_08;
69 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_09;
70 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_0A;
71 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_0B;
72 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_0C;
73 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_0D;
74 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_10;
75 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_11;
76 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_12;
77 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_13;
78 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_14;
79 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_15;
80 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_16;
81 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_17;
82 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_18;
83 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_19;
84 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1A;
85 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1B;
86 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1C;
87 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1D;
88 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1E;
89 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1F;
90 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_20;
91 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_21;
92 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_22;
93 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_23;
94 import org.openhab.binding.enocean.internal.eep.A5_11.A5_11_03;
95 import org.openhab.binding.enocean.internal.eep.A5_11.A5_11_04;
96 import org.openhab.binding.enocean.internal.eep.A5_12.A5_12_00;
97 import org.openhab.binding.enocean.internal.eep.A5_12.A5_12_01;
98 import org.openhab.binding.enocean.internal.eep.A5_12.A5_12_02;
99 import org.openhab.binding.enocean.internal.eep.A5_12.A5_12_03;
100 import org.openhab.binding.enocean.internal.eep.A5_13.A5_13_01;
101 import org.openhab.binding.enocean.internal.eep.A5_14.A5_14_01;
102 import org.openhab.binding.enocean.internal.eep.A5_14.A5_14_01_ELTAKO;
103 import org.openhab.binding.enocean.internal.eep.A5_14.A5_14_09;
104 import org.openhab.binding.enocean.internal.eep.A5_14.A5_14_0A;
105 import org.openhab.binding.enocean.internal.eep.A5_20.A5_20_04;
106 import org.openhab.binding.enocean.internal.eep.A5_30.A5_30_03_ELTAKO;
107 import org.openhab.binding.enocean.internal.eep.A5_38.A5_38_08_Blinds;
108 import org.openhab.binding.enocean.internal.eep.A5_38.A5_38_08_Dimming;
109 import org.openhab.binding.enocean.internal.eep.A5_38.A5_38_08_Switching;
110 import org.openhab.binding.enocean.internal.eep.A5_3F.A5_3F_7F_EltakoFSB;
111 import org.openhab.binding.enocean.internal.eep.Base.PTM200Message;
112 import org.openhab.binding.enocean.internal.eep.Base.UTEResponse;
113 import org.openhab.binding.enocean.internal.eep.Base._4BSTeachInVariation3Response;
114 import org.openhab.binding.enocean.internal.eep.D0.D0_06;
115 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_00;
116 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_01;
117 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_02;
118 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_03;
119 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_04;
120 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_05;
121 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_06;
122 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_07;
123 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_08;
124 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_09;
125 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_09_Permundo;
126 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0A;
127 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0B;
128 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0C;
129 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0D;
130 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0E;
131 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0F;
132 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0F_NodON;
133 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_11;
134 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_12;
135 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_12_NodON;
136 import org.openhab.binding.enocean.internal.eep.D2_03.D2_03_0A;
137 import org.openhab.binding.enocean.internal.eep.D2_05.D2_05_00;
138 import org.openhab.binding.enocean.internal.eep.D2_14.D2_14_30;
139 import org.openhab.binding.enocean.internal.eep.D5_00.D5_00_01;
140 import org.openhab.binding.enocean.internal.eep.F6_01.F6_01_01;
141 import org.openhab.binding.enocean.internal.eep.F6_02.F6_02_01;
142 import org.openhab.binding.enocean.internal.eep.F6_02.F6_02_02;
143 import org.openhab.binding.enocean.internal.eep.F6_05.F6_05_02;
144 import org.openhab.binding.enocean.internal.eep.F6_10.F6_10_00;
145 import org.openhab.binding.enocean.internal.eep.F6_10.F6_10_00_EltakoFPE;
146 import org.openhab.binding.enocean.internal.eep.F6_10.F6_10_01;
147 import org.openhab.binding.enocean.internal.eep.Generic.Generic4BS;
148 import org.openhab.binding.enocean.internal.eep.Generic.GenericRPS;
149 import org.openhab.binding.enocean.internal.eep.Generic.GenericVLD;
150 import org.openhab.binding.enocean.internal.messages.ERP1Message.RORG;
151 import org.openhab.core.config.core.Configuration;
152 import org.openhab.core.thing.Channel;
153 import org.openhab.core.thing.ThingTypeUID;
154 import org.openhab.core.thing.type.ChannelTypeUID;
155
156 /**
157  *
158  * @author Daniel Weber - Initial contribution
159  */
160 public enum EEPType {
161     Undef(RORG.Unknown, 0, 0, false, null, null, 0),
162
163     UTEResponse(RORG.UTE, 0, 0, false, UTEResponse.class, null),
164     _4BSTeachInVariation3Response(RORG._4BS, 0, 0, false, _4BSTeachInVariation3Response.class, null),
165
166     GenericRPS(RORG.RPS, 0xFF, 0xFF, false, GenericRPS.class, THING_TYPE_GENERICTHING, CHANNEL_GENERIC_SWITCH,
167             CHANNEL_GENERIC_ROLLERSHUTTER, CHANNEL_GENERIC_DIMMER, CHANNEL_GENERIC_NUMBER, CHANNEL_GENERIC_STRING,
168             CHANNEL_GENERIC_COLOR, CHANNEL_GENERIC_TEACHINCMD),
169     Generic4BS(RORG._4BS, 0xFF, 0xFF, false, Generic4BS.class, THING_TYPE_GENERICTHING, CHANNEL_GENERIC_SWITCH,
170             CHANNEL_GENERIC_ROLLERSHUTTER, CHANNEL_GENERIC_DIMMER, CHANNEL_GENERIC_NUMBER, CHANNEL_GENERIC_STRING,
171             CHANNEL_GENERIC_COLOR, CHANNEL_GENERIC_TEACHINCMD, CHANNEL_VIBRATION),
172     GenericVLD(RORG.VLD, 0xFF, 0xFF, false, GenericVLD.class, THING_TYPE_GENERICTHING, CHANNEL_GENERIC_SWITCH,
173             CHANNEL_GENERIC_ROLLERSHUTTER, CHANNEL_GENERIC_DIMMER, CHANNEL_GENERIC_NUMBER, CHANNEL_GENERIC_STRING,
174             CHANNEL_GENERIC_COLOR, CHANNEL_GENERIC_TEACHINCMD),
175
176     PTM200(RORG.RPS, 0x00, 0x00, false, PTM200Message.class, null, CHANNEL_GENERAL_SWITCHING, CHANNEL_ROLLERSHUTTER,
177             CHANNEL_CONTACT),
178
179     PushButton(RORG.RPS, 0x01, 0x01, false, F6_01_01.class, THING_TYPE_PUSHBUTTON, CHANNEL_PUSHBUTTON),
180     PushButtonTriState(RORG.VLD, 0x03, 0x0A, false, D2_03_0A.class, THING_TYPE_PUSHBUTTON, CHANNEL_PUSHBUTTON,
181             CHANNEL_DOUBLEPRESS, CHANNEL_LONGPRESS, CHANNEL_BATTERY_LEVEL),
182
183     RockerSwitch2RockerStyle1(RORG.RPS, 0x02, 0x01, false, F6_02_01.class, THING_TYPE_ROCKERSWITCH,
184             CHANNEL_ROCKERSWITCH_CHANNELA, CHANNEL_ROCKERSWITCH_CHANNELB, CHANNEL_VIRTUALSWITCHA,
185             CHANNEL_VIRTUALROLLERSHUTTERA, CHANNEL_VIRTUALROCKERSWITCHB, CHANNEL_ROCKERSWITCHLISTENERSWITCH,
186             CHANNEL_ROCKERSWITCHLISTENERROLLERSHUTTER),
187     RockerSwitch2RockerStyle2(RORG.RPS, 0x02, 0x02, false, F6_02_02.class, THING_TYPE_ROCKERSWITCH,
188             CHANNEL_ROCKERSWITCH_CHANNELA, CHANNEL_ROCKERSWITCH_CHANNELB, CHANNEL_VIRTUALSWITCHA,
189             CHANNEL_VIRTUALROLLERSHUTTERA, CHANNEL_VIRTUALROCKERSWITCHB, CHANNEL_ROCKERSWITCHLISTENERSWITCH,
190             CHANNEL_ROCKERSWITCHLISTENERROLLERSHUTTER),
191
192     MechanicalHandle00(RORG.RPS, 0x10, 0x00, false, F6_10_00.class, THING_TYPE_MECHANICALHANDLE,
193             CHANNEL_WINDOWHANDLESTATE, CHANNEL_CONTACT),
194     MechanicalHandle01(RORG.RPS, 0x10, 0x01, false, F6_10_01.class, THING_TYPE_MECHANICALHANDLE,
195             CHANNEL_WINDOWHANDLESTATE, CHANNEL_CONTACT),
196     MechanicalHandle02(RORG._4BS, 0x14, 0x09, false, A5_14_09.class, THING_TYPE_MECHANICALHANDLE,
197             CHANNEL_WINDOWHANDLESTATE, CHANNEL_CONTACT, CHANNEL_BATTERY_VOLTAGE),
198     MechanicalHandle03(RORG._4BS, 0x14, 0x0A, false, A5_14_0A.class, THING_TYPE_MECHANICALHANDLE,
199             CHANNEL_WINDOWHANDLESTATE, CHANNEL_CONTACT, CHANNEL_VIBRATION, CHANNEL_BATTERY_VOLTAGE),
200
201     ContactAndSwitch01(RORG._1BS, 0x00, 0x01, false, D5_00_01.class, THING_TYPE_CONTACT, CHANNEL_CONTACT),
202     ContactAndSwitch02(RORG._4BS, 0x14, 0x01, false, A5_14_01.class, THING_TYPE_CONTACT, CHANNEL_BATTERY_VOLTAGE,
203             CHANNEL_CONTACT),
204     ContactAndSwitch03(RORG.RPS, 0x10, 0x00, false, "EltakoFPE", ELTAKOID, F6_10_00_EltakoFPE.class, THING_TYPE_CONTACT,
205             CHANNEL_CONTACT),
206
207     SmokeDetection(RORG.RPS, 0x05, 0x02, false, F6_05_02.class, null, CHANNEL_SMOKEDETECTION, CHANNEL_BATTERYLOW),
208
209     BatteryStatus(RORG._4BS, 0x14, 0x01, false, "ELTAKO", ELTAKOID, A5_14_01_ELTAKO.class, THING_TYPE_CONTACT,
210             CHANNEL_BATTERY_VOLTAGE, CHANNEL_ENERGY_STORAGE),
211     SigBatteryStatus(RORG.SIG, 0x06, 0x00, false, D0_06.class, null, CHANNEL_BATTERY_LEVEL),
212
213     TemperatureSensor_A5_02_01(RORG._4BS, 0x02, 0x01, false, A5_02_01.class, THING_TYPE_TEMPERATURESENSOR,
214             CHANNEL_TEMPERATURE),
215     TemperatureSensor_A5_02_02(RORG._4BS, 0x02, 0x02, false, A5_02_02.class, THING_TYPE_TEMPERATURESENSOR,
216             CHANNEL_TEMPERATURE),
217     TemperatureSensor_A5_02_03(RORG._4BS, 0x02, 0x03, false, A5_02_03.class, THING_TYPE_TEMPERATURESENSOR,
218             CHANNEL_TEMPERATURE),
219     TemperatureSensor_A5_02_04(RORG._4BS, 0x02, 0x04, false, A5_02_04.class, THING_TYPE_TEMPERATURESENSOR,
220             CHANNEL_TEMPERATURE),
221     TemperatureSensor_A5_02_05(RORG._4BS, 0x02, 0x05, false, A5_02_05.class, THING_TYPE_TEMPERATURESENSOR,
222             CHANNEL_TEMPERATURE),
223     TemperatureSensor_A5_02_06(RORG._4BS, 0x02, 0x06, false, A5_02_06.class, THING_TYPE_TEMPERATURESENSOR,
224             CHANNEL_TEMPERATURE),
225     TemperatureSensor_A5_02_07(RORG._4BS, 0x02, 0x07, false, A5_02_07.class, THING_TYPE_TEMPERATURESENSOR,
226             CHANNEL_TEMPERATURE),
227     TemperatureSensor_A5_02_08(RORG._4BS, 0x02, 0x08, false, A5_02_08.class, THING_TYPE_TEMPERATURESENSOR,
228             CHANNEL_TEMPERATURE),
229     TemperatureSensor_A5_02_09(RORG._4BS, 0x02, 0x09, false, A5_02_09.class, THING_TYPE_TEMPERATURESENSOR,
230             CHANNEL_TEMPERATURE),
231     TemperatureSensor_A5_02_0A(RORG._4BS, 0x02, 0x0A, false, A5_02_0A.class, THING_TYPE_TEMPERATURESENSOR,
232             CHANNEL_TEMPERATURE),
233     TemperatureSensor_A5_02_0B(RORG._4BS, 0x02, 0x0B, false, A5_02_0B.class, THING_TYPE_TEMPERATURESENSOR,
234             CHANNEL_TEMPERATURE),
235     TemperatureSensor_A5_02_10(RORG._4BS, 0x02, 0x10, false, A5_02_10.class, THING_TYPE_TEMPERATURESENSOR,
236             CHANNEL_TEMPERATURE),
237     TemperatureSensor_A5_02_11(RORG._4BS, 0x02, 0x11, false, A5_02_11.class, THING_TYPE_TEMPERATURESENSOR,
238             CHANNEL_TEMPERATURE),
239     TemperatureSensor_A5_02_12(RORG._4BS, 0x02, 0x12, false, A5_02_12.class, THING_TYPE_TEMPERATURESENSOR,
240             CHANNEL_TEMPERATURE),
241     TemperatureSensor_A5_02_13(RORG._4BS, 0x02, 0x13, false, A5_02_13.class, THING_TYPE_TEMPERATURESENSOR,
242             CHANNEL_TEMPERATURE),
243     TemperatureSensor_A5_02_14(RORG._4BS, 0x02, 0x14, false, A5_02_14.class, THING_TYPE_TEMPERATURESENSOR,
244             CHANNEL_TEMPERATURE),
245     TemperatureSensor_A5_02_15(RORG._4BS, 0x02, 0x15, false, A5_02_15.class, THING_TYPE_TEMPERATURESENSOR,
246             CHANNEL_TEMPERATURE),
247     TemperatureSensor_A5_02_16(RORG._4BS, 0x02, 0x16, false, A5_02_16.class, THING_TYPE_TEMPERATURESENSOR,
248             CHANNEL_TEMPERATURE),
249     TemperatureSensor_A5_02_17(RORG._4BS, 0x02, 0x17, false, A5_02_17.class, THING_TYPE_TEMPERATURESENSOR,
250             CHANNEL_TEMPERATURE),
251     TemperatureSensor_A5_02_18(RORG._4BS, 0x02, 0x18, false, A5_02_18.class, THING_TYPE_TEMPERATURESENSOR,
252             CHANNEL_TEMPERATURE),
253     TemperatureSensor_A5_02_19(RORG._4BS, 0x02, 0x19, false, A5_02_19.class, THING_TYPE_TEMPERATURESENSOR,
254             CHANNEL_TEMPERATURE),
255     TemperatureSensor_A5_02_1A(RORG._4BS, 0x02, 0x1A, false, A5_02_1A.class, THING_TYPE_TEMPERATURESENSOR,
256             CHANNEL_TEMPERATURE),
257     TemperatureSensor_A5_02_1B(RORG._4BS, 0x02, 0x1B, false, A5_02_1B.class, THING_TYPE_TEMPERATURESENSOR,
258             CHANNEL_TEMPERATURE),
259     TemperatureSensor_A5_02_20(RORG._4BS, 0x02, 0x20, false, A5_02_20.class, THING_TYPE_TEMPERATURESENSOR,
260             CHANNEL_TEMPERATURE),
261     TemperatureSensor_A5_02_30(RORG._4BS, 0x02, 0x30, false, A5_02_30.class, THING_TYPE_TEMPERATURESENSOR,
262             CHANNEL_TEMPERATURE),
263
264     TemperatureHumiditySensor_A5_04_01(RORG._4BS, 0x04, 0x01, false, A5_04_01.class,
265             THING_TYPE_TEMPERATUREHUMIDITYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY),
266     TemperatureHumiditySensor_A5_04_02(RORG._4BS, 0x04, 0x02, false, A5_04_02.class,
267             THING_TYPE_TEMPERATUREHUMIDITYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY),
268     TemperatureHumiditySensor_A5_04_02_Eltako(RORG._4BS, 0x04, 0x02, false, "ELTAKO", ELTAKOID, A5_04_02_Eltako.class,
269             THING_TYPE_TEMPERATUREHUMIDITYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY, CHANNEL_BATTERY_VOLTAGE),
270     TemperatureHumiditySensor_A5_04_03(RORG._4BS, 0x04, 0x03, false, A5_04_03.class,
271             THING_TYPE_TEMPERATUREHUMIDITYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY),
272
273     OCCUPANCYSENSOR_A5_07_01(RORG._4BS, 0x07, 0x01, false, A5_07_01.class, THING_TYPE_OCCUPANCYSENSOR,
274             CHANNEL_MOTIONDETECTION, CHANNEL_BATTERY_VOLTAGE),
275     OCCUPANCYSENSOR_A5_07_02(RORG._4BS, 0x07, 0x02, false, A5_07_02.class, THING_TYPE_OCCUPANCYSENSOR,
276             CHANNEL_MOTIONDETECTION, CHANNEL_BATTERY_VOLTAGE),
277     OCCUPANCYSENSOR_A5_07_03(RORG._4BS, 0x07, 0x03, false, A5_07_03.class, THING_TYPE_OCCUPANCYSENSOR,
278             CHANNEL_ILLUMINATION, CHANNEL_MOTIONDETECTION, CHANNEL_BATTERY_VOLTAGE),
279
280     LightTemperatureOccupancySensor_A5_08_01(RORG._4BS, 0x08, 0x01, false, A5_08_01.class,
281             THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_MOTIONDETECTION,
282             CHANNEL_ILLUMINATION, CHANNEL_OCCUPANCY),
283     LightTemperatureOccupancySensor_A5_08_02(RORG._4BS, 0x08, 0x02, false, A5_08_02.class,
284             THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_MOTIONDETECTION,
285             CHANNEL_ILLUMINATION, CHANNEL_OCCUPANCY),
286     LightTemperatureOccupancySensor_A5_08_03(RORG._4BS, 0x08, 0x03, false, A5_08_03.class,
287             THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_MOTIONDETECTION,
288             CHANNEL_ILLUMINATION, CHANNEL_OCCUPANCY),
289     FXBH_A5_08_01(RORG._4BS, 0x08, 0x01, false, "FXBH", ELTAKOID, A5_08_01_FXBH.class,
290             THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, CHANNEL_MOTIONDETECTION, CHANNEL_ILLUMINATION),
291
292     LightSensor01(RORG._4BS, 0x06, 0x01, false, A5_06_01.class, THING_TYPE_LIGHTSENSOR, CHANNEL_ILLUMINATION),
293     LightSensor02(RORG._4BS, 0x06, 0x01, false, "ELTAKO", ELTAKOID, A5_06_01_ELTAKO.class, THING_TYPE_LIGHTSENSOR,
294             CHANNEL_ILLUMINATION),
295
296     RoomPanel_A5_10_01(RORG._4BS, 0x10, 0x01, false, A5_10_01.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
297             CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
298     RoomPanel_A5_10_02(RORG._4BS, 0x10, 0x02, false, A5_10_02.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
299             CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE),
300     RoomPanel_A5_10_03(RORG._4BS, 0x10, 0x03, false, A5_10_03.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
301             CHANNEL_SETPOINT),
302     RoomPanel_A5_10_04(RORG._4BS, 0x10, 0x04, false, A5_10_04.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
303             CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE),
304     RoomPanel_A5_10_05(RORG._4BS, 0x10, 0x05, false, A5_10_05.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
305             CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
306     RoomPanel_A5_10_06(RORG._4BS, 0x10, 0x06, false, A5_10_06.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
307             CHANNEL_SETPOINT),
308     RoomPanel_A5_10_07(RORG._4BS, 0x10, 0x07, false, A5_10_07.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
309             CHANNEL_FANSPEEDSTAGE),
310     RoomPanel_A5_10_08(RORG._4BS, 0x10, 0x08, false, A5_10_08.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
311             CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
312     RoomPanel_A5_10_09(RORG._4BS, 0x10, 0x09, false, A5_10_09.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
313             CHANNEL_FANSPEEDSTAGE),
314     RoomPanel_A5_10_0A(RORG._4BS, 0x10, 0x0A, false, A5_10_0A.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
315             CHANNEL_SETPOINT),
316     RoomPanel_A5_10_0B(RORG._4BS, 0x10, 0x0B, false, A5_10_0B.class, THING_TYPE_ROOMOPERATINGPANEL,
317             CHANNEL_TEMPERATURE),
318     RoomPanel_A5_10_0C(RORG._4BS, 0x10, 0x0C, false, A5_10_0C.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
319             CHANNEL_OCCUPANCY),
320     RoomPanel_A5_10_0D(RORG._4BS, 0x10, 0x0D, false, A5_10_0D.class, THING_TYPE_ROOMOPERATINGPANEL,
321             CHANNEL_TEMPERATURE),
322     RoomPanel_A5_10_10(RORG._4BS, 0x10, 0x10, false, A5_10_10.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
323             CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
324     RoomPanel_A5_10_11(RORG._4BS, 0x10, 0x11, false, A5_10_11.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
325             CHANNEL_SETPOINT),
326     RoomPanel_A5_10_12(RORG._4BS, 0x10, 0x12, false, A5_10_12.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
327             CHANNEL_SETPOINT),
328     RoomPanel_A5_10_13(RORG._4BS, 0x10, 0x13, false, A5_10_13.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
329             CHANNEL_OCCUPANCY),
330     RoomPanel_A5_10_14(RORG._4BS, 0x10, 0x14, false, A5_10_14.class, THING_TYPE_ROOMOPERATINGPANEL,
331             CHANNEL_TEMPERATURE),
332     RoomPanel_A5_10_15(RORG._4BS, 0x10, 0x15, false, A5_10_15.class, THING_TYPE_ROOMOPERATINGPANEL,
333             CHANNEL_TEMPERATURE),
334     RoomPanel_A5_10_16(RORG._4BS, 0x10, 0x16, false, A5_10_16.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
335             CHANNEL_OCCUPANCY),
336     RoomPanel_A5_10_17(RORG._4BS, 0x10, 0x17, false, A5_10_17.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
337             CHANNEL_OCCUPANCY),
338     RoomPanel_A5_10_18(RORG._4BS, 0x10, 0x18, false, A5_10_18.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
339             CHANNEL_OCCUPANCY),
340     RoomPanel_A5_10_19(RORG._4BS, 0x10, 0x19, false, A5_10_19.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
341             CHANNEL_OCCUPANCY),
342     RoomPanel_A5_10_1A(RORG._4BS, 0x10, 0x1A, false, A5_10_1A.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
343             CHANNEL_OCCUPANCY),
344     RoomPanel_A5_10_1B(RORG._4BS, 0x10, 0x1B, false, A5_10_1B.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
345             CHANNEL_OCCUPANCY),
346     RoomPanel_A5_10_1C(RORG._4BS, 0x10, 0x1C, false, A5_10_1C.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
347             CHANNEL_OCCUPANCY),
348     RoomPanel_A5_10_1D(RORG._4BS, 0x10, 0x1D, false, A5_10_1D.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
349             CHANNEL_OCCUPANCY),
350     RoomPanel_A5_10_1E(RORG._4BS, 0x10, 0x1E, false, A5_10_1E.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
351             CHANNEL_OCCUPANCY),
352     RoomPanel_A5_10_1F(RORG._4BS, 0x10, 0x1F, false, A5_10_1F.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
353             CHANNEL_OCCUPANCY, CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE),
354     RoomPanel_A5_10_20(RORG._4BS, 0x10, 0x20, false, A5_10_20.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
355             CHANNEL_SETPOINT),
356     RoomPanel_A5_10_21(RORG._4BS, 0x10, 0x21, false, A5_10_21.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
357             CHANNEL_SETPOINT),
358     RoomPanel_A5_10_22(RORG._4BS, 0x10, 0x22, false, A5_10_22.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
359             CHANNEL_SETPOINT),
360     RoomPanel_A5_10_23(RORG._4BS, 0x10, 0x23, false, A5_10_23.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
361             CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
362
363     AutomatedMeterReading_00(RORG._4BS, 0x12, 0x00, false, A5_12_00.class, THING_TYPE_AUTOMATEDMETERSENSOR,
364             CHANNEL_COUNTER, CHANNEL_CURRENTNUMBER),
365     AutomatedMeterReading_01(RORG._4BS, 0x12, 0x01, false, A5_12_01.class, THING_TYPE_AUTOMATEDMETERSENSOR,
366             CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
367     AutomatedMeterReading_02(RORG._4BS, 0x12, 0x02, false, A5_12_02.class, THING_TYPE_AUTOMATEDMETERSENSOR,
368             CHANNEL_CUMULATIVEVALUE, CHANNEL_CURRENTFLOW),
369     AutomatedMeterReading_03(RORG._4BS, 0x12, 0x03, false, A5_12_03.class, THING_TYPE_AUTOMATEDMETERSENSOR,
370             CHANNEL_CUMULATIVEVALUE, CHANNEL_CURRENTFLOW),
371
372     EnvironmentalSensor_01(RORG._4BS, 0x13, 0x01, false, A5_13_01.class, THING_TYPE_ENVIRONMENTALSENSOR,
373             CHANNEL_ILLUMINATION, CHANNEL_TEMPERATURE, CHANNEL_WINDSPEED, CHANNEL_RAINSTATUS, CHANNEL_ILLUMINATIONWEST,
374             CHANNEL_ILLUMINATIONSOUTHNORTH, CHANNEL_ILLUMINATIONEAST),
375
376     Rollershutter_A5(RORG._4BS, 0x11, 0x03, false, A5_11_03.class, THING_TYPE_ROLLERSHUTTER, CHANNEL_ROLLERSHUTTER,
377             CHANNEL_ANGLE),
378     ExtendedLight_A5(RORG._4BS, 0x11, 0x04, false, A5_11_04.class, THING_TYPE_CENTRALCOMMAND, CHANNEL_GENERAL_SWITCHING,
379             CHANNEL_DIMMER, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER, CHANNEL_COUNTER),
380
381     SmokeDetection4BS(RORG._4BS, 0x30, 0x03, false, "ELTAKO", ELTAKOID, A5_30_03_ELTAKO.class,
382             THING_TYPE_MULTFUNCTIONSMOKEDETECTOR, CHANNEL_TEMPERATURE, CHANNEL_SMOKEDETECTION),
383
384     CentralCommandSwitching(RORG._4BS, 0x38, 0x08, false, A5_38_08_Switching.class, THING_TYPE_CENTRALCOMMAND, 0x01,
385             CHANNEL_GENERAL_SWITCHING, CHANNEL_TEACHINCMD),
386     CentralCommandDimming(RORG._4BS, 0x38, 0x08, false, A5_38_08_Dimming.class, THING_TYPE_CENTRALCOMMAND, 0x02,
387             CHANNEL_DIMMER, CHANNEL_TEACHINCMD),
388     CentralCommandBlinds(RORG._4BS, 0x38, 0x08, false, A5_38_08_Blinds.class, THING_TYPE_ROLLERSHUTTER, 0x07,
389             CHANNEL_ROLLERSHUTTER, CHANNEL_ANGLE, CHANNEL_TEACHINCMD),
390
391     // UniversalCommand(RORG._4BS, 0x3f, 0x7f, false, A5_3F_7F_Universal.class, THING_TYPE_UNIVERSALACTUATOR,
392     // CHANNEL_GENERIC_ROLLERSHUTTER, CHANNEL_GENERIC_LIGHT_SWITCHING, CHANNEL_GENERIC_DIMMER, CHANNEL_TEACHINCMD),
393     EltakoFSB(RORG._4BS, 0x3f, 0x7f, false, "EltakoFSB", 0, A5_3F_7F_EltakoFSB.class, THING_TYPE_ROLLERSHUTTER, 0,
394             new Hashtable<String, Configuration>() {
395                 private static final long serialVersionUID = 1L;
396                 {
397                     put(CHANNEL_ROLLERSHUTTER, new Configuration());
398                     put(CHANNEL_TEACHINCMD, new Configuration() {
399                         {
400                             put(PARAMETER_CHANNEL_TeachInMSG, "fff80d80");
401                         }
402                     });
403                 }
404             }),
405
406     Thermostat(RORG._4BS, 0x20, 0x04, false, A5_20_04.class, THING_TYPE_THERMOSTAT, CHANNEL_VALVE_POSITION,
407             CHANNEL_BUTTON_LOCK, CHANNEL_DISPLAY_ORIENTATION, CHANNEL_TEMPERATURE_SETPOINT, CHANNEL_TEMPERATURE,
408             CHANNEL_FEED_TEMPERATURE, CHANNEL_MEASUREMENT_CONTROL, CHANNEL_FAILURE_CODE, CHANNEL_WAKEUPCYCLE,
409             CHANNEL_SERVICECOMMAND, CHANNEL_STATUS_REQUEST_EVENT, CHANNEL_SEND_COMMAND),
410
411     SwitchWithEnergyMeasurment_00(RORG.VLD, 0x01, 0x00, true, D2_01_00.class, THING_TYPE_MEASUREMENTSWITCH,
412             CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE),
413     SwitchWithEnergyMeasurment_01(RORG.VLD, 0x01, 0x01, true, D2_01_01.class, THING_TYPE_MEASUREMENTSWITCH,
414             CHANNEL_GENERAL_SWITCHING),
415     SwitchWithEnergyMeasurment_02(RORG.VLD, 0x01, 0x02, true, D2_01_02.class, THING_TYPE_MEASUREMENTSWITCH,
416             CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER, CHANNEL_TOTALUSAGE),
417     SwitchWithEnergyMeasurment_03(RORG.VLD, 0x01, 0x03, true, D2_01_03.class, THING_TYPE_MEASUREMENTSWITCH,
418             CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER),
419     SwitchWithEnergyMeasurment_04(RORG.VLD, 0x01, 0x04, true, D2_01_04.class, THING_TYPE_MEASUREMENTSWITCH,
420             CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
421     SwitchWithEnergyMeasurment_05(RORG.VLD, 0x01, 0x05, true, D2_01_05.class, THING_TYPE_MEASUREMENTSWITCH,
422             CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
423     SwitchWithEnergyMeasurment_06(RORG.VLD, 0x01, 0x06, true, D2_01_06.class, THING_TYPE_MEASUREMENTSWITCH,
424             CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE),
425     SwitchWithEnergyMeasurment_07(RORG.VLD, 0x01, 0x07, true, D2_01_07.class, THING_TYPE_MEASUREMENTSWITCH,
426             CHANNEL_GENERAL_SWITCHING),
427     SwitchWithEnergyMeasurment_08(RORG.VLD, 0x01, 0x08, true, D2_01_08.class, THING_TYPE_MEASUREMENTSWITCH,
428             CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
429     SwitchWithEnergyMeasurment_09(RORG.VLD, 0x01, 0x09, true, D2_01_09.class, THING_TYPE_MEASUREMENTSWITCH,
430             CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
431     SwitchWithEnergyMeasurment_09_PERMUNDO(RORG.VLD, 0x01, 0x09, true, "PERMUNDO", PERMUNDOID, D2_01_09_Permundo.class,
432             THING_TYPE_MEASUREMENTSWITCH, CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER,
433             CHANNEL_ECOMODE, CHANNEL_REPEATERMODE),
434     SwitchWithEnergyMeasurment_0A(RORG.VLD, 0x01, 0x0A, true, D2_01_0A.class, THING_TYPE_MEASUREMENTSWITCH,
435             CHANNEL_GENERAL_SWITCHING),
436     SwitchWithEnergyMeasurment_0B(RORG.VLD, 0x01, 0x0B, true, D2_01_0B.class, THING_TYPE_MEASUREMENTSWITCH,
437             CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
438     SwitchWithEnergyMeasurment_0C(RORG.VLD, 0x01, 0x0C, true, D2_01_0C.class, THING_TYPE_MEASUREMENTSWITCH,
439             CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
440     SwitchWithEnergyMeasurment_0D(RORG.VLD, 0x01, 0x0D, true, D2_01_0D.class, THING_TYPE_MEASUREMENTSWITCH,
441             CHANNEL_GENERAL_SWITCHING),
442     SwitchWithEnergyMeasurment_0E(RORG.VLD, 0x01, 0x0E, true, D2_01_0E.class, THING_TYPE_MEASUREMENTSWITCH,
443             CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
444     SwitchWithEnergyMeasurment_0F_NODON(RORG.VLD, 0x01, 0x0F, true, "NODON", NODONID, D2_01_0F_NodON.class,
445             THING_TYPE_MEASUREMENTSWITCH, CHANNEL_GENERAL_SWITCHING, CHANNEL_REPEATERMODE),
446     SwitchWithEnergyMeasurment_0F(RORG.VLD, 0x01, 0x0F, true, D2_01_0F.class, THING_TYPE_MEASUREMENTSWITCH,
447             CHANNEL_GENERAL_SWITCHING),
448     SwitchWithEnergyMeasurment_11(RORG.VLD, 0x01, 0x11, true, D2_01_11.class, THING_TYPE_MEASUREMENTSWITCH,
449             CHANNEL_GENERAL_SWITCHINGA, CHANNEL_GENERAL_SWITCHINGB),
450     SwitchWithEnergyMeasurment_12_NODON(RORG.VLD, 0x01, 0x12, true, "NODON", NODONID, D2_01_12_NodON.class,
451             THING_TYPE_MEASUREMENTSWITCH, CHANNEL_GENERAL_SWITCHINGA, CHANNEL_GENERAL_SWITCHINGB, CHANNEL_REPEATERMODE),
452     SwitchWithEnergyMeasurment_12(RORG.VLD, 0x01, 0x12, true, D2_01_12.class, THING_TYPE_MEASUREMENTSWITCH,
453             CHANNEL_GENERAL_SWITCHINGA, CHANNEL_GENERAL_SWITCHINGB),
454
455     Rollershutter_D2(RORG.VLD, 0x05, 0x00, true, D2_05_00.class, THING_TYPE_ROLLERSHUTTER, CHANNEL_ROLLERSHUTTER),
456
457     MultiFunctionSensor_30(RORG.VLD, 0x14, 0x30, false, D2_14_30.class, THING_TYPE_MULTFUNCTIONSMOKEDETECTOR,
458             CHANNEL_SMOKEDETECTION, CHANNEL_SENSORFAULT, CHANNEL_TIMESINCELASTMAINTENANCE, CHANNEL_BATTERY_LEVEL,
459             CHANNEL_REMAININGPLT, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY, CHANNEL_HYGROCOMFORTINDEX,
460             CHANNEL_INDOORAIRANALYSIS);
461
462     private RORG rorg;
463     private int func;
464     private int type;
465     private int command;
466     private Class<? extends EEP> eepClass;
467
468     private String manufactorSuffix;
469     private int manufactorId;
470
471     private ThingTypeUID thingTypeUID;
472
473     private Hashtable<String, Configuration> channelIdsWithConfig = new Hashtable<>();
474     private Hashtable<String, EnOceanChannelDescription> supportedChannels = new Hashtable<>();
475
476     private boolean supportsRefresh;
477
478     EEPType(RORG rorg, int func, int type, boolean supportsRefresh, Class<? extends EEP> eepClass,
479             ThingTypeUID thingTypeUID, String... channelIds) {
480         this(rorg, func, type, supportsRefresh, eepClass, thingTypeUID, -1, channelIds);
481     }
482
483     EEPType(RORG rorg, int func, int type, boolean supportsRefresh, String manufactorSuffix, int manufId,
484             Class<? extends EEP> eepClass, ThingTypeUID thingTypeUID, String... channelIds) {
485         this(rorg, func, type, supportsRefresh, manufactorSuffix, manufId, eepClass, thingTypeUID, 0, channelIds);
486     }
487
488     EEPType(RORG rorg, int func, int type, boolean supportsRefresh, Class<? extends EEP> eepClass,
489             ThingTypeUID thingTypeUID, int command, String... channelIds) {
490         this(rorg, func, type, supportsRefresh, "", 0, eepClass, thingTypeUID, command, channelIds);
491     }
492
493     EEPType(RORG rorg, int func, int type, boolean supportsRefresh, String manufactorSuffix, int manufId,
494             Class<? extends EEP> eepClass, ThingTypeUID thingTypeUID, int command, String... channelIds) {
495         this.rorg = rorg;
496         this.func = func;
497         this.type = type;
498         this.eepClass = eepClass;
499         this.thingTypeUID = thingTypeUID;
500         this.command = command;
501         this.manufactorSuffix = manufactorSuffix;
502         this.manufactorId = manufId;
503         this.supportsRefresh = supportsRefresh;
504
505         for (String id : channelIds) {
506             this.channelIdsWithConfig.put(id, new Configuration());
507             this.supportedChannels.put(id, CHANNELID2CHANNELDESCRIPTION.get(id));
508         }
509
510         this.channelIdsWithConfig.put(CHANNEL_RSSI, new Configuration());
511         this.supportedChannels.put(CHANNEL_RSSI, CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_RSSI));
512
513         this.channelIdsWithConfig.put(CHANNEL_REPEATCOUNT, new Configuration());
514         this.supportedChannels.put(CHANNEL_REPEATCOUNT, CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_REPEATCOUNT));
515
516         this.channelIdsWithConfig.put(CHANNEL_LASTRECEIVED, new Configuration());
517         this.supportedChannels.put(CHANNEL_LASTRECEIVED, CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_LASTRECEIVED));
518     }
519
520     EEPType(RORG rorg, int func, int type, boolean supportsRefresh, String manufactorSuffix, int manufId,
521             Class<? extends EEP> eepClass, ThingTypeUID thingTypeUID, int command,
522             Hashtable<String, Configuration> channelConfigs) {
523         this.rorg = rorg;
524         this.func = func;
525         this.type = type;
526         this.eepClass = eepClass;
527         this.thingTypeUID = thingTypeUID;
528         this.command = command;
529         this.channelIdsWithConfig = channelConfigs;
530         this.manufactorSuffix = manufactorSuffix;
531         this.manufactorId = manufId;
532         this.supportsRefresh = supportsRefresh;
533
534         for (String id : channelConfigs.keySet()) {
535             this.supportedChannels.put(id, CHANNELID2CHANNELDESCRIPTION.get(id));
536         }
537
538         this.channelIdsWithConfig.put(CHANNEL_RSSI, new Configuration());
539         this.supportedChannels.put(CHANNEL_RSSI, CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_RSSI));
540
541         this.channelIdsWithConfig.put(CHANNEL_REPEATCOUNT, new Configuration());
542         this.supportedChannels.put(CHANNEL_REPEATCOUNT, CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_REPEATCOUNT));
543
544         this.channelIdsWithConfig.put(CHANNEL_LASTRECEIVED, new Configuration());
545         this.supportedChannels.put(CHANNEL_LASTRECEIVED, CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_LASTRECEIVED));
546     }
547
548     public Class<? extends EEP> getEEPClass() {
549         return eepClass;
550     }
551
552     public RORG getRORG() {
553         return rorg;
554     }
555
556     public int getFunc() {
557         return func;
558     }
559
560     public int getType() {
561         return type;
562     }
563
564     public boolean getSupportsRefresh() {
565         return supportsRefresh;
566     }
567
568     public Map<String, EnOceanChannelDescription> GetSupportedChannels() {
569         return Collections.unmodifiableMap(supportedChannels);
570     }
571
572     public boolean isChannelSupported(Channel channel) {
573         ChannelTypeUID channelTypeUID = channel.getChannelTypeUID();
574         String id = channelTypeUID == null ? "" : channelTypeUID.getId();
575
576         return isChannelSupported(channel.getUID().getId(), id);
577     }
578
579     public boolean isChannelSupported(String channelId, String channelTypeId) {
580         return supportedChannels.containsKey(channelId)
581                 || supportedChannels.values().stream().anyMatch(c -> c.channelTypeUID.getId().equals(channelTypeId));
582     }
583
584     public ThingTypeUID getThingTypeUID() {
585         return thingTypeUID;
586     }
587
588     @NonNull
589     public String getId() {
590         if (command == -1) {
591             return String.format("%02X_%02X_%02X", rorg.getValue(), func, type);
592         } else if (command == 0) {
593             return String.format("%02X_%02X_%02X_%s", rorg.getValue(), func, type, manufactorSuffix);
594         } else {
595             return String.format("%02X_%02X_%02X_%02X", rorg.getValue(), func, type, command);
596         }
597     }
598
599     @NonNull
600     public Configuration getChannelConfig(String channelId) {
601         Configuration c = null;
602
603         if (channelIdsWithConfig != null) {
604             c = channelIdsWithConfig.get(channelId);
605         }
606
607         if (c != null) {
608             return c;
609         }
610
611         return new Configuration();
612     }
613
614     public static EEPType getType(String receivingEEPId) {
615         for (EEPType eep : values()) {
616             if (eep.getId().equals(receivingEEPId)) {
617                 return eep;
618             }
619         }
620
621         throw new IllegalArgumentException(String.format("EEP with id %s could not be found", receivingEEPId));
622     }
623
624     public static EEPType getType(Class<? extends EEP> eepClass) {
625         for (EEPType eep : values()) {
626             if (eep.eepClass != null && eep.eepClass.equals(eepClass)) {
627                 return eep;
628             }
629         }
630
631         throw new IllegalArgumentException(String.format("EEP with class %s could not be found", eepClass.getName()));
632     }
633
634     public static EEPType getType(RORG rorg, int func, int type, int manufId) {
635         EEPType fallback = null;
636
637         for (EEPType eep : values()) {
638             if (eep.rorg == rorg && eep.func == func && eep.type == type && eep.manufactorId == manufId) {
639                 return eep;
640             } else if (fallback == null && eep.rorg == rorg && eep.func == func && eep.type == type) {
641                 fallback = eep;
642             }
643         }
644
645         return fallback;
646     }
647 }