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.LOWBYTE, 0, "fault", CodeType.B),
45 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 1, "ch_mode", CodeType.B),
46 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 2, "dhw_mode", CodeType.B),
47 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 3, "flame", CodeType.B),
48 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 4, "cooling", CodeType.B),
49 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 5, "ch2E", CodeType.B),
50 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 6, "diag", CodeType.B) });
51 g.put(1, new DataItem[] { new FloatDataItem(Msg.WRITE, "controlsetpoint", SIUnits.CELSIUS, CodeType.B),
52 new FloatDataItem(Msg.WRITE, "controlsetpointrequested", SIUnits.CELSIUS, CodeType.T),
53 new FloatDataItem(Msg.WRITE, "controlsetpointoverride", SIUnits.CELSIUS, CodeType.R) });
54 g.put(2, new DataItem[] { new UIntDataItem(Msg.WRITE, ByteType.LOWBYTE, "mastermemberid") });
55 g.put(3, new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "dhwpresent"),
56 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "controltype"),
57 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "coolingsupport"),
58 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "dhwconfig"),
59 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "masterlowoff"),
60 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "ch2present"),
61 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "slavememberid") });
62 g.put(4, new DataItem[] { new UIntDataItem(Msg.WRITE, ByteType.HIGHBYTE, "commandcode"),
63 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "commandresponse") });
64 g.put(5, new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "servicerequest"),
65 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "lockout-reset"),
66 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "lowwaterpress"),
67 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "gasflamefault"),
68 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "airpressfault"),
69 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "waterovtemp"),
70 new IntDataItem(Msg.READ, ByteType.LOWBYTE, "oemfaultcode") });
71 g.put(7, new DataItem[] { new FloatDataItem(Msg.WRITE, "coolingcontrolsignal") });
72 g.put(8, new DataItem[] { new FloatDataItem(Msg.WRITE, "controlsetpoint2", SIUnits.CELSIUS, CodeType.B),
73 new FloatDataItem(Msg.WRITE, "controlsetpoint2requested", SIUnits.CELSIUS, CodeType.T),
74 new FloatDataItem(Msg.WRITE, "controlsetpoint2override", SIUnits.CELSIUS, CodeType.R) });
75 g.put(9, new DataItem[] { new FloatDataItem(Msg.READ, "overridesetpoint") });
76 g.put(10, new DataItem[] { new TspFhbSizeDataItem(Msg.WRITE, ByteType.HIGHBYTE, 11, "tspnumber") });
77 g.put(11, new DataItem[] { new TspFhbValueDataItem(Msg.READWRITE, "tspentry") });
78 g.put(12, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 13, "fhbnumber") });
79 g.put(13, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "fhbentry") });
80 g.put(14, new DataItem[] { new FloatDataItem(Msg.READ, "maxrelmdulevel", Units.PERCENT) });
81 g.put(15, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.HIGHBYTE, "maxcapkw"),
82 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "maxcapprc") });
83 g.put(16, new DataItem[] { new FloatDataItem(Msg.WRITE, "roomsetpoint", SIUnits.CELSIUS) });
84 g.put(17, new DataItem[] { new FloatDataItem(Msg.READ, "modulevel", Units.PERCENT) });
85 g.put(18, new DataItem[] { new FloatDataItem(Msg.READ, "waterpressure", Units.BAR) });
86 g.put(19, new DataItem[] { new FloatDataItem(Msg.READ, "dhwflow") });
87 g.put(20, new DataItem[] { new UIntDataItem(Msg.READWRITE, ByteType.BOTH, "dowtod") });
88 g.put(21, new DataItem[] { new UIntDataItem(Msg.READWRITE, ByteType.HIGHBYTE, "month"),
89 new UIntDataItem(Msg.READWRITE, ByteType.LOWBYTE, "day") });
90 g.put(22, new DataItem[] { new UIntDataItem(Msg.READWRITE, ByteType.BOTH, "year") });
91 g.put(23, new DataItem[] { new FloatDataItem(Msg.WRITE, "setpointch2") });
92 g.put(24, new DataItem[] { new FloatDataItem(Msg.WRITE, "roomtemp", SIUnits.CELSIUS) });
93 g.put(25, new DataItem[] { new FloatDataItem(Msg.READ, "flowtemp", SIUnits.CELSIUS) });
94 g.put(26, new DataItem[] { new FloatDataItem(Msg.READ, "dhwtemp", SIUnits.CELSIUS) });
95 g.put(27, new DataItem[] { new FloatDataItem(Msg.READ, "outsidetemp", SIUnits.CELSIUS) });
96 g.put(28, new DataItem[] { new FloatDataItem(Msg.READ, "returntemp", SIUnits.CELSIUS) });
98 g.put(29, new DataItem[] { new FloatDataItem(Msg.READ, "ss_temperature") });
99 g.put(30, new DataItem[] { new FloatDataItem(Msg.READ, "ss_collectortemperature") });
101 g.put(31, new DataItem[] { new FloatDataItem(Msg.READ, "flowtemp2") });
102 g.put(32, new DataItem[] { new FloatDataItem(Msg.READ, "dhw2temp") });
103 g.put(33, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "exhausttemp") });
104 g.put(48, new DataItem[] { new IntDataItem(Msg.READ, ByteType.HIGHBYTE, "tdhwsetu"),
105 new IntDataItem(Msg.READ, ByteType.LOWBYTE, "tdhwsetl") });
106 g.put(49, new DataItem[] { new IntDataItem(Msg.READ, ByteType.HIGHBYTE, "maxchu"),
107 new IntDataItem(Msg.READ, ByteType.LOWBYTE, "maxchl") });
108 g.put(50, new DataItem[] { new IntDataItem(Msg.READ, ByteType.HIGHBYTE, "otcu"),
109 new IntDataItem(Msg.READ, ByteType.LOWBYTE, "otcl") });
110 g.put(56, new DataItem[] { new FloatDataItem(Msg.READWRITE, "tdhwset", SIUnits.CELSIUS) });
111 g.put(57, new DataItem[] { new FloatDataItem(Msg.READWRITE, "tchmax") });
112 g.put(58, new DataItem[] { new FloatDataItem(Msg.READWRITE, "otchcratio") });
114 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "vh_ventilationenable"),
115 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "vh_bypassposition"),
116 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "vh_bypassmode"),
117 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "vh_freeventilationmode"),
118 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 0, "vh_faultindication"),
119 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 1, "vh_ventilationmode"),
120 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 2, "vh_bypassstatus"),
121 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 3, "vh_bypassautomaticstatus"),
122 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 4, "vh_freeventilationstatus"),
123 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 5, "vh_filtercheck"),
124 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 6, "vh_diagnosticindication") });
125 g.put(71, new DataItem[] { new UIntDataItem(Msg.WRITE, ByteType.LOWBYTE, "vh_controlsetpoint") });
127 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "vh_servicerequest"),
128 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "vh_exhaustfanfault"),
129 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "vh_inletfanfault"),
130 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "vh_frostprotection"),
131 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "vh_faultcode") });
132 g.put(73, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_diagnosticcode") });
134 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "vh_systemtype"),
135 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "vh_bypass"),
136 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "vh_speedcontrol"),
137 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "vh_memberid") });
138 g.put(75, new DataItem[] { new FloatDataItem(Msg.READ, "vh_openthermversion") });
139 g.put(76, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_versiontype") });
140 g.put(77, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_relativeventilation") });
141 g.put(78, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_relativehumidity") });
142 g.put(79, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_co2level") });
143 g.put(80, new DataItem[] { new FloatDataItem(Msg.READ, "vh_supplyinlettemp") });
144 g.put(81, new DataItem[] { new FloatDataItem(Msg.READ, "vh_supplyoutlettemp") });
145 g.put(82, new DataItem[] { new FloatDataItem(Msg.READ, "vh_exhaustinlettemp") });
146 g.put(83, new DataItem[] { new FloatDataItem(Msg.READ, "vh_exhaustoutlettemp") });
147 g.put(84, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_actualexhaustfanspeed") });
148 g.put(85, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "vh_actualinletfanspeed") });
149 g.put(86, new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "vh_nominalventenable"),
150 new FlagDataItem(Msg.READ, ByteType.LOWBYTE, 0, "vh_nominalventrw") });
151 g.put(87, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.HIGHBYTE, "vh_nominalventilationvalue") });
152 g.put(88, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 89, "vh_tspnumber") });
153 g.put(89, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "vh_tspentry") });
154 g.put(90, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 91, "vh_fhbnumber") });
155 g.put(91, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "vh_fhbentry") });
157 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "rof0"),
158 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "rof1"),
159 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "rof2"),
160 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "rof3"),
161 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "rof4"),
162 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "rof5"),
163 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 6, "rof6"),
164 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 7, "rof7") });
167 new DataItem[] { new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 0, "rof0"),
168 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 1, "rof1"),
169 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 2, "rof2"),
170 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 3, "rof3"),
171 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 4, "rof4"),
172 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 5, "rof5"),
173 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 6, "rof6"),
174 new FlagDataItem(Msg.READ, ByteType.HIGHBYTE, 7, "rof7") });
175 g.put(102, new DataItem[] {});
177 g.put(105, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 106, "ss_tspnumber") });
178 g.put(106, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "ss_tspentry") });
180 g.put(107, new DataItem[] { new TspFhbSizeDataItem(Msg.READ, ByteType.HIGHBYTE, 108, "ss_fhbnumber") });
181 g.put(108, new DataItem[] { new TspFhbValueDataItem(Msg.READ, "ss_fhbentry") });
182 g.put(113, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "unsuccessfulburnerstarts") });
183 g.put(115, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "oemdiagcode") });
184 g.put(116, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "burnerstarts") });
185 g.put(117, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "chpumpstarts") });
186 g.put(118, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "dhwpvstarts") });
187 g.put(119, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "dhwburnerstarts") });
188 g.put(120, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "burnerhours", Units.HOUR) });
189 g.put(121, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "chpumphours", Units.HOUR) });
190 g.put(122, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "dhwpvhours", Units.HOUR) });
191 g.put(123, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.BOTH, "dhwburnerhours", Units.HOUR) });
192 g.put(124, new DataItem[] { new FloatDataItem(Msg.WRITE, "masterotversion") });
193 g.put(125, new DataItem[] { new FloatDataItem(Msg.READ, "slaveotversion") });
194 g.put(126, new DataItem[] { new UIntDataItem(Msg.WRITE, ByteType.HIGHBYTE, "masterproducttype"),
195 new UIntDataItem(Msg.WRITE, ByteType.LOWBYTE, "masterproductversion") });
196 g.put(127, new DataItem[] { new UIntDataItem(Msg.READ, ByteType.HIGHBYTE, "slaveproducttype"),
197 new UIntDataItem(Msg.READ, ByteType.LOWBYTE, "slaveproductversion") });