]> git.basschouten.com Git - openhab-addons.git/blob
32d939052418591ab9b5bbee18c4fa38314645f6
[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.CHANNEL_DATE_TIME;
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.DateTimeType;
23 import org.openhab.core.types.State;
24 import org.openhab.core.types.Type;
25
26 /**
27  * RFXCOM data class for Date and Time message.
28  *
29  * @author Damien Servant - Initial contribution
30  */
31 public class RFXComDateTimeMessage extends RFXComBatteryDeviceMessage<RFXComDateTimeMessage.SubType> {
32
33     public enum SubType implements ByteEnumWrapper {
34         RTGR328N(1);
35
36         private final int subType;
37
38         SubType(int subType) {
39             this.subType = subType;
40         }
41
42         @Override
43         public byte toByte() {
44             return (byte) subType;
45         }
46     }
47
48     public SubType subType;
49     public int sensorId;
50     String dateTime;
51     private int year;
52     private int month;
53     private int day;
54     private int dayOfWeek;
55     private int hour;
56     private int minute;
57     private int second;
58
59     public RFXComDateTimeMessage() {
60         super(PacketType.DATE_TIME);
61     }
62
63     public RFXComDateTimeMessage(byte[] data) throws RFXComException {
64         encodeMessage(data);
65     }
66
67     @Override
68     public String toString() {
69         String str = super.toString();
70
71         str += ", Sub type = " + subType;
72         str += ", Id = " + sensorId;
73         str += ", Date Time = " + dateTime;
74         str += ", Signal level = " + signalLevel;
75         str += ", Battery level = " + batteryLevel;
76
77         return str;
78     }
79
80     @Override
81     public void encodeMessage(byte[] data) throws RFXComException {
82         super.encodeMessage(data);
83
84         subType = fromByte(SubType.class, super.subType);
85
86         sensorId = (data[4] & 0xFF) << 8 | (data[5] & 0xFF);
87
88         year = data[6] & 0xFF;
89         month = data[7] & 0xFF;
90         day = data[8] & 0xFF;
91         dayOfWeek = data[9] & 0xFF;
92         hour = data[10] & 0xFF;
93         minute = data[11] & 0xFF;
94         second = data[12] & 0xFF;
95
96         dateTime = String.format("20%02d-%02d-%02dT%02d:%02d:%02d", year, month, day, hour, minute, second);
97
98         signalLevel = (byte) ((data[13] & 0xF0) >> 4);
99         batteryLevel = (byte) (data[13] & 0x0F);
100     }
101
102     @Override
103     public byte[] decodeMessage() {
104         byte[] data = new byte[14];
105
106         data[0] = (byte) (data.length - 1);
107         data[1] = RFXComBaseMessage.PacketType.DATE_TIME.toByte();
108         data[2] = subType.toByte();
109         data[3] = seqNbr;
110         data[4] = (byte) ((sensorId & 0xFF00) >> 8);
111         data[5] = (byte) (sensorId & 0x00FF);
112         data[6] = (byte) (year & 0x00FF);
113         data[7] = (byte) (month & 0x00FF);
114         data[8] = (byte) (day & 0x00FF);
115         data[9] = (byte) (dayOfWeek & 0x00FF);
116         data[10] = (byte) (hour & 0x00FF);
117         data[11] = (byte) (minute & 0x00FF);
118         data[12] = (byte) (second & 0x00FF);
119         data[13] = (byte) (((signalLevel & 0x0F) << 4) | (batteryLevel & 0x0F));
120
121         return data;
122     }
123
124     @Override
125     public State convertToState(String channelId, DeviceState deviceState) throws RFXComUnsupportedChannelException {
126         if (channelId.equals(CHANNEL_DATE_TIME)) {
127             return new DateTimeType(dateTime);
128         } else {
129             return super.convertToState(channelId, deviceState);
130         }
131     }
132
133     @Override
134     public void convertFromState(String channelId, Type type) {
135         throw new UnsupportedOperationException();
136     }
137
138     @Override
139     public String getDeviceId() {
140         return String.valueOf(sensorId);
141     }
142
143     @Override
144     public void setDeviceId(String deviceId) {
145         throw new UnsupportedOperationException();
146     }
147
148     @Override
149     public SubType convertSubType(String subType) throws RFXComUnsupportedValueException {
150         return ByteEnumUtil.convertSubType(SubType.class, subType);
151     }
152
153     @Override
154     public void setSubType(SubType subType) {
155         this.subType = subType;
156     }
157 }