[mqtt.homeassistant] sensors with a state_class are numeric (#13398)
see reference in code comment, but a measurement sensor is assumed to be numeric, even if it doesn't have a unit Signed-off-by: Cody Cutrer <cody@cutrer.us>
This commit is contained in:
parent
2fd2e5175f
commit
a2b6dd77b7
@ -49,6 +49,8 @@ public class Sensor extends AbstractComponent<Sensor.ChannelConfiguration> {
|
|||||||
protected @Nullable String unitOfMeasurement;
|
protected @Nullable String unitOfMeasurement;
|
||||||
@SerializedName("device_class")
|
@SerializedName("device_class")
|
||||||
protected @Nullable String deviceClass;
|
protected @Nullable String deviceClass;
|
||||||
|
@SerializedName("state_class")
|
||||||
|
protected @Nullable String stateClass;
|
||||||
@SerializedName("force_update")
|
@SerializedName("force_update")
|
||||||
protected boolean forceUpdate = false;
|
protected boolean forceUpdate = false;
|
||||||
@SerializedName("expire_after")
|
@SerializedName("expire_after")
|
||||||
@ -70,9 +72,14 @@ public class Sensor extends AbstractComponent<Sensor.ChannelConfiguration> {
|
|||||||
|
|
||||||
Value value;
|
Value value;
|
||||||
String uom = channelConfiguration.unitOfMeasurement;
|
String uom = channelConfiguration.unitOfMeasurement;
|
||||||
|
String sc = channelConfiguration.stateClass;
|
||||||
|
|
||||||
if (uom != null && !uom.isBlank()) {
|
if (uom != null && !uom.isBlank()) {
|
||||||
value = new NumberValue(null, null, null, UnitUtils.parseUnit(uom));
|
value = new NumberValue(null, null, null, UnitUtils.parseUnit(uom));
|
||||||
|
} else if (sc != null && !sc.isBlank()) {
|
||||||
|
// see state_class at https://developers.home-assistant.io/docs/core/entity/sensor#properties
|
||||||
|
// > If not None, the sensor is assumed to be numerical
|
||||||
|
value = new NumberValue(null, null, null, null);
|
||||||
} else {
|
} else {
|
||||||
value = new TextValue();
|
value = new TextValue();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,6 +20,7 @@ import java.util.Set;
|
|||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.openhab.binding.mqtt.generic.values.NumberValue;
|
import org.openhab.binding.mqtt.generic.values.NumberValue;
|
||||||
|
import org.openhab.binding.mqtt.generic.values.TextValue;
|
||||||
import org.openhab.core.library.types.QuantityType;
|
import org.openhab.core.library.types.QuantityType;
|
||||||
import org.openhab.core.library.unit.Units;
|
import org.openhab.core.library.unit.Units;
|
||||||
import org.openhab.core.types.UnDefType;
|
import org.openhab.core.types.UnDefType;
|
||||||
@ -79,6 +80,58 @@ public class SensorTests extends AbstractComponentTests {
|
|||||||
waitForAssert(() -> assertState(component, Sensor.SENSOR_CHANNEL_ID, UnDefType.UNDEF), 10000, 200);
|
waitForAssert(() -> assertState(component, Sensor.SENSOR_CHANNEL_ID, UnDefType.UNDEF), 10000, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMeasurementStateClass() throws InterruptedException {
|
||||||
|
// @formatter:off
|
||||||
|
var component = discoverComponent(configTopicToMqtt(CONFIG_TOPIC),
|
||||||
|
"{ " +
|
||||||
|
" \"device\": { " +
|
||||||
|
" \"identifiers\": [ " +
|
||||||
|
" \"zigbee2mqtt_0x0000000000000000\" " +
|
||||||
|
" ], " +
|
||||||
|
" \"manufacturer\": \"Sensors inc\", " +
|
||||||
|
" \"model\": \"Sensor\", " +
|
||||||
|
" \"name\": \"Sensor\", " +
|
||||||
|
" \"sw_version\": \"Zigbee2MQTT 1.18.2\" " +
|
||||||
|
" }, " +
|
||||||
|
" \"name\": \"sensor1\", " +
|
||||||
|
" \"expire_after\": \"1\", " +
|
||||||
|
" \"force_update\": \"true\", " +
|
||||||
|
" \"state_class\": \"measurement\", " +
|
||||||
|
" \"state_topic\": \"zigbee2mqtt/sensor/state\", " +
|
||||||
|
" \"unique_id\": \"sn1\" " +
|
||||||
|
"}");
|
||||||
|
// @formatter:on
|
||||||
|
|
||||||
|
assertChannel(component, Sensor.SENSOR_CHANNEL_ID, "zigbee2mqtt/sensor/state", "", "sensor1",
|
||||||
|
NumberValue.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNonNumericSensor() throws InterruptedException {
|
||||||
|
// @formatter:off
|
||||||
|
var component = discoverComponent(configTopicToMqtt(CONFIG_TOPIC),
|
||||||
|
"{ " +
|
||||||
|
" \"device\": { " +
|
||||||
|
" \"identifiers\": [ " +
|
||||||
|
" \"zigbee2mqtt_0x0000000000000000\" " +
|
||||||
|
" ], " +
|
||||||
|
" \"manufacturer\": \"Sensors inc\", " +
|
||||||
|
" \"model\": \"Sensor\", " +
|
||||||
|
" \"name\": \"Sensor\", " +
|
||||||
|
" \"sw_version\": \"Zigbee2MQTT 1.18.2\" " +
|
||||||
|
" }, " +
|
||||||
|
" \"name\": \"sensor1\", " +
|
||||||
|
" \"expire_after\": \"1\", " +
|
||||||
|
" \"force_update\": \"true\", " +
|
||||||
|
" \"state_topic\": \"zigbee2mqtt/sensor/state\", " +
|
||||||
|
" \"unique_id\": \"sn1\" " +
|
||||||
|
"}");
|
||||||
|
// @formatter:on
|
||||||
|
|
||||||
|
assertChannel(component, Sensor.SENSOR_CHANNEL_ID, "zigbee2mqtt/sensor/state", "", "sensor1", TextValue.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Set<String> getConfigTopics() {
|
protected Set<String> getConfigTopics() {
|
||||||
return Set.of(CONFIG_TOPIC);
|
return Set.of(CONFIG_TOPIC);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user