mirror of
https://github.com/home-assistant/core.git
synced 2025-07-22 04:37:06 +00:00
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
This commit is contained in:
parent
cb59eb183d
commit
96d9342f13
@ -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
|
# Setup Platforms
|
||||||
entry.runtime_data = TeslemetryData(vehicles, energysites, scopes)
|
entry.runtime_data = TeslemetryData(vehicles, energysites, scopes)
|
||||||
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
||||||
|
@ -41,6 +41,44 @@
|
|||||||
"battery_type": "ac_powerwall",
|
"battery_type": "ac_powerwall",
|
||||||
"configurable": true,
|
"configurable": true,
|
||||||
"grid_services_enabled": false,
|
"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": [
|
"wall_connectors": [
|
||||||
{
|
{
|
||||||
"device_id": "123abc",
|
"device_id": "123abc",
|
||||||
@ -59,7 +97,7 @@
|
|||||||
"system_alerts_enabled": true
|
"system_alerts_enabled": true
|
||||||
},
|
},
|
||||||
"version": "23.44.0 eb113390",
|
"version": "23.44.0 eb113390",
|
||||||
"battery_count": 3,
|
"battery_count": 2,
|
||||||
"tou_settings": {
|
"tou_settings": {
|
||||||
"optimization_strategy": "economics",
|
"optimization_strategy": "economics",
|
||||||
"schedule": [
|
"schedule": [
|
||||||
|
@ -5,9 +5,33 @@
|
|||||||
dict({
|
dict({
|
||||||
'info': dict({
|
'info': dict({
|
||||||
'backup_reserve_percent': 0,
|
'backup_reserve_percent': 0,
|
||||||
'battery_count': 3,
|
'battery_count': 2,
|
||||||
'components_backup': True,
|
'components_backup': True,
|
||||||
'components_backup_time_remaining_enabled': 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': True,
|
||||||
'components_battery_solar_offset_view_enabled': True,
|
'components_battery_solar_offset_view_enabled': True,
|
||||||
'components_battery_type': 'ac_powerwall',
|
'components_battery_type': 'ac_powerwall',
|
||||||
@ -20,6 +44,20 @@
|
|||||||
'components_energy_value_subheader': 'Estimated Value',
|
'components_energy_value_subheader': 'Estimated Value',
|
||||||
'components_flex_energy_request_capable': False,
|
'components_flex_energy_request_capable': False,
|
||||||
'components_gateway': 'teg',
|
'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': True,
|
||||||
'components_grid_services_enabled': False,
|
'components_grid_services_enabled': False,
|
||||||
'components_load_meter': True,
|
'components_load_meter': True,
|
||||||
|
121
tests/components/teslemetry/snapshots/test_init.ambr
Normal file
121
tests/components/teslemetry/snapshots/test_init.ambr
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
# serializer version: 1
|
||||||
|
# name: test_devices[{('teslemetry', '123456')}]
|
||||||
|
DeviceRegistryEntrySnapshot({
|
||||||
|
'area_id': None,
|
||||||
|
'config_entries': <ANY>,
|
||||||
|
'configuration_url': 'https://teslemetry.com/console',
|
||||||
|
'connections': set({
|
||||||
|
}),
|
||||||
|
'disabled_by': None,
|
||||||
|
'entry_type': None,
|
||||||
|
'hw_version': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'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': <ANY>,
|
||||||
|
'configuration_url': 'https://teslemetry.com/console',
|
||||||
|
'connections': set({
|
||||||
|
}),
|
||||||
|
'disabled_by': None,
|
||||||
|
'entry_type': None,
|
||||||
|
'hw_version': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'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': <ANY>,
|
||||||
|
'configuration_url': 'https://teslemetry.com/console',
|
||||||
|
'connections': set({
|
||||||
|
}),
|
||||||
|
'disabled_by': None,
|
||||||
|
'entry_type': None,
|
||||||
|
'hw_version': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'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': <ANY>,
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_devices[{('teslemetry', 'bcd-234')}]
|
||||||
|
DeviceRegistryEntrySnapshot({
|
||||||
|
'area_id': None,
|
||||||
|
'config_entries': <ANY>,
|
||||||
|
'configuration_url': 'https://teslemetry.com/console',
|
||||||
|
'connections': set({
|
||||||
|
}),
|
||||||
|
'disabled_by': None,
|
||||||
|
'entry_type': None,
|
||||||
|
'hw_version': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'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': <ANY>,
|
||||||
|
})
|
||||||
|
# ---
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
from freezegun.api import FrozenDateTimeFactory
|
from freezegun.api import FrozenDateTimeFactory
|
||||||
import pytest
|
import pytest
|
||||||
|
from syrupy import SnapshotAssertion
|
||||||
from tesla_fleet_api.exceptions import (
|
from tesla_fleet_api.exceptions import (
|
||||||
InvalidToken,
|
InvalidToken,
|
||||||
SubscriptionRequired,
|
SubscriptionRequired,
|
||||||
@ -14,6 +15,7 @@ from homeassistant.components.teslemetry.models import TeslemetryData
|
|||||||
from homeassistant.config_entries import ConfigEntryState
|
from homeassistant.config_entries import ConfigEntryState
|
||||||
from homeassistant.const import Platform
|
from homeassistant.const import Platform
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.helpers import device_registry as dr
|
||||||
|
|
||||||
from . import setup_platform
|
from . import setup_platform
|
||||||
|
|
||||||
@ -49,6 +51,18 @@ async def test_init_error(
|
|||||||
assert entry.state is state
|
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
|
# Vehicle Coordinator
|
||||||
async def test_vehicle_refresh_offline(
|
async def test_vehicle_refresh_offline(
|
||||||
hass: HomeAssistant, mock_vehicle_data, freezer: FrozenDateTimeFactory
|
hass: HomeAssistant, mock_vehicle_data, freezer: FrozenDateTimeFactory
|
||||||
|
Loading…
x
Reference in New Issue
Block a user