2 * Copyright (c) 2010-2020 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.rfxcom.internal.messages;
15 import static org.junit.jupiter.api.Assertions.*;
16 import static org.openhab.binding.rfxcom.internal.RFXComBindingConstants.*;
17 import static org.openhab.binding.rfxcom.internal.messages.RFXComBaseMessage.PacketType.THERMOSTAT3;
18 import static org.openhab.binding.rfxcom.internal.messages.RFXComThermostat3Message.SubType.*;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.eclipse.jdt.annotation.Nullable;
22 import org.junit.jupiter.api.Test;
23 import org.openhab.binding.rfxcom.internal.exceptions.RFXComException;
24 import org.openhab.binding.rfxcom.internal.exceptions.RFXComUnsupportedChannelException;
25 import org.openhab.core.library.types.OnOffType;
26 import org.openhab.core.library.types.StopMoveType;
27 import org.openhab.core.library.types.StringType;
28 import org.openhab.core.library.types.UpDownType;
29 import org.openhab.core.types.State;
30 import org.openhab.core.types.UnDefType;
31 import org.openhab.core.util.HexUtils;
34 * Test for RFXCom-binding
36 * @author Martin van Wingerden - Initial contribution
39 public class RFXComThermostat3MessageTest {
40 private final MockDeviceState deviceState = new MockDeviceState();
43 public void checkForSupportTest() throws RFXComException {
44 RFXComMessageFactory.createMessage(THERMOSTAT3);
48 public void basicBoundaryCheck() throws RFXComException {
49 RFXComThermostat3Message message = (RFXComThermostat3Message) RFXComMessageFactory.createMessage(THERMOSTAT3);
51 message.subType = RFXComThermostat3Message.SubType.MERTIK__G6R_H4S_TRANSMIT_ONLY;
52 message.command = RFXComThermostat3Message.Commands.ON;
54 RFXComTestHelper.basicBoundaryCheck(THERMOSTAT3, message);
58 public void testSomeMessages() throws RFXComException {
59 testMessage("08420101019FAB0280", MERTIK__G6R_H4TB__G6R_H4T__G6R_H4T21_Z22, 1, "106411",
60 RFXComThermostat3Message.Commands.UP, (byte) 8, OnOffType.ON, null, UpDownType.UP,
61 StringType.valueOf("UP"));
62 testMessage("084200000000410500", MERTIK__G6R_H4T1, 0, "65", RFXComThermostat3Message.Commands.RUN_DOWN,
63 (byte) 0, OnOffType.OFF, null, UpDownType.DOWN, StringType.valueOf("RUN_DOWN"));
66 private void testMessage(String hexMessage, RFXComThermostat3Message.SubType subtype, int sequenceNumber,
67 String sensorId, RFXComThermostat3Message.Commands command, byte signalLevel, State commandChannel,
68 @Nullable State secondCommandChannel, State controlChannel, State commandStringChannel)
69 throws RFXComException {
70 byte[] message = HexUtils.hexToBytes(hexMessage);
71 RFXComThermostat3Message msg = (RFXComThermostat3Message) RFXComMessageFactory.createMessage(message);
72 assertEquals(subtype, msg.subType, "SubType");
73 assertEquals(sequenceNumber, (short) (msg.seqNbr & 0xFF), "Seq Number");
74 assertEquals(sensorId, msg.getDeviceId(), "Sensor Id");
75 assertEquals(command, msg.command, CHANNEL_COMMAND);
76 assertEquals(signalLevel, msg.signalLevel, "Signal Level");
78 assertEquals(commandChannel, msg.convertToState(CHANNEL_COMMAND, deviceState));
79 assertEquals(secondCommandChannel, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
80 assertEquals(controlChannel, msg.convertToState(CHANNEL_CONTROL, deviceState));
81 assertEquals(commandStringChannel, msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
83 byte[] decoded = msg.decodeMessage();
85 assertEquals(hexMessage, HexUtils.bytesToHex(decoded), "Message converted back");
87 // TODO please add tests for real messages
90 public void testCommandChannelOn() throws RFXComUnsupportedChannelException {
91 RFXComThermostat3Message msg = new RFXComThermostat3Message();
93 msg.convertFromState(CHANNEL_COMMAND, OnOffType.ON);
95 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
96 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_CONTROL, deviceState));
97 assertEquals(StringType.valueOf("ON"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
98 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
102 public void testCommandChannelOff() throws RFXComUnsupportedChannelException {
103 RFXComThermostat3Message msg = new RFXComThermostat3Message();
105 msg.convertFromState(CHANNEL_COMMAND, OnOffType.OFF);
107 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND, deviceState));
108 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_CONTROL, deviceState));
109 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
110 assertEquals(StringType.valueOf("OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
114 public void testSecondCommandChannelOn() throws RFXComUnsupportedChannelException {
115 RFXComThermostat3Message msg = new RFXComThermostat3Message();
117 msg.convertFromState(CHANNEL_COMMAND_SECOND, OnOffType.ON);
119 assertNull(msg.convertToState(CHANNEL_COMMAND, deviceState));
120 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
121 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
122 assertEquals(StringType.valueOf("SECOND_ON"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
126 public void testSecondCommandChannelOff() throws RFXComUnsupportedChannelException {
127 RFXComThermostat3Message msg = new RFXComThermostat3Message();
129 msg.convertFromState(CHANNEL_COMMAND_SECOND, OnOffType.OFF);
131 assertNull(msg.convertToState(CHANNEL_COMMAND, deviceState));
132 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
133 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
134 assertEquals(StringType.valueOf("SECOND_OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
138 public void testControlUp() throws RFXComUnsupportedChannelException {
139 RFXComThermostat3Message msg = new RFXComThermostat3Message();
141 msg.convertFromState(CHANNEL_CONTROL, UpDownType.UP);
143 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
144 assertEquals(UpDownType.UP, msg.convertToState(CHANNEL_CONTROL, deviceState));
145 assertEquals(StringType.valueOf("UP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
147 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
151 public void testControlDown() throws RFXComUnsupportedChannelException {
152 RFXComThermostat3Message msg = new RFXComThermostat3Message();
154 msg.convertFromState(CHANNEL_CONTROL, UpDownType.DOWN);
156 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, deviceState));
157 assertEquals(UpDownType.DOWN, msg.convertToState(CHANNEL_CONTROL, deviceState));
158 assertEquals(StringType.valueOf("DOWN"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
160 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
164 public void testControlStop() throws RFXComUnsupportedChannelException {
165 RFXComThermostat3Message msg = new RFXComThermostat3Message();
167 msg.convertFromState(CHANNEL_CONTROL, StopMoveType.STOP);
169 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, deviceState));
170 assertEquals(StringType.valueOf("STOP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
172 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
173 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
177 public void testCommandStringOff() throws RFXComUnsupportedChannelException {
178 RFXComThermostat3Message msg = new RFXComThermostat3Message();
180 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("OFF"));
182 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND, deviceState));
183 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_CONTROL, deviceState));
184 assertEquals(StringType.valueOf("OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
185 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
189 public void testCommandStringOn() throws RFXComUnsupportedChannelException {
190 RFXComThermostat3Message msg = new RFXComThermostat3Message();
192 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("On"));
194 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
195 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_CONTROL, deviceState));
196 assertEquals(StringType.valueOf("ON"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
197 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
201 public void testCommandStringUp() throws RFXComUnsupportedChannelException {
202 RFXComThermostat3Message msg = new RFXComThermostat3Message();
204 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("UP"));
206 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
207 assertEquals(UpDownType.UP, msg.convertToState(CHANNEL_CONTROL, deviceState));
208 assertEquals(StringType.valueOf("UP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
210 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
214 public void testCommandStringDown() throws RFXComUnsupportedChannelException {
215 RFXComThermostat3Message msg = new RFXComThermostat3Message();
217 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("down"));
219 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, deviceState));
220 assertEquals(UpDownType.DOWN, msg.convertToState(CHANNEL_CONTROL, deviceState));
221 assertEquals(StringType.valueOf("DOWN"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
222 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
226 public void testCommandStringRunUp() throws RFXComUnsupportedChannelException {
227 RFXComThermostat3Message msg = new RFXComThermostat3Message();
229 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("RUN_UP"));
231 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
232 assertEquals(UpDownType.UP, msg.convertToState(CHANNEL_CONTROL, deviceState));
233 assertEquals(StringType.valueOf("RUN_UP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
234 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
238 public void testCommandStringRunDown() throws RFXComUnsupportedChannelException {
239 RFXComThermostat3Message msg = new RFXComThermostat3Message();
241 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("RUN_DOWN"));
243 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND, deviceState));
244 assertEquals(UpDownType.DOWN, msg.convertToState(CHANNEL_CONTROL, deviceState));
245 assertEquals(StringType.valueOf("RUN_DOWN"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
246 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
250 public void testCommandStringStop() throws RFXComUnsupportedChannelException {
251 RFXComThermostat3Message msg = new RFXComThermostat3Message();
253 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("STOP"));
255 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, deviceState));
256 assertEquals(StringType.valueOf("STOP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
258 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
259 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
263 public void testCommandStringSecondOn() throws RFXComUnsupportedChannelException {
264 RFXComThermostat3Message msg = new RFXComThermostat3Message();
266 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("SECOND_ON"));
268 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
269 assertEquals(StringType.valueOf("SECOND_ON"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
271 assertNull(msg.convertToState(CHANNEL_COMMAND, deviceState));
272 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
276 public void testCommandStringSecondOff() throws RFXComUnsupportedChannelException {
277 RFXComThermostat3Message msg = new RFXComThermostat3Message();
279 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("SECOND_OFF"));
281 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
282 assertEquals(StringType.valueOf("SECOND_OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
284 assertNull(msg.convertToState(CHANNEL_COMMAND, deviceState));
285 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));