mirror of
https://github.com/home-assistant/core.git
synced 2025-07-09 14:27:07 +00:00
Add triggers for the Tag component (#39004)
This commit is contained in:
parent
3c876c4fe1
commit
1af6c04111
@ -13,15 +13,13 @@ from homeassistant.helpers.storage import Store
|
|||||||
from homeassistant.loader import bind_hass
|
from homeassistant.loader import bind_hass
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
from .const import DOMAIN
|
from .const import DEVICE_ID, DOMAIN, EVENT_TAG_SCANNED, TAG_ID
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
DEVICE_ID = "device_id"
|
|
||||||
EVENT_TAG_SCANNED = "tag_scanned"
|
|
||||||
LAST_SCANNED = "last_scanned"
|
LAST_SCANNED = "last_scanned"
|
||||||
STORAGE_KEY = DOMAIN
|
STORAGE_KEY = DOMAIN
|
||||||
STORAGE_VERSION = 1
|
STORAGE_VERSION = 1
|
||||||
TAG_ID = "tag_id"
|
|
||||||
TAGS = "tags"
|
TAGS = "tags"
|
||||||
|
|
||||||
CREATE_FIELDS = {
|
CREATE_FIELDS = {
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
"""Constants for the Tag integration."""
|
"""Constants for the Tag integration."""
|
||||||
|
|
||||||
|
DEVICE_ID = "device_id"
|
||||||
DOMAIN = "tag"
|
DOMAIN = "tag"
|
||||||
|
EVENT_TAG_SCANNED = "tag_scanned"
|
||||||
|
TAG_ID = "tag_id"
|
||||||
|
37
homeassistant/components/tag/trigger.py
Normal file
37
homeassistant/components/tag/trigger.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
"""Support for tag triggers."""
|
||||||
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from homeassistant.components.homeassistant.triggers import event as event_trigger
|
||||||
|
from homeassistant.const import CONF_PLATFORM
|
||||||
|
from homeassistant.helpers import config_validation as cv
|
||||||
|
|
||||||
|
from .const import DEVICE_ID, DOMAIN, EVENT_TAG_SCANNED, TAG_ID
|
||||||
|
|
||||||
|
TRIGGER_SCHEMA = vol.Schema(
|
||||||
|
{
|
||||||
|
vol.Required(CONF_PLATFORM): DOMAIN,
|
||||||
|
vol.Required(TAG_ID): cv.string,
|
||||||
|
vol.Optional(DEVICE_ID): cv.string,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def async_attach_trigger(hass, config, action, automation_info):
|
||||||
|
"""Listen for tag_scanned events based on configuration."""
|
||||||
|
tag_id = config.get(TAG_ID)
|
||||||
|
device_id = config.get(DEVICE_ID)
|
||||||
|
event_data = {TAG_ID: tag_id}
|
||||||
|
|
||||||
|
if device_id:
|
||||||
|
event_data[DEVICE_ID] = device_id
|
||||||
|
|
||||||
|
event_config = {
|
||||||
|
event_trigger.CONF_PLATFORM: "event",
|
||||||
|
event_trigger.CONF_EVENT_TYPE: EVENT_TAG_SCANNED,
|
||||||
|
event_trigger.CONF_EVENT_DATA: event_data,
|
||||||
|
}
|
||||||
|
event_config = event_trigger.TRIGGER_SCHEMA(event_config)
|
||||||
|
|
||||||
|
return await event_trigger.async_attach_trigger(
|
||||||
|
hass, event_config, action, automation_info, platform_type=DOMAIN
|
||||||
|
)
|
85
tests/components/tag/test_trigger.py
Normal file
85
tests/components/tag/test_trigger.py
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
"""Tests for tag triggers."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
import homeassistant.components.automation as automation
|
||||||
|
from homeassistant.components.tag import async_scan_tag
|
||||||
|
from homeassistant.components.tag.const import DOMAIN, TAG_ID
|
||||||
|
from homeassistant.setup import async_setup_component
|
||||||
|
|
||||||
|
from tests.common import async_mock_service
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def tag_setup(hass, hass_storage):
|
||||||
|
"""Tag setup."""
|
||||||
|
|
||||||
|
async def _storage(items=None):
|
||||||
|
if items is None:
|
||||||
|
hass_storage[DOMAIN] = {
|
||||||
|
"key": DOMAIN,
|
||||||
|
"version": 1,
|
||||||
|
"data": {"items": [{"id": "test tag"}]},
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
hass_storage[DOMAIN] = items
|
||||||
|
config = {DOMAIN: {}}
|
||||||
|
return await async_setup_component(hass, DOMAIN, config)
|
||||||
|
|
||||||
|
return _storage
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def calls(hass):
|
||||||
|
"""Track calls to a mock service."""
|
||||||
|
return async_mock_service(hass, "test", "automation")
|
||||||
|
|
||||||
|
|
||||||
|
async def test_triggers(hass, tag_setup, calls):
|
||||||
|
"""Test tag triggers."""
|
||||||
|
assert await tag_setup()
|
||||||
|
assert await async_setup_component(
|
||||||
|
hass,
|
||||||
|
automation.DOMAIN,
|
||||||
|
{
|
||||||
|
automation.DOMAIN: [
|
||||||
|
{
|
||||||
|
"trigger": {"platform": DOMAIN, TAG_ID: "abc123"},
|
||||||
|
"action": {
|
||||||
|
"service": "test.automation",
|
||||||
|
"data": {"message": "service called"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
await async_scan_tag(hass, "abc123", None)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert len(calls) == 1
|
||||||
|
assert calls[0].data["message"] == "service called"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_exception_bad_trigger(hass, calls, caplog):
|
||||||
|
"""Test for exception on event triggers firing."""
|
||||||
|
|
||||||
|
await async_setup_component(
|
||||||
|
hass,
|
||||||
|
automation.DOMAIN,
|
||||||
|
{
|
||||||
|
automation.DOMAIN: [
|
||||||
|
{
|
||||||
|
"trigger": {"trigger": {"platform": DOMAIN, "oops": "abc123"}},
|
||||||
|
"action": {
|
||||||
|
"service": "test.automation",
|
||||||
|
"data": {"message": "service called"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert "Invalid config for [automation]" in caplog.text
|
Loading…
x
Reference in New Issue
Block a user