Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Send instance and usage analytics."""
2 
3 from typing import Any
4 
5 import voluptuous as vol
6 
7 from homeassistant.components import websocket_api
8 from homeassistant.const import EVENT_HOMEASSISTANT_STARTED
9 from homeassistant.core import Event, HassJob, HomeAssistant, callback
11 from homeassistant.helpers.event import async_call_later, async_track_time_interval
12 from homeassistant.helpers.typing import ConfigType
13 from homeassistant.util.hass_dict import HassKey
14 
15 from .analytics import Analytics
16 from .const import ATTR_ONBOARDED, ATTR_PREFERENCES, DOMAIN, INTERVAL, PREFERENCE_SCHEMA
17 
18 CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)
19 
20 DATA_COMPONENT: HassKey[Analytics] = HassKey(DOMAIN)
21 
22 
23 async def async_setup(hass: HomeAssistant, _: ConfigType) -> bool:
24  """Set up the analytics integration."""
25  analytics = Analytics(hass)
26 
27  # Load stored data
28  await analytics.load()
29 
30  @callback
31  def start_schedule(_event: Event) -> None:
32  """Start the send schedule after the started event."""
33  # Wait 15 min after started
35  hass,
36  900,
37  HassJob(
38  analytics.send_analytics,
39  name="analytics schedule",
40  cancel_on_shutdown=True,
41  ),
42  )
43 
44  # Send every day
46  hass,
47  analytics.send_analytics,
48  INTERVAL,
49  name="analytics daily",
50  cancel_on_shutdown=True,
51  )
52 
53  hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STARTED, start_schedule)
54 
55  websocket_api.async_register_command(hass, websocket_analytics)
56  websocket_api.async_register_command(hass, websocket_analytics_preferences)
57 
58  hass.data[DATA_COMPONENT] = analytics
59  return True
60 
61 
62 @callback
63 @websocket_api.require_admin
64 @websocket_api.websocket_command({vol.Required("type"): "analytics"})
66  hass: HomeAssistant,
68  msg: dict[str, Any],
69 ) -> None:
70  """Return analytics preferences."""
71  analytics = hass.data[DATA_COMPONENT]
72  connection.send_result(
73  msg["id"],
74  {ATTR_PREFERENCES: analytics.preferences, ATTR_ONBOARDED: analytics.onboarded},
75  )
76 
77 
78 @websocket_api.require_admin
79 @websocket_api.websocket_command( { vol.Required("type"): "analytics/preferences",
80  vol.Required("preferences", default={}): PREFERENCE_SCHEMA,
81  }
82 )
83 @websocket_api.async_response
85  hass: HomeAssistant,
87  msg: dict[str, Any],
88 ) -> None:
89  """Update analytics preferences."""
90  preferences = msg[ATTR_PREFERENCES]
91  analytics = hass.data[DATA_COMPONENT]
92 
93  await analytics.save_preferences(preferences)
94  await analytics.send_analytics()
95 
96  connection.send_result(
97  msg["id"],
98  {ATTR_PREFERENCES: analytics.preferences},
99  )
100 
bool async_setup(HomeAssistant hass, ConfigType _)
Definition: __init__.py:23
None websocket_analytics(HomeAssistant hass, websocket_api.connection.ActiveConnection connection, dict[str, Any] msg)
Definition: __init__.py:69
None websocket_analytics_preferences(HomeAssistant hass, websocket_api.connection.ActiveConnection connection, dict[str, Any] msg)
Definition: __init__.py:90
CALLBACK_TYPE async_call_later(HomeAssistant hass, float|timedelta delay, HassJob[[datetime], Coroutine[Any, Any, None]|None]|Callable[[datetime], Coroutine[Any, Any, None]|None] action)
Definition: event.py:1597
CALLBACK_TYPE async_track_time_interval(HomeAssistant hass, Callable[[datetime], Coroutine[Any, Any, None]|None] action, timedelta interval, *str|None name=None, bool|None cancel_on_shutdown=None)
Definition: event.py:1679