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