View Javadoc
1   /*
2    * Copyright 2009, openv4j.sf.net, and individual contributors as indicated
3    * by the @authors tag. See the copyright.txt in the distribution for a
4    * full listing of individual contributors.
5    *
6    * This is free software; you can redistribute it and/or modify it
7    * under the terms of the GNU General Public License as
8    * published by the Free Software Foundation; either version 3 of
9    * the License, or (at your option) any later version.
10   *
11   * This software is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   * Lesser General Public License for more details.
15   *
16   * You should have received a copy of the GNU Lesser General Public
17   * License along with this software; if not, write to the Free
18   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
20   *
21   * $Id: $
22   *
23   * @author arnep
24   */
25  package net.sf.openv4j;
26  
27  import java.io.Serializable;
28  
29  import java.util.Arrays;
30  import static net.sf.openv4j.DataType.*;
31  import static net.sf.openv4j.Group.*;
32  import static net.sf.openv4j.Property.*;
33  import static net.sf.openv4j.PropertyType.*;
34  import net.sf.openv4j.protocolhandlers.DataContainer;
35  import net.sf.openv4j.protocolhandlers.MemoryImage;
36  
37  /**
38   * 
39   */
40  public enum DataPoint implements Serializable { //0x0000 to 0x0fff
41  
42      COMMON_CONFIG_DEVICE_TYPE_ID(0x00F8, COMMON, CONFIG, DEVICE_TYPE_ID, SHORT_HEX, AccessType.RO),
43      COMMON_TEMP_ACTUAL_OUTSIDE(0x0800, COMMON, TEMP_ACTUAL, OUTSIDE, SHORT, AccessType.RO, 0.1),
44      BOILER_TEMP_ACTUAL_BOILER_WATER_AT_0X0802(0x0802, Group.BOILER, TEMP_ACTUAL, Property.BOILER_WATER, SHORT, AccessType.RO, 0.1),
45      DHW_TEMP_ACTUAL_DHW_CYLINDER(0x0804, Group.DHW, TEMP_ACTUAL, DHW_CYLINDER, SHORT, AccessType.RO, 0.1),
46      DHW_TEMP_ACTUAL_DHW_CYLINDER_2(0x0806, Group.DHW, TEMP_ACTUAL, DHW_CYLINDER_2, SHORT, AccessType.RO, 0.1),
47      BOILER_TEMP_ACTUAL_EXHAUST(0x0808, Group.BOILER, TEMP_ACTUAL, EXHAUST, SHORT, AccessType.RO, 0.1),
48      BOILER_TEMP_ACTUAL_HEATING_RETURN(0x080a, Group.BOILER, TEMP_ACTUAL, HEATING_RETURN, SHORT, AccessType.RO, 0.1),
49      BOILER_TEMP_ACTUAL_HEATING_SUPPLY(0x080c, Group.BOILER, TEMP_ACTUAL, HEATING_SUPPLY, SHORT, AccessType.RO, 0.1),
50      COMMON_TEMP_LOW_PASS_OUTSIDE(0x080e, Group.COMMON, TEMP_LOW_PASS, OUTSIDE, SHORT, AccessType.RO, 0.1),
51      BOILER_TEMP_MAX_EXHAUST(0x089f, Group.BOILER, TEMP_MAX, EXHAUST, SHORT, AccessType.RO, 0.1),
52      BOILER_TEMP_LOW_PASS_BOILER_WATER(0x0810, Group.BOILER, TEMP_LOW_PASS, Property.BOILER_WATER, SHORT, AccessType.RO, 0.1),
53      DHW_TEMP_LOW_PASS_DHW_CYLINDER(0x0812, Group.DHW, TEMP_LOW_PASS, DHW_CYLINDER, SHORT, AccessType.RO, 0.1),
54      DHW_TEMP_LOW_PASS_DHW_CYLINDER_2(0x0814, Group.DHW, TEMP_LOW_PASS, DHW_CYLINDER_2, SHORT, AccessType.RO, 0.1),
55      BOILER_TEMP_LOW_PASS_EXHAUST(0x0816, Group.BOILER, TEMP_LOW_PASS, EXHAUST, SHORT, AccessType.RO, 0.1),
56      BOILER_TEMP_LOW_PASS_HEATING_RETURN(0x0818, Group.BOILER, TEMP_LOW_PASS, HEATING_RETURN, SHORT, AccessType.RO, 0.1),
57      BOILER_STATE_BURNER_STAGE_1(0x0842, Group.BOILER, STATE, BURNER_STAGE_1, BOOL, AccessType.RO),
58      DHW_STATE_DHW_PUMP(0x0845, Group.DHW, STATE, DHW_PUMP, BOOL, AccessType.RO),
59      DHW_STATE_DHW_RECIRC_PUMP(0x0846, Group.DHW, STATE, DHW_RECIRC_PUMP, BOOL, AccessType.RO),
60      BOILER_STATE_BURNER_STAGE_2(0x0849, Group.BOILER, STATE, BURNER_STAGE_2, BOOL, AccessType.RO),
61      BOILER_TEMP_LOW_PASS_HEATING_SUPPLY(0x081a, Group.BOILER, TEMP_LOW_PASS, HEATING_SUPPLY, SHORT, AccessType.RO, 0.1),
62      BOILER_ERROR_STATE_BURNER_STAGE_1(0x0883, Group.BOILER, ERROR_STATE, BURNER_STAGE_1, BOOL, AccessType.RO),
63      BOILER_OPERATING_TIME_S_BURNER_STAGE_1(0x0886, Group.BOILER, OPERATING_TIME_S, BURNER_STAGE_1, INTEGER, AccessType.RO),
64      BOILER_CYCLES_BURNER_STAGE_2(0x0887, Group.BOILER, CYCLES, BURNER_STAGE_2, INTEGER, AccessType.RO),
65      BOILER_CYCLES_BURNER_STAGE_1(0x088a, Group.BOILER, CYCLES, BURNER_STAGE_1, INTEGER, AccessType.RO),
66      COMMON_TIME_STAMP_DEVICE(0x088e, COMMON, TIME_STAMP, DEVICE, TIME_STAMP_8, AccessType.RW),
67      BOILER_TEMP_ACTUAL_UNKNOWN_AT_0X0896(0x0896, Group.BOILER, TEMP_ACTUAL, UNKNOWN, SHORT, AccessType.RO, 0.1),
68      BOILER_TEMP_ACTUAL_UNKNOWN_AT_0X0898(0x0898, Group.BOILER, TEMP_ACTUAL, UNKNOWN, SHORT, AccessType.RO, 0.1),
69      BOILER_TEMP_ACTUAL_UNKNOWN_AT_0X089A(0x089a, Group.BOILER, TEMP_ACTUAL, UNKNOWN, SHORT, AccessType.RO, 0.1),
70      BOILER_OPERATING_TIME_S_BURNER_STAGE_2(0x08a3, Group.BOILER, OPERATING_TIME_S, BURNER_STAGE_2, INTEGER, AccessType.RO),
71      BOILER_OPERATING_TIME_S_BURNER_STAGE_1_AT_0X08A7(0x08a7, Group.BOILER, OPERATING_TIME_S, BURNER_STAGE_1, INTEGER, AccessType.RO),
72      BOILER_OPERATING_TIME_S_BURNER_STAGE_2_AT_0X08AB(0x08ab, Group.BOILER, OPERATING_TIME_S, BURNER_STAGE_2, INTEGER, AccessType.RO),
73      BOILER_TEMP_ACTUAL_HEATING_SUPPLY_AT_0X0950(0x0950, Group.BOILER, TEMP_ACTUAL, HEATING_SUPPLY, SHORT, AccessType.RO, 0.1),
74      A1M1_CYCLES_HEATING_MONDAY(0x2000, Group.A1M1, CYCLES_HEATING, MONDAY, CYCLE_TIMES, AccessType.RW),
75      A1M1_CYCLES_HEATING_TUESDAY(0x2008, Group.A1M1, CYCLES_HEATING, TUESDAY, CYCLE_TIMES, AccessType.RW),
76      A1M1_CYCLES_HEATING_WEDNSDAY(0x2010, Group.A1M1, CYCLES_HEATING, WEDNSDAY, CYCLE_TIMES, AccessType.RW),
77      A1M1_CYCLES_HEATING_THURSDAY(0x2018, Group.A1M1, CYCLES_HEATING, THURSDAY, CYCLE_TIMES, AccessType.RW),
78      A1M1_CYCLES_HEATING_FRIDAY(0x2020, Group.A1M1, CYCLES_HEATING, FRIDAY, CYCLE_TIMES, AccessType.RW),
79      A1M1_CYCLES_HEATING_SATURDAY(0x2028, Group.A1M1, CYCLES_HEATING, SATURDAY, CYCLE_TIMES, AccessType.RW),
80      A1M1_CYCLES_HEATING_SUNDAY(0x2030, Group.A1M1, CYCLES_HEATING, SUNDAY, CYCLE_TIMES, AccessType.RW),
81      DHW_A1M1_CYCLES_HEATING_MONDAY(0x2100, Group.DHW_A1M1, CYCLES_HEATING, MONDAY, CYCLE_TIMES, AccessType.RW),
82      DHW_A1M1_CYCLES_HEATING_TUESDAY(0x2108, Group.DHW_A1M1, CYCLES_HEATING, TUESDAY, CYCLE_TIMES, AccessType.RW),
83      DHW_A1M1_CYCLES_HEATING_WEDNSDAY(0x2110, Group.DHW_A1M1, CYCLES_HEATING, WEDNSDAY, CYCLE_TIMES, AccessType.RW),
84      DHW_A1M1_CYCLES_HEATING_THURSDAY(0x2118, Group.DHW_A1M1, CYCLES_HEATING, THURSDAY, CYCLE_TIMES, AccessType.RW),
85      DHW_A1M1_CYCLES_HEATING_FRIDAY(0x2120, Group.DHW_A1M1, CYCLES_HEATING, FRIDAY, CYCLE_TIMES, AccessType.RW),
86      DHW_A1M1_CYCLES_HEATING_SATURDAY(0x2128, Group.DHW_A1M1, CYCLES_HEATING, SATURDAY, CYCLE_TIMES, AccessType.RW),
87      DHW_A1M1_CYCLES_HEATING_SUNDAY(0x2130, Group.DHW_A1M1, CYCLES_HEATING, SUNDAY, CYCLE_TIMES, AccessType.RW),
88      DHW_A1M1_CYCLES_RECIRC_MONDAY(0x2200, Group.DHW_A1M1, CYCLES_RECIRC, MONDAY, CYCLE_TIMES, AccessType.RW),
89      DHW_A1M1_CYCLES_RECIRC_TUESDAY(0x2208, Group.DHW_A1M1, CYCLES_RECIRC, TUESDAY, CYCLE_TIMES, AccessType.RW),
90      DHW_A1M1_CYCLES_RECIRC_WEDNSDAY(0x2210, Group.DHW_A1M1, CYCLES_RECIRC, WEDNSDAY, CYCLE_TIMES, AccessType.RW),
91      DHW_A1M1_CYCLES_RECIRC_THURSDAY(0x2218, Group.DHW_A1M1, CYCLES_RECIRC, THURSDAY, CYCLE_TIMES, AccessType.RW),
92      DHW_A1M1_CYCLES_RECIRC_FRIDAY(0x2220, Group.DHW_A1M1, CYCLES_RECIRC, FRIDAY, CYCLE_TIMES, AccessType.RW),
93      DHW_A1M1_CYCLES_RECIRC_SATURDAY(0x2228, Group.DHW_A1M1, CYCLES_RECIRC, SATURDAY, CYCLE_TIMES, AccessType.RW),
94      DHW_A1M1_CYCLES_RECIRC_SUNDAY(0x2230, Group.DHW_A1M1, CYCLES_RECIRC, SUNDAY, CYCLE_TIMES, AccessType.RW),
95      A1M1_CONFIG_OPERATING_TYPE(0x2301, Group.A1M1, CONFIG, OPERATING_TYPE, BYTE, AccessType.RW),
96      A1M1_STATE_SAVE_MODE(0x2302, Group.A1M1, STATE, SAVE_MODE, BOOL, AccessType.RO),
97      A1M1_STATE_PARTY_MODE(0x2303, Group.A1M1, STATE, PARTY_MODE, BOOL, AccessType.RO),
98      A1M1_CONFIG_SHIFT(0x2304, Group.A1M1, CONFIG, SHIFT, BYTE, AccessType.RW),
99      A1M1_CONFIG_SLOPE(0x2305, Group.A1M1, CONFIG, SLOPE, BYTE, AccessType.RW, 0.1),
100     A1M1_TEMP_NOMINAL_ROOM_NORMAL(0x2306, Group.A1M1, TEMP_NOMINAL, ROOM_NORMAL, BYTE, AccessType.RW),
101     A1M1_TEMP_NOMINAL_ROOM_REDUCED(0x2307, Group.A1M1, TEMP_NOMINAL, ROOM_REDUCED, BYTE, AccessType.RW),
102     A1M1_TEMP_NOMINAL_ROOM_PARTY(0x2308, Group.A1M1, TEMP_NOMINAL, ROOM_PARTY, BYTE, AccessType.RW),
103     A1M1_CONFIG_HOLIDAY_PROGRAMME(0x2309, Group.A1M1, CONFIG, Property.HOLIDAY_PROGRAMME, DataType.HOLIDAY, AccessType.RW),
104     A1M1_STATE_UNKNOWN_AT_0X2500(0x2500, Group.A1M1, STATE, UNKNOWN, BYTE, AccessType.RO),
105     A1M1_STATE_UNKNOWN_AT_0X2501(0x2501, Group.A1M1, STATE, UNKNOWN, BYTE, AccessType.RO),
106     A1M1_CONFIG_HEATUP_TIME(0x2502, Group.A1M1, CONFIG, HEATUP_TIME, INTEGER, AccessType.RO, 0.1),
107     A1M1_STATE_FROST(0x2506, Group.A1M1, STATE, FROST, BOOL, AccessType.RO),
108     A1M1_STATE_UNKNOWN_AT_0X2507(0x2507, Group.A1M1, STATE, UNKNOWN, BYTE, AccessType.RO),
109     A1M1_STATE_DHW_HEATUP(0x2508, Group.A1M1, STATE, DHW_HEATUP, BOOL, AccessType.RO),
110     A1M1_STATE_UNKNOWN_AT_0X2509(0x2509, Group.A1M1, STATE, UNKNOWN, BYTE, AccessType.RO),
111     A1M1_TEMP_NOMINAL_HEATING_SUPPLY(0x2511, Group.A1M1, TEMP_NOMINAL, Property.HEATING_SUPPLY, SHORT, AccessType.RO, 0.1),
112     // NAchtumschaltung?? oder WW??
113     A1M1_STATE_UNKNOWN_AT_0X2535(0x2535, Group.A1M1, STATE, UNKNOWN, BYTE, AccessType.RO), A1M1_STATE_UNKNOWN_AT_0X2541(0x2541, Group.A1M1, STATE, UNKNOWN, BYTE, AccessType.RO),
114     A1M1_STATE_PUMP(0x250a, Group.A1M1, STATE, PUMP, BOOL, AccessType.RO),
115     A1M1_TEMP_NOMINAL_ROOM_CURRENT(0x250c, Group.A1M1, TEMP_NOMINAL, Property.ROOM_CURRENT, SHORT, AccessType.RO, 0.1),
116     A1M1_TEMP_ACTUAL_UNKNOWN_AT_0X250E(0x250e, Group.A1M1, TEMP_ACTUAL, Property.UNKNOWN, SHORT, AccessType.RO, 0.1),
117     A1M1_POSITION_IN_PERCENT_MIXER(0x254c, Group.A1M1, POSITION_IN_PERCENT, MIXER, BYTE, AccessType.RO, 0.5),
118     A1M1_CONFIG_C2_A0(0x27a0, Group.A1M1, CONFIG, C2_A0, BYTE, AccessType.RW),
119     A1M1_CONFIG_C2_A2(0x27a2, Group.A1M1, CONFIG, C2_A2, BYTE, AccessType.RW),
120     A1M1_CONFIG_C2_A3(0x27a3, Group.A1M1, CONFIG, C2_A3, BYTE, AccessType.RW),
121     A1M1_CONFIG_C2_A4(0x27a4, Group.A1M1, CONFIG, C2_A4, BYTE, AccessType.RW),
122     A1M1_CONFIG_C2_A5(0x27a5, Group.A1M1, CONFIG, C2_A5, BYTE, AccessType.RW),
123     A1M1_CONFIG_C2_A6(0x27a6, Group.A1M1, CONFIG, C2_A6, BYTE, AccessType.RW),
124     A1M1_CONFIG_C2_A7(0x27a7, Group.A1M1, CONFIG, C2_A7, BYTE, AccessType.RW),
125     A1M1_CONFIG_C2_A9(0x27a9, Group.A1M1, CONFIG, C2_A9, BYTE, AccessType.RW),
126     A1M1_CONFIG_C2_B0(0x27b0, Group.A1M1, CONFIG, C2_B0, BYTE, AccessType.RW),
127     A1M1_CONFIG_C2_B1(0x27b1, Group.A1M1, CONFIG, C2_B1, BYTE, AccessType.RW),
128     A1M1_CONFIG_C2_B2(0x27b2, Group.A1M1, CONFIG, C2_B2, BYTE, AccessType.RW),
129     A1M1_CONFIG_C2_B3(0x27b3, Group.A1M1, CONFIG, C2_B3, BYTE, AccessType.RW),
130     A1M1_CONFIG_C2_B5(0x27b5, Group.A1M1, CONFIG, C2_B5, BYTE, AccessType.RW),
131     A1M1_CONFIG_C2_B7(0x27b7, Group.A1M1, CONFIG, C2_B7, BYTE, AccessType.RW),
132     A1M1_CONFIG_C2_B8(0x27b8, Group.A1M1, CONFIG, C2_B8, BYTE, AccessType.RW),
133     A1M1_CONFIG_C2_B9(0x27b9, Group.A1M1, CONFIG, C2_B9, BYTE, AccessType.RW),
134     A1M1_CONFIG_C2_C0(0x27c0, Group.A1M1, CONFIG, C2_C0, BYTE, AccessType.RW),
135     A1M1_CONFIG_C2_C1(0x27c1, Group.A1M1, CONFIG, C2_C1, BYTE, AccessType.RW),
136     A1M1_CONFIG_C2_C2(0x27c2, Group.A1M1, CONFIG, C2_C2, BYTE, AccessType.RW),
137     A1M1_CONFIG_C2_C4(0x27c4, Group.A1M1, CONFIG, C2_C4, BYTE, AccessType.RW),
138     A1M1_CONFIG_C2_C5(0x27c5, Group.A1M1, CONFIG, C2_C5, BYTE, AccessType.RW),
139     A1M1_CONFIG_C2_C6(0x27c6, Group.A1M1, CONFIG, C2_C6, BYTE, AccessType.RW),
140     A1M1_CONFIG_C2_C7(0x27c7, Group.A1M1, CONFIG, C2_C7, BYTE, AccessType.RW),
141     A1M1_CONFIG_C2_C8(0x27c8, Group.A1M1, CONFIG, C2_C8, BYTE, AccessType.RW),
142     A1M1_CONFIG_C2_C9(0x27c9, Group.A1M1, CONFIG, C2_C9, BYTE, AccessType.RW),
143     A1M1_CONFIG_C2_E1(0x27e1, Group.A1M1, CONFIG, C2_E1, BYTE, AccessType.RW),
144     A1M1_CONFIG_C2_E2(0x27e2, Group.A1M1, CONFIG, C2_E2, BYTE, AccessType.RW),
145     A1M1_CONFIG_C2_E5(0x27e5, Group.A1M1, CONFIG, C2_E5, BYTE, AccessType.RW),
146     A1M1_CONFIG_C2_E6(0x27e6, Group.A1M1, CONFIG, C2_E6, BYTE, AccessType.RW),
147     A1M1_CONFIG_C2_E7(0x27e7, Group.A1M1, CONFIG, C2_E7, BYTE, AccessType.RW),
148     A1M1_CONFIG_C2_E8(0x27e8, Group.A1M1, CONFIG, C2_E8, BYTE, AccessType.RW),
149     A1M1_CONFIG_C2_E9(0x27e9, Group.A1M1, CONFIG, C2_E9, BYTE, AccessType.RW),
150     A1M1_CONFIG_C2_F0(0x27f0, Group.A1M1, CONFIG, C2_F0, BYTE, AccessType.RW),
151     A1M1_CONFIG_C2_F1(0x27f1, Group.A1M1, CONFIG, C2_F1, BYTE, AccessType.RW),
152     A1M1_CONFIG_C2_F2(0x27f2, Group.A1M1, CONFIG, C2_F2, BYTE, AccessType.RW),
153     A1M1_TEMP_ACTUAL_HEATING_SUPPLY(0x2900, Group.A1M1, TEMP_ACTUAL, HEATING_SUPPLY, SHORT, AccessType.RO, 0.1),
154     A1M1_TEMP_ACTUAL_HEATING_RETURN(0x2902, Group.A1M1, TEMP_ACTUAL, HEATING_RETURN, SHORT, AccessType.RO, 0.1),
155     A1M1_STATE_PUMP_AT_0X2906(0x2906, Group.A1M1, STATE, PUMP, BOOL, AccessType.RO),
156     //M2
157     M2_CYCLES_HEATING_MONDAY(0x3000, Group.M2, CYCLES_HEATING, MONDAY, CYCLE_TIMES, AccessType.RW), M2_CYCLES_HEATING_TUESDAY(0x3008, Group.M2, CYCLES_HEATING, TUESDAY, CYCLE_TIMES, AccessType.RW),
158     M2_CYCLES_HEATING_WEDNSDAY(0x3010, Group.M2, CYCLES_HEATING, WEDNSDAY, CYCLE_TIMES, AccessType.RW),
159     M2_CYCLES_HEATING_THURSDAY(0x3018, Group.M2, CYCLES_HEATING, THURSDAY, CYCLE_TIMES, AccessType.RW),
160     M2_CYCLES_HEATING_FRIDAY(0x3020, Group.M2, CYCLES_HEATING, FRIDAY, CYCLE_TIMES, AccessType.RW),
161     M2_CYCLES_HEATING_SATURDAY(0x3028, Group.M2, CYCLES_HEATING, SATURDAY, CYCLE_TIMES, AccessType.RW),
162     M2_CYCLES_HEATING_SUNDAY(0x3030, Group.M2, CYCLES_HEATING, SUNDAY, CYCLE_TIMES, AccessType.RW),
163     DHW_M2_CYCLES_HEATING_TUESDAY(0x3108, Group.DHW_M2, CYCLES_HEATING, TUESDAY, CYCLE_TIMES, AccessType.RW),
164     DHW_M2_CYCLES_HEATING_WEDNSDAY(0x3110, Group.DHW_M2, CYCLES_HEATING, WEDNSDAY, CYCLE_TIMES, AccessType.RW),
165     DHW_M2_CYCLES_HEATING_THURSDAY(0x3118, Group.DHW_M2, CYCLES_HEATING, THURSDAY, CYCLE_TIMES, AccessType.RW),
166     DHW_M2_CYCLES_HEATING_FRIDAY(0x3120, Group.DHW_M2, CYCLES_HEATING, FRIDAY, CYCLE_TIMES, AccessType.RW),
167     DHW_M2_CYCLES_HEATING_SATURDAY(0x3128, Group.DHW_M2, CYCLES_HEATING, SATURDAY, CYCLE_TIMES, AccessType.RW),
168     DHW_M2_CYCLES_HEATING_SUNDAY(0x3130, Group.DHW_M2, CYCLES_HEATING, SUNDAY, CYCLE_TIMES, AccessType.RW),
169     DHW_M2_CYCLES_RECIRC_MONDAY(0x3200, Group.DHW_M2, CYCLES_RECIRC, MONDAY, CYCLE_TIMES, AccessType.RW),
170     DHW_M2_CYCLES_RECIRC_TUESDAY(0x3208, Group.DHW_M2, CYCLES_RECIRC, TUESDAY, CYCLE_TIMES, AccessType.RW),
171     DHW_M2_CYCLES_RECIRC_WEDNSDAY(0x3210, Group.DHW_M2, CYCLES_RECIRC, WEDNSDAY, CYCLE_TIMES, AccessType.RW),
172     DHW_M2_CYCLES_RECIRC_THURSDAY(0x3218, Group.DHW_M2, CYCLES_RECIRC, THURSDAY, CYCLE_TIMES, AccessType.RW),
173     DHW_M2_CYCLES_RECIRC_FRIDAY(0x3220, Group.DHW_M2, CYCLES_RECIRC, FRIDAY, CYCLE_TIMES, AccessType.RW),
174     DHW_M2_CYCLES_RECIRC_SATURDAY(0x3228, Group.DHW_M2, CYCLES_RECIRC, SATURDAY, CYCLE_TIMES, AccessType.RW),
175     DHW_M2_CYCLES_RECIRC_SUNDAY(0x3230, Group.DHW_M2, CYCLES_RECIRC, SUNDAY, CYCLE_TIMES, AccessType.RW),
176     M2_CONFIG_OPERATING_TYPE(0x3301, Group.M2, CONFIG, OPERATING_TYPE, BYTE, AccessType.RW),
177     M2_STATE_SAVE_MODE(0x3302, Group.M2, STATE, SAVE_MODE, BOOL, AccessType.RO),
178     M2_STATE_PARTY_MODE(0x3303, Group.M2, STATE, PARTY_MODE, BOOL, AccessType.RO),
179     M2_CONFIG_SHIFT(0x3304, Group.M2, CONFIG, SHIFT, BYTE, AccessType.RW),
180     M2_CONFIG_SLOPE(0x3305, Group.M2, CONFIG, SLOPE, BYTE, AccessType.RW, 0.1),
181     M2_TEMP_NOMINAL_ROOM_NORMAL(0x3306, Group.M2, TEMP_NOMINAL, ROOM_NORMAL, BYTE, AccessType.RW),
182     M2_TEMP_NOMINAL_ROOM_REDUCED(0x3307, Group.M2, TEMP_NOMINAL, ROOM_REDUCED, BYTE, AccessType.RW),
183     M2_TEMP_NOMINAL_ROOM_PARTY(0x3308, Group.M2, TEMP_NOMINAL, ROOM_PARTY, BYTE, AccessType.RW),
184     M2_CONFIG_HOLIDAY_PROGRAMME(0x3309, Group.M2, CONFIG, Property.HOLIDAY_PROGRAMME, DataType.HOLIDAY, AccessType.RW),
185     M2_STATE_UNKNOWN_AT_0X3500(0x3500, Group.M2, STATE, UNKNOWN, BYTE, AccessType.RO),
186     M2_STATE_UNKNOWN_AT_0X3501(0x3501, Group.M2, STATE, UNKNOWN, BYTE, AccessType.RO),
187     M2_CONFIG_HEATUP_TIME(0x3502, Group.M2, CONFIG, HEATUP_TIME, INTEGER, AccessType.RO, 0.1),
188     M2_STATE_FROST(0x3506, Group.M2, STATE, FROST, BOOL, AccessType.RO),
189     M2_STATE_UNKNOWN_AT_0X3507(0x3507, Group.M2, STATE, UNKNOWN, BYTE, AccessType.RO),
190     M2_STATE_DHW_HEATUP(0x3508, Group.M2, STATE, DHW_HEATUP, BOOL, AccessType.RO),
191     M2_STATE_UNKNOWN_AT_0X3509(0x3509, Group.M2, STATE, UNKNOWN, BYTE, AccessType.RO),
192     M2_TEMP_NOMINAL_HEATING_SUPPLY(0x3511, Group.M2, TEMP_NOMINAL, Property.HEATING_SUPPLY, SHORT, AccessType.RO, 0.1),
193     // NAchtumschaltung?? oder WW??
194     M2_STATE_UNKNOWN_AT_0X3535(0x3535, Group.M2, STATE, UNKNOWN, BYTE, AccessType.RO), M2_STATE_UNKNOWN_AT_0X3541(0x3541, Group.M2, STATE, UNKNOWN, BYTE, AccessType.RO),
195     M2_STATE_PUMP(0x350a, Group.M2, STATE, PUMP, BOOL, AccessType.RO),
196     M2_TEMP_NOMINAL_ROOM_CURRENT(0x350c, Group.M2, TEMP_NOMINAL, Property.ROOM_CURRENT, SHORT, AccessType.RO, 0.1),
197     M2_TEMP_ACTUAL_UNKNOWN_AT_0X350E(0x350e, Group.M2, TEMP_ACTUAL, Property.UNKNOWN, SHORT, AccessType.RO, 0.1),
198     M2_POSITION_IN_PERCENT_MIXER(0x354c, Group.M2, POSITION_IN_PERCENT, MIXER, BYTE, AccessType.RO, 0.5),
199     M2_CONFIG_C2_A0(0x37a0, Group.M2, CONFIG, C2_A0, BYTE, AccessType.RW),
200     M2_CONFIG_C2_A2(0x37a2, Group.M2, CONFIG, C2_A2, BYTE, AccessType.RW),
201     M2_CONFIG_C2_A3(0x37a3, Group.M2, CONFIG, C2_A3, BYTE, AccessType.RW),
202     M2_CONFIG_C2_A4(0x37a4, Group.M2, CONFIG, C2_A4, BYTE, AccessType.RW),
203     M2_CONFIG_C2_A5(0x37a5, Group.M2, CONFIG, C2_A5, BYTE, AccessType.RW),
204     M2_CONFIG_C2_A6(0x37a6, Group.M2, CONFIG, C2_A6, BYTE, AccessType.RW),
205     M2_CONFIG_C2_A7(0x37a7, Group.M2, CONFIG, C2_A7, BYTE, AccessType.RW),
206     M2_CONFIG_C2_A9(0x37a9, Group.M2, CONFIG, C2_A9, BYTE, AccessType.RW),
207     M2_CONFIG_C2_B0(0x37b0, Group.M2, CONFIG, C2_B0, BYTE, AccessType.RW),
208     M2_CONFIG_C2_B1(0x37b1, Group.M2, CONFIG, C2_B1, BYTE, AccessType.RW),
209     M2_CONFIG_C2_B2(0x37b2, Group.M2, CONFIG, C2_B2, BYTE, AccessType.RW),
210     M2_CONFIG_C2_B3(0x37b3, Group.M2, CONFIG, C2_B3, BYTE, AccessType.RW),
211     M2_CONFIG_C2_B5(0x37b5, Group.M2, CONFIG, C2_B5, BYTE, AccessType.RW),
212     M2_CONFIG_C2_B7(0x37b7, Group.M2, CONFIG, C2_B7, BYTE, AccessType.RW),
213     M2_CONFIG_C2_B8(0x37b8, Group.M2, CONFIG, C2_B8, BYTE, AccessType.RW),
214     M2_CONFIG_C2_B9(0x37b9, Group.M2, CONFIG, C2_B9, BYTE, AccessType.RW),
215     M2_CONFIG_C2_C0(0x37c0, Group.M2, CONFIG, C2_C0, BYTE, AccessType.RW),
216     M2_CONFIG_C2_C1(0x37c1, Group.M2, CONFIG, C2_C1, BYTE, AccessType.RW),
217     M2_CONFIG_C2_C2(0x37c2, Group.M2, CONFIG, C2_C2, BYTE, AccessType.RW),
218     M2_CONFIG_C2_C4(0x37c4, Group.M2, CONFIG, C2_C4, BYTE, AccessType.RW),
219     M2_CONFIG_C2_C5(0x37c5, Group.M2, CONFIG, C2_C5, BYTE, AccessType.RW),
220     M2_CONFIG_C2_C6(0x37c6, Group.M2, CONFIG, C2_C6, BYTE, AccessType.RW),
221     M2_CONFIG_C2_C7(0x37c7, Group.M2, CONFIG, C2_C7, BYTE, AccessType.RW),
222     M2_CONFIG_C2_C8(0x37c8, Group.M2, CONFIG, C2_C8, BYTE, AccessType.RW),
223     M2_CONFIG_C2_C9(0x37c9, Group.M2, CONFIG, C2_C9, BYTE, AccessType.RW),
224     M2_CONFIG_C2_E1(0x37e1, Group.M2, CONFIG, C2_E1, BYTE, AccessType.RW),
225     M2_CONFIG_C2_E2(0x37e2, Group.M2, CONFIG, C2_E2, BYTE, AccessType.RW),
226     M2_CONFIG_C2_E5(0x37e5, Group.M2, CONFIG, C2_E5, BYTE, AccessType.RW),
227     M2_CONFIG_C2_E6(0x37e6, Group.M2, CONFIG, C2_E6, BYTE, AccessType.RW),
228     M2_CONFIG_C2_E7(0x37e7, Group.M2, CONFIG, C2_E7, BYTE, AccessType.RW),
229     M2_CONFIG_C2_E8(0x37e8, Group.M2, CONFIG, C2_E8, BYTE, AccessType.RW),
230     M2_CONFIG_C2_E9(0x37e9, Group.M2, CONFIG, C2_E9, BYTE, AccessType.RW),
231     M2_CONFIG_C2_F0(0x37f0, Group.M2, CONFIG, C2_F0, BYTE, AccessType.RW),
232     M2_CONFIG_C2_F1(0x37f1, Group.M2, CONFIG, C2_F1, BYTE, AccessType.RW),
233     M2_CONFIG_C2_F2(0x37f2, Group.M2, CONFIG, C2_F2, BYTE, AccessType.RW),
234     M2_TEMP_ACTUAL_HEATING_SUPPLY(0x3900, Group.M2, TEMP_ACTUAL, HEATING_SUPPLY, SHORT, AccessType.RO, 0.1),
235     M2_TEMP_ACTUAL_HEATING_RETURN(0x3902, Group.M2, TEMP_ACTUAL, HEATING_RETURN, SHORT, AccessType.RO, 0.1),
236     M2_STATE_PUMP_AT_0X3906(0x3906, Group.M2, STATE, PUMP, BOOL, AccessType.RO),
237     //M3
238     M3_CYCLES_HEATING_MONDAY(0x4000, Group.M3, CYCLES_HEATING, MONDAY, CYCLE_TIMES, AccessType.RW), M3_CYCLES_HEATING_TUESDAY(0x4008, Group.M3, CYCLES_HEATING, TUESDAY, CYCLE_TIMES, AccessType.RW),
239     M3_CYCLES_HEATING_WEDNSDAY(0x4010, Group.M3, CYCLES_HEATING, WEDNSDAY, CYCLE_TIMES, AccessType.RW),
240     M3_CYCLES_HEATING_THURSDAY(0x4018, Group.M3, CYCLES_HEATING, THURSDAY, CYCLE_TIMES, AccessType.RW),
241     M3_CYCLES_HEATING_FRIDAY(0x4020, Group.M3, CYCLES_HEATING, FRIDAY, CYCLE_TIMES, AccessType.RW),
242     M3_CYCLES_HEATING_SATURDAY(0x4028, Group.M3, CYCLES_HEATING, SATURDAY, CYCLE_TIMES, AccessType.RW),
243     M3_CYCLES_HEATING_SUNDAY(0x4030, Group.M3, CYCLES_HEATING, SUNDAY, CYCLE_TIMES, AccessType.RW),
244     DHW_M3_CYCLES_HEATING_TUESDAY(0x4108, Group.DHW_M3, CYCLES_HEATING, TUESDAY, CYCLE_TIMES, AccessType.RW),
245     DHW_M3_CYCLES_HEATING_WEDNSDAY(0x4110, Group.DHW_M3, CYCLES_HEATING, WEDNSDAY, CYCLE_TIMES, AccessType.RW),
246     DHW_M3_CYCLES_HEATING_THURSDAY(0x4118, Group.DHW_M3, CYCLES_HEATING, THURSDAY, CYCLE_TIMES, AccessType.RW),
247     DHW_M3_CYCLES_HEATING_FRIDAY(0x4120, Group.DHW_M3, CYCLES_HEATING, FRIDAY, CYCLE_TIMES, AccessType.RW),
248     DHW_M3_CYCLES_HEATING_SATURDAY(0x4128, Group.DHW_M3, CYCLES_HEATING, SATURDAY, CYCLE_TIMES, AccessType.RW),
249     DHW_M3_CYCLES_HEATING_SUNDAY(0x4130, Group.DHW_M3, CYCLES_HEATING, SUNDAY, CYCLE_TIMES, AccessType.RW),
250     DHW_M3_CYCLES_RECIRC_MONDAY(0x4200, Group.DHW_M3, CYCLES_RECIRC, MONDAY, CYCLE_TIMES, AccessType.RW),
251     DHW_M3_CYCLES_RECIRC_TUESDAY(0x4208, Group.DHW_M3, CYCLES_RECIRC, TUESDAY, CYCLE_TIMES, AccessType.RW),
252     DHW_M3_CYCLES_RECIRC_WEDNSDAY(0x4210, Group.DHW_M3, CYCLES_RECIRC, WEDNSDAY, CYCLE_TIMES, AccessType.RW),
253     DHW_M3_CYCLES_RECIRC_THURSDAY(0x4218, Group.DHW_M3, CYCLES_RECIRC, THURSDAY, CYCLE_TIMES, AccessType.RW),
254     DHW_M3_CYCLES_RECIRC_FRIDAY(0x4220, Group.DHW_M3, CYCLES_RECIRC, FRIDAY, CYCLE_TIMES, AccessType.RW),
255     DHW_M3_CYCLES_RECIRC_SATURDAY(0x4228, Group.DHW_M3, CYCLES_RECIRC, SATURDAY, CYCLE_TIMES, AccessType.RW),
256     DHW_M3_CYCLES_RECIRC_SUNDAY(0x4230, Group.DHW_M3, CYCLES_RECIRC, SUNDAY, CYCLE_TIMES, AccessType.RW),
257     M3_CONFIG_OPERATING_TYPE(0x4301, Group.M3, CONFIG, OPERATING_TYPE, BYTE, AccessType.RW),
258     M3_STATE_SAVE_MODE(0x4302, Group.M3, STATE, SAVE_MODE, BOOL, AccessType.RO),
259     M3_STATE_PARTY_MODE(0x4303, Group.M3, STATE, PARTY_MODE, BOOL, AccessType.RO),
260     M3_CONFIG_SHIFT(0x4304, Group.M3, CONFIG, SHIFT, BYTE, AccessType.RW),
261     M3_CONFIG_SLOPE(0x4305, Group.M3, CONFIG, SLOPE, BYTE, AccessType.RW, 0.1),
262     M3_TEMP_NOMINAL_ROOM_NORMAL(0x4306, Group.M3, TEMP_NOMINAL, ROOM_NORMAL, BYTE, AccessType.RW),
263     M3_TEMP_NOMINAL_ROOM_REDUCED(0x4307, Group.M3, TEMP_NOMINAL, ROOM_REDUCED, BYTE, AccessType.RW),
264     M3_TEMP_NOMINAL_ROOM_PARTY(0x4308, Group.M3, TEMP_NOMINAL, ROOM_PARTY, BYTE, AccessType.RW),
265     M3_CONFIG_HOLIDAY_PROGRAMME(0x4309, Group.M3, CONFIG, Property.HOLIDAY_PROGRAMME, DataType.HOLIDAY, AccessType.RW),
266     M3_STATE_UNKNOWN_AT_0X4500(0x4500, Group.M3, STATE, UNKNOWN, BYTE, AccessType.RO),
267     M3_STATE_UNKNOWN_AT_0X4501(0x4501, Group.M3, STATE, UNKNOWN, BYTE, AccessType.RO),
268     M3_CONFIG_HEATUP_TIME(0x4502, Group.M3, CONFIG, HEATUP_TIME, INTEGER, AccessType.RO, 0.1),
269     M3_STATE_FROST(0x4506, Group.M3, STATE, FROST, BOOL, AccessType.RO),
270     M3_STATE_UNKNOWN_AT_0X4507(0x4507, Group.M3, STATE, UNKNOWN, BYTE, AccessType.RO),
271     M3_STATE_DHW_HEATUP(0x4508, Group.M3, STATE, DHW_HEATUP, BOOL, AccessType.RO),
272     M3_STATE_UNKNOWN_AT_0X4509(0x4509, Group.M3, STATE, UNKNOWN, BYTE, AccessType.RO),
273     M3_TEMP_NOMINAL_HEATING_SUPPLY(0x4511, Group.M3, TEMP_NOMINAL, Property.HEATING_SUPPLY, SHORT, AccessType.RO, 0.1),
274     // NAchtumschaltung?? oder WW??
275     M3_STATE_UNKNOWN_AT_0X4535(0x4535, Group.M3, STATE, UNKNOWN, BYTE, AccessType.RO), M3_STATE_UNKNOWN_AT_0X4541(0x4541, Group.M3, STATE, UNKNOWN, BYTE, AccessType.RO),
276     M3_STATE_PUMP(0x450a, Group.M3, STATE, PUMP, BOOL, AccessType.RO),
277     M3_TEMP_NOMINAL_ROOM_CURRENT(0x450c, Group.M3, TEMP_NOMINAL, Property.ROOM_CURRENT, SHORT, AccessType.RO, 0.1),
278     M3_TEMP_ACTUAL_UNKNOWN_AT_0X450E(0x450e, Group.M3, TEMP_ACTUAL, Property.UNKNOWN, SHORT, AccessType.RO, 0.1),
279     M3_POSITION_IN_PERCENT_MIXER(0x454c, Group.M3, POSITION_IN_PERCENT, MIXER, BYTE, AccessType.RO, 0.5),
280     M3_CONFIG_C2_A0(0x47a0, Group.M3, CONFIG, C2_A0, BYTE, AccessType.RW),
281     M3_CONFIG_C2_A2(0x47a2, Group.M3, CONFIG, C2_A2, BYTE, AccessType.RW),
282     M3_CONFIG_C2_A3(0x47a3, Group.M3, CONFIG, C2_A3, BYTE, AccessType.RW),
283     M3_CONFIG_C2_A4(0x47a4, Group.M3, CONFIG, C2_A4, BYTE, AccessType.RW),
284     M3_CONFIG_C2_A5(0x47a5, Group.M3, CONFIG, C2_A5, BYTE, AccessType.RW),
285     M3_CONFIG_C2_A6(0x47a6, Group.M3, CONFIG, C2_A6, BYTE, AccessType.RW),
286     M3_CONFIG_C2_A7(0x47a7, Group.M3, CONFIG, C2_A7, BYTE, AccessType.RW),
287     M3_CONFIG_C2_A9(0x47a9, Group.M3, CONFIG, C2_A9, BYTE, AccessType.RW),
288     M3_CONFIG_C2_B0(0x47b0, Group.M3, CONFIG, C2_B0, BYTE, AccessType.RW),
289     M3_CONFIG_C2_B1(0x47b1, Group.M3, CONFIG, C2_B1, BYTE, AccessType.RW),
290     M3_CONFIG_C2_B2(0x47b2, Group.M3, CONFIG, C2_B2, BYTE, AccessType.RW),
291     M3_CONFIG_C2_B3(0x47b3, Group.M3, CONFIG, C2_B3, BYTE, AccessType.RW),
292     M3_CONFIG_C2_B5(0x47b5, Group.M3, CONFIG, C2_B5, BYTE, AccessType.RW),
293     M3_CONFIG_C2_B7(0x47b7, Group.M3, CONFIG, C2_B7, BYTE, AccessType.RW),
294     M3_CONFIG_C2_B8(0x47b8, Group.M3, CONFIG, C2_B8, BYTE, AccessType.RW),
295     M3_CONFIG_C2_B9(0x47b9, Group.M3, CONFIG, C2_B9, BYTE, AccessType.RW),
296     M3_CONFIG_C2_C0(0x47c0, Group.M3, CONFIG, C2_C0, BYTE, AccessType.RW),
297     M3_CONFIG_C2_C1(0x47c1, Group.M3, CONFIG, C2_C1, BYTE, AccessType.RW),
298     M3_CONFIG_C2_C2(0x47c2, Group.M3, CONFIG, C2_C2, BYTE, AccessType.RW),
299     M3_CONFIG_C2_C4(0x47c4, Group.M3, CONFIG, C2_C4, BYTE, AccessType.RW),
300     M3_CONFIG_C2_C5(0x47c5, Group.M3, CONFIG, C2_C5, BYTE, AccessType.RW),
301     M3_CONFIG_C2_C6(0x47c6, Group.M3, CONFIG, C2_C6, BYTE, AccessType.RW),
302     M3_CONFIG_C2_C7(0x47c7, Group.M3, CONFIG, C2_C7, BYTE, AccessType.RW),
303     M3_CONFIG_C2_C8(0x47c8, Group.M3, CONFIG, C2_C8, BYTE, AccessType.RW),
304     M3_CONFIG_C2_C9(0x47c9, Group.M3, CONFIG, C2_C9, BYTE, AccessType.RW),
305     M3_CONFIG_C2_E1(0x47e1, Group.M3, CONFIG, C2_E1, BYTE, AccessType.RW),
306     M3_CONFIG_C2_E2(0x47e2, Group.M3, CONFIG, C2_E2, BYTE, AccessType.RW),
307     M3_CONFIG_C2_E5(0x47e5, Group.M3, CONFIG, C2_E5, BYTE, AccessType.RW),
308     M3_CONFIG_C2_E6(0x47e6, Group.M3, CONFIG, C2_E6, BYTE, AccessType.RW),
309     M3_CONFIG_C2_E7(0x47e7, Group.M3, CONFIG, C2_E7, BYTE, AccessType.RW),
310     M3_CONFIG_C2_E8(0x47e8, Group.M3, CONFIG, C2_E8, BYTE, AccessType.RW),
311     M3_CONFIG_C2_E9(0x47e9, Group.M3, CONFIG, C2_E9, BYTE, AccessType.RW),
312     M3_CONFIG_C2_F0(0x47f0, Group.M3, CONFIG, C2_F0, BYTE, AccessType.RW),
313     M3_CONFIG_C2_F1(0x47f1, Group.M3, CONFIG, C2_F1, BYTE, AccessType.RW),
314     M3_CONFIG_C2_F2(0x47f2, Group.M3, CONFIG, C2_F2, BYTE, AccessType.RW),
315     M3_TEMP_ACTUAL_HEATING_SUPPLY(0x4900, Group.M3, TEMP_ACTUAL, HEATING_SUPPLY, SHORT, AccessType.RO, 0.1),
316     M3_TEMP_ACTUAL_HEATING_RETURN(0x4902, Group.M3, TEMP_ACTUAL, HEATING_RETURN, SHORT, AccessType.RO, 0.1),
317     M3_STATE_PUMP_AT_0X4906(0x4906, Group.M3, STATE, PUMP, BOOL, AccessType.RO),
318     BOILER_TEMP_ACTUAL_BOILER_WATER(0x5500, Group.BOILER, TEMP_ACTUAL, Property.BOILER_WATER, SHORT, AccessType.RO, 0.1),
319     BOILER_TEMP_NOMINAL_BOILER_WATER(0x5502, Group.BOILER, TEMP_NOMINAL, Property.BOILER_WATER, SHORT, AccessType.RO, 0.1),
320     BOILER_TEMP_NOMINAL_BOILER_WATER_HYSTERERSIS_LOW_FIX(0x5504, Group.BOILER, TEMP_NOMINAL, Property.BOILER_WATER_HYSTERERSIS_LOW_FIX, SHORT, AccessType.RO, 0.1),
321     BOILER_TEMP_NOMINAL_BOILER_WATER_HYSTERERSIS_UPPER_FIX(0x5506, Group.BOILER, TEMP_NOMINAL, Property.BOILER_WATER_HYSTERERSIS_UPPER_FIX, SHORT, AccessType.RO, 0.1),
322     BOILER_TEMP_NOMINAL_BOILER_WATER_HYSTERERSIS_UPPER_VARIABLE(0x5508, Group.BOILER, TEMP_NOMINAL, Property.BOILER_WATER_HYSTERERSIS_UPPER_VARIABLE, SHORT, AccessType.RO, 0.1),
323     BOILER_POSITION_IN_PERCENT_THROTTLE_VALVE(0x5555, Group.BOILER, POSITION_IN_PERCENT, Property.THROTTLE_VALVE, SHORT, AccessType.RO, 0.5),
324     BOILER_STATE_BURNER_STAGES(0x551e, Group.BOILER, STATE, Property.BURNER_STAGES, BYTE, AccessType.RO),
325     BOILER_STATE_UNKNOWN_AT_0X551F(0x551f, Group.BOILER, STATE, UNKNOWN, BYTE, AccessType.RO),
326     BOILER_POWER_IN_PERCENT_BURNER(0x55e3, Group.BOILER, POWER_IN_PERCENT, Property.BURNER, SHORT, AccessType.RO, 0.5),
327     //??     TEMP_BOILER_NOMINAL(0x555a, Group.BOILER, TEMP_NOMINAL, ProtocolValue.BOILER, SHORT, 0.1),
328 
329     //??     BOILER_TEMP_HEATING_SUPPLY_NOMINAL(0x5600, Group.BOILER, TEMP_NOMINAL, HEATING_SUPPLY, SHORT, 0.1),
330     //??     BOILER_TEMP_HEATING_RETURN_NOMINAL(0x56a0, Group.BOILER, TEMP_NOMINAL, HEATING_RETURN, SHORT, 0.1);
331     BOILER_CONFIG_C2_02(0x5702, Group.BOILER, CONFIG, Property.C2_02, BYTE, AccessType.RW), BOILER_CONFIG_C2_03(0x5703, Group.BOILER, CONFIG, C2_03, BYTE, AccessType.RW),
332     BOILER_CONFIG_C2_04(0x5704, Group.BOILER, CONFIG, C2_04, BYTE, AccessType.RW),
333     BOILER_CONFIG_C2_05(0x5705, Group.BOILER, CONFIG, C2_05, BYTE, AccessType.RW),
334     BOILER_CONFIG_C2_06(0x5706, Group.BOILER, CONFIG, C2_06, BYTE, AccessType.RW),
335     BOILER_CONFIG_C2_13(0x5713, Group.BOILER, CONFIG, C2_13, BYTE, AccessType.RW),
336     BOILER_CONFIG_C2_1F(0x571f, Group.BOILER, CONFIG, C2_1F, BYTE, AccessType.RW),
337     BOILER_CONFIG_C2_21(0x5721, Group.BOILER, CONFIG, C2_21, SHORT, AccessType.RW),
338     BOILER_CONFIG_C2_23(0x5723, Group.BOILER, CONFIG, C2_23, BYTE, AccessType.RW),
339     BOILER_CONFIG_C2_24(0x5724, Group.BOILER, CONFIG, C2_24, BYTE, AccessType.RW),
340     BOILER_CONFIG_C2_26(0x5726, Group.BOILER, CONFIG, C2_26, SHORT, AccessType.RW),
341     BOILER_CONFIG_C2_28(0x5728, Group.BOILER, CONFIG, C2_28, BYTE, AccessType.RW),
342     BOILER_CONFIG_C2_29(0x5729, Group.BOILER, CONFIG, C2_29, SHORT, AccessType.RW),
343     BOILER_CONFIG_C2_32(0x5732, Group.BOILER, CONFIG, C2_32, BYTE, AccessType.RW),
344     BOILER_CONFIG_C2_33(0x5733, Group.BOILER, CONFIG, C2_33, BYTE, AccessType.RW),
345     //BURNER 2 stages
346     BOILER_CONFIG_C2_10(0x5710, Group.BOILER, CONFIG, C2_10, BYTE, AccessType.RW), BOILER_CONFIG_C2_11(0x5711, Group.BOILER, CONFIG, C2_11, BYTE, AccessType.RW),
347     BOILER_CONFIG_C2_12(0x5712, Group.BOILER, CONFIG, C2_12, BYTE, AccessType.RW),
348     //BURNER Modulated
349     BOILER_CONFIG_C2_15(0x5715, Group.BOILER, CONFIG, C2_15, BYTE, AccessType.RW), BOILER_CONFIG_C2_16(0x5716, Group.BOILER, CONFIG, C2_16, BYTE, AccessType.RW),
350     BOILER_CONFIG_C2_17(0x5717, Group.BOILER, CONFIG, C2_17, BYTE, AccessType.RW),
351     BOILER_CONFIG_C2_18(0x5718, Group.BOILER, CONFIG, C2_18, SHORT, AccessType.RW),
352     BOILER_CONFIG_C2_1A(0x571a, Group.BOILER, CONFIG, C2_1A, BYTE, AccessType.RW),
353     //TODO ????
354     DHW_TEMP_NOMINAL_DHW_CYLINDER(0x6300, Group.DHW, TEMP_NOMINAL, DHW_CYLINDER, BYTE, AccessType.RW), SOLAR_STATE_NACHLADEUNTERDRUECKUNG(0x6551, Group.SOLAR, STATE, NACHLADEUNTERDRUECKUNG, BOOL, AccessType.RO),
355     SOLAR_STATE_PUMP(0x6552, Group.SOLAR, STATE, PUMP, BOOL, AccessType.RO, 0.1),
356     SOLAR_ENERGY_KWH_COLLECTOR(0x6560, Group.SOLAR, ENERGY_KWH, COLLECTOR, INTEGER, AccessType.RO),
357     SOLAR_TEMP_ACTUAL_COLLECTOR(0x6564, Group.SOLAR, TEMP_ACTUAL, COLLECTOR, SHORT, AccessType.RO, 0.1),
358     SOLAR_TEMP_ACTUAL_DHW_CYLINDER(0x6566, Group.SOLAR, TEMP_ACTUAL, DHW_CYLINDER, SHORT, AccessType.RO, 0.1),
359     SOLAR_OPERATING_TIME_H_COLLECTOR(0x6568, Group.SOLAR, OPERATING_TIME_H, COLLECTOR, SHORT, AccessType.RO),
360     DHW_CONFIG_C2_55(0x6755, Group.DHW, CONFIG, C2_55, BYTE, AccessType.RW),
361     DHW_CONFIG_C2_56(0x6756, Group.DHW, CONFIG, C2_56, BYTE, AccessType.RW),
362     DHW_CONFIG_C2_58(0x6758, Group.DHW, CONFIG, C2_58, BYTE, AccessType.RW),
363     DHW_CONFIG_C2_59(0x6759, Group.DHW, CONFIG, C2_59, BYTE, AccessType.RW),
364     DHW_CONFIG_C2_60(0x6760, Group.DHW, CONFIG, C2_60, BYTE, AccessType.RW),
365     DHW_CONFIG_C2_61(0x6761, Group.DHW, CONFIG, C2_61, BYTE, AccessType.RW),
366     DHW_CONFIG_C2_62(0x6762, Group.DHW, CONFIG, C2_62, BYTE, AccessType.RW),
367     DHW_CONFIG_C2_64(0x6764, Group.DHW, CONFIG, C2_64, BYTE, AccessType.RW),
368     DHW_CONFIG_C2_66(0x6766, Group.DHW, CONFIG, C2_66, BYTE, AccessType.RW),
369     DHW_CONFIG_C2_70(0x6770, Group.DHW, CONFIG, C2_70, BYTE, AccessType.RW),
370     DHW_CONFIG_C2_71(0x6771, Group.DHW, CONFIG, C2_71, BYTE, AccessType.RW),
371     DHW_CONFIG_C2_72(0x6772, Group.DHW, CONFIG, C2_72, BYTE, AccessType.RW),
372     DHW_CONFIG_C2_73(0x6773, Group.DHW, CONFIG, C2_73, BYTE, AccessType.RW),
373     DHW_CONFIG_C2_74(0x6774, Group.DHW, CONFIG, C2_74, BYTE, AccessType.RW),
374     DHW_CONFIG_C2_75(0x6775, Group.DHW, CONFIG, C2_75, BYTE, AccessType.RW),
375     COMMON_ERROR_ERROR_1(0x7507, Group.COMMON, ERROR, Property.ERROR_1, ERROR_LIST_ENTRY, AccessType.RO),
376     COMMON_ERROR_ERROR_2(0x7510, Group.COMMON, ERROR, Property.ERROR_2, ERROR_LIST_ENTRY, AccessType.RO),
377     COMMON_ERROR_ERROR_3(0x7519, Group.COMMON, ERROR, Property.ERROR_3, ERROR_LIST_ENTRY, AccessType.RO),
378     COMMON_ERROR_ERROR_4(0x7522, Group.COMMON, ERROR, Property.ERROR_4, ERROR_LIST_ENTRY, AccessType.RO),
379     COMMON_ERROR_ERROR_5(0x752b, Group.COMMON, ERROR, Property.ERROR_5, ERROR_LIST_ENTRY, AccessType.RO),
380     COMMON_ERROR_ERROR_6(0x7534, Group.COMMON, ERROR, Property.ERROR_6, ERROR_LIST_ENTRY, AccessType.RO),
381     COMMON_ERROR_ERROR_7(0x753d, Group.COMMON, ERROR, Property.ERROR_7, ERROR_LIST_ENTRY, AccessType.RO),
382     COMMON_ERROR_ERROR_8(0x7546, Group.COMMON, ERROR, Property.ERROR_8, ERROR_LIST_ENTRY, AccessType.RO),
383     COMMON_ERROR_ERROR_9(0x754f, Group.COMMON, ERROR, Property.ERROR_9, ERROR_LIST_ENTRY, AccessType.RO),
384     COMMON_ERROR_ERROR_10(0x7558, Group.COMMON, ERROR, Property.ERROR_10, ERROR_LIST_ENTRY, AccessType.RO),
385     BOILER_CONSUPTION_BURNER(0x7574, Group.BOILER, CONSUPTION, Property.BURNER, INTEGER, AccessType.RO, 0.0001),
386     COMMON_ERROR_STATUS_ERROR(0x7579, Group.COMMON, ERROR, Property.STATUS_ERROR, BOOL, AccessType.RO),
387     BOILER_POWER_IN_PERCENT_INTERNAL_PUMP(0x7660, Group.BOILER, POWER_IN_PERCENT, INTERNAL_PUMP, SHORT, AccessType.RO),
388     COMMON_CONFIG_C2_7F(0x777f, Group.COMMON, CONFIG, C2_7F, BYTE, AccessType.RW),
389     COMMON_CONFIG_C2_80(0x7780, Group.COMMON, CONFIG, C2_80, BYTE, AccessType.RW),
390     COMMON_CONFIG_C2_81(0x7781, Group.COMMON, CONFIG, C2_81, BYTE, AccessType.RW),
391     COMMON_CONFIG_C2_82(0x7782, Group.COMMON, CONFIG, C2_82, BYTE, AccessType.RW),
392     COMMON_CONFIG_C2_83(0x7783, Group.COMMON, CONFIG, C2_83, BYTE, AccessType.RW),
393     COMMON_CONFIG_C2_84(0x7784, Group.COMMON, CONFIG, C2_84, BYTE, AccessType.RW),
394     COMMON_CONFIG_C2_85(0x7785, Group.COMMON, CONFIG, C2_85, BYTE, AccessType.RW),
395     COMMON_CONFIG_C2_86(0x7786, Group.COMMON, CONFIG, C2_86, BYTE, AccessType.RW),
396     COMMON_CONFIG_C2_87(0x7787, Group.COMMON, CONFIG, C2_87, BYTE, AccessType.RW),
397     COMMON_CONFIG_C2_89(0x7789, Group.COMMON, CONFIG, C2_89, BYTE, AccessType.RW),
398     COMMON_CONFIG_C2_8A(0x778a, Group.COMMON, CONFIG, C2_8A, UBYTE, AccessType.RW),
399     COMMON_CONFIG_C2_8E(0x778e, Group.COMMON, CONFIG, C2_8E, BYTE, AccessType.RW),
400     COMMON_CONFIG_C2_90(0x7790, Group.COMMON, CONFIG, C2_90, UBYTE, AccessType.RW),
401     COMMON_CONFIG_C2_93(0x7793, Group.COMMON, CONFIG, C2_93, BYTE, AccessType.RW),
402     COMMON_CONFIG_C2_94(0x7794, Group.COMMON, CONFIG, C2_94, BYTE, AccessType.RW),
403     COMMON_CONFIG_C2_95(0x7795, Group.COMMON, CONFIG, C2_95, BYTE, AccessType.RW);
404 
405     /*
406     Aus Haustechnik....
407     Vito_Data_V333F_BP 'VScotHO1 addresses for V333F_BP
408     Temp_Aussen = &H5525 '1 OK
409     Temp_Aussen_Gedämpft = &H5527 '2 ok
410     Temp_WW = &H812 '3 ok
411     Temp_WW_Soll = &H6300 '4 ??
412     Temp_Kessel_Soll = &H555A '5 ok A226
413     Temp_Kessel = &H802 '6 ok
414     Temp_VL_Soll = &H2544 '7 A1M1 ok
415     Temp_VL = &H2900 '8 A1M1 ok
416     Temp_Tag = &H2306 '9 ??
417     Temp_Nacht = &H2307 '10 ??
418     Temp_Raum_Soll = &HA406 '11 ?? H250C
419     Brenner_Stunden = &H8A7 '12 ?? H886
420     Brenner_Starts = &H88A '13 OK
421     Pump = &H7660 '14 ??
422     Leistung = &HA38F '15 ??
423     Betriebsart = &H2301 '16 A1M1 ok
424     Party = &H2303 '17 A1M1 ok
425     Spar = &H2302 '18 A1M1 ok
426     Extern_Sperr = &H8A1 '19 ?? HA81 si
427     Extern_Anfordern = &HA80 '20 ?? HA80
428     Sammelstoerung = &H883 '21 ??´0A83? H847? FehlerHA82?
429     ZirkuPump = &H6515 '22 H846 Speicherladepumpe
430     Temp_RL = &H808 '23 80A geä.
431     SysTime = &H88E '24 Uhrzeit
432     Temp_WW_Ausl = &H814 '25 ?? Klären
433     Mischer = &H254C '26
434     SpeicherLP = &H6513 '27 &H845
435     Temp_Abgas = &H816 '28
436     Errorlist = &H7507 '29 klären
437     Brenner_Ein = &H55D3 '30 Brenner ???
438     Umschaltventil = &HA10 '31
439     Drosselklappe = &H5555 '32
440      */
441     //    ab 7700 Codierung 2 ??
442     //    Codierung 82 - 87 liegt auf 2 bis 7
443     //0x2000 to 0x2fff
444     //0x3000 to 0x3fff
445     //0x4000 to 0x4fff
446     //0x5000 to 0x5fff
447     //0x6000 to 0x6fff
448     //0x7000 to 0x7fff
449     //0x8000 to 0x8fff
450     //0x9000 to 0x9fff
451     //0xa000 to 0xafff
452     //0xb000 to 0xbfff
453     //0xc000 to 0xcfff
454     //0xd000 to 0xdfff
455     //0xe000 to 0xefff
456     //0xf000 to 0xffff
457     public static final int[] BLOCKS_16 = { // GWG
458 
459         0x0000, 0x0010, 0x0020, 0x0030, 0x0040, 0x0050, 0x0060, 0x0070, 0x0080, 0x0090, 0x00a0, 0x00b0, 0x00c0, 0x00d0, 0x00e0, 0x00f0, 0x0200, 0x0210, 0x0220, // KW Boiler| DHW
460         0x0800, 0x0810, 0x0820, 0x0830, 0x0840, 0x0850, 0x0860, 0x0870, 0x0880, 0x0890, 0x08a0, 0x08b0, 0x08e0, 0x08f0, // Unknown
461         0x0900, 0x0910, // Unknown
462         0x1000, 0x1010, 0x1020, 0x1030, 0x1040, 0x1050, 0x1060, 0x1070, 0x1080, 0x1090, // A1M1
463         0x2000, 0x2010, 0x2020, 0x2030, 0x2100, 0x2110, 0x2120, 0x2130, // A1M1
464         0x2200, 0x2210, 0x2220, 0x2230, // A1M1
465         0x2300, 0x2310, // A1M1
466         0x2500, 0x2510, 0x2520, 0x2530, 0x2540, // A1M1
467         0x27a0, 0x27b0, 0x27c0, 0x27e0, 0x27f0, // A1M1
468         0x2900, // M2
469         0x3000, 0x3010, 0x3020, 0x3030, 0x3100, 0x3110, 0x3120, 0x3130, 0x3200, 0x3210, 0x3220, 0x3230, 0x3300, 0x3310, 0x3500, 0x3510, 0x3520, 0x3530, 0x3540, 0x37a0, 0x37b0, 0x37c0, 0x37e0, 0x37f0, 0x3900, 0x4000, 0x4010, 0x4020, 0x4030, 0x4100, 0x4110, 0x4120, 0x4130, 0x4200, 0x4210, 0x4220, 0x4230, 0x4300, 0x4310, 0x4500, 0x4510, 0x4520, 0x4530, 0x4540, 0x47a0, 0x47b0, 0x47c0, 0x47e0, 0x47f0, 0x4900, 0x5300, 0x5500, 0x5510, 0x5520, 0x5530, 0x5700, 0x5710, 0x5720, 0x5730, 0x57a0, 0x57d0, 0x57f0, 0x6300, 0x6500, 0x6510, //Solar
470         0x6550, 0x6560, //??
471         0x6750, 0x6760, 0x6770, 0x6900, 0x7300, 0x7310, 0x7320, 0x7330, 0x7340, 0x7500, 0x7510, 0x7520, 0x7530, 0x7540, 0x7550, 0x7560, 0x7570, 0x7700, 0x7770, 0x7780, 0x7790, 0x7900, // V333WM1 ??? Boiler 1 to 4
472         0xa200, 0xa210, 0xa220, 0xa230, 0xa240, 0xa250, 0xa260, 0xa270, 0xa280, 0xa290, 0xa2a0, 0xa2b0, 0xa2c0, 0xa2d0, 0xa2e0, 0xa2f0, // V333WM1 Power nominal
473         0xa3f0
474     };
475 
476     /**
477      * DOCUMENT ME!
478      *
479      * @param sb DOCUMENT ME!
480      * @param dc DOCUMENT ME!
481      */
482     public static void printAll(StringBuilder sb, DataContainer dc) {
483         for (Group g : Group.values()) {
484             sb.append(g.toString()).append("\n");
485 
486             for (DataPoint p : getSortedPoints()) {
487                 if (g.equals(p.getGroup())) {
488                     sb.append("\t");
489                     p.toString(dc, sb);
490                     sb.append("\n");
491                 }
492             }
493         }
494     }
495 
496     /**
497      * DOCUMENT ME!
498      *
499      * @param dataPoint DOCUMENT ME!
500      * @param mem DOCUMENT ME!
501      * @param sb DOCUMENT ME!
502      */
503     public static void printMatchingAddesses(DataPoint dataPoint, MemoryImage mem, StringBuilder sb) {
504         boolean headerPrinted = false;
505 
506         for (int i = 0; i < (0x010000 - dataPoint.getLength()); i++) {
507             if (isInKnownBlocks16(i, dataPoint.getLength())) {
508                 if (compareBytes(mem, dataPoint.getAddr(), i, dataPoint.getLength())) {
509                     if (!headerPrinted) {
510                         dataPoint.toString(mem, sb);
511                         headerPrinted = true;
512                     }
513 
514                     sb.append(String.format("\t\tAlso @0x%04x", i));
515 
516                     DataPoint p = findByAddr(i);
517 
518                     if (p != null) {
519                         p.toString(mem, sb);
520                     } else {
521                         sb.append("\n");
522                     }
523                 }
524             }
525         }
526     }
527 
528     private static boolean compareBytes(MemoryImage mem, int addr0, int addr1, int length) {
529         // same or already found
530         if ((addr0 == addr1) || (addr0 > addr1)) {
531             return false;
532         }
533 
534         boolean isNotSet = true;
535 
536         for (int i = 0; i <= length; i++) {
537             if (mem.getByte(addr0 + i) != mem.getByte(addr1 + i)) {
538                 return false;
539             }
540 
541             isNotSet &= (mem.getByte(addr0 + i) == null);
542         }
543 
544         return !isNotSet;
545     }
546 
547     /**
548      * DOCUMENT ME!
549      *
550      * @param addr DOCUMENT ME!
551      *
552      * @return DOCUMENT ME!
553      */
554     public static DataPoint findByAddr(int addr) {
555         for (DataPoint p : DataPoint.values()) {
556             if (addr == p.getAddr()) {
557                 return p;
558             }
559         }
560 
561         return null;
562     }
563 
564     /**
565      * DOCUMENT ME!
566      *
567      * @param address DOCUMENT ME!
568      * @param length DOCUMENT ME!
569      *
570      * @return DOCUMENT ME!
571      */
572     public static boolean isInKnownBlocks16(int address, int length) {
573         for (int i = 0; i < length; i++) {
574             if (!isInKnownBlock16(address + i)) {
575                 return false;
576             }
577         }
578 
579         return true;
580     }
581 
582     /**
583      * DOCUMENT ME!
584      *
585      * @param address DOCUMENT ME!
586      *
587      * @return DOCUMENT ME!
588      */
589     public static boolean isInKnownBlock16(int address) {
590         for (int base : BLOCKS_16) {
591             if ((base == ((address / 16) * 16))) {
592                 return true;
593             }
594         }
595 
596         return false;
597     }
598 
599     /**
600      * DOCUMENT ME!
601      *
602      * @return DOCUMENT ME!
603      */
604     public static DataPoint[] getSortedPoints() {
605         DataPoint[] result = Arrays.copyOf(DataPoint.values(), DataPoint.values().length);
606         Arrays.sort(result, new GroupAndNameComparator());
607 
608         return result;
609     }
610 
611     /**
612      * DOCUMENT ME!
613      *
614      * @param addr DOCUMENT ME!
615      *
616      * @return DOCUMENT ME!
617      */
618     public boolean addressBelongsToMe(int addr) {
619         return (getAddr() <= addr) && ((getAddr() + getLength()) > addr);
620     }
621 
622     private static boolean isUnknownRange(int address, int length) {
623         for (DataPoint dp : DataPoint.values()) {
624             for (int i = 0; i < length; i++) {
625                 if (dp.addressBelongsToMe(address + i)) {
626                     return false;
627                 }
628             }
629         }
630 
631         return true;
632     }
633     private final int addr;
634     private final Group group;
635     private final PropertyType valueKind;
636     private final Property value;
637     private final DataType type;
638     private final AccessType access;
639     private final double factor;
640     private final Alternative alternative;
641 
642     private DataPoint(int addr, Group group, PropertyType valueKind, Property value, DataType type, AccessType access) {
643         this.addr = addr;
644         this.group = group;
645         this.valueKind = valueKind;
646         this.value = value;
647         this.type = type;
648         this.access = access;
649         this.factor = Double.NaN;
650         this.alternative = null;
651     }
652 
653     private DataPoint(int addr, Group group, PropertyType valueKind, Property value, DataType type, AccessType access, Alternative alternative) {
654         this.addr = addr;
655         this.group = group;
656         this.valueKind = valueKind;
657         this.value = value;
658         this.type = type;
659         this.factor = Double.NaN;
660         this.access = access;
661         this.alternative = alternative;
662     }
663 
664     private DataPoint(int addr, Group group, PropertyType valueKind, Property value, DataType type, AccessType access, double factor) {
665         this.addr = addr;
666         this.group = group;
667         this.valueKind = valueKind;
668         this.value = value;
669         this.type = type;
670         this.factor = factor;
671         this.access = access;
672         this.alternative = null;
673     }
674 
675     private DataPoint(int addr, Group group, PropertyType valueKind, Property value, DataType type, AccessType access, double factor, Alternative alternative) {
676         this.addr = addr;
677         this.group = group;
678         this.valueKind = valueKind;
679         this.value = value;
680         this.type = type;
681         this.factor = factor;
682         this.access = access;
683         this.alternative = alternative;
684     }
685 
686     private String getFormatString() {
687         switch (getType()) {
688             case BOOL:
689                 return "%-28s: %s";
690 
691             case SHORT_HEX:
692                 return "%-28s: %04x";
693 
694             case BYTE:
695             case UBYTE:
696             case SHORT:
697             case USHORT:
698             case INTEGER:
699 
700                 switch (getValueKind()) {
701                     case OPERATING_TIME_S:
702                         return "%-28s: %d s (%d:%02d:%02d)";
703 
704                     default:
705 
706                         if (Double.isNaN(getFactor())) {
707                             return "%-28s: %d";
708                         } else {
709                             return "%-28s: %.1f";
710                         }
711                 }
712 
713             case TIME_STAMP_8:
714 
715                 switch (getValueKind()) {
716                     case TIME_STAMP:
717                         return "%-28s: %s";
718 
719                     default:
720                         return "%-28s: UNKNOWN ValueKind:\"" + getValueKind().name() + "\"";
721                 }
722 
723             case HOLIDAY:
724                 return "%-28s: %s";
725 
726             case CYCLE_TIMES:
727                 return "%-28s: %s";
728 
729             case ERROR_LIST_ENTRY:
730                 return "%-28s: %s";
731 
732             default:
733                 return "%-28s: UNKNOWN ValueKind:\"" + getValueKind().name() + "\"";
734         }
735     }
736 
737     private String getAlternativeStr() {
738         return "";
739     }
740 
741     /**
742      * DOCUMENT ME!
743      *
744      * @param mem DOCUMENT ME!
745      * @param sb DOCUMENT ME!
746      *
747      * @throws UnsupportedOperationException DOCUMENT ME!
748      */
749     public void toString(MemoryImage mem, StringBuilder sb) {
750         final Object decodedValue = decode(mem);
751 
752         switch (getType()) {
753             case BOOL:
754             case SHORT_HEX:
755             case BYTE:
756             case UBYTE:
757             case SHORT:
758             case USHORT:
759             case TIME_STAMP_8:
760             case CYCLE_TIMES:
761             case ERROR_LIST_ENTRY:
762             case HOLIDAY:
763                 sb.append(String.format(getFormatString(), getLabel(), decodedValue));
764 
765                 break;
766 
767             case INTEGER:
768 
769                 if (OPERATING_TIME_S.equals(getValueKind())) {
770                     int data = (Integer) decodedValue;
771                     int h = data / 3600;
772                     int min = (data / 60) % 60;
773                     int sec = data % 60;
774 
775                     sb.append(String.format(getFormatString(), getLabel(), data, h, min, sec));
776                 } else {
777                     sb.append(String.format(getFormatString(), getLabel(), decodedValue));
778                 }
779 
780                 break;
781 
782             default:
783                 throw new UnsupportedOperationException("Not yet implemented");
784         }
785     }
786 
787     /**
788      * DOCUMENT ME!
789      *
790      * @return DOCUMENT ME!
791      */
792     public int getLength() {
793         return getType().getLength();
794     }
795 
796     /**
797      * DOCUMENT ME!
798      *
799      * @return the addr
800      */
801     public int getAddr() {
802         return addr;
803     }
804 
805     /**
806      * DOCUMENT ME!
807      *
808      * @return the group
809      */
810     public Group getGroup() {
811         return group;
812     }
813 
814     /**
815      * DOCUMENT ME!
816      *
817      * @return the valueKind
818      */
819     public PropertyType getValueKind() {
820         return valueKind;
821     }
822 
823     /**
824      * DOCUMENT ME!
825      *
826      * @return the value
827      */
828     public Property getValue() {
829         return value;
830     }
831 
832     /**
833      * DOCUMENT ME!
834      *
835      * @return the type
836      */
837     public DataType getType() {
838         return type;
839     }
840 
841     /**
842      * DOCUMENT ME!
843      *
844      * @return the access
845      */
846     public AccessType getAccess() {
847         return access;
848     }
849 
850     /**
851      * DOCUMENT ME!
852      *
853      * @return the factor
854      */
855     public double getFactor() {
856         return factor;
857     }
858 
859     /**
860      * DOCUMENT ME!
861      *
862      * @return the alternative
863      */
864     public Alternative getAlternative() {
865         return alternative;
866     }
867 
868     /**
869      * DOCUMENT ME!
870      *
871      * @return DOCUMENT ME!
872      */
873     public String getName() {
874         return name();
875     }
876 
877     /**
878      * DOCUMENT ME!
879      *
880      * @return DOCUMENT ME!
881      */
882     public String getLabel() {
883         if (Property.UNKNOWN.equals(value)) {
884             return String.format("0x%04x %s%s", getAddr(), getValueKind().toString(), getAlternativeStr());
885         } else {
886             return String.format("%s %s%s", getValue().toString(), getValueKind().toString(), getAlternativeStr());
887         }
888     }
889 
890     /**
891      * DOCUMENT ME!
892      *
893      * @param dc DOCUMENT ME!
894      *
895      * @return DOCUMENT ME!
896      */
897     public Object decode(MemoryImage dc) {
898         switch (type) {
899             case BOOL:
900                 return dc.getBool(addr);
901 
902             case CYCLE_TIMES:
903                 return dc.getCycleTimes(addr, 8);
904 
905             case HOLIDAY:
906                 return dc.getHoliday(addr);
907 
908             case ERROR_LIST_ENTRY:
909                 return dc.getErrorListEntry(addr);
910 
911             case TIME_STAMP_8:
912                 return dc.getTimeStamp_8(addr);
913 
914             case SHORT_HEX:
915                 return dc.getShortHex(addr);
916 
917             case BYTE:
918 
919                 if (Double.isNaN(factor)) {
920                     return dc.getByte(addr);
921                 } else {
922                     final Byte byteValue = dc.getByte(addr);
923 
924                     return (byteValue == null) ? null : (byteValue * factor);
925                 }
926 
927             case UBYTE:
928 
929                 if (Double.isNaN(factor)) {
930                     return dc.getUByte(addr);
931                 } else {
932                     final Short byteValue = dc.getUByte(addr);
933 
934                     return (byteValue == null) ? null : (byteValue * factor);
935                 }
936 
937             case SHORT:
938 
939                 if (Double.isNaN(factor)) {
940                     return dc.getShort(addr);
941                 } else {
942                     final Short shortValue = dc.getShort(addr);
943 
944                     return (shortValue == null) ? null : (shortValue * factor);
945                 }
946 
947             case USHORT:
948 
949                 if (Double.isNaN(factor)) {
950                     return dc.getUShort(addr);
951                 } else {
952                     final Integer shortValue = dc.getUShort(addr);
953 
954                     return (shortValue == null) ? null : (shortValue * factor);
955                 }
956 
957             case INTEGER:
958 
959                 if (Double.isNaN(factor)) {
960                     return dc.getInteger(addr);
961                 } else {
962                     final Integer intValue = dc.getInteger(addr);
963 
964                     return (intValue == null) ? null : (intValue * factor);
965                 }
966 
967             default:
968                 return "UNKNOWN DATATYPE ";
969         }
970     }
971 
972     /**
973      * DOCUMENT ME!
974      *
975      * @param dc DOCUMENT ME!
976      * @param o DOCUMENT ME!
977      *
978      * @throws IllegalArgumentException DOCUMENT ME!
979      */
980     public void encode(MemoryImage dc, Object o) {
981         if (AccessType.RO.equals(access)) {
982             throw new RuntimeException(String.format("DataPoint %s not setable!", this.toString()));
983         }
984         if (o instanceof Boolean) {
985             encodeBoolean(dc, ((Boolean) o).booleanValue());
986         } else if (o instanceof Double) {
987             encodeDouble(dc, ((Double) o).doubleValue());
988         } else if (o instanceof Byte) {
989             encodeByte(dc, ((Byte) o).byteValue());
990         } else if (o instanceof Short) {
991             encodeShort(dc, ((Short) o).shortValue());
992         } else if (o instanceof Integer) {
993             encodeInteger(dc, ((Integer) o).intValue());
994         } else {
995             switch (type) {
996 
997                 case SHORT_HEX:
998 
999                     if (o instanceof Short) {
1000                         dc.setShortHex(addr, (Short) o);
1001                     } else {
1002                         throw new IllegalArgumentException("DataType Short expected");
1003                     }
1004 
1005                     break;
1006 
1007                 default:
1008                     throw new IllegalArgumentException();
1009             }
1010         }
1011     }
1012 
1013     private void encodeBoolean(MemoryImage dc, boolean b) {
1014         if (BOOL.equals(type)) {
1015             dc.setBool(addr, b);
1016         } else {
1017             throw new IllegalArgumentException("DataType boolean expected");
1018         }
1019     }
1020 
1021     private void encodeByte(MemoryImage dc, byte b) {
1022         switch (type) {
1023             case BYTE:
1024                 if (Double.isNaN(factor)) {
1025                     dc.setByte(addr, b);
1026                 } else {
1027                     dc.setByte(addr, (byte) Math.round(b / factor));
1028                 }
1029                 break;
1030             case SHORT:
1031                 encodeShort(dc, (short) b);
1032                 break;
1033             case INTEGER:
1034                 encodeInteger(dc, (int) b);
1035                 break;
1036             default:
1037                 throw new IllegalArgumentException("DataType byte expected");
1038         }
1039     }
1040 
1041     private void encodeShort(MemoryImage dc, short s) {
1042         switch (type) {
1043             case BYTE:
1044                 throw new IllegalArgumentException("DataType byte expected");
1045             case SHORT:
1046                 if (Double.isNaN(factor)) {
1047                     dc.setShort(addr, s);
1048                 } else {
1049                     dc.setShort(addr, (short) Math.round(s / factor));
1050                 }
1051                 break;
1052             case INTEGER:
1053                 encodeInteger(dc, (int) s);
1054                 break;
1055             default:
1056                 throw new IllegalArgumentException("DataType short expected");
1057         }
1058     }
1059 
1060     private void encodeInteger(MemoryImage dc, int i) {
1061         switch (type) {
1062             case BYTE:
1063                 throw new IllegalArgumentException("DataType byte expected");
1064             case SHORT:
1065                 throw new IllegalArgumentException("DataType short expected");
1066             case INTEGER:
1067                 if (Double.isNaN(factor)) {
1068                     dc.setInteger(addr, i);
1069                 } else {
1070                     dc.setInteger(addr, (int) Math.round(i / factor));
1071                 }
1072                 break;
1073             default:
1074                 throw new IllegalArgumentException("DataType int expected");
1075         }
1076     }
1077 
1078     private void encodeDouble(MemoryImage dc, double d) {
1079         switch (type) {
1080             case BYTE:
1081                 if (Double.isNaN(factor)) {
1082                     dc.setByte(addr, (byte) Math.round(d));
1083                 } else {
1084                     dc.setByte(addr, (byte) Math.round(d / factor));
1085                 }
1086                 break;
1087             case SHORT:
1088                 if (Double.isNaN(factor)) {
1089                     dc.setShort(addr, (short) Math.round(d));
1090                 } else {
1091                     dc.setShort(addr, (short) Math.round(d / factor));
1092                 }
1093                 break;
1094             case INTEGER:
1095                 if (Double.isNaN(factor)) {
1096                     dc.setInteger(addr, (int) Math.round(d));
1097                 } else {
1098                     dc.setInteger(addr, (int) Math.round(d / factor));
1099                 }
1100                 break;
1101             default:
1102                 throw new IllegalArgumentException("DataType byte expected");
1103         }
1104     }
1105 
1106     /**
1107      * DOCUMENT ME!
1108      *
1109      * @param sb DOCUMENT ME!
1110      * @param memImage DOCUMENT ME!
1111      */
1112     public static void printAddresses(StringBuilder sb, MemoryImage memImage) {
1113         for (int i = 0; i < 0x010000;) {
1114             DataPoint p = DataPoint.findByAddr(i);
1115 
1116             if (p != null) {
1117                 sb.append(String.format("\t@0x%04x %-8s=> ", p.getAddr(), p.getGroup().getLabel()));
1118                 p.toString(memImage, sb);
1119                 sb.append("\n");
1120                 i += p.getLength();
1121             } else {
1122                 if (DataPoint.isInKnownBlocks16(i, 1)) {
1123                     sb.append(String.format("\t\t@0x%04x 0x%02x byte: %4d", i, memImage.getRawByte(i) & 0xff, memImage.getByte(i)));
1124 
1125                     if (isInKnownBlocks16(i, 2) && isUnknownRange(i, 2)) {
1126                         sb.append(String.format(" short: %6d", memImage.getShort(i)));
1127                     }
1128 
1129                     if (isInKnownBlocks16(i, 4) && isUnknownRange(i, 4)) {
1130                         sb.append(String.format(" int: %11d", memImage.getInteger(i)));
1131                     }
1132 
1133                     sb.append("\n");
1134                 }
1135 
1136                 i++;
1137             }
1138         }
1139 
1140         System.err.print(sb.toString());
1141     }
1142 }