]> git.basschouten.com Git - openhab-addons.git/blob
d9a068fb41301cfe4f6611c02a92c011358bca82
[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 ModbusReadResponseMessage} implements Nibe read response message.
20  *
21  *
22  * @author Pauli Anttila - Initial contribution
23  */
24 public class ModbusReadResponseMessage extends NibeHeatPumpBaseMessage {
25
26     private int coilAddress;
27     private int value;
28
29     private ModbusReadResponseMessage(MessageBuilder builder) {
30         super.msgType = MessageType.MODBUS_READ_RESPONSE_MSG;
31         this.coilAddress = builder.coilAddress;
32         this.value = builder.value;
33     }
34
35     public ModbusReadResponseMessage(byte[] data) throws NibeHeatPumpException {
36         encodeMessage(data);
37     }
38
39     public int getCoilAddress() {
40         return coilAddress;
41     }
42
43     public void setCoilAddress(int coilAddress) {
44         this.coilAddress = coilAddress;
45     }
46
47     public int getValue() {
48         return value;
49     }
50
51     public void setValue(int value) {
52         this.value = value;
53     }
54
55     public ModbusValue getValueAsModbusValue() {
56         return new ModbusValue(coilAddress, value);
57     }
58
59     @Override
60     public void encodeMessage(byte[] data) throws NibeHeatPumpException {
61         super.encodeMessage(data);
62
63         coilAddress = (data[3] & 0xFF) << 8 | (data[4] & 0xFF);
64         parseMessage(data);
65     }
66
67     @Override
68     public byte[] decodeMessage() {
69         return createModbusReadResponsePdu(coilAddress, value);
70     }
71
72     private byte[] createModbusReadResponsePdu(int coilAddress, int value) {
73         byte[] data = new byte[12];
74
75         data[0] = NibeHeatPumpProtocol.FRAME_START_CHAR_FROM_NIBE;
76         data[1] = 0x00;
77         data[2] = NibeHeatPumpProtocol.ADR_MODBUS40;
78         data[3] = NibeHeatPumpProtocol.CMD_MODBUS_READ_RESP;
79         data[4] = (byte) 0x06; // data len
80
81         data[5] = (byte) (coilAddress & 0xFF);
82         data[6] = (byte) ((coilAddress >> 8) & 0xFF);
83
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);
88
89         data[11] = NibeHeatPumpProtocol.calculateChecksum(data, 2, 11);
90
91         return data;
92     }
93
94     @Override
95     public String toString() {
96         String str = "";
97
98         str += super.toString();
99         str += ", Coil address = " + coilAddress;
100         str += ", Value = " + value;
101
102         return str;
103     }
104
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);
114
115         } else {
116             throw new NibeHeatPumpException("Not Read Response message");
117         }
118     }
119
120     public static class MessageBuilder {
121         private int coilAddress;
122         private int value;
123
124         public MessageBuilder coilAddress(int coilAddress) {
125             this.coilAddress = coilAddress;
126             return this;
127         }
128
129         public MessageBuilder value(int value) {
130             this.value = value;
131             return this;
132         }
133
134         public ModbusReadResponseMessage build() {
135             return new ModbusReadResponseMessage(this);
136         }
137     }
138 }