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 ModbusWriteRequestMessage} implements Nibe write request message.
21 * @author Pauli Anttila - Initial contribution
23 public class ModbusWriteRequestMessage extends NibeHeatPumpBaseMessage {
25 private int coilAddress;
28 private ModbusWriteRequestMessage(MessageBuilder builder) {
29 super.msgType = MessageType.MODBUS_WRITE_REQUEST_MSG;
30 this.coilAddress = builder.coilAddress;
31 this.value = builder.value;
34 public ModbusWriteRequestMessage(byte[] data) throws NibeHeatPumpException {
38 public int getCoilAddress() {
42 public void setCoildAddress(int coildAddress) {
43 this.coilAddress = coildAddress;
46 public int getValue() {
50 public void setValue(int value) {
55 public void encodeMessage(byte[] data) throws NibeHeatPumpException {
56 if (NibeHeatPumpProtocol.isModbus40WriteRequestPdu(data)) {
57 super.encodeMessage(data);
58 coilAddress = (data[4] & 0xFF) << 8 | (data[3] & 0xFF);
59 value = (data[8] & 0xFF) << 24 | (data[7] & 0xFF) << 16 | (data[6] & 0xFF) << 8 | (data[5] & 0xFF);
61 throw new NibeHeatPumpException("Not Write Request message");
66 public byte[] decodeMessage() {
67 return createModbus40WritePdu(coilAddress, value);
70 private byte[] createModbus40WritePdu(int coildAddress, int value) {
71 byte[] data = new byte[10];
73 data[0] = NibeHeatPumpProtocol.FRAME_START_CHAR_TO_NIBE;
74 data[1] = NibeHeatPumpProtocol.CMD_MODBUS_WRITE_REQ;
75 data[2] = (byte) 0x06; // data len
76 data[3] = (byte) (coildAddress & 0xFF);
77 data[4] = (byte) ((coildAddress >> 8) & 0xFF);
78 data[5] = (byte) (value & 0xFF);
79 data[6] = (byte) ((value >> 8) & 0xFF);
80 data[7] = (byte) ((value >> 16) & 0xFF);
81 data[8] = (byte) ((value >> 24) & 0xFF);
82 data[9] = NibeHeatPumpProtocol.calculateChecksum(data, 0, 9);
88 public String toString() {
91 str += super.toString();
92 str += ", Coil address = " + coilAddress;
93 str += ", Value = " + value;
98 public static class MessageBuilder {
99 private int coilAddress;
102 public MessageBuilder coilAddress(int coilAddress) {
103 this.coilAddress = coilAddress;
107 public MessageBuilder value(int value) {
112 public ModbusWriteRequestMessage build() {
113 return new ModbusWriteRequestMessage(this);
118 public String toHexString() {
119 if (rawMessage == null) {
120 rawMessage = decodeMessage();
123 return super.toHexString();