2 * Copyright (c) 2010-2023 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 testOnDeviceStateChangedIsReachable() {
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 testOnDeviceStateChangedIsNotReachable() {
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 testOnDeviceStateChangedIsReachableVariableActuator() {
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 testOnDeviceStateChangedLowBattery() {
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 testOnDeviceStateChangedNoLowBattery() {
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 testOnDeviceStateChangedNotBatteryPowered() {
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 testOnDeviceStateChangedVariableActuatorOn() {
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 testOnDeviceStateChangedVariableActuatorOff() {
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 testOnDeviceStateChangedVariableActuatorEmptyState() {
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 testOnDeviceStateChangedTemperatureSensorFrostWarningOn() {
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 testOnDeviceStateChangedTemperatureSensorFrostWarningOff() {
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 testOnDeviceStateChangedTemperatureSensorEmptyState() {
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 testOnDeviceStateChangedThermostatActuatorWindowReductionOn() {
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 testOnDeviceStateChangedThermostatActuatorWindowReductionOff() {
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 testOnDeviceStateChangedThermostatActuatorEmptyState() {
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 testOnDeviceStateChangedHumiditySensorMoldWarningOn() {
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 testOnDeviceStateChangedHumiditySensorMoldWarningOff() {
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 testOnDeviceStateChangedHumiditySensorEmptyState() {
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 testOnDeviceStateChangedWindowDoorSensorOpen() {
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 testOnDeviceStateChangedWindowDoorSensorClosed() {
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 testOnDeviceStateChangedWindowDoorSensorEmptyState() {
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 testOnDeviceStateChangedSmokeDetectorSensorOn() {
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 testOnDeviceStateChangedSmokeDetectorSensorOff() {
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 testOnDeviceStateChangedSmokeDetectorSensorEmptyState() {
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 testOnDeviceStateChangedAlarmActuatorOn() {
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 testOnDeviceStateChangedAlarmActuatorOff() {
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 testOnDeviceStateChangedAlarmActuatorEmptyState() {
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 testOnDeviceStateChangedSwitchActuatorOn() {
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 testOnDeviceStateChangedSwitchActuatorOff() {
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 testOnDeviceStateChangedSwitchActuatorEmptyState() {
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 testOnDeviceStateChangedDimmerActuator() {
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 testOnDeviceStateChangedDimmerActuatorEmptyState() {
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 testOnDeviceStateChangedRollerShutterActuator() {
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 testOnDeviceStateChangedRollerShutterActuatorInvertTrue() {
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 testOnDeviceStateChangedRollerShutterActuatorInvertFalse() {
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 testOnDeviceStateChangedRollerShutterActuatorEmptyState() {
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 testOnDeviceStateChangedMotionDetectionSensor() {
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 testOnDeviceStateChangedMotionDetectionSensorEmptyState() {
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 testOnDeviceStateChangedLuminanceSensor() {
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 testOnDeviceStateChangedLuminanceSensorEmptyState() {
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 testOnDeviceStateChangedEnergyConsumptionSensor() {
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 testOnDeviceStateChangedEnergyConsumptionSensorEmptyState() {
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 testOnDeviceStateChangedPowerConsumptionSensor() {
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 testOnDeviceStateChangedPowerConsumptionSensorEmptyState() {
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 testOnDeviceStateChangedGenerationMeterEnergySensor() {
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 testOnDeviceStateChangedGenerationMeterEnergySensorEmptyState() {
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 testOnDeviceStateChangedGenerationMeterPowerConsumptionSensor() {
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 testOnDeviceStateChangedGenerationMeterPowerConsumptionSensorEmptyState() {
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 testOnDeviceStateChangedTwoWayMeterEnergyConsumptionSensor() {
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 testOnDeviceStateChangedTwoWayMeterEnergyConsumptionSensorEmptyState() {
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 testOnDeviceStateChangedTwoWayMeterEnergyFeedSensor() {
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 testOnDeviceStateChangedTwoWayMeterEnergyFeedSensorEmptyState() {
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 testOnDeviceStateChangedTwoWayMeterPowerConsumptionSensor() {
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 testOnDeviceStateChangedTwoWayMeterPowerConsumptionSensorEmptyState() {
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 testOnDeviceStateChangedPushButtonSensorButton1ShortPress() {
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 // Trigger channels should only get triggered by events (onDeviceStateChanged(device, event), not
859 // onDeviceStateChanged(device)).
860 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
861 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
862 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
866 public void testOnDeviceStateChangedPushButtonSensorButton1LongPress() {
867 DeviceDTO device = createDevice();
868 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, c -> {
869 c.setPushButtonSensorCounterState(10);
870 c.setPushButtonSensorButtonIndexState(0);
871 c.setPushButtonSensorButtonIndexType("LongPress");
874 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
876 deviceHandler.onDeviceStateChanged(device);
877 assertTrue(isChannelUpdated("button1Count", new DecimalType(10)));
878 // Trigger channels should only get triggered by events (onDeviceStateChanged(device, event), not
879 // onDeviceStateChanged(device)).
880 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
881 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
882 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
886 public void testOnDeviceStateChangedPushButtonSensorButton2ShortPress() {
887 DeviceDTO device = createDevice();
888 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, c -> {
889 c.setPushButtonSensorCounterState(10);
890 c.setPushButtonSensorButtonIndexState(1);
891 c.setPushButtonSensorButtonIndexType("ShortPress");
894 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
896 deviceHandler.onDeviceStateChanged(device);
897 assertTrue(isChannelUpdated("button2Count", new DecimalType(10)));
898 // Trigger channels should only get triggered by events (onDeviceStateChanged(device, event), not
899 // onDeviceStateChanged(device)).
900 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.PRESSED));
901 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.SHORT_PRESSED));
902 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.LONG_PRESSED));
906 public void testOnDeviceStateChangedPushButtonSensorButton2LongPress() {
907 DeviceDTO device = createDevice();
908 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, c -> {
909 c.setPushButtonSensorCounterState(10);
910 c.setPushButtonSensorButtonIndexState(1);
911 c.setPushButtonSensorButtonIndexType("LongPress");
914 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
916 deviceHandler.onDeviceStateChanged(device);
917 assertTrue(isChannelUpdated("button2Count", new DecimalType(10)));
918 // Trigger channels should only get triggered by events (onDeviceStateChanged(device, event), not
919 // onDeviceStateChanged(device)).
920 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.PRESSED));
921 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.SHORT_PRESSED));
922 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.LONG_PRESSED));
926 public void testOnDeviceStateChangedPushButtonSensorEmptyState() {
927 DeviceDTO device = createDevice();
928 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
930 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
932 deviceHandler.onDeviceStateChanged(device);
933 assertFalse(isChannelUpdated(CHANNEL_BUTTON_COUNT));
934 assertFalse(isChannelUpdated("button1Count"));
935 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
936 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
937 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
941 public void testOnDeviceStateChangedEventLinkedToDevice() {
942 DeviceStateDTO deviceState = new DeviceStateDTO();
943 deviceState.setReachable(true);
945 DeviceDTO device = createDevice();
946 device.setDeviceState(deviceState);
948 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
950 EventDTO event = new EventDTO();
951 event.setSource(LINK_TYPE_DEVICE);
953 deviceHandler.onDeviceStateChanged(device, event);
954 assertEquals(ThingStatus.ONLINE, deviceHandler.getThing().getStatus());
955 assertEquals(ThingStatusDetail.NONE, deviceHandler.getThing().getStatusInfo().getStatusDetail());
959 public void testOnDeviceStateChangedEventLinkedToCapabilityWithoutState() {
960 DeviceDTO device = createDevice();
962 CapabilityConfigDTO capabilityConfig = new CapabilityConfigDTO();
963 capabilityConfig.setName("capabilityName");
965 final String capabilityId = "capabilityId";
966 CapabilityDTO capability = new CapabilityDTO();
967 capability.setId(capabilityId);
968 capability.setType(CapabilityDTO.TYPE_SWITCHACTUATOR);
969 capability.setConfig(capabilityConfig);
970 device.getCapabilityMap().put(capabilityId, capability);
972 DeviceDTO refreshedDevice = createDevice();
974 CapabilityStateDTO capabilityState = new CapabilityStateDTO();
975 capabilityState.setSwitchActuatorState(true);
977 CapabilityDTO refreshedCapability = new CapabilityDTO();
978 refreshedCapability.setId(capabilityId);
979 refreshedCapability.setType(CapabilityDTO.TYPE_SWITCHACTUATOR);
980 refreshedCapability.setConfig(capabilityConfig);
981 refreshedCapability.setCapabilityState(capabilityState);
982 refreshedDevice.getCapabilityMap().put(capabilityId, refreshedCapability);
984 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
985 when(bridgeHandlerMock.refreshDevice(any())).thenReturn(Optional.of(refreshedDevice));
987 EventDTO event = createCapabilityEvent(c -> c.setOnState(true));
989 deviceHandler.onDeviceStateChanged(device, event);
990 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.ON));
994 public void testOnDeviceStateChangedEventLinkedToCapabilityWithoutStateAlsoAfterRefresh() {
995 DeviceDTO device = createDevice();
997 CapabilityConfigDTO capabilityConfig = new CapabilityConfigDTO();
998 capabilityConfig.setName("capabilityName");
1000 final String capabilityId = "capabilityId";
1001 CapabilityDTO capability = new CapabilityDTO();
1002 capability.setId(capabilityId);
1003 capability.setType(CapabilityDTO.TYPE_SWITCHACTUATOR);
1004 capability.setConfig(capabilityConfig);
1005 device.getCapabilityMap().put(capabilityId, capability);
1007 DeviceDTO refreshedDevice = createDevice();
1009 CapabilityDTO refreshedCapability = new CapabilityDTO();
1010 refreshedCapability.setId(capabilityId);
1011 refreshedCapability.setType(CapabilityDTO.TYPE_SWITCHACTUATOR);
1012 refreshedCapability.setConfig(capabilityConfig);
1013 refreshedDevice.getCapabilityMap().put(capabilityId, refreshedCapability);
1015 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1016 when(bridgeHandlerMock.refreshDevice(any())).thenReturn(Optional.of(refreshedDevice));
1018 EventDTO event = createCapabilityEvent(c -> c.setOnState(true));
1020 deviceHandler.onDeviceStateChanged(device, event);
1021 // Channels should only get updated when the device have a state.
1022 assertFalse(isChannelUpdated(CHANNEL_SWITCH));
1026 public void testOnDeviceStateChangedEventVariableActuator() {
1027 DeviceDTO device = createDevice();
1028 addCapabilityToDevice(CapabilityDTO.TYPE_VARIABLEACTUATOR, null, device);
1030 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1032 EventDTO event = createCapabilityEvent(c -> c.setValue(true));
1034 deviceHandler.onDeviceStateChanged(device, event);
1035 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.ON));
1039 public void testOnDeviceStateChangedEventSwitchActuator() {
1040 DeviceDTO device = createDevice();
1041 addCapabilityToDevice(CapabilityDTO.TYPE_SWITCHACTUATOR, null, device);
1043 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1045 EventDTO event = createCapabilityEvent(c -> c.setOnState(true));
1047 deviceHandler.onDeviceStateChanged(device, event);
1048 assertTrue(isChannelUpdated(CHANNEL_SWITCH, OnOffType.ON));
1052 public void testOnDeviceStateChangedEventDimmerActuator() {
1053 DeviceDTO device = createDevice();
1054 addCapabilityToDevice(CapabilityDTO.TYPE_DIMMERACTUATOR, null, device);
1056 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1058 EventDTO event = createCapabilityEvent(c -> c.setDimLevel(50));
1060 deviceHandler.onDeviceStateChanged(device, event);
1061 assertTrue(isChannelUpdated(CHANNEL_DIMMER, new DecimalType(50)));
1065 public void testOnDeviceStateChangedEventRollerShutterActuator() {
1066 DeviceDTO device = createDevice();
1067 addCapabilityToDevice(CapabilityDTO.TYPE_ROLLERSHUTTERACTUATOR, null, device);
1069 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1071 EventDTO event = createCapabilityEvent(c -> c.setShutterLevel(50));
1073 deviceHandler.onDeviceStateChanged(device, event);
1074 assertTrue(isChannelUpdated(CHANNEL_ROLLERSHUTTER, new DecimalType(50)));
1078 public void testOnDeviceStateChangedEventRollerShutterPushButtonSensor() {
1079 DeviceDTO device = createDevice();
1080 addCapabilityToDevice(CapabilityDTO.TYPE_ROLLERSHUTTERACTUATOR, null, device);
1081 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
1083 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1085 EventDTO event = createCapabilityEvent(c -> {
1086 c.setKeyPressCounter(10);
1087 c.setKeyPressButtonIndex(0);
1088 c.setKeyPressType("ShortPress");
1090 event.setType("ButtonPressed");
1091 event.setNamespace("CosipDevices.RWE");
1093 deviceHandler.onDeviceStateChanged(device, event);
1094 assertTrue(isChannelUpdated("button1Count", new DecimalType(10)));
1095 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
1096 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
1097 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
1101 public void testOnDeviceStateChangedEventTemperatureSensor() {
1102 DeviceDTO device = createDevice();
1103 addCapabilityToDevice(CapabilityDTO.TYPE_TEMPERATURESENSOR, null, device);
1105 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1107 EventDTO event = createCapabilityEvent(c -> {
1108 c.setTemperature(21.5);
1109 c.setFrostWarning(true);
1112 deviceHandler.onDeviceStateChanged(device, event);
1113 assertTrue(isChannelUpdated(CHANNEL_CURRENT_TEMPERATURE, QuantityType.valueOf(21.5, SIUnits.CELSIUS)));
1114 assertTrue(isChannelUpdated(CHANNEL_FROST_WARNING, OnOffType.ON));
1118 public void testOnDeviceStateChangedEventThermostatSensor() {
1119 DeviceDTO device = createDevice();
1120 addCapabilityToDevice(CapabilityDTO.TYPE_THERMOSTATACTUATOR, null, device);
1122 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1124 EventDTO event = createCapabilityEvent(c -> {
1125 c.setPointTemperature(21.5);
1126 c.setOperationMode(STATE_VALUE_OPERATION_MODE_AUTO);
1127 c.setWindowReductionActive(true);
1130 deviceHandler.onDeviceStateChanged(device, event);
1131 assertTrue(isChannelUpdated(CHANNEL_TARGET_TEMPERATURE, QuantityType.valueOf(21.5, SIUnits.CELSIUS)));
1132 assertTrue(isChannelUpdated(CHANNEL_OPERATION_MODE, new StringType(STATE_VALUE_OPERATION_MODE_AUTO)));
1133 assertTrue(isChannelUpdated(CHANNEL_WINDOW_REDUCTION_ACTIVE, OnOffType.ON));
1137 public void testOnDeviceStateChangedEventHumiditySensor() {
1138 DeviceDTO device = createDevice();
1139 addCapabilityToDevice(CapabilityDTO.TYPE_HUMIDITYSENSOR, null, device);
1141 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1143 EventDTO event = createCapabilityEvent(c -> {
1144 c.setHumidity(35.5);
1145 c.setMoldWarning(true);
1148 deviceHandler.onDeviceStateChanged(device, event);
1149 assertTrue(isChannelUpdated(CHANNEL_HUMIDITY, QuantityType.valueOf(35.5, Units.PERCENT)));
1150 assertTrue(isChannelUpdated(CHANNEL_MOLD_WARNING, OnOffType.ON));
1154 public void testOnDeviceStateChangedEventWindowDoorSensor() {
1155 DeviceDTO device = createDevice();
1156 addCapabilityToDevice(CapabilityDTO.TYPE_WINDOWDOORSENSOR, null, device);
1158 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1160 EventDTO event = createCapabilityEvent(c -> c.setIsOpen(true));
1162 deviceHandler.onDeviceStateChanged(device, event);
1163 assertTrue(isChannelUpdated(CHANNEL_CONTACT, OpenClosedType.OPEN));
1167 public void testOnDeviceStateChangedEventSmokeDetectorSensor() {
1168 DeviceDTO device = createDevice();
1169 addCapabilityToDevice(CapabilityDTO.TYPE_SMOKEDETECTORSENSOR, null, device);
1171 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1173 EventDTO event = createCapabilityEvent(c -> c.setIsSmokeAlarm(true));
1175 deviceHandler.onDeviceStateChanged(device, event);
1176 assertTrue(isChannelUpdated(CHANNEL_SMOKE, OnOffType.ON));
1180 public void testOnDeviceStateChangedEventAlarmActuator() {
1181 DeviceDTO device = createDevice();
1182 addCapabilityToDevice(CapabilityDTO.TYPE_ALARMACTUATOR, null, device);
1184 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1186 EventDTO event = createCapabilityEvent(c -> c.setOnState(true));
1188 deviceHandler.onDeviceStateChanged(device, event);
1189 assertTrue(isChannelUpdated(CHANNEL_ALARM, OnOffType.ON));
1193 public void testOnDeviceStateChangedEventMotionDetectionSensor() {
1194 DeviceDTO device = createDevice();
1195 addCapabilityToDevice(CapabilityDTO.TYPE_MOTIONDETECTIONSENSOR, null, device);
1197 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1199 EventDTO event = createCapabilityEvent(c -> c.setMotionDetectedCount(50));
1201 deviceHandler.onDeviceStateChanged(device, event);
1202 assertTrue(isChannelUpdated(CHANNEL_MOTION_COUNT, new DecimalType(50)));
1206 public void testOnDeviceStateChangedEventLuminanceSensor() {
1207 DeviceDTO device = createDevice();
1208 addCapabilityToDevice(CapabilityDTO.TYPE_LUMINANCESENSOR, null, device);
1210 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1212 EventDTO event = createCapabilityEvent(c -> c.setLuminance(50.1));
1214 deviceHandler.onDeviceStateChanged(device, event);
1215 assertTrue(isChannelUpdated(CHANNEL_LUMINANCE, QuantityType.valueOf(50.1, Units.PERCENT)));
1219 public void testOnDeviceStateChangedEventPushButtonSensorButton1ShortPress() {
1220 DeviceDTO device = createDevice();
1221 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
1223 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1225 EventDTO event = createCapabilityEvent(c -> {
1226 c.setKeyPressCounter(10);
1227 c.setKeyPressButtonIndex(0);
1228 c.setKeyPressType("ShortPress");
1231 deviceHandler.onDeviceStateChanged(device, event);
1232 assertTrue(isChannelUpdated("button1Count", new DecimalType(10)));
1233 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
1234 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
1235 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
1236 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.PRESSED));
1240 public void testOnDeviceStateChangedEventPushButtonSensorButton1LongPress() {
1241 DeviceDTO device = createDevice();
1242 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
1244 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1246 EventDTO event = createCapabilityEvent(c -> {
1247 c.setKeyPressCounter(10);
1248 c.setKeyPressButtonIndex(0);
1249 c.setKeyPressType("LongPress");
1252 deviceHandler.onDeviceStateChanged(device, event);
1253 assertTrue(isChannelUpdated("button1Count", new DecimalType(10)));
1254 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
1255 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
1256 assertTrue(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
1257 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.PRESSED));
1261 public void testOnDeviceStateChangedStateChangedEventPushButtonSensorSHCClassic() {
1262 when(bridgeHandlerMock.isSHCClassic()).thenReturn(true);
1264 DeviceDTO device = createDevice();
1265 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
1267 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1269 // SHC Classic sends only StateChanged events with this information
1270 EventDTO event = createCapabilityEvent(c -> {
1271 c.setLastKeyPressButtonIndex(0);
1272 c.setLastKeyPressCounter(10);
1275 // Nothing should get processed, because it should only react on the more detailed ButtonPressed events
1276 deviceHandler.onDeviceStateChanged(device, event);
1277 assertFalse(isChannelUpdated("button1Count", new DecimalType(10)));
1278 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
1279 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED)); // not available for SHC Classic
1280 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED)); // not available for SHC Classic
1281 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.PRESSED));
1285 public void testOnDeviceStateChangedStateChangedEventPushButtonSensorSHCA() {
1286 when(bridgeHandlerMock.isSHCClassic()).thenReturn(false);
1288 DeviceDTO device = createDevice();
1289 addCapabilityToDevice(CapabilityDTO.TYPE_PUSHBUTTONSENSOR, null, device);
1291 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1293 // StateChanged events only have with this information
1294 EventDTO event = createCapabilityEvent(c -> {
1295 c.setLastKeyPressButtonIndex(0);
1296 c.setLastKeyPressCounter(10);
1299 // Nothing should get processed, because it should only react on the more detailed ButtonPressed events
1300 deviceHandler.onDeviceStateChanged(device, event);
1301 assertFalse(isChannelUpdated("button1Count", new DecimalType(10)));
1302 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.PRESSED));
1303 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.SHORT_PRESSED));
1304 assertFalse(isChannelTriggered("button1", CommonTriggerEvents.LONG_PRESSED));
1305 assertFalse(isChannelTriggered("button2", CommonTriggerEvents.PRESSED));
1309 public void testOnDeviceStateChangedEventEnergyConsumptionSensor() {
1310 DeviceDTO device = createDevice();
1311 addCapabilityToDevice(CapabilityDTO.TYPE_ENERGYCONSUMPTIONSENSOR, null, device);
1313 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1315 EventDTO event = createCapabilityEvent(c -> {
1316 c.setEnergyConsumptionMonthKWh(201.51);
1317 c.setAbsoluteEnergyConsumption(5500.51);
1318 c.setEnergyConsumptionMonthEuro(80.32);
1319 c.setEnergyConsumptionDayEuro(3.72);
1320 c.setEnergyConsumptionDayKWh(8.71);
1323 deviceHandler.onDeviceStateChanged(device, event);
1324 assertTrue(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_MONTH_KWH,
1325 QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
1326 assertTrue(isChannelUpdated(CHANNEL_ABOLUTE_ENERGY_CONSUMPTION,
1327 QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
1328 assertTrue(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_MONTH_EURO, new DecimalType(80.32)));
1329 assertTrue(isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_DAY_EURO, new DecimalType(3.72)));
1331 isChannelUpdated(CHANNEL_ENERGY_CONSUMPTION_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
1335 public void testOnDeviceStateChangedEventPowerConsumptionSensor() {
1336 DeviceDTO device = createDevice();
1337 addCapabilityToDevice(CapabilityDTO.TYPE_POWERCONSUMPTIONSENSOR, null, device);
1339 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1341 EventDTO event = createCapabilityEvent(c -> c.setPowerConsumptionWatt(350.5));
1343 deviceHandler.onDeviceStateChanged(device, event);
1344 assertTrue(isChannelUpdated(CHANNEL_POWER_CONSUMPTION_WATT, QuantityType.valueOf(350.5, Units.WATT)));
1348 public void testOnDeviceStateChangedEventGenerationMeterEnergySensor() {
1349 DeviceDTO device = createDevice();
1350 addCapabilityToDevice(CapabilityDTO.TYPE_GENERATIONMETERENERGYSENSOR, null, device);
1352 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1354 EventDTO event = createCapabilityEvent(c -> {
1355 c.setEnergyPerMonthInKWh(201.51);
1356 c.setTotalEnergy(5500.51);
1357 c.setEnergyPerMonthInEuro(80.32);
1358 c.setEnergyPerDayInEuro(3.72);
1359 c.setEnergyPerDayInKWh(8.71);
1362 deviceHandler.onDeviceStateChanged(device, event);
1363 assertTrue(isChannelUpdated(CHANNEL_ENERGY_GENERATION_MONTH_KWH,
1364 QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
1366 isChannelUpdated(CHANNEL_TOTAL_ENERGY_GENERATION, QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
1367 assertTrue(isChannelUpdated(CHANNEL_ENERGY_GENERATION_MONTH_EURO, new DecimalType(80.32)));
1368 assertTrue(isChannelUpdated(CHANNEL_ENERGY_GENERATION_DAY_EURO, new DecimalType(3.72)));
1370 isChannelUpdated(CHANNEL_ENERGY_GENERATION_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
1374 public void testOnDeviceStateChangedEventGenerationMeterPowerConsumptionSensor() {
1375 DeviceDTO device = createDevice();
1376 addCapabilityToDevice(CapabilityDTO.TYPE_GENERATIONMETERPOWERCONSUMPTIONSENSOR, null, device);
1378 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1380 EventDTO event = createCapabilityEvent(c -> c.setPowerInWatt(350.5));
1382 deviceHandler.onDeviceStateChanged(device, event);
1383 assertTrue(isChannelUpdated(CHANNEL_POWER_GENERATION_WATT, QuantityType.valueOf(350.5, Units.WATT)));
1387 public void testOnDeviceStateChangedEventTwoWayMeterEnergyConsumptionSensor() {
1388 DeviceDTO device = createDevice();
1389 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERENERGYCONSUMPTIONSENSOR, null, device);
1391 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1393 EventDTO event = createCapabilityEvent(c -> {
1394 c.setEnergyPerMonthInKWh(201.51);
1395 c.setTotalEnergy(5500.51);
1396 c.setEnergyPerMonthInEuro(80.32);
1397 c.setEnergyPerDayInEuro(3.72);
1398 c.setEnergyPerDayInKWh(8.71);
1401 deviceHandler.onDeviceStateChanged(device, event);
1402 assertTrue(isChannelUpdated(CHANNEL_ENERGY_MONTH_KWH, QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
1403 assertTrue(isChannelUpdated(CHANNEL_TOTAL_ENERGY, QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
1404 assertTrue(isChannelUpdated(CHANNEL_ENERGY_MONTH_EURO, new DecimalType(80.32)));
1405 assertTrue(isChannelUpdated(CHANNEL_ENERGY_DAY_EURO, new DecimalType(3.72)));
1406 assertTrue(isChannelUpdated(CHANNEL_ENERGY_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
1410 public void testOnDeviceStateChangedEventTwoWayMeterEnergyFeedSensor() {
1411 DeviceDTO device = createDevice();
1412 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERENERGYFEEDSENSOR, null, device);
1414 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1416 EventDTO event = createCapabilityEvent(c -> {
1417 c.setEnergyPerMonthInKWh(201.51);
1418 c.setTotalEnergy(5500.51);
1419 c.setEnergyPerMonthInEuro(80.32);
1420 c.setEnergyPerDayInEuro(3.72);
1421 c.setEnergyPerDayInKWh(8.71);
1424 deviceHandler.onDeviceStateChanged(device, event);
1425 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_MONTH_KWH, QuantityType.valueOf(201.51, Units.KILOWATT_HOUR)));
1426 assertTrue(isChannelUpdated(CHANNEL_TOTAL_ENERGY_FED, QuantityType.valueOf(5500.51, Units.KILOWATT_HOUR)));
1427 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_MONTH_EURO, new DecimalType(80.32)));
1428 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_DAY_EURO, new DecimalType(3.72)));
1429 assertTrue(isChannelUpdated(CHANNEL_ENERGY_FEED_DAY_KWH, QuantityType.valueOf(8.71, Units.KILOWATT_HOUR)));
1433 public void testOnDeviceStateChangedEventTwoWayMeterPowerConsumptionSensor() {
1434 DeviceDTO device = createDevice();
1435 addCapabilityToDevice(CapabilityDTO.TYPE_TWOWAYMETERPOWERCONSUMPTIONSENSOR, null, device);
1437 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1439 EventDTO event = createCapabilityEvent(c -> c.setPowerInWatt(350.5));
1441 deviceHandler.onDeviceStateChanged(device, event);
1442 assertTrue(isChannelUpdated(CHANNEL_POWER_WATT, QuantityType.valueOf(350.5, Units.WATT)));
1446 public void testHandleCommandUnsupportedChannel() {
1447 DeviceDTO device = createDevice();
1449 ChannelUID channelMock = createChannel(CHANNEL_CONTACT);
1451 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1453 deviceHandler.handleCommand(channelMock, OpenClosedType.OPEN);
1455 verify(bridgeHandlerMock, never()).commandSetRollerShutterLevel(any(), anyInt());
1456 verify(bridgeHandlerMock, never()).commandSwitchDevice(any(), anyBoolean());
1457 verify(bridgeHandlerMock, never()).commandUpdatePointTemperature(any(), anyDouble());
1458 verify(bridgeHandlerMock, never()).commandSwitchAlarm(any(), anyBoolean());
1459 verify(bridgeHandlerMock, never()).commandSetOperationMode(any(), anyBoolean());
1460 verify(bridgeHandlerMock, never()).commandSetDimLevel(any(), anyInt());
1461 verify(bridgeHandlerMock, never()).commandSetRollerShutterLevel(any(), anyInt());
1462 verify(bridgeHandlerMock, never()).commandSetRollerShutterStop(any(), any());
1466 public void testHandleCommandCommandSwitchDeviceOn() {
1467 DeviceDTO device = createDevice();
1469 ChannelUID channelMock = createChannel(CHANNEL_SWITCH);
1471 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1472 deviceHandler.handleCommand(channelMock, OnOffType.ON);
1474 verify(bridgeHandlerMock).commandSwitchDevice(device.getId(), true);
1478 public void testHandleCommandCommandSwitchDeviceOff() {
1479 DeviceDTO device = createDevice();
1481 ChannelUID channelMock = createChannel(CHANNEL_SWITCH);
1483 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1484 deviceHandler.handleCommand(channelMock, OnOffType.OFF);
1486 verify(bridgeHandlerMock).commandSwitchDevice(device.getId(), false);
1490 public void testHandleCommandCommandSwitchAlarmOn() {
1491 DeviceDTO device = createDevice();
1493 ChannelUID channelMock = createChannel(CHANNEL_ALARM);
1495 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1496 deviceHandler.handleCommand(channelMock, OnOffType.ON);
1498 verify(bridgeHandlerMock).commandSwitchAlarm(device.getId(), true);
1502 public void testHandleCommandCommandSwitchAlarmOff() {
1503 DeviceDTO device = createDevice();
1505 ChannelUID channelMock = createChannel(CHANNEL_ALARM);
1507 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1508 deviceHandler.handleCommand(channelMock, OnOffType.OFF);
1510 verify(bridgeHandlerMock).commandSwitchAlarm(device.getId(), false);
1514 public void testHandleCommandCommandSetDimLevelOn() {
1515 DeviceDTO device = createDevice();
1517 ChannelUID channelMock = createChannel(CHANNEL_DIMMER);
1519 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1520 deviceHandler.handleCommand(channelMock, OnOffType.ON);
1522 verify(bridgeHandlerMock).commandSetDimLevel(device.getId(), 100);
1526 public void testHandleCommandCommandSetDimLevelOff() {
1527 DeviceDTO device = createDevice();
1529 ChannelUID channelMock = createChannel(CHANNEL_DIMMER);
1531 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1532 deviceHandler.handleCommand(channelMock, OnOffType.OFF);
1534 verify(bridgeHandlerMock).commandSetDimLevel(device.getId(), 0);
1538 public void testHandleCommandCommandSetDimLevelDecimalType() {
1539 DeviceDTO device = createDevice();
1541 ChannelUID channelMock = createChannel(CHANNEL_DIMMER);
1543 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1544 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("30"));
1546 verify(bridgeHandlerMock).commandSetDimLevel(device.getId(), 30);
1550 public void testHandleCommandCommandSetOperationModeAuto() {
1551 DeviceDTO device = createDevice();
1553 ChannelUID channelMock = createChannel(CHANNEL_OPERATION_MODE);
1555 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1556 deviceHandler.handleCommand(channelMock, StringType.valueOf(STATE_VALUE_OPERATION_MODE_AUTO));
1558 verify(bridgeHandlerMock).commandSetOperationMode(device.getId(), true);
1562 public void testHandleCommandCommandSetOperationModeManual() {
1563 DeviceDTO device = createDevice();
1565 ChannelUID channelMock = createChannel(CHANNEL_OPERATION_MODE);
1567 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1568 deviceHandler.handleCommand(channelMock, StringType.valueOf(STATE_VALUE_OPERATION_MODE_MANUAL));
1570 verify(bridgeHandlerMock).commandSetOperationMode(device.getId(), false);
1574 public void testHandleCommandCommandSetOperationModeUnknown() {
1575 DeviceDTO device = createDevice();
1577 ChannelUID channelMock = createChannel(CHANNEL_OPERATION_MODE);
1579 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1580 deviceHandler.handleCommand(channelMock, StringType.valueOf("Unknown"));
1582 verify(bridgeHandlerMock, never()).commandSetOperationMode(any(), anyBoolean());
1586 public void testHandleCommandCommandUpdatePointTemperatureQuantityType() {
1587 DeviceDTO device = createDevice();
1589 ChannelUID channelMock = createChannel(CHANNEL_TARGET_TEMPERATURE);
1591 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1592 deviceHandler.handleCommand(channelMock, QuantityType.valueOf(20.0, SIUnits.CELSIUS));
1594 verify(bridgeHandlerMock).commandUpdatePointTemperature(device.getId(), 20.0);
1598 public void testHandleCommandCommandUpdatePointTemperatureDecimalType() {
1599 DeviceDTO device = createDevice();
1601 ChannelUID channelMock = createChannel(CHANNEL_TARGET_TEMPERATURE);
1603 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1604 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("20"));
1606 verify(bridgeHandlerMock).commandUpdatePointTemperature(device.getId(), 20.0);
1610 public void testHandleCommandCommandUpdatePointTemperatureMinTemperature() {
1611 DeviceDTO device = createDevice();
1613 ChannelUID channelMock = createChannel(CHANNEL_TARGET_TEMPERATURE);
1615 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1616 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("0"));
1618 // 0 (and everything below the min temperature 6.0 should be set to the min temperature 6.0)
1619 verify(bridgeHandlerMock).commandUpdatePointTemperature(device.getId(), 6.0);
1623 public void testHandleCommandCommandUpdatePointTemperatureMaxTemperature() {
1624 DeviceDTO device = createDevice();
1626 ChannelUID channelMock = createChannel(CHANNEL_TARGET_TEMPERATURE);
1628 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1629 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("40"));
1631 // 0 (and everything below the min temperature 30.0 should be set to the min temperature 30.0)
1632 verify(bridgeHandlerMock).commandUpdatePointTemperature(device.getId(), 30.0);
1636 public void testHandleCommandCommandRollerShutterUp() {
1637 DeviceDTO device = createDevice();
1639 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1641 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1642 deviceHandler.handleCommand(channelMock, UpDownType.UP);
1644 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.UP);
1648 public void testHandleCommandCommandRollerShutterDown() {
1649 DeviceDTO device = createDevice();
1651 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1653 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1654 deviceHandler.handleCommand(channelMock, UpDownType.DOWN);
1656 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.DOWN);
1660 public void testHandleCommandCommandRollerShutterOn() {
1661 DeviceDTO device = createDevice();
1663 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1665 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1666 deviceHandler.handleCommand(channelMock, OnOffType.ON);
1668 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.DOWN);
1672 public void testHandleCommandCommandRollerShutterOff() {
1673 DeviceDTO device = createDevice();
1675 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1677 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1678 deviceHandler.handleCommand(channelMock, OnOffType.OFF);
1680 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.UP);
1684 public void testHandleCommandCommandRollerShutterStop() {
1685 DeviceDTO device = createDevice();
1687 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1689 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1690 deviceHandler.handleCommand(channelMock, StopMoveType.STOP);
1692 verify(bridgeHandlerMock).commandSetRollerShutterStop(device.getId(), ShutterActionType.STOP);
1696 public void testHandleCommandCommandRollerShutterDecimalType() {
1697 DeviceDTO device = createDevice();
1699 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1701 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1702 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("30"));
1704 verify(bridgeHandlerMock).commandSetRollerShutterLevel(device.getId(), 30);
1708 public void testHandleCommandCommandRollerShutterDecimalTypeInverted() {
1709 DeviceDTO device = createDevice();
1711 Channel rollerShutterChannelMock = createRollerShutterChannelMock(true);
1713 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1715 Thing thingMock = deviceHandler.getThing();
1716 when(thingMock.getChannel(CHANNEL_ROLLERSHUTTER)).thenReturn(rollerShutterChannelMock);
1718 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1720 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("30"));
1722 verify(bridgeHandlerMock).commandSetRollerShutterLevel(device.getId(), 30);
1726 public void testHandleCommandCommandRollerShutterDecimalTypeNotInverted() {
1727 DeviceDTO device = createDevice();
1729 Channel rollerShutterChannelMock = createRollerShutterChannelMock(false);
1731 LivisiDeviceHandler deviceHandler = createDeviceHandler(device);
1733 Thing thingMock = deviceHandler.getThing();
1734 when(thingMock.getChannel(CHANNEL_ROLLERSHUTTER)).thenReturn(rollerShutterChannelMock);
1736 ChannelUID channelMock = createChannel(CHANNEL_ROLLERSHUTTER);
1738 deviceHandler.handleCommand(channelMock, DecimalType.valueOf("30"));
1740 verify(bridgeHandlerMock).commandSetRollerShutterLevel(device.getId(), 70);
1743 private LivisiDeviceHandler createDeviceHandler(DeviceDTO device) {
1744 when(bridgeHandlerMock.getDeviceById(any())).thenReturn(Optional.of(device));
1746 ThingUID bridgeThingUID = new ThingUID(THING_TYPE_BRIDGE, "bridgeId");
1747 Bridge bridgeMock = mock(Bridge.class);
1748 when(bridgeMock.getHandler()).thenReturn(bridgeHandlerMock);
1749 when(bridgeMock.getStatus()).thenReturn(ThingStatus.ONLINE);
1750 when(bridgeMock.getStatusInfo())
1751 .thenReturn(new ThingStatusInfo(ThingStatus.ONLINE, ThingStatusDetail.NONE, null));
1753 ThingTypeUID thingTypeUID = THING_TYPE_RST2;
1754 ThingUID thingUID = new ThingUID(thingTypeUID, device.getId());
1756 Configuration thingConfiguration = new Configuration();
1757 thingConfiguration.setProperties(Map.of(PROPERTY_ID, device.getId()));
1759 Thing thingMock = mock(Thing.class);
1760 when(thingMock.getBridgeUID()).thenReturn(bridgeThingUID);
1761 when(thingMock.getConfiguration()).thenReturn(thingConfiguration);
1762 when(thingMock.getUID()).thenReturn(thingUID);
1763 when(thingMock.getThingTypeUID()).thenReturn(thingTypeUID);
1764 doAnswer(invocation -> {
1765 thingStatusInfo = invocation.getArgument(0, ThingStatusInfo.class);
1767 }).when(thingMock).setStatusInfo(any());
1768 when(thingMock.getStatusInfo()).thenAnswer(invocation -> thingStatusInfo);
1769 when(thingMock.getStatus()).thenAnswer(invocation -> thingStatusInfo.getStatus());
1771 LivisiDeviceHandler deviceHandler = new LivisiDeviceHandler(thingMock);
1772 ThingHandlerCallback callbackMock = createCallbackMock(bridgeMock);
1773 deviceHandler.setCallback(callbackMock);
1775 deviceHandler.initialize();
1777 return deviceHandler;
1780 private static DeviceDTO createDevice() {
1781 DeviceDTO device = new DeviceDTO();
1783 device.setConfig(new DeviceConfigDTO());
1784 device.setCapabilityMap(new HashMap<>());
1788 private static ChannelUID createChannel(String channelId) {
1789 ChannelUID channelMock = mock(ChannelUID.class);
1790 when(channelMock.getId()).thenReturn(channelId);
1794 private static void addCapabilityToDevice(String capabilityType,
1795 @Nullable Consumer<CapabilityStateDTO> capabilityStateConsumer, DeviceDTO device) {
1796 CapabilityConfigDTO capabilityConfig = new CapabilityConfigDTO();
1797 capabilityConfig.setName("capabilityName");
1799 CapabilityStateDTO capabilityState = new CapabilityStateDTO();
1800 if (capabilityStateConsumer != null) {
1801 capabilityStateConsumer.accept(capabilityState);
1804 final String capabilityId = "capabilityId";
1805 CapabilityDTO capability = new CapabilityDTO();
1806 capability.setId(capabilityId);
1807 capability.setType(capabilityType);
1808 capability.setConfig(capabilityConfig);
1809 capability.setCapabilityState(capabilityState);
1810 device.getCapabilityMap().put(capabilityId, capability);
1813 private static EventDTO createCapabilityEvent(Consumer<EventPropertiesDTO> eventPropertiesConsumer) {
1814 EventPropertiesDTO eventProperties = new EventPropertiesDTO();
1815 eventPropertiesConsumer.accept(eventProperties);
1817 EventDTO event = new EventDTO();
1818 event.setSource(LINK_TYPE_CAPABILITY + "capabilityId");
1819 event.setProperties(eventProperties);
1823 private ThingHandlerCallback createCallbackMock(Bridge bridge) {
1824 ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
1825 when(callback.getBridge(any())).thenReturn(bridge);
1826 when(callback.createChannelBuilders(any(), any())).thenReturn(Collections.emptyList());
1828 doAnswer(invocation -> {
1829 ChannelUID channelUID = invocation.getArgument(0, ChannelUID.class);
1830 State state = invocation.getArgument(1, State.class);
1831 updatedChannels.put(channelUID.getId(), state);
1833 }).when(callback).stateUpdated(any(), any());
1835 doAnswer(invocation -> {
1836 Thing thing = invocation.getArgument(0, Thing.class);
1837 ThingStatusInfo thingStatusInfo = invocation.getArgument(1, ThingStatusInfo.class);
1838 thing.setStatusInfo(thingStatusInfo);
1840 }).when(callback).statusUpdated(any(), any());
1842 doAnswer(invocation -> {
1843 ChannelUID channelUID = invocation.getArgument(1, ChannelUID.class);
1844 String value = invocation.getArgument(2, String.class);
1845 triggeredChannels.add(new TriggeredEvent(channelUID.getId(), value));
1847 }).when(callback).channelTriggered(any(), any(), any());
1849 doAnswer(invocation -> {
1850 ChannelUID channelUID = invocation.getArgument(0, ChannelUID.class);
1851 return ChannelBuilder.create(channelUID);
1852 }).when(callback).createChannelBuilder(any(), any());
1854 doAnswer(invocation -> {
1855 ChannelUID channelUID = invocation.getArgument(1, ChannelUID.class);
1856 return ChannelBuilder.create(channelUID);
1857 }).when(callback).editChannel(any(), any());
1862 private boolean isChannelUpdated(String channelUID) {
1863 return updatedChannels.containsKey(channelUID);
1866 private boolean isChannelUpdated(String channelUID, State expectedState) {
1867 State state = updatedChannels.get(channelUID);
1868 return expectedState.equals(state);
1871 private boolean isChannelTriggered(String channelUID, String expectedTriggerValue) {
1872 return triggeredChannels.contains(new TriggeredEvent(channelUID, expectedTriggerValue));
1875 private static Channel createRollerShutterChannelMock(boolean isInvert) {
1876 Map<String, Object> rollerShutterChannelProperties = new HashMap<>();
1877 rollerShutterChannelProperties.put(INVERT_CHANNEL_PARAMETER, isInvert);
1878 Configuration rollerShutterChannelConfiguration = new Configuration(rollerShutterChannelProperties);
1880 Channel rollerShutterChannelMock = mock(Channel.class);
1881 when(rollerShutterChannelMock.getConfiguration()).thenReturn(rollerShutterChannelConfiguration);
1882 return rollerShutterChannelMock;
1885 private static class TriggeredEvent {
1887 private final String channelUID;
1888 private final String triggerValue;
1890 public TriggeredEvent(String channelUID, String triggerValue) {
1891 this.channelUID = channelUID;
1892 this.triggerValue = triggerValue;
1896 public boolean equals(@Nullable Object o) {
1900 if (o == null || getClass() != o.getClass()) {
1903 TriggeredEvent that = (TriggeredEvent) o;
1904 return channelUID.equals(that.channelUID) && triggerValue.equals(that.triggerValue);
1908 public int hashCode() {
1909 return Objects.hash(channelUID, triggerValue);