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.nibeheatpump.internal.message;
15 import static org.junit.jupiter.api.Assertions.*;
17 import java.util.ArrayList;
19 import org.junit.jupiter.api.Test;
20 import org.openhab.binding.nibeheatpump.internal.NibeHeatPumpException;
21 import org.openhab.core.util.HexUtils;
24 * Tests cases for {@link ModbusDataReadOutMessage}.
26 * @author Pauli Anttila - Initial contribution
28 public class ModbusDataReadOutMessageTest {
31 public void createMessageTest() throws NibeHeatPumpException {
32 final String okMessage = "5C0020685001A81F0100A86400FDA7D003449C1E004F9CA000509C7800519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000045";
34 @SuppressWarnings("serial")
35 final ArrayList<ModbusValue> values = new ArrayList<ModbusValue>() {
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));
60 final ModbusDataReadOutMessage m = new ModbusDataReadOutMessage.MessageBuilder().values(values).build();
61 final byte[] byteMessage = m.decodeMessage();
62 assertEquals(okMessage, HexUtils.bytesToHex(byteMessage));
66 public void parseModbusDataReadOutMessageTest() throws NibeHeatPumpException {
67 final String message = "5C0020685001A81F0100A86400FDA7D003449C1E004F9CA000509C7800519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000045";
69 @SuppressWarnings("serial")
70 final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
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));
92 checkRegisters(message, expectedValues);
96 public void parseHeavilyEscapedModbusDataReadOutMessageTest() throws NibeHeatPumpException {
97 final String message = "5C0020685401A81F0100A86400FDA7D003449C1E004F9CA000509C7800519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF00005C5C5C5C5C5C5C5C41";
99 @SuppressWarnings("serial")
100 final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
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));
123 checkRegisters(message, expectedValues);
127 public void specialLen1Test() throws NibeHeatPumpException {
128 final String message = "5C00206851449C2500489CFC004C9CF1004E9CC7014D9C0B024F9C2500509C3300519C0B01529C5C5C01569C3100C9AF000001A80C01FDA716FAFAA9070098A91B1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000BE";
130 @SuppressWarnings("serial")
131 final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
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));
153 checkRegisters(message, expectedValues);
157 public void specialLen2Test() throws NibeHeatPumpException {
158 final String message = "5C00206852449C2500489CFE004C9CF2004E9CD4014D9CFB014F9C2500509C3700519C0D01529C5C5C01569C3200C9AF000001A80C01FDA712FAFAA9070098A95C5C1BFFFF0000A0A9D102FFFF00009CA9B412FFFF00007F";
160 @SuppressWarnings("serial")
161 final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
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));
183 checkRegisters(message, expectedValues);
187 public void specialCrcTest() throws NibeHeatPumpException {
188 final String message = "5C00206850449C2600489CF6004C9CF1004E9CD6014D9C0C024F9C4500509C3F00519CF100529C0401569CD500C9AF000001A80C01FDA799FAFAA9020098A91A1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000C5";
190 @SuppressWarnings("serial")
191 final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
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));
213 checkRegisters(message, expectedValues);
217 public void badCrcTest() {
218 final String message = "5C0020685001A81F0100A86400FDA7D003449C1E004F9CA000509C7800519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000044";
220 final byte[] msg = HexUtils.hexToBytes(message);
221 assertThrows(NibeHeatPumpException.class, () -> MessageFactory.getMessage(msg));
225 public void notModbusDataReadOutMessageTest() {
226 final String message = "519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000044";
228 final byte[] msg = HexUtils.hexToBytes(message);
229 assertThrows(NibeHeatPumpException.class, () -> new ModbusDataReadOutMessage(msg));
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);
238 final ArrayList<ModbusValue> actualValues = (ArrayList<ModbusValue>) m.getValues();
240 assertNotNull(actualValues);
241 assertEquals(expectedRegs.size(), actualValues.size());
242 assertEquals(expectedRegs.toString(), actualValues.toString());