]> git.basschouten.com Git - openhab-addons.git/blob
df4d0081af2653fb2f9df79cee32a97d7bd99419
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 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 org.openhab.binding.nibeheatpump.internal.NibeHeatPumpException;
16 import org.openhab.binding.nibeheatpump.internal.protocol.NibeHeatPumpProtocol;
17
18 /**
19  * The {@link ModbusWriteRequestMessage} implements Nibe write request message.
20  *
21  * @author Pauli Anttila - Initial contribution
22  */
23 public class ModbusWriteRequestMessage extends NibeHeatPumpBaseMessage {
24
25     private int coilAddress;
26     private int value;
27
28     private ModbusWriteRequestMessage(MessageBuilder builder) {
29         super.msgType = MessageType.MODBUS_WRITE_REQUEST_MSG;
30         this.coilAddress = builder.coilAddress;
31         this.value = builder.value;
32     }
33
34     public ModbusWriteRequestMessage(byte[] data) throws NibeHeatPumpException {
35         encodeMessage(data);
36     }
37
38     public int getCoilAddress() {
39         return coilAddress;
40     }
41
42     public void setCoildAddress(int coildAddress) {
43         this.coilAddress = coildAddress;
44     }
45
46     public int getValue() {
47         return value;
48     }
49
50     public void setValue(int value) {
51         this.value = value;
52     }
53
54     @Override
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);
60         } else {
61             throw new NibeHeatPumpException("Not Write Request message");
62         }
63     }
64
65     @Override
66     public byte[] decodeMessage() {
67         return createModbus40WritePdu(coilAddress, value);
68     }
69
70     private byte[] createModbus40WritePdu(int coildAddress, int value) {
71         byte[] data = new byte[10];
72
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);
83
84         return data;
85     }
86
87     @Override
88     public String toString() {
89         String str = "";
90
91         str += super.toString();
92         str += ", Coil address = " + coilAddress;
93         str += ", Value = " + value;
94
95         return str;
96     }
97
98     public static class MessageBuilder {
99         private int coilAddress;
100         private int value;
101
102         public MessageBuilder coilAddress(int coilAddress) {
103             this.coilAddress = coilAddress;
104             return this;
105         }
106
107         public MessageBuilder value(int value) {
108             this.value = value;
109             return this;
110         }
111
112         public ModbusWriteRequestMessage build() {
113             return new ModbusWriteRequestMessage(this);
114         }
115     }
116
117     @Override
118     public String toHexString() {
119         if (rawMessage == null) {
120             rawMessage = decodeMessage();
121         }
122
123         return super.toHexString();
124     }
125 }