Only generate device trigger for sensor with unit (#27152)

This commit is contained in:
Erik Montnemery 2019-10-03 22:30:59 +02:00 committed by Paulus Schoutsen
parent cda7692f24
commit 89ebc17fb1
3 changed files with 33 additions and 4 deletions

View file

@ -5,6 +5,7 @@ import homeassistant.components.automation.numeric_state as numeric_state_automa
from homeassistant.components.device_automation import TRIGGER_BASE_SCHEMA from homeassistant.components.device_automation import TRIGGER_BASE_SCHEMA
from homeassistant.const import ( from homeassistant.const import (
ATTR_DEVICE_CLASS, ATTR_DEVICE_CLASS,
ATTR_UNIT_OF_MEASUREMENT,
CONF_ABOVE, CONF_ABOVE,
CONF_BELOW, CONF_BELOW,
CONF_ENTITY_ID, CONF_ENTITY_ID,
@ -113,8 +114,14 @@ async def async_get_triggers(hass, device_id):
for entry in entries: for entry in entries:
device_class = DEVICE_CLASS_NONE device_class = DEVICE_CLASS_NONE
state = hass.states.get(entry.entity_id) state = hass.states.get(entry.entity_id)
if state: unit_of_measurement = (
device_class = state.attributes.get(ATTR_DEVICE_CLASS) state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) if state else None
)
if not state or not unit_of_measurement:
continue
device_class = state.attributes.get(ATTR_DEVICE_CLASS)
templates = ENTITY_TRIGGERS.get( templates = ENTITY_TRIGGERS.get(
device_class, ENTITY_TRIGGERS[DEVICE_CLASS_NONE] device_class, ENTITY_TRIGGERS[DEVICE_CLASS_NONE]

View file

@ -2,7 +2,7 @@
from datetime import timedelta from datetime import timedelta
import pytest import pytest
from homeassistant.components.sensor import DOMAIN, DEVICE_CLASSES from homeassistant.components.sensor import DOMAIN
from homeassistant.components.sensor.device_trigger import ENTITY_TRIGGERS from homeassistant.components.sensor.device_trigger import ENTITY_TRIGGERS
from homeassistant.const import STATE_UNKNOWN, CONF_PLATFORM from homeassistant.const import STATE_UNKNOWN, CONF_PLATFORM
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -19,6 +19,7 @@ from tests.common import (
async_get_device_automations, async_get_device_automations,
async_get_device_automation_capabilities, async_get_device_automation_capabilities,
) )
from tests.testing_config.custom_components.test.sensor import DEVICE_CLASSES
@pytest.fixture @pytest.fixture
@ -70,6 +71,7 @@ async def test_get_triggers(hass, device_reg, entity_reg):
} }
for device_class in DEVICE_CLASSES for device_class in DEVICE_CLASSES
for trigger in ENTITY_TRIGGERS[device_class] for trigger in ENTITY_TRIGGERS[device_class]
if device_class != "none"
] ]
triggers = await async_get_device_automations(hass, "trigger", device_entry.id) triggers = await async_get_device_automations(hass, "trigger", device_entry.id)
assert triggers == expected_triggers assert triggers == expected_triggers

View file

@ -3,10 +3,24 @@ Provide a mock sensor platform.
Call init before using it in your tests to ensure clean test data. Call init before using it in your tests to ensure clean test data.
""" """
from homeassistant.components.sensor import DEVICE_CLASSES import homeassistant.components.sensor as sensor
from tests.common import MockEntity from tests.common import MockEntity
DEVICE_CLASSES = list(sensor.DEVICE_CLASSES)
DEVICE_CLASSES.append("none")
UNITS_OF_MEASUREMENT = {
sensor.DEVICE_CLASS_BATTERY: "%", # % of battery that is left
sensor.DEVICE_CLASS_HUMIDITY: "%", # % of humidity in the air
sensor.DEVICE_CLASS_ILLUMINANCE: "lm", # current light level (lx/lm)
sensor.DEVICE_CLASS_SIGNAL_STRENGTH: "dB", # signal strength (dB/dBm)
sensor.DEVICE_CLASS_TEMPERATURE: "C", # temperature (C/F)
sensor.DEVICE_CLASS_TIMESTAMP: "hh:mm:ss", # timestamp (ISO8601)
sensor.DEVICE_CLASS_PRESSURE: "hPa", # pressure (hPa/mbar)
sensor.DEVICE_CLASS_POWER: "kW", # power (W/kW)
}
ENTITIES = {} ENTITIES = {}
@ -22,6 +36,7 @@ def init(empty=False):
name=f"{device_class} sensor", name=f"{device_class} sensor",
unique_id=f"unique_{device_class}", unique_id=f"unique_{device_class}",
device_class=device_class, device_class=device_class,
unit_of_measurement=UNITS_OF_MEASUREMENT.get(device_class),
) )
for device_class in DEVICE_CLASSES for device_class in DEVICE_CLASSES
} }
@ -42,3 +57,8 @@ class MockSensor(MockEntity):
def device_class(self): def device_class(self):
"""Return the class of this sensor.""" """Return the class of this sensor."""
return self._handle("device_class") return self._handle("device_class")
@property
def unit_of_measurement(self):
"""Return the unit_of_measurement of this sensor."""
return self._handle("unit_of_measurement")