From 96d9342f13377404f624cd140534757921d9ec8d Mon Sep 17 00:00:00 2001 From: Brett Adams Date: Fri, 24 May 2024 17:18:22 +1000 Subject: [PATCH] Add models to energy sites in Teslemetry (#117419) * Add models to energy sites and test devices * Fix device testing * Revert VIN * Fix snapshot * Fix snapshot * fix snap * Sort list --- .../components/teslemetry/__init__.py | 12 ++ .../teslemetry/fixtures/site_info.json | 40 +++++- .../snapshots/test_diagnostics.ambr | 40 +++++- .../teslemetry/snapshots/test_init.ambr | 121 ++++++++++++++++++ tests/components/teslemetry/test_init.py | 14 ++ 5 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 tests/components/teslemetry/snapshots/test_init.ambr diff --git a/homeassistant/components/teslemetry/__init__.py b/homeassistant/components/teslemetry/__init__.py index e33690266bb..9a1d3f5fef4 100644 --- a/homeassistant/components/teslemetry/__init__.py +++ b/homeassistant/components/teslemetry/__init__.py @@ -122,6 +122,18 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: ), ) + # Add energy device models + for energysite in energysites: + models = set() + for gateway in energysite.info_coordinator.data.get("components_gateways", []): + if gateway.get("part_name"): + models.add(gateway["part_name"]) + for battery in energysite.info_coordinator.data.get("components_batteries", []): + if battery.get("part_name"): + models.add(battery["part_name"]) + if models: + energysite.device["model"] = ", ".join(sorted(models)) + # Setup Platforms entry.runtime_data = TeslemetryData(vehicles, energysites, scopes) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) diff --git a/tests/components/teslemetry/fixtures/site_info.json b/tests/components/teslemetry/fixtures/site_info.json index d39fc1f68aa..80a9d25ebce 100644 --- a/tests/components/teslemetry/fixtures/site_info.json +++ b/tests/components/teslemetry/fixtures/site_info.json @@ -41,6 +41,44 @@ "battery_type": "ac_powerwall", "configurable": true, "grid_services_enabled": false, + "gateways": [ + { + "device_id": "gateway-id", + "din": "gateway-din", + "serial_number": "CN00000000J50D", + "part_number": "1152100-14-J", + "part_type": 10, + "part_name": "Tesla Backup Gateway 2", + "is_active": true, + "site_id": "1234-abcd", + "firmware_version": "24.4.0 0fe780c9", + "updated_datetime": "2024-05-14T00:00:00.000Z" + } + ], + "batteries": [ + { + "device_id": "battery-1-id", + "din": "battery-1-din", + "serial_number": "TG000000001DA5", + "part_number": "3012170-10-B", + "part_type": 2, + "part_name": "Powerwall 2", + "nameplate_max_charge_power": 5000, + "nameplate_max_discharge_power": 5000, + "nameplate_energy": 13500 + }, + { + "device_id": "battery-2-id", + "din": "battery-2-din", + "serial_number": "TG000000002DA5", + "part_number": "3012170-05-C", + "part_type": 2, + "part_name": "Powerwall 2", + "nameplate_max_charge_power": 5000, + "nameplate_max_discharge_power": 5000, + "nameplate_energy": 13500 + } + ], "wall_connectors": [ { "device_id": "123abc", @@ -59,7 +97,7 @@ "system_alerts_enabled": true }, "version": "23.44.0 eb113390", - "battery_count": 3, + "battery_count": 2, "tou_settings": { "optimization_strategy": "economics", "schedule": [ diff --git a/tests/components/teslemetry/snapshots/test_diagnostics.ambr b/tests/components/teslemetry/snapshots/test_diagnostics.ambr index 64fff7198d6..41d7ea69f4f 100644 --- a/tests/components/teslemetry/snapshots/test_diagnostics.ambr +++ b/tests/components/teslemetry/snapshots/test_diagnostics.ambr @@ -5,9 +5,33 @@ dict({ 'info': dict({ 'backup_reserve_percent': 0, - 'battery_count': 3, + 'battery_count': 2, 'components_backup': True, 'components_backup_time_remaining_enabled': True, + 'components_batteries': list([ + dict({ + 'device_id': 'battery-1-id', + 'din': 'battery-1-din', + 'nameplate_energy': 13500, + 'nameplate_max_charge_power': 5000, + 'nameplate_max_discharge_power': 5000, + 'part_name': 'Powerwall 2', + 'part_number': '3012170-10-B', + 'part_type': 2, + 'serial_number': 'TG000000001DA5', + }), + dict({ + 'device_id': 'battery-2-id', + 'din': 'battery-2-din', + 'nameplate_energy': 13500, + 'nameplate_max_charge_power': 5000, + 'nameplate_max_discharge_power': 5000, + 'part_name': 'Powerwall 2', + 'part_number': '3012170-05-C', + 'part_type': 2, + 'serial_number': 'TG000000002DA5', + }), + ]), 'components_battery': True, 'components_battery_solar_offset_view_enabled': True, 'components_battery_type': 'ac_powerwall', @@ -20,6 +44,20 @@ 'components_energy_value_subheader': 'Estimated Value', 'components_flex_energy_request_capable': False, 'components_gateway': 'teg', + 'components_gateways': list([ + dict({ + 'device_id': 'gateway-id', + 'din': 'gateway-din', + 'firmware_version': '24.4.0 0fe780c9', + 'is_active': True, + 'part_name': 'Tesla Backup Gateway 2', + 'part_number': '1152100-14-J', + 'part_type': 10, + 'serial_number': 'CN00000000J50D', + 'site_id': '1234-abcd', + 'updated_datetime': '2024-05-14T00:00:00.000Z', + }), + ]), 'components_grid': True, 'components_grid_services_enabled': False, 'components_load_meter': True, diff --git a/tests/components/teslemetry/snapshots/test_init.ambr b/tests/components/teslemetry/snapshots/test_init.ambr new file mode 100644 index 00000000000..cf1f9cd539c --- /dev/null +++ b/tests/components/teslemetry/snapshots/test_init.ambr @@ -0,0 +1,121 @@ +# serializer version: 1 +# name: test_devices[{('teslemetry', '123456')}] + DeviceRegistryEntrySnapshot({ + 'area_id': None, + 'config_entries': , + 'configuration_url': 'https://teslemetry.com/console', + 'connections': set({ + }), + 'disabled_by': None, + 'entry_type': None, + 'hw_version': None, + 'id': , + 'identifiers': set({ + tuple( + 'teslemetry', + '123456', + ), + }), + 'is_new': False, + 'labels': set({ + }), + 'manufacturer': 'Tesla', + 'model': 'Powerwall 2, Tesla Backup Gateway 2', + 'name': 'Energy Site', + 'name_by_user': None, + 'serial_number': None, + 'suggested_area': None, + 'sw_version': None, + 'via_device_id': None, + }) +# --- +# name: test_devices[{('teslemetry', 'VINVINVIN')}] + DeviceRegistryEntrySnapshot({ + 'area_id': None, + 'config_entries': , + 'configuration_url': 'https://teslemetry.com/console', + 'connections': set({ + }), + 'disabled_by': None, + 'entry_type': None, + 'hw_version': None, + 'id': , + 'identifiers': set({ + tuple( + 'teslemetry', + 'VINVINVIN', + ), + }), + 'is_new': False, + 'labels': set({ + }), + 'manufacturer': 'Tesla', + 'model': None, + 'name': 'Test', + 'name_by_user': None, + 'serial_number': 'VINVINVIN', + 'suggested_area': None, + 'sw_version': None, + 'via_device_id': None, + }) +# --- +# name: test_devices[{('teslemetry', 'abd-123')}] + DeviceRegistryEntrySnapshot({ + 'area_id': None, + 'config_entries': , + 'configuration_url': 'https://teslemetry.com/console', + 'connections': set({ + }), + 'disabled_by': None, + 'entry_type': None, + 'hw_version': None, + 'id': , + 'identifiers': set({ + tuple( + 'teslemetry', + 'abd-123', + ), + }), + 'is_new': False, + 'labels': set({ + }), + 'manufacturer': 'Tesla', + 'model': None, + 'name': 'Wall Connector', + 'name_by_user': None, + 'serial_number': '123', + 'suggested_area': None, + 'sw_version': None, + 'via_device_id': , + }) +# --- +# name: test_devices[{('teslemetry', 'bcd-234')}] + DeviceRegistryEntrySnapshot({ + 'area_id': None, + 'config_entries': , + 'configuration_url': 'https://teslemetry.com/console', + 'connections': set({ + }), + 'disabled_by': None, + 'entry_type': None, + 'hw_version': None, + 'id': , + 'identifiers': set({ + tuple( + 'teslemetry', + 'bcd-234', + ), + }), + 'is_new': False, + 'labels': set({ + }), + 'manufacturer': 'Tesla', + 'model': None, + 'name': 'Wall Connector', + 'name_by_user': None, + 'serial_number': '234', + 'suggested_area': None, + 'sw_version': None, + 'via_device_id': , + }) +# --- diff --git a/tests/components/teslemetry/test_init.py b/tests/components/teslemetry/test_init.py index c9daccfa6db..10670c952d7 100644 --- a/tests/components/teslemetry/test_init.py +++ b/tests/components/teslemetry/test_init.py @@ -2,6 +2,7 @@ from freezegun.api import FrozenDateTimeFactory import pytest +from syrupy import SnapshotAssertion from tesla_fleet_api.exceptions import ( InvalidToken, SubscriptionRequired, @@ -14,6 +15,7 @@ from homeassistant.components.teslemetry.models import TeslemetryData from homeassistant.config_entries import ConfigEntryState from homeassistant.const import Platform from homeassistant.core import HomeAssistant +from homeassistant.helpers import device_registry as dr from . import setup_platform @@ -49,6 +51,18 @@ async def test_init_error( assert entry.state is state +# Test devices +async def test_devices( + hass: HomeAssistant, device_registry: dr.DeviceRegistry, snapshot: SnapshotAssertion +) -> None: + """Test device registry.""" + entry = await setup_platform(hass) + devices = dr.async_entries_for_config_entry(device_registry, entry.entry_id) + + for device in devices: + assert device == snapshot(name=f"{device.identifiers}") + + # Vehicle Coordinator async def test_vehicle_refresh_offline( hass: HomeAssistant, mock_vehicle_data, freezer: FrozenDateTimeFactory