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.livisismarthome.internal.handler;
15 import static org.junit.jupiter.api.Assertions.*;
16 import static org.mockito.ArgumentMatchers.any;
17 import static org.mockito.Mockito.*;
18 import static org.openhab.binding.livisismarthome.internal.LivisiBindingConstants.*;
19 import static org.openhab.binding.livisismarthome.internal.client.api.entity.capability.CapabilityStateDTO.STATE_VALUE_OPERATION_MODE_AUTO;
20 import static org.openhab.binding.livisismarthome.internal.client.api.entity.capability.CapabilityStateDTO.STATE_VALUE_OPERATION_MODE_MANUAL;
21 import static org.openhab.binding.livisismarthome.internal.client.api.entity.link.LinkDTO.LINK_TYPE_CAPABILITY;
22 import static org.openhab.binding.livisismarthome.internal.client.api.entity.link.LinkDTO.LINK_TYPE_DEVICE;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.LinkedHashMap;
27 import java.util.LinkedHashSet;
29 import java.util.Objects;
30 import java.util.Optional;
32 import java.util.function.Consumer;
34 import org.eclipse.jdt.annotation.NonNullByDefault;
35 import org.eclipse.jdt.annotation.Nullable;
36 import org.junit.jupiter.api.AfterEach;
37 import org.junit.jupiter.api.BeforeEach;
38 import org.junit.jupiter.api.Test;
39 import org.openhab.binding.livisismarthome.internal.client.api.entity.action.ShutterActionType;
40 import org.openhab.binding.livisismarthome.internal.client.api.entity.capability.CapabilityConfigDTO;
41 import org.openhab.binding.livisismarthome.internal.client.api.entity.capability.CapabilityDTO;
42 import org.openhab.binding.livisismarthome.internal.client.api.entity.capability.CapabilityStateDTO;
43 import org.openhab.binding.livisismarthome.internal.client.api.entity.device.DeviceConfigDTO;
44 import org.openhab.binding.livisismarthome.internal.client.api.entity.device.DeviceDTO;
45 import org.openhab.binding.livisismarthome.internal.client.api.entity.device.DeviceStateDTO;
46 import org.openhab.binding.livisismarthome.internal.client.api.entity.event.EventDTO;
47 import org.openhab.binding.livisismarthome.internal.client.api.entity.event.EventPropertiesDTO;
48 import org.openhab.core.config.core.Configuration;
49 import org.openhab.core.library.types.DecimalType;
50 import org.openhab.core.library.types.OnOffType;
51 import org.openhab.core.library.types.OpenClosedType;
52 import org.openhab.core.library.types.QuantityType;
53 import org.openhab.core.library.types.StopMoveType;
54 import org.openhab.core.library.types.StringType;
55 import org.openhab.core.library.types.UpDownType;
56 import org.openhab.core.library.unit.SIUnits;
57 import org.openhab.core.library.unit.Units;
58 import org.openhab.core.thing.Bridge;
59 import org.openhab.core.thing.Channel;
60 import org.openhab.core.thing.ChannelUID;
61 import org.openhab.core.thing.CommonTriggerEvents;
62 import org.openhab.core.thing.Thing;
63 import org.openhab.core.thing.ThingStatus;
64 import org.openhab.core.thing.ThingStatusDetail;
65 import org.openhab.core.thing.ThingStatusInfo;
66 import org.openhab.core.thing.ThingTypeUID;
67 import org.openhab.core.thing.ThingUID;
68 import org.openhab.core.thing.binding.ThingHandlerCallback;
69 import org.openhab.core.thing.binding.builder.ChannelBuilder;
70 import org.openhab.core.thing.binding.builder.ThingStatusInfoBuilder;
71 import org.openhab.core.types.State;
72 import org.slf4j.LoggerFactory;
74 import ch.qos.logback.classic.Level;
75 import ch.qos.logback.classic.Logger;
78 * @author Sven Strohschein - Initial contribution
81 public class LivisiDeviceHandlerTest {
83 private @NonNullByDefault({}) LivisiBridgeHandler bridgeHandlerMock;
84 private @NonNullByDefault({}) ThingStatusInfo thingStatusInfo;
85 private @NonNullByDefault({}) Map<String, State> updatedChannels;
86 private @NonNullByDefault({}) Set<TriggeredEvent> triggeredChannels;
88 private @NonNullByDefault({}) Level previousLoggingLevel;
91 public void before() {
92 bridgeHandlerMock = mock(LivisiBridgeHandler.class);
93 thingStatusInfo = ThingStatusInfoBuilder.create(ThingStatus.UNINITIALIZED, ThingStatusDetail.NONE).build();
94 updatedChannels = new LinkedHashMap<>();
95 triggeredChannels = new LinkedHashSet<>();
97 Logger logger = (Logger) LoggerFactory.getLogger(LivisiDeviceHandler.class);
98 previousLoggingLevel = logger.getLevel();
99 logger.setLevel(Level.OFF); // avoid log messages (which would be logged to the console)
103 public void after() {
104 Logger logger = (Logger) LoggerFactory.getLogger(LivisiDeviceHandler.class);
105 logger.setLevel(previousLoggingLevel);
109 public void testInitialize() {
110 LivisiDeviceHandler deviceHandler = createDeviceHandler(createDevice());
111 assertEquals(ThingStatus.ONLINE, deviceHandler.getThing().getStatus());
115 public void testOnDeviceStateChanged() {
116 DeviceDTO device = createDevice();
117 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
119 deviceHandler.onDeviceStateChanged(device);
123 public void testOnDeviceStateChanged_IsReachable() {
124 DeviceStateDTO deviceState = new DeviceStateDTO();
125 deviceState.setReachable(true);
127 DeviceDTO device = createDevice();
128 device.setDeviceState(deviceState);
130 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
132 deviceHandler.onDeviceStateChanged(device);
133 assertEquals(ThingStatus.ONLINE, deviceHandler.getThing().getStatus());
134 assertEquals(ThingStatusDetail.NONE, deviceHandler.getThing().getStatusInfo().getStatusDetail());
138 public void testOnDeviceStateChanged_IsNotReachable() {
139 DeviceStateDTO deviceState = new DeviceStateDTO();
140 deviceState.setReachable(false);
142 DeviceDTO device = createDevice();
143 device.setDeviceState(deviceState);
145 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
147 deviceHandler.onDeviceStateChanged(device);
148 assertEquals(ThingStatus.OFFLINE, deviceHandler.getThing().getStatus());
149 assertEquals(ThingStatusDetail.COMMUNICATION_ERROR, deviceHandler.getThing().getStatusInfo().getStatusDetail());
153 public void testOnDeviceStateChanged_IsReachable_VariableActuator() {
154 DeviceStateDTO deviceState = new DeviceStateDTO();
155 deviceState.setReachable(true);
157 DeviceDTO device = createDevice();
158 device.setType(DEVICE_VARIABLE_ACTUATOR);
159 device.setDeviceState(deviceState);
161 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
163 deviceHandler.onDeviceStateChanged(device);
164 assertEquals(ThingStatus.ONLINE, deviceHandler.getThing().getStatus());
165 assertEquals(ThingStatusDetail.NONE, deviceHandler.getThing().getStatusInfo().getStatusDetail());
169 public void testOnDeviceStateChanged_LowBattery() {
170 DeviceDTO device = createDevice();
171 device.setIsBatteryPowered(true);
172 device.setLowBattery(true);
174 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
176 deviceHandler.onDeviceStateChanged(device);
177 assertTrue(isChannelUpdated(CHANNEL_BATTERY_LOW, OnOffType.ON));
181 public void testOnDeviceStateChanged_NoLowBattery() {
182 DeviceDTO device = createDevice();
183 device.setIsBatteryPowered(true);
184 device.setLowBattery(false);
186 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
188 deviceHandler.onDeviceStateChanged(device);
189 assertTrue(isChannelUpdated(CHANNEL_BATTERY_LOW, OnOffType.OFF));
193 public void testOnDeviceStateChanged_NotBatteryPowered() {
194 DeviceDTO device = createDevice();
195 device.setIsBatteryPowered(false);
197 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
199 deviceHandler.onDeviceStateChanged(device);
200 assertFalse(isChannelUpdated(CHANNEL_BATTERY_LOW));
204 public void testOnDeviceStateChanged_VariableActuator_On() {
205 DeviceDTO device = createDevice();
206 addCapabilityToDevice(CapabilityDTO.TYPE_VARIABLEACTUATOR, c -> c.setVariableActuatorState(true), device);
208 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
210 deviceHandler.onDeviceStateChanged(device);
211 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.ON));
215 public void testOnDeviceStateChanged_VariableActuator_Off() {
216 DeviceDTO device = createDevice();
217 addCapabilityToDevice(CapabilityDTO.TYPE_VARIABLEACTUATOR, c -> c.setVariableActuatorState(false), device);
219 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
221 deviceHandler.onDeviceStateChanged(device);
222 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.OFF));
226 public void testOnDeviceStateChanged_VariableActuator_EmptyState() {
227 DeviceDTO device = createDevice();
228 addCapabilityToDevice(CapabilityDTO.TYPE_VARIABLEACTUATOR, null, device);
230 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
232 deviceHandler.onDeviceStateChanged(device);
233 assertFalse(isChannelUpdated(CHANNEL_SWITCH));
237 public void testOnDeviceStateChanged_TemperatureSensor_FrostWarning_On() {
238 DeviceDTO device = createDevice();
239 addCapabilityToDevice(CapabilityDTO.TYPE_TEMPERATURESENSOR, c -> {
240 c.setTemperatureSensorTemperatureState(21.5);
241 c.setTemperatureSensorFrostWarningState(true);
244 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
246 deviceHandler.onDeviceStateChanged(device);
247 assertTrue(isChannelUpdated(CHANNEL_CURRENT_TEMPERATURE, QuantityType.valueOf(21.5, SIUnits.CELSIUS)));
248 assertTrue(isChannelUpdated(CHANNEL_FROST_WARNING, OnOffType.ON));
252 public void testOnDeviceStateChanged_TemperatureSensor_FrostWarning_Off() {
253 DeviceDTO device = createDevice();
254 addCapabilityToDevice(CapabilityDTO.TYPE_TEMPERATURESENSOR, c -> {
255 c.setTemperatureSensorTemperatureState(21.5);
256 c.setTemperatureSensorFrostWarningState(false);
259 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
261 deviceHandler.onDeviceStateChanged(device);
262 assertTrue(isChannelUpdated(CHANNEL_CURRENT_TEMPERATURE, QuantityType.valueOf(21.5, SIUnits.CELSIUS)));
263 assertTrue(isChannelUpdated(CHANNEL_FROST_WARNING, OnOffType.OFF));
267 public void testOnDeviceStateChanged_TemperatureSensor_EmptyState() {
268 DeviceDTO device = createDevice();
269 addCapabilityToDevice(CapabilityDTO.TYPE_TEMPERATURESENSOR, null, device);
271 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
273 deviceHandler.onDeviceStateChanged(device);
274 assertFalse(isChannelUpdated(CHANNEL_CURRENT_TEMPERATURE));
275 assertFalse(isChannelUpdated(CHANNEL_FROST_WARNING));
279 public void testOnDeviceStateChanged_ThermostatActuator_WindowReduction_On() {
280 DeviceDTO device = createDevice();
281 addCapabilityToDevice(CapabilityDTO.TYPE_THERMOSTATACTUATOR, c -> {
282 c.setThermostatActuatorPointTemperatureState(21.5);
283 c.setThermostatActuatorOperationModeState(STATE_VALUE_OPERATION_MODE_AUTO);
284 c.setThermostatActuatorWindowReductionActiveState(true);
287 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
289 deviceHandler.onDeviceStateChanged(device);
290 assertTrue(isChannelUpdated(CHANNEL_TARGET_TEMPERATURE, QuantityType.valueOf(21.5, SIUnits.CELSIUS)));
291 assertTrue(isChannelUpdated(CHANNEL_OPERATION_MODE, new StringType(STATE_VALUE_OPERATION_MODE_AUTO)));
292 assertTrue(isChannelUpdated(CHANNEL_WINDOW_REDUCTION_ACTIVE, OnOffType.ON));
296 public void testOnDeviceStateChanged_ThermostatActuator_WindowReduction_Off() {
297 DeviceDTO device = createDevice();
298 addCapabilityToDevice(CapabilityDTO.TYPE_THERMOSTATACTUATOR, c -> {
299 c.setThermostatActuatorPointTemperatureState(21.5);
300 c.setThermostatActuatorOperationModeState(STATE_VALUE_OPERATION_MODE_MANUAL);
301 c.setThermostatActuatorWindowReductionActiveState(false);
304 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
306 deviceHandler.onDeviceStateChanged(device);
307 assertTrue(isChannelUpdated(CHANNEL_TARGET_TEMPERATURE, QuantityType.valueOf(21.5, SIUnits.CELSIUS)));
308 assertTrue(isChannelUpdated(CHANNEL_OPERATION_MODE, new StringType(STATE_VALUE_OPERATION_MODE_MANUAL)));
309 assertTrue(isChannelUpdated(CHANNEL_WINDOW_REDUCTION_ACTIVE, OnOffType.OFF));
313 public void testOnDeviceStateChanged_ThermostatActuator_EmptyState() {
314 DeviceDTO device = createDevice();
315 addCapabilityToDevice(CapabilityDTO.TYPE_THERMOSTATACTUATOR, null, device);
317 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
319 deviceHandler.onDeviceStateChanged(device);
320 assertFalse(isChannelUpdated(CHANNEL_TARGET_TEMPERATURE));
321 assertFalse(isChannelUpdated(CHANNEL_OPERATION_MODE));
322 assertFalse(isChannelUpdated(CHANNEL_WINDOW_REDUCTION_ACTIVE));
326 public void testOnDeviceStateChanged_HumiditySensor_MoldWarning_On() {
327 DeviceDTO device = createDevice();
328 addCapabilityToDevice(CapabilityDTO.TYPE_HUMIDITYSENSOR, c -> {
329 c.setHumiditySensorHumidityState(35.5);
330 c.setHumiditySensorMoldWarningState(true);
333 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
335 deviceHandler.onDeviceStateChanged(device);
336 assertTrue(isChannelUpdated(CHANNEL_HUMIDITY, QuantityType.valueOf(35.5, Units.PERCENT)));
337 assertTrue(isChannelUpdated(CHANNEL_MOLD_WARNING, OnOffType.ON));
341 public void testOnDeviceStateChanged_HumiditySensor_MoldWarning_Off() {
342 DeviceDTO device = createDevice();
343 addCapabilityToDevice(CapabilityDTO.TYPE_HUMIDITYSENSOR, c -> {
344 c.setHumiditySensorHumidityState(35.5);
345 c.setHumiditySensorMoldWarningState(false);
348 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
350 deviceHandler.onDeviceStateChanged(device);
351 assertTrue(isChannelUpdated(CHANNEL_HUMIDITY, QuantityType.valueOf(35.5, Units.PERCENT)));
352 assertTrue(isChannelUpdated(CHANNEL_MOLD_WARNING, OnOffType.OFF));
356 public void testOnDeviceStateChanged_HumiditySensor_EmptyState() {
357 DeviceDTO device = createDevice();
358 addCapabilityToDevice(CapabilityDTO.TYPE_HUMIDITYSENSOR, null, device);
360 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
362 deviceHandler.onDeviceStateChanged(device);
363 assertFalse(isChannelUpdated(CHANNEL_HUMIDITY));
364 assertFalse(isChannelUpdated(CHANNEL_MOLD_WARNING));
368 public void testOnDeviceStateChanged_WindowDoorSensor_Open() {
369 DeviceDTO device = createDevice();
370 addCapabilityToDevice(CapabilityDTO.TYPE_WINDOWDOORSENSOR, c -> c.setWindowDoorSensorState(true), device);
372 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
374 deviceHandler.onDeviceStateChanged(device);
375 assertTrue(isChannelUpdated(CHANNEL_CONTACT, OpenClosedType.OPEN));
379 public void testOnDeviceStateChanged_WindowDoorSensor_Closed() {
380 DeviceDTO device = createDevice();
381 addCapabilityToDevice(CapabilityDTO.TYPE_WINDOWDOORSENSOR, c -> c.setWindowDoorSensorState(false), device);
383 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
385 deviceHandler.onDeviceStateChanged(device);
386 assertTrue(isChannelUpdated(CHANNEL_CONTACT, OpenClosedType.CLOSED));
390 public void testOnDeviceStateChanged_WindowDoorSensor_EmptyState() {
391 DeviceDTO device = createDevice();
392 addCapabilityToDevice(CapabilityDTO.TYPE_WINDOWDOORSENSOR, null, device);
394 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
396 deviceHandler.onDeviceStateChanged(device);
397 assertFalse(isChannelUpdated(CHANNEL_CONTACT));
401 public void testOnDeviceStateChanged_SmokeDetectorSensor_On() {
402 DeviceDTO device = createDevice();
403 addCapabilityToDevice(CapabilityDTO.TYPE_SMOKEDETECTORSENSOR, c -> c.setSmokeDetectorSensorState(true), device);
405 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
407 deviceHandler.onDeviceStateChanged(device);
408 assertTrue(isChannelUpdated(CHANNEL_SMOKE, OnOffType.ON));
412 public void testOnDeviceStateChanged_SmokeDetectorSensor_Off() {
413 DeviceDTO device = createDevice();
414 addCapabilityToDevice(CapabilityDTO.TYPE_SMOKEDETECTORSENSOR, c -> c.setSmokeDetectorSensorState(false),
417 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
419 deviceHandler.onDeviceStateChanged(device);
420 assertTrue(isChannelUpdated(CHANNEL_SMOKE, OnOffType.OFF));
424 public void testOnDeviceStateChanged_SmokeDetectorSensor_EmptyState() {
425 DeviceDTO device = createDevice();
426 addCapabilityToDevice(CapabilityDTO.TYPE_SMOKEDETECTORSENSOR, null, device);
428 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
430 deviceHandler.onDeviceStateChanged(device);
431 assertFalse(isChannelUpdated(CHANNEL_SMOKE));
435 public void testOnDeviceStateChanged_AlarmActuator_On() {
436 DeviceDTO device = createDevice();
437 addCapabilityToDevice(CapabilityDTO.TYPE_ALARMACTUATOR, c -> c.setAlarmActuatorState(true), device);
439 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
441 deviceHandler.onDeviceStateChanged(device);
442 assertTrue(isChannelUpdated(CHANNEL_ALARM, OnOffType.ON));
446 public void testOnDeviceStateChanged_AlarmActuator_Off() {
447 DeviceDTO device = createDevice();
448 addCapabilityToDevice(CapabilityDTO.TYPE_ALARMACTUATOR, c -> c.setAlarmActuatorState(false), device);
450 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
452 deviceHandler.onDeviceStateChanged(device);
453 assertTrue(isChannelUpdated(CHANNEL_ALARM, OnOffType.OFF));
457 public void testOnDeviceStateChanged_AlarmActuator_EmptyState() {
458 DeviceDTO device = createDevice();
459 addCapabilityToDevice(CapabilityDTO.TYPE_ALARMACTUATOR, null, device);
461 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
463 deviceHandler.onDeviceStateChanged(device);
464 assertFalse(isChannelUpdated(CHANNEL_ALARM));
468 public void testOnDeviceStateChanged_SwitchActuator_On() {
469 DeviceDTO device = createDevice();
470 addCapabilityToDevice(CapabilityDTO.TYPE_SWITCHACTUATOR, c -> c.setSwitchActuatorState(true), device);
472 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
474 deviceHandler.onDeviceStateChanged(device);
475 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.ON));
479 public void testOnDeviceStateChanged_SwitchActuator_Off() {
480 DeviceDTO device = createDevice();
481 addCapabilityToDevice(CapabilityDTO.TYPE_SWITCHACTUATOR, c -> c.setSwitchActuatorState(false), device);
483 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
485 deviceHandler.onDeviceStateChanged(device);
486 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.OFF));
490 public void testOnDeviceStateChanged_SwitchActuator_EmptyState() {
491 DeviceDTO device = createDevice();
492 addCapabilityToDevice(CapabilityDTO.TYPE_SWITCHACTUATOR, null, device);
494 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
496 deviceHandler.onDeviceStateChanged(device);
497 assertFalse(isChannelUpdated(CHANNEL_SWITCH));
501 public void testOnDeviceStateChanged_DimmerActuator() {
502 DeviceDTO device = createDevice();
503 addCapabilityToDevice(CapabilityDTO.TYPE_DIMMERACTUATOR, c -> c.setDimmerActuatorState(50), device);
505 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
507 deviceHandler.onDeviceStateChanged(device);
508 assertTrue(isChannelUpdated(CHANNEL_DIMMER, new DecimalType(50)));
512 public void testOnDeviceStateChanged_DimmerActuator_EmptyState() {
513 DeviceDTO device = createDevice();
514 addCapabilityToDevice(CapabilityDTO.TYPE_DIMMERACTUATOR, null, device);
516 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
518 deviceHandler.onDeviceStateChanged(device);
519 assertFalse(isChannelUpdated(CHANNEL_DIMMER));
523 public void testOnDeviceStateChanged_RollerShutterActuator() {
524 DeviceDTO device = createDevice();
525 addCapabilityToDevice(CapabilityDTO.TYPE_ROLLERSHUTTERACTUATOR, c -> c.setRollerShutterActuatorState(40),
528 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
530 deviceHandler.onDeviceStateChanged(device);
531 assertTrue(isChannelUpdated(CHANNEL_ROLLERSHUTTER, new DecimalType(40)));
535 public void testOnDeviceStateChanged_RollerShutterActuator_Invert_True() {
536 DeviceDTO device = createDevice();
537 addCapabilityToDevice(CapabilityDTO.TYPE_ROLLERSHUTTERACTUATOR, c -> c.setRollerShutterActuatorState(40),
540 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
542 Channel rollerShutterChannelMock = createRollerShutterChannelMock(true);
544 Thing thingMock = deviceHandler.getThing();
545 when(thingMock.getChannel(CHANNEL_ROLLERSHUTTER)).thenReturn(rollerShutterChannelMock);
547 deviceHandler.onDeviceStateChanged(device);
548 assertTrue(isChannelUpdated(CHANNEL_ROLLERSHUTTER, new DecimalType(40)));
549 assertFalse(isChannelUpdated(CHANNEL_ROLLERSHUTTER, new DecimalType(60)));
553 public void testOnDeviceStateChanged_RollerShutterActuator_Invert_False() {
554 DeviceDTO device = createDevice();
555 addCapabilityToDevice(CapabilityDTO.TYPE_ROLLERSHUTTERACTUATOR, c -> c.setRollerShutterActuatorState(40),
558 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
560 Channel rollerShutterChannelMock = createRollerShutterChannelMock(false);
562 Thing thingMock = deviceHandler.getThing();
563 when(thingMock.getChannel(CHANNEL_ROLLERSHUTTER)).thenReturn(rollerShutterChannelMock);
565 deviceHandler.onDeviceStateChanged(device);
566 assertFalse(isChannelUpdated(CHANNEL_ROLLERSHUTTER, new DecimalType(40)));
567 assertTrue(isChannelUpdated(CHANNEL_ROLLERSHUTTER, new DecimalType(60)));
571 public void testOnDeviceStateChanged_RollerShutterActuator_EmptyState() {
572 DeviceDTO device = createDevice();
573 addCapabilityToDevice(CapabilityDTO.TYPE_ROLLERSHUTTERACTUATOR, null, device);
575 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
577 deviceHandler.onDeviceStateChanged(device);
578 assertFalse(isChannelUpdated(CHANNEL_ROLLERSHUTTER));
582 public void testOnDeviceStateChanged_MotionDetectionSensor() {
583 DeviceDTO device = createDevice();
584 addCapabilityToDevice(CapabilityDTO.TYPE_MOTIONDETECTIONSENSOR, c -> c.setMotionDetectionSensorState(50),
587 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
589 deviceHandler.onDeviceStateChanged(device);
590 assertTrue(isChannelUpdated(CHANNEL_MOTION_COUNT, new DecimalType(50)));
594 public void testOnDeviceStateChanged_MotionDetectionSensor_EmptyState() {
595 DeviceDTO device = createDevice();
596 addCapabilityToDevice(CapabilityDTO.TYPE_MOTIONDETECTIONSENSOR, null, device);
598 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
600 deviceHandler.onDeviceStateChanged(device);
601 assertFalse(isChannelUpdated(CHANNEL_MOTION_COUNT));
605 public void testOnDeviceStateChanged_LuminanceSensor() {
606 DeviceDTO device = createDevice();
607 addCapabilityToDevice(CapabilityDTO.TYPE_LUMINANCESENSOR, c -> c.setLuminanceSensorState(50.1), device);
609 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
611 deviceHandler.onDeviceStateChanged(device);
612 assertTrue(isChannelUpdated(CHANNEL_LUMINANCE, QuantityType.valueOf(50.1, Units.PERCENT)));
616 public void testOnDeviceStateChanged_LuminanceSensor_EmptyState() {
617 DeviceDTO device = createDevice();
618 addCapabilityToDevice(CapabilityDTO.TYPE_LUMINANCESENSOR, null, device);
620 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
622 deviceHandler.onDeviceStateChanged(device);
623 assertFalse(isChannelUpdated(CHANNEL_LUMINANCE));
627 public void testOnDeviceStateChanged_EnergyConsumptionSensor() {
628 DeviceDTO device = createDevice();
629 addCapabilityToDevice(CapabilityDTO.TYPE_ENERGYCONSUMPTIONSENSOR, c -> {
630 c.setEnergyConsumptionSensorEnergyConsumptionMonthKWhState(201.51);
631 c.setEnergyConsumptionSensorAbsoluteEnergyConsumptionState(5500.51);
632 c.setEnergyConsumptionSensorEnergyConsumptionMonthEuroState(80.32);
633 c.setEnergyConsumptionSensorEnergyConsumptionDayEuroState(3.72);
634 c.setEnergyConsumptionSensorEnergyConsumptionDayKWhState(8.71);
637 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
639 deviceHandler.onDeviceStateChanged(device);
640 assertTrue(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_MONTH_KWH,
641 QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
642 assertTrue(isChannelUpdated(CHANNEL_ABOLUTE_ENERGY_CONSUMPTION,
643 QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
644 assertTrue(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_MONTH_EURO, new DecimalType(80.32)));
645 assertTrue(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_DAY_EURO, new DecimalType(3.72)));
647 isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
651 public void testOnDeviceStateChanged_EnergyConsumptionSensor_EmptyState() {
652 DeviceDTO device = createDevice();
653 addCapabilityToDevice(CapabilityDTO.TYPE_ENERGYCONSUMPTIONSENSOR, null, device);
655 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
657 deviceHandler.onDeviceStateChanged(device);
658 assertFalse(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_MONTH_KWH));
659 assertFalse(isChannelUpdated(CHANNEL_ABOLUTE_ENERGY_CONSUMPTION));
660 assertFalse(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_MONTH_EURO));
661 assertFalse(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_DAY_EURO));
662 assertFalse(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_DAY_KWH));
666 public void testOnDeviceStateChanged_PowerConsumptionSensor() {
667 DeviceDTO device = createDevice();
668 addCapabilityToDevice(CapabilityDTO.TYPE_POWERCONSUMPTIONSENSOR,
669 c -> c.setPowerConsumptionSensorPowerConsumptionWattState(350.5), device);
671 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
673 deviceHandler.onDeviceStateChanged(device);
674 assertTrue(isChannelUpdated(CHANNEL_POWER_CONSUMPTION_WATT, QuantityType.valueOf(350.5, Units.WATT)));
678 public void testOnDeviceStateChanged_PowerConsumptionSensor_EmptyState() {
679 DeviceDTO device = createDevice();
680 addCapabilityToDevice(CapabilityDTO.TYPE_POWERCONSUMPTIONSENSOR, null, device);
682 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
684 deviceHandler.onDeviceStateChanged(device);
685 assertFalse(isChannelUpdated(CHANNEL_POWER_CONSUMPTION_WATT));
689 public void testOnDeviceStateChanged_GenerationMeterEnergySensor() {
690 DeviceDTO device = createDevice();
691 addCapabilityToDevice(CapabilityDTO.TYPE_GENERATIONMETERENERGYSENSOR, c -> {
692 c.setGenerationMeterEnergySensorEnergyPerMonthInKWhState(201.51);
693 c.setGenerationMeterEnergySensorTotalEnergyState(5500.51);
694 c.setGenerationMeterEnergySensorEnergyPerMonthInEuroState(80.32);
695 c.setGenerationMeterEnergySensorEnergyPerDayInEuroState(3.72);
696 c.setGenerationMeterEnergySensorEnergyPerDayInKWhState(8.71);
699 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
701 deviceHandler.onDeviceStateChanged(device);
702 assertTrue(isChannelUpdated(CHANNEL_ENERGY_GENERATION_MONTH_KWH,
703 QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
705 isChannelUpdated(CHANNEL_TOTAL_ENERGY_GENERATION, QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
706 assertTrue(isChannelUpdated(CHANNEL_ENERGY_GENERATION_MONTH_EURO, new DecimalType(80.32)));
707 assertTrue(isChannelUpdated(CHANNEL_ENERGY_GENERATION_DAY_EURO, new DecimalType(3.72)));
709 isChannelUpdated(CHANNEL_ENERGY_GENERATION_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
713 public void testOnDeviceStateChanged_GenerationMeterEnergySensor_EmptyState() {
714 DeviceDTO device = createDevice();
715 addCapabilityToDevice(CapabilityDTO.TYPE_GENERATIONMETERENERGYSENSOR, null, device);
717 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
719 deviceHandler.onDeviceStateChanged(device);
720 assertFalse(isChannelUpdated(CHANNEL_ENERGY_GENERATION_MONTH_KWH));
721 assertFalse(isChannelUpdated(CHANNEL_TOTAL_ENERGY_GENERATION));
722 assertFalse(isChannelUpdated(CHANNEL_ENERGY_GENERATION_MONTH_EURO));
723 assertFalse(isChannelUpdated(CHANNEL_ENERGY_GENERATION_DAY_EURO));
724 assertFalse(isChannelUpdated(CHANNEL_ENERGY_GENERATION_DAY_KWH));
728 public void testOnDeviceStateChanged_GenerationMeterPowerConsumptionSensor() {
729 DeviceDTO device = createDevice();
730 addCapabilityToDevice(CapabilityDTO.TYPE_GENERATIONMETERPOWERCONSUMPTIONSENSOR,
731 c -> c.setGenerationMeterPowerConsumptionSensorPowerInWattState(350.5), device);
733 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
735 deviceHandler.onDeviceStateChanged(device);
736 assertTrue(isChannelUpdated(CHANNEL_POWER_GENERATION_WATT, QuantityType.valueOf(350.5, Units.WATT)));
740 public void testOnDeviceStateChanged_GenerationMeterPowerConsumptionSensor_EmptyState() {
741 DeviceDTO device = createDevice();
742 addCapabilityToDevice(CapabilityDTO.TYPE_GENERATIONMETERPOWERCONSUMPTIONSENSOR, null, device);
744 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
746 deviceHandler.onDeviceStateChanged(device);
747 assertFalse(isChannelUpdated(CHANNEL_POWER_GENERATION_WATT));
751 public void testOnDeviceStateChanged_TwoWayMeterEnergyConsumptionSensor() {
752 DeviceDTO device = createDevice();
753 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERENERGYCONSUMPTIONSENSOR, c -> {
754 c.setTwoWayMeterEnergyConsumptionSensorEnergyPerMonthInKWhState(201.51);
755 c.setTwoWayMeterEnergyConsumptionSensorTotalEnergyState(5500.51);
756 c.setTwoWayMeterEnergyConsumptionSensorEnergyPerMonthInEuroState(80.32);
757 c.setTwoWayMeterEnergyConsumptionSensorEnergyPerDayInEuroState(3.72);
758 c.setTwoWayMeterEnergyConsumptionSensorEnergyPerDayInKWhState(8.71);
761 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
763 deviceHandler.onDeviceStateChanged(device);
764 assertTrue(isChannelUpdated(CHANNEL_ENERGY_MONTH_KWH, QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
765 assertTrue(isChannelUpdated(CHANNEL_TOTAL_ENERGY, QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
766 assertTrue(isChannelUpdated(CHANNEL_ENERGY_MONTH_EURO, new DecimalType(80.32)));
767 assertTrue(isChannelUpdated(CHANNEL_ENERGY_DAY_EURO, new DecimalType(3.72)));
768 assertTrue(isChannelUpdated(CHANNEL_ENERGY_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
772 public void testOnDeviceStateChanged_TwoWayMeterEnergyConsumptionSensor_EmptyState() {
773 DeviceDTO device = createDevice();
774 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERENERGYCONSUMPTIONSENSOR, null, device);
776 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
778 deviceHandler.onDeviceStateChanged(device);
779 assertFalse(isChannelUpdated(CHANNEL_ENERGY_MONTH_KWH));
780 assertFalse(isChannelUpdated(CHANNEL_TOTAL_ENERGY));
781 assertFalse(isChannelUpdated(CHANNEL_ENERGY_MONTH_EURO));
782 assertFalse(isChannelUpdated(CHANNEL_ENERGY_DAY_EURO));
783 assertFalse(isChannelUpdated(CHANNEL_ENERGY_DAY_KWH));
787 public void testOnDeviceStateChanged_TwoWayMeterEnergyFeedSensor() {
788 DeviceDTO device = createDevice();
789 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERENERGYFEEDSENSOR, c -> {
790 c.setTwoWayMeterEnergyFeedSensorEnergyPerMonthInKWhState(201.51);
791 c.setTwoWayMeterEnergyFeedSensorTotalEnergyState(5500.51);
792 c.setTwoWayMeterEnergyFeedSensorEnergyPerMonthInEuroState(80.32);
793 c.setTwoWayMeterEnergyFeedSensorEnergyPerDayInEuroState(3.72);
794 c.setTwoWayMeterEnergyFeedSensorEnergyPerDayInKWhState(8.71);
797 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
799 deviceHandler.onDeviceStateChanged(device);
800 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_MONTH_KWH, QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
801 assertTrue(isChannelUpdated(CHANNEL_TOTAL_ENERGY_FED, QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
802 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_MONTH_EURO, new DecimalType(80.32)));
803 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_DAY_EURO, new DecimalType(3.72)));
804 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
808 public void testOnDeviceStateChanged_TwoWayMeterEnergyFeedSensor_EmptyState() {
809 DeviceDTO device = createDevice();
810 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERENERGYFEEDSENSOR, null, device);
812 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
814 deviceHandler.onDeviceStateChanged(device);
815 assertFalse(isChannelUpdated(CHANNEL_ENERGY_FEED_MONTH_KWH));
816 assertFalse(isChannelUpdated(CHANNEL_TOTAL_ENERGY_FED));
817 assertFalse(isChannelUpdated(CHANNEL_ENERGY_FEED_MONTH_EURO));
818 assertFalse(isChannelUpdated(CHANNEL_ENERGY_FEED_DAY_EURO));
819 assertFalse(isChannelUpdated(CHANNEL_ENERGY_FEED_DAY_KWH));
823 public void testOnDeviceStateChanged_TwoWayMeterPowerConsumptionSensor() {
824 DeviceDTO device = createDevice();
825 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERPOWERCONSUMPTIONSENSOR,
826 c -> c.setTwoWayMeterPowerConsumptionSensorPowerInWattState(350.5), device);
828 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
830 deviceHandler.onDeviceStateChanged(device);
831 assertTrue(isChannelUpdated(CHANNEL_POWER_WATT, QuantityType.valueOf(350.5, Units.WATT)));
835 public void testOnDeviceStateChanged_TwoWayMeterPowerConsumptionSensor_EmptyState() {
836 DeviceDTO device = createDevice();
837 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERPOWERCONSUMPTIONSENSOR, null, device);
839 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
841 deviceHandler.onDeviceStateChanged(device);
842 assertFalse(isChannelUpdated(CHANNEL_POWER_WATT));
846 public void testOnDeviceStateChanged_PushButtonSensor_Button1_ShortPress() {
847 DeviceDTO device = createDevice();
848 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, c -> {
849 c.setPushButtonSensorCounterState(10);
850 c.setPushButtonSensorButtonIndexState(0);
851 c.setPushButtonSensorButtonIndexType("ShortPress");
854 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
856 deviceHandler.onDeviceStateChanged(device);
857 assertTrue(isChannelUpdated("button1Count", new DecimalType(10)));
858 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
859 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
863 public void testOnDeviceStateChanged_PushButtonSensor_Button1_LongPress() {
864 DeviceDTO device = createDevice();
865 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, c -> {
866 c.setPushButtonSensorCounterState(10);
867 c.setPushButtonSensorButtonIndexState(0);
868 c.setPushButtonSensorButtonIndexType("LongPress");
871 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
873 deviceHandler.onDeviceStateChanged(device);
874 assertTrue(isChannelUpdated("button1Count", new DecimalType(10)));
875 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
876 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
880 public void testOnDeviceStateChanged_PushButtonSensor_Button2_ShortPress() {
881 DeviceDTO device = createDevice();
882 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, c -> {
883 c.setPushButtonSensorCounterState(10);
884 c.setPushButtonSensorButtonIndexState(1);
885 c.setPushButtonSensorButtonIndexType("ShortPress");
888 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
890 deviceHandler.onDeviceStateChanged(device);
891 assertTrue(isChannelUpdated("button2Count", new DecimalType(10)));
892 assertTrue(isChannelTriggered("button2", CommonTriggerEvents.SHORT_PRESSED));
893 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.LONG_PRESSED));
897 public void testOnDeviceStateChanged_PushButtonSensor_Button2_LongPress() {
898 DeviceDTO device = createDevice();
899 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, c -> {
900 c.setPushButtonSensorCounterState(10);
901 c.setPushButtonSensorButtonIndexState(1);
902 c.setPushButtonSensorButtonIndexType("LongPress");
905 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
907 deviceHandler.onDeviceStateChanged(device);
908 assertTrue(isChannelUpdated("button2Count", new DecimalType(10)));
909 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.SHORT_PRESSED));
910 assertTrue(isChannelTriggered("button2", CommonTriggerEvents.LONG_PRESSED));
914 public void testOnDeviceStateChanged_PushButtonSensor_EmptyState() {
915 DeviceDTO device = createDevice();
916 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
918 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
920 deviceHandler.onDeviceStateChanged(device);
921 assertFalse(isChannelUpdated(CHANNEL_BUTTON_COUNT));
922 assertFalse(isChannelUpdated("button1Count"));
923 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
924 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
928 public void testOnDeviceStateChanged_Event_LinkedToDevice() {
929 DeviceStateDTO deviceState = new DeviceStateDTO();
930 deviceState.setReachable(true);
932 DeviceDTO device = createDevice();
933 device.setDeviceState(deviceState);
935 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
937 EventDTO event = new EventDTO();
938 event.setSource(LINK_TYPE_DEVICE);
940 deviceHandler.onDeviceStateChanged(device, event);
941 assertEquals(ThingStatus.ONLINE, deviceHandler.getThing().getStatus());
942 assertEquals(ThingStatusDetail.NONE, deviceHandler.getThing().getStatusInfo().getStatusDetail());
946 public void testOnDeviceStateChanged_Event_LinkedToCapability_WithoutState() {
947 DeviceDTO device = createDevice();
949 CapabilityConfigDTO capabilityConfig = new CapabilityConfigDTO();
950 capabilityConfig.setName("capabilityName");
952 final String capabilityId = "capabilityId";
953 CapabilityDTO capability = new CapabilityDTO();
954 capability.setId(capabilityId);
955 capability.setType(CapabilityDTO.TYPE_SWITCHACTUATOR);
956 capability.setConfig(capabilityConfig);
957 device.getCapabilityMap().put(capabilityId, capability);
959 DeviceDTO refreshedDevice = createDevice();
961 CapabilityStateDTO capabilityState = new CapabilityStateDTO();
962 capabilityState.setSwitchActuatorState(true);
964 CapabilityDTO refreshedCapability = new CapabilityDTO();
965 refreshedCapability.setId(capabilityId);
966 refreshedCapability.setType(CapabilityDTO.TYPE_SWITCHACTUATOR);
967 refreshedCapability.setConfig(capabilityConfig);
968 refreshedCapability.setCapabilityState(capabilityState);
969 refreshedDevice.getCapabilityMap().put(capabilityId, refreshedCapability);
971 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
972 when(bridgeHandlerMock.refreshDevice(any())).thenReturn(Optional.of(refreshedDevice));
974 EventDTO event = createCapabilityEvent(c -> c.setOnState(true));
976 deviceHandler.onDeviceStateChanged(device, event);
977 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.ON));
981 public void testOnDeviceStateChanged_Event_LinkedToCapability_WithoutStateAlsoAfterRefresh() {
982 DeviceDTO device = createDevice();
984 CapabilityConfigDTO capabilityConfig = new CapabilityConfigDTO();
985 capabilityConfig.setName("capabilityName");
987 final String capabilityId = "capabilityId";
988 CapabilityDTO capability = new CapabilityDTO();
989 capability.setId(capabilityId);
990 capability.setType(CapabilityDTO.TYPE_SWITCHACTUATOR);
991 capability.setConfig(capabilityConfig);
992 device.getCapabilityMap().put(capabilityId, capability);
994 DeviceDTO refreshedDevice = createDevice();
996 CapabilityDTO refreshedCapability = new CapabilityDTO();
997 refreshedCapability.setId(capabilityId);
998 refreshedCapability.setType(CapabilityDTO.TYPE_SWITCHACTUATOR);
999 refreshedCapability.setConfig(capabilityConfig);
1000 refreshedDevice.getCapabilityMap().put(capabilityId, refreshedCapability);
1002 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1003 when(bridgeHandlerMock.refreshDevice(any())).thenReturn(Optional.of(refreshedDevice));
1005 EventDTO event = createCapabilityEvent(c -> c.setOnState(true));
1007 deviceHandler.onDeviceStateChanged(device, event);
1008 // Channels should only get updated when the device have a state.
1009 assertFalse(isChannelUpdated(CHANNEL_SWITCH));
1013 public void testOnDeviceStateChanged_Event_VariableActuator() {
1014 DeviceDTO device = createDevice();
1015 addCapabilityToDevice(CapabilityDTO.TYPE_VARIABLEACTUATOR, null, device);
1017 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1019 EventDTO event = createCapabilityEvent(c -> c.setValue(true));
1021 deviceHandler.onDeviceStateChanged(device, event);
1022 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.ON));
1026 public void testOnDeviceStateChanged_Event_SwitchActuator() {
1027 DeviceDTO device = createDevice();
1028 addCapabilityToDevice(CapabilityDTO.TYPE_SWITCHACTUATOR, null, device);
1030 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1032 EventDTO event = createCapabilityEvent(c -> c.setOnState(true));
1034 deviceHandler.onDeviceStateChanged(device, event);
1035 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.ON));
1039 public void testOnDeviceStateChanged_Event_DimmerActuator() {
1040 DeviceDTO device = createDevice();
1041 addCapabilityToDevice(CapabilityDTO.TYPE_DIMMERACTUATOR, null, device);
1043 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1045 EventDTO event = createCapabilityEvent(c -> c.setDimLevel(50));
1047 deviceHandler.onDeviceStateChanged(device, event);
1048 assertTrue(isChannelUpdated(CHANNEL_DIMMER, new DecimalType(50)));
1052 public void testOnDeviceStateChanged_Event_RollerShutterActuator() {
1053 DeviceDTO device = createDevice();
1054 addCapabilityToDevice(CapabilityDTO.TYPE_ROLLERSHUTTERACTUATOR, null, device);
1056 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1058 EventDTO event = createCapabilityEvent(c -> c.setShutterLevel(50));
1060 deviceHandler.onDeviceStateChanged(device, event);
1061 assertTrue(isChannelUpdated(CHANNEL_ROLLERSHUTTER, new DecimalType(50)));
1065 public void testOnDeviceStateChanged_Event_RollerShutter_PushButtonSensor() {
1066 DeviceDTO device = createDevice();
1067 addCapabilityToDevice(CapabilityDTO.TYPE_ROLLERSHUTTERACTUATOR, null, device);
1068 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
1070 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1072 EventDTO event = createCapabilityEvent(c -> {
1073 c.setKeyPressCounter(10);
1074 c.setKeyPressButtonIndex(0);
1075 c.setKeyPressType("ShortPress");
1077 event.setType("ButtonPressed");
1078 event.setNamespace("CosipDevices.RWE");
1080 deviceHandler.onDeviceStateChanged(device, event);
1081 assertTrue(isChannelUpdated("button1Count", new DecimalType(10)));
1082 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
1083 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
1087 public void testOnDeviceStateChanged_Event_TemperatureSensor() {
1088 DeviceDTO device = createDevice();
1089 addCapabilityToDevice(CapabilityDTO.TYPE_TEMPERATURESENSOR, null, device);
1091 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1093 EventDTO event = createCapabilityEvent(c -> {
1094 c.setTemperature(21.5);
1095 c.setFrostWarning(true);
1098 deviceHandler.onDeviceStateChanged(device, event);
1099 assertTrue(isChannelUpdated(CHANNEL_CURRENT_TEMPERATURE, QuantityType.valueOf(21.5, SIUnits.CELSIUS)));
1100 assertTrue(isChannelUpdated(CHANNEL_FROST_WARNING, OnOffType.ON));
1104 public void testOnDeviceStateChanged_Event_ThermostatSensor() {
1105 DeviceDTO device = createDevice();
1106 addCapabilityToDevice(CapabilityDTO.TYPE_THERMOSTATACTUATOR, null, device);
1108 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1110 EventDTO event = createCapabilityEvent(c -> {
1111 c.setPointTemperature(21.5);
1112 c.setOperationMode(STATE_VALUE_OPERATION_MODE_AUTO);
1113 c.setWindowReductionActive(true);
1116 deviceHandler.onDeviceStateChanged(device, event);
1117 assertTrue(isChannelUpdated(CHANNEL_TARGET_TEMPERATURE, QuantityType.valueOf(21.5, SIUnits.CELSIUS)));
1118 assertTrue(isChannelUpdated(CHANNEL_OPERATION_MODE, new StringType(STATE_VALUE_OPERATION_MODE_AUTO)));
1119 assertTrue(isChannelUpdated(CHANNEL_WINDOW_REDUCTION_ACTIVE, OnOffType.ON));
1123 public void testOnDeviceStateChanged_Event_HumiditySensor() {
1124 DeviceDTO device = createDevice();
1125 addCapabilityToDevice(CapabilityDTO.TYPE_HUMIDITYSENSOR, null, device);
1127 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1129 EventDTO event = createCapabilityEvent(c -> {
1130 c.setHumidity(35.5);
1131 c.setMoldWarning(true);
1134 deviceHandler.onDeviceStateChanged(device, event);
1135 assertTrue(isChannelUpdated(CHANNEL_HUMIDITY, QuantityType.valueOf(35.5, Units.PERCENT)));
1136 assertTrue(isChannelUpdated(CHANNEL_MOLD_WARNING, OnOffType.ON));
1140 public void testOnDeviceStateChanged_Event_WindowDoorSensor() {
1141 DeviceDTO device = createDevice();
1142 addCapabilityToDevice(CapabilityDTO.TYPE_WINDOWDOORSENSOR, null, device);
1144 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1146 EventDTO event = createCapabilityEvent(c -> c.setIsOpen(true));
1148 deviceHandler.onDeviceStateChanged(device, event);
1149 assertTrue(isChannelUpdated(CHANNEL_CONTACT, OpenClosedType.OPEN));
1153 public void testOnDeviceStateChanged_Event_SmokeDetectorSensor() {
1154 DeviceDTO device = createDevice();
1155 addCapabilityToDevice(CapabilityDTO.TYPE_SMOKEDETECTORSENSOR, null, device);
1157 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1159 EventDTO event = createCapabilityEvent(c -> c.setIsSmokeAlarm(true));
1161 deviceHandler.onDeviceStateChanged(device, event);
1162 assertTrue(isChannelUpdated(CHANNEL_SMOKE, OnOffType.ON));
1166 public void testOnDeviceStateChanged_Event_AlarmActuator() {
1167 DeviceDTO device = createDevice();
1168 addCapabilityToDevice(CapabilityDTO.TYPE_ALARMACTUATOR, null, device);
1170 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1172 EventDTO event = createCapabilityEvent(c -> c.setOnState(true));
1174 deviceHandler.onDeviceStateChanged(device, event);
1175 assertTrue(isChannelUpdated(CHANNEL_ALARM, OnOffType.ON));
1179 public void testOnDeviceStateChanged_Event_MotionDetectionSensor() {
1180 DeviceDTO device = createDevice();
1181 addCapabilityToDevice(CapabilityDTO.TYPE_MOTIONDETECTIONSENSOR, null, device);
1183 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1185 EventDTO event = createCapabilityEvent(c -> c.setMotionDetectedCount(50));
1187 deviceHandler.onDeviceStateChanged(device, event);
1188 assertTrue(isChannelUpdated(CHANNEL_MOTION_COUNT, new DecimalType(50)));
1192 public void testOnDeviceStateChanged_Event_LuminanceSensor() {
1193 DeviceDTO device = createDevice();
1194 addCapabilityToDevice(CapabilityDTO.TYPE_LUMINANCESENSOR, null, device);
1196 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1198 EventDTO event = createCapabilityEvent(c -> c.setLuminance(50.1));
1200 deviceHandler.onDeviceStateChanged(device, event);
1201 assertTrue(isChannelUpdated(CHANNEL_LUMINANCE, QuantityType.valueOf(50.1, Units.PERCENT)));
1205 public void testOnDeviceStateChanged_Event_PushButtonSensor() {
1206 DeviceDTO device = createDevice();
1207 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
1209 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1211 EventDTO event = createCapabilityEvent(c -> {
1212 c.setKeyPressCounter(10);
1213 c.setKeyPressButtonIndex(0);
1214 c.setKeyPressType("ShortPress");
1217 deviceHandler.onDeviceStateChanged(device, event);
1218 assertTrue(isChannelUpdated("button1Count", new DecimalType(10)));
1219 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
1220 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
1221 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
1222 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.PRESSED));
1226 public void testOnDeviceStateChanged_StateChangedEvent_PushButtonSensor_SHC_Classic() {
1227 when(bridgeHandlerMock.isSHCClassic()).thenReturn(true);
1229 DeviceDTO device = createDevice();
1230 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
1232 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1234 // SHC Classic sends only StateChanged events with this information
1235 EventDTO event = createCapabilityEvent(c -> {
1236 c.setLastKeyPressButtonIndex(0);
1237 c.setLastKeyPressCounter(10);
1240 // Nothing should get processed, because it should only react on the more detailed ButtonPressed events
1241 deviceHandler.onDeviceStateChanged(device, event);
1242 assertFalse(isChannelUpdated("button1Count", new DecimalType(10)));
1243 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
1244 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED)); // not available for SHC Classic
1245 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED)); // not available for SHC Classic
1246 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.PRESSED));
1250 public void testOnDeviceStateChanged_StateChangedEvent_PushButtonSensor_SHCA() {
1251 when(bridgeHandlerMock.isSHCClassic()).thenReturn(false);
1253 DeviceDTO device = createDevice();
1254 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
1256 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1258 // StateChanged events only have with this information
1259 EventDTO event = createCapabilityEvent(c -> {
1260 c.setLastKeyPressButtonIndex(0);
1261 c.setLastKeyPressCounter(10);
1264 // Nothing should get processed, because it should only react on the more detailed ButtonPressed events
1265 deviceHandler.onDeviceStateChanged(device, event);
1266 assertFalse(isChannelUpdated("button1Count", new DecimalType(10)));
1267 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
1268 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
1269 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
1270 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.PRESSED));
1274 public void testOnDeviceStateChanged_Event_EnergyConsumptionSensor() {
1275 DeviceDTO device = createDevice();
1276 addCapabilityToDevice(CapabilityDTO.TYPE_ENERGYCONSUMPTIONSENSOR, null, device);
1278 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1280 EventDTO event = createCapabilityEvent(c -> {
1281 c.setEnergyConsumptionMonthKWh(201.51);
1282 c.setAbsoluteEnergyConsumption(5500.51);
1283 c.setEnergyConsumptionMonthEuro(80.32);
1284 c.setEnergyConsumptionDayEuro(3.72);
1285 c.setEnergyConsumptionDayKWh(8.71);
1288 deviceHandler.onDeviceStateChanged(device, event);
1289 assertTrue(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_MONTH_KWH,
1290 QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
1291 assertTrue(isChannelUpdated(CHANNEL_ABOLUTE_ENERGY_CONSUMPTION,
1292 QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
1293 assertTrue(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_MONTH_EURO, new DecimalType(80.32)));
1294 assertTrue(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_DAY_EURO, new DecimalType(3.72)));
1296 isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
1300 public void testOnDeviceStateChanged_Event_PowerConsumptionSensor() {
1301 DeviceDTO device = createDevice();
1302 addCapabilityToDevice(CapabilityDTO.TYPE_POWERCONSUMPTIONSENSOR, null, device);
1304 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1306 EventDTO event = createCapabilityEvent(c -> c.setPowerConsumptionWatt(350.5));
1308 deviceHandler.onDeviceStateChanged(device, event);
1309 assertTrue(isChannelUpdated(CHANNEL_POWER_CONSUMPTION_WATT, QuantityType.valueOf(350.5, Units.WATT)));
1313 public void testOnDeviceStateChanged_Event_GenerationMeterEnergySensor() {
1314 DeviceDTO device = createDevice();
1315 addCapabilityToDevice(CapabilityDTO.TYPE_GENERATIONMETERENERGYSENSOR, null, device);
1317 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1319 EventDTO event = createCapabilityEvent(c -> {
1320 c.setEnergyPerMonthInKWh(201.51);
1321 c.setTotalEnergy(5500.51);
1322 c.setEnergyPerMonthInEuro(80.32);
1323 c.setEnergyPerDayInEuro(3.72);
1324 c.setEnergyPerDayInKWh(8.71);
1327 deviceHandler.onDeviceStateChanged(device, event);
1328 assertTrue(isChannelUpdated(CHANNEL_ENERGY_GENERATION_MONTH_KWH,
1329 QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
1331 isChannelUpdated(CHANNEL_TOTAL_ENERGY_GENERATION, QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
1332 assertTrue(isChannelUpdated(CHANNEL_ENERGY_GENERATION_MONTH_EURO, new DecimalType(80.32)));
1333 assertTrue(isChannelUpdated(CHANNEL_ENERGY_GENERATION_DAY_EURO, new DecimalType(3.72)));
1335 isChannelUpdated(CHANNEL_ENERGY_GENERATION_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
1339 public void testOnDeviceStateChanged_Event_GenerationMeterPowerConsumptionSensor() {
1340 DeviceDTO device = createDevice();
1341 addCapabilityToDevice(CapabilityDTO.TYPE_GENERATIONMETERPOWERCONSUMPTIONSENSOR, null, device);
1343 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1345 EventDTO event = createCapabilityEvent(c -> c.setPowerInWatt(350.5));
1347 deviceHandler.onDeviceStateChanged(device, event);
1348 assertTrue(isChannelUpdated(CHANNEL_POWER_GENERATION_WATT, QuantityType.valueOf(350.5, Units.WATT)));
1352 public void testOnDeviceStateChanged_Event_TwoWayMeterEnergyConsumptionSensor() {
1353 DeviceDTO device = createDevice();
1354 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERENERGYCONSUMPTIONSENSOR, null, device);
1356 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1358 EventDTO event = createCapabilityEvent(c -> {
1359 c.setEnergyPerMonthInKWh(201.51);
1360 c.setTotalEnergy(5500.51);
1361 c.setEnergyPerMonthInEuro(80.32);
1362 c.setEnergyPerDayInEuro(3.72);
1363 c.setEnergyPerDayInKWh(8.71);
1366 deviceHandler.onDeviceStateChanged(device, event);
1367 assertTrue(isChannelUpdated(CHANNEL_ENERGY_MONTH_KWH, QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
1368 assertTrue(isChannelUpdated(CHANNEL_TOTAL_ENERGY, QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
1369 assertTrue(isChannelUpdated(CHANNEL_ENERGY_MONTH_EURO, new DecimalType(80.32)));
1370 assertTrue(isChannelUpdated(CHANNEL_ENERGY_DAY_EURO, new DecimalType(3.72)));
1371 assertTrue(isChannelUpdated(CHANNEL_ENERGY_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
1375 public void testOnDeviceStateChanged_Event_TwoWayMeterEnergyFeedSensor() {
1376 DeviceDTO device = createDevice();
1377 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERENERGYFEEDSENSOR, null, device);
1379 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1381 EventDTO event = createCapabilityEvent(c -> {
1382 c.setEnergyPerMonthInKWh(201.51);
1383 c.setTotalEnergy(5500.51);
1384 c.setEnergyPerMonthInEuro(80.32);
1385 c.setEnergyPerDayInEuro(3.72);
1386 c.setEnergyPerDayInKWh(8.71);
1389 deviceHandler.onDeviceStateChanged(device, event);
1390 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_MONTH_KWH, QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
1391 assertTrue(isChannelUpdated(CHANNEL_TOTAL_ENERGY_FED, QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
1392 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_MONTH_EURO, new DecimalType(80.32)));
1393 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_DAY_EURO, new DecimalType(3.72)));
1394 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
1398 public void testOnDeviceStateChanged_Event_TwoWayMeterPowerConsumptionSensor() {
1399 DeviceDTO device = createDevice();
1400 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERPOWERCONSUMPTIONSENSOR, null, device);
1402 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1404 EventDTO event = createCapabilityEvent(c -> c.setPowerInWatt(350.5));
1406 deviceHandler.onDeviceStateChanged(device, event);
1407 assertTrue(isChannelUpdated(CHANNEL_POWER_WATT, QuantityType.valueOf(350.5, Units.WATT)));
1411 public void testHandleCommand_UnsupportedChannel() {
1412 DeviceDTO device = createDevice();
1414 ChannelUID channelMock = createChannel(CHANNEL_CONTACT);
1416 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1418 deviceHandler.handleCommand(channelMock, OpenClosedType.OPEN);
1420 verify(bridgeHandlerMock, never()).commandSetRollerShutterLevel(any(), anyInt());
1421 verify(bridgeHandlerMock, never()).commandSwitchDevice(any(), anyBoolean());
1422 verify(bridgeHandlerMock, never()).commandUpdatePointTemperature(any(), anyDouble());
1423 verify(bridgeHandlerMock, never()).commandSwitchAlarm(any(), anyBoolean());
1424 verify(bridgeHandlerMock, never()).commandSetOperationMode(any(), anyBoolean());
1425 verify(bridgeHandlerMock, never()).commandSetDimLevel(any(), anyInt());
1426 verify(bridgeHandlerMock, never()).commandSetRollerShutterLevel(any(), anyInt());
1427 verify(bridgeHandlerMock, never()).commandSetRollerShutterStop(any(), any());
1431 public void testHandleCommand_CommandSwitchDevice_On() {
1432 DeviceDTO device = createDevice();
1434 ChannelUID channelMock = createChannel(CHANNEL_SWITCH);
1436 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1437 deviceHandler.handleCommand(channelMock, OnOffType.ON);
1439 verify(bridgeHandlerMock).commandSwitchDevice(device.getId(), true);
1443 public void testHandleCommand_CommandSwitchDevice_Off() {
1444 DeviceDTO device = createDevice();
1446 ChannelUID channelMock = createChannel(CHANNEL_SWITCH);
1448 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1449 deviceHandler.handleCommand(channelMock, OnOffType.OFF);
1451 verify(bridgeHandlerMock).commandSwitchDevice(device.getId(), false);
1455 public void testHandleCommand_CommandSwitchAlarm_On() {
1456 DeviceDTO device = createDevice();
1458 ChannelUID channelMock = createChannel(CHANNEL_ALARM);
1460 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1461 deviceHandler.handleCommand(channelMock, OnOffType.ON);
1463 verify(bridgeHandlerMock).commandSwitchAlarm(device.getId(), true);
1467 public void testHandleCommand_CommandSwitchAlarm_Off() {
1468 DeviceDTO device = createDevice();
1470 ChannelUID channelMock = createChannel(CHANNEL_ALARM);
1472 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1473 deviceHandler.handleCommand(channelMock, OnOffType.OFF);
1475 verify(bridgeHandlerMock).commandSwitchAlarm(device.getId(), false);
1479 public void testHandleCommand_CommandSetDimLevel_On() {
1480 DeviceDTO device = createDevice();
1482 ChannelUID channelMock = createChannel(CHANNEL_DIMMER);
1484 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1485 deviceHandler.handleCommand(channelMock, OnOffType.ON);
1487 verify(bridgeHandlerMock).commandSetDimLevel(device.getId(), 100);
1491 public void testHandleCommand_CommandSetDimLevel_Off() {
1492 DeviceDTO device = createDevice();
1494 ChannelUID channelMock = createChannel(CHANNEL_DIMMER);
1496 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1497 deviceHandler.handleCommand(channelMock, OnOffType.OFF);
1499 verify(bridgeHandlerMock).commandSetDimLevel(device.getId(), 0);
1503 public void testHandleCommand_CommandSetDimLevel_DecimalType() {
1504 DeviceDTO device = createDevice();
1506 ChannelUID channelMock = createChannel(CHANNEL_DIMMER);
1508 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1509 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("30"));
1511 verify(bridgeHandlerMock).commandSetDimLevel(device.getId(), 30);
1515 public void testHandleCommand_CommandSetOperationMode_Auto() {
1516 DeviceDTO device = createDevice();
1518 ChannelUID channelMock = createChannel(CHANNEL_OPERATION_MODE);
1520 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1521 deviceHandler.handleCommand(channelMock, StringType.valueOf(STATE_VALUE_OPERATION_MODE_AUTO));
1523 verify(bridgeHandlerMock).commandSetOperationMode(device.getId(), true);
1527 public void testHandleCommand_CommandSetOperationMode_Manual() {
1528 DeviceDTO device = createDevice();
1530 ChannelUID channelMock = createChannel(CHANNEL_OPERATION_MODE);
1532 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1533 deviceHandler.handleCommand(channelMock, StringType.valueOf(STATE_VALUE_OPERATION_MODE_MANUAL));
1535 verify(bridgeHandlerMock).commandSetOperationMode(device.getId(), false);
1539 public void testHandleCommand_CommandSetOperationMode_Unknown() {
1540 DeviceDTO device = createDevice();
1542 ChannelUID channelMock = createChannel(CHANNEL_OPERATION_MODE);
1544 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1545 deviceHandler.handleCommand(channelMock, StringType.valueOf("Unknown"));
1547 verify(bridgeHandlerMock, never()).commandSetOperationMode(any(), anyBoolean());
1551 public void testHandleCommand_CommandUpdatePointTemperature_QuantityType() {
1552 DeviceDTO device = createDevice();
1554 ChannelUID channelMock = createChannel(CHANNEL_TARGET_TEMPERATURE);
1556 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1557 deviceHandler.handleCommand(channelMock, QuantityType.valueOf(20.0, SIUnits.CELSIUS));
1559 verify(bridgeHandlerMock).commandUpdatePointTemperature(device.getId(), 20.0);
1563 public void testHandleCommand_CommandUpdatePointTemperature_DecimalType() {
1564 DeviceDTO device = createDevice();
1566 ChannelUID channelMock = createChannel(CHANNEL_TARGET_TEMPERATURE);
1568 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1569 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("20"));
1571 verify(bridgeHandlerMock).commandUpdatePointTemperature(device.getId(), 20.0);
1575 public void testHandleCommand_CommandUpdatePointTemperature_MinTemperature() {
1576 DeviceDTO device = createDevice();
1578 ChannelUID channelMock = createChannel(CHANNEL_TARGET_TEMPERATURE);
1580 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1581 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("0"));
1583 // 0 (and everything below the min temperature 6.0 should be set to the min temperature 6.0)
1584 verify(bridgeHandlerMock).commandUpdatePointTemperature(device.getId(), 6.0);
1588 public void testHandleCommand_CommandUpdatePointTemperature_MaxTemperature() {
1589 DeviceDTO device = createDevice();
1591 ChannelUID channelMock = createChannel(CHANNEL_TARGET_TEMPERATURE);
1593 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1594 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("40"));
1596 // 0 (and everything below the min temperature 30.0 should be set to the min temperature 30.0)
1597 verify(bridgeHandlerMock).commandUpdatePointTemperature(device.getId(), 30.0);
1601 public void testHandleCommand_CommandRollerShutter_Up() {
1602 DeviceDTO device = createDevice();
1604 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1606 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1607 deviceHandler.handleCommand(channelMock, UpDownType.UP);
1609 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.UP);
1613 public void testHandleCommand_CommandRollerShutter_Down() {
1614 DeviceDTO device = createDevice();
1616 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1618 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1619 deviceHandler.handleCommand(channelMock, UpDownType.DOWN);
1621 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.DOWN);
1625 public void testHandleCommand_CommandRollerShutter_On() {
1626 DeviceDTO device = createDevice();
1628 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1630 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1631 deviceHandler.handleCommand(channelMock, OnOffType.ON);
1633 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.DOWN);
1637 public void testHandleCommand_CommandRollerShutter_Off() {
1638 DeviceDTO device = createDevice();
1640 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1642 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1643 deviceHandler.handleCommand(channelMock, OnOffType.OFF);
1645 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.UP);
1649 public void testHandleCommand_CommandRollerShutter_Stop() {
1650 DeviceDTO device = createDevice();
1652 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1654 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1655 deviceHandler.handleCommand(channelMock, StopMoveType.STOP);
1657 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.STOP);
1661 public void testHandleCommand_CommandRollerShutter_DecimalType() {
1662 DeviceDTO device = createDevice();
1664 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1666 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1667 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("30"));
1669 verify(bridgeHandlerMock).commandSetRollerShutterLevel(device.getId(), 30);
1673 public void testHandleCommand_CommandRollerShutter_DecimalType_Inverted() {
1674 DeviceDTO device = createDevice();
1676 Channel rollerShutterChannelMock = createRollerShutterChannelMock(true);
1678 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1680 Thing thingMock = deviceHandler.getThing();
1681 when(thingMock.getChannel(CHANNEL_ROLLERSHUTTER)).thenReturn(rollerShutterChannelMock);
1683 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1685 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("30"));
1687 verify(bridgeHandlerMock).commandSetRollerShutterLevel(device.getId(), 30);
1691 public void testHandleCommand_CommandRollerShutter_DecimalType_NotInverted() {
1692 DeviceDTO device = createDevice();
1694 Channel rollerShutterChannelMock = createRollerShutterChannelMock(false);
1696 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1698 Thing thingMock = deviceHandler.getThing();
1699 when(thingMock.getChannel(CHANNEL_ROLLERSHUTTER)).thenReturn(rollerShutterChannelMock);
1701 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1703 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("30"));
1705 verify(bridgeHandlerMock).commandSetRollerShutterLevel(device.getId(), 70);
1708 private LivisiDeviceHandler createDeviceHandler(DeviceDTO device) {
1709 when(bridgeHandlerMock.getDeviceById(any())).thenReturn(Optional.of(device));
1711 ThingUID bridgeThingUID = new ThingUID(THING_TYPE_BRIDGE, "bridgeId");
1712 Bridge bridgeMock = mock(Bridge.class);
1713 when(bridgeMock.getHandler()).thenReturn(bridgeHandlerMock);
1714 when(bridgeMock.getStatus()).thenReturn(ThingStatus.ONLINE);
1715 when(bridgeMock.getStatusInfo())
1716 .thenReturn(new ThingStatusInfo(ThingStatus.ONLINE, ThingStatusDetail.NONE, null));
1718 ThingTypeUID thingTypeUID = THING_TYPE_RST2;
1719 ThingUID thingUID = new ThingUID(thingTypeUID, device.getId());
1721 Configuration thingConfiguration = new Configuration();
1722 thingConfiguration.setProperties(Collections.singletonMap(PROPERTY_ID, device.getId()));
1724 Thing thingMock = mock(Thing.class);
1725 when(thingMock.getBridgeUID()).thenReturn(bridgeThingUID);
1726 when(thingMock.getConfiguration()).thenReturn(thingConfiguration);
1727 when(thingMock.getUID()).thenReturn(thingUID);
1728 when(thingMock.getThingTypeUID()).thenReturn(thingTypeUID);
1729 doAnswer(invocation -> {
1730 thingStatusInfo = invocation.getArgument(0, ThingStatusInfo.class);
1732 }).when(thingMock).setStatusInfo(any());
1733 when(thingMock.getStatusInfo()).thenAnswer(invocation -> thingStatusInfo);
1734 when(thingMock.getStatus()).thenAnswer(invocation -> thingStatusInfo.getStatus());
1736 LivisiDeviceHandler deviceHandler = new LivisiDeviceHandler(thingMock);
1737 ThingHandlerCallback callbackMock = createCallbackMock(bridgeMock);
1738 deviceHandler.setCallback(callbackMock);
1740 deviceHandler.initialize();
1742 return deviceHandler;
1745 private static DeviceDTO createDevice() {
1746 DeviceDTO device = new DeviceDTO();
1748 device.setConfig(new DeviceConfigDTO());
1749 device.setCapabilityMap(new HashMap<>());
1753 private static ChannelUID createChannel(String channelId) {
1754 ChannelUID channelMock = mock(ChannelUID.class);
1755 when(channelMock.getId()).thenReturn(channelId);
1759 private static void addCapabilityToDevice(String capabilityType,
1760 @Nullable Consumer<CapabilityStateDTO> capabilityStateConsumer, DeviceDTO device) {
1761 CapabilityConfigDTO capabilityConfig = new CapabilityConfigDTO();
1762 capabilityConfig.setName("capabilityName");
1764 CapabilityStateDTO capabilityState = new CapabilityStateDTO();
1765 if (capabilityStateConsumer != null) {
1766 capabilityStateConsumer.accept(capabilityState);
1769 final String capabilityId = "capabilityId";
1770 CapabilityDTO capability = new CapabilityDTO();
1771 capability.setId(capabilityId);
1772 capability.setType(capabilityType);
1773 capability.setConfig(capabilityConfig);
1774 capability.setCapabilityState(capabilityState);
1775 device.getCapabilityMap().put(capabilityId, capability);
1778 private static EventDTO createCapabilityEvent(Consumer<EventPropertiesDTO> eventPropertiesConsumer) {
1779 EventPropertiesDTO eventProperties = new EventPropertiesDTO();
1780 eventPropertiesConsumer.accept(eventProperties);
1782 EventDTO event = new EventDTO();
1783 event.setSource(LINK_TYPE_CAPABILITY + "capabilityId");
1784 event.setProperties(eventProperties);
1788 private ThingHandlerCallback createCallbackMock(Bridge bridge) {
1789 ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
1790 when(callback.getBridge(any())).thenReturn(bridge);
1791 when(callback.createChannelBuilders(any(), any())).thenReturn(Collections.emptyList());
1793 doAnswer(invocation -> {
1794 ChannelUID channelUID = invocation.getArgument(0, ChannelUID.class);
1795 State state = invocation.getArgument(1, State.class);
1796 updatedChannels.put(channelUID.getId(), state);
1798 }).when(callback).stateUpdated(any(), any());
1800 doAnswer(invocation -> {
1801 Thing thing = invocation.getArgument(0, Thing.class);
1802 ThingStatusInfo thingStatusInfo = invocation.getArgument(1, ThingStatusInfo.class);
1803 thing.setStatusInfo(thingStatusInfo);
1805 }).when(callback).statusUpdated(any(), any());
1807 doAnswer(invocation -> {
1808 ChannelUID channelUID = invocation.getArgument(1, ChannelUID.class);
1809 String value = invocation.getArgument(2, String.class);
1810 triggeredChannels.add(new TriggeredEvent(channelUID.getId(), value));
1812 }).when(callback).channelTriggered(any(), any(), any());
1814 doAnswer(invocation -> {
1815 ChannelUID channelUID = invocation.getArgument(0, ChannelUID.class);
1816 return ChannelBuilder.create(channelUID);
1817 }).when(callback).createChannelBuilder(any(), any());
1819 doAnswer(invocation -> {
1820 ChannelUID channelUID = invocation.getArgument(1, ChannelUID.class);
1821 return ChannelBuilder.create(channelUID);
1822 }).when(callback).editChannel(any(), any());
1827 private boolean isChannelUpdated(String channelUID) {
1828 return updatedChannels.containsKey(channelUID);
1831 private boolean isChannelUpdated(String channelUID, State expectedState) {
1832 State state = updatedChannels.get(channelUID);
1833 return expectedState.equals(state);
1836 private boolean isChannelTriggered(String channelUID, String expectedTriggerValue) {
1837 return triggeredChannels.contains(new TriggeredEvent(channelUID, expectedTriggerValue));
1840 private static Channel createRollerShutterChannelMock(boolean isInvert) {
1841 Map<String, Object> rollerShutterChannelProperties = new HashMap<>();
1842 rollerShutterChannelProperties.put(INVERT_CHANNEL_PARAMETER, isInvert);
1843 Configuration rollerShutterChannelConfiguration = new Configuration(rollerShutterChannelProperties);
1845 Channel rollerShutterChannelMock = mock(Channel.class);
1846 when(rollerShutterChannelMock.getConfiguration()).thenReturn(rollerShutterChannelConfiguration);
1847 return rollerShutterChannelMock;
1850 private static class TriggeredEvent {
1852 private final String channelUID;
1853 private final String triggerValue;
1855 public TriggeredEvent(String channelUID, String triggerValue) {
1856 this.channelUID = channelUID;
1857 this.triggerValue = triggerValue;
1861 public boolean equals(@Nullable Object o) {
1864 if (o == null || getClass() != o.getClass())
1866 TriggeredEvent that = (TriggeredEvent) o;
1867 return channelUID.equals(that.channelUID) && triggerValue.equals(that.triggerValue);
1871 public int hashCode() {
1872 return Objects.hash(channelUID, triggerValue);