|
18 | 18 | from homeassistant.helpers.typing import HomeAssistantType, ConfigType |
19 | 19 | from homeassistant.const import (CONF_HOST, CONF_PORT, EVENT_CALL_SERVICE, |
20 | 20 | EVENT_HOMEASSISTANT_STOP, |
21 | | - EVENT_STATE_CHANGED, EVENT_SERVICE_REGISTERED) |
| 21 | + EVENT_STATE_CHANGED, EVENT_SERVICE_REGISTERED, CONF_EXCLUDE, CONF_ENTITIES, |
| 22 | + CONF_DOMAINS, CONF_INCLUDE) |
22 | 23 | from homeassistant.config import DATA_CUSTOMIZE |
23 | 24 | from homeassistant.helpers.aiohttp_client import async_get_clientsession |
24 | 25 | import homeassistant.helpers.config_validation as cv |
|
46 | 47 | vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, |
47 | 48 | vol.Exclusive(CONF_ACCESS_TOKEN, 'auth'): cv.string, |
48 | 49 | vol.Exclusive(CONF_API_PASSWORD, 'auth'): cv.string, |
| 50 | + vol.Optional(CONF_EXCLUDE, default={}): vol.Schema( |
| 51 | + { |
| 52 | + vol.Optional(CONF_ENTITIES, default=[]): cv.entity_ids, |
| 53 | + vol.Optional(CONF_DOMAINS, default=[]): vol.All( |
| 54 | + cv.ensure_list, [cv.string] |
| 55 | + ), |
| 56 | + } |
| 57 | + ), |
| 58 | + vol.Optional(CONF_INCLUDE, default={}): vol.Schema( |
| 59 | + { |
| 60 | + vol.Optional(CONF_ENTITIES, default=[]): cv.entity_ids, |
| 61 | + vol.Optional(CONF_DOMAINS, default=[]): vol.All( |
| 62 | + cv.ensure_list, [cv.string] |
| 63 | + ), |
| 64 | + } |
| 65 | + ), |
49 | 66 | vol.Optional(CONF_SUBSCRIBE_EVENTS, |
50 | 67 | default=DEFAULT_SUBSCRIBED_EVENTS): cv.ensure_list, |
51 | 68 | vol.Optional(CONF_ENTITY_PREFIX, default=DEFAULT_ENTITY_PREFIX): cv.string, |
@@ -82,6 +99,16 @@ def __init__(self, hass, conf): |
82 | 99 | self._verify_ssl = conf.get(CONF_VERIFY_SSL) |
83 | 100 | self._access_token = conf.get(CONF_ACCESS_TOKEN) |
84 | 101 | self._password = conf.get(CONF_API_PASSWORD) |
| 102 | + |
| 103 | + # see homeassistant/components/influxdb/__init__.py |
| 104 | + # for include/exclude logic |
| 105 | + include = conf.get(CONF_INCLUDE, {}) |
| 106 | + exclude = conf.get(CONF_EXCLUDE, {}) |
| 107 | + self._whitelist_e = set(include.get(CONF_ENTITIES, [])) |
| 108 | + self._whitelist_d = set(include.get(CONF_DOMAINS, [])) |
| 109 | + self._blacklist_e = set(exclude.get(CONF_ENTITIES, [])) |
| 110 | + self._blacklist_d = set(exclude.get(CONF_DOMAINS, [])) |
| 111 | + |
85 | 112 | self._subscribe_events = conf.get(CONF_SUBSCRIBE_EVENTS) |
86 | 113 | self._entity_prefix = conf.get(CONF_ENTITY_PREFIX) |
87 | 114 |
|
@@ -269,8 +296,22 @@ def _remove_prefix(entity_id): |
269 | 296 |
|
270 | 297 | def state_changed(entity_id, state, attr): |
271 | 298 | """Publish remote state change on local instance.""" |
| 299 | + domain, object_id = split_entity_id(entity_id) |
| 300 | + |
| 301 | + if ( |
| 302 | + entity_id in self._blacklist_e |
| 303 | + or domain in self._blacklist_d |
| 304 | + ): |
| 305 | + return |
| 306 | + |
| 307 | + if ( |
| 308 | + (self._whitelist_e or self._whitelist_d) |
| 309 | + and entity_id not in self._whitelist_e |
| 310 | + and domain not in self._whitelist_d |
| 311 | + ): |
| 312 | + return |
| 313 | + |
272 | 314 | if self._entity_prefix: |
273 | | - domain, object_id = split_entity_id(entity_id) |
274 | 315 | object_id = self._entity_prefix + object_id |
275 | 316 | entity_id = domain + '.' + object_id |
276 | 317 |
|
|
0 commit comments