diff --git a/custom_components/garmin_connect/icons.json b/custom_components/garmin_connect/icons.json new file mode 100644 index 0000000..e358e69 --- /dev/null +++ b/custom_components/garmin_connect/icons.json @@ -0,0 +1,60 @@ +{ + "entity": { + "sensor": { + "steps": { + "default": "mdi:shoe-print" + }, + "daily_step_goal": { + "default": "mdi:flag-checkered" + }, + "yesterday_steps": { + "default": "mdi:shoe-print" + }, + "weekly_step_average": { + "default": "mdi:chart-line" + }, + "floors_ascended": { + "default": "mdi:stairs-up" + }, + "floors_descended": { + "default": "mdi:stairs-down" + }, + "floors_goal": { + "default": "mdi:flag-checkered" + }, + "total_calories": { + "default": "mdi:food" + }, + "active_calories": { + "default": "mdi:fire" + }, + "resting_heart_rate": { + "default": "mdi:heart-pulse" + }, + "max_heart_rate": { + "default": "mdi:heart-flash" + }, + "min_heart_rate": { + "default": "mdi:heart-minus" + }, + "stress_level": { + "default": "mdi:head-snowflake" + }, + "body_battery": { + "default": "mdi:battery-heart" + }, + "sleep_duration": { + "default": "mdi:sleep" + }, + "weight": { + "default": "mdi:scale-bathroom" + }, + "bmi": { + "default": "mdi:human" + }, + "device_last_synced": { + "default": "mdi:sync" + } + } + } +} \ No newline at end of file diff --git a/custom_components/garmin_connect/quality_scale.yaml b/custom_components/garmin_connect/quality_scale.yaml index 7e81367..4689045 100644 --- a/custom_components/garmin_connect/quality_scale.yaml +++ b/custom_components/garmin_connect/quality_scale.yaml @@ -28,8 +28,8 @@ rules: dynamic-devices: exempt # Single cloud account, not device-based discovery: exempt # Cloud service, not discoverable diagnostics: done - exception-translations: todo - icon-translations: todo + exception-translations: done + icon-translations: done stale-devices: exempt # Single device per config entry # Platinum tier diff --git a/custom_components/garmin_connect/services.py b/custom_components/garmin_connect/services.py index 9096943..e3e30e6 100644 --- a/custom_components/garmin_connect/services.py +++ b/custom_components/garmin_connect/services.py @@ -48,12 +48,18 @@ def _get_coordinator(hass: HomeAssistant): """Get the first available coordinator from config entries.""" entries = hass.config_entries.async_entries(DOMAIN) if not entries: - raise HomeAssistantError("No Garmin Connect integration configured") + raise HomeAssistantError( + translation_domain=DOMAIN, + translation_key="no_integration_configured", + ) # Use the first config entry's coordinator entry = entries[0] if not hasattr(entry, "runtime_data") or entry.runtime_data is None: - raise HomeAssistantError("Garmin Connect integration not fully loaded") + raise HomeAssistantError( + translation_domain=DOMAIN, + translation_key="integration_not_loaded", + ) return entry.runtime_data @@ -81,7 +87,8 @@ async def async_setup_services(hass: HomeAssistant) -> None: if not await coordinator.async_login(): raise HomeAssistantError( - "Failed to login to Garmin Connect, unable to update" + translation_domain=DOMAIN, + translation_key="login_failed", ) try: @@ -103,7 +110,9 @@ async def async_setup_services(hass: HomeAssistant) -> None: ) except Exception as err: raise HomeAssistantError( - f"Failed to add body composition: {err}" + translation_domain=DOMAIN, + translation_key="add_body_composition_failed", + translation_placeholders={"error": str(err)}, ) from err async def handle_add_blood_pressure(call: ServiceCall) -> None: @@ -118,7 +127,8 @@ async def async_setup_services(hass: HomeAssistant) -> None: if not await coordinator.async_login(): raise HomeAssistantError( - "Failed to login to Garmin Connect, unable to update" + translation_domain=DOMAIN, + translation_key="login_failed", ) try: @@ -132,7 +142,9 @@ async def async_setup_services(hass: HomeAssistant) -> None: ) except Exception as err: raise HomeAssistantError( - f"Failed to add blood pressure: {err}" + translation_domain=DOMAIN, + translation_key="add_blood_pressure_failed", + translation_placeholders={"error": str(err)}, ) from err # Register services diff --git a/custom_components/garmin_connect/strings.json b/custom_components/garmin_connect/strings.json index fbb4543..034ed0f 100644 --- a/custom_components/garmin_connect/strings.json +++ b/custom_components/garmin_connect/strings.json @@ -33,5 +33,25 @@ "already_configured": "[%key:common::config_flow::abort::already_configured_account%]", "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" } + }, + "exceptions": { + "login_failed": { + "message": "Failed to login to Garmin Connect, unable to update" + }, + "add_body_composition_failed": { + "message": "Failed to add body composition: {error}" + }, + "add_blood_pressure_failed": { + "message": "Failed to add blood pressure: {error}" + }, + "set_active_gear_failed": { + "message": "Failed to set active gear: {error}" + }, + "no_integration_configured": { + "message": "No Garmin Connect integration configured" + }, + "integration_not_loaded": { + "message": "Garmin Connect integration not fully loaded" + } } } \ No newline at end of file