Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
6249cab
Firefly III add diagnostics (#154743)
erwindouna Oct 18, 2025
b7acc66
Move url out of simplisafe strings (#154762)
andrew-codechimp Oct 18, 2025
10392d9
Move URL out of Tomorrow.io strings.json (#154759)
andrew-codechimp Oct 18, 2025
a82c512
Move url out of starline strings.json (#154773)
andrew-codechimp Oct 18, 2025
861f4a0
Move url out of orsoenergy strings.json (#154776)
andrew-codechimp Oct 18, 2025
3134fd7
Move url out of sensorpush_cloud strings.json (#154768)
andrew-codechimp Oct 18, 2025
37188a0
Move url out of motionblinds strings.json (#154777)
andrew-codechimp Oct 18, 2025
d238060
Move url out of rachio strings.json (#154781)
andrew-codechimp Oct 18, 2025
3b09adb
Remove workaround in togrill to trigger coordinator (#154784)
elupus Oct 18, 2025
e95c0ef
Move translatable URL out of strings.json for compit (#154771)
jbouwh Oct 18, 2025
10b300e
Set integration_type to service in Uptime Kuma integration (#154764)
tr4nt0r Oct 18, 2025
d398a13
Set integration_type to service in Habitica (#154763)
tr4nt0r Oct 18, 2025
ff95c62
Move URLs out of strings.json for androidtv_remote (#154739)
jbouwh Oct 18, 2025
378295e
Move url out of Flume strings.json (#154787)
andrew-codechimp Oct 18, 2025
553fcb5
Move url out of FreedomPro strings.json (#154786)
andrew-codechimp Oct 18, 2025
9032de4
Make sure user flow replace ignored in togrill (#154780)
elupus Oct 18, 2025
1e91ad6
Make sure user flow replace ignored in gardena_blueooth (#154778)
elupus Oct 18, 2025
56f33a8
Set integration_type to service in ntfy integration (#154767)
tr4nt0r Oct 18, 2025
b610800
Move URLs out of strings.json for auth (#154769)
jbouwh Oct 18, 2025
f806cc8
Move translatable URL out of strings.json for airnow integration (#15…
akanksha106-code Oct 18, 2025
62b39fd
Remove unused repair string and update quality scale in Habitica inte…
tr4nt0r Oct 18, 2025
477cdbb
Use yaml anchors in ci workflow (2) (#154680)
cdce8p Oct 18, 2025
9a27805
Correctly calculate average color for light groups in HS Color Mode (…
ogruendel Oct 18, 2025
31f595a
Set integration_type to service in Sleep as Android (#154765)
tr4nt0r Oct 18, 2025
d607323
Add support for tracking stats of party members in Habitica integrati…
tr4nt0r Oct 18, 2025
5b1e3ef
Set xuid as unique_id and gamertag as title in Xbox config flow (#154…
tr4nt0r Oct 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 9 additions & 11 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ jobs:
timeout-minutes: 60
strategy:
matrix:
python-version: ${{ fromJSON(needs.info.outputs.python_versions) }}
python-version: &matrix-python ${{ fromJson(needs.info.outputs.python_versions) }}
steps:
- *checkout
- &setup-python-matrix
Expand Down Expand Up @@ -514,9 +514,7 @@ jobs:
if: steps.cache-apt-check.outputs.cache-hit != 'true'
uses: &actions-cache-save actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: |
${{ env.APT_CACHE_DIR }}
${{ env.APT_LIST_CACHE_DIR }}
path: *path-apt-cache
key: *key-apt-cache
- name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
Expand Down Expand Up @@ -641,7 +639,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
python-version: *matrix-python
steps:
- *checkout
- *setup-python-matrix
Expand Down Expand Up @@ -838,8 +836,8 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
group: ${{ fromJson(needs.info.outputs.test_groups) }}
python-version: *matrix-python
group: &matrix-group ${{ fromJson(needs.info.outputs.test_groups) }}
steps:
- *cache-restore-apt
- name: Install additional OS dependencies
Expand Down Expand Up @@ -964,7 +962,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
python-version: *matrix-python
mariadb-group: ${{ fromJson(needs.info.outputs.mariadb_groups) }}
steps:
- *cache-restore-apt
Expand Down Expand Up @@ -1081,7 +1079,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
python-version: *matrix-python
postgresql-group: ${{ fromJson(needs.info.outputs.postgresql_groups) }}
steps:
- *cache-restore-apt
Expand Down Expand Up @@ -1218,8 +1216,8 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
group: ${{ fromJson(needs.info.outputs.test_groups) }}
python-version: *matrix-python
group: *matrix-group
steps:
- *cache-restore-apt
- name: Install additional OS dependencies
Expand Down
61 changes: 25 additions & 36 deletions .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ jobs:
outputs:
architectures: ${{ steps.info.outputs.architectures }}
steps:
- name: Checkout the repository
- &checkout
name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

- name: Set up Python ${{ env.DEFAULT_PYTHON }}
Expand Down Expand Up @@ -91,22 +92,22 @@ jobs:
) > build_constraints.txt

- name: Upload env_file
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: &actions-upload-artifact actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: env_file
path: ./.env_file
include-hidden-files: true
overwrite: true

- name: Upload build_constraints
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: *actions-upload-artifact
with:
name: build_constraints
path: ./build_constraints.txt
overwrite: true

- name: Upload requirements_diff
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: *actions-upload-artifact
with:
name: requirements_diff
path: ./requirements_diff.txt
Expand All @@ -118,7 +119,7 @@ jobs:
python -m script.gen_requirements_all ci

- name: Upload requirements_all_wheels
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: *actions-upload-artifact
with:
name: requirements_all_wheels
path: ./requirements_all_wheels_*.txt
Expand All @@ -130,25 +131,27 @@ jobs:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
matrix: &matrix-build
abi: ["cp313"]
arch: ${{ fromJson(needs.init.outputs.architectures) }}
steps:
- name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- *checkout

- name: Download env_file
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
- &download-env-file
name: Download env_file
uses: &actions-download-artifact actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: env_file

- name: Download build_constraints
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
- &download-build-constraints
name: Download build_constraints
uses: *actions-download-artifact
with:
name: build_constraints

- name: Download requirements_diff
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
- &download-requirements-diff
name: Download requirements_diff
uses: *actions-download-artifact
with:
name: requirements_diff

Expand All @@ -160,7 +163,7 @@ jobs:

# home-assistant/wheels doesn't support sha pinning
- name: Build wheels
uses: home-assistant/[email protected]
uses: &home-assistant-wheels home-assistant/[email protected]
with:
abi: ${{ matrix.abi }}
tag: musllinux_1_2
Expand All @@ -180,30 +183,16 @@ jobs:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
abi: ["cp313"]
arch: ${{ fromJson(needs.init.outputs.architectures) }}
matrix: *matrix-build
steps:
- name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

- name: Download env_file
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: env_file

- name: Download build_constraints
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: build_constraints
- *checkout

- name: Download requirements_diff
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: requirements_diff
- *download-env-file
- *download-build-constraints
- *download-requirements-diff

- name: Download requirements_all_wheels
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
uses: *actions-download-artifact
with:
name: requirements_all_wheels

Expand All @@ -221,7 +210,7 @@ jobs:

# home-assistant/wheels doesn't support sha pinning
- name: Build wheels
uses: home-assistant/wheels@2025.09.1
uses: *home-assistant-wheels
with:
abi: ${{ matrix.abi }}
tag: musllinux_1_2
Expand Down
5 changes: 5 additions & 0 deletions homeassistant/auth/mfa_modules/totp.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@

DUMMY_SECRET = "FPPTH34D4E3MI2HG"

GOOGLE_AUTHENTICATOR_URL = "https://support.google.com/accounts/answer/1066447"
AUTHY_URL = "https://authy.com/"


def _generate_qr_code(data: str) -> str:
"""Generate a base64 PNG string represent QR Code image of data."""
Expand Down Expand Up @@ -229,6 +232,8 @@ async def async_step_init(
"code": self._ota_secret,
"url": self._url,
"qr_code": self._image,
"google_authenticator_url": GOOGLE_AUTHENTICATOR_URL,
"authy_url": AUTHY_URL,
},
errors=errors,
)
5 changes: 5 additions & 0 deletions homeassistant/components/airnow/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@
_LOGGER = logging.getLogger(__name__)


# Documentation URL for API key generation
_API_KEY_URL = "https://docs.airnowapi.org/account/request/"


async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> bool:
"""Validate the user input allows us to connect.
Expand Down Expand Up @@ -114,6 +118,7 @@ async def async_step_user(
),
}
),
description_placeholders={"api_key_url": _API_KEY_URL},
errors=errors,
)

Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/airnow/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"config": {
"step": {
"user": {
"description": "To generate API key go to https://docs.airnowapi.org/account/request/",
"description": "To generate API key go to {api_key_url}",
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]",
Expand Down
7 changes: 7 additions & 0 deletions homeassistant/components/androidtv_remote/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@
CONF_APP_DELETE = "app_delete"
CONF_APP_ID = "app_id"

_EXAMPLE_APP_ID = "com.plexapp.android"
_EXAMPLE_APP_PLAY_STORE_URL = (
f"https://play.google.com/store/apps/details?id={_EXAMPLE_APP_ID}"
)

STEP_PAIR_DATA_SCHEMA = vol.Schema(
{
vol.Required("pin"): str,
Expand Down Expand Up @@ -355,5 +360,7 @@ def _async_apps_form(self, app_id: str) -> ConfigFlowResult:
data_schema=data_schema,
description_placeholders={
"app_id": f"`{app_id}`" if app_id != APPS_NEW_ID else "",
"example_app_id": _EXAMPLE_APP_ID,
"example_app_play_store_url": _EXAMPLE_APP_PLAY_STORE_URL,
},
)
2 changes: 1 addition & 1 deletion homeassistant/components/androidtv_remote/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
},
"data_description": {
"app_name": "Name of the application as you would like it to be displayed in Home Assistant.",
"app_id": "E.g. com.plexapp.android for https://play.google.com/store/apps/details?id=com.plexapp.android",
"app_id": "E.g. {example_app_id} for {example_app_play_store_url}",
"app_icon": "Image URL. From the Play Store app page, right click on the icon and select 'Copy image address' and then paste it here. Alternatively, download the image, upload it under /config/www/ and use the URL /local/filename",
"app_delete": "Check this box to delete the application from the list."
}
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/auth/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"step": {
"init": {
"title": "Set up two-factor authentication using TOTP",
"description": "To activate two-factor authentication using time-based one-time passwords, scan the QR code with your authentication app. If you don't have one, we recommend either [Google Authenticator](https://support.google.com/accounts/answer/1066447) or [Authy](https://authy.com/).\n\n{qr_code}\n\nAfter scanning the code, enter the six-digit code from your app to verify the setup. If you have problems scanning the QR code, do a manual setup with code **`{code}`**."
"description": "To activate two-factor authentication using time-based one-time passwords, scan the QR code with your authentication app. If you don't have one, we recommend either [Google Authenticator]({google_authenticator_url}) or [Authy]({authy_url}).\n\n{qr_code}\n\nAfter scanning the code, enter the six-digit code from your app to verify the setup. If you have problems scanning the QR code, do a manual setup with code **`{code}`**."
}
},
"error": {
Expand Down
5 changes: 4 additions & 1 deletion homeassistant/components/compit/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,10 @@ async def async_step_user(
)

return self.async_show_form(
step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors
step_id="user",
data_schema=STEP_USER_DATA_SCHEMA,
errors=errors,
description_placeholders={"compit_url": "https://inext.compit.pl/"},
)

async def async_step_reauth(self, data: Mapping[str, Any]) -> ConfigFlowResult:
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/compit/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"config": {
"step": {
"user": {
"description": "Please enter your https://inext.compit.pl/ credentials.",
"description": "Please enter your {compit_url} credentials.",
"title": "Connect to Compit iNext",
"data": {
"email": "[%key:common::config_flow::data::email%]",
Expand Down
26 changes: 26 additions & 0 deletions homeassistant/components/firefly_iii/diagnostics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""Diagnostics for the Firefly III integration."""

from __future__ import annotations

from typing import Any

from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_API_KEY, CONF_URL
from homeassistant.core import HomeAssistant

from . import FireflyConfigEntry
from .coordinator import FireflyDataUpdateCoordinator

TO_REDACT = [CONF_API_KEY, CONF_URL]


async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: FireflyConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
coordinator: FireflyDataUpdateCoordinator = entry.runtime_data

return {
"config_entry": async_redact_data(entry.as_dict(), TO_REDACT),
"data": {"primary_currency": coordinator.data.primary_currency.to_dict()},
}
7 changes: 6 additions & 1 deletion homeassistant/components/flume/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,12 @@ async def async_step_user(
errors[CONF_PASSWORD] = "invalid_auth"

return self.async_show_form(
step_id="user", data_schema=DATA_SCHEMA, errors=errors
step_id="user",
data_schema=DATA_SCHEMA,
errors=errors,
description_placeholders={
"api_url": "https://portal.flumetech.com/settings#token"
},
)

async def async_step_reauth(
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/flume/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
},
"step": {
"user": {
"description": "In order to access the Flume Personal API, you will need to request a 'Client ID' and 'Client Secret' at https://portal.flumetech.com/settings#token",
"description": "In order to access the Flume Personal API, you will need to request a 'Client ID' and 'Client Secret' at {api_url}",
"title": "Connect to your Flume account",
"data": {
"username": "[%key:common::config_flow::data::username%]",
Expand Down
14 changes: 12 additions & 2 deletions homeassistant/components/freedompro/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from .const import DOMAIN

STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): str})
API_KEY_URL = "https://freedompro.eu/"


class Hub:
Expand Down Expand Up @@ -53,7 +54,11 @@ async def async_step_user(
"""Show the setup form to the user."""
if user_input is None:
return self.async_show_form(
step_id="user", data_schema=STEP_USER_DATA_SCHEMA
step_id="user",
data_schema=STEP_USER_DATA_SCHEMA,
description_placeholders={
"api_key_url": API_KEY_URL,
},
)

errors = {}
Expand All @@ -68,7 +73,12 @@ async def async_step_user(
return self.async_create_entry(title="Freedompro", data=user_input)

return self.async_show_form(
step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors
step_id="user",
data_schema=STEP_USER_DATA_SCHEMA,
errors=errors,
description_placeholders={
"api_key_url": API_KEY_URL,
},
)


Expand Down
Loading
Loading