2 * Copyright (c) 2010-2022 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.RFXComTestHelper.commandChannelUID;
18 import static org.openhab.binding.rfxcom.internal.messages.RFXComBaseMessage.PacketType.THERMOSTAT3;
19 import static org.openhab.binding.rfxcom.internal.messages.RFXComThermostat3Message.SubType.*;
21 import org.eclipse.jdt.annotation.NonNullByDefault;
22 import org.eclipse.jdt.annotation.Nullable;
23 import org.junit.jupiter.api.Test;
24 import org.openhab.binding.rfxcom.internal.RFXComTestHelper;
25 import org.openhab.binding.rfxcom.internal.config.RFXComGenericDeviceConfiguration;
26 import org.openhab.binding.rfxcom.internal.exceptions.RFXComException;
27 import org.openhab.core.library.types.OnOffType;
28 import org.openhab.core.library.types.StopMoveType;
29 import org.openhab.core.library.types.StringType;
30 import org.openhab.core.library.types.UpDownType;
31 import org.openhab.core.types.State;
32 import org.openhab.core.types.UnDefType;
33 import org.openhab.core.util.HexUtils;
36 * Test for RFXCom-binding
38 * @author Martin van Wingerden - Initial contribution
41 public class RFXComThermostat3MessageTest {
42 private static RFXComGenericDeviceConfiguration config = new RFXComGenericDeviceConfiguration();
45 config.deviceId = "106411";
46 config.subType = RFXComThermostat3Message.SubType.MERTIK__G6R_H4S_TRANSMIT_ONLY.toString();
49 private final MockDeviceState deviceState = new MockDeviceState();
52 public void checkForSupportTest() throws RFXComException {
53 RFXComMessageFactoryImpl.INSTANCE.createMessage(THERMOSTAT3, config, commandChannelUID, OnOffType.ON);
57 public void basicBoundaryCheck() throws RFXComException {
58 RFXComThermostat3Message message = (RFXComThermostat3Message) RFXComMessageFactoryImpl.INSTANCE
59 .createMessage(THERMOSTAT3, config, commandChannelUID, OnOffType.ON);
61 RFXComTestHelper.basicBoundaryCheck(THERMOSTAT3, message);
65 public void testSomeMessages() throws RFXComException {
66 testMessage("08420101019FAB0280", MERTIK__G6R_H4TB__G6R_H4T__G6R_H4T21_Z22, 1, "106411",
67 RFXComThermostat3Message.Commands.UP, (byte) 8, OnOffType.ON, null, UpDownType.UP,
68 StringType.valueOf("UP"));
69 testMessage("084200000000410500", MERTIK__G6R_H4T1, 0, "65", RFXComThermostat3Message.Commands.RUN_DOWN,
70 (byte) 0, OnOffType.OFF, null, UpDownType.DOWN, StringType.valueOf("RUN_DOWN"));
73 private void testMessage(String hexMessage, RFXComThermostat3Message.SubType subtype, int sequenceNumber,
74 String sensorId, RFXComThermostat3Message.Commands command, byte signalLevel, State commandChannel,
75 @Nullable State secondCommandChannel, State controlChannel, State commandStringChannel)
76 throws RFXComException {
77 byte[] message = HexUtils.hexToBytes(hexMessage);
78 RFXComThermostat3Message msg = (RFXComThermostat3Message) RFXComMessageFactoryImpl.INSTANCE
79 .createMessage(message);
80 assertEquals(subtype, msg.subType, "SubType");
81 assertEquals(sequenceNumber, (short) (msg.seqNbr & 0xFF), "Seq Number");
82 assertEquals(sensorId, msg.getDeviceId(), "Sensor Id");
83 assertEquals(command, msg.command, CHANNEL_COMMAND);
84 assertEquals(signalLevel, msg.signalLevel, "Signal Level");
86 assertEquals(commandChannel, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
87 assertEquals(secondCommandChannel, msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
88 assertEquals(controlChannel, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
89 assertEquals(commandStringChannel, msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
91 byte[] decoded = msg.decodeMessage();
93 assertEquals(hexMessage, HexUtils.bytesToHex(decoded), "Message converted back");
97 public void testCommandChannelOn() throws RFXComException {
98 RFXComThermostat3Message msg = new RFXComThermostat3Message();
100 msg.convertFromState(CHANNEL_COMMAND, OnOffType.ON);
102 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
103 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
104 assertEquals(StringType.valueOf("ON"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
105 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
109 public void testCommandChannelOff() throws RFXComException {
110 RFXComThermostat3Message msg = new RFXComThermostat3Message();
112 msg.convertFromState(CHANNEL_COMMAND, OnOffType.OFF);
114 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
115 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
116 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
117 assertEquals(StringType.valueOf("OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
121 public void testSecondCommandChannelOn() throws RFXComException {
122 RFXComThermostat3Message msg = new RFXComThermostat3Message();
124 msg.convertFromState(CHANNEL_COMMAND_SECOND, OnOffType.ON);
126 assertNull(msg.convertToState(CHANNEL_COMMAND, config, deviceState));
127 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
128 assertNull(msg.convertToState(CHANNEL_CONTROL, config, deviceState));
129 assertEquals(StringType.valueOf("SECOND_ON"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
133 public void testSecondCommandChannelOff() throws RFXComException {
134 RFXComThermostat3Message msg = new RFXComThermostat3Message();
136 msg.convertFromState(CHANNEL_COMMAND_SECOND, OnOffType.OFF);
138 assertNull(msg.convertToState(CHANNEL_COMMAND, config, deviceState));
139 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
140 assertNull(msg.convertToState(CHANNEL_CONTROL, config, deviceState));
141 assertEquals(StringType.valueOf("SECOND_OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
145 public void testControlUp() throws RFXComException {
146 RFXComThermostat3Message msg = new RFXComThermostat3Message();
148 msg.convertFromState(CHANNEL_CONTROL, UpDownType.UP);
150 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
151 assertEquals(UpDownType.UP, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
152 assertEquals(StringType.valueOf("UP"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
154 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
158 public void testControlDown() throws RFXComException {
159 RFXComThermostat3Message msg = new RFXComThermostat3Message();
161 msg.convertFromState(CHANNEL_CONTROL, UpDownType.DOWN);
163 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
164 assertEquals(UpDownType.DOWN, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
165 assertEquals(StringType.valueOf("DOWN"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
167 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
171 public void testControlStop() throws RFXComException {
172 RFXComThermostat3Message msg = new RFXComThermostat3Message();
174 msg.convertFromState(CHANNEL_CONTROL, StopMoveType.STOP);
176 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
177 assertEquals(StringType.valueOf("STOP"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
179 assertNull(msg.convertToState(CHANNEL_CONTROL, config, deviceState));
180 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
184 public void testCommandStringOff() throws RFXComException {
185 RFXComThermostat3Message msg = new RFXComThermostat3Message();
187 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("OFF"));
189 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
190 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
191 assertEquals(StringType.valueOf("OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
192 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
196 public void testCommandStringOn() throws RFXComException {
197 RFXComThermostat3Message msg = new RFXComThermostat3Message();
199 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("On"));
201 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
202 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
203 assertEquals(StringType.valueOf("ON"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
204 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
208 public void testCommandStringUp() throws RFXComException {
209 RFXComThermostat3Message msg = new RFXComThermostat3Message();
211 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("UP"));
213 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
214 assertEquals(UpDownType.UP, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
215 assertEquals(StringType.valueOf("UP"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
217 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
221 public void testCommandStringDown() throws RFXComException {
222 RFXComThermostat3Message msg = new RFXComThermostat3Message();
224 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("down"));
226 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
227 assertEquals(UpDownType.DOWN, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
228 assertEquals(StringType.valueOf("DOWN"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
229 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
233 public void testCommandStringRunUp() throws RFXComException {
234 RFXComThermostat3Message msg = new RFXComThermostat3Message();
236 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("RUN_UP"));
238 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
239 assertEquals(UpDownType.UP, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
240 assertEquals(StringType.valueOf("RUN_UP"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
241 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
245 public void testCommandStringRunDown() throws RFXComException {
246 RFXComThermostat3Message msg = new RFXComThermostat3Message();
248 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("RUN_DOWN"));
250 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
251 assertEquals(UpDownType.DOWN, msg.convertToState(CHANNEL_CONTROL, config, deviceState));
252 assertEquals(StringType.valueOf("RUN_DOWN"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
253 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
257 public void testCommandStringStop() throws RFXComException {
258 RFXComThermostat3Message msg = new RFXComThermostat3Message();
260 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("STOP"));
262 assertEquals(UnDefType.UNDEF, msg.convertToState(CHANNEL_COMMAND, config, deviceState));
263 assertEquals(StringType.valueOf("STOP"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
265 assertNull(msg.convertToState(CHANNEL_CONTROL, config, deviceState));
266 assertNull(msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
270 public void testCommandStringSecondOn() throws RFXComException {
271 RFXComThermostat3Message msg = new RFXComThermostat3Message();
273 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("SECOND_ON"));
275 assertEquals(OnOffType.ON, msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
276 assertEquals(StringType.valueOf("SECOND_ON"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
278 assertNull(msg.convertToState(CHANNEL_COMMAND, config, deviceState));
279 assertNull(msg.convertToState(CHANNEL_CONTROL, config, deviceState));
283 public void testCommandStringSecondOff() throws RFXComException {
284 RFXComThermostat3Message msg = new RFXComThermostat3Message();
286 msg.convertFromState(CHANNEL_COMMAND_STRING, StringType.valueOf("SECOND_OFF"));
288 assertEquals(OnOffType.OFF, msg.convertToState(CHANNEL_COMMAND_SECOND, config, deviceState));
289 assertEquals(StringType.valueOf("SECOND_OFF"), msg.convertToState(CHANNEL_COMMAND_STRING, config, deviceState));
291 assertNull(msg.convertToState(CHANNEL_COMMAND, config, deviceState));
292 assertNull(msg.convertToState(CHANNEL_CONTROL, config, deviceState));