2 * Copyright (c) 2010-2021 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 RFXComMessageFactoryImpl.INSTANCE.createMessage(THERMOSTAT3);
48 public void basicBoundaryCheck() throws RFXComException {
49 RFXComThermostat3Message message = (RFXComThermostat3Message) RFXComMessageFactoryImpl.INSTANCE
50 .createMessage(THERMOSTAT3);
52 message.subType = RFXComThermostat3Message.SubType.MERTIK__G6R_H4S_TRANSMIT_ONLY;
53 message.command = RFXComThermostat3Message.Commands.ON;
55 RFXComTestHelper.basicBoundaryCheck(THERMOSTAT3, message);
59 public void testSomeMessages() throws RFXComException {
60 testMessage("08420101019FAB0280", MERTIK__G6R_H4TB__G6R_H4T__G6R_H4T21_Z22, 1, "106411",
61 RFXComThermostat3Message.Commands.UP, (byte) 8, OnOffType.ON, null, UpDownType.UP,
62 StringType.valueOf("UP"));
63 testMessage("084200000000410500", MERTIK__G6R_H4T1, 0, "65", RFXComThermostat3Message.Commands.RUN_DOWN,
64 (byte) 0, OnOffType.OFF, null, UpDownType.DOWN, StringType.valueOf("RUN_DOWN"));
67 private void testMessage(String hexMessage, RFXComThermostat3Message.SubType subtype, int sequenceNumber,
68 String sensorId, RFXComThermostat3Message.Commands command, byte signalLevel, State commandChannel,
69 @Nullable State secondCommandChannel, State controlChannel, State commandStringChannel)
70 throws RFXComException {
71 byte[] message = HexUtils.hexToBytes(hexMessage);
72 RFXComThermostat3Message msg = (RFXComThermostat3Message) RFXComMessageFactoryImpl.INSTANCE
73 .createMessage(message);
74 assertEquals(subtype, msg.subType, "SubType");
75 assertEquals(sequenceNumber, (short) (msg.seqNbr & 0xFF), "Seq Number");
76 assertEquals(sensorId, msg.getDeviceId(), "Sensor Id");
77 assertEquals(command, msg.command, CHANNEL_COMMAND);
78 assertEquals(signalLevel, msg.signalLevel, "Signal Level");
80 assertEquals(commandChannel, msg.convertToState(CHANNEL_COMMAND, deviceState));
81 assertEquals(secondCommandChannel, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
82 assertEquals(controlChannel, msg.convertToState(CHANNEL_CONTROL, deviceState));
83 assertEquals(commandStringChannel, msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
85 byte[] decoded = msg.decodeMessage();
87 assertEquals(hexMessage, HexUtils.bytesToHex(decoded), "Message converted back");
89 // TODO please add tests for real messages
92 public void testCommandChannelOn() throws RFXComUnsupportedChannelException {
93 RFXComThermostat3Message msg = new RFXComThermostat3Message();
95 msg.convertFromState(CHANNEL_COMMAND, OnOffType.ON);
97 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
98 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_CONTROL, deviceState));
99 assertEquals(StringType.valueOf("ON"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
100 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
104 public void testCommandChannelOff() throws RFXComUnsupportedChannelException {
105 RFXComThermostat3Message msg = new RFXComThermostat3Message();
107 msg.convertFromState(CHANNEL_COMMAND, OnOffType.OFF);
109 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND, deviceState));
110 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_CONTROL, deviceState));
111 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
112 assertEquals(StringType.valueOf("OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
116 public void testSecondCommandChannelOn() throws RFXComUnsupportedChannelException {
117 RFXComThermostat3Message msg = new RFXComThermostat3Message();
119 msg.convertFromState(CHANNEL_COMMAND_SECOND, OnOffType.ON);
121 assertNull(msg.convertToState(CHANNEL_COMMAND, deviceState));
122 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
123 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
124 assertEquals(StringType.valueOf("SECOND_ON"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
128 public void testSecondCommandChannelOff() throws RFXComUnsupportedChannelException {
129 RFXComThermostat3Message msg = new RFXComThermostat3Message();
131 msg.convertFromState(CHANNEL_COMMAND_SECOND, OnOffType.OFF);
133 assertNull(msg.convertToState(CHANNEL_COMMAND, deviceState));
134 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
135 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
136 assertEquals(StringType.valueOf("SECOND_OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
140 public void testControlUp() throws RFXComUnsupportedChannelException {
141 RFXComThermostat3Message msg = new RFXComThermostat3Message();
143 msg.convertFromState(CHANNEL_CONTROL, UpDownType.UP);
145 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
146 assertEquals(UpDownType.UP, msg.convertToState(CHANNEL_CONTROL, deviceState));
147 assertEquals(StringType.valueOf("UP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
149 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
153 public void testControlDown() throws RFXComUnsupportedChannelException {
154 RFXComThermostat3Message msg = new RFXComThermostat3Message();
156 msg.convertFromState(CHANNEL_CONTROL, UpDownType.DOWN);
158 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, deviceState));
159 assertEquals(UpDownType.DOWN, msg.convertToState(CHANNEL_CONTROL, deviceState));
160 assertEquals(StringType.valueOf("DOWN"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
162 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
166 public void testControlStop() throws RFXComUnsupportedChannelException {
167 RFXComThermostat3Message msg = new RFXComThermostat3Message();
169 msg.convertFromState(CHANNEL_CONTROL, StopMoveType.STOP);
171 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, deviceState));
172 assertEquals(StringType.valueOf("STOP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
174 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
175 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
179 public void testCommandStringOff() throws RFXComUnsupportedChannelException {
180 RFXComThermostat3Message msg = new RFXComThermostat3Message();
182 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("OFF"));
184 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND, deviceState));
185 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_CONTROL, deviceState));
186 assertEquals(StringType.valueOf("OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
187 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
191 public void testCommandStringOn() throws RFXComUnsupportedChannelException {
192 RFXComThermostat3Message msg = new RFXComThermostat3Message();
194 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("On"));
196 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
197 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_CONTROL, deviceState));
198 assertEquals(StringType.valueOf("ON"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
199 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
203 public void testCommandStringUp() throws RFXComUnsupportedChannelException {
204 RFXComThermostat3Message msg = new RFXComThermostat3Message();
206 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("UP"));
208 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
209 assertEquals(UpDownType.UP, msg.convertToState(CHANNEL_CONTROL, deviceState));
210 assertEquals(StringType.valueOf("UP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
212 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
216 public void testCommandStringDown() throws RFXComUnsupportedChannelException {
217 RFXComThermostat3Message msg = new RFXComThermostat3Message();
219 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("down"));
221 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, deviceState));
222 assertEquals(UpDownType.DOWN, msg.convertToState(CHANNEL_CONTROL, deviceState));
223 assertEquals(StringType.valueOf("DOWN"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
224 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
228 public void testCommandStringRunUp() throws RFXComUnsupportedChannelException {
229 RFXComThermostat3Message msg = new RFXComThermostat3Message();
231 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("RUN_UP"));
233 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, deviceState));
234 assertEquals(UpDownType.UP, msg.convertToState(CHANNEL_CONTROL, deviceState));
235 assertEquals(StringType.valueOf("RUN_UP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
236 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
240 public void testCommandStringRunDown() throws RFXComUnsupportedChannelException {
241 RFXComThermostat3Message msg = new RFXComThermostat3Message();
243 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("RUN_DOWN"));
245 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND, deviceState));
246 assertEquals(UpDownType.DOWN, msg.convertToState(CHANNEL_CONTROL, deviceState));
247 assertEquals(StringType.valueOf("RUN_DOWN"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
248 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
252 public void testCommandStringStop() throws RFXComUnsupportedChannelException {
253 RFXComThermostat3Message msg = new RFXComThermostat3Message();
255 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("STOP"));
257 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, deviceState));
258 assertEquals(StringType.valueOf("STOP"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
260 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
261 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
265 public void testCommandStringSecondOn() throws RFXComUnsupportedChannelException {
266 RFXComThermostat3Message msg = new RFXComThermostat3Message();
268 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("SECOND_ON"));
270 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
271 assertEquals(StringType.valueOf("SECOND_ON"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
273 assertNull(msg.convertToState(CHANNEL_COMMAND, deviceState));
274 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));
278 public void testCommandStringSecondOff() throws RFXComUnsupportedChannelException {
279 RFXComThermostat3Message msg = new RFXComThermostat3Message();
281 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("SECOND_OFF"));
283 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND_SECOND, deviceState));
284 assertEquals(StringType.valueOf("SECOND_OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, deviceState));
286 assertNull(msg.convertToState(CHANNEL_COMMAND, deviceState));
287 assertNull(msg.convertToState(CHANNEL_CONTROL, deviceState));