Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support to send data to a Splunk instance."""
2 
3 from http import HTTPStatus
4 import json
5 import logging
6 import time
7 
8 from aiohttp import ClientConnectionError, ClientResponseError
9 from hass_splunk import SplunkPayloadError, hass_splunk
10 import voluptuous as vol
11 
12 from homeassistant.const import (
13  CONF_HOST,
14  CONF_NAME,
15  CONF_PORT,
16  CONF_SSL,
17  CONF_TOKEN,
18  CONF_VERIFY_SSL,
19  EVENT_STATE_CHANGED,
20 )
21 from homeassistant.core import HomeAssistant
22 from homeassistant.helpers import state as state_helper
23 from homeassistant.helpers.aiohttp_client import async_get_clientsession
25 from homeassistant.helpers.entityfilter import FILTER_SCHEMA
26 from homeassistant.helpers.json import JSONEncoder
27 from homeassistant.helpers.typing import ConfigType
28 
29 _LOGGER = logging.getLogger(__name__)
30 
31 DOMAIN = "splunk"
32 CONF_FILTER = "filter"
33 
34 DEFAULT_HOST = "localhost"
35 DEFAULT_PORT = 8088
36 DEFAULT_SSL = False
37 DEFAULT_NAME = "HASS"
38 
39 CONFIG_SCHEMA = vol.Schema(
40  {
41  DOMAIN: vol.Schema(
42  {
43  vol.Required(CONF_TOKEN): cv.string,
44  vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
45  vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
46  vol.Optional(CONF_SSL, default=False): cv.boolean,
47  vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean,
48  vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
49  vol.Optional(CONF_FILTER, default={}): FILTER_SCHEMA,
50  }
51  )
52  },
53  extra=vol.ALLOW_EXTRA,
54 )
55 
56 
57 async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
58  """Set up the Splunk component."""
59  conf = config[DOMAIN]
60  host = conf.get(CONF_HOST)
61  port = conf.get(CONF_PORT)
62  token = conf.get(CONF_TOKEN)
63  use_ssl = conf[CONF_SSL]
64  verify_ssl = conf.get(CONF_VERIFY_SSL)
65  name = conf.get(CONF_NAME)
66  entity_filter = conf[CONF_FILTER]
67 
68  event_collector = hass_splunk(
69  session=async_get_clientsession(hass),
70  host=host,
71  port=port,
72  token=token,
73  use_ssl=use_ssl,
74  verify_ssl=verify_ssl,
75  )
76 
77  if not await event_collector.check(connectivity=False, token=True, busy=False):
78  return False
79 
80  payload = {
81  "time": time.time(),
82  "host": name,
83  "event": {
84  "domain": DOMAIN,
85  "meta": "Splunk integration has started",
86  },
87  }
88 
89  await event_collector.queue(json.dumps(payload, cls=JSONEncoder), send=False)
90 
91  async def splunk_event_listener(event):
92  """Listen for new messages on the bus and sends them to Splunk."""
93 
94  state = event.data.get("new_state")
95  if state is None or not entity_filter(state.entity_id):
96  return
97 
98  try:
99  _state = state_helper.state_as_number(state)
100  except ValueError:
101  _state = state.state
102 
103  payload = {
104  "time": event.time_fired.timestamp(),
105  "host": name,
106  "event": {
107  "domain": state.domain,
108  "entity_id": state.object_id,
109  "attributes": dict(state.attributes),
110  "value": _state,
111  },
112  }
113 
114  try:
115  await event_collector.queue(json.dumps(payload, cls=JSONEncoder), send=True)
116  except SplunkPayloadError as err:
117  if err.status == HTTPStatus.UNAUTHORIZED:
118  _LOGGER.error(err)
119  else:
120  _LOGGER.warning(err)
121  except ClientConnectionError as err:
122  _LOGGER.warning(err)
123  except TimeoutError:
124  _LOGGER.warning("Connection to %s:%s timed out", host, port)
125  except ClientResponseError as err:
126  _LOGGER.error(err.message)
127 
128  hass.bus.async_listen(EVENT_STATE_CHANGED, splunk_event_listener)
129 
130  return True
bool async_setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:57
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)