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 org.openhab.binding.nibeheatpump.internal.NibeHeatPumpException;
16 import org.openhab.binding.nibeheatpump.internal.protocol.NibeHeatPumpProtocol;
19 * The {@link ModbusReadResponseMessage} implements Nibe read response message.
22 * @author Pauli Anttila - Initial contribution
24 public class ModbusReadResponseMessage extends NibeHeatPumpBaseMessage {
26 private int coilAddress;
29 private ModbusReadResponseMessage(MessageBuilder builder) {
30 super.msgType = MessageType.MODBUS_READ_RESPONSE_MSG;
31 this.coilAddress = builder.coilAddress;
32 this.value = builder.value;
35 public ModbusReadResponseMessage(byte[] data) throws NibeHeatPumpException {
39 public int getCoilAddress() {
43 public void setCoilAddress(int coilAddress) {
44 this.coilAddress = coilAddress;
47 public int getValue() {
51 public void setValue(int value) {
55 public ModbusValue getValueAsModbusValue() {
56 return new ModbusValue(coilAddress, value);
60 public void encodeMessage(byte[] data) throws NibeHeatPumpException {
61 super.encodeMessage(data);
63 coilAddress = (data[3] & 0xFF) << 8 | (data[4] & 0xFF);
68 public byte[] decodeMessage() {
69 return createModbusReadResponsePdu(coilAddress, value);
72 private byte[] createModbusReadResponsePdu(int coilAddress, int value) {
73 byte[] data = new byte[12];
75 data[0] = NibeHeatPumpProtocol.FRAME_START_CHAR_FROM_NIBE;
77 data[2] = NibeHeatPumpProtocol.ADR_MODBUS40;
78 data[3] = NibeHeatPumpProtocol.CMD_MODBUS_READ_RESP;
79 data[4] = (byte) 0x06; // data len
81 data[5] = (byte) (coilAddress & 0xFF);
82 data[6] = (byte) ((coilAddress >> 8) & 0xFF);
84 data[7] = (byte) (value & 0xFF);
85 data[8] = (byte) ((value >> 8) & 0xFF);
86 data[9] = (byte) ((value >> 16) & 0xFF);
87 data[10] = (byte) ((value >> 24) & 0xFF);
89 data[11] = NibeHeatPumpProtocol.calculateChecksum(data, 2, 11);
95 public String toString() {
98 str += super.toString();
99 str += ", Coil address = " + coilAddress;
100 str += ", Value = " + value;
105 private void parseMessage(byte[] data) throws NibeHeatPumpException {
106 if (NibeHeatPumpProtocol.isModbus40ReadResponse(data)) {
107 super.encodeMessage(data);
108 coilAddress = ((data[NibeHeatPumpProtocol.OFFSET_DATA + 1] & 0xFF) << 8
109 | (data[NibeHeatPumpProtocol.OFFSET_DATA + 0] & 0xFF));
110 value = (data[NibeHeatPumpProtocol.OFFSET_DATA + 5] & 0xFF) << 24
111 | (data[NibeHeatPumpProtocol.OFFSET_DATA + 4] & 0xFF) << 16
112 | (data[NibeHeatPumpProtocol.OFFSET_DATA + 3] & 0xFF) << 8
113 | (data[NibeHeatPumpProtocol.OFFSET_DATA + 2] & 0xFF);
116 throw new NibeHeatPumpException("Not Read Response message");
120 public static class MessageBuilder {
121 private int coilAddress;
124 public MessageBuilder coilAddress(int coilAddress) {
125 this.coilAddress = coilAddress;
129 public MessageBuilder value(int value) {
134 public ModbusReadResponseMessage build() {
135 return new ModbusReadResponseMessage(this);