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