diff --git a/docs/integration_quality_scale_index.md b/docs/integration_quality_scale_index.md new file mode 100644 index 00000000..1cefb0f6 --- /dev/null +++ b/docs/integration_quality_scale_index.md @@ -0,0 +1,49 @@ +--- +title: "Integration Quality Scale" +sidebar_label: "Introduction" +--- + +The Integration Quality Scale scores each integration based on the code quality and user experience. Each level of the quality scale consists of a list of requirements. If an integration matches all requirements, it's considered to have reached that level. + +> Suggestions for changes can be done by creating an issue in the [architecture repo](https://github.com/home-assistant/architecture/issues/). + +# No score + +This integration passes the bare minimum requirements to become part of the index. + + - Satisfy all requirements for [creating components](creating_component_code_review.md) and [creating platforms](creating_platform_code_review.md). + - Configurable via `configuration.yaml` + +# Silver 🥈 + +This integration is able to cope when things go wrong. It will not print any exceptions nor will it fill the log with retry attempts. + +- Set an appropriate `SCAN_INTERVAL` (if a polling integration) +- Raise `PlatformNotReady` if unable to connect during platform setup (if appropriate) +- Handles expiration of auth credentials. Refresh if possible or print correct error and fail setup. If based on a config entry, should trigger a new config entry flow to re-authorize. +- Handles internet unavailable. Log a warning once when unavailable, log once when reconnected. +- Handles device/service unavailable. Log a warning once when unavailable, log once when reconnected. +- Set `available` property to `False` if appropriate ([docs](entity_index.md#generic-properties)) +- Entities have unique ID (if available) ([docs](entity_registry_index.md#unique-id-requirements)) + +# Gold 🥇 + +This is a solid integration that is able to survive poor conditions and can be configured via the user interface. + +- Configurable via config entries. + - Don't allow configuring already configured device/service (example: no 2 entries for same hub) + - Tests for the config flow + - Discoverable (if available) +- Entities have device info (if available) ([docs](device_registry_index.md#defining-devices)) +- States are translated in the frontend (sensors only, [docs](internationalization_index.md)) +- Tests for reading data from/controlling the integration ([docs](development_testing.md)) +- Has a code owner + +# Platinum 🏆 + +Best of the best. The integration is completely async, meaning it's super fast. Integrations that reach platinum level will require approval by the code owner for each PR. + +- Set appropriate `PARALLEL_UPDATES` constant +- Support config entry unloading (called when config entry is removed) +- Integration + dependency are async +- Uses aiohttp and allows passing in websession (if making HTTP requests) diff --git a/website/i18n/en.json b/website/i18n/en.json index 2f4a41da..8bd8276a 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -4,153 +4,857 @@ "next": "Next", "previous": "Previous", "tagline": "All you need to start developing for Home Assistant", - "architecture_components": "Components Architecture", - "Components": "Components", - "architecture_entities": "Entity Architecture", - "Entity": "Entity", - "architecture_hassio": "Hass.io Architecture", - "Hass.io": "Hass.io", - "architecture_index": "Architecture", - "Introduction": "Introduction", - "asyncio_101": "Asyncio 101", - "asyncio_categorizing_functions": "Categorizing Functions", - "asyncio_index": "Asynchronous Programming", - "asyncio_working_with_async": "Working with Async", - "auth_api": "Authentication API", - "API": "API", - "auth_auth_module": "Multi-factor Authentication Modules", - "auth_auth_provider": "Authentication Providers", - "auth_index": "Authentication", - "config_entries_config_flow_handler": "Config Flow Handlers", - "config_entries_index": "Config Entries", - "configuration_yaml_index": "Configuration.yaml", - "creating_component_code_review": "Checklist for creating a component", - "creating_component_deps_and_reqs": "Requirements & Dependencies", - "creating_component_discovery": "Component Discovery", - "creating_component_events": "Handling events", - "creating_component_generic_discovery": "Generic Platform Discovery", - "creating_component_index": "Creating components", - "creating_component_loading": "Loading your components", - "creating_component_states": "Handling states", - "creating_platform_code_review": "Checklist for creating a platform", - "creating_platform_example_light": "Example light platform", - "creating_platform_example_sensor": "Example sensor platform", - "creating_platform_index": "Adding support for a new platform", - "data_entry_flow_index": "Data Entry Flow", - "dev_101_config": "Using Config", - "dev_101_events": "Using Events", - "dev_101_hass": "Hass object", - "dev_101_index": "Development 101", - "dev_101_services": "Using Services", - "dev_101_states": "Using States", - "development_catching_up": "Catching up with Reality", - "development_checklist": "Development Checklist", - "development_environment": "Set up Development Environment", - "development_guidelines": "Style guidelines", - "development_index": "Starting with Development", - "development_submitting": "Submit your work", - "development_testing": "Testing your code", - "development_typing": "Adding type hints to your code", - "development_validation": "Validate the input", - "device_registry_index": "Device Registry", - "documentation_create_page": "Create a new page", - "documentation_index": "Documentation", - "documentation_standards": "Standards", - "entity_alarm_control_panel": "Alarm Control Panel Entity", - "Alarm Control Panel": "Alarm Control Panel", - "entity_binary_sensor": "Binary Sensor Entity", - "Binary Sensor": "Binary Sensor", - "entity_climate": "Climate Entity", - "Climate": "Climate", - "entity_cover": "Cover Entity", - "Cover": "Cover", - "entity_fan": "Fan Entity", - "Fan": "Fan", - "entity_index": "Entity", - "entity_light": "Light Entity", - "Light": "Light", - "entity_lock": "Lock Entity", - "Lock": "Lock", - "entity_media_player": "Media Player Entity", - "Media Player": "Media Player", - "entity_registry_index": "Entity Registry", - "entity_remote": "Remote Entity", - "Remote": "Remote", - "entity_sensor": "Sensor Entity", - "Sensor": "Sensor", - "entity_switch": "Switch Entity", - "Switch": "Switch", - "entity_vacuum": "Vacuum Entity", - "Vacuum": "Vacuum", - "entity_weather": "Weather Entity", - "Weather": "Weather", - "external_api_rest": "REST API", - "external_api_server_sent_events": "Server-sent events", - "external_api_websocket": "WebSocket API", - "frontend_add_card": "Adding state card", - "frontend_add_more_info": "Adding more info dialogs", - "frontend_add_websocket_api": "Extending the WebSocket API", - "frontend_architecture": "Home Assistant Frontend Architecture", - "Architecture": "Architecture", - "frontend_creating_custom_panels": "Creating custom panels", - "frontend_creating_custom_ui": "Creating custom UI", - "frontend_data": "Frontend data", - "Data": "Data", - "frontend_development": "Frontend development", - "Development": "Development", - "frontend_external_auth": "External Authentication", - "frontend_index": "Home Assistant Frontend", - "hassio_addon_communication": "Add-On Communication", - "hassio_addon_config": "Add-On Configuration", - "hassio_addon_index": "Developing an add-on", - "hassio_addon_presentation": "Presenting your add-on", - "hassio_addon_publishing": "Publishing your add-on", - "hassio_addon_repository": "Create an add-on repository", - "hassio_addon_security": "Add-on security", - "hassio_addon_testing": "Local add-on testing", - "hassio_addon_tutorial": "Tutorial: Making your first add-on", - "hassio_debugging": "Debugging Hass.io", - "hassio_hass": "Hass.io <> Home Assistant integration development", - "HASS Integration development": "HASS Integration development", - "intent_builtin": "Built-in intents", - "intent_conversation": "Registering sentences", - "intent_firing": "Firing intents", - "intent_handling": "Handling intents", - "intent_index": "Intents", - "internationalization_backend_localization": "Backend Localization", - "internationalization_custom_component_localization": "Custom Component Localization", - "internationalization_index": "Internationalization", - "internationalization_translation": "Translation", - "lovelace_custom_card": "Lovelace: Custom Cards", - "lovelace_index": "Lovelace UI", - "maintenance": "Maintenance", - "misc": "Miscellaneous", - "releasing": "Releasing", - "Frontend": "Frontend", - "Backend": "Backend", - "Misc": "Misc", - "Blog": "Blog", - "Entities": "Entities", - "Authentication": "Authentication", - "Configuration.yaml": "Configuration.yaml", - "Config Entries": "Config Entries", - "Data Entry Flow": "Data Entry Flow", - "Entity Registry": "Entity Registry", - "Device Registry": "Device Registry", - "Extending the frontend": "Extending the frontend", - "Custom UI": "Custom UI", - "Developing a feature": "Developing a feature", - "Development 101": "Development 101", - "Creating Platforms": "Creating Platforms", - "Creating Components": "Creating Components", - "External API": "External API", - "Internationalization": "Internationalization", - "Documentation": "Documentation", - "Intents": "Intents", - "asyncio": "asyncio", - "Hass.io Add-Ons": "Hass.io Add-Ons", - "Maintainer docs": "Maintainer docs", - "Lovelace UI": "Lovelace UI" + "docs": { + "architecture_components": { + "title": "Components Architecture", + "sidebar_label": "Components" + }, + "architecture_entities": { + "title": "Entity Architecture", + "sidebar_label": "Entity" + }, + "architecture_hassio": { + "title": "Hass.io Architecture", + "sidebar_label": "Hass.io" + }, + "architecture_index": { + "title": "Architecture", + "sidebar_label": "Introduction" + }, + "asyncio_101": { + "title": "Asyncio 101" + }, + "asyncio_categorizing_functions": { + "title": "Categorizing Functions" + }, + "asyncio_index": { + "title": "Asynchronous Programming", + "sidebar_label": "Introduction" + }, + "asyncio_working_with_async": { + "title": "Working with Async" + }, + "auth_api": { + "title": "Authentication API", + "sidebar_label": "API" + }, + "auth_auth_module": { + "title": "Multi-factor Authentication Modules" + }, + "auth_auth_provider": { + "title": "Authentication Providers" + }, + "auth_index": { + "title": "Authentication", + "sidebar_label": "Introduction" + }, + "config_entries_config_flow_handler": { + "title": "Config Flow Handlers" + }, + "config_entries_index": { + "title": "Config Entries", + "sidebar_label": "Introduction" + }, + "configuration_yaml_index": { + "title": "Configuration.yaml", + "sidebar_label": "Introduction" + }, + "creating_component_code_review": { + "title": "Checklist for creating a component" + }, + "creating_component_deps_and_reqs": { + "title": "Requirements & Dependencies" + }, + "creating_component_discovery": { + "title": "Component Discovery" + }, + "creating_component_events": { + "title": "Handling events" + }, + "creating_component_generic_discovery": { + "title": "Generic Platform Discovery" + }, + "creating_component_index": { + "title": "Creating components", + "sidebar_label": "Introduction" + }, + "creating_component_loading": { + "title": "Loading your components" + }, + "creating_component_states": { + "title": "Handling states" + }, + "creating_platform_code_review": { + "title": "Checklist for creating a platform" + }, + "creating_platform_example_light": { + "title": "Example light platform" + }, + "creating_platform_example_sensor": { + "title": "Example sensor platform" + }, + "creating_platform_index": { + "title": "Adding support for a new platform", + "sidebar_label": "Introduction" + }, + "data_entry_flow_index": { + "title": "Data Entry Flow", + "sidebar_label": "Introduction" + }, + "dev_101_config": { + "title": "Using Config" + }, + "dev_101_events": { + "title": "Using Events" + }, + "dev_101_hass": { + "title": "Hass object" + }, + "dev_101_index": { + "title": "Development 101", + "sidebar_label": "Introduction" + }, + "dev_101_services": { + "title": "Using Services" + }, + "dev_101_states": { + "title": "Using States" + }, + "development_catching_up": { + "title": "Catching up with Reality" + }, + "development_checklist": { + "title": "Development Checklist" + }, + "development_environment": { + "title": "Set up Development Environment" + }, + "development_guidelines": { + "title": "Style guidelines" + }, + "development_index": { + "title": "Starting with Development", + "sidebar_label": "Introduction" + }, + "development_submitting": { + "title": "Submit your work" + }, + "development_testing": { + "title": "Testing your code" + }, + "development_typing": { + "title": "Adding type hints to your code" + }, + "development_validation": { + "title": "Validate the input" + }, + "device_registry_index": { + "title": "Device Registry", + "sidebar_label": "Introduction" + }, + "documentation_create_page": { + "title": "Create a new page" + }, + "documentation_index": { + "title": "Documentation" + }, + "documentation_standards": { + "title": "Standards" + }, + "entity_alarm_control_panel": { + "title": "Alarm Control Panel Entity", + "sidebar_label": "Alarm Control Panel" + }, + "entity_binary_sensor": { + "title": "Binary Sensor Entity", + "sidebar_label": "Binary Sensor" + }, + "entity_climate": { + "title": "Climate Entity", + "sidebar_label": "Climate" + }, + "entity_cover": { + "title": "Cover Entity", + "sidebar_label": "Cover" + }, + "entity_fan": { + "title": "Fan Entity", + "sidebar_label": "Fan" + }, + "entity_index": { + "title": "Entity", + "sidebar_label": "Introduction" + }, + "entity_light": { + "title": "Light Entity", + "sidebar_label": "Light" + }, + "entity_lock": { + "title": "Lock Entity", + "sidebar_label": "Lock" + }, + "entity_media_player": { + "title": "Media Player Entity", + "sidebar_label": "Media Player" + }, + "entity_registry_index": { + "title": "Entity Registry", + "sidebar_label": "Introduction" + }, + "entity_remote": { + "title": "Remote Entity", + "sidebar_label": "Remote" + }, + "entity_sensor": { + "title": "Sensor Entity", + "sidebar_label": "Sensor" + }, + "entity_switch": { + "title": "Switch Entity", + "sidebar_label": "Switch" + }, + "entity_vacuum": { + "title": "Vacuum Entity", + "sidebar_label": "Vacuum" + }, + "entity_weather": { + "title": "Weather Entity", + "sidebar_label": "Weather" + }, + "external_api_rest": { + "title": "REST API" + }, + "external_api_server_sent_events": { + "title": "Server-sent events" + }, + "external_api_websocket": { + "title": "WebSocket API" + }, + "frontend_add_card": { + "title": "Adding state card" + }, + "frontend_add_more_info": { + "title": "Adding more info dialogs" + }, + "frontend_add_websocket_api": { + "title": "Extending the WebSocket API" + }, + "frontend_architecture": { + "title": "Home Assistant Frontend Architecture", + "sidebar_label": "Architecture" + }, + "frontend_creating_custom_panels": { + "title": "Creating custom panels" + }, + "frontend_creating_custom_ui": { + "title": "Creating custom UI" + }, + "frontend_data": { + "title": "Frontend data", + "sidebar_label": "Data" + }, + "frontend_development": { + "title": "Frontend development", + "sidebar_label": "Development" + }, + "frontend_external_auth": { + "title": "External Authentication" + }, + "frontend_index": { + "title": "Home Assistant Frontend", + "sidebar_label": "Introduction" + }, + "hassio_addon_communication": { + "title": "Add-On Communication" + }, + "hassio_addon_config": { + "title": "Add-On Configuration" + }, + "hassio_addon_index": { + "title": "Developing an add-on", + "sidebar_label": "Introduction" + }, + "hassio_addon_presentation": { + "title": "Presenting your add-on" + }, + "hassio_addon_publishing": { + "title": "Publishing your add-on" + }, + "hassio_addon_repository": { + "title": "Create an add-on repository" + }, + "hassio_addon_security": { + "title": "Add-on security" + }, + "hassio_addon_testing": { + "title": "Local add-on testing" + }, + "hassio_addon_tutorial": { + "title": "Tutorial: Making your first add-on" + }, + "hassio_debugging": { + "title": "Debugging Hass.io" + }, + "hassio_hass": { + "title": "Hass.io <> Home Assistant integration development", + "sidebar_label": "HASS Integration development" + }, + "integration_quality_scale_index": { + "title": "Integration Quality Scale", + "sidebar_label": "Introduction" + }, + "intent_builtin": { + "title": "Built-in intents" + }, + "intent_conversation": { + "title": "Registering sentences" + }, + "intent_firing": { + "title": "Firing intents" + }, + "intent_handling": { + "title": "Handling intents" + }, + "intent_index": { + "title": "Intents", + "sidebar_label": "Introduction" + }, + "internationalization_backend_localization": { + "title": "Backend Localization" + }, + "internationalization_custom_component_localization": { + "title": "Custom Component Localization" + }, + "internationalization_index": { + "title": "Internationalization" + }, + "internationalization_translation": { + "title": "Translation" + }, + "lovelace_custom_card": { + "title": "Lovelace: Custom Cards" + }, + "lovelace_index": { + "title": "Lovelace UI", + "sidebar_label": "Introduction" + }, + "maintenance": { + "title": "Maintenance" + }, + "misc": { + "title": "Miscellaneous" + }, + "releasing": { + "title": "Releasing" + }, + "version-0.72-architecture_components": { + "title": "Components Architecture", + "sidebar_label": "Components" + }, + "version-0.72-architecture_entities": { + "title": "Entity Architecture", + "sidebar_label": "Entity" + }, + "version-0.72-architecture_hassio": { + "title": "Hass.io Architecture", + "sidebar_label": "Hass.io" + }, + "version-0.72-architecture_index": { + "title": "Architecture", + "sidebar_label": "Introduction" + }, + "version-0.72-asyncio_101": { + "title": "Asyncio 101" + }, + "version-0.72-asyncio_categorizing_functions": { + "title": "Categorizing Functions" + }, + "version-0.72-asyncio_index": { + "title": "Asynchronous Programming", + "sidebar_label": "Introduction" + }, + "version-0.72-asyncio_working_with_async": { + "title": "Working with Async" + }, + "version-0.72-auth_api": { + "title": "Authentication API", + "sidebar_label": "API" + }, + "version-0.72-auth_auth_provider": { + "title": "Authentication Providers" + }, + "version-0.72-auth_index": { + "title": "Authentication", + "sidebar_label": "Introduction" + }, + "version-0.72-config_entries_config_flow_handler": { + "title": "Config Flow Handlers" + }, + "version-0.72-config_entries_index": { + "title": "Config Entries", + "sidebar_label": "Introduction" + }, + "version-0.72-configuration_yaml_index": { + "title": "Configuration.yaml", + "sidebar_label": "Introduction" + }, + "version-0.72-creating_component_code_review": { + "title": "Checklist for creating a component" + }, + "version-0.72-creating_component_deps_and_reqs": { + "title": "Requirements & Dependencies" + }, + "version-0.72-creating_component_discovery": { + "title": "Component Discovery" + }, + "version-0.72-creating_component_events": { + "title": "Handling events" + }, + "version-0.72-creating_component_generic_discovery": { + "title": "Generic Platform Discovery" + }, + "version-0.72-creating_component_index": { + "title": "Creating components", + "sidebar_label": "Introduction" + }, + "version-0.72-creating_component_loading": { + "title": "Loading your components" + }, + "version-0.72-creating_component_states": { + "title": "Handling states" + }, + "version-0.72-creating_platform_code_review": { + "title": "Checklist for creating a platform" + }, + "version-0.72-creating_platform_example_light": { + "title": "Example light platform" + }, + "version-0.72-creating_platform_example_sensor": { + "title": "Example sensor platform" + }, + "version-0.72-creating_platform_index": { + "title": "Adding support for a new platform", + "sidebar_label": "Introduction" + }, + "version-0.72-data_entry_flow_index": { + "title": "Data Entry Flow", + "sidebar_label": "Introduction" + }, + "version-0.72-dev_101_config": { + "title": "Using Config" + }, + "version-0.72-dev_101_events": { + "title": "Using Events" + }, + "version-0.72-dev_101_hass": { + "title": "Hass object" + }, + "version-0.72-dev_101_index": { + "title": "Development 101", + "sidebar_label": "Introduction" + }, + "version-0.72-dev_101_services": { + "title": "Using Services" + }, + "version-0.72-dev_101_states": { + "title": "Using States" + }, + "version-0.72-development_catching_up": { + "title": "Catching up with Reality" + }, + "version-0.72-development_checklist": { + "title": "Development Checklist" + }, + "version-0.72-development_environment": { + "title": "Set up Development Environment" + }, + "version-0.72-development_guidelines": { + "title": "Style guidelines" + }, + "version-0.72-development_index": { + "title": "Starting with Development", + "sidebar_label": "Introduction" + }, + "version-0.72-development_submitting": { + "title": "Submit your work" + }, + "version-0.72-development_testing": { + "title": "Testing your code" + }, + "version-0.72-development_typing": { + "title": "Adding type hints to your code" + }, + "version-0.72-development_validation": { + "title": "Validate the input" + }, + "version-0.72-entity_alarm_control_panel": { + "title": "Alarm Control Panel Entity", + "sidebar_label": "Alarm Control Panel" + }, + "version-0.72-entity_binary_sensor": { + "title": "Binary Sensor Entity", + "sidebar_label": "Binary Sensor" + }, + "version-0.72-entity_climate": { + "title": "Climate Entity", + "sidebar_label": "Climate" + }, + "version-0.72-entity_cover": { + "title": "Cover Entity", + "sidebar_label": "Cover" + }, + "version-0.72-entity_fan": { + "title": "Fan Entity", + "sidebar_label": "Fan" + }, + "version-0.72-entity_index": { + "title": "Entity", + "sidebar_label": "Introduction" + }, + "version-0.72-entity_light": { + "title": "Light Entity", + "sidebar_label": "Light" + }, + "version-0.72-entity_lock": { + "title": "Lock Entity", + "sidebar_label": "Lock" + }, + "version-0.72-entity_media_player": { + "title": "Media Player Entity", + "sidebar_label": "Media Player" + }, + "version-0.72-entity_registry_index": { + "title": "Entity Registry", + "sidebar_label": "Introduction" + }, + "version-0.72-entity_remote": { + "title": "Remote Entity", + "sidebar_label": "Remote" + }, + "version-0.72-entity_sensor": { + "title": "Sensor Entity", + "sidebar_label": "Sensor" + }, + "version-0.72-entity_switch": { + "title": "Switch Entity", + "sidebar_label": "Switch" + }, + "version-0.72-entity_vacuum": { + "title": "Vacuum Entity", + "sidebar_label": "Vacuum" + }, + "version-0.72-entity_weather": { + "title": "Weather Entity", + "sidebar_label": "Weather" + }, + "version-0.72-external_api_rest_python": { + "title": "REST API - Python bindings" + }, + "version-0.72-external_api_rest": { + "title": "REST API" + }, + "version-0.72-external_api_server_sent_events": { + "title": "Server-sent events" + }, + "version-0.72-external_api_websocket": { + "title": "WebSocket API" + }, + "version-0.72-frontend_add_card": { + "title": "Adding state card" + }, + "version-0.72-frontend_add_more_info": { + "title": "Adding more info dialogs" + }, + "version-0.72-frontend_add_websocket_api": { + "title": "Extending the WebSocket API" + }, + "version-0.72-frontend_architecture": { + "title": "Home Assistant Frontend Architecture", + "sidebar_label": "Architecture" + }, + "version-0.72-frontend_creating_custom_panels": { + "title": "Creating custom panels" + }, + "version-0.72-frontend_creating_custom_ui": { + "title": "Creating custom UI" + }, + "version-0.72-frontend_development": { + "title": "Frontend development", + "sidebar_label": "Development" + }, + "version-0.72-frontend_index": { + "title": "Home Assistant Frontend", + "sidebar_label": "Introduction" + }, + "version-0.72-hassio_addon_communication": { + "title": "Add-On Communication" + }, + "version-0.72-hassio_addon_config": { + "title": "Add-On Configuration" + }, + "version-0.72-hassio_addon_index": { + "title": "Developing an add-on", + "sidebar_label": "Introduction" + }, + "version-0.72-hassio_addon_presentation": { + "title": "Presenting your add-on" + }, + "version-0.72-hassio_addon_publishing": { + "title": "Publishing your add-on" + }, + "version-0.72-hassio_addon_repository": { + "title": "Create an add-on repository" + }, + "version-0.72-hassio_addon_testing": { + "title": "Local add-on testing" + }, + "version-0.72-hassio_addon_tutorial": { + "title": "Tutorial: Making your first add-on" + }, + "version-0.72-hassio_debugging": { + "title": "Debugging Hass.io" + }, + "version-0.72-hassio_hass": { + "title": "Hass.io <> Home Assistant integration development", + "sidebar_label": "HASS Integration development" + }, + "version-0.72-intent_builtin": { + "title": "Built-in intents" + }, + "version-0.72-intent_conversation": { + "title": "Registering sentences" + }, + "version-0.72-intent_firing": { + "title": "Firing intents" + }, + "version-0.72-intent_handling": { + "title": "Handling intents" + }, + "version-0.72-intent_index": { + "title": "Intents", + "sidebar_label": "Introduction" + }, + "version-0.72-internationalization_backend_localization": { + "title": "Backend Localization" + }, + "version-0.72-internationalization_custom_component_localization": { + "title": "Custom Component Localization" + }, + "version-0.72-internationalization_index": { + "title": "Internationalization" + }, + "version-0.72-internationalization_translation": { + "title": "Translation" + }, + "version-0.72-lovelace_card_types": { + "title": "Type Of Cards", + "sidebar_label": "Cards" + }, + "version-0.72-lovelace_custom_card": { + "title": "Custom Cards" + }, + "version-0.72-lovelace_index": { + "title": "Lovelace UI", + "sidebar_label": "Introduction" + }, + "version-0.72-maintenance": { + "title": "Maintenance" + }, + "version-0.72-misc": { + "title": "Miscellaneous" + }, + "version-0.72-releasing": { + "title": "Releasing" + }, + "version-0.73.0-auth_api": { + "title": "Authentication API", + "sidebar_label": "API" + }, + "version-0.73.0-development_guidelines": { + "title": "Style guidelines" + }, + "version-0.73.0-documentation_create_page": { + "title": "Create a new page" + }, + "version-0.73.0-documentation_index": { + "title": "Documentation" + }, + "version-0.73.0-documentation_standards": { + "title": "Standards" + }, + "version-0.73.0-frontend_development": { + "title": "Frontend development", + "sidebar_label": "Development" + }, + "version-0.73.0-hassio_addon_config": { + "title": "Add-On Configuration" + }, + "version-0.73.0-lovelace_custom_card": { + "title": "Custom Cards" + }, + "version-0.73.0-lovelace_index": { + "title": "Lovelace UI", + "sidebar_label": "Introduction" + }, + "version-0.74.0-asyncio_working_with_async": { + "title": "Working with Async" + }, + "version-0.74.0-auth_api": { + "title": "Authentication API", + "sidebar_label": "API" + }, + "version-0.74.0-entity_media_player": { + "title": "Media Player Entity", + "sidebar_label": "Media Player" + }, + "version-0.74.0-entity_vacuum": { + "title": "Vacuum Entity", + "sidebar_label": "Vacuum" + }, + "version-0.74.0-hassio_addon_tutorial": { + "title": "Tutorial: Making your first add-on" + }, + "version-0.74.0-internationalization_index": { + "title": "Internationalization" + }, + "version-0.74.0-lovelace_custom_card": { + "title": "Lovelace: Custom Cards" + }, + "version-0.76.0-auth_api": { + "title": "Authentication API", + "sidebar_label": "API" + }, + "version-0.76.0-auth_auth_provider": { + "title": "Authentication Providers" + }, + "version-0.76.0-development_environment": { + "title": "Set up Development Environment" + }, + "version-0.76.0-documentation_create_page": { + "title": "Create a new page" + }, + "version-0.76.0-documentation_standards": { + "title": "Standards" + }, + "version-0.76.0-frontend_creating_custom_panels": { + "title": "Creating custom panels" + }, + "version-0.76.0-frontend_data": { + "title": "Frontend data", + "sidebar_label": "Data" + }, + "version-0.76.0-hassio_addon_config": { + "title": "Add-On Configuration" + }, + "version-0.76.0-hassio_debugging": { + "title": "Debugging Hass.io" + }, + "version-0.77.0-auth_api": { + "title": "Authentication API", + "sidebar_label": "API" + }, + "version-0.77.0-auth_auth_module": { + "title": "Multi-factor Authentication Modules" + }, + "version-0.77.0-auth_auth_provider": { + "title": "Authentication Providers" + }, + "version-0.77.0-auth_index": { + "title": "Authentication", + "sidebar_label": "Introduction" + }, + "version-0.77.0-config_entries_config_flow_handler": { + "title": "Config Flow Handlers" + }, + "version-0.77.0-data_entry_flow_index": { + "title": "Data Entry Flow", + "sidebar_label": "Introduction" + }, + "version-0.77.0-frontend_data": { + "title": "Frontend data", + "sidebar_label": "Data" + }, + "version-0.78.0-asyncio_working_with_async": { + "title": "Working with Async" + }, + "version-0.78.0-auth_api": { + "title": "Authentication API", + "sidebar_label": "API" + }, + "version-0.78.0-auth_auth_module": { + "title": "Multi-factor Authentication Modules" + }, + "version-0.78.0-auth_index": { + "title": "Authentication", + "sidebar_label": "Introduction" + }, + "version-0.78.0-creating_component_code_review": { + "title": "Checklist for creating a component" + }, + "version-0.78.0-development_guidelines": { + "title": "Style guidelines" + }, + "version-0.78.0-device_registry_index": { + "title": "Device Registry", + "sidebar_label": "Introduction" + }, + "version-0.78.0-documentation_standards": { + "title": "Standards" + }, + "version-0.78.0-external_api_websocket": { + "title": "WebSocket API" + }, + "version-0.78.0-frontend_add_more_info": { + "title": "Adding more info dialogs" + }, + "version-0.78.0-frontend_external_auth": { + "title": "External Authentication" + }, + "version-0.78.0-hassio_addon_communication": { + "title": "Add-On Communication" + }, + "version-0.78.0-hassio_addon_config": { + "title": "Add-On Configuration" + }, + "version-0.78.0-hassio_addon_security": { + "title": "Add-on security" + } + }, + "links": { + "Architecture": "Architecture", + "Frontend": "Frontend", + "Backend": "Backend", + "Misc": "Misc", + "Blog": "Blog" + }, + "categories": { + "Architecture": "Architecture", + "Entities": "Entities", + "Authentication": "Authentication", + "Configuration.yaml": "Configuration.yaml", + "Config Entries": "Config Entries", + "Data Entry Flow": "Data Entry Flow", + "Entity Registry": "Entity Registry", + "Device Registry": "Device Registry", + "Frontend": "Frontend", + "Extending the frontend": "Extending the frontend", + "Custom UI": "Custom UI", + "Developing a feature": "Developing a feature", + "Development 101": "Development 101", + "Integration Quality Scale": "Integration Quality Scale", + "Creating Platforms": "Creating Platforms", + "Creating Components": "Creating Components", + "Introduction": "Introduction", + "External API": "External API", + "Internationalization": "Internationalization", + "Documentation": "Documentation", + "Intents": "Intents", + "asyncio": "asyncio", + "Hass.io": "Hass.io", + "Hass.io Add-Ons": "Hass.io Add-Ons", + "Maintainer docs": "Maintainer docs", + "Lovelace UI": "Lovelace UI" + } }, "pages-strings": { "Learn more using the [documentation on this site.](/test-site/docs/en/doc1.html)|no description given": "Learn more using the [documentation on this site.](/test-site/docs/en/doc1.html)", diff --git a/website/pages/en/versions.js b/website/pages/en/versions.js index d1c2a551..ade415df 100644 --- a/website/pages/en/versions.js +++ b/website/pages/en/versions.js @@ -68,7 +68,7 @@ class Versions extends React.Component { {versions.map( version => version !== latestVersion && ( -