Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for sending data to Datadog."""
2 
3 import logging
4 
5 from datadog import initialize, statsd
6 import voluptuous as vol
7 
8 from homeassistant.const import (
9  CONF_HOST,
10  CONF_PORT,
11  CONF_PREFIX,
12  EVENT_LOGBOOK_ENTRY,
13  EVENT_STATE_CHANGED,
14  STATE_UNKNOWN,
15 )
16 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers import state as state_helper
19 from homeassistant.helpers.typing import ConfigType
20 
21 _LOGGER = logging.getLogger(__name__)
22 
23 CONF_RATE = "rate"
24 DEFAULT_HOST = "localhost"
25 DEFAULT_PORT = 8125
26 DEFAULT_PREFIX = "hass"
27 DEFAULT_RATE = 1
28 DOMAIN = "datadog"
29 
30 CONFIG_SCHEMA = vol.Schema(
31  {
32  DOMAIN: vol.Schema(
33  {
34  vol.Required(CONF_HOST, default=DEFAULT_HOST): cv.string,
35  vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
36  vol.Optional(CONF_PREFIX, default=DEFAULT_PREFIX): cv.string,
37  vol.Optional(CONF_RATE, default=DEFAULT_RATE): vol.All(
38  vol.Coerce(int), vol.Range(min=1)
39  ),
40  }
41  )
42  },
43  extra=vol.ALLOW_EXTRA,
44 )
45 
46 
47 def setup(hass: HomeAssistant, config: ConfigType) -> bool:
48  """Set up the Datadog component."""
49 
50  conf = config[DOMAIN]
51  host = conf[CONF_HOST]
52  port = conf[CONF_PORT]
53  sample_rate = conf[CONF_RATE]
54  prefix = conf[CONF_PREFIX]
55 
56  initialize(statsd_host=host, statsd_port=port)
57 
58  def logbook_entry_listener(event):
59  """Listen for logbook entries and send them as events."""
60  name = event.data.get("name")
61  message = event.data.get("message")
62 
63  statsd.event(
64  title="Home Assistant",
65  text=f"%%% \n **{name}** {message} \n %%%",
66  tags=[
67  f"entity:{event.data.get('entity_id')}",
68  f"domain:{event.data.get('domain')}",
69  ],
70  )
71 
72  _LOGGER.debug("Sent event %s", event.data.get("entity_id"))
73 
74  def state_changed_listener(event):
75  """Listen for new messages on the bus and sends them to Datadog."""
76  state = event.data.get("new_state")
77 
78  if state is None or state.state == STATE_UNKNOWN:
79  return
80 
81  states = dict(state.attributes)
82  metric = f"{prefix}.{state.domain}"
83  tags = [f"entity:{state.entity_id}"]
84 
85  for key, value in states.items():
86  if isinstance(value, (float, int)):
87  attribute = f"{metric}.{key.replace(' ', '_')}"
88  value = int(value) if isinstance(value, bool) else value
89  statsd.gauge(attribute, value, sample_rate=sample_rate, tags=tags)
90 
91  _LOGGER.debug("Sent metric %s: %s (tags: %s)", attribute, value, tags)
92 
93  try:
94  value = state_helper.state_as_number(state)
95  except ValueError:
96  _LOGGER.debug("Error sending %s: %s (tags: %s)", metric, state.state, tags)
97  return
98 
99  statsd.gauge(metric, value, sample_rate=sample_rate, tags=tags)
100 
101  _LOGGER.debug("Sent metric %s: %s (tags: %s)", metric, value, tags)
102 
103  hass.bus.listen(EVENT_LOGBOOK_ENTRY, logbook_entry_listener)
104  hass.bus.listen(EVENT_STATE_CHANGED, state_changed_listener)
105 
106  return True
bool setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:47