2 * Copyright (c) 2010-2024 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.mqtt.homeassistant.internal.component;
15 import static org.hamcrest.CoreMatchers.is;
16 import static org.hamcrest.MatcherAssert.assertThat;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.junit.jupiter.api.Test;
22 import org.openhab.binding.mqtt.generic.values.NumberValue;
23 import org.openhab.binding.mqtt.generic.values.TextValue;
24 import org.openhab.core.library.types.QuantityType;
25 import org.openhab.core.library.unit.Units;
26 import org.openhab.core.thing.ThingStatus;
27 import org.openhab.core.types.UnDefType;
30 * Tests for {@link Sensor}
32 * @author Anton Kharuzhy - Initial contribution
35 public class SensorTests extends AbstractComponentTests {
36 public static final String CONFIG_TOPIC = "sensor/0x0000000000000000_sensor_zigbee2mqtt";
38 @SuppressWarnings("null")
40 public void test() throws InterruptedException {
42 var component = discoverComponent(configTopicToMqtt(CONFIG_TOPIC),
45 "availability_topic": "zigbee2mqtt/bridge/state", \
46 "availability_template": "{{value_json.state}}", \
49 "zigbee2mqtt_0x0000000000000000" \
51 "manufacturer": "Sensors inc", \
54 "sw_version": "Zigbee2MQTT 1.18.2" \
57 "expire_after": "1", \
58 "force_update": "true", \
59 "unit_of_measurement": "W", \
60 "state_topic": "zigbee2mqtt/sensor/state", \
66 assertThat(component.channels.size(), is(1));
67 assertThat(component.getName(), is("sensor1"));
68 assertThat(component.getGroupId(), is("sn1"));
70 assertChannel(component, Sensor.SENSOR_CHANNEL_ID, "zigbee2mqtt/sensor/state", "", "sensor1",
73 publishMessage("zigbee2mqtt/bridge/state", "{ \"state\": \"online\" }");
74 assertThat(haThing.getStatus(), is(ThingStatus.ONLINE));
75 publishMessage("zigbee2mqtt/sensor/state", "10");
76 assertState(component, Sensor.SENSOR_CHANNEL_ID, new QuantityType<>(10, Units.WATT));
77 publishMessage("zigbee2mqtt/sensor/state", "20");
78 assertState(component, Sensor.SENSOR_CHANNEL_ID, new QuantityType<>(20, Units.WATT));
79 assertThat(component.getChannel(Sensor.SENSOR_CHANNEL_ID).getState().getCache().createStateDescription(true)
80 .build().getPattern(), is("%.0f %unit%"));
82 waitForAssert(() -> assertState(component, Sensor.SENSOR_CHANNEL_ID, UnDefType.UNDEF), 5000, 200);
84 publishMessage("zigbee2mqtt/bridge/state", "{ \"state\": \"offline\" }");
85 assertThat(haThing.getStatus(), is(ThingStatus.OFFLINE));
89 public void testMeasurementStateClass() throws InterruptedException {
91 var component = discoverComponent(configTopicToMqtt(CONFIG_TOPIC),
96 "zigbee2mqtt_0x0000000000000000" \
98 "manufacturer": "Sensors inc", \
101 "sw_version": "Zigbee2MQTT 1.18.2" \
104 "expire_after": "1", \
105 "force_update": "true", \
106 "state_class": "measurement", \
107 "state_topic": "zigbee2mqtt/sensor/state", \
113 assertChannel(component, Sensor.SENSOR_CHANNEL_ID, "zigbee2mqtt/sensor/state", "", "sensor1",
118 public void testNonNumericSensor() throws InterruptedException {
120 var component = discoverComponent(configTopicToMqtt(CONFIG_TOPIC),
125 "zigbee2mqtt_0x0000000000000000" \
127 "manufacturer": "Sensors inc", \
130 "sw_version": "Zigbee2MQTT 1.18.2" \
133 "expire_after": "1", \
134 "force_update": "true", \
135 "state_topic": "zigbee2mqtt/sensor/state", \
141 assertChannel(component, Sensor.SENSOR_CHANNEL_ID, "zigbee2mqtt/sensor/state", "", "sensor1", TextValue.class);
145 protected Set<String> getConfigTopics() {
146 return Set.of(CONFIG_TOPIC);