]> git.basschouten.com Git - openhab-addons.git/blob
1f49b97f339b93ddad5f12db77857035d8ff1102
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.rfxcom.internal.messages;
14
15 import org.openhab.binding.rfxcom.internal.config.RFXComDeviceConfiguration;
16 import org.openhab.binding.rfxcom.internal.exceptions.RFXComException;
17 import org.openhab.binding.rfxcom.internal.exceptions.RFXComUnsupportedValueException;
18 import org.openhab.core.util.HexUtils;
19
20 /**
21  * Base class for RFXCOM data classes. All other data classes should extend this class.
22  *
23  * @author Pauli Anttila - Initial contribution
24  */
25 public abstract class RFXComBaseMessage implements RFXComMessage {
26
27     public static final String ID_DELIMITER = ".";
28
29     public enum PacketType implements ByteEnumWrapper {
30         INTERFACE_CONTROL(0),
31         INTERFACE_MESSAGE(1),
32         TRANSMITTER_MESSAGE(2),
33         UNDECODED_RF_MESSAGE(3),
34         LIGHTING1(16),
35         LIGHTING2(17),
36         LIGHTING3(18),
37         LIGHTING4(19),
38         LIGHTING5(20),
39         LIGHTING6(21),
40         CHIME(22),
41         FAN(23, RFXComFanMessage.SubType.LUCCI_AIR_FAN, RFXComFanMessage.SubType.WESTINGHOUSE_7226640,
42                 RFXComFanMessage.SubType.CASAFAN),
43         FAN_SF01(23, RFXComFanMessage.SubType.SF01),
44         FAN_ITHO(23, RFXComFanMessage.SubType.CVE_RFT),
45         FAN_LUCCI_DC(23, RFXComFanMessage.SubType.LUCCI_AIR_DC),
46         FAN_LUCCI_DC_II(23, RFXComFanMessage.SubType.LUCCI_AIR_DC_II),
47         FAN_SEAV(23, RFXComFanMessage.SubType.SEAV_TXS4),
48         FAN_FT1211R(23, RFXComFanMessage.SubType.FT1211R),
49         FAN_FALMEC(23, RFXComFanMessage.SubType.FALMEC),
50         CURTAIN1(24),
51         BLINDS1(25),
52         RFY(26),
53         HOME_CONFORT(27),
54         EDISIO(28),
55         SECURITY1(32),
56         SECURITY2(33),
57         CAMERA1(40),
58         REMOTE_CONTROL(48),
59         THERMOSTAT1(64),
60         THERMOSTAT2(65),
61         THERMOSTAT3(66),
62         THERMOSTAT4(67),
63         RADIATOR1(72),
64         BBQ(78),
65         TEMPERATURE_RAIN(79),
66         TEMPERATURE(80),
67         HUMIDITY(81),
68         TEMPERATURE_HUMIDITY(82),
69         BAROMETRIC(83),
70         TEMPERATURE_HUMIDITY_BAROMETRIC(84),
71         RAIN(85),
72         WIND(86),
73         UV(87),
74         DATE_TIME(88),
75         CURRENT(89),
76         ENERGY(90),
77         CURRENT_ENERGY(91),
78         POWER(92),
79         WEIGHT(93),
80         GAS(94),
81         WATER(95),
82         CARTELECTRONIC(96),
83         RFXSENSOR(112),
84         RFXMETER(113),
85         FS20(114),
86         RAW(127),
87         IO_LINES(128);
88
89         private final int packetType;
90         private final ByteEnumWrapper[] subTypes;
91
92         PacketType(int packetType, ByteEnumWrapper... subTypes) {
93             this.packetType = packetType;
94             this.subTypes = subTypes;
95         }
96
97         @Override
98         public byte toByte() {
99             return (byte) packetType;
100         }
101     }
102
103     public byte[] rawMessage;
104     private PacketType packetType;
105     public byte packetId;
106     public byte subType;
107     public byte seqNbr;
108     public byte id1;
109     public byte id2;
110
111     public RFXComBaseMessage() {
112     }
113
114     public RFXComBaseMessage(PacketType packetType) {
115         this.packetType = packetType;
116     }
117
118     @Override
119     public void encodeMessage(byte[] data) throws RFXComException {
120         rawMessage = data;
121
122         packetId = data[1];
123         packetType = fromByte(data[1], data[2]);
124         subType = data[2];
125         seqNbr = data[3];
126         id1 = data[4];
127
128         if (data.length > 5) {
129             id2 = data[5];
130         }
131     }
132
133     private PacketType fromByte(byte packetId, byte subType) throws RFXComUnsupportedValueException {
134         for (PacketType enumValue : PacketType.values()) {
135             if (enumValue.toByte() == packetId) {
136                 // if there are no subtypes?
137                 if (enumValue.subTypes.length == 0) {
138                     return enumValue;
139                 }
140                 // otherwise check for the matching subType
141                 for (ByteEnumWrapper e : enumValue.subTypes) {
142                     if (e.toByte() == subType) {
143                         return enumValue;
144                     }
145                 }
146             }
147         }
148
149         throw new RFXComUnsupportedValueException(PacketType.class, packetId);
150     }
151
152     public PacketType getPacketType() {
153         return packetType;
154     }
155
156     @Override
157     public String toString() {
158         String str;
159
160         if (rawMessage == null) {
161             str = "Raw data = unknown";
162         } else {
163             str = "Raw data = " + HexUtils.bytesToHex(rawMessage);
164         }
165
166         str += ", Packet type = " + packetType;
167         str += ", Seq number = " + Byte.toUnsignedInt(seqNbr);
168
169         return str;
170     }
171
172     @Override
173     public void setConfig(RFXComDeviceConfiguration deviceConfiguration) throws RFXComException {
174         // noop
175     }
176 }