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.openthermgateway.internal;
15 import java.util.HashMap;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.openhab.core.library.unit.SIUnits;
20 import org.openhab.core.library.unit.Units;
23 * The {@link DataItemGroup} represents a list of all possible DataItem messages within the OpenTherm specification.
25 * @author Arjen Korevaar - Initial contribution
28 public class DataItemGroup {
30 public static final Map<Integer, DataItem[]> DATAITEMGROUPS = createDataItemGroups();
32 private static Map<Integer, DataItem[]> createDataItemGroups() {
33 HashMap<Integer, DataItem[]> g = new HashMap<>();
35 g.put(0, new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "ch_enable", CodeType.B),
36 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "ch_enablerequested", CodeType.T),
37 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "ch_enableoverride", CodeType.R),
38 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "dhw_enable", CodeType.B),
39 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "cooling_enabled", CodeType.B),
40 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "otc_active", CodeType.B),
41 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "ch2_enable", CodeType.B),
42 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "ch2_enablerequested", CodeType.T),
43 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "ch2_enableoverride", CodeType.R),
44 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "0x00:5", CodeType.B),
45 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 6, "0x00:6", CodeType.B),
46 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 7, "0x00:7", CodeType.B),
47 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 0, "fault", CodeType.B),
48 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 1, "ch_mode", CodeType.B),
49 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 2, "dhw_mode", CodeType.B),
50 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 3, "flame", CodeType.B),
51 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 4, "cooling", CodeType.B),
52 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 5, "ch2E", CodeType.B),
53 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 6, "diag", CodeType.B),
54 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 7, "0x00:7", CodeType.B) });
55 g.put(1, new DataItem[] { new FloatDataItem(Msg.WRITE, "controlsetpoint", SIUnits.CELSIUS, CodeType.B),
56 new FloatDataItem(Msg.WRITE, "controlsetpointrequested", SIUnits.CELSIUS, CodeType.T),
57 new FloatDataItem(Msg.WRITE, "controlsetpointoverride", SIUnits.CELSIUS, CodeType.R) });
58 g.put(2, new DataItem[] { new FlagDataItem(Msg.WRITE, ByteType.HIGHBYTE, 0, "0x02:0"),
59 new FlagDataItem(Msg.WRITE, ByteType.HIGHBYTE, 1, "0x02:1"),
60 new FlagDataItem(Msg.WRITE, ByteType.HIGHBYTE, 2, "0x02:2"),
61 new FlagDataItem(Msg.WRITE, ByteType.HIGHBYTE, 3, "0x02:3"),
62 new FlagDataItem(Msg.WRITE, ByteType.HIGHBYTE, 4, "0x02:4"),
63 new FlagDataItem(Msg.WRITE, ByteType.HIGHBYTE, 5, "0x02:5"),
64 new FlagDataItem(Msg.WRITE, ByteType.HIGHBYTE, 6, "0x02:6"),
65 new FlagDataItem(Msg.WRITE, ByteType.HIGHBYTE, 7, "0x02:7"),
66 new UIntDataItem(Msg.WRITE, ByteType.LOWBYTE, "mastermemberid") });
67 g.put(3, new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "dhwpresent"),
68 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "controltype"),
69 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "coolingsupport"),
70 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "dhwconfig"),
71 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "masterlowoff"),
72 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "ch2present"),
73 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 6, "0x03:6"),
74 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 7, "0x03:7"),
75 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "slavememberid") });
76 g.put(4, new DataItem[] { new UIntDataItem(Msg.WRITE, ByteType.HIGHBYTE, "commandcode"),
77 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "commandresponse") });
78 g.put(5, new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "servicerequest"),
79 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "lockout-reset"),
80 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "lowwaterpress"),
81 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "gasflamefault"),
82 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "airpressfault"),
83 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "waterovtemp"),
84 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 6, "0x05:6"),
85 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 7, "0x05:7"),
86 new IntDataItem(Msg.READ, ByteType.LOWBYTE, "oemfaultcode") });
87 g.put(6, new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "0x06:h0"),
88 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "0x06:h1"),
89 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "0x06:h2"),
90 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "0x06:h3"),
91 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "0x06:h4"),
92 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "0x06:h5"),
93 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 6, "0x06:h6"),
94 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 7, "0x06:h7"),
95 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 0, "0x06:l0"),
96 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 1, "0x06:l1"),
97 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 2, "0x06:l2"),
98 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 3, "0x06:l3"),
99 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 4, "0x06:l4"),
100 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 5, "0x06:l5"),
101 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 6, "0x06:l6"),
102 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 7, "0x06:l7") });
103 g.put(7, new DataItem[] { new FloatDataItem(Msg.WRITE, "coolingcontrolsignal") });
104 g.put(8, new DataItem[] { new FloatDataItem(Msg.WRITE, "controlsetpoint2", SIUnits.CELSIUS, CodeType.B),
105 new FloatDataItem(Msg.WRITE, "controlsetpoint2requested", SIUnits.CELSIUS, CodeType.T),
106 new FloatDataItem(Msg.WRITE, "controlsetpoint2override", SIUnits.CELSIUS, CodeType.R) });
107 g.put(9, new DataItem[] { new FloatDataItem(Msg.READ, "overridesetpoint") });
108 g.put(10, new DataItem[] { new TspFhbSizeDataItem(Msg.WRITE, ByteType.HIGHBYTE, 11, "tspnumber") });
109 g.put(11, new DataItem[] { new TspFhbValueDataItem(Msg.READWRITE, "tspentry") });
110 g.put(12, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 13, "fhbnumber") });
111 g.put(13, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "fhbentry") });
112 g.put(14, new DataItem[] { new FloatDataItem(Msg.READ, "maxrelmdulevel", Units.PERCENT) });
113 g.put(15, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.HIGHBYTE, "maxcapkw"),
114 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "maxcapprc") });
115 g.put(16, new DataItem[] { new FloatDataItem(Msg.WRITE, "roomsetpoint", SIUnits.CELSIUS) });
116 g.put(17, new DataItem[] { new FloatDataItem(Msg.READ, "modulevel", Units.PERCENT) });
117 g.put(18, new DataItem[] { new FloatDataItem(Msg.READ, "waterpressure", Units.BAR) });
118 g.put(19, new DataItem[] { new FloatDataItem(Msg.READ, "dhwflow") });
119 g.put(20, new DataItem[] { new UIntDataItem(Msg.READWRITE, ByteType.BOTH, "dowtod") });
120 g.put(21, new DataItem[] { new UIntDataItem(Msg.READWRITE, ByteType.HIGHBYTE, "month"),
121 new UIntDataItem(Msg.READWRITE, ByteType.LOWBYTE, "day") });
122 g.put(22, new DataItem[] { new UIntDataItem(Msg.READWRITE, ByteType.BOTH, "year") });
123 g.put(23, new DataItem[] { new FloatDataItem(Msg.WRITE, "setpointch2") });
124 g.put(24, new DataItem[] { new FloatDataItem(Msg.WRITE, "roomtemp", SIUnits.CELSIUS) });
125 g.put(25, new DataItem[] { new FloatDataItem(Msg.READ, "flowtemp", SIUnits.CELSIUS) });
126 g.put(26, new DataItem[] { new FloatDataItem(Msg.READ, "dhwtemp", SIUnits.CELSIUS) });
127 g.put(27, new DataItem[] { new FloatDataItem(Msg.READ, "outsidetemp", SIUnits.CELSIUS) });
128 g.put(28, new DataItem[] { new FloatDataItem(Msg.READ, "returntemp", SIUnits.CELSIUS) });
130 g.put(29, new DataItem[] { new FloatDataItem(Msg.READ, "ss_temperature") });
131 g.put(30, new DataItem[] { new FloatDataItem(Msg.READ, "ss_collectortemperature") });
133 g.put(31, new DataItem[] { new FloatDataItem(Msg.READ, "flowtemp2") });
134 g.put(32, new DataItem[] { new FloatDataItem(Msg.READ, "dhw2temp") });
135 g.put(33, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "exhausttemp") });
136 g.put(48, new DataItem[] { new IntDataItem(Msg.READ, ByteType.HIGHBYTE, "tdhwsetu"),
137 new IntDataItem(Msg.READ, ByteType.LOWBYTE, "tdhwsetl") });
138 g.put(49, new DataItem[] { new IntDataItem(Msg.READ, ByteType.HIGHBYTE, "maxchu"),
139 new IntDataItem(Msg.READ, ByteType.LOWBYTE, "maxchl") });
140 g.put(50, new DataItem[] { new IntDataItem(Msg.READ, ByteType.HIGHBYTE, "otcu"),
141 new IntDataItem(Msg.READ, ByteType.LOWBYTE, "otcl") });
142 g.put(56, new DataItem[] { new FloatDataItem(Msg.READWRITE, "tdhwset", SIUnits.CELSIUS) });
143 g.put(57, new DataItem[] { new FloatDataItem(Msg.READWRITE, "tchmax") });
144 g.put(58, new DataItem[] { new FloatDataItem(Msg.READWRITE, "otchcratio") });
146 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "vh_ventilationenable"),
147 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "vh_bypassposition"),
148 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "vh_bypassmode"),
149 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "vh_freeventilationmode"),
150 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 0, "vh_faultindication"),
151 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 1, "vh_ventilationmode"),
152 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 2, "vh_bypassstatus"),
153 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 3, "vh_bypassautomaticstatus"),
154 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 4, "vh_freeventilationstatus"),
155 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 5, "vh_filtercheck"),
156 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 6, "vh_diagnosticindication") });
157 g.put(71, new DataItem[] { new UIntDataItem(Msg.WRITE, ByteType.LOWBYTE, "vh_controlsetpoint") });
159 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "vh_servicerequest"),
160 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "vh_exhaustfanfault"),
161 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "vh_inletfanfault"),
162 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "vh_frostprotection"),
163 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "vh_faultcode") });
164 g.put(73, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_diagnosticcode") });
166 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "vh_systemtype"),
167 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "vh_bypass"),
168 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "vh_speedcontrol"),
169 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "vh_memberid") });
170 g.put(75, new DataItem[] { new FloatDataItem(Msg.READ, "vh_openthermversion") });
171 g.put(76, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_versiontype") });
172 g.put(77, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_relativeventilation") });
173 g.put(78, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_relativehumidity") });
174 g.put(79, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_co2level") });
175 g.put(80, new DataItem[] { new FloatDataItem(Msg.READ, "vh_supplyinlettemp") });
176 g.put(81, new DataItem[] { new FloatDataItem(Msg.READ, "vh_supplyoutlettemp") });
177 g.put(82, new DataItem[] { new FloatDataItem(Msg.READ, "vh_exhaustinlettemp") });
178 g.put(83, new DataItem[] { new FloatDataItem(Msg.READ, "vh_exhaustoutlettemp") });
179 g.put(84, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_actualexhaustfanspeed") });
180 g.put(85, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_actualinletfanspeed") });
181 g.put(86, new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "vh_nominalventenable"),
182 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 0, "vh_nominalventrw") });
183 g.put(87, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.HIGHBYTE, "vh_nominalventilationvalue") });
184 g.put(88, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 89, "vh_tspnumber") });
185 g.put(89, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "vh_tspentry") });
186 g.put(90, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 91, "vh_fhbnumber") });
187 g.put(91, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "vh_fhbentry") });
189 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "rof0"),
190 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "rof1"),
191 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "rof2"),
192 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "rof3"),
193 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "rof4"),
194 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "rof5"),
195 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 6, "rof6"),
196 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 7, "rof7") });
199 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "rof0"),
200 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "rof1"),
201 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "rof2"),
202 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "rof3"),
203 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "rof4"),
204 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "rof5"),
205 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 6, "rof6"),
206 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 7, "rof7") });
207 g.put(102, new DataItem[] {});
209 g.put(105, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 106, "ss_tspnumber") });
210 g.put(106, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "ss_tspentry") });
212 g.put(107, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 108, "ss_fhbnumber") });
213 g.put(108, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "ss_fhbentry") });
214 g.put(113, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "unsuccessfulburnerstarts") });
215 g.put(115, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "oemdiagcode") });
216 g.put(116, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "burnerstarts") });
217 g.put(117, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "chpumpstarts") });
218 g.put(118, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "dhwpvstarts") });
219 g.put(119, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "dhwburnerstarts") });
220 g.put(120, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "burnerhours", Units.HOUR) });
221 g.put(121, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "chpumphours", Units.HOUR) });
222 g.put(122, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "dhwpvhours", Units.HOUR) });
223 g.put(123, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "dhwburnerhours", Units.HOUR) });
224 g.put(124, new DataItem[] { new FloatDataItem(Msg.WRITE, "masterotversion") });
225 g.put(125, new DataItem[] { new FloatDataItem(Msg.READ, "slaveotversion") });
226 g.put(126, new DataItem[] { new UIntDataItem(Msg.WRITE, ByteType.HIGHBYTE, "masterproducttype"),
227 new UIntDataItem(Msg.WRITE, ByteType.LOWBYTE, "masterproductversion") });
228 g.put(127, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.HIGHBYTE, "slaveproducttype"),
229 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "slaveproductversion") });