From 8d5e82438f0a2e0b86a87165fbe3e313a4c2a40d Mon Sep 17 00:00:00 2001 From: ludeeus Date: Thu, 9 Feb 2023 09:17:15 +0000 Subject: [PATCH 1/5] Add recorder to analytics --- homeassistant/components/analytics/analytics.py | 11 +++++++++++ homeassistant/components/analytics/const.py | 2 ++ 2 files changed, 13 insertions(+) diff --git a/homeassistant/components/analytics/analytics.py b/homeassistant/components/analytics/analytics.py index 178faf7cccaf4c..f69167468b5c4f 100644 --- a/homeassistant/components/analytics/analytics.py +++ b/homeassistant/components/analytics/analytics.py @@ -17,6 +17,10 @@ DOMAIN as ENERGY_DOMAIN, is_configured as energy_is_configured, ) +from homeassistant.components.recorder import ( + DOMAIN as RECORDER_DOMAIN, + get_instance as get_recorder_instance, +) from homeassistant.const import ATTR_DOMAIN, __version__ as HA_VERSION from homeassistant.core import HomeAssistant from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -40,11 +44,13 @@ ATTR_CUSTOM_INTEGRATIONS, ATTR_DIAGNOSTICS, ATTR_ENERGY, + ATTR_ENGINE, ATTR_HEALTHY, ATTR_INTEGRATION_COUNT, ATTR_INTEGRATIONS, ATTR_OPERATING_SYSTEM, ATTR_PROTECTED, + ATTR_RECORDER, ATTR_SLUG, ATTR_STATE_COUNT, ATTR_STATISTICS, @@ -252,6 +258,11 @@ async def send_analytics(self, _: datetime | None = None) -> None: ATTR_CONFIGURED: await energy_is_configured(self.hass) } + if RECORDER_DOMAIN in integrations: + instance = get_recorder_instance(self.hass) + if dialect_name := instance.dialect_name: + payload[ATTR_RECORDER] = {ATTR_ENGINE: dialect_name.value} + if self.preferences.get(ATTR_STATISTICS, False): payload[ATTR_STATE_COUNT] = len(self.hass.states.async_all()) payload[ATTR_AUTOMATION_COUNT] = len( diff --git a/homeassistant/components/analytics/const.py b/homeassistant/components/analytics/const.py index 63fdf820923db1..fd253c32f9337b 100644 --- a/homeassistant/components/analytics/const.py +++ b/homeassistant/components/analytics/const.py @@ -26,6 +26,7 @@ ATTR_CUSTOM_INTEGRATIONS = "custom_integrations" ATTR_DIAGNOSTICS = "diagnostics" ATTR_ENERGY = "energy" +ATTR_ENGINE = "engine" ATTR_HEALTHY = "healthy" ATTR_INSTALLATION_TYPE = "installation_type" ATTR_INTEGRATION_COUNT = "integration_count" @@ -34,6 +35,7 @@ ATTR_OPERATING_SYSTEM = "operating_system" ATTR_PREFERENCES = "preferences" ATTR_PROTECTED = "protected" +ATTR_RECORDER = "recorder" ATTR_SLUG = "slug" ATTR_STATE_COUNT = "state_count" ATTR_STATISTICS = "statistics" From 7f0fbd830783d2a5a55d17dfc56aca5c3c7c039d Mon Sep 17 00:00:00 2001 From: ludeeus Date: Thu, 9 Feb 2023 12:17:02 +0000 Subject: [PATCH 2/5] Add test --- tests/components/analytics/test_analytics.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/components/analytics/test_analytics.py b/tests/components/analytics/test_analytics.py index 5c1e6cbffc7464..69666adc68ceed 100644 --- a/tests/components/analytics/test_analytics.py +++ b/tests/components/analytics/test_analytics.py @@ -517,3 +517,22 @@ async def test_send_usage_with_certificate(hass, caplog, aioclient_mock): await analytics.send_analytics() assert "'certificate': True" in caplog.text + + +async def test_send_with_recorder( + recorder_mock: AsyncMock, + hass: HomeAssistant, + aioclient_mock: AiohttpClientMocker, +) -> None: + """Test recorder information.""" + aioclient_mock.post(ANALYTICS_ENDPOINT_URL, status=200) + analytics = Analytics(hass) + hass.http = Mock(ssl_certificate="/some/path/to/cert.pem") + + await analytics.save_preferences({ATTR_BASE: True, ATTR_USAGE: True}) + + with patch("homeassistant.components.analytics.analytics.HA_VERSION", MOCK_VERSION): + await analytics.send_analytics() + + postdata = aioclient_mock.mock_calls[-1][2] + assert postdata["recorder"]["engine"] == "sqlite" From c19a4247f2963953a90e5e3070781499804c58e3 Mon Sep 17 00:00:00 2001 From: ludeeus Date: Thu, 9 Feb 2023 14:14:29 +0000 Subject: [PATCH 3/5] Add recorder to after_dependencies --- homeassistant/components/analytics/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/analytics/manifest.json b/homeassistant/components/analytics/manifest.json index b14647680a4dc1..955c4a813f40c3 100644 --- a/homeassistant/components/analytics/manifest.json +++ b/homeassistant/components/analytics/manifest.json @@ -1,7 +1,7 @@ { "domain": "analytics", "name": "Analytics", - "after_dependencies": ["energy"], + "after_dependencies": ["energy", "recorder"], "codeowners": ["@home-assistant/core", "@ludeeus"], "dependencies": ["api", "websocket_api"], "documentation": "https://www.home-assistant.io/integrations/analytics", From ef4c65dfc1a995ab84c9721ac6eca709b34d8ec7 Mon Sep 17 00:00:00 2001 From: ludeeus Date: Mon, 13 Feb 2023 07:51:32 +0000 Subject: [PATCH 4/5] Add version --- homeassistant/components/analytics/analytics.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/analytics/analytics.py b/homeassistant/components/analytics/analytics.py index f69167468b5c4f..66acddaef8dd5b 100644 --- a/homeassistant/components/analytics/analytics.py +++ b/homeassistant/components/analytics/analytics.py @@ -260,8 +260,12 @@ async def send_analytics(self, _: datetime | None = None) -> None: if RECORDER_DOMAIN in integrations: instance = get_recorder_instance(self.hass) - if dialect_name := instance.dialect_name: - payload[ATTR_RECORDER] = {ATTR_ENGINE: dialect_name.value} + engine = instance.database_engine + if engine and engine.dialect is not None and engine.version is not None: + payload[ATTR_RECORDER] = { + ATTR_ENGINE: engine.dialect.value, + ATTR_VERSION: engine.version, + } if self.preferences.get(ATTR_STATISTICS, False): payload[ATTR_STATE_COUNT] = len(self.hass.states.async_all()) From b464cb9822d94db1743b0ad05831731add8f4e5d Mon Sep 17 00:00:00 2001 From: ludeeus Date: Mon, 13 Feb 2023 07:53:13 +0000 Subject: [PATCH 5/5] dialect can not be None --- homeassistant/components/analytics/analytics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/analytics/analytics.py b/homeassistant/components/analytics/analytics.py index 66acddaef8dd5b..9419f00e41e394 100644 --- a/homeassistant/components/analytics/analytics.py +++ b/homeassistant/components/analytics/analytics.py @@ -261,7 +261,7 @@ async def send_analytics(self, _: datetime | None = None) -> None: if RECORDER_DOMAIN in integrations: instance = get_recorder_instance(self.hass) engine = instance.database_engine - if engine and engine.dialect is not None and engine.version is not None: + if engine and engine.version is not None: payload[ATTR_RECORDER] = { ATTR_ENGINE: engine.dialect.value, ATTR_VERSION: engine.version,