2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.enocean.internal.eep;
15 import static org.openhab.binding.enocean.internal.EnOceanBindingConstants.*;
17 import java.util.Collections;
18 import java.util.Hashtable;
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_10.A5_10_01;
64 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_02;
65 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_03;
66 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_04;
67 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_05;
68 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_06;
69 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_07;
70 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_08;
71 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_09;
72 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_0A;
73 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_0B;
74 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_0C;
75 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_0D;
76 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_10;
77 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_11;
78 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_12;
79 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_13;
80 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_14;
81 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_15;
82 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_16;
83 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_17;
84 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_18;
85 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_19;
86 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1A;
87 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1B;
88 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1C;
89 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1D;
90 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1E;
91 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_1F;
92 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_20;
93 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_21;
94 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_22;
95 import org.openhab.binding.enocean.internal.eep.A5_10.A5_10_23;
96 import org.openhab.binding.enocean.internal.eep.A5_11.A5_11_03;
97 import org.openhab.binding.enocean.internal.eep.A5_11.A5_11_04;
98 import org.openhab.binding.enocean.internal.eep.A5_12.A5_12_00;
99 import org.openhab.binding.enocean.internal.eep.A5_12.A5_12_01;
100 import org.openhab.binding.enocean.internal.eep.A5_12.A5_12_02;
101 import org.openhab.binding.enocean.internal.eep.A5_12.A5_12_03;
102 import org.openhab.binding.enocean.internal.eep.A5_13.A5_13_01;
103 import org.openhab.binding.enocean.internal.eep.A5_14.A5_14_01;
104 import org.openhab.binding.enocean.internal.eep.A5_14.A5_14_01_ELTAKO;
105 import org.openhab.binding.enocean.internal.eep.A5_14.A5_14_09;
106 import org.openhab.binding.enocean.internal.eep.A5_14.A5_14_0A;
107 import org.openhab.binding.enocean.internal.eep.A5_20.A5_20_04;
108 import org.openhab.binding.enocean.internal.eep.A5_30.A5_30_03_ELTAKO;
109 import org.openhab.binding.enocean.internal.eep.A5_38.A5_38_08_Blinds;
110 import org.openhab.binding.enocean.internal.eep.A5_38.A5_38_08_Dimming;
111 import org.openhab.binding.enocean.internal.eep.A5_38.A5_38_08_Switching;
112 import org.openhab.binding.enocean.internal.eep.A5_3F.A5_3F_7F_EltakoFRM;
113 import org.openhab.binding.enocean.internal.eep.A5_3F.A5_3F_7F_EltakoFSB;
114 import org.openhab.binding.enocean.internal.eep.Base.PTM200Message;
115 import org.openhab.binding.enocean.internal.eep.Base.UTEResponse;
116 import org.openhab.binding.enocean.internal.eep.Base._4BSTeachInVariation3Response;
117 import org.openhab.binding.enocean.internal.eep.D0.D0_06;
118 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_00;
119 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_01;
120 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_02;
121 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_03;
122 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_04;
123 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_05;
124 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_06;
125 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_07;
126 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_08;
127 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_09;
128 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_09_Permundo;
129 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0A;
130 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0B;
131 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0C;
132 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0D;
133 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0E;
134 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0F;
135 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_0F_NodON;
136 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_11;
137 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_12;
138 import org.openhab.binding.enocean.internal.eep.D2_01.D2_01_12_NodON;
139 import org.openhab.binding.enocean.internal.eep.D2_03.D2_03_0A;
140 import org.openhab.binding.enocean.internal.eep.D2_05.D2_05_00;
141 import org.openhab.binding.enocean.internal.eep.D2_05.D2_05_00_NodON;
142 import org.openhab.binding.enocean.internal.eep.D2_06.D2_06_01;
143 import org.openhab.binding.enocean.internal.eep.D2_06.D2_06_50;
144 import org.openhab.binding.enocean.internal.eep.D2_14.D2_14_30;
145 import org.openhab.binding.enocean.internal.eep.D2_50.D2_50;
146 import org.openhab.binding.enocean.internal.eep.D5_00.D5_00_01;
147 import org.openhab.binding.enocean.internal.eep.F6_01.F6_01_01;
148 import org.openhab.binding.enocean.internal.eep.F6_02.F6_02_01;
149 import org.openhab.binding.enocean.internal.eep.F6_02.F6_02_02;
150 import org.openhab.binding.enocean.internal.eep.F6_05.F6_05_02;
151 import org.openhab.binding.enocean.internal.eep.F6_10.F6_10_00;
152 import org.openhab.binding.enocean.internal.eep.F6_10.F6_10_00_EltakoFPE;
153 import org.openhab.binding.enocean.internal.eep.F6_10.F6_10_01;
154 import org.openhab.binding.enocean.internal.eep.generic.Generic4BS;
155 import org.openhab.binding.enocean.internal.eep.generic.GenericRPS;
156 import org.openhab.binding.enocean.internal.eep.generic.GenericVLD;
157 import org.openhab.binding.enocean.internal.messages.ERP1Message.RORG;
158 import org.openhab.core.config.core.Configuration;
159 import org.openhab.core.thing.Channel;
160 import org.openhab.core.thing.ThingTypeUID;
161 import org.openhab.core.thing.type.ChannelTypeUID;
165 * @author Daniel Weber - Initial contribution
168 public enum EEPType {
169 Undef(RORG.Unknown, 0, 0, false, EEP.class, null, 0),
171 UTEResponse(RORG.UTE, 0, 0, false, UTEResponse.class, null),
172 _4BSTeachInVariation3Response(RORG._4BS, 0, 0, false, _4BSTeachInVariation3Response.class, null),
174 GenericRPS(RORG.RPS, 0xFF, 0xFF, false, GenericRPS.class, THING_TYPE_GENERICTHING),
175 Generic4BS(RORG._4BS, 0xFF, 0xFF, false, Generic4BS.class, THING_TYPE_GENERICTHING, CHANNEL_VIBRATION),
176 GenericVLD(RORG.VLD, 0xFF, 0xFF, false, GenericVLD.class, THING_TYPE_GENERICTHING),
178 PTM200(RORG.RPS, 0x00, 0x00, false, PTM200Message.class, null, CHANNEL_GENERAL_SWITCHING, CHANNEL_ROLLERSHUTTER,
181 PushButton(RORG.RPS, 0x01, 0x01, false, F6_01_01.class, THING_TYPE_PUSHBUTTON, CHANNEL_PUSHBUTTON),
182 PushButtonTriState(RORG.VLD, 0x03, 0x0A, false, D2_03_0A.class, THING_TYPE_PUSHBUTTON, CHANNEL_PUSHBUTTON,
183 CHANNEL_DOUBLEPRESS, CHANNEL_LONGPRESS, CHANNEL_BATTERY_LEVEL),
185 RockerSwitch2RockerStyle1(RORG.RPS, 0x02, 0x01, false, F6_02_01.class, THING_TYPE_ROCKERSWITCH,
186 CHANNEL_ROCKERSWITCH_CHANNELA, CHANNEL_ROCKERSWITCH_CHANNELB, CHANNEL_ROCKERSWITCH_ACTION,
187 CHANNEL_VIRTUALSWITCHA, CHANNEL_VIRTUALROLLERSHUTTERA, CHANNEL_VIRTUALROCKERSWITCHB,
188 CHANNEL_ROCKERSWITCHLISTENERSWITCH, CHANNEL_ROCKERSWITCHLISTENERROLLERSHUTTER),
190 RockerSwitch2RockerStyle2(RORG.RPS, 0x02, 0x02, false, F6_02_02.class, THING_TYPE_ROCKERSWITCH,
191 CHANNEL_ROCKERSWITCH_CHANNELA, CHANNEL_ROCKERSWITCH_CHANNELB, CHANNEL_ROCKERSWITCH_ACTION,
192 CHANNEL_VIRTUALSWITCHA, CHANNEL_VIRTUALROLLERSHUTTERA, CHANNEL_VIRTUALROCKERSWITCHB,
193 CHANNEL_ROCKERSWITCHLISTENERSWITCH, CHANNEL_ROCKERSWITCHLISTENERROLLERSHUTTER),
195 MechanicalHandle00(RORG.RPS, 0x10, 0x00, false, F6_10_00.class, THING_TYPE_MECHANICALHANDLE,
196 CHANNEL_WINDOWHANDLESTATE, CHANNEL_CONTACT),
197 MechanicalHandle01(RORG.RPS, 0x10, 0x01, false, F6_10_01.class, THING_TYPE_MECHANICALHANDLE,
198 CHANNEL_WINDOWHANDLESTATE, CHANNEL_CONTACT),
199 MechanicalHandle02(RORG._4BS, 0x14, 0x09, false, A5_14_09.class, THING_TYPE_MECHANICALHANDLE,
200 CHANNEL_WINDOWHANDLESTATE, CHANNEL_CONTACT, CHANNEL_BATTERY_VOLTAGE),
201 MechanicalHandle03(RORG._4BS, 0x14, 0x0A, false, A5_14_0A.class, THING_TYPE_MECHANICALHANDLE,
202 CHANNEL_WINDOWHANDLESTATE, CHANNEL_CONTACT, CHANNEL_VIBRATION, CHANNEL_BATTERY_VOLTAGE),
203 MechanicalHandle04(RORG.VLD, 0x06, 0x01, false, "Soda", 0x0043, D2_06_01.class, THING_TYPE_MECHANICALHANDLE,
204 CHANNEL_WINDOWHANDLESTATE, CHANNEL_WINDOWSASHSTATE, CHANNEL_MOTIONDETECTION, CHANNEL_INDOORAIRTEMPERATURE,
205 CHANNEL_HUMIDITY, CHANNEL_ILLUMINATION, CHANNEL_BATTERY_LEVEL, CHANNEL_WINDOWBREACHEVENT,
206 CHANNEL_PROTECTIONPLUSEVENT, CHANNEL_PUSHBUTTON, CHANNEL_PUSHBUTTON2, CHANNEL_VACATIONMODETOGGLEEVENT),
208 ContactAndSwitch01(RORG._1BS, 0x00, 0x01, false, D5_00_01.class, THING_TYPE_CONTACT, CHANNEL_CONTACT),
209 ContactAndSwitch02(RORG._4BS, 0x14, 0x01, false, A5_14_01.class, THING_TYPE_CONTACT, CHANNEL_BATTERY_VOLTAGE,
211 ContactAndSwitch03(RORG.RPS, 0x10, 0x00, false, "EltakoFPE", ELTAKOID, F6_10_00_EltakoFPE.class, THING_TYPE_CONTACT,
214 SmokeDetection(RORG.RPS, 0x05, 0x02, false, F6_05_02.class, null, CHANNEL_SMOKEDETECTION, CHANNEL_BATTERYLOW),
216 BatteryStatus(RORG._4BS, 0x14, 0x01, false, "ELTAKO", ELTAKOID, A5_14_01_ELTAKO.class, THING_TYPE_CONTACT,
217 CHANNEL_BATTERY_VOLTAGE, CHANNEL_ENERGY_STORAGE),
218 SigBatteryStatus(RORG.SIG, 0x06, 0x00, false, D0_06.class, null, CHANNEL_BATTERY_LEVEL),
220 TemperatureSensor_A5_02_01(RORG._4BS, 0x02, 0x01, false, A5_02_01.class, THING_TYPE_TEMPERATURESENSOR,
221 CHANNEL_TEMPERATURE),
222 TemperatureSensor_A5_02_02(RORG._4BS, 0x02, 0x02, false, A5_02_02.class, THING_TYPE_TEMPERATURESENSOR,
223 CHANNEL_TEMPERATURE),
224 TemperatureSensor_A5_02_03(RORG._4BS, 0x02, 0x03, false, A5_02_03.class, THING_TYPE_TEMPERATURESENSOR,
225 CHANNEL_TEMPERATURE),
226 TemperatureSensor_A5_02_04(RORG._4BS, 0x02, 0x04, false, A5_02_04.class, THING_TYPE_TEMPERATURESENSOR,
227 CHANNEL_TEMPERATURE),
228 TemperatureSensor_A5_02_05(RORG._4BS, 0x02, 0x05, false, A5_02_05.class, THING_TYPE_TEMPERATURESENSOR,
229 CHANNEL_TEMPERATURE),
230 TemperatureSensor_A5_02_06(RORG._4BS, 0x02, 0x06, false, A5_02_06.class, THING_TYPE_TEMPERATURESENSOR,
231 CHANNEL_TEMPERATURE),
232 TemperatureSensor_A5_02_07(RORG._4BS, 0x02, 0x07, false, A5_02_07.class, THING_TYPE_TEMPERATURESENSOR,
233 CHANNEL_TEMPERATURE),
234 TemperatureSensor_A5_02_08(RORG._4BS, 0x02, 0x08, false, A5_02_08.class, THING_TYPE_TEMPERATURESENSOR,
235 CHANNEL_TEMPERATURE),
236 TemperatureSensor_A5_02_09(RORG._4BS, 0x02, 0x09, false, A5_02_09.class, THING_TYPE_TEMPERATURESENSOR,
237 CHANNEL_TEMPERATURE),
238 TemperatureSensor_A5_02_0A(RORG._4BS, 0x02, 0x0A, false, A5_02_0A.class, THING_TYPE_TEMPERATURESENSOR,
239 CHANNEL_TEMPERATURE),
240 TemperatureSensor_A5_02_0B(RORG._4BS, 0x02, 0x0B, false, A5_02_0B.class, THING_TYPE_TEMPERATURESENSOR,
241 CHANNEL_TEMPERATURE),
242 TemperatureSensor_A5_02_10(RORG._4BS, 0x02, 0x10, false, A5_02_10.class, THING_TYPE_TEMPERATURESENSOR,
243 CHANNEL_TEMPERATURE),
244 TemperatureSensor_A5_02_11(RORG._4BS, 0x02, 0x11, false, A5_02_11.class, THING_TYPE_TEMPERATURESENSOR,
245 CHANNEL_TEMPERATURE),
246 TemperatureSensor_A5_02_12(RORG._4BS, 0x02, 0x12, false, A5_02_12.class, THING_TYPE_TEMPERATURESENSOR,
247 CHANNEL_TEMPERATURE),
248 TemperatureSensor_A5_02_13(RORG._4BS, 0x02, 0x13, false, A5_02_13.class, THING_TYPE_TEMPERATURESENSOR,
249 CHANNEL_TEMPERATURE),
250 TemperatureSensor_A5_02_14(RORG._4BS, 0x02, 0x14, false, A5_02_14.class, THING_TYPE_TEMPERATURESENSOR,
251 CHANNEL_TEMPERATURE),
252 TemperatureSensor_A5_02_15(RORG._4BS, 0x02, 0x15, false, A5_02_15.class, THING_TYPE_TEMPERATURESENSOR,
253 CHANNEL_TEMPERATURE),
254 TemperatureSensor_A5_02_16(RORG._4BS, 0x02, 0x16, false, A5_02_16.class, THING_TYPE_TEMPERATURESENSOR,
255 CHANNEL_TEMPERATURE),
256 TemperatureSensor_A5_02_17(RORG._4BS, 0x02, 0x17, false, A5_02_17.class, THING_TYPE_TEMPERATURESENSOR,
257 CHANNEL_TEMPERATURE),
258 TemperatureSensor_A5_02_18(RORG._4BS, 0x02, 0x18, false, A5_02_18.class, THING_TYPE_TEMPERATURESENSOR,
259 CHANNEL_TEMPERATURE),
260 TemperatureSensor_A5_02_19(RORG._4BS, 0x02, 0x19, false, A5_02_19.class, THING_TYPE_TEMPERATURESENSOR,
261 CHANNEL_TEMPERATURE),
262 TemperatureSensor_A5_02_1A(RORG._4BS, 0x02, 0x1A, false, A5_02_1A.class, THING_TYPE_TEMPERATURESENSOR,
263 CHANNEL_TEMPERATURE),
264 TemperatureSensor_A5_02_1B(RORG._4BS, 0x02, 0x1B, false, A5_02_1B.class, THING_TYPE_TEMPERATURESENSOR,
265 CHANNEL_TEMPERATURE),
266 TemperatureSensor_A5_02_20(RORG._4BS, 0x02, 0x20, false, A5_02_20.class, THING_TYPE_TEMPERATURESENSOR,
267 CHANNEL_TEMPERATURE),
268 TemperatureSensor_A5_02_30(RORG._4BS, 0x02, 0x30, false, A5_02_30.class, THING_TYPE_TEMPERATURESENSOR,
269 CHANNEL_TEMPERATURE),
271 TemperatureHumiditySensor_A5_04_01(RORG._4BS, 0x04, 0x01, false, A5_04_01.class,
272 THING_TYPE_TEMPERATUREHUMIDITYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY),
273 TemperatureHumiditySensor_A5_04_02(RORG._4BS, 0x04, 0x02, false, A5_04_02.class,
274 THING_TYPE_TEMPERATUREHUMIDITYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY),
275 TemperatureHumiditySensor_A5_04_02_Eltako(RORG._4BS, 0x04, 0x02, false, "ELTAKO", ELTAKOID, A5_04_02_Eltako.class,
276 THING_TYPE_TEMPERATUREHUMIDITYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY, CHANNEL_BATTERY_VOLTAGE),
277 TemperatureHumiditySensor_A5_04_03(RORG._4BS, 0x04, 0x03, false, A5_04_03.class,
278 THING_TYPE_TEMPERATUREHUMIDITYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY),
280 OCCUPANCYSENSOR_A5_07_01(RORG._4BS, 0x07, 0x01, false, A5_07_01.class, THING_TYPE_OCCUPANCYSENSOR,
281 CHANNEL_MOTIONDETECTION, CHANNEL_BATTERY_VOLTAGE),
282 OCCUPANCYSENSOR_A5_07_02(RORG._4BS, 0x07, 0x02, false, A5_07_02.class, THING_TYPE_OCCUPANCYSENSOR,
283 CHANNEL_MOTIONDETECTION, CHANNEL_BATTERY_VOLTAGE),
284 OCCUPANCYSENSOR_A5_07_03(RORG._4BS, 0x07, 0x03, false, A5_07_03.class, THING_TYPE_OCCUPANCYSENSOR,
285 CHANNEL_ILLUMINATION, CHANNEL_MOTIONDETECTION, CHANNEL_BATTERY_VOLTAGE),
287 LightTemperatureOccupancySensor_A5_08_01(RORG._4BS, 0x08, 0x01, false, A5_08_01.class,
288 THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_MOTIONDETECTION,
289 CHANNEL_ILLUMINATION, CHANNEL_OCCUPANCY),
290 LightTemperatureOccupancySensor_A5_08_02(RORG._4BS, 0x08, 0x02, false, A5_08_02.class,
291 THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_MOTIONDETECTION,
292 CHANNEL_ILLUMINATION, CHANNEL_OCCUPANCY),
293 LightTemperatureOccupancySensor_A5_08_03(RORG._4BS, 0x08, 0x03, false, A5_08_03.class,
294 THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, CHANNEL_TEMPERATURE, CHANNEL_MOTIONDETECTION,
295 CHANNEL_ILLUMINATION, CHANNEL_OCCUPANCY),
296 FXBH_A5_08_01(RORG._4BS, 0x08, 0x01, false, "FXBH", ELTAKOID, A5_08_01_FXBH.class,
297 THING_TYPE_LIGHTTEMPERATUREOCCUPANCYSENSOR, CHANNEL_MOTIONDETECTION, CHANNEL_ILLUMINATION),
299 LightSensor01(RORG._4BS, 0x06, 0x01, false, A5_06_01.class, THING_TYPE_LIGHTSENSOR, CHANNEL_ILLUMINATION),
300 LightSensor02(RORG._4BS, 0x06, 0x01, false, "ELTAKO", ELTAKOID, A5_06_01_ELTAKO.class, THING_TYPE_LIGHTSENSOR,
301 CHANNEL_ILLUMINATION),
303 RoomPanel_A5_10_01(RORG._4BS, 0x10, 0x01, false, A5_10_01.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
304 CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
305 RoomPanel_A5_10_02(RORG._4BS, 0x10, 0x02, false, A5_10_02.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
306 CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE),
307 RoomPanel_A5_10_03(RORG._4BS, 0x10, 0x03, false, A5_10_03.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
309 RoomPanel_A5_10_04(RORG._4BS, 0x10, 0x04, false, A5_10_04.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
310 CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE),
311 RoomPanel_A5_10_05(RORG._4BS, 0x10, 0x05, false, A5_10_05.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
312 CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
313 RoomPanel_A5_10_06(RORG._4BS, 0x10, 0x06, false, A5_10_06.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
315 RoomPanel_A5_10_07(RORG._4BS, 0x10, 0x07, false, A5_10_07.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
316 CHANNEL_FANSPEEDSTAGE),
317 RoomPanel_A5_10_08(RORG._4BS, 0x10, 0x08, false, A5_10_08.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
318 CHANNEL_FANSPEEDSTAGE, CHANNEL_OCCUPANCY),
319 RoomPanel_A5_10_09(RORG._4BS, 0x10, 0x09, false, A5_10_09.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
320 CHANNEL_FANSPEEDSTAGE),
321 RoomPanel_A5_10_0A(RORG._4BS, 0x10, 0x0A, false, A5_10_0A.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
323 RoomPanel_A5_10_0B(RORG._4BS, 0x10, 0x0B, false, A5_10_0B.class, THING_TYPE_ROOMOPERATINGPANEL,
324 CHANNEL_TEMPERATURE),
325 RoomPanel_A5_10_0C(RORG._4BS, 0x10, 0x0C, false, A5_10_0C.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
327 RoomPanel_A5_10_0D(RORG._4BS, 0x10, 0x0D, false, A5_10_0D.class, THING_TYPE_ROOMOPERATINGPANEL,
328 CHANNEL_TEMPERATURE),
329 RoomPanel_A5_10_10(RORG._4BS, 0x10, 0x10, false, A5_10_10.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
330 CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
331 RoomPanel_A5_10_11(RORG._4BS, 0x10, 0x11, false, A5_10_11.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
333 RoomPanel_A5_10_12(RORG._4BS, 0x10, 0x12, false, A5_10_12.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
335 RoomPanel_A5_10_13(RORG._4BS, 0x10, 0x13, false, A5_10_13.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
337 RoomPanel_A5_10_14(RORG._4BS, 0x10, 0x14, false, A5_10_14.class, THING_TYPE_ROOMOPERATINGPANEL,
338 CHANNEL_TEMPERATURE),
339 RoomPanel_A5_10_15(RORG._4BS, 0x10, 0x15, false, A5_10_15.class, THING_TYPE_ROOMOPERATINGPANEL,
340 CHANNEL_TEMPERATURE),
341 RoomPanel_A5_10_16(RORG._4BS, 0x10, 0x16, false, A5_10_16.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
343 RoomPanel_A5_10_17(RORG._4BS, 0x10, 0x17, false, A5_10_17.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
345 RoomPanel_A5_10_18(RORG._4BS, 0x10, 0x18, false, A5_10_18.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
347 RoomPanel_A5_10_19(RORG._4BS, 0x10, 0x19, false, A5_10_19.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
349 RoomPanel_A5_10_1A(RORG._4BS, 0x10, 0x1A, false, A5_10_1A.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
351 RoomPanel_A5_10_1B(RORG._4BS, 0x10, 0x1B, false, A5_10_1B.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
353 RoomPanel_A5_10_1C(RORG._4BS, 0x10, 0x1C, false, A5_10_1C.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
355 RoomPanel_A5_10_1D(RORG._4BS, 0x10, 0x1D, false, A5_10_1D.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
357 RoomPanel_A5_10_1E(RORG._4BS, 0x10, 0x1E, false, A5_10_1E.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
359 RoomPanel_A5_10_1F(RORG._4BS, 0x10, 0x1F, false, A5_10_1F.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
360 CHANNEL_OCCUPANCY, CHANNEL_SETPOINT, CHANNEL_FANSPEEDSTAGE),
361 RoomPanel_A5_10_20(RORG._4BS, 0x10, 0x20, false, A5_10_20.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
363 RoomPanel_A5_10_21(RORG._4BS, 0x10, 0x21, false, A5_10_21.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
365 RoomPanel_A5_10_22(RORG._4BS, 0x10, 0x22, false, A5_10_22.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
367 RoomPanel_A5_10_23(RORG._4BS, 0x10, 0x23, false, A5_10_23.class, THING_TYPE_ROOMOPERATINGPANEL, CHANNEL_TEMPERATURE,
368 CHANNEL_SETPOINT, CHANNEL_OCCUPANCY),
370 AutomatedMeterReading_00(RORG._4BS, 0x12, 0x00, false, A5_12_00.class, THING_TYPE_AUTOMATEDMETERSENSOR,
371 CHANNEL_COUNTER, CHANNEL_CURRENTNUMBER),
372 AutomatedMeterReading_01(RORG._4BS, 0x12, 0x01, false, A5_12_01.class, THING_TYPE_AUTOMATEDMETERSENSOR,
373 CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
374 AutomatedMeterReading_02(RORG._4BS, 0x12, 0x02, false, A5_12_02.class, THING_TYPE_AUTOMATEDMETERSENSOR,
375 CHANNEL_CUMULATIVEVALUE, CHANNEL_CURRENTFLOW),
376 AutomatedMeterReading_03(RORG._4BS, 0x12, 0x03, false, A5_12_03.class, THING_TYPE_AUTOMATEDMETERSENSOR,
377 CHANNEL_CUMULATIVEVALUE, CHANNEL_CURRENTFLOW),
379 EnvironmentalSensor_01(RORG._4BS, 0x13, 0x01, false, A5_13_01.class, THING_TYPE_ENVIRONMENTALSENSOR,
380 CHANNEL_ILLUMINATION, CHANNEL_TEMPERATURE, CHANNEL_WINDSPEED, CHANNEL_RAINSTATUS, CHANNEL_ILLUMINATIONWEST,
381 CHANNEL_ILLUMINATIONSOUTHNORTH, CHANNEL_ILLUMINATIONEAST),
383 Rollershutter_A5(RORG._4BS, 0x11, 0x03, false, A5_11_03.class, THING_TYPE_ROLLERSHUTTER, CHANNEL_ROLLERSHUTTER,
385 ExtendedLight_A5(RORG._4BS, 0x11, 0x04, false, A5_11_04.class, THING_TYPE_CENTRALCOMMAND, CHANNEL_GENERAL_SWITCHING,
386 CHANNEL_DIMMER, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER, CHANNEL_COUNTER),
388 SmokeDetection4BS(RORG._4BS, 0x30, 0x03, false, "ELTAKO", ELTAKOID, A5_30_03_ELTAKO.class,
389 THING_TYPE_MULTFUNCTIONSMOKEDETECTOR, CHANNEL_TEMPERATURE, CHANNEL_SMOKEDETECTION),
391 CentralCommandSwitching(RORG._4BS, 0x38, 0x08, false, A5_38_08_Switching.class, THING_TYPE_CENTRALCOMMAND, 0x01,
392 CHANNEL_GENERAL_SWITCHING, CHANNEL_TEACHINCMD),
393 CentralCommandDimming(RORG._4BS, 0x38, 0x08, false, A5_38_08_Dimming.class, THING_TYPE_CENTRALCOMMAND, 0x02,
394 CHANNEL_DIMMER, CHANNEL_TEACHINCMD),
395 CentralCommandBlinds(RORG._4BS, 0x38, 0x08, false, A5_38_08_Blinds.class, THING_TYPE_ROLLERSHUTTER, 0x07,
396 CHANNEL_ROLLERSHUTTER, CHANNEL_ANGLE, CHANNEL_TEACHINCMD),
398 // UniversalCommand(RORG._4BS, 0x3f, 0x7f, false, A5_3F_7F_Universal.class, THING_TYPE_UNIVERSALACTUATOR,
399 // CHANNEL_GENERIC_ROLLERSHUTTER, CHANNEL_GENERIC_LIGHT_SWITCHING, CHANNEL_GENERIC_DIMMER, CHANNEL_TEACHINCMD),
400 EltakoFSB(RORG._4BS, 0x3f, 0x7f, false, false, "EltakoFSB", 0, A5_3F_7F_EltakoFSB.class, THING_TYPE_ROLLERSHUTTER,
401 0, new Hashtable<String, Configuration>() {
402 private static final long serialVersionUID = 1L;
404 put(CHANNEL_ROLLERSHUTTER, new Configuration());
405 put(CHANNEL_TEACHINCMD, new Configuration() {
407 put(PARAMETER_CHANNEL_TEACHINMSG, "fff80d80");
413 EltakoFRM(RORG._4BS, 0x3f, 0x7f, false, false, "EltakoFRM", 0, A5_3F_7F_EltakoFRM.class, THING_TYPE_ROLLERSHUTTER,
414 0, new Hashtable<String, Configuration>() {
415 private static final long serialVersionUID = 1L;
417 put(CHANNEL_ROLLERSHUTTER, new Configuration());
418 put(CHANNEL_TEACHINCMD, new Configuration() {
420 put(PARAMETER_CHANNEL_TEACHINMSG, "fff80d80");
426 Thermostat(RORG._4BS, 0x20, 0x04, false, true, A5_20_04.class, THING_TYPE_THERMOSTAT, CHANNEL_VALVE_POSITION,
427 CHANNEL_BUTTON_LOCK, CHANNEL_DISPLAY_ORIENTATION, CHANNEL_TEMPERATURE_SETPOINT, CHANNEL_TEMPERATURE,
428 CHANNEL_FEED_TEMPERATURE, CHANNEL_MEASUREMENT_CONTROL, CHANNEL_FAILURE_CODE, CHANNEL_WAKEUPCYCLE,
429 CHANNEL_SERVICECOMMAND),
431 SwitchWithEnergyMeasurment_00(RORG.VLD, 0x01, 0x00, true, D2_01_00.class, THING_TYPE_MEASUREMENTSWITCH,
432 CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE),
433 SwitchWithEnergyMeasurment_01(RORG.VLD, 0x01, 0x01, true, D2_01_01.class, THING_TYPE_MEASUREMENTSWITCH,
434 CHANNEL_GENERAL_SWITCHING),
435 SwitchWithEnergyMeasurment_02(RORG.VLD, 0x01, 0x02, true, D2_01_02.class, THING_TYPE_MEASUREMENTSWITCH,
436 CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER, CHANNEL_TOTALUSAGE),
437 SwitchWithEnergyMeasurment_03(RORG.VLD, 0x01, 0x03, true, D2_01_03.class, THING_TYPE_MEASUREMENTSWITCH,
438 CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER),
439 SwitchWithEnergyMeasurment_04(RORG.VLD, 0x01, 0x04, true, D2_01_04.class, THING_TYPE_MEASUREMENTSWITCH,
440 CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
441 SwitchWithEnergyMeasurment_05(RORG.VLD, 0x01, 0x05, true, D2_01_05.class, THING_TYPE_MEASUREMENTSWITCH,
442 CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
443 SwitchWithEnergyMeasurment_06(RORG.VLD, 0x01, 0x06, true, D2_01_06.class, THING_TYPE_MEASUREMENTSWITCH,
444 CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE),
445 SwitchWithEnergyMeasurment_07(RORG.VLD, 0x01, 0x07, true, D2_01_07.class, THING_TYPE_MEASUREMENTSWITCH,
446 CHANNEL_GENERAL_SWITCHING),
447 SwitchWithEnergyMeasurment_08(RORG.VLD, 0x01, 0x08, true, D2_01_08.class, THING_TYPE_MEASUREMENTSWITCH,
448 CHANNEL_GENERAL_SWITCHING, CHANNEL_DIMMER, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
449 SwitchWithEnergyMeasurment_09(RORG.VLD, 0x01, 0x09, true, D2_01_09.class, THING_TYPE_MEASUREMENTSWITCH,
450 CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
451 SwitchWithEnergyMeasurment_09_PERMUNDO(RORG.VLD, 0x01, 0x09, true, "PERMUNDO", PERMUNDOID, D2_01_09_Permundo.class,
452 THING_TYPE_MEASUREMENTSWITCH, CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER,
453 CHANNEL_ECOMODE, CHANNEL_REPEATERMODE),
454 SwitchWithEnergyMeasurment_0A(RORG.VLD, 0x01, 0x0A, true, D2_01_0A.class, THING_TYPE_MEASUREMENTSWITCH,
455 CHANNEL_GENERAL_SWITCHING),
456 SwitchWithEnergyMeasurment_0B(RORG.VLD, 0x01, 0x0B, true, D2_01_0B.class, THING_TYPE_MEASUREMENTSWITCH,
457 CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
458 SwitchWithEnergyMeasurment_0C(RORG.VLD, 0x01, 0x0C, true, D2_01_0C.class, THING_TYPE_MEASUREMENTSWITCH,
459 CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
460 SwitchWithEnergyMeasurment_0D(RORG.VLD, 0x01, 0x0D, true, D2_01_0D.class, THING_TYPE_MEASUREMENTSWITCH,
461 CHANNEL_GENERAL_SWITCHING),
462 SwitchWithEnergyMeasurment_0E(RORG.VLD, 0x01, 0x0E, true, D2_01_0E.class, THING_TYPE_MEASUREMENTSWITCH,
463 CHANNEL_GENERAL_SWITCHING, CHANNEL_TOTALUSAGE, CHANNEL_INSTANTPOWER),
464 SwitchWithEnergyMeasurment_0F_NODON(RORG.VLD, 0x01, 0x0F, true, "NODON", NODONID, D2_01_0F_NodON.class,
465 THING_TYPE_MEASUREMENTSWITCH, CHANNEL_GENERAL_SWITCHING, CHANNEL_REPEATERMODE),
466 SwitchWithEnergyMeasurment_0F(RORG.VLD, 0x01, 0x0F, true, D2_01_0F.class, THING_TYPE_MEASUREMENTSWITCH,
467 CHANNEL_GENERAL_SWITCHING),
468 SwitchWithEnergyMeasurment_11(RORG.VLD, 0x01, 0x11, true, D2_01_11.class, THING_TYPE_MEASUREMENTSWITCH,
469 CHANNEL_GENERAL_SWITCHINGA, CHANNEL_GENERAL_SWITCHINGB),
470 SwitchWithEnergyMeasurment_12_NODON(RORG.VLD, 0x01, 0x12, true, "NODON", NODONID, D2_01_12_NodON.class,
471 THING_TYPE_MEASUREMENTSWITCH, CHANNEL_GENERAL_SWITCHINGA, CHANNEL_GENERAL_SWITCHINGB, CHANNEL_REPEATERMODE),
472 SwitchWithEnergyMeasurment_12(RORG.VLD, 0x01, 0x12, true, D2_01_12.class, THING_TYPE_MEASUREMENTSWITCH,
473 CHANNEL_GENERAL_SWITCHINGA, CHANNEL_GENERAL_SWITCHINGB),
475 Rollershutter_D2_NODON(RORG.VLD, 0x05, 0x00, true, "NODON", NODONID, D2_05_00_NodON.class, THING_TYPE_ROLLERSHUTTER,
476 CHANNEL_ROLLERSHUTTER, CHANNEL_REPEATERMODE),
477 Rollershutter_D2(RORG.VLD, 0x05, 0x00, true, D2_05_00.class, THING_TYPE_ROLLERSHUTTER, CHANNEL_ROLLERSHUTTER),
479 WindowSashHandleSensor_50(RORG.VLD, 0x06, 0x50, false, "Siegenia", 0x005D, D2_06_50.class,
480 THING_TYPE_WINDOWSASHHANDLESENSOR, CHANNEL_WINDOWHANDLESTATE, CHANNEL_WINDOWSASHSTATE,
481 CHANNEL_BATTERY_LEVEL, CHANNEL_BATTERYLOW, CHANNEL_WINDOWBREACHEVENT, CHANNEL_WINDOWCALIBRATIONSTATE,
482 CHANNEL_WINDOWCALIBRATIONSTEP),
484 MultiFunctionSensor_30(RORG.VLD, 0x14, 0x30, false, D2_14_30.class, THING_TYPE_MULTFUNCTIONSMOKEDETECTOR,
485 CHANNEL_SMOKEDETECTION, CHANNEL_SENSORFAULT, CHANNEL_TIMESINCELASTMAINTENANCE, CHANNEL_BATTERY_LEVEL,
486 CHANNEL_REMAININGPLT, CHANNEL_TEMPERATURE, CHANNEL_HUMIDITY, CHANNEL_HYGROCOMFORTINDEX,
487 CHANNEL_INDOORAIRANALYSIS),
489 HeatRecoveryVentilation_00(RORG.VLD, 0x50, 0x00, false, D2_50.class, THING_TYPE_HEATRECOVERYVENTILATION,
490 CHANNEL_VENTILATIONOPERATIONMODE, CHANNEL_SUPPLYAIRFLAPSTATUS, CHANNEL_WEEKLYTIMERPROGRAMSTATUS,
491 CHANNEL_EXHAUSTAIRFLAPSTATUS, CHANNEL_DEFROSTMODE, CHANNEL_COOLINGPROTECTIONMODE,
492 CHANNEL_OUTDOORAIRHEATERSTATUS, CHANNEL_SUPPLYAIRHEATERSTATUS, CHANNEL_DRAINHEATERSTATUS,
493 CHANNEL_TIMEROPERATIONMODE, CHANNEL_MAINTENANCESTATUS, CHANNEL_ROOMTEMPERATURECONTROLSTATUS,
494 CHANNEL_AIRQUALITYVALUE1, CHANNEL_AIRQUALITYVALUE2, CHANNEL_OUTDOORAIRTEMPERATURE,
495 CHANNEL_SUPPLYAIRTEMPERATURE, CHANNEL_INDOORAIRTEMPERATURE, CHANNEL_EXHAUSTAIRTEMPERATURE,
496 CHANNEL_SUPPLYAIRFANAIRFLOWRATE, CHANNEL_EXHAUSTAIRFANAIRFLOWRATE, CHANNEL_SUPPLYFANSPEED,
497 CHANNEL_EXHAUSTFANSPEED),
498 HeatRecoveryVentilation_01(RORG.VLD, 0x50, 0x01, false, D2_50.class, THING_TYPE_HEATRECOVERYVENTILATION,
499 CHANNEL_VENTILATIONOPERATIONMODE, CHANNEL_SUPPLYAIRFLAPSTATUS, CHANNEL_WEEKLYTIMERPROGRAMSTATUS,
500 CHANNEL_EXHAUSTAIRFLAPSTATUS, CHANNEL_DEFROSTMODE, CHANNEL_COOLINGPROTECTIONMODE,
501 CHANNEL_OUTDOORAIRHEATERSTATUS, CHANNEL_SUPPLYAIRHEATERSTATUS, CHANNEL_DRAINHEATERSTATUS,
502 CHANNEL_TIMEROPERATIONMODE, CHANNEL_MAINTENANCESTATUS, CHANNEL_ROOMTEMPERATURECONTROLSTATUS,
503 CHANNEL_AIRQUALITYVALUE1, CHANNEL_AIRQUALITYVALUE2, CHANNEL_OUTDOORAIRTEMPERATURE,
504 CHANNEL_SUPPLYAIRTEMPERATURE, CHANNEL_INDOORAIRTEMPERATURE, CHANNEL_EXHAUSTAIRTEMPERATURE,
505 CHANNEL_SUPPLYAIRFANAIRFLOWRATE, CHANNEL_EXHAUSTAIRFANAIRFLOWRATE, CHANNEL_SUPPLYFANSPEED,
506 CHANNEL_EXHAUSTFANSPEED),
507 HeatRecoveryVentilation_10(RORG.VLD, 0x50, 0x10, false, D2_50.class, THING_TYPE_HEATRECOVERYVENTILATION,
508 CHANNEL_VENTILATIONOPERATIONMODE, CHANNEL_DEFROSTMODE, CHANNEL_COOLINGPROTECTIONMODE,
509 CHANNEL_OUTDOORAIRHEATERSTATUS, CHANNEL_SUPPLYAIRHEATERSTATUS, CHANNEL_DRAINHEATERSTATUS,
510 CHANNEL_TIMEROPERATIONMODE, CHANNEL_MAINTENANCESTATUS, CHANNEL_ROOMTEMPERATURECONTROLSTATUS,
511 CHANNEL_AIRQUALITYVALUE1, CHANNEL_AIRQUALITYVALUE2, CHANNEL_OUTDOORAIRTEMPERATURE,
512 CHANNEL_SUPPLYAIRTEMPERATURE, CHANNEL_INDOORAIRTEMPERATURE, CHANNEL_EXHAUSTAIRTEMPERATURE,
513 CHANNEL_SUPPLYAIRFANAIRFLOWRATE, CHANNEL_EXHAUSTAIRFANAIRFLOWRATE, CHANNEL_SUPPLYFANSPEED,
514 CHANNEL_EXHAUSTFANSPEED, CHANNEL_WEEKLYTIMERPROGRAMSTATUS),
515 HeatRecoveryVentilation_11(RORG.VLD, 0x50, 0x11, false, D2_50.class, THING_TYPE_HEATRECOVERYVENTILATION,
516 CHANNEL_VENTILATIONOPERATIONMODE, CHANNEL_FIREPLACESAFETYMODE, CHANNEL_HEATEXCHANGERBYPASSSTATUS,
517 CHANNEL_DEFROSTMODE, CHANNEL_COOLINGPROTECTIONMODE, CHANNEL_OUTDOORAIRHEATERSTATUS,
518 CHANNEL_WEEKLYTIMERPROGRAMSTATUS, CHANNEL_SUPPLYAIRHEATERSTATUS, CHANNEL_DRAINHEATERSTATUS,
519 CHANNEL_TIMEROPERATIONMODE, CHANNEL_MAINTENANCESTATUS, CHANNEL_ROOMTEMPERATURECONTROLSTATUS,
520 CHANNEL_AIRQUALITYVALUE1, CHANNEL_AIRQUALITYVALUE2, CHANNEL_OUTDOORAIRTEMPERATURE,
521 CHANNEL_SUPPLYAIRTEMPERATURE, CHANNEL_INDOORAIRTEMPERATURE, CHANNEL_EXHAUSTAIRTEMPERATURE,
522 CHANNEL_SUPPLYAIRFANAIRFLOWRATE, CHANNEL_EXHAUSTAIRFANAIRFLOWRATE, CHANNEL_SUPPLYFANSPEED,
523 CHANNEL_EXHAUSTFANSPEED);
529 private Class<? extends EEP> eepClass;
531 private String manufactorSuffix;
532 private int manufactorId;
534 private @Nullable ThingTypeUID thingTypeUID;
536 private Hashtable<String, Configuration> channelIdsWithConfig = new Hashtable<>();
537 private Hashtable<String, EnOceanChannelDescription> supportedChannels = new Hashtable<>();
539 private boolean supportsRefresh;
541 private boolean requestsResponse;
543 EEPType(RORG rorg, int func, int type, boolean supportsRefresh, Class<? extends EEP> eepClass,
544 @Nullable ThingTypeUID thingTypeUID, String... channelIds) {
545 this(rorg, func, type, supportsRefresh, eepClass, thingTypeUID, -1, channelIds);
548 EEPType(RORG rorg, int func, int type, boolean supportsRefresh, boolean requestsResponse,
549 Class<? extends EEP> eepClass, ThingTypeUID thingTypeUID, String... channelIds) {
550 this(rorg, func, type, supportsRefresh, requestsResponse, eepClass, thingTypeUID, -1, channelIds);
553 EEPType(RORG rorg, int func, int type, boolean supportsRefresh, String manufactorSuffix, int manufId,
554 Class<? extends EEP> eepClass, ThingTypeUID thingTypeUID, String... channelIds) {
555 this(rorg, func, type, supportsRefresh, false, manufactorSuffix, manufId, eepClass, thingTypeUID, 0,
559 EEPType(RORG rorg, int func, int type, boolean supportsRefresh, Class<? extends EEP> eepClass,
560 @Nullable ThingTypeUID thingTypeUID, int command, String... channelIds) {
561 this(rorg, func, type, supportsRefresh, false, "", 0, eepClass, thingTypeUID, command, channelIds);
564 EEPType(RORG rorg, int func, int type, boolean supportsRefresh, boolean requestsResponse,
565 Class<? extends EEP> eepClass, ThingTypeUID thingTypeUID, int command, String... channelIds) {
566 this(rorg, func, type, supportsRefresh, requestsResponse, "", 0, eepClass, thingTypeUID, command, channelIds);
569 EEPType(RORG rorg, int func, int type, boolean supportsRefresh, boolean requestsResponse, String manufactorSuffix,
570 int manufId, Class<? extends EEP> eepClass, @Nullable ThingTypeUID thingTypeUID, int command,
571 String... channelIds) {
575 this.eepClass = eepClass;
576 this.thingTypeUID = thingTypeUID;
577 this.command = command;
578 this.manufactorSuffix = manufactorSuffix;
579 this.manufactorId = manufId;
580 this.supportsRefresh = supportsRefresh;
581 this.requestsResponse = requestsResponse;
583 for (String id : channelIds) {
585 this.channelIdsWithConfig.put(id, new Configuration());
586 EnOceanChannelDescription description = CHANNELID2CHANNELDESCRIPTION.get(id);
587 if (description != null) {
588 this.supportedChannels.put(id, description);
593 addDefaultChannels();
596 EEPType(RORG rorg, int func, int type, boolean supportsRefresh, boolean requestsResponse, String manufactorSuffix,
597 int manufId, Class<? extends EEP> eepClass, @Nullable ThingTypeUID thingTypeUID, int command,
598 Hashtable<String, Configuration> channelConfigs) {
602 this.eepClass = eepClass;
603 this.thingTypeUID = thingTypeUID;
604 this.command = command;
605 this.channelIdsWithConfig = channelConfigs;
606 this.manufactorSuffix = manufactorSuffix;
607 this.manufactorId = manufId;
608 this.supportsRefresh = supportsRefresh;
609 this.requestsResponse = requestsResponse;
611 for (String id : channelConfigs.keySet()) {
612 this.supportedChannels = addChannelDescription(supportedChannels, id, CHANNELID2CHANNELDESCRIPTION.get(id));
615 addDefaultChannels();
618 private void addDefaultChannels() {
619 if (THING_TYPE_GENERICTHING.equals(this.thingTypeUID)) {
620 this.channelIdsWithConfig.put(CHANNEL_GENERIC_SWITCH, new EnOceanChannelTransformationConfig());
622 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_GENERIC_SWITCH,
623 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_GENERIC_SWITCH));
625 this.channelIdsWithConfig.put(CHANNEL_GENERIC_ROLLERSHUTTER, new EnOceanChannelTransformationConfig());
626 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_GENERIC_ROLLERSHUTTER,
627 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_GENERIC_ROLLERSHUTTER));
629 this.channelIdsWithConfig.put(CHANNEL_GENERIC_DIMMER, new EnOceanChannelTransformationConfig());
630 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_GENERIC_DIMMER,
631 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_GENERIC_DIMMER));
633 this.channelIdsWithConfig.put(CHANNEL_GENERIC_NUMBER, new EnOceanChannelTransformationConfig());
634 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_GENERIC_NUMBER,
635 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_GENERIC_NUMBER));
637 this.channelIdsWithConfig.put(CHANNEL_GENERIC_STRING, new EnOceanChannelTransformationConfig());
638 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_GENERIC_STRING,
639 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_GENERIC_STRING));
641 this.channelIdsWithConfig.put(CHANNEL_GENERIC_COLOR, new EnOceanChannelTransformationConfig());
642 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_GENERIC_COLOR,
643 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_GENERIC_COLOR));
645 this.channelIdsWithConfig.put(CHANNEL_GENERIC_TEACHINCMD, new EnOceanChannelTransformationConfig());
646 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_GENERIC_TEACHINCMD,
647 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_GENERIC_TEACHINCMD));
650 this.channelIdsWithConfig.put(CHANNEL_RSSI, new Configuration());
651 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_RSSI,
652 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_RSSI));
654 this.channelIdsWithConfig.put(CHANNEL_REPEATCOUNT, new Configuration());
655 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_REPEATCOUNT,
656 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_REPEATCOUNT));
658 this.channelIdsWithConfig.put(CHANNEL_LASTRECEIVED, new Configuration());
659 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_LASTRECEIVED,
660 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_LASTRECEIVED));
662 if (requestsResponse) {
663 this.channelIdsWithConfig.put(CHANNEL_STATUS_REQUEST_EVENT, new Configuration());
664 this.supportedChannels = addChannelDescription(this.supportedChannels, CHANNEL_STATUS_REQUEST_EVENT,
665 CHANNELID2CHANNELDESCRIPTION.get(CHANNEL_STATUS_REQUEST_EVENT));
669 private static Hashtable<String, EnOceanChannelDescription> addChannelDescription(
670 Hashtable<String, EnOceanChannelDescription> channels, @Nullable String id,
671 @Nullable EnOceanChannelDescription channelDescription) {
672 if (id != null && channelDescription != null) {
673 channels.put(id, channelDescription);
678 public Class<? extends EEP> getEEPClass() {
682 public RORG getRORG() {
686 public int getFunc() {
690 public int getType() {
694 public boolean getSupportsRefresh() {
695 return supportsRefresh;
698 public boolean getRequstesResponse() {
699 return requestsResponse;
702 public Map<String, EnOceanChannelDescription> getSupportedChannels() {
703 return Collections.unmodifiableMap(supportedChannels);
706 public boolean isChannelSupported(Channel channel) {
707 ChannelTypeUID channelTypeUID = channel.getChannelTypeUID();
708 String id = channelTypeUID == null ? "" : channelTypeUID.getId();
710 return isChannelSupported(channel.getUID().getId(), id);
713 public boolean isChannelSupported(String channelId, String channelTypeId) {
714 return supportedChannels.containsKey(channelId) || VIRTUALCHANNEL_SEND_COMMAND.equals(channelId)
715 || supportedChannels.values().stream().anyMatch(c -> c.channelTypeUID.getId().equals(channelTypeId));
718 public @Nullable ThingTypeUID getThingTypeUID() {
722 public String getId() {
724 return String.format("%02X_%02X_%02X", rorg.getValue(), func, type);
725 } else if (command == 0) {
726 return String.format("%02X_%02X_%02X_%s", rorg.getValue(), func, type, manufactorSuffix);
728 return String.format("%02X_%02X_%02X_%02X", rorg.getValue(), func, type, command);
732 public Configuration getChannelConfig(String channelId) {
733 Configuration c = null;
734 if (!channelIdsWithConfig.isEmpty()) {
735 c = channelIdsWithConfig.get(channelId);
740 return new Configuration();
743 public static EEPType getType(String receivingEEPId) {
744 for (EEPType eep : values()) {
745 if (eep.getId().equals(receivingEEPId)) {
750 throw new IllegalArgumentException(String.format("EEP with id %s could not be found", receivingEEPId));
753 public static EEPType getType(Class<? extends EEP> eepClass) {
754 for (EEPType eep : values()) {
755 if (eep.eepClass.equals(eepClass)) {
760 throw new IllegalArgumentException(String.format("EEP with class %s could not be found", eepClass.getName()));
763 public static @Nullable EEPType getType(RORG rorg, int func, int type, int manufId) {
764 EEPType fallback = null;
766 for (EEPType eep : values()) {
767 if (eep.rorg == rorg && eep.func == func && eep.type == type && eep.manufactorId == manufId) {
769 } else if (fallback == null && eep.rorg == rorg && eep.func == func && eep.type == type) {