]> git.basschouten.com Git - openhab-addons.git/blob
7640e56c15731d0fa296d9f62cffbaa639c0aa78
[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 static org.openhab.binding.rfxcom.internal.RFXComBindingConstants.CHANNEL_CHIME_SOUND;
16 import static org.openhab.binding.rfxcom.internal.messages.ByteEnumUtil.fromByte;
17
18 import org.openhab.binding.rfxcom.internal.exceptions.RFXComException;
19 import org.openhab.binding.rfxcom.internal.exceptions.RFXComUnsupportedChannelException;
20 import org.openhab.binding.rfxcom.internal.exceptions.RFXComUnsupportedValueException;
21 import org.openhab.binding.rfxcom.internal.handler.DeviceState;
22 import org.openhab.core.library.types.DecimalType;
23 import org.openhab.core.types.State;
24 import org.openhab.core.types.Type;
25
26 /**
27  * RFXCOM data class for chime messages.
28  *
29  * @author Mike Jagdis - Initial contribution
30  */
31 public class RFXComChimeMessage extends RFXComDeviceMessageImpl<RFXComChimeMessage.SubType> {
32
33     public enum SubType implements ByteEnumWrapper {
34         BYRONSX(0),
35         BYRONMP001(1),
36         SELECTPLUS(2),
37         SELECTPLUS3(3),
38         ENVIVO(4);
39
40         private final int subType;
41
42         SubType(int subType) {
43             this.subType = subType;
44         }
45
46         @Override
47         public byte toByte() {
48             return (byte) subType;
49         }
50     }
51
52     public SubType subType;
53     public int sensorId;
54     public int chimeSound;
55
56     public RFXComChimeMessage() {
57         super(PacketType.CHIME);
58     }
59
60     public RFXComChimeMessage(byte[] data) throws RFXComException {
61         encodeMessage(data);
62     }
63
64     @Override
65     public String toString() {
66         String str = "";
67
68         str += super.toString();
69         str += ", Sub type = " + subType;
70         str += ", Device Id = " + getDeviceId();
71         str += ", Chime Sound = " + chimeSound;
72         str += ", Signal level = " + signalLevel;
73
74         return str;
75     }
76
77     @Override
78     public void encodeMessage(byte[] data) throws RFXComException {
79         super.encodeMessage(data);
80
81         subType = fromByte(SubType.class, super.subType);
82
83         switch (subType) {
84             case BYRONSX:
85                 sensorId = (data[4] & 0xFF) << 8 | (data[5] & 0xFF);
86                 chimeSound = data[6];
87                 break;
88             case BYRONMP001:
89             case SELECTPLUS:
90             case SELECTPLUS3:
91             case ENVIVO:
92                 sensorId = (data[4] & 0xFF) << 16 | (data[5] & 0xFF) << 8 | (data[6] & 0xFF);
93                 chimeSound = 1;
94                 break;
95         }
96
97         signalLevel = (byte) ((data[7] & 0xF0) >> 4);
98     }
99
100     @Override
101     public byte[] decodeMessage() {
102         byte[] data = new byte[8];
103
104         data[0] = 0x07;
105         data[1] = getPacketType().toByte();
106         data[2] = subType.toByte();
107         data[3] = seqNbr;
108
109         switch (subType) {
110             case BYRONSX:
111                 data[4] = (byte) ((sensorId & 0xFF00) >> 8);
112                 data[5] = (byte) (sensorId & 0x00FF);
113                 data[6] = (byte) chimeSound;
114                 break;
115             case BYRONMP001:
116             case SELECTPLUS:
117             case SELECTPLUS3:
118             case ENVIVO:
119                 data[4] = (byte) ((sensorId & 0xFF0000) >> 16);
120                 data[5] = (byte) ((sensorId & 0x00FF00) >> 8);
121                 data[6] = (byte) ((sensorId & 0x0000FF));
122                 break;
123         }
124
125         data[7] = (byte) ((signalLevel & 0x0F) << 4);
126
127         return data;
128     }
129
130     @Override
131     public String getDeviceId() {
132         return String.valueOf(sensorId);
133     }
134
135     @Override
136     public State convertToState(String channelId, DeviceState deviceState) throws RFXComUnsupportedChannelException {
137         if (CHANNEL_CHIME_SOUND.equals(channelId)) {
138             return new DecimalType(chimeSound);
139         } else {
140             return super.convertToState(channelId, deviceState);
141         }
142     }
143
144     @Override
145     public void setSubType(SubType subType) {
146         this.subType = subType;
147     }
148
149     @Override
150     public void setDeviceId(String sensorId) {
151         this.sensorId = Integer.parseInt(sensorId);
152     }
153
154     @Override
155     public void convertFromState(String channelId, Type type) throws RFXComUnsupportedChannelException {
156         if (CHANNEL_CHIME_SOUND.equals(channelId)) {
157             if (type instanceof DecimalType) {
158                 chimeSound = ((DecimalType) type).intValue();
159             } else {
160                 throw new RFXComUnsupportedChannelException("Channel " + channelId + " does not accept " + type);
161             }
162         } else {
163             throw new RFXComUnsupportedChannelException("Channel " + channelId + " is not relevant here");
164         }
165     }
166
167     @Override
168     public SubType convertSubType(String subType) throws RFXComUnsupportedValueException {
169         return ByteEnumUtil.convertSubType(SubType.class, subType);
170     }
171 }