mirror of
https://github.com/cyberjunky/home-assistant-garmin_connect.git
synced 2026-01-08 20:38:00 -05:00
More improvements
This commit is contained in:
60
custom_components/garmin_connect/icons.json
Normal file
60
custom_components/garmin_connect/icons.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,8 +28,8 @@ rules:
|
|||||||
dynamic-devices: exempt # Single cloud account, not device-based
|
dynamic-devices: exempt # Single cloud account, not device-based
|
||||||
discovery: exempt # Cloud service, not discoverable
|
discovery: exempt # Cloud service, not discoverable
|
||||||
diagnostics: done
|
diagnostics: done
|
||||||
exception-translations: todo
|
exception-translations: done
|
||||||
icon-translations: todo
|
icon-translations: done
|
||||||
stale-devices: exempt # Single device per config entry
|
stale-devices: exempt # Single device per config entry
|
||||||
|
|
||||||
# Platinum tier
|
# Platinum tier
|
||||||
|
|||||||
@@ -48,12 +48,18 @@ def _get_coordinator(hass: HomeAssistant):
|
|||||||
"""Get the first available coordinator from config entries."""
|
"""Get the first available coordinator from config entries."""
|
||||||
entries = hass.config_entries.async_entries(DOMAIN)
|
entries = hass.config_entries.async_entries(DOMAIN)
|
||||||
if not entries:
|
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
|
# Use the first config entry's coordinator
|
||||||
entry = entries[0]
|
entry = entries[0]
|
||||||
if not hasattr(entry, "runtime_data") or entry.runtime_data is None:
|
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
|
return entry.runtime_data
|
||||||
|
|
||||||
@@ -81,7 +87,8 @@ async def async_setup_services(hass: HomeAssistant) -> None:
|
|||||||
|
|
||||||
if not await coordinator.async_login():
|
if not await coordinator.async_login():
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
"Failed to login to Garmin Connect, unable to update"
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="login_failed",
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -103,7 +110,9 @@ async def async_setup_services(hass: HomeAssistant) -> None:
|
|||||||
)
|
)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
raise HomeAssistantError(
|
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
|
) from err
|
||||||
|
|
||||||
async def handle_add_blood_pressure(call: ServiceCall) -> None:
|
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():
|
if not await coordinator.async_login():
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
"Failed to login to Garmin Connect, unable to update"
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="login_failed",
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -132,7 +142,9 @@ async def async_setup_services(hass: HomeAssistant) -> None:
|
|||||||
)
|
)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
raise HomeAssistantError(
|
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
|
) from err
|
||||||
|
|
||||||
# Register services
|
# Register services
|
||||||
|
|||||||
@@ -33,5 +33,25 @@
|
|||||||
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
|
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
|
||||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
"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"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user