]> git.basschouten.com Git - openhab-addons.git/blob
8a70b9351eac1ef38cbac5ab47c11f70b217d46f
[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.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         IO_LINES(128);
87
88         private final int packetType;
89         private final ByteEnumWrapper[] subTypes;
90
91         PacketType(int packetType, ByteEnumWrapper... subTypes) {
92             this.packetType = packetType;
93             this.subTypes = subTypes;
94         }
95
96         @Override
97         public byte toByte() {
98             return (byte) packetType;
99         }
100     }
101
102     public byte[] rawMessage;
103     private PacketType packetType;
104     public byte packetId;
105     public byte subType;
106     public byte seqNbr;
107     public byte id1;
108     public byte id2;
109
110     public RFXComBaseMessage() {
111     }
112
113     public RFXComBaseMessage(PacketType packetType) {
114         this.packetType = packetType;
115     }
116
117     @Override
118     public void encodeMessage(byte[] data) throws RFXComException {
119         rawMessage = data;
120
121         packetId = data[1];
122         packetType = fromByte(data[1], data[2]);
123         subType = data[2];
124         seqNbr = data[3];
125         id1 = data[4];
126
127         if (data.length > 5) {
128             id2 = data[5];
129         }
130     }
131
132     private PacketType fromByte(byte packetId, byte subType) throws RFXComUnsupportedValueException {
133         for (PacketType enumValue : PacketType.values()) {
134             if (enumValue.toByte() == packetId) {
135                 // if there are no subtypes?
136                 if (enumValue.subTypes.length == 0) {
137                     return enumValue;
138                 }
139                 // otherwise check for the matching subType
140                 for (ByteEnumWrapper e : enumValue.subTypes) {
141                     if (e.toByte() == subType) {
142                         return enumValue;
143                     }
144                 }
145             }
146         }
147
148         throw new RFXComUnsupportedValueException(PacketType.class, packetId);
149     }
150
151     public PacketType getPacketType() {
152         return packetType;
153     }
154
155     @Override
156     public String toString() {
157         String str;
158
159         if (rawMessage == null) {
160             str = "Raw data = unknown";
161         } else {
162             str = "Raw data = " + HexUtils.bytesToHex(rawMessage);
163         }
164
165         str += ", Packet type = " + packetType;
166         str += ", Seq number = " + (short) (seqNbr & 0xFF);
167
168         return str;
169     }
170
171     @Override
172     public void setConfig(RFXComDeviceConfiguration deviceConfiguration) throws RFXComException {
173         // noop
174     }
175 }