2 * Copyright (c) 2010-2021 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 specialLen1Test() throws NibeHeatPumpException {
97 final String message = "5C00206851449C2500489CFC004C9CF1004E9CC7014D9C0B024F9C2500509C3300519C0B01529C5C5C01569C3100C9AF000001A80C01FDA716FAFAA9070098A91B1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000BE";
99 @SuppressWarnings("serial")
100 final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
102 add(new ModbusValue(40004, 37));
103 add(new ModbusValue(40008, 252));
104 add(new ModbusValue(40012, 241));
105 add(new ModbusValue(40014, 455));
106 add(new ModbusValue(40013, 523));
107 add(new ModbusValue(40015, 37));
108 add(new ModbusValue(40016, 51));
109 add(new ModbusValue(40017, 267));
110 add(new ModbusValue(40018, 348));
111 add(new ModbusValue(40022, 49));
112 add(new ModbusValue(45001, 0));
113 add(new ModbusValue(43009, 268));
114 add(new ModbusValue(43005, 64022));
115 add(new ModbusValue(43514, 7));
116 add(new ModbusValue(43416, 6939));
117 add(new ModbusValue(43424, 714));
118 add(new ModbusValue(43420, 4754));
122 checkRegisters(message, expectedValues);
126 public void specialLen2Test() throws NibeHeatPumpException {
127 final String message = "5C00206852449C2500489CFE004C9CF2004E9CD4014D9CFB014F9C2500509C3700519C0D01529C5C5C01569C3200C9AF000001A80C01FDA712FAFAA9070098A95C5C1BFFFF0000A0A9D102FFFF00009CA9B412FFFF00007F";
129 @SuppressWarnings("serial")
130 final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
132 add(new ModbusValue(40004, 37));
133 add(new ModbusValue(40008, 254));
134 add(new ModbusValue(40012, 242));
135 add(new ModbusValue(40014, 468));
136 add(new ModbusValue(40013, 507));
137 add(new ModbusValue(40015, 37));
138 add(new ModbusValue(40016, 55));
139 add(new ModbusValue(40017, 269));
140 add(new ModbusValue(40018, 348));
141 add(new ModbusValue(40022, 50));
142 add(new ModbusValue(45001, 0));
143 add(new ModbusValue(43009, 268));
144 add(new ModbusValue(43005, 64018));
145 add(new ModbusValue(43514, 7));
146 add(new ModbusValue(43416, 7004));
147 add(new ModbusValue(43424, 721));
148 add(new ModbusValue(43420, 4788));
152 checkRegisters(message, expectedValues);
156 public void specialCrcTest() throws NibeHeatPumpException {
157 final String message = "5C00206850449C2600489CF6004C9CF1004E9CD6014D9C0C024F9C4500509C3F00519CF100529C0401569CD500C9AF000001A80C01FDA799FAFAA9020098A91A1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000C5";
159 @SuppressWarnings("serial")
160 final ArrayList<ModbusValue> expectedValues = new ArrayList<ModbusValue>() {
162 add(new ModbusValue(40004, 38));
163 add(new ModbusValue(40008, 246));
164 add(new ModbusValue(40012, 241));
165 add(new ModbusValue(40014, 470));
166 add(new ModbusValue(40013, 524));
167 add(new ModbusValue(40015, 69));
168 add(new ModbusValue(40016, 63));
169 add(new ModbusValue(40017, 241));
170 add(new ModbusValue(40018, 260));
171 add(new ModbusValue(40022, 213));
172 add(new ModbusValue(45001, 0));
173 add(new ModbusValue(43009, 268));
174 add(new ModbusValue(43005, 64153));
175 add(new ModbusValue(43514, 2));
176 add(new ModbusValue(43416, 6938));
177 add(new ModbusValue(43424, 714));
178 add(new ModbusValue(43420, 4754));
182 checkRegisters(message, expectedValues);
186 public void badCrcTest() {
187 final String message = "5C0020685001A81F0100A86400FDA7D003449C1E004F9CA000509C7800519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000044";
189 final byte[] msg = HexUtils.hexToBytes(message);
190 assertThrows(NibeHeatPumpException.class, () -> MessageFactory.getMessage(msg));
194 public void notModbusDataReadOutMessageTest() {
195 final String message = "519C0301529C1B01879C14014E9CC601479C010115B9B0FF3AB94B00C9AF0000489C0D014C9CE7004B9C0000FFFF0000FFFF0000FFFF000044";
197 final byte[] msg = HexUtils.hexToBytes(message);
198 assertThrows(NibeHeatPumpException.class, () -> new ModbusDataReadOutMessage(msg));
201 private void checkRegisters(final String message, final ArrayList<ModbusValue> expectedRegs)
202 throws NibeHeatPumpException {
203 final byte[] msg = HexUtils.hexToBytes(message);
204 final ModbusDataReadOutMessage m = (ModbusDataReadOutMessage) MessageFactory.getMessage(msg);
207 final ArrayList<ModbusValue> actualValues = (ArrayList<ModbusValue>) m.getValues();
209 assertNotNull(actualValues);
210 assertEquals(expectedRegs.size(), actualValues.size());
211 assertEquals(expectedRegs.toString(), actualValues.toString());