]> git.basschouten.com Git - openhab-addons.git/blob
66b2f1e0ed1b1a68c8a5d7de218372b3a7876051
[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 static org.openhab.binding.rfxcom.internal.RFXComBindingConstants.*;
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.library.types.StringType;
24 import org.openhab.core.types.State;
25 import org.openhab.core.types.Type;
26
27 /**
28  * RFXCOM data class for temperature, humidity and barometric message.
29  *
30  * @author Damien Servant - Initial contribution
31  * @author Martin van Wingerden - ported to openHAB 2.0
32  */
33 public class RFXComTemperatureHumidityBarometricMessage
34         extends RFXComBatteryDeviceMessage<RFXComTemperatureHumidityBarometricMessage.SubType> {
35
36     public enum SubType implements ByteEnumWrapper {
37         THB1(1), // BTHR918, BTHGN129
38         THB2(2); // BTHR918N, BTHR968
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 enum HumidityStatus implements ByteEnumWrapper {
53         NORMAL(0),
54         COMFORT(1),
55         DRY(2),
56         WET(3);
57
58         private final int humidityStatus;
59
60         HumidityStatus(int humidityStatus) {
61             this.humidityStatus = humidityStatus;
62         }
63
64         @Override
65         public byte toByte() {
66             return (byte) humidityStatus;
67         }
68     }
69
70     public enum ForecastStatus implements ByteEnumWrapper {
71         NO_INFO_AVAILABLE(0),
72         SUNNY(1),
73         PARTLY_CLOUDY(2),
74         CLOUDY(3),
75         RAIN(4);
76
77         private final int forecastStatus;
78
79         ForecastStatus(int forecastStatus) {
80             this.forecastStatus = forecastStatus;
81         }
82
83         @Override
84         public byte toByte() {
85             return (byte) forecastStatus;
86         }
87     }
88
89     public SubType subType;
90     public int sensorId;
91     public double temperature;
92     public byte humidity;
93     public HumidityStatus humidityStatus;
94     public double pressure;
95     public ForecastStatus forecastStatus;
96
97     public RFXComTemperatureHumidityBarometricMessage() {
98         super(PacketType.TEMPERATURE_HUMIDITY_BAROMETRIC);
99     }
100
101     public RFXComTemperatureHumidityBarometricMessage(byte[] data) throws RFXComException {
102         encodeMessage(data);
103     }
104
105     @Override
106     public String toString() {
107         String str = super.toString();
108         str += ", Sub type = " + subType;
109         str += ", Device Id = " + sensorId;
110         str += ", Temperature = " + temperature;
111         str += ", Humidity = " + humidity;
112         str += ", Humidity status = " + humidityStatus;
113         str += ", Pressure = " + pressure;
114         str += ", Forecast = " + forecastStatus;
115         str += ", Signal level = " + signalLevel;
116         str += ", Battery level = " + batteryLevel;
117
118         return str;
119     }
120
121     @Override
122     public void encodeMessage(byte[] data) throws RFXComException {
123         super.encodeMessage(data);
124
125         subType = fromByte(SubType.class, super.subType);
126         sensorId = (data[4] & 0xFF) << 8 | (data[5] & 0xFF);
127
128         temperature = (short) ((data[6] & 0x7F) << 8 | (data[7] & 0xFF)) * 0.1;
129         if ((data[6] & 0x80) != 0) {
130             temperature = -temperature;
131         }
132
133         humidity = data[8];
134         humidityStatus = fromByte(HumidityStatus.class, data[9]);
135
136         pressure = (data[10] & 0xFF) << 8 | (data[11] & 0xFF);
137         forecastStatus = fromByte(ForecastStatus.class, data[12]);
138
139         signalLevel = (byte) ((data[13] & 0xF0) >> 4);
140         batteryLevel = (byte) (data[13] & 0x0F);
141     }
142
143     @Override
144     public byte[] decodeMessage() {
145         byte[] data = new byte[14];
146
147         data[0] = 0x0D;
148         data[1] = RFXComBaseMessage.PacketType.TEMPERATURE_HUMIDITY_BAROMETRIC.toByte();
149         data[2] = subType.toByte();
150         data[3] = seqNbr;
151         data[4] = (byte) ((sensorId & 0xFF00) >> 8);
152         data[5] = (byte) (sensorId & 0x00FF);
153
154         short temp = (short) Math.abs(temperature * 10);
155         data[6] = (byte) ((temp >> 8) & 0xFF);
156         data[7] = (byte) (temp & 0xFF);
157         if (temperature < 0) {
158             data[6] |= 0x80;
159         }
160
161         data[8] = humidity;
162         data[9] = humidityStatus.toByte();
163
164         temp = (short) (pressure);
165         data[10] = (byte) ((temp >> 8) & 0xFF);
166         data[11] = (byte) (temp & 0xFF);
167
168         data[12] = forecastStatus.toByte();
169
170         data[13] = (byte) (((signalLevel & 0x0F) << 4) | (batteryLevel & 0x0F));
171
172         return data;
173     }
174
175     @Override
176     public String getDeviceId() {
177         return String.valueOf(sensorId);
178     }
179
180     @Override
181     public State convertToState(String channelId, DeviceState deviceState) throws RFXComUnsupportedChannelException {
182         switch (channelId) {
183             case CHANNEL_TEMPERATURE:
184                 return new DecimalType(temperature);
185
186             case CHANNEL_HUMIDITY:
187                 return new DecimalType(humidity);
188
189             case CHANNEL_PRESSURE:
190                 return new DecimalType(pressure);
191
192             case CHANNEL_HUMIDITY_STATUS:
193                 return new StringType(humidityStatus.toString());
194
195             case CHANNEL_FORECAST:
196                 return new StringType(forecastStatus.toString());
197
198             default:
199                 return super.convertToState(channelId, deviceState);
200         }
201     }
202
203     @Override
204     public void convertFromState(String channelId, Type type) {
205         throw new UnsupportedOperationException();
206     }
207
208     @Override
209     public SubType convertSubType(String subType) throws RFXComUnsupportedValueException {
210         return ByteEnumUtil.convertSubType(SubType.class, subType);
211     }
212
213     @Override
214     public void setSubType(SubType subType) {
215         throw new UnsupportedOperationException();
216     }
217
218     @Override
219     public void setDeviceId(String deviceId) {
220         throw new UnsupportedOperationException();
221     }
222 }