]> git.basschouten.com Git - openhab-addons.git/blob
bc7c3d858523c0fa7d525e1213d1bfae30861e23
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.nibeheatpump.internal.message;
14
15 import static org.junit.jupiter.api.Assertions.*;
16
17 import java.util.ArrayList;
18
19 import org.junit.jupiter.api.Test;
20 import org.openhab.binding.nibeheatpump.internal.NibeHeatPumpException;
21 import org.openhab.core.util.HexUtils;
22
23 /**
24  * Tests cases for {@link ModbusDataReadOutMessage}.
25  *
26  * @author Pauli Anttila - Initial contribution
27  */
28 public class ModbusDataReadOutMessageTest {
29
30     @Test
31     public void createMessageTest() throws NibeHeatPumpException {
32         final String okMessage = "5C0020685001A81F0100A86400FDA7D003449C1E004F9CA000509C7800519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000045";
33
34         @SuppressWarnings("serial")
35         final ArrayList<ModbusValue> values = new ArrayList<ModbusValue>() {
36             {
37                 add(new ModbusValue(43009, 287));
38                 add(new ModbusValue(43008, 100));
39                 add(new ModbusValue(43005, 976));
40                 add(new ModbusValue(40004, 30));
41                 add(new ModbusValue(40015, 160));
42                 add(new ModbusValue(40016, 120));
43                 add(new ModbusValue(40017, 259));
44                 add(new ModbusValue(40018, 283));
45                 add(new ModbusValue(40071, 276));
46                 add(new ModbusValue(40014, 454));
47                 add(new ModbusValue(40007, 257));
48                 add(new ModbusValue(47381, -80));
49                 add(new ModbusValue(47418, 75));
50                 add(new ModbusValue(45001, 0));
51                 add(new ModbusValue(40008, 269));
52                 add(new ModbusValue(40012, 231));
53                 add(new ModbusValue(40011, 0));
54                 add(new ModbusValue(0xFFFF, 0));
55                 add(new ModbusValue(0xFFFF, 0));
56                 add(new ModbusValue(0xFFFF, 0));
57             }
58         };
59
60         final ModbusDataReadOutMessage m = new ModbusDataReadOutMessage.MessageBuilder().values(values).build();
61         final byte[] byteMessage = m.decodeMessage();
62         assertEquals(okMessage, HexUtils.bytesToHex(byteMessage));
63     }
64
65     @Test
66     public void parseModbusDataReadOutMessageTest() throws NibeHeatPumpException {
67         final String message = "5C0020685001A81F0100A86400FDA7D003449C1E004F9CA000509C7800519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000045";
68
69         @SuppressWarnings("serial")
70         final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
71             {
72                 add(new ModbusValue(43009, 287));
73                 add(new ModbusValue(43008, 100));
74                 add(new ModbusValue(43005, 976));
75                 add(new ModbusValue(40004, 30));
76                 add(new ModbusValue(40015, 160));
77                 add(new ModbusValue(40016, 120));
78                 add(new ModbusValue(40017, 259));
79                 add(new ModbusValue(40018, 283));
80                 add(new ModbusValue(40071, 276));
81                 add(new ModbusValue(40014, 454));
82                 add(new ModbusValue(40007, 257));
83                 add(new ModbusValue(47381, 65456));
84                 add(new ModbusValue(47418, 75));
85                 add(new ModbusValue(45001, 0));
86                 add(new ModbusValue(40008, 269));
87                 add(new ModbusValue(40012, 231));
88                 add(new ModbusValue(40011, 0));
89             }
90         };
91
92         checkRegisters(message, expectedValues);
93     }
94
95     @Test
96     public void parseHeavilyEscapedModbusDataReadOutMessageTest() throws NibeHeatPumpException {
97         final String message = "5C0020685401A81F0100A86400FDA7D003449C1E004F9CA000509C7800519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF00005C5C5C5C5C5C5C5C41";
98
99         @SuppressWarnings("serial")
100         final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
101             {
102                 add(new ModbusValue(43009, 287));
103                 add(new ModbusValue(43008, 100));
104                 add(new ModbusValue(43005, 976));
105                 add(new ModbusValue(40004, 30));
106                 add(new ModbusValue(40015, 160));
107                 add(new ModbusValue(40016, 120));
108                 add(new ModbusValue(40017, 259));
109                 add(new ModbusValue(40018, 283));
110                 add(new ModbusValue(40071, 276));
111                 add(new ModbusValue(40014, 454));
112                 add(new ModbusValue(40007, 257));
113                 add(new ModbusValue(47381, 65456));
114                 add(new ModbusValue(47418, 75));
115                 add(new ModbusValue(45001, 0));
116                 add(new ModbusValue(40008, 269));
117                 add(new ModbusValue(40012, 231));
118                 add(new ModbusValue(40011, 0));
119                 add(new ModbusValue(23644, 23644));
120             }
121         };
122
123         checkRegisters(message, expectedValues);
124     }
125
126     @Test
127     public void specialLen1Test() throws NibeHeatPumpException {
128         final String message = "5C00206851449C2500489CFC004C9CF1004E9CC7014D9C0B024F9C2500509C3300519C0B01529C5C5C01569C3100C9AF000001A80C01FDA716FAFAA9070098A91B1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000BE";
129
130         @SuppressWarnings("serial")
131         final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
132             {
133                 add(new ModbusValue(40004, 37));
134                 add(new ModbusValue(40008, 252));
135                 add(new ModbusValue(40012, 241));
136                 add(new ModbusValue(40014, 455));
137                 add(new ModbusValue(40013, 523));
138                 add(new ModbusValue(40015, 37));
139                 add(new ModbusValue(40016, 51));
140                 add(new ModbusValue(40017, 267));
141                 add(new ModbusValue(40018, 348));
142                 add(new ModbusValue(40022, 49));
143                 add(new ModbusValue(45001, 0));
144                 add(new ModbusValue(43009, 268));
145                 add(new ModbusValue(43005, 64022));
146                 add(new ModbusValue(43514, 7));
147                 add(new ModbusValue(43416, 6939));
148                 add(new ModbusValue(43424, 714));
149                 add(new ModbusValue(43420, 4754));
150             }
151         };
152
153         checkRegisters(message, expectedValues);
154     }
155
156     @Test
157     public void specialLen2Test() throws NibeHeatPumpException {
158         final String message = "5C00206852449C2500489CFE004C9CF2004E9CD4014D9CFB014F9C2500509C3700519C0D01529C5C5C01569C3200C9AF000001A80C01FDA712FAFAA9070098A95C5C1BFFFF0000A0A9D102FFFF00009CA9B412FFFF00007F";
159
160         @SuppressWarnings("serial")
161         final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
162             {
163                 add(new ModbusValue(40004, 37));
164                 add(new ModbusValue(40008, 254));
165                 add(new ModbusValue(40012, 242));
166                 add(new ModbusValue(40014, 468));
167                 add(new ModbusValue(40013, 507));
168                 add(new ModbusValue(40015, 37));
169                 add(new ModbusValue(40016, 55));
170                 add(new ModbusValue(40017, 269));
171                 add(new ModbusValue(40018, 348));
172                 add(new ModbusValue(40022, 50));
173                 add(new ModbusValue(45001, 0));
174                 add(new ModbusValue(43009, 268));
175                 add(new ModbusValue(43005, 64018));
176                 add(new ModbusValue(43514, 7));
177                 add(new ModbusValue(43416, 7004));
178                 add(new ModbusValue(43424, 721));
179                 add(new ModbusValue(43420, 4788));
180             }
181         };
182
183         checkRegisters(message, expectedValues);
184     }
185
186     @Test
187     public void specialCrcTest() throws NibeHeatPumpException {
188         final String message = "5C00206850449C2600489CF6004C9CF1004E9CD6014D9C0C024F9C4500509C3F00519CF100529C0401569CD500C9AF000001A80C01FDA799FAFAA9020098A91A1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000C5";
189
190         @SuppressWarnings("serial")
191         final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
192             {
193                 add(new ModbusValue(40004, 38));
194                 add(new ModbusValue(40008, 246));
195                 add(new ModbusValue(40012, 241));
196                 add(new ModbusValue(40014, 470));
197                 add(new ModbusValue(40013, 524));
198                 add(new ModbusValue(40015, 69));
199                 add(new ModbusValue(40016, 63));
200                 add(new ModbusValue(40017, 241));
201                 add(new ModbusValue(40018, 260));
202                 add(new ModbusValue(40022, 213));
203                 add(new ModbusValue(45001, 0));
204                 add(new ModbusValue(43009, 268));
205                 add(new ModbusValue(43005, 64153));
206                 add(new ModbusValue(43514, 2));
207                 add(new ModbusValue(43416, 6938));
208                 add(new ModbusValue(43424, 714));
209                 add(new ModbusValue(43420, 4754));
210             }
211         };
212
213         checkRegisters(message, expectedValues);
214     }
215
216     @Test
217     public void badCrcTest() {
218         final String message = "5C0020685001A81F0100A86400FDA7D003449C1E004F9CA000509C7800519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000044";
219
220         final byte[] msg = HexUtils.hexToBytes(message);
221         assertThrows(NibeHeatPumpException.class, () -> MessageFactory.getMessage(msg));
222     }
223
224     @Test
225     public void notModbusDataReadOutMessageTest() {
226         final String message = "519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000044";
227
228         final byte[] msg = HexUtils.hexToBytes(message);
229         assertThrows(NibeHeatPumpException.class, () -> new ModbusDataReadOutMessage(msg));
230     }
231
232     private void checkRegisters(final String message, final ArrayList<ModbusValue> expectedRegs)
233             throws NibeHeatPumpException {
234         final byte[] msg = HexUtils.hexToBytes(message);
235         final ModbusDataReadOutMessage m = (ModbusDataReadOutMessage) MessageFactory.getMessage(msg);
236         assertNotNull(m);
237
238         final ArrayList<ModbusValue> actualValues = (ArrayList<ModbusValue>) m.getValues();
239
240         assertNotNull(actualValues);
241         assertEquals(expectedRegs.size(), actualValues.size());
242         assertEquals(expectedRegs.toString(), actualValues.toString());
243     }
244 }