Compare commits

..

2 Commits

Author SHA1 Message Date
epenet
7b2e4dbe16 Ruff 2025-10-17 13:46:52 +00:00
epenet
1f812e9f89 Fix motor reverse mode logic 2025-10-17 14:54:20 +02:00
2024 changed files with 65743 additions and 98165 deletions

View File

@@ -33,7 +33,7 @@
"GitHub.vscode-pull-request-github", "GitHub.vscode-pull-request-github",
"GitHub.copilot" "GitHub.copilot"
], ],
// Please keep this file in sync with settings in home-assistant/.vscode/settings.default.jsonc // Please keep this file in sync with settings in home-assistant/.vscode/settings.default.json
"settings": { "settings": {
"python.experiments.optOutFrom": ["pythonTestAdapter"], "python.experiments.optOutFrom": ["pythonTestAdapter"],
"python.defaultInterpreterPath": "/home/vscode/.local/ha-venv/bin/python", "python.defaultInterpreterPath": "/home/vscode/.local/ha-venv/bin/python",
@@ -41,7 +41,6 @@
"python.terminal.activateEnvInCurrentTerminal": true, "python.terminal.activateEnvInCurrentTerminal": true,
"python.testing.pytestArgs": ["--no-cov"], "python.testing.pytestArgs": ["--no-cov"],
"pylint.importStrategy": "fromEnvironment", "pylint.importStrategy": "fromEnvironment",
"python.analysis.typeCheckingMode": "basic",
"editor.formatOnPaste": false, "editor.formatOnPaste": false,
"editor.formatOnSave": true, "editor.formatOnSave": true,
"editor.formatOnType": true, "editor.formatOnType": true,
@@ -63,9 +62,6 @@
"[python]": { "[python]": {
"editor.defaultFormatter": "charliermarsh.ruff" "editor.defaultFormatter": "charliermarsh.ruff"
}, },
"[json][jsonc][yaml]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"json.schemas": [ "json.schemas": [
{ {
"fileMatch": ["homeassistant/components/*/manifest.json"], "fileMatch": ["homeassistant/components/*/manifest.json"],

View File

@@ -74,7 +74,6 @@ rules:
- **Formatting**: Ruff - **Formatting**: Ruff
- **Linting**: PyLint and Ruff - **Linting**: PyLint and Ruff
- **Type Checking**: MyPy - **Type Checking**: MyPy
- **Lint/Type/Format Fixes**: Always prefer addressing the underlying issue (e.g., import the typed source, update shared stubs, align with Ruff expectations, or correct formatting at the source) before disabling a rule, adding `# type: ignore`, or skipping a formatter. Treat suppressions and `noqa` comments as a last resort once no compliant fix exists
- **Testing**: pytest with plain functions and fixtures - **Testing**: pytest with plain functions and fixtures
- **Language**: American English for all code, comments, and documentation (use sentence case, including titles) - **Language**: American English for all code, comments, and documentation (use sentence case, including titles)

View File

@@ -69,7 +69,7 @@ jobs:
run: find ./homeassistant/components/*/translations -name "*.json" | tar zcvf translations.tar.gz -T - run: find ./homeassistant/components/*/translations -name "*.json" | tar zcvf translations.tar.gz -T -
- name: Upload translations - name: Upload translations
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: translations name: translations
path: translations.tar.gz path: translations.tar.gz
@@ -175,7 +175,7 @@ jobs:
sed -i "s|pykrakenapi|# pykrakenapi|g" requirements_all.txt sed -i "s|pykrakenapi|# pykrakenapi|g" requirements_all.txt
- name: Download translations - name: Download translations
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with: with:
name: translations name: translations
@@ -464,7 +464,7 @@ jobs:
python-version: ${{ env.DEFAULT_PYTHON }} python-version: ${{ env.DEFAULT_PYTHON }}
- name: Download translations - name: Download translations
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with: with:
name: translations name: translations

View File

@@ -37,7 +37,7 @@ on:
type: boolean type: boolean
env: env:
CACHE_VERSION: 1 CACHE_VERSION: 9
UV_CACHE_VERSION: 1 UV_CACHE_VERSION: 1
MYPY_CACHE_VERSION: 1 MYPY_CACHE_VERSION: 1
HA_SHORT_VERSION: "2025.11" HA_SHORT_VERSION: "2025.11"
@@ -428,7 +428,7 @@ jobs:
timeout-minutes: 60 timeout-minutes: 60
strategy: strategy:
matrix: matrix:
python-version: &matrix-python ${{ fromJson(needs.info.outputs.python_versions) }} python-version: ${{ fromJSON(needs.info.outputs.python_versions) }}
steps: steps:
- *checkout - *checkout
- &setup-python-matrix - &setup-python-matrix
@@ -514,7 +514,9 @@ jobs:
if: steps.cache-apt-check.outputs.cache-hit != 'true' if: steps.cache-apt-check.outputs.cache-hit != 'true'
uses: &actions-cache-save actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 uses: &actions-cache-save actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with: with:
path: *path-apt-cache path: |
${{ env.APT_CACHE_DIR }}
${{ env.APT_LIST_CACHE_DIR }}
key: *key-apt-cache key: *key-apt-cache
- name: Create Python virtual environment - name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true' if: steps.cache-venv.outputs.cache-hit != 'true'
@@ -535,7 +537,7 @@ jobs:
python --version python --version
uv pip freeze >> pip_freeze.txt uv pip freeze >> pip_freeze.txt
- name: Upload pip_freeze artifact - name: Upload pip_freeze artifact
uses: &actions-upload-artifact actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 uses: &actions-upload-artifact actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: pip-freeze-${{ matrix.python-version }} name: pip-freeze-${{ matrix.python-version }}
path: pip_freeze.txt path: pip_freeze.txt
@@ -639,7 +641,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: *matrix-python python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
steps: steps:
- *checkout - *checkout
- *setup-python-matrix - *setup-python-matrix
@@ -836,8 +838,8 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: *matrix-python python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
group: &matrix-group ${{ fromJson(needs.info.outputs.test_groups) }} group: ${{ fromJson(needs.info.outputs.test_groups) }}
steps: steps:
- *cache-restore-apt - *cache-restore-apt
- name: Install additional OS dependencies - name: Install additional OS dependencies
@@ -867,7 +869,7 @@ jobs:
run: | run: |
echo "::add-matcher::.github/workflows/matchers/pytest-slow.json" echo "::add-matcher::.github/workflows/matchers/pytest-slow.json"
- name: Download pytest_buckets - name: Download pytest_buckets
uses: &actions-download-artifact actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 uses: &actions-download-artifact actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with: with:
name: pytest_buckets name: pytest_buckets
- &compile-english-translations - &compile-english-translations
@@ -962,7 +964,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: *matrix-python python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
mariadb-group: ${{ fromJson(needs.info.outputs.mariadb_groups) }} mariadb-group: ${{ fromJson(needs.info.outputs.mariadb_groups) }}
steps: steps:
- *cache-restore-apt - *cache-restore-apt
@@ -1079,7 +1081,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: *matrix-python python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
postgresql-group: ${{ fromJson(needs.info.outputs.postgresql_groups) }} postgresql-group: ${{ fromJson(needs.info.outputs.postgresql_groups) }}
steps: steps:
- *cache-restore-apt - *cache-restore-apt
@@ -1216,8 +1218,8 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: *matrix-python python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
group: *matrix-group group: ${{ fromJson(needs.info.outputs.test_groups) }}
steps: steps:
- *cache-restore-apt - *cache-restore-apt
- name: Install additional OS dependencies - name: Install additional OS dependencies

View File

@@ -24,11 +24,11 @@ jobs:
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.0 uses: github/codeql-action/init@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8
with: with:
languages: python languages: python
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.0 uses: github/codeql-action/analyze@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8
with: with:
category: "/language:python" category: "/language:python"

View File

@@ -31,8 +31,7 @@ jobs:
outputs: outputs:
architectures: ${{ steps.info.outputs.architectures }} architectures: ${{ steps.info.outputs.architectures }}
steps: steps:
- &checkout - name: Checkout the repository
name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }} - name: Set up Python ${{ env.DEFAULT_PYTHON }}
@@ -92,7 +91,7 @@ jobs:
) > build_constraints.txt ) > build_constraints.txt
- name: Upload env_file - name: Upload env_file
uses: &actions-upload-artifact actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: env_file name: env_file
path: ./.env_file path: ./.env_file
@@ -100,14 +99,14 @@ jobs:
overwrite: true overwrite: true
- name: Upload build_constraints - name: Upload build_constraints
uses: *actions-upload-artifact uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: build_constraints name: build_constraints
path: ./build_constraints.txt path: ./build_constraints.txt
overwrite: true overwrite: true
- name: Upload requirements_diff - name: Upload requirements_diff
uses: *actions-upload-artifact uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: requirements_diff name: requirements_diff
path: ./requirements_diff.txt path: ./requirements_diff.txt
@@ -119,7 +118,7 @@ jobs:
python -m script.gen_requirements_all ci python -m script.gen_requirements_all ci
- name: Upload requirements_all_wheels - name: Upload requirements_all_wheels
uses: *actions-upload-artifact uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: requirements_all_wheels name: requirements_all_wheels
path: ./requirements_all_wheels_*.txt path: ./requirements_all_wheels_*.txt
@@ -128,41 +127,28 @@ jobs:
name: Build Core wheels ${{ matrix.abi }} for ${{ matrix.arch }} (musllinux_1_2) name: Build Core wheels ${{ matrix.abi }} for ${{ matrix.arch }} (musllinux_1_2)
if: github.repository_owner == 'home-assistant' if: github.repository_owner == 'home-assistant'
needs: init needs: init
runs-on: ${{ matrix.os }} runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
matrix: &matrix-build matrix:
abi: ["cp313", "cp314"] abi: ["cp313"]
arch: ${{ fromJson(needs.init.outputs.architectures) }} arch: ${{ fromJson(needs.init.outputs.architectures) }}
include:
- os: ubuntu-latest
- arch: aarch64
os: ubuntu-24.04-arm
exclude:
- abi: cp314
arch: armv7
- abi: cp314
arch: armhf
- abi: cp314
arch: i386
steps: steps:
- *checkout - name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- &download-env-file - name: Download env_file
name: Download env_file uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
uses: &actions-download-artifact actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
with: with:
name: env_file name: env_file
- &download-build-constraints - name: Download build_constraints
name: Download build_constraints uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
uses: *actions-download-artifact
with: with:
name: build_constraints name: build_constraints
- &download-requirements-diff - name: Download requirements_diff
name: Download requirements_diff uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
uses: *actions-download-artifact
with: with:
name: requirements_diff name: requirements_diff
@@ -174,7 +160,7 @@ jobs:
# home-assistant/wheels doesn't support sha pinning # home-assistant/wheels doesn't support sha pinning
- name: Build wheels - name: Build wheels
uses: &home-assistant-wheels home-assistant/wheels@2025.10.0 uses: home-assistant/wheels@2025.09.1
with: with:
abi: ${{ matrix.abi }} abi: ${{ matrix.abi }}
tag: musllinux_1_2 tag: musllinux_1_2
@@ -191,19 +177,33 @@ jobs:
name: Build wheels ${{ matrix.abi }} for ${{ matrix.arch }} name: Build wheels ${{ matrix.abi }} for ${{ matrix.arch }}
if: github.repository_owner == 'home-assistant' if: github.repository_owner == 'home-assistant'
needs: init needs: init
runs-on: ${{ matrix.os }} runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
matrix: *matrix-build matrix:
abi: ["cp313"]
arch: ${{ fromJson(needs.init.outputs.architectures) }}
steps: steps:
- *checkout - name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- *download-env-file - name: Download env_file
- *download-build-constraints uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
- *download-requirements-diff with:
name: env_file
- name: Download build_constraints
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: build_constraints
- name: Download requirements_diff
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: requirements_diff
- name: Download requirements_all_wheels - name: Download requirements_all_wheels
uses: *actions-download-artifact uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with: with:
name: requirements_all_wheels name: requirements_all_wheels
@@ -221,7 +221,7 @@ jobs:
# home-assistant/wheels doesn't support sha pinning # home-assistant/wheels doesn't support sha pinning
- name: Build wheels - name: Build wheels
uses: *home-assistant-wheels uses: home-assistant/wheels@2025.09.1
with: with:
abi: ${{ matrix.abi }} abi: ${{ matrix.abi }}
tag: musllinux_1_2 tag: musllinux_1_2

2
.gitignore vendored
View File

@@ -111,7 +111,6 @@ virtualization/vagrant/config
!.vscode/cSpell.json !.vscode/cSpell.json
!.vscode/extensions.json !.vscode/extensions.json
!.vscode/tasks.json !.vscode/tasks.json
!.vscode/settings.default.jsonc
.env .env
# Windows Explorer # Windows Explorer
@@ -141,5 +140,4 @@ pytest_buckets.txt
# AI tooling # AI tooling
.claude/settings.local.json .claude/settings.local.json
.serena/

View File

@@ -33,13 +33,10 @@ repos:
rev: v1.37.1 rev: v1.37.1
hooks: hooks:
- id: yamllint - id: yamllint
- repo: https://github.com/rbubley/mirrors-prettier - repo: https://github.com/pre-commit/mirrors-prettier
rev: v3.6.2 rev: v3.0.3
hooks: hooks:
- id: prettier - id: prettier
additional_dependencies:
- prettier@3.6.2
- prettier-plugin-sort-json@4.1.1
- repo: https://github.com/cdce8p/python-typing-update - repo: https://github.com/cdce8p/python-typing-update
rev: v0.6.0 rev: v0.6.0
hooks: hooks:

View File

@@ -1,24 +0,0 @@
/** @type {import("prettier").Config} */
module.exports = {
overrides: [
{
files: "./homeassistant/**/*.json",
options: {
plugins: [require.resolve("prettier-plugin-sort-json")],
jsonRecursiveSort: true,
jsonSortOrder: JSON.stringify({ [/.*/]: "numeric" }),
},
},
{
files: ["manifest.json", "./**/brands/*.json"],
options: {
// domain and name should stay at the top
jsonSortOrder: JSON.stringify({
domain: null,
name: null,
[/.*/]: "numeric",
}),
},
},
],
};

View File

@@ -182,6 +182,7 @@ homeassistant.components.efergy.*
homeassistant.components.eheimdigital.* homeassistant.components.eheimdigital.*
homeassistant.components.electrasmart.* homeassistant.components.electrasmart.*
homeassistant.components.electric_kiwi.* homeassistant.components.electric_kiwi.*
homeassistant.components.elevenlabs.*
homeassistant.components.elgato.* homeassistant.components.elgato.*
homeassistant.components.elkm1.* homeassistant.components.elkm1.*
homeassistant.components.emulated_hue.* homeassistant.components.emulated_hue.*
@@ -278,7 +279,6 @@ homeassistant.components.imap.*
homeassistant.components.imgw_pib.* homeassistant.components.imgw_pib.*
homeassistant.components.immich.* homeassistant.components.immich.*
homeassistant.components.incomfort.* homeassistant.components.incomfort.*
homeassistant.components.inels.*
homeassistant.components.input_button.* homeassistant.components.input_button.*
homeassistant.components.input_select.* homeassistant.components.input_select.*
homeassistant.components.input_text.* homeassistant.components.input_text.*
@@ -478,7 +478,6 @@ homeassistant.components.skybell.*
homeassistant.components.slack.* homeassistant.components.slack.*
homeassistant.components.sleep_as_android.* homeassistant.components.sleep_as_android.*
homeassistant.components.sleepiq.* homeassistant.components.sleepiq.*
homeassistant.components.sma.*
homeassistant.components.smhi.* homeassistant.components.smhi.*
homeassistant.components.smlight.* homeassistant.components.smlight.*
homeassistant.components.smtp.* homeassistant.components.smtp.*

View File

@@ -7,19 +7,13 @@
"python.testing.pytestEnabled": false, "python.testing.pytestEnabled": false,
// https://code.visualstudio.com/docs/python/linting#_general-settings // https://code.visualstudio.com/docs/python/linting#_general-settings
"pylint.importStrategy": "fromEnvironment", "pylint.importStrategy": "fromEnvironment",
// Pyright is too pedantic for Home Assistant
"python.analysis.typeCheckingMode": "basic",
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
},
"[json][jsonc][yaml]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
},
"json.schemas": [ "json.schemas": [
{ {
"fileMatch": ["homeassistant/components/*/manifest.json"], "fileMatch": [
// This value differs between working with devcontainer and locally, therefore this value should NOT be in sync! "homeassistant/components/*/manifest.json"
"url": "./script/json_schemas/manifest_schema.json", ],
}, // This value differs between working with devcontainer and locally, therefor this value should NOT be in sync!
], "url": "./script/json_schemas/manifest_schema.json"
}
]
} }

6
CODEOWNERS generated
View File

@@ -494,8 +494,6 @@ build.json @home-assistant/supervisor
/tests/components/filesize/ @gjohansson-ST /tests/components/filesize/ @gjohansson-ST
/homeassistant/components/filter/ @dgomes /homeassistant/components/filter/ @dgomes
/tests/components/filter/ @dgomes /tests/components/filter/ @dgomes
/homeassistant/components/fing/ @Lorenzo-Gasparini
/tests/components/fing/ @Lorenzo-Gasparini
/homeassistant/components/firefly_iii/ @erwindouna /homeassistant/components/firefly_iii/ @erwindouna
/tests/components/firefly_iii/ @erwindouna /tests/components/firefly_iii/ @erwindouna
/homeassistant/components/fireservicerota/ @cyberjunky /homeassistant/components/fireservicerota/ @cyberjunky
@@ -743,8 +741,6 @@ build.json @home-assistant/supervisor
/tests/components/improv_ble/ @emontnemery /tests/components/improv_ble/ @emontnemery
/homeassistant/components/incomfort/ @jbouwh /homeassistant/components/incomfort/ @jbouwh
/tests/components/incomfort/ @jbouwh /tests/components/incomfort/ @jbouwh
/homeassistant/components/inels/ @epdevlab
/tests/components/inels/ @epdevlab
/homeassistant/components/influxdb/ @mdegat01 /homeassistant/components/influxdb/ @mdegat01
/tests/components/influxdb/ @mdegat01 /tests/components/influxdb/ @mdegat01
/homeassistant/components/inkbird/ @bdraco /homeassistant/components/inkbird/ @bdraco
@@ -1543,8 +1539,6 @@ build.json @home-assistant/supervisor
/tests/components/suez_water/ @ooii @jb101010-2 /tests/components/suez_water/ @ooii @jb101010-2
/homeassistant/components/sun/ @home-assistant/core /homeassistant/components/sun/ @home-assistant/core
/tests/components/sun/ @home-assistant/core /tests/components/sun/ @home-assistant/core
/homeassistant/components/sunricher_dali_center/ @niracler
/tests/components/sunricher_dali_center/ @niracler
/homeassistant/components/supla/ @mwegrzynek /homeassistant/components/supla/ @mwegrzynek
/homeassistant/components/surepetcare/ @benleb @danielhiversen /homeassistant/components/surepetcare/ @benleb @danielhiversen
/tests/components/surepetcare/ @benleb @danielhiversen /tests/components/surepetcare/ @benleb @danielhiversen

4
Dockerfile generated
View File

@@ -25,13 +25,13 @@ RUN \
"armv7") go2rtc_suffix='arm' ;; \ "armv7") go2rtc_suffix='arm' ;; \
*) go2rtc_suffix=${BUILD_ARCH} ;; \ *) go2rtc_suffix=${BUILD_ARCH} ;; \
esac \ esac \
&& curl -L https://github.com/AlexxIT/go2rtc/releases/download/v1.9.11/go2rtc_linux_${go2rtc_suffix} --output /bin/go2rtc \ && curl -L https://github.com/AlexxIT/go2rtc/releases/download/v1.9.9/go2rtc_linux_${go2rtc_suffix} --output /bin/go2rtc \
&& chmod +x /bin/go2rtc \ && chmod +x /bin/go2rtc \
# Verify go2rtc can be executed # Verify go2rtc can be executed
&& go2rtc --version && go2rtc --version
# Install uv # Install uv
RUN pip3 install uv==0.9.5 RUN pip3 install uv==0.8.9
WORKDIR /usr/src WORKDIR /usr/src

View File

@@ -5,6 +5,9 @@ build_from:
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2025.10.1 armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2025.10.1
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2025.10.1 amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2025.10.1
i386: ghcr.io/home-assistant/i386-homeassistant-base:2025.10.1 i386: ghcr.io/home-assistant/i386-homeassistant-base:2025.10.1
codenotary:
signer: notary@home-assistant.io
base_image: notary@home-assistant.io
cosign: cosign:
base_identity: https://github.com/home-assistant/docker/.* base_identity: https://github.com/home-assistant/docker/.*
identity: https://github.com/home-assistant/core/.* identity: https://github.com/home-assistant/core/.*

View File

@@ -34,9 +34,6 @@ INPUT_FIELD_CODE = "code"
DUMMY_SECRET = "FPPTH34D4E3MI2HG" 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: def _generate_qr_code(data: str) -> str:
"""Generate a base64 PNG string represent QR Code image of data.""" """Generate a base64 PNG string represent QR Code image of data."""
@@ -232,8 +229,6 @@ class TotpSetupFlow(SetupFlow[TotpAuthModule]):
"code": self._ota_secret, "code": self._ota_secret,
"url": self._url, "url": self._url,
"qr_code": self._image, "qr_code": self._image,
"google_authenticator_url": GOOGLE_AUTHENTICATOR_URL,
"authy_url": AUTHY_URL,
}, },
errors=errors, errors=errors,
) )

View File

@@ -1,70 +1,70 @@
{ {
"config": { "config": {
"abort": {
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"invalid_mfa_code": "Invalid MFA code"
},
"step": { "step": {
"user": {
"title": "Fill in your Abode login information",
"data": {
"username": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]"
}
},
"mfa": { "mfa": {
"title": "Enter your MFA code for Abode",
"data": { "data": {
"mfa_code": "MFA code (6-digits)" "mfa_code": "MFA code (6-digits)"
}, }
"title": "Enter your MFA code for Abode"
}, },
"reauth_confirm": { "reauth_confirm": {
"title": "[%key:component::abode::config::step::user::title%]",
"data": { "data": {
"password": "[%key:common::config_flow::data::password%]", "username": "[%key:common::config_flow::data::email%]",
"username": "[%key:common::config_flow::data::email%]" "password": "[%key:common::config_flow::data::password%]"
}, }
"title": "[%key:component::abode::config::step::user::title%]"
},
"user": {
"data": {
"password": "[%key:common::config_flow::data::password%]",
"username": "[%key:common::config_flow::data::email%]"
},
"title": "Fill in your Abode login information"
} }
},
"error": {
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_mfa_code": "Invalid MFA code"
},
"abort": {
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
} }
}, },
"services": { "services": {
"capture_image": { "capture_image": {
"name": "Capture image",
"description": "Requests a new image capture from a camera device.", "description": "Requests a new image capture from a camera device.",
"fields": { "fields": {
"entity_id": { "entity_id": {
"description": "Entity ID of the camera to request an image from.", "name": "Entity",
"name": "Entity" "description": "Entity ID of the camera to request an image from."
} }
}, }
"name": "Capture image"
}, },
"change_setting": { "change_setting": {
"name": "Change setting",
"description": "Changes an Abode system setting.", "description": "Changes an Abode system setting.",
"fields": { "fields": {
"setting": { "setting": {
"description": "Setting to change.", "name": "Setting",
"name": "Setting" "description": "Setting to change."
}, },
"value": { "value": {
"description": "Value of the setting.", "name": "Value",
"name": "Value" "description": "Value of the setting."
} }
}, }
"name": "Change setting"
}, },
"trigger_automation": { "trigger_automation": {
"name": "Trigger automation",
"description": "Triggers an Abode automation.", "description": "Triggers an Abode automation.",
"fields": { "fields": {
"entity_id": { "entity_id": {
"description": "Entity ID of the automation to trigger.", "name": "Entity",
"name": "Entity" "description": "Entity ID of the automation to trigger."
} }
}, }
"name": "Trigger automation"
} }
} }
} }

View File

@@ -4,20 +4,20 @@
"timer_running": { "timer_running": {
"default": "mdi:timer", "default": "mdi:timer",
"state": { "state": {
"off": "mdi:timer-off", "on": "mdi:timer-play",
"on": "mdi:timer-play" "off": "mdi:timer-off"
} }
} }
}, },
"button": { "button": {
"tare": {
"default": "mdi:scale-balance"
},
"reset_timer": { "reset_timer": {
"default": "mdi:timer-refresh" "default": "mdi:timer-refresh"
}, },
"start_stop": { "start_stop": {
"default": "mdi:timer-play" "default": "mdi:timer-play"
},
"tare": {
"default": "mdi:scale-balance"
} }
} }
} }

View File

@@ -1,5 +1,6 @@
{ {
"config": { "config": {
"flow_title": "{name}",
"abort": { "abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]", "already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]", "no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
@@ -9,19 +10,18 @@
"device_not_found": "Device could not be found.", "device_not_found": "Device could not be found.",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
}, },
"flow_title": "{name}",
"step": { "step": {
"bluetooth_confirm": { "bluetooth_confirm": {
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]" "description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
}, },
"user": { "user": {
"description": "[%key:component::bluetooth::config::step::user::description%]",
"data": { "data": {
"address": "[%key:common::config_flow::data::device%]" "address": "[%key:common::config_flow::data::device%]"
}, },
"data_description": { "data_description": {
"address": "Select Acaia scale you want to set up" "address": "Select Acaia scale you want to set up"
}, }
"description": "[%key:component::bluetooth::config::step::user::description%]"
} }
} }
}, },
@@ -32,14 +32,14 @@
} }
}, },
"button": { "button": {
"tare": {
"name": "Tare"
},
"reset_timer": { "reset_timer": {
"name": "Reset timer" "name": "Reset timer"
}, },
"start_stop": { "start_stop": {
"name": "Start/stop timer" "name": "Start/stop timer"
},
"tare": {
"name": "Tare"
} }
} }
} }

View File

@@ -1,8 +1,25 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_location%]", "user": {
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" "data": {
"name": "[%key:common::config_flow::data::name%]",
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]",
"longitude": "[%key:common::config_flow::data::longitude%]"
},
"data_description": {
"api_key": "API key generated in the AccuWeather APIs portal."
}
},
"reauth_confirm": {
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]"
},
"data_description": {
"api_key": "[%key:component::accuweather::config::step::user::data_description::api_key%]"
}
}
}, },
"create_entry": { "create_entry": {
"default": "Some sensors are not enabled by default. You can enable them in the entity registry after the integration configuration." "default": "Some sensors are not enabled by default. You can enable them in the entity registry after the integration configuration."
@@ -12,26 +29,9 @@
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]", "invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]",
"requests_exceeded": "The allowed number of requests to the AccuWeather API has been exceeded. You have to wait or change the API key." "requests_exceeded": "The allowed number of requests to the AccuWeather API has been exceeded. You have to wait or change the API key."
}, },
"step": { "abort": {
"reauth_confirm": { "already_configured": "[%key:common::config_flow::abort::already_configured_location%]",
"data": { "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
"api_key": "[%key:common::config_flow::data::api_key%]"
},
"data_description": {
"api_key": "[%key:component::accuweather::config::step::user::data_description::api_key%]"
}
},
"user": {
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]",
"longitude": "[%key:common::config_flow::data::longitude%]",
"name": "[%key:common::config_flow::data::name%]"
},
"data_description": {
"api_key": "API key generated in the AccuWeather APIs portal."
}
}
} }
}, },
"entity": { "entity": {
@@ -120,9 +120,9 @@
"pressure_tendency": { "pressure_tendency": {
"name": "Pressure tendency", "name": "Pressure tendency",
"state": { "state": {
"falling": "Falling", "steady": "Steady",
"rising": "Rising", "rising": "Rising",
"steady": "Steady" "falling": "Falling"
}, },
"state_attributes": { "state_attributes": {
"options": { "options": {
@@ -227,6 +227,9 @@
"wet_bulb_temperature": { "wet_bulb_temperature": {
"name": "Wet bulb temperature" "name": "Wet bulb temperature"
}, },
"wind_speed": {
"name": "[%key:component::weather::entity_component::_::state_attributes::wind_speed::name%]"
},
"wind_chill_temperature": { "wind_chill_temperature": {
"name": "Wind chill temperature" "name": "Wind chill temperature"
}, },
@@ -239,9 +242,6 @@
"wind_gust_speed_night": { "wind_gust_speed_night": {
"name": "Wind gust speed night {forecast_day}" "name": "Wind gust speed night {forecast_day}"
}, },
"wind_speed": {
"name": "[%key:component::weather::entity_component::_::state_attributes::wind_speed::name%]"
},
"wind_speed_day": { "wind_speed_day": {
"name": "Wind speed day {forecast_day}" "name": "Wind speed day {forecast_day}"
}, },

View File

@@ -1,15 +1,15 @@
{ {
"config": { "config": {
"abort": {
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]"
},
"step": { "step": {
"user": { "user": {
"title": "Pick a hub to add",
"data": { "data": {
"id": "Host ID" "id": "Host ID"
}, }
"title": "Pick a hub to add"
} }
},
"abort": {
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]"
} }
} }
} }

View File

@@ -1,29 +1,29 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]", "user": {
"oauth2_error": "Failed to start OAuth2 flow" "title": "Actron Air OAuth2 Authorization"
}, },
"error": { "timeout": {
"oauth2_error": "Failed to start OAuth2 flow. Please try again later." "title": "Authorization timeout",
"description": "The authorization process timed out. Please try again.",
"data": {}
},
"connection_error": {
"title": "Connection error",
"description": "Failed to connect to Actron Air. Please check your internet connection and try again.",
"data": {}
}
}, },
"progress": { "progress": {
"wait_for_authorization": "To authenticate, open the following URL and login at Actron Air:\n{verification_uri}\nIf the code is not automatically copied, paste the following code to authorize the integration:\n\n```{user_code}```\n\n\nThe login attempt will time out after {expires_minutes} minutes." "wait_for_authorization": "To authenticate, open the following URL and login at Actron Air:\n{verification_uri}\nIf the code is not automatically copied, paste the following code to authorize the integration:\n\n```{user_code}```\n\n\nThe login attempt will time out after {expires_minutes} minutes."
}, },
"step": { "error": {
"connection_error": { "oauth2_error": "Failed to start OAuth2 flow. Please try again later."
"data": {}, },
"description": "Failed to connect to Actron Air. Please check your internet connection and try again.", "abort": {
"title": "Connection error" "oauth2_error": "Failed to start OAuth2 flow",
}, "already_configured": "[%key:common::config_flow::abort::already_configured_account%]"
"timeout": {
"data": {},
"description": "The authorization process timed out. Please try again.",
"title": "Authorization timeout"
},
"user": {
"title": "Actron Air OAuth2 Authorization"
}
} }
} }
} }

View File

@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/adax", "documentation": "https://www.home-assistant.io/integrations/adax",
"iot_class": "local_polling", "iot_class": "local_polling",
"loggers": ["adax", "adax_local"], "loggers": ["adax", "adax_local"],
"requirements": ["adax==0.4.0", "Adax-local==0.2.0"] "requirements": ["adax==0.4.0", "Adax-local==0.1.5"]
} }

View File

@@ -1,34 +1,34 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"heater_not_available": "Heater not available. Try to reset the heater by pressing + and OK for some seconds.",
"heater_not_found": "Heater not found. Try to move the heater closer to Home Assistant computer.",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"step": { "step": {
"cloud": {
"data": {
"account_id": "Account ID",
"password": "[%key:common::config_flow::data::password%]"
}
},
"local": {
"data": {
"wifi_pswd": "Wi-Fi password",
"wifi_ssid": "Wi-Fi SSID"
},
"description": "Reset the heater by pressing + and OK until display shows 'Reset'. Then press and hold OK button on the heater until the blue LED starts blinking before pressing Submit. Configuring heater might take some minutes."
},
"user": { "user": {
"data": { "data": {
"connection_type": "Select connection type" "connection_type": "Select connection type"
}, },
"description": "Select connection type. Local requires heaters with Bluetooth" "description": "Select connection type. Local requires heaters with Bluetooth"
},
"local": {
"data": {
"wifi_ssid": "Wi-Fi SSID",
"wifi_pswd": "Wi-Fi password"
},
"description": "Reset the heater by pressing + and OK until display shows 'Reset'. Then press and hold OK button on the heater until the blue LED starts blinking before pressing Submit. Configuring heater might take some minutes."
},
"cloud": {
"data": {
"account_id": "Account ID",
"password": "[%key:common::config_flow::data::password%]"
}
} }
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"heater_not_available": "Heater not available. Try to reset the heater by pressing + and OK for some seconds.",
"heater_not_found": "Heater not found. Try to move the heater closer to Home Assistant computer.",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
} }
} }
} }

View File

@@ -1,9 +1,6 @@
{ {
"entity": { "entity": {
"sensor": { "sensor": {
"average_processing_speed": {
"default": "mdi:speedometer"
},
"dns_queries": { "dns_queries": {
"default": "mdi:magnify" "default": "mdi:magnify"
}, },
@@ -16,18 +13,21 @@
"parental_control_blocked": { "parental_control_blocked": {
"default": "mdi:human-male-girl" "default": "mdi:human-male-girl"
}, },
"rules_count": {
"default": "mdi:counter"
},
"safe_browsing_blocked": { "safe_browsing_blocked": {
"default": "mdi:shield-half-full" "default": "mdi:shield-half-full"
}, },
"safe_searches_enforced": { "safe_searches_enforced": {
"default": "mdi:shield-search" "default": "mdi:shield-search"
},
"average_processing_speed": {
"default": "mdi:speedometer"
},
"rules_count": {
"default": "mdi:counter"
} }
}, },
"switch": { "switch": {
"filtering": { "protection": {
"default": "mdi:shield-check", "default": "mdi:shield-check",
"state": { "state": {
"off": "mdi:shield-off" "off": "mdi:shield-off"
@@ -39,13 +39,7 @@
"off": "mdi:shield-off" "off": "mdi:shield-off"
} }
}, },
"protection": { "safe_search": {
"default": "mdi:shield-check",
"state": {
"off": "mdi:shield-off"
}
},
"query_log": {
"default": "mdi:shield-check", "default": "mdi:shield-check",
"state": { "state": {
"off": "mdi:shield-off" "off": "mdi:shield-off"
@@ -57,7 +51,13 @@
"off": "mdi:shield-off" "off": "mdi:shield-off"
} }
}, },
"safe_search": { "filtering": {
"default": "mdi:shield-check",
"state": {
"off": "mdi:shield-off"
}
},
"query_log": {
"default": "mdi:shield-check", "default": "mdi:shield-check",
"state": { "state": {
"off": "mdi:shield-off" "off": "mdi:shield-off"
@@ -69,17 +69,17 @@
"add_url": { "add_url": {
"service": "mdi:link-plus" "service": "mdi:link-plus"
}, },
"disable_url": { "remove_url": {
"service": "mdi:link-variant-off" "service": "mdi:link-off"
}, },
"enable_url": { "enable_url": {
"service": "mdi:link-variant" "service": "mdi:link-variant"
}, },
"disable_url": {
"service": "mdi:link-variant-off"
},
"refresh": { "refresh": {
"service": "mdi:refresh" "service": "mdi:refresh"
},
"remove_url": {
"service": "mdi:link-off"
} }
} }
} }

View File

@@ -1,38 +1,35 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]",
"existing_instance_updated": "Updated existing configuration."
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"step": { "step": {
"hassio_confirm": {
"description": "Do you want to configure Home Assistant to connect to the AdGuard Home provided by the add-on: {addon}?",
"title": "AdGuard Home via Home Assistant add-on"
},
"user": { "user": {
"description": "Set up your AdGuard Home instance to allow monitoring and control.",
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]", "host": "[%key:common::config_flow::data::host%]",
"password": "[%key:common::config_flow::data::password%]", "password": "[%key:common::config_flow::data::password%]",
"port": "[%key:common::config_flow::data::port%]", "port": "[%key:common::config_flow::data::port%]",
"ssl": "[%key:common::config_flow::data::ssl%]",
"username": "[%key:common::config_flow::data::username%]", "username": "[%key:common::config_flow::data::username%]",
"ssl": "[%key:common::config_flow::data::ssl%]",
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]" "verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
}, },
"data_description": { "data_description": {
"host": "The hostname or IP address of the device running your AdGuard Home." "host": "The hostname or IP address of the device running your AdGuard Home."
}, }
"description": "Set up your AdGuard Home instance to allow monitoring and control." },
"hassio_confirm": {
"title": "AdGuard Home via Home Assistant add-on",
"description": "Do you want to configure Home Assistant to connect to the AdGuard Home provided by the add-on: {addon}?"
} }
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"abort": {
"existing_instance_updated": "Updated existing configuration.",
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
} }
}, },
"entity": { "entity": {
"sensor": { "sensor": {
"average_processing_speed": {
"name": "Average processing speed"
},
"dns_queries": { "dns_queries": {
"name": "DNS queries" "name": "DNS queries"
}, },
@@ -45,91 +42,94 @@
"parental_control_blocked": { "parental_control_blocked": {
"name": "Parental control blocked" "name": "Parental control blocked"
}, },
"rules_count": {
"name": "Rules count"
},
"safe_browsing_blocked": { "safe_browsing_blocked": {
"name": "Safe browsing blocked" "name": "Safe browsing blocked"
}, },
"safe_searches_enforced": { "safe_searches_enforced": {
"name": "Safe searches enforced" "name": "Safe searches enforced"
},
"average_processing_speed": {
"name": "Average processing speed"
},
"rules_count": {
"name": "Rules count"
} }
}, },
"switch": { "switch": {
"filtering": { "protection": {
"name": "Filtering" "name": "Protection"
}, },
"parental": { "parental": {
"name": "Parental control" "name": "Parental control"
}, },
"protection": { "safe_search": {
"name": "Protection" "name": "Safe search"
},
"query_log": {
"name": "Query log"
}, },
"safe_browsing": { "safe_browsing": {
"name": "Safe browsing" "name": "Safe browsing"
}, },
"safe_search": { "filtering": {
"name": "Safe search" "name": "Filtering"
},
"query_log": {
"name": "Query log"
} }
} }
}, },
"services": { "services": {
"add_url": { "add_url": {
"name": "Add URL",
"description": "Adds a new filter subscription to AdGuard Home.", "description": "Adds a new filter subscription to AdGuard Home.",
"fields": { "fields": {
"name": { "name": {
"description": "The name of the filter subscription.", "name": "[%key:common::config_flow::data::name%]",
"name": "[%key:common::config_flow::data::name%]" "description": "The name of the filter subscription."
}, },
"url": { "url": {
"description": "The filter URL to subscribe to, containing the filter rules.", "name": "[%key:common::config_flow::data::url%]",
"name": "[%key:common::config_flow::data::url%]" "description": "The filter URL to subscribe to, containing the filter rules."
} }
}, }
"name": "Add URL"
},
"disable_url": {
"description": "Disables a filter subscription in AdGuard Home.",
"fields": {
"url": {
"description": "The filter subscription URL to disable.",
"name": "[%key:common::config_flow::data::url%]"
}
},
"name": "Disable URL"
},
"enable_url": {
"description": "Enables a filter subscription in AdGuard Home.",
"fields": {
"url": {
"description": "The filter subscription URL to enable.",
"name": "[%key:common::config_flow::data::url%]"
}
},
"name": "Enable URL"
},
"refresh": {
"description": "Refreshes all filter subscriptions in AdGuard Home.",
"fields": {
"force": {
"description": "Force update (bypasses AdGuard Home throttling), omit for a regular refresh.",
"name": "Force"
}
},
"name": "Refresh"
}, },
"remove_url": { "remove_url": {
"name": "Remove URL",
"description": "Removes a filter subscription from AdGuard Home.", "description": "Removes a filter subscription from AdGuard Home.",
"fields": { "fields": {
"url": { "url": {
"description": "The filter subscription URL to remove.", "name": "[%key:common::config_flow::data::url%]",
"name": "[%key:common::config_flow::data::url%]" "description": "The filter subscription URL to remove."
} }
}, }
"name": "Remove URL" },
"enable_url": {
"name": "Enable URL",
"description": "Enables a filter subscription in AdGuard Home.",
"fields": {
"url": {
"name": "[%key:common::config_flow::data::url%]",
"description": "The filter subscription URL to enable."
}
}
},
"disable_url": {
"name": "Disable URL",
"description": "Disables a filter subscription in AdGuard Home.",
"fields": {
"url": {
"name": "[%key:common::config_flow::data::url%]",
"description": "The filter subscription URL to disable."
}
}
},
"refresh": {
"name": "Refresh",
"description": "Refreshes all filter subscriptions in AdGuard Home.",
"fields": {
"force": {
"name": "Force",
"description": "Force update (bypasses AdGuard Home throttling), omit for a regular refresh."
}
}
} }
} }
} }

View File

@@ -1,22 +1,22 @@
{ {
"services": { "services": {
"write_data_by_name": { "write_data_by_name": {
"name": "Write data by name",
"description": "Write a value to the connected ADS device.", "description": "Write a value to the connected ADS device.",
"fields": { "fields": {
"adstype": {
"description": "The data type of the variable to write to.",
"name": "ADS type"
},
"adsvar": { "adsvar": {
"description": "The name of the variable to write to.", "name": "ADS variable",
"name": "ADS variable" "description": "The name of the variable to write to."
},
"adstype": {
"name": "ADS type",
"description": "The data type of the variable to write to."
}, },
"value": { "value": {
"description": "The value to write to the variable.", "name": "Value",
"name": "Value" "description": "The value to write to the variable."
} }
}, }
"name": "Write data by name"
} }
} }
} }

View File

@@ -1,11 +1,11 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
}, },
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
@@ -19,14 +19,14 @@
}, },
"services": { "services": {
"set_time_to": { "set_time_to": {
"name": "Set time to",
"description": "Controls timers to turn the system on or off after a set number of minutes.", "description": "Controls timers to turn the system on or off after a set number of minutes.",
"fields": { "fields": {
"minutes": { "minutes": {
"description": "Minutes until action.", "name": "Minutes",
"name": "Minutes" "description": "Minutes until action."
} }
}, }
"name": "Set time to"
} }
} }
} }

View File

@@ -1,57 +1,57 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
"api_key": "[%key:common::config_flow::data::api_key%]" "api_key": "[%key:common::config_flow::data::api_key%]"
} }
} }
} },
}, "error": {
"issues": { "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
"deprecated_yaml_import_issue_cannot_connect": { },
"description": "Configuring {integration_title} using YAML is being removed but there was a connection error importing your YAML configuration.\n\nEnsure connection to {integration_title} works and restart Home Assistant to try again or remove the {integration_title} YAML configuration from your configuration.yaml file and continue to [set up the integration]({url}) manually.", "abort": {
"title": "The {integration_title} YAML configuration import failed" "already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
} }
}, },
"services": { "services": {
"add_tracking": { "add_tracking": {
"name": "Add tracking",
"description": "Adds a new tracking number to Aftership.", "description": "Adds a new tracking number to Aftership.",
"fields": { "fields": {
"slug": { "tracking_number": {
"description": "Slug (carrier) of the new tracking.", "name": "Tracking number",
"name": "Slug" "description": "Tracking number for the new tracking."
}, },
"title": { "title": {
"description": "A custom title for the new tracking.", "name": "Title",
"name": "Title" "description": "A custom title for the new tracking."
}, },
"tracking_number": { "slug": {
"description": "Tracking number for the new tracking.", "name": "Slug",
"name": "Tracking number" "description": "Slug (carrier) of the new tracking."
} }
}, }
"name": "Add tracking"
}, },
"remove_tracking": { "remove_tracking": {
"name": "Remove tracking",
"description": "Removes a tracking number from Aftership.", "description": "Removes a tracking number from Aftership.",
"fields": { "fields": {
"slug": {
"description": "Slug (carrier) of the tracking to remove.",
"name": "[%key:component::aftership::services::add_tracking::fields::slug::name%]"
},
"tracking_number": { "tracking_number": {
"description": "Tracking number of the tracking to remove.", "name": "[%key:component::aftership::services::add_tracking::fields::tracking_number::name%]",
"name": "[%key:component::aftership::services::add_tracking::fields::tracking_number::name%]" "description": "Tracking number of the tracking to remove."
},
"slug": {
"name": "[%key:component::aftership::services::add_tracking::fields::slug::name%]",
"description": "Slug (carrier) of the tracking to remove."
} }
}, }
"name": "Remove tracking" }
},
"issues": {
"deprecated_yaml_import_issue_cannot_connect": {
"title": "The {integration_title} YAML configuration import failed",
"description": "Configuring {integration_title} using YAML is being removed but there was a connection error importing your YAML configuration.\n\nEnsure connection to {integration_title} works and restart Home Assistant to try again or remove the {integration_title} YAML configuration from your configuration.yaml file and continue to [set up the integration]({url}) manually."
} }
} }
} }

View File

@@ -1,19 +1,19 @@
{ {
"services": { "services": {
"disable_alerts": {
"service": "mdi:bell-off"
},
"enable_alerts": {
"service": "mdi:bell-alert"
},
"snapshot": {
"service": "mdi:camera"
},
"start_recording": { "start_recording": {
"service": "mdi:record-rec" "service": "mdi:record-rec"
}, },
"stop_recording": { "stop_recording": {
"service": "mdi:stop" "service": "mdi:stop"
},
"enable_alerts": {
"service": "mdi:bell-alert"
},
"disable_alerts": {
"service": "mdi:bell-off"
},
"snapshot": {
"service": "mdi:camera"
} }
} }
} }

View File

@@ -1,45 +1,45 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": {
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"step": { "step": {
"user": { "user": {
"title": "Set up Agent DVR",
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]", "host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]" "port": "[%key:common::config_flow::data::port%]"
}, },
"data_description": { "data_description": {
"host": "The IP address of the Agent DVR server." "host": "The IP address of the Agent DVR server."
}, }
"title": "Set up Agent DVR"
} }
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": {
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
} }
}, },
"services": { "services": {
"disable_alerts": {
"description": "Disables alerts.",
"name": "Disable alerts"
},
"enable_alerts": {
"description": "Enables alerts.",
"name": "Enable alerts"
},
"snapshot": {
"description": "Takes a photo.",
"name": "Snapshot"
},
"start_recording": { "start_recording": {
"description": "Enables continuous recording.", "name": "Start recording",
"name": "Start recording" "description": "Enables continuous recording."
}, },
"stop_recording": { "stop_recording": {
"description": "Disables continuous recording.", "name": "Stop recording",
"name": "Stop recording" "description": "Disables continuous recording."
},
"enable_alerts": {
"name": "Enable alerts",
"description": "Enables alerts."
},
"disable_alerts": {
"name": "Disable alerts",
"description": "Disables alerts."
},
"snapshot": {
"name": "Snapshot",
"description": "Takes a photo."
} }
} }
} }

View File

@@ -53,6 +53,9 @@ __all__ = [
"GenImageTaskResult", "GenImageTaskResult",
"async_generate_data", "async_generate_data",
"async_generate_image", "async_generate_image",
"async_setup",
"async_setup_entry",
"async_unload_entry",
] ]
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@@ -1,52 +1,52 @@
{ {
"services": { "services": {
"generate_data": { "generate_data": {
"name": "Generate data",
"description": "Uses AI to run a task that generates data.", "description": "Uses AI to run a task that generates data.",
"fields": { "fields": {
"attachments": { "task_name": {
"description": "List of files to attach for multi-modal AI analysis.", "name": "Task name",
"name": "Attachments" "description": "Name of the task."
},
"entity_id": {
"description": "Entity ID to run the task on. If not provided, the preferred entity will be used.",
"name": "Entity ID"
}, },
"instructions": { "instructions": {
"description": "Instructions on what needs to be done.", "name": "Instructions",
"name": "Instructions" "description": "Instructions on what needs to be done."
},
"entity_id": {
"name": "Entity ID",
"description": "Entity ID to run the task on. If not provided, the preferred entity will be used."
}, },
"structure": { "structure": {
"description": "When set, the AI Task will output fields with this in structure. The structure is a dictionary where the keys are the field names and the values contain a 'description', a 'selector', and an optional 'required' field.", "name": "Structured output",
"name": "Structured output" "description": "When set, the AI Task will output fields with this in structure. The structure is a dictionary where the keys are the field names and the values contain a 'description', a 'selector', and an optional 'required' field."
}, },
"task_name": { "attachments": {
"description": "Name of the task.", "name": "Attachments",
"name": "Task name" "description": "List of files to attach for multi-modal AI analysis."
} }
}, }
"name": "Generate data"
}, },
"generate_image": { "generate_image": {
"name": "Generate image",
"description": "Uses AI to generate image.", "description": "Uses AI to generate image.",
"fields": { "fields": {
"attachments": { "task_name": {
"description": "List of files to attach for using as references.", "name": "Task name",
"name": "Attachments" "description": "Name of the task."
},
"entity_id": {
"description": "Entity ID to run the task on.",
"name": "Entity ID"
}, },
"instructions": { "instructions": {
"description": "Instructions that explains the image to be generated.", "name": "Instructions",
"name": "Instructions" "description": "Instructions that explains the image to be generated."
}, },
"task_name": { "entity_id": {
"description": "Name of the task.", "name": "Entity ID",
"name": "Task name" "description": "Entity ID to run the task on."
},
"attachments": {
"name": "Attachments",
"description": "List of files to attach for using as references."
} }
}, }
"name": "Generate image"
} }
} }
} }

View File

@@ -9,17 +9,14 @@
} }
}, },
"number": { "number": {
"display_brightness": { "led_bar_brightness": {
"default": "mdi:brightness-percent" "default": "mdi:brightness-percent"
}, },
"led_bar_brightness": { "display_brightness": {
"default": "mdi:brightness-percent" "default": "mdi:brightness-percent"
} }
}, },
"select": { "select": {
"co2_automatic_baseline_calibration": {
"default": "mdi:molecule-co2"
},
"configuration_control": { "configuration_control": {
"default": "mdi:cloud-cog" "default": "mdi:cloud-cog"
}, },
@@ -34,11 +31,23 @@
}, },
"voc_index_learning_time_offset": { "voc_index_learning_time_offset": {
"default": "mdi:clock-outline" "default": "mdi:clock-outline"
},
"co2_automatic_baseline_calibration": {
"default": "mdi:molecule-co2"
} }
}, },
"sensor": { "sensor": {
"co2_automatic_baseline_calibration": { "total_volatile_organic_component_index": {
"default": "mdi:molecule-co2" "default": "mdi:molecule"
},
"nitrogen_index": {
"default": "mdi:molecule"
},
"pm003_count": {
"default": "mdi:blur"
},
"led_bar_brightness": {
"default": "mdi:brightness-percent"
}, },
"display_brightness": { "display_brightness": {
"default": "mdi:brightness-percent" "default": "mdi:brightness-percent"
@@ -46,26 +55,17 @@
"display_temperature_unit": { "display_temperature_unit": {
"default": "mdi:thermometer-lines" "default": "mdi:thermometer-lines"
}, },
"led_bar_brightness": {
"default": "mdi:brightness-percent"
},
"led_bar_mode": { "led_bar_mode": {
"default": "mdi:led-strip" "default": "mdi:led-strip"
}, },
"nitrogen_index": {
"default": "mdi:molecule"
},
"nox_index_learning_time_offset": { "nox_index_learning_time_offset": {
"default": "mdi:clock-outline" "default": "mdi:clock-outline"
}, },
"pm003_count": {
"default": "mdi:blur"
},
"total_volatile_organic_component_index": {
"default": "mdi:molecule"
},
"voc_index_learning_time_offset": { "voc_index_learning_time_offset": {
"default": "mdi:clock-outline" "default": "mdi:clock-outline"
},
"co2_automatic_baseline_calibration": {
"default": "mdi:molecule-co2"
} }
}, },
"switch": { "switch": {

View File

@@ -1,5 +1,19 @@
{ {
"config": { "config": {
"flow_title": "{model}",
"step": {
"user": {
"data": {
"host": "[%key:common::config_flow::data::host%]"
},
"data_description": {
"host": "The hostname or IP address of the Airgradient device."
}
},
"discovery_confirm": {
"description": "Do you want to set up {model}?"
}
},
"abort": { "abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]", "already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]", "already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
@@ -10,20 +24,6 @@
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
},
"flow_title": "{model}",
"step": {
"discovery_confirm": {
"description": "Do you want to set up {model}?"
},
"user": {
"data": {
"host": "[%key:common::config_flow::data::host%]"
},
"data_description": {
"host": "The hostname or IP address of the Airgradient device."
}
}
} }
}, },
"entity": { "entity": {
@@ -36,25 +36,14 @@
} }
}, },
"number": { "number": {
"display_brightness": {
"name": "Display brightness"
},
"led_bar_brightness": { "led_bar_brightness": {
"name": "LED bar brightness" "name": "LED bar brightness"
},
"display_brightness": {
"name": "Display brightness"
} }
}, },
"select": { "select": {
"co2_automatic_baseline_calibration": {
"name": "CO2 automatic baseline duration",
"state": {
"0": "[%key:common::state::off%]",
"1": "1 day",
"8": "8 days",
"30": "30 days",
"90": "90 days",
"180": "180 days"
}
},
"configuration_control": { "configuration_control": {
"name": "Configuration source", "name": "Configuration source",
"state": { "state": {
@@ -62,13 +51,6 @@
"local": "Local" "local": "Local"
} }
}, },
"display_pm_standard": {
"name": "Display PM standard",
"state": {
"ugm3": "μg/m³",
"us_aqi": "US AQI"
}
},
"display_temperature_unit": { "display_temperature_unit": {
"name": "Display temperature unit", "name": "Display temperature unit",
"state": { "state": {
@@ -76,11 +58,18 @@
"f": "Fahrenheit" "f": "Fahrenheit"
} }
}, },
"display_pm_standard": {
"name": "Display PM standard",
"state": {
"ugm3": "μg/m³",
"us_aqi": "US AQI"
}
},
"led_bar_mode": { "led_bar_mode": {
"name": "LED bar mode", "name": "LED bar mode",
"state": { "state": {
"co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]",
"off": "[%key:common::state::off%]", "off": "[%key:common::state::off%]",
"co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]",
"pm": "Particulate matter" "pm": "Particulate matter"
} }
}, },
@@ -103,14 +92,37 @@
"360": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::state::360%]", "360": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::state::360%]",
"720": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::state::720%]" "720": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::state::720%]"
} }
},
"co2_automatic_baseline_calibration": {
"name": "CO2 automatic baseline duration",
"state": {
"1": "1 day",
"8": "8 days",
"30": "30 days",
"90": "90 days",
"180": "180 days",
"0": "[%key:common::state::off%]"
}
} }
}, },
"sensor": { "sensor": {
"co2_automatic_baseline_calibration_days": { "total_volatile_organic_component_index": {
"name": "Carbon dioxide automatic baseline calibration" "name": "VOC index"
}, },
"display_brightness": { "nitrogen_index": {
"name": "[%key:component::airgradient::entity::number::display_brightness::name%]" "name": "NOx index"
},
"pm003_count": {
"name": "PM0.3"
},
"raw_total_volatile_organic_component": {
"name": "Raw VOC"
},
"raw_nitrogen": {
"name": "Raw NOx"
},
"raw_pm02": {
"name": "Raw PM2.5"
}, },
"display_pm_standard": { "display_pm_standard": {
"name": "[%key:component::airgradient::entity::select::display_pm_standard::name%]", "name": "[%key:component::airgradient::entity::select::display_pm_standard::name%]",
@@ -119,6 +131,26 @@
"us_aqi": "[%key:component::airgradient::entity::select::display_pm_standard::state::us_aqi%]" "us_aqi": "[%key:component::airgradient::entity::select::display_pm_standard::state::us_aqi%]"
} }
}, },
"co2_automatic_baseline_calibration_days": {
"name": "Carbon dioxide automatic baseline calibration"
},
"nox_learning_offset": {
"name": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::name%]"
},
"tvoc_learning_offset": {
"name": "[%key:component::airgradient::entity::select::voc_index_learning_time_offset::name%]"
},
"led_bar_mode": {
"name": "[%key:component::airgradient::entity::select::led_bar_mode::name%]",
"state": {
"off": "[%key:common::state::off%]",
"co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]",
"pm": "[%key:component::airgradient::entity::select::led_bar_mode::state::pm%]"
}
},
"led_bar_brightness": {
"name": "[%key:component::airgradient::entity::number::led_bar_brightness::name%]"
},
"display_temperature_unit": { "display_temperature_unit": {
"name": "[%key:component::airgradient::entity::select::display_temperature_unit::name%]", "name": "[%key:component::airgradient::entity::select::display_temperature_unit::name%]",
"state": { "state": {
@@ -126,40 +158,8 @@
"f": "[%key:component::airgradient::entity::select::display_temperature_unit::state::f%]" "f": "[%key:component::airgradient::entity::select::display_temperature_unit::state::f%]"
} }
}, },
"led_bar_brightness": { "display_brightness": {
"name": "[%key:component::airgradient::entity::number::led_bar_brightness::name%]" "name": "[%key:component::airgradient::entity::number::display_brightness::name%]"
},
"led_bar_mode": {
"name": "[%key:component::airgradient::entity::select::led_bar_mode::name%]",
"state": {
"co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]",
"off": "[%key:common::state::off%]",
"pm": "[%key:component::airgradient::entity::select::led_bar_mode::state::pm%]"
}
},
"nitrogen_index": {
"name": "NOx index"
},
"nox_learning_offset": {
"name": "[%key:component::airgradient::entity::select::nox_index_learning_time_offset::name%]"
},
"pm003_count": {
"name": "PM0.3"
},
"raw_nitrogen": {
"name": "Raw NOx"
},
"raw_pm02": {
"name": "Raw PM2.5"
},
"raw_total_volatile_organic_component": {
"name": "Raw VOC"
},
"total_volatile_organic_component_index": {
"name": "VOC index"
},
"tvoc_learning_offset": {
"name": "[%key:component::airgradient::entity::select::voc_index_learning_time_offset::name%]"
} }
}, },
"switch": { "switch": {

View File

@@ -1,23 +1,30 @@
{ {
"config": { "config": {
"step": {
"user": {
"description": "To generate API key go to {developer_registration_url}",
"data": {
"name": "[%key:common::config_flow::data::name%]",
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]",
"longitude": "[%key:common::config_flow::data::longitude%]"
}
}
},
"error": {
"wrong_location": "No Airly measuring stations in this area.",
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]"
},
"abort": { "abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_location%]", "already_configured": "[%key:common::config_flow::abort::already_configured_location%]",
"wrong_location": "[%key:component::airly::config::error::wrong_location%]" "wrong_location": "[%key:component::airly::config::error::wrong_location%]"
}, }
"error": { },
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]", "system_health": {
"wrong_location": "No Airly measuring stations in this area." "info": {
}, "can_reach_server": "Reach Airly server",
"step": { "requests_remaining": "Remaining allowed requests",
"user": { "requests_per_day": "Allowed requests per day"
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]",
"longitude": "[%key:common::config_flow::data::longitude%]",
"name": "[%key:common::config_flow::data::name%]"
},
"description": "To generate API key go to {developer_registration_url}"
}
} }
}, },
"entity": { "entity": {
@@ -31,18 +38,11 @@
} }
}, },
"exceptions": { "exceptions": {
"no_station": {
"message": "An error occurred while retrieving data from the Airly API for {entry}: no measuring stations in this area"
},
"update_error": { "update_error": {
"message": "An error occurred while retrieving data from the Airly API for {entry}: {error}" "message": "An error occurred while retrieving data from the Airly API for {entry}: {error}"
} },
}, "no_station": {
"system_health": { "message": "An error occurred while retrieving data from the Airly API for {entry}: no measuring stations in this area"
"info": {
"can_reach_server": "Reach Airly server",
"requests_per_day": "Allowed requests per day",
"requests_remaining": "Remaining allowed requests"
} }
} }
} }

View File

@@ -26,10 +26,6 @@ from .const import DOMAIN
_LOGGER = logging.getLogger(__name__) _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: async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> bool:
"""Validate the user input allows us to connect. """Validate the user input allows us to connect.
@@ -118,7 +114,6 @@ class AirNowConfigFlow(ConfigFlow, domain=DOMAIN):
), ),
} }
), ),
description_placeholders={"api_key_url": _API_KEY_URL},
errors=errors, errors=errors,
) )

View File

@@ -4,15 +4,15 @@
"aqi": { "aqi": {
"default": "mdi:blur" "default": "mdi:blur"
}, },
"o3": {
"default": "mdi:blur"
},
"pm10": { "pm10": {
"default": "mdi:blur" "default": "mdi:blur"
}, },
"pm25": { "pm25": {
"default": "mdi:blur" "default": "mdi:blur"
}, },
"o3": {
"default": "mdi:blur"
},
"station": { "station": {
"default": "mdi:blur" "default": "mdi:blur"
} }

View File

@@ -1,7 +1,15 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]" "user": {
"description": "To generate API key go to https://docs.airnowapi.org/account/request/",
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]",
"longitude": "[%key:common::config_flow::data::longitude%]",
"radius": "Station radius (miles; optional)"
}
}
}, },
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
@@ -9,15 +17,16 @@
"invalid_location": "No results found for that location, try changing the location or station radius.", "invalid_location": "No results found for that location, try changing the location or station radius.",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
}, },
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
}
},
"options": {
"step": { "step": {
"user": { "init": {
"data": { "data": {
"api_key": "[%key:common::config_flow::data::api_key%]", "radius": "Station radius (miles)"
"latitude": "[%key:common::config_flow::data::latitude%]", }
"longitude": "[%key:common::config_flow::data::longitude%]",
"radius": "Station radius (miles; optional)"
},
"description": "To generate API key go to {api_key_url}"
} }
} }
}, },
@@ -34,14 +43,5 @@
} }
} }
} }
},
"options": {
"step": {
"init": {
"data": {
"radius": "Station radius (miles)"
}
}
}
} }
} }

View File

@@ -7,5 +7,5 @@
"integration_type": "device", "integration_type": "device",
"iot_class": "local_polling", "iot_class": "local_polling",
"quality_scale": "silver", "quality_scale": "silver",
"requirements": ["airos==0.6.0"] "requirements": ["airos==0.5.6"]
} }

View File

@@ -1,17 +1,5 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
"unique_id_mismatch": "Re-authentication should be used for the same device not a new one"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"key_data_missing": "Expected data not returned from the device, check the documentation for supported devices",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"flow_title": "Ubiquiti airOS device", "flow_title": "Ubiquiti airOS device",
"step": { "step": {
"reauth_confirm": { "reauth_confirm": {
@@ -31,6 +19,7 @@
}, },
"sections": { "sections": {
"advanced_settings": { "advanced_settings": {
"name": "[%key:component::airos::config::step::user::sections::advanced_settings::name%]",
"data": { "data": {
"ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data::ssl%]", "ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data::ssl%]",
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]" "verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
@@ -38,24 +27,24 @@
"data_description": { "data_description": {
"ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data_description::ssl%]", "ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data_description::ssl%]",
"verify_ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data_description::verify_ssl%]" "verify_ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data_description::verify_ssl%]"
}, }
"name": "[%key:component::airos::config::step::user::sections::advanced_settings::name%]"
} }
} }
}, },
"user": { "user": {
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]", "host": "[%key:common::config_flow::data::host%]",
"password": "[%key:common::config_flow::data::password%]", "username": "[%key:common::config_flow::data::username%]",
"username": "[%key:common::config_flow::data::username%]" "password": "[%key:common::config_flow::data::password%]"
}, },
"data_description": { "data_description": {
"host": "IP address or hostname of the airOS device", "host": "IP address or hostname of the airOS device",
"password": "Password configured through the UISP app or web interface", "username": "Administrator username for the airOS device, normally 'ubnt'",
"username": "Administrator username for the airOS device, normally 'ubnt'" "password": "Password configured through the UISP app or web interface"
}, },
"sections": { "sections": {
"advanced_settings": { "advanced_settings": {
"name": "Advanced settings",
"data": { "data": {
"ssl": "Use HTTPS", "ssl": "Use HTTPS",
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]" "verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
@@ -63,17 +52,28 @@
"data_description": { "data_description": {
"ssl": "Whether the connection should be encrypted (required for most devices)", "ssl": "Whether the connection should be encrypted (required for most devices)",
"verify_ssl": "Whether the certificate should be verified when using HTTPS. This should be off for self-signed certificates" "verify_ssl": "Whether the certificate should be verified when using HTTPS. This should be off for self-signed certificates"
}, }
"name": "Advanced settings"
} }
} }
} }
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"key_data_missing": "Expected data not returned from the device, check the documentation for supported devices",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
"unique_id_mismatch": "Re-authentication should be used for the same device not a new one"
} }
}, },
"entity": { "entity": {
"binary_sensor": { "binary_sensor": {
"dhcp6_server": { "port_forwarding": {
"name": "DHCPv6 server" "name": "Port forwarding"
}, },
"dhcp_client": { "dhcp_client": {
"name": "DHCP client" "name": "DHCP client"
@@ -81,8 +81,8 @@
"dhcp_server": { "dhcp_server": {
"name": "DHCP server" "name": "DHCP server"
}, },
"port_forwarding": { "dhcp6_server": {
"name": "Port forwarding" "name": "DHCPv6 server"
}, },
"pppoe": { "pppoe": {
"name": "PPPoE link" "name": "PPPoE link"
@@ -99,27 +99,20 @@
"router": "Router" "router": "Router"
} }
}, },
"host_uptime": { "wireless_frequency": {
"name": "Uptime" "name": "Wireless frequency"
},
"wireless_antenna_gain": {
"name": "Antenna gain"
},
"wireless_distance": {
"name": "Wireless distance"
}, },
"wireless_essid": { "wireless_essid": {
"name": "Wireless SSID" "name": "Wireless SSID"
}, },
"wireless_frequency": { "wireless_antenna_gain": {
"name": "Wireless frequency" "name": "Antenna gain"
}, },
"wireless_mode": { "wireless_throughput_tx": {
"name": "Wireless mode", "name": "Throughput transmit (actual)"
"state": { },
"point_to_multipoint": "Point-to-multipoint", "wireless_throughput_rx": {
"point_to_point": "Point-to-point" "name": "Throughput receive (actual)"
}
}, },
"wireless_polling_dl_capacity": { "wireless_polling_dl_capacity": {
"name": "Download capacity" "name": "Download capacity"
@@ -130,6 +123,12 @@
"wireless_remote_hostname": { "wireless_remote_hostname": {
"name": "Remote hostname" "name": "Remote hostname"
}, },
"host_uptime": {
"name": "Uptime"
},
"wireless_distance": {
"name": "Wireless distance"
},
"wireless_role": { "wireless_role": {
"name": "Wireless role", "name": "Wireless role",
"state": { "state": {
@@ -137,26 +136,27 @@
"station": "Station" "station": "Station"
} }
}, },
"wireless_throughput_rx": { "wireless_mode": {
"name": "Throughput receive (actual)" "name": "Wireless mode",
}, "state": {
"wireless_throughput_tx": { "point_to_point": "Point-to-point",
"name": "Throughput transmit (actual)" "point_to_multipoint": "Point-to-multipoint"
}
} }
} }
}, },
"exceptions": { "exceptions": {
"cannot_connect": {
"message": "[%key:common::config_flow::error::cannot_connect%]"
},
"error_data_missing": {
"message": "Data incomplete or missing"
},
"invalid_auth": { "invalid_auth": {
"message": "[%key:common::config_flow::error::invalid_auth%]" "message": "[%key:common::config_flow::error::invalid_auth%]"
}, },
"cannot_connect": {
"message": "[%key:common::config_flow::error::cannot_connect%]"
},
"key_data_missing": { "key_data_missing": {
"message": "Key data not returned from device" "message": "Key data not returned from device"
},
"error_data_missing": {
"message": "Data incomplete or missing"
} }
} }
} }

View File

@@ -1,21 +1,36 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]" "user": {
"title": "Identify the device",
"description": "Provide the IP address or mDNS of the device and its password",
"data": {
"ip_address": "[%key:common::config_flow::data::ip%]",
"password": "[%key:common::config_flow::data::password%]"
}
}
}, },
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"invalid_input": "[%key:common::config_flow::error::invalid_host%]" "invalid_input": "[%key:common::config_flow::error::invalid_host%]"
}, },
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
}
},
"options": {
"step": { "step": {
"user": { "init": {
"title": "Configure air-Q integration",
"data": { "data": {
"ip_address": "[%key:common::config_flow::data::ip%]", "return_average": "Show values averaged by the device",
"password": "[%key:common::config_flow::data::password%]" "clip_negatives": "Clip negative values"
}, },
"description": "Provide the IP address or mDNS of the device and its password", "data_description": {
"title": "Identify the device" "return_average": "air-Q allows to poll both the noisy sensor readings as well as the values averaged on the device (default)",
"clip_negatives": "For baseline calibration purposes, certain sensor values may briefly become negative. The default behavior is to clip such values to 0"
}
} }
} }
}, },
@@ -38,11 +53,8 @@
"bromine": { "bromine": {
"name": "Bromine" "name": "Bromine"
}, },
"carbon_disulfide": { "methanethiol": {
"name": "Carbon disulfide" "name": "Methanethiol"
},
"carbon_monoxide": {
"name": "[%key:component::sensor::entity_component::carbon_monoxide::name%]"
}, },
"chlorine": { "chlorine": {
"name": "Chlorine" "name": "Chlorine"
@@ -50,6 +62,12 @@
"chlorine_dioxide": { "chlorine_dioxide": {
"name": "Chlorine dioxide" "name": "Chlorine dioxide"
}, },
"carbon_disulfide": {
"name": "Carbon disulfide"
},
"carbon_monoxide": {
"name": "[%key:component::sensor::entity_component::carbon_monoxide::name%]"
},
"dew_point": { "dew_point": {
"name": "Dew point" "name": "Dew point"
}, },
@@ -59,51 +77,36 @@
"ethylene": { "ethylene": {
"name": "Ethylene" "name": "Ethylene"
}, },
"fluorine": {
"name": "Fluorine"
},
"formaldehyde": { "formaldehyde": {
"name": "Formaldehyde" "name": "Formaldehyde"
}, },
"health_index": { "fluorine": {
"name": "Health index" "name": "Fluorine"
},
"hydrogen_sulfide": {
"name": "Hydrogen sulfide"
}, },
"hydrochloric_acid": { "hydrochloric_acid": {
"name": "Hydrochloric acid" "name": "Hydrochloric acid"
}, },
"hydrogen": {
"name": "Hydrogen"
},
"hydrogen_cyanide": { "hydrogen_cyanide": {
"name": "Hydrogen cyanide" "name": "Hydrogen cyanide"
}, },
"hydrogen_fluoride": { "hydrogen_fluoride": {
"name": "Hydrogen fluoride" "name": "Hydrogen fluoride"
}, },
"health_index": {
"name": "Health index"
},
"hydrogen": {
"name": "Hydrogen"
},
"hydrogen_peroxide": { "hydrogen_peroxide": {
"name": "Hydrogen peroxide" "name": "Hydrogen peroxide"
}, },
"hydrogen_phosphide": {
"name": "Hydrogen phosphide"
},
"hydrogen_sulfide": {
"name": "Hydrogen sulfide"
},
"industrial_volatile_organic_compounds": {
"name": "VOCs (industrial)"
},
"maximum_noise": {
"name": "Noise (maximum)"
},
"methane": { "methane": {
"name": "Methane" "name": "Methane"
}, },
"methanethiol": {
"name": "Methanethiol"
},
"noise": {
"name": "Noise"
},
"organic_acid": { "organic_acid": {
"name": "Organic acid" "name": "Organic acid"
}, },
@@ -113,39 +116,36 @@
"performance_index": { "performance_index": {
"name": "Performance index" "name": "Performance index"
}, },
"propane": { "hydrogen_phosphide": {
"name": "Propane" "name": "Hydrogen phosphide"
},
"radon": {
"name": "Radon"
},
"refigerant": {
"name": "Refrigerant"
}, },
"relative_pressure": { "relative_pressure": {
"name": "Relative pressure" "name": "Relative pressure"
}, },
"propane": {
"name": "Propane"
},
"refigerant": {
"name": "Refrigerant"
},
"silicon_hydride": { "silicon_hydride": {
"name": "Silicon hydride" "name": "Silicon hydride"
}, },
"noise": {
"name": "Noise"
},
"maximum_noise": {
"name": "Noise (maximum)"
},
"radon": {
"name": "Radon"
},
"industrial_volatile_organic_compounds": {
"name": "VOCs (industrial)"
},
"virus_index": { "virus_index": {
"name": "Virus index" "name": "Virus index"
} }
} }
},
"options": {
"step": {
"init": {
"data": {
"clip_negatives": "Clip negative values",
"return_average": "Show values averaged by the device"
},
"data_description": {
"clip_negatives": "For baseline calibration purposes, certain sensor values may briefly become negative. The default behavior is to clip such values to 0",
"return_average": "air-Q allows to poll both the noisy sensor readings as well as the values averaged on the device (default)"
},
"title": "Configure air-Q integration"
}
}
} }
} }

View File

@@ -1,13 +1,5 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
@@ -16,21 +8,29 @@
}, },
"description": "Log in at {url} to find your credentials" "description": "Log in at {url} to find your credentials"
} }
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]"
} }
}, },
"entity": { "entity": {
"sensor": { "sensor": {
"light": {
"name": "Light"
},
"mold": {
"name": "Mold"
},
"radon": { "radon": {
"name": "Radon" "name": "Radon"
}, },
"light": {
"name": "Light"
},
"virus_risk": { "virus_risk": {
"name": "Virus Risk" "name": "Virus Risk"
},
"mold": {
"name": "Mold"
} }
} }
} }

View File

@@ -4,10 +4,10 @@
"radon_1day_avg": { "radon_1day_avg": {
"default": "mdi:radioactive" "default": "mdi:radioactive"
}, },
"radon_1day_level": { "radon_longterm_avg": {
"default": "mdi:radioactive" "default": "mdi:radioactive"
}, },
"radon_longterm_avg": { "radon_1day_level": {
"default": "mdi:radioactive" "default": "mdi:radioactive"
}, },
"radon_longterm_level": { "radon_longterm_level": {

View File

@@ -1,49 +1,49 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"firmware_upgrade_required": "Your device requires a firmware upgrade. Please use the Airthings app (Android/iOS) to upgrade it.",
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
"unknown": "[%key:common::config_flow::error::unknown%]",
"unsupported_device": "Unsupported device"
},
"flow_title": "{name}", "flow_title": "{name}",
"step": { "step": {
"bluetooth_confirm": {
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
},
"user": { "user": {
"description": "[%key:component::bluetooth::config::step::user::description%]",
"data": { "data": {
"address": "[%key:common::config_flow::data::device%]" "address": "[%key:common::config_flow::data::device%]"
}, },
"data_description": { "data_description": {
"address": "The Airthings devices discovered via Bluetooth." "address": "The Airthings devices discovered via Bluetooth."
}, }
"description": "[%key:component::bluetooth::config::step::user::description%]" },
"bluetooth_confirm": {
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
} }
},
"abort": {
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"firmware_upgrade_required": "Your device requires a firmware upgrade. Please use the Airthings app (Android/iOS) to upgrade it.",
"unsupported_device": "Unsupported device",
"unknown": "[%key:common::config_flow::error::unknown%]"
} }
}, },
"entity": { "entity": {
"sensor": { "sensor": {
"ambient_noise": {
"name": "Ambient noise"
},
"illuminance": {
"name": "[%key:component::sensor::entity_component::illuminance::name%]"
},
"radon_1day_avg": { "radon_1day_avg": {
"name": "Radon 1-day average" "name": "Radon 1-day average"
}, },
"radon_1day_level": {
"name": "Radon 1-day level"
},
"radon_longterm_avg": { "radon_longterm_avg": {
"name": "Radon longterm average" "name": "Radon longterm average"
}, },
"radon_1day_level": {
"name": "Radon 1-day level"
},
"radon_longterm_level": { "radon_longterm_level": {
"name": "Radon longterm level" "name": "Radon longterm level"
},
"illuminance": {
"name": "[%key:component::sensor::entity_component::illuminance::name%]"
},
"ambient_noise": {
"name": "Ambient noise"
} }
} }
} }

View File

@@ -9,13 +9,13 @@
}, },
"step": { "step": {
"user": { "user": {
"title": "Set up your AirTouch 4 connection details.",
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]" "host": "[%key:common::config_flow::data::host%]"
}, },
"data_description": { "data_description": {
"host": "The hostname or IP address of your AirTouch controller." "host": "The hostname or IP address of your AirTouch controller."
}, }
"title": "Set up your AirTouch 4 connection details."
} }
} }
} }

View File

@@ -1,18 +1,18 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]" "host": "[%key:common::config_flow::data::host%]"
} }
} }
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
} }
}, },
"entity": { "entity": {
@@ -21,8 +21,8 @@
"state_attributes": { "state_attributes": {
"fan_mode": { "fan_mode": {
"state": { "state": {
"intelligent_auto": "Intelligent Auto", "turbo": "Turbo",
"turbo": "Turbo" "intelligent_auto": "Intelligent Auto"
} }
} }
} }

View File

@@ -1,11 +1,11 @@
{ {
"entity": { "entity": {
"sensor": { "sensor": {
"pollutant_label": {
"default": "mdi:chemical-weapon"
},
"pollutant_level": { "pollutant_level": {
"default": "mdi:gauge" "default": "mdi:gauge"
},
"pollutant_label": {
"default": "mdi:chemical-weapon"
} }
} }
} }

View File

@@ -1,44 +1,54 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_location%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]",
"location_not_found": "Location not found",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"step": { "step": {
"geography_by_coords": { "geography_by_coords": {
"title": "Configure a geography",
"description": "Use the AirVisual cloud API to monitor a latitude/longitude.",
"data": { "data": {
"api_key": "[%key:common::config_flow::data::api_key%]", "api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]", "latitude": "[%key:common::config_flow::data::latitude%]",
"longitude": "[%key:common::config_flow::data::longitude%]" "longitude": "[%key:common::config_flow::data::longitude%]"
}, }
"description": "Use the AirVisual cloud API to monitor a latitude/longitude.",
"title": "Configure a geography"
}, },
"geography_by_name": { "geography_by_name": {
"title": "[%key:component::airvisual::config::step::geography_by_coords::title%]",
"description": "Use the AirVisual cloud API to monitor a city/state/country.",
"data": { "data": {
"api_key": "[%key:common::config_flow::data::api_key%]", "api_key": "[%key:common::config_flow::data::api_key%]",
"city": "City", "city": "City",
"country": "[%key:common::config_flow::data::country%]", "state": "State",
"state": "State" "country": "[%key:common::config_flow::data::country%]"
}, }
"description": "Use the AirVisual cloud API to monitor a city/state/country.",
"title": "[%key:component::airvisual::config::step::geography_by_coords::title%]"
}, },
"reauth_confirm": { "reauth_confirm": {
"title": "Re-authenticate AirVisual",
"data": { "data": {
"api_key": "[%key:common::config_flow::data::api_key%]" "api_key": "[%key:common::config_flow::data::api_key%]"
}, }
"title": "Re-authenticate AirVisual"
}, },
"user": { "user": {
"description": "Pick what type of AirVisual data you want to monitor.", "title": "Configure AirVisual",
"title": "Configure AirVisual" "description": "Pick what type of AirVisual data you want to monitor."
}
},
"error": {
"unknown": "[%key:common::config_flow::error::unknown%]",
"invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]",
"location_not_found": "Location not found",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_location%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
}
},
"options": {
"step": {
"init": {
"title": "[%key:component::airvisual::config::step::user::title%]",
"data": {
"show_on_map": "Show monitored geography on the map"
}
} }
} }
}, },
@@ -57,29 +67,19 @@
"pollutant_level": { "pollutant_level": {
"state": { "state": {
"good": "Good", "good": "Good",
"hazardous": "Hazardous",
"moderate": "Moderate", "moderate": "Moderate",
"unhealthy": "Unhealthy", "unhealthy": "Unhealthy",
"unhealthy_sensitive": "Unhealthy for sensitive groups", "unhealthy_sensitive": "Unhealthy for sensitive groups",
"very_unhealthy": "Very unhealthy" "very_unhealthy": "Very unhealthy",
"hazardous": "Hazardous"
} }
} }
} }
}, },
"issues": { "issues": {
"airvisual_pro_migration": { "airvisual_pro_migration": {
"description": "AirVisual Pro units are now their own Home Assistant integration (as opposed to be included with the original AirVisual integration that uses the AirVisual cloud API). The Pro device located at `{ip_address}` has automatically been migrated.\n\nAs part of that migration, the Pro's device ID has changed from `{old_device_id}` to `{new_device_id}`. Please update these automations to use the new device ID: {device_automations_string}.", "title": "{ip_address} is now part of the AirVisual Pro integration",
"title": "{ip_address} is now part of the AirVisual Pro integration" "description": "AirVisual Pro units are now their own Home Assistant integration (as opposed to be included with the original AirVisual integration that uses the AirVisual cloud API). The Pro device located at `{ip_address}` has automatically been migrated.\n\nAs part of that migration, the Pro's device ID has changed from `{old_device_id}` to `{new_device_id}`. Please update these automations to use the new device ID: {device_automations_string}."
}
},
"options": {
"step": {
"init": {
"data": {
"show_on_map": "Show monitored geography on the map"
},
"title": "[%key:component::airvisual::config::step::user::title%]"
}
} }
} }
} }

View File

@@ -1,40 +1,40 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"step": { "step": {
"reauth_confirm": { "reauth_confirm": {
"description": "[%key:component::airvisual_pro::config::step::user::description%]",
"data": { "data": {
"password": "[%key:common::config_flow::data::password%]" "password": "[%key:common::config_flow::data::password%]"
}, }
"description": "[%key:component::airvisual_pro::config::step::user::description%]"
}, },
"user": { "user": {
"description": "The password can be retrieved from the AirVisual Pro's UI.",
"data": { "data": {
"ip_address": "[%key:common::config_flow::data::host%]", "ip_address": "[%key:common::config_flow::data::host%]",
"password": "[%key:common::config_flow::data::password%]" "password": "[%key:common::config_flow::data::password%]"
}, },
"data_description": { "data_description": {
"ip_address": "The hostname or IP address of your AirVisual Pro device." "ip_address": "The hostname or IP address of your AirVisual Pro device."
}, }
"description": "The password can be retrieved from the AirVisual Pro's UI."
} }
},
"error": {
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
} }
}, },
"entity": { "entity": {
"sensor": { "sensor": {
"outdoor_air_quality_index": {
"name": "Outdoor air quality index"
},
"pm01": { "pm01": {
"name": "PM0.1" "name": "PM0.1"
},
"outdoor_air_quality_index": {
"name": "Outdoor air quality index"
} }
} }
} }

View File

@@ -11,5 +11,5 @@
"documentation": "https://www.home-assistant.io/integrations/airzone", "documentation": "https://www.home-assistant.io/integrations/airzone",
"iot_class": "local_polling", "iot_class": "local_polling",
"loggers": ["aioairzone"], "loggers": ["aioairzone"],
"requirements": ["aioairzone==1.0.2"] "requirements": ["aioairzone==1.0.1"]
} }

View File

@@ -10,15 +10,15 @@
"step": { "step": {
"discovered_connection": { "discovered_connection": {
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]",
"id": "[%key:component::airzone::config::step::user::data::id%]", "id": "[%key:component::airzone::config::step::user::data::id%]",
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]" "port": "[%key:common::config_flow::data::port%]"
} }
}, },
"user": { "user": {
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]",
"id": "System ID", "id": "System ID",
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]" "port": "[%key:common::config_flow::data::port%]"
} }
} }
@@ -37,19 +37,19 @@
"grille_angles": { "grille_angles": {
"name": "Cold angle", "name": "Cold angle",
"state": { "state": {
"40deg": "40°", "90deg": "90°",
"45deg": "45°",
"50deg": "50°", "50deg": "50°",
"90deg": "90°" "45deg": "45°",
"40deg": "40°"
} }
}, },
"heat_angles": { "heat_angles": {
"name": "Heat angle", "name": "Heat angle",
"state": { "state": {
"40deg": "[%key:component::airzone::entity::select::grille_angles::state::40deg%]", "90deg": "[%key:component::airzone::entity::select::grille_angles::state::90deg%]",
"45deg": "[%key:component::airzone::entity::select::grille_angles::state::45deg%]",
"50deg": "[%key:component::airzone::entity::select::grille_angles::state::50deg%]", "50deg": "[%key:component::airzone::entity::select::grille_angles::state::50deg%]",
"90deg": "[%key:component::airzone::entity::select::grille_angles::state::90deg%]" "45deg": "[%key:component::airzone::entity::select::grille_angles::state::45deg%]",
"40deg": "[%key:component::airzone::entity::select::grille_angles::state::40deg%]"
} }
}, },
"modes": { "modes": {
@@ -66,20 +66,20 @@
"q_adapt": { "q_adapt": {
"name": "Q-Adapt", "name": "Q-Adapt",
"state": { "state": {
"maximum": "Maximum", "standard": "Standard",
"minimum": "Minimum",
"power": "Power", "power": "Power",
"silence": "Silence", "silence": "Silence",
"standard": "Standard" "minimum": "Minimum",
"maximum": "Maximum"
} }
}, },
"sleep_times": { "sleep_times": {
"name": "Sleep", "name": "Sleep",
"state": { "state": {
"off": "[%key:common::state::off%]",
"30m": "30 minutes", "30m": "30 minutes",
"60m": "60 minutes", "60m": "60 minutes",
"90m": "90 minutes", "90m": "90 minutes"
"off": "[%key:common::state::off%]"
} }
} }
}, },

View File

@@ -10,8 +10,8 @@
"user": { "user": {
"data": { "data": {
"id": "Installation", "id": "Installation",
"password": "[%key:common::config_flow::data::password%]", "username": "[%key:common::config_flow::data::username%]",
"username": "[%key:common::config_flow::data::username%]" "password": "[%key:common::config_flow::data::password%]"
} }
} }
} }
@@ -32,9 +32,9 @@
"air_quality": { "air_quality": {
"name": "Air Quality mode", "name": "Air Quality mode",
"state": { "state": {
"auto": "[%key:common::state::auto%]",
"off": "[%key:common::state::off%]", "off": "[%key:common::state::off%]",
"on": "[%key:common::state::on%]" "on": "[%key:common::state::on%]",
"auto": "[%key:common::state::auto%]"
} }
}, },
"modes": { "modes": {

View File

@@ -1,34 +1,34 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
"authorize_url_timeout": "[%key:common::config_flow::abort::oauth2_authorize_url_timeout%]",
"cloud_not_enabled": "Please make sure you run Home Assistant with `{default_config}` enabled in your configuration.yaml.",
"missing_configuration": "[%key:common::config_flow::abort::oauth2_missing_configuration%]",
"no_url_available": "[%key:common::config_flow::abort::oauth2_no_url_available%]",
"oauth_error": "[%key:common::config_flow::abort::oauth2_error%]",
"oauth_failed": "[%key:common::config_flow::abort::oauth2_failed%]",
"oauth_timeout": "[%key:common::config_flow::abort::oauth2_timeout%]",
"oauth_unauthorized": "[%key:common::config_flow::abort::oauth2_unauthorized%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"user_rejected_authorize": "[%key:common::config_flow::abort::oauth2_user_rejected_authorize%]",
"wrong_account": "You are authenticated with a different account than the one set up. Please authenticate with the configured account."
},
"create_entry": {
"default": "[%key:common::config_flow::create_entry::authenticated%]"
},
"step": { "step": {
"oauth_discovery": {
"description": "Home Assistant has found an Aladdin Connect device on your network. Press **Submit** to continue setting up Aladdin Connect."
},
"pick_implementation": { "pick_implementation": {
"title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]"
}, },
"reauth_confirm": { "reauth_confirm": {
"description": "Aladdin Connect needs to re-authenticate your account", "title": "[%key:common::config_flow::title::reauth%]",
"title": "[%key:common::config_flow::title::reauth%]" "description": "Aladdin Connect needs to re-authenticate your account"
},
"oauth_discovery": {
"description": "Home Assistant has found an Aladdin Connect device on your network. Press **Submit** to continue setting up Aladdin Connect."
} }
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
"oauth_error": "[%key:common::config_flow::abort::oauth2_error%]",
"oauth_failed": "[%key:common::config_flow::abort::oauth2_failed%]",
"oauth_timeout": "[%key:common::config_flow::abort::oauth2_timeout%]",
"oauth_unauthorized": "[%key:common::config_flow::abort::oauth2_unauthorized%]",
"missing_configuration": "[%key:common::config_flow::abort::oauth2_missing_configuration%]",
"authorize_url_timeout": "[%key:common::config_flow::abort::oauth2_authorize_url_timeout%]",
"no_url_available": "[%key:common::config_flow::abort::oauth2_no_url_available%]",
"user_rejected_authorize": "[%key:common::config_flow::abort::oauth2_user_rejected_authorize%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"wrong_account": "You are authenticated with a different account than the one set up. Please authenticate with the configured account.",
"cloud_not_enabled": "Please make sure you run Home Assistant with `{default_config}` enabled in your configuration.yaml."
},
"create_entry": {
"default": "[%key:common::config_flow::create_entry::authenticated%]"
} }
} }
} }

View File

@@ -18,23 +18,23 @@
"alarm_arm_away": { "alarm_arm_away": {
"service": "mdi:shield-lock" "service": "mdi:shield-lock"
}, },
"alarm_arm_custom_bypass": {
"service": "mdi:security"
},
"alarm_arm_home": { "alarm_arm_home": {
"service": "mdi:shield-home" "service": "mdi:shield-home"
}, },
"alarm_arm_night": { "alarm_arm_night": {
"service": "mdi:shield-moon" "service": "mdi:shield-moon"
}, },
"alarm_arm_vacation": { "alarm_arm_custom_bypass": {
"service": "mdi:shield-airplane" "service": "mdi:security"
}, },
"alarm_disarm": { "alarm_disarm": {
"service": "mdi:shield-off" "service": "mdi:shield-off"
}, },
"alarm_trigger": { "alarm_trigger": {
"service": "mdi:bell-ring" "service": "mdi:bell-ring"
},
"alarm_arm_vacation": {
"service": "mdi:shield-airplane"
} }
} }
} }

View File

@@ -1,4 +1,5 @@
{ {
"title": "Alarm control panel",
"device_automation": { "device_automation": {
"action_type": { "action_type": {
"arm_away": "Arm {entity_name} away", "arm_away": "Arm {entity_name} away",
@@ -9,24 +10,24 @@
"trigger": "Trigger {entity_name}" "trigger": "Trigger {entity_name}"
}, },
"condition_type": { "condition_type": {
"is_armed_away": "{entity_name} is armed away", "is_triggered": "{entity_name} is triggered",
"is_armed_home": "{entity_name} is armed home",
"is_armed_night": "{entity_name} is armed night",
"is_armed_vacation": "{entity_name} is armed vacation",
"is_disarmed": "{entity_name} is disarmed", "is_disarmed": "{entity_name} is disarmed",
"is_triggered": "{entity_name} is triggered" "is_armed_home": "{entity_name} is armed home",
"is_armed_away": "{entity_name} is armed away",
"is_armed_night": "{entity_name} is armed night",
"is_armed_vacation": "{entity_name} is armed vacation"
}, },
"extra_fields": { "extra_fields": {
"code": "Code", "code": "Code",
"for": "[%key:common::device_automation::extra_fields::for%]" "for": "[%key:common::device_automation::extra_fields::for%]"
}, },
"trigger_type": { "trigger_type": {
"armed_away": "{entity_name} armed away", "triggered": "{entity_name} triggered",
"armed_home": "{entity_name} armed home",
"armed_night": "{entity_name} armed night",
"armed_vacation": "{entity_name} armed vacation",
"disarmed": "{entity_name} disarmed", "disarmed": "{entity_name} disarmed",
"triggered": "{entity_name} triggered" "armed_home": "{entity_name} armed home",
"armed_away": "{entity_name} armed away",
"armed_night": "{entity_name} armed night",
"armed_vacation": "{entity_name} armed vacation"
} }
}, },
"entity_component": { "entity_component": {
@@ -34,114 +35,113 @@
"name": "[%key:component::alarm_control_panel::title%]", "name": "[%key:component::alarm_control_panel::title%]",
"state": { "state": {
"armed": "Armed", "armed": "Armed",
"armed_away": "Armed away", "disarmed": "Disarmed",
"armed_custom_bypass": "Armed custom bypass",
"armed_home": "Armed home", "armed_home": "Armed home",
"armed_away": "Armed away",
"armed_night": "Armed night", "armed_night": "Armed night",
"armed_vacation": "Armed vacation", "armed_vacation": "Armed vacation",
"arming": "Arming", "armed_custom_bypass": "Armed custom bypass",
"disarmed": "Disarmed",
"disarming": "Disarming",
"pending": "Pending", "pending": "Pending",
"arming": "Arming",
"disarming": "Disarming",
"triggered": "Triggered" "triggered": "Triggered"
}, },
"state_attributes": { "state_attributes": {
"code_format": {
"name": "Code format",
"state": {
"text": "Text",
"number": "Number"
}
},
"changed_by": { "changed_by": {
"name": "Changed by" "name": "Changed by"
}, },
"code_arm_required": { "code_arm_required": {
"name": "Code for arming", "name": "Code for arming",
"state": { "state": {
"false": "Not required", "true": "Required",
"true": "Required" "false": "Not required"
}
},
"code_format": {
"name": "Code format",
"state": {
"number": "Number",
"text": "Text"
} }
} }
} }
} }
}, },
"services": {
"alarm_disarm": {
"name": "Disarm",
"description": "Disarms the alarm.",
"fields": {
"code": {
"name": "Code",
"description": "Code to disarm the alarm."
}
}
},
"alarm_arm_custom_bypass": {
"name": "Arm with custom bypass",
"description": "Arms the alarm while allowing to bypass a custom area.",
"fields": {
"code": {
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
"description": "Code to arm the alarm."
}
}
},
"alarm_arm_home": {
"name": "Arm home",
"description": "Arms the alarm in the home mode.",
"fields": {
"code": {
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
}
}
},
"alarm_arm_away": {
"name": "Arm away",
"description": "Arms the alarm in the away mode.",
"fields": {
"code": {
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
}
}
},
"alarm_arm_night": {
"name": "Arm night",
"description": "Arms the alarm in the night mode.",
"fields": {
"code": {
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
}
}
},
"alarm_arm_vacation": {
"name": "Arm vacation",
"description": "Arms the alarm in the vacation mode.",
"fields": {
"code": {
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
}
}
},
"alarm_trigger": {
"name": "Trigger",
"description": "Triggers the alarm manually.",
"fields": {
"code": {
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]",
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]"
}
}
}
},
"exceptions": { "exceptions": {
"code_arm_required": { "code_arm_required": {
"message": "Arming requires a code but none was given for {entity_id}." "message": "Arming requires a code but none was given for {entity_id}."
} }
}, }
"services": {
"alarm_arm_away": {
"description": "Arms the alarm in the away mode.",
"fields": {
"code": {
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
}
},
"name": "Arm away"
},
"alarm_arm_custom_bypass": {
"description": "Arms the alarm while allowing to bypass a custom area.",
"fields": {
"code": {
"description": "Code to arm the alarm.",
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
}
},
"name": "Arm with custom bypass"
},
"alarm_arm_home": {
"description": "Arms the alarm in the home mode.",
"fields": {
"code": {
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
}
},
"name": "Arm home"
},
"alarm_arm_night": {
"description": "Arms the alarm in the night mode.",
"fields": {
"code": {
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
}
},
"name": "Arm night"
},
"alarm_arm_vacation": {
"description": "Arms the alarm in the vacation mode.",
"fields": {
"code": {
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
}
},
"name": "Arm vacation"
},
"alarm_disarm": {
"description": "Disarms the alarm.",
"fields": {
"code": {
"description": "Code to disarm the alarm.",
"name": "Code"
}
},
"name": "Disarm"
},
"alarm_trigger": {
"description": "Triggers the alarm manually.",
"fields": {
"code": {
"description": "[%key:component::alarm_control_panel::services::alarm_arm_custom_bypass::fields::code::description%]",
"name": "[%key:component::alarm_control_panel::services::alarm_disarm::fields::code::name%]"
}
},
"name": "Trigger"
}
},
"title": "Alarm control panel"
} }

View File

@@ -1,101 +1,101 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]" "user": {
}, "title": "Choose AlarmDecoder protocol",
"create_entry": { "data": {
"default": "Successfully connected to AlarmDecoder." "protocol": "Protocol"
}
},
"protocol": {
"title": "Configure connection settings",
"data": {
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]",
"device_baudrate": "Device baud rate",
"device_path": "Device path"
},
"data_description": {
"host": "The hostname or IP address of the AlarmDecoder device that is connected to your alarm panel.",
"port": "The port on which AlarmDecoder is accessible (for example, 10000)"
}
}
}, },
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
}, },
"step": { "create_entry": {
"protocol": { "default": "Successfully connected to AlarmDecoder."
"data": { },
"device_baudrate": "Device baud rate", "abort": {
"device_path": "Device path", "already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]"
},
"data_description": {
"host": "The hostname or IP address of the AlarmDecoder device that is connected to your alarm panel.",
"port": "The port on which AlarmDecoder is accessible (for example, 10000)"
},
"title": "Configure connection settings"
},
"user": {
"data": {
"protocol": "Protocol"
},
"title": "Choose AlarmDecoder protocol"
}
} }
}, },
"options": { "options": {
"error": {
"int": "The field below must be an integer.",
"loop_range": "'RF loop' must be an integer between 1 and 4.",
"loop_rfid": "'RF loop' cannot be used without 'RF serial'.",
"relay_inclusive": "'Relay address' and 'Relay channel' are codependent and must be included together."
},
"step": { "step": {
"arm_settings": {
"data": {
"alt_night_mode": "Alternative night mode",
"auto_bypass": "Auto-bypass on arm",
"code_arm_required": "Code required for arming"
},
"title": "[%key:component::alarmdecoder::options::step::init::title%]"
},
"init": { "init": {
"title": "Configure AlarmDecoder",
"description": "What would you like to edit?",
"data": { "data": {
"edit_selection": "Edit" "edit_selection": "Edit"
}, }
"description": "What would you like to edit?",
"title": "Configure AlarmDecoder"
}, },
"zone_details": { "arm_settings": {
"title": "[%key:component::alarmdecoder::options::step::init::title%]",
"data": { "data": {
"zone_loop": "RF loop", "auto_bypass": "Auto-bypass on arm",
"zone_name": "Zone name", "code_arm_required": "Code required for arming",
"zone_relayaddr": "Relay address", "alt_night_mode": "Alternative night mode"
"zone_relaychan": "Relay channel", }
"zone_rfid": "RF serial",
"zone_type": "Zone type"
},
"description": "Enter details for zone {zone_number}. To delete zone {zone_number}, leave 'Zone name' blank.",
"title": "[%key:component::alarmdecoder::options::step::init::title%]"
}, },
"zone_select": { "zone_select": {
"title": "[%key:component::alarmdecoder::options::step::init::title%]",
"description": "Enter the zone number you'd like to to add, edit, or remove.",
"data": { "data": {
"zone_number": "Zone number" "zone_number": "Zone number"
}, }
"description": "Enter the zone number you'd like to to add, edit, or remove.", },
"title": "[%key:component::alarmdecoder::options::step::init::title%]" "zone_details": {
"title": "[%key:component::alarmdecoder::options::step::init::title%]",
"description": "Enter details for zone {zone_number}. To delete zone {zone_number}, leave 'Zone name' blank.",
"data": {
"zone_name": "Zone name",
"zone_type": "Zone type",
"zone_rfid": "RF serial",
"zone_loop": "RF loop",
"zone_relayaddr": "Relay address",
"zone_relaychan": "Relay channel"
}
} }
},
"error": {
"relay_inclusive": "'Relay address' and 'Relay channel' are codependent and must be included together.",
"int": "The field below must be an integer.",
"loop_rfid": "'RF loop' cannot be used without 'RF serial'.",
"loop_range": "'RF loop' must be an integer between 1 and 4."
} }
}, },
"services": { "services": {
"alarm_keypress": { "alarm_keypress": {
"name": "Key press",
"description": "Sends custom keypresses to the alarm.", "description": "Sends custom keypresses to the alarm.",
"fields": { "fields": {
"keypress": { "keypress": {
"description": "String to send to the alarm panel.", "name": "[%key:component::alarmdecoder::services::alarm_keypress::name%]",
"name": "[%key:component::alarmdecoder::services::alarm_keypress::name%]" "description": "String to send to the alarm panel."
} }
}, }
"name": "Key press"
}, },
"alarm_toggle_chime": { "alarm_toggle_chime": {
"name": "Toggle chime",
"description": "Sends the alarm the toggle chime command.", "description": "Sends the alarm the toggle chime command.",
"fields": { "fields": {
"code": { "code": {
"description": "Code to toggle the alarm control panel chime with.", "name": "Code",
"name": "Code" "description": "Code to toggle the alarm control panel chime with."
} }
}, }
"name": "Toggle chime"
} }
} }
} }

View File

@@ -1,4 +1,5 @@
{ {
"title": "Alert",
"entity_component": { "entity_component": {
"_": { "_": {
"name": "[%key:component::alert::title%]", "name": "[%key:component::alert::title%]",
@@ -11,17 +12,16 @@
}, },
"services": { "services": {
"toggle": { "toggle": {
"description": "Toggles alert's notifications.", "name": "[%key:common::action::toggle%]",
"name": "[%key:common::action::toggle%]" "description": "Toggles alert's notifications."
}, },
"turn_off": { "turn_off": {
"description": "Silences alert's notifications.", "name": "[%key:common::action::turn_off%]",
"name": "[%key:common::action::turn_off%]" "description": "Silences alert's notifications."
}, },
"turn_on": { "turn_on": {
"description": "Resets alert's notifications.", "name": "[%key:common::action::turn_on%]",
"name": "[%key:common::action::turn_on%]" "description": "Resets alert's notifications."
} }
}, }
"title": "Alert"
} }

View File

@@ -8,5 +8,5 @@
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["aioamazondevices"], "loggers": ["aioamazondevices"],
"quality_scale": "platinum", "quality_scale": "platinum",
"requirements": ["aioamazondevices==6.4.6"] "requirements": ["aioamazondevices==6.4.4"]
} }

View File

@@ -1,12 +1,47 @@
{ {
"common": { "common": {
"data_code": "One-time password (OTP code)", "data_code": "One-time password (OTP code)",
"data_description_code": "The one-time password to log in to your account. Currently, only tokens from OTP applications are supported.",
"data_description_password": "The password of your Amazon account.",
"data_description_username": "The email address of your Amazon account.", "data_description_username": "The email address of your Amazon account.",
"data_description_password": "The password of your Amazon account.",
"data_description_code": "The one-time password to log in to your account. Currently, only tokens from OTP applications are supported.",
"device_id_description": "The ID of the device to send the command to." "device_id_description": "The ID of the device to send the command to."
}, },
"config": { "config": {
"flow_title": "{username}",
"step": {
"user": {
"data": {
"username": "[%key:common::config_flow::data::username%]",
"password": "[%key:common::config_flow::data::password%]",
"code": "[%key:component::alexa_devices::common::data_code%]"
},
"data_description": {
"username": "[%key:component::alexa_devices::common::data_description_username%]",
"password": "[%key:component::alexa_devices::common::data_description_password%]",
"code": "[%key:component::alexa_devices::common::data_description_code%]"
}
},
"reauth_confirm": {
"data": {
"password": "[%key:common::config_flow::data::password%]",
"code": "[%key:component::alexa_devices::common::data_code%]"
},
"data_description": {
"password": "[%key:component::alexa_devices::common::data_description_password%]",
"code": "[%key:component::alexa_devices::common::data_description_code%]"
}
},
"reconfigure": {
"data": {
"password": "[%key:common::config_flow::data::password%]",
"code": "[%key:component::alexa_devices::common::data_code%]"
},
"data_description": {
"password": "[%key:component::alexa_devices::common::data_description_password%]",
"code": "[%key:component::alexa_devices::common::data_description_code%]"
}
}
},
"abort": { "abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]", "already_configured": "[%key:common::config_flow::abort::already_configured_service%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
@@ -20,50 +55,15 @@
"cannot_retrieve_data": "Unable to retrieve data from Amazon. Please try again later.", "cannot_retrieve_data": "Unable to retrieve data from Amazon. Please try again later.",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
},
"flow_title": "{username}",
"step": {
"reauth_confirm": {
"data": {
"code": "[%key:component::alexa_devices::common::data_code%]",
"password": "[%key:common::config_flow::data::password%]"
},
"data_description": {
"code": "[%key:component::alexa_devices::common::data_description_code%]",
"password": "[%key:component::alexa_devices::common::data_description_password%]"
}
},
"reconfigure": {
"data": {
"code": "[%key:component::alexa_devices::common::data_code%]",
"password": "[%key:common::config_flow::data::password%]"
},
"data_description": {
"code": "[%key:component::alexa_devices::common::data_description_code%]",
"password": "[%key:component::alexa_devices::common::data_description_password%]"
}
},
"user": {
"data": {
"code": "[%key:component::alexa_devices::common::data_code%]",
"password": "[%key:common::config_flow::data::password%]",
"username": "[%key:common::config_flow::data::username%]"
},
"data_description": {
"code": "[%key:component::alexa_devices::common::data_description_code%]",
"password": "[%key:component::alexa_devices::common::data_description_password%]",
"username": "[%key:component::alexa_devices::common::data_description_username%]"
}
}
} }
}, },
"entity": { "entity": {
"notify": { "notify": {
"announce": {
"name": "Announce"
},
"speak": { "speak": {
"name": "Speak" "name": "Speak"
},
"announce": {
"name": "Announce"
} }
}, },
"switch": { "switch": {
@@ -72,24 +72,34 @@
} }
} }
}, },
"exceptions": { "services": {
"cannot_connect_with_error": { "send_sound": {
"message": "Error connecting: {error}" "name": "Send sound",
"description": "Sends a sound to a device",
"fields": {
"device_id": {
"name": "Device",
"description": "[%key:component::alexa_devices::common::device_id_description%]"
},
"sound": {
"name": "Alexa Skill sound file",
"description": "The sound file to play."
}
}
}, },
"cannot_retrieve_data_with_error": { "send_text_command": {
"message": "Error retrieving data: {error}" "name": "Send text command",
}, "description": "Sends a text command to a device",
"device_serial_number_missing": { "fields": {
"message": "Device serial number missing: {device_id}" "text_command": {
}, "name": "Alexa text command",
"entry_not_loaded": { "description": "The text command to send."
"message": "Entry not loaded: {entry}" },
}, "device_id": {
"invalid_device_id": { "name": "Device",
"message": "Invalid device ID specified: {device_id}" "description": "[%key:component::alexa_devices::common::device_id_description%]"
}, }
"invalid_sound_value": { }
"message": "Invalid sound {sound} specified"
} }
}, },
"selector": { "selector": {
@@ -139,34 +149,24 @@
} }
} }
}, },
"services": { "exceptions": {
"send_sound": { "cannot_connect_with_error": {
"description": "Sends a sound to a device", "message": "Error connecting: {error}"
"fields": {
"device_id": {
"description": "[%key:component::alexa_devices::common::device_id_description%]",
"name": "Device"
},
"sound": {
"description": "The sound file to play.",
"name": "Alexa Skill sound file"
}
},
"name": "Send sound"
}, },
"send_text_command": { "cannot_retrieve_data_with_error": {
"description": "Sends a text command to a device", "message": "Error retrieving data: {error}"
"fields": { },
"device_id": { "device_serial_number_missing": {
"description": "[%key:component::alexa_devices::common::device_id_description%]", "message": "Device serial number missing: {device_id}"
"name": "Device" },
}, "invalid_device_id": {
"text_command": { "message": "Invalid device ID specified: {device_id}"
"description": "The text command to send.", },
"name": "Alexa text command" "invalid_sound_value": {
} "message": "Invalid sound {sound} specified"
}, },
"name": "Send text command" "entry_not_loaded": {
"message": "Entry not loaded: {entry}"
} }
} }
} }

View File

@@ -1,12 +1,5 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]"
},
"error": {
"no_device_found": "[%key:common::config_flow::error::cannot_connect%]"
},
"flow_title": "{name}", "flow_title": "{name}",
"step": { "step": {
"discovery_confirm": { "discovery_confirm": {
@@ -21,30 +14,37 @@
}, },
"description": "Fill in Altruist IP address or hostname in your local network" "description": "Fill in Altruist IP address or hostname in your local network"
} }
},
"abort": {
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": {
"no_device_found": "[%key:common::config_flow::error::cannot_connect%]"
} }
}, },
"entity": { "entity": {
"sensor": { "sensor": {
"co2": {
"name": "{sensor_name} CO2"
},
"humidity": { "humidity": {
"name": "{sensor_name} humidity" "name": "{sensor_name} humidity"
}, },
"noise_avg": {
"name": "Average noise"
},
"noise_max": {
"name": "Maximum noise"
},
"pressure": { "pressure": {
"name": "{sensor_name} pressure" "name": "{sensor_name} pressure"
}, },
"radiation": {
"name": "Radiation level"
},
"temperature": { "temperature": {
"name": "{sensor_name} temperature" "name": "{sensor_name} temperature"
},
"noise_max": {
"name": "Maximum noise"
},
"noise_avg": {
"name": "Average noise"
},
"co2": {
"name": "{sensor_name} CO2"
},
"radiation": {
"name": "Radiation level"
} }
} }
} }

View File

@@ -1,26 +1,26 @@
{ {
"entity": { "entity": {
"binary_sensor": {
"demand_window": {
"default": "mdi:meter-electric",
"state": {
"off": "mdi:meter-electric-outline"
}
}
},
"sensor": { "sensor": {
"general": {
"default": "mdi:transmission-tower"
},
"controlled_load": { "controlled_load": {
"default": "mdi:clock-outline" "default": "mdi:clock-outline"
}, },
"feed_in": { "feed_in": {
"default": "mdi:solar-power" "default": "mdi:solar-power"
}, },
"general": {
"default": "mdi:transmission-tower"
},
"renewables": { "renewables": {
"default": "mdi:solar-power" "default": "mdi:solar-power"
} }
},
"binary_sensor": {
"demand_window": {
"default": "mdi:meter-electric",
"state": {
"off": "mdi:meter-electric-outline"
}
}
} }
}, },
"services": { "services": {

View File

@@ -22,40 +22,40 @@
} }
} }
}, },
"services": {
"get_forecasts": {
"name": "Get price forecasts",
"description": "Retrieves price forecasts from Amber Electric for a site.",
"fields": {
"config_entry_id": {
"description": "The config entry of the site to get forecasts for.",
"name": "Config entry"
},
"channel_type": {
"name": "Channel type",
"description": "The channel to get forecasts for."
}
}
}
},
"exceptions": { "exceptions": {
"channel_not_found": {
"message": "There is no {channel_type} channel at this site."
},
"integration_not_found": { "integration_not_found": {
"message": "Config entry \"{target}\" not found in registry." "message": "Config entry \"{target}\" not found in registry."
}, },
"not_loaded": { "not_loaded": {
"message": "{target} is not loaded." "message": "{target} is not loaded."
},
"channel_not_found": {
"message": "There is no {channel_type} channel at this site."
} }
}, },
"selector": { "selector": {
"channel_type": { "channel_type": {
"options": { "options": {
"general": "General",
"controlled_load": "Controlled load", "controlled_load": "Controlled load",
"feed_in": "Feed-in", "feed_in": "Feed-in"
"general": "General"
} }
} }
},
"services": {
"get_forecasts": {
"description": "Retrieves price forecasts from Amber Electric for a site.",
"fields": {
"channel_type": {
"description": "The channel to get forecasts for.",
"name": "Channel type"
},
"config_entry_id": {
"description": "The config entry of the site to get forecasts for.",
"name": "Config entry"
}
},
"name": "Get price forecasts"
}
} }
} }

View File

@@ -4,15 +4,15 @@
"last_rain": { "last_rain": {
"default": "mdi:water" "default": "mdi:water"
}, },
"lightning_distance": {
"default": "mdi:lightning-bolt"
},
"lightning_strikes_per_day": { "lightning_strikes_per_day": {
"default": "mdi:lightning-bolt" "default": "mdi:lightning-bolt"
}, },
"lightning_strikes_per_hour": { "lightning_strikes_per_hour": {
"default": "mdi:lightning-bolt" "default": "mdi:lightning-bolt"
}, },
"lightning_distance": {
"default": "mdi:lightning-bolt"
},
"wind_direction": { "wind_direction": {
"default": "mdi:compass-outline" "default": "mdi:compass-outline"
} }

View File

@@ -1,30 +1,42 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]" "user": {
"title": "Select region",
"description": "Choose the region you want to survey in order to locate Ambient personal weather stations."
},
"station": {
"title": "Select station",
"description": "Select the weather station you want to add to Home Assistant.",
"data": {
"station": "Station"
}
}
}, },
"error": { "error": {
"no_stations_found": "Did not find any stations in the selected region." "no_stations_found": "Did not find any stations in the selected region."
}, },
"step": { "abort": {
"station": { "already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
"data": {
"station": "Station"
},
"description": "Select the weather station you want to add to Home Assistant.",
"title": "Select station"
},
"user": {
"description": "Choose the region you want to survey in order to locate Ambient personal weather stations.",
"title": "Select region"
}
} }
}, },
"entity": { "entity": {
"sensor": { "sensor": {
"pm25_24h_average": {
"name": "PM2.5 (24 hour average)"
},
"pm25_aqi": {
"name": "PM2.5 AQI"
},
"pm25_aqi_24h_average": {
"name": "PM2.5 AQI (24 hour average)"
},
"absolute_pressure": { "absolute_pressure": {
"name": "Absolute pressure" "name": "Absolute pressure"
}, },
"relative_pressure": {
"name": "Relative pressure"
},
"daily_rain": { "daily_rain": {
"name": "Daily rain" "name": "Daily rain"
}, },
@@ -40,33 +52,21 @@
"last_rain": { "last_rain": {
"name": "Last rain" "name": "Last rain"
}, },
"lightning_distance": {
"name": "Lightning distance"
},
"lightning_strikes_per_day": { "lightning_strikes_per_day": {
"name": "Lightning strikes per day" "name": "Lightning strikes per day"
}, },
"lightning_strikes_per_hour": { "lightning_strikes_per_hour": {
"name": "Lightning strikes per hour" "name": "Lightning strikes per hour"
}, },
"lightning_distance": {
"name": "Lightning distance"
},
"max_daily_gust": { "max_daily_gust": {
"name": "Max daily gust" "name": "Max daily gust"
}, },
"monthly_rain": { "monthly_rain": {
"name": "Monthly rain" "name": "Monthly rain"
}, },
"pm25_24h_average": {
"name": "PM2.5 (24 hour average)"
},
"pm25_aqi": {
"name": "PM2.5 AQI"
},
"pm25_aqi_24h_average": {
"name": "PM2.5 AQI (24 hour average)"
},
"relative_pressure": {
"name": "Relative pressure"
},
"uv_index": { "uv_index": {
"name": "UV index" "name": "UV index"
}, },

View File

@@ -1,20 +1,20 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]" "user": {
"title": "Fill in your information",
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
"app_key": "Application Key"
}
}
}, },
"error": { "error": {
"invalid_key": "[%key:common::config_flow::error::invalid_api_key%]", "invalid_key": "[%key:common::config_flow::error::invalid_api_key%]",
"no_devices": "No devices found in account" "no_devices": "No devices found in account"
}, },
"step": { "abort": {
"user": { "already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
"app_key": "Application Key"
},
"title": "Fill in your information"
}
} }
}, },
"entity": { "entity": {
@@ -22,9 +22,6 @@
"battery_1": { "battery_1": {
"name": "Battery 1" "name": "Battery 1"
}, },
"battery_10": {
"name": "Battery 10"
},
"battery_2": { "battery_2": {
"name": "Battery 2" "name": "Battery 2"
}, },
@@ -49,24 +46,12 @@
"battery_9": { "battery_9": {
"name": "Battery 9" "name": "Battery 9"
}, },
"co2_battery": { "battery_10": {
"name": "Carbon dioxide battery" "name": "Battery 10"
}, },
"interior_battery": { "interior_battery": {
"name": "Interior battery" "name": "Interior battery"
}, },
"leak_detector_1": {
"name": "Leak detector 1"
},
"leak_detector_2": {
"name": "Leak detector 2"
},
"leak_detector_3": {
"name": "Leak detector 3"
},
"leak_detector_4": {
"name": "Leak detector 4"
},
"leak_detector_battery_1": { "leak_detector_battery_1": {
"name": "Leak detector battery 1" "name": "Leak detector battery 1"
}, },
@@ -79,21 +64,63 @@
"leak_detector_battery_4": { "leak_detector_battery_4": {
"name": "Leak detector battery 4" "name": "Leak detector battery 4"
}, },
"soil_monitor_battery_1": {
"name": "Soil monitor battery 1"
},
"soil_monitor_battery_2": {
"name": "Soil monitor battery 2"
},
"soil_monitor_battery_3": {
"name": "Soil monitor battery 3"
},
"soil_monitor_battery_4": {
"name": "Soil monitor battery 4"
},
"soil_monitor_battery_5": {
"name": "Soil monitor battery 5"
},
"soil_monitor_battery_6": {
"name": "Soil monitor battery 6"
},
"soil_monitor_battery_7": {
"name": "Soil monitor battery 7"
},
"soil_monitor_battery_8": {
"name": "Soil monitor battery 8"
},
"soil_monitor_battery_9": {
"name": "Soil monitor battery 9"
},
"soil_monitor_battery_10": {
"name": "Soil monitor battery 10"
},
"co2_battery": {
"name": "Carbon dioxide battery"
},
"lightning_detector_battery": { "lightning_detector_battery": {
"name": "Lightning detector battery" "name": "Lightning detector battery"
}, },
"pm25_battery": { "leak_detector_1": {
"name": "PM25 battery" "name": "Leak detector 1"
},
"leak_detector_2": {
"name": "Leak detector 2"
},
"leak_detector_3": {
"name": "Leak detector 3"
},
"leak_detector_4": {
"name": "Leak detector 4"
}, },
"pm25_indoor_battery": { "pm25_indoor_battery": {
"name": "PM25 indoor battery" "name": "PM25 indoor battery"
}, },
"pm25_battery": {
"name": "PM25 battery"
},
"relay_1": { "relay_1": {
"name": "Relay 1" "name": "Relay 1"
}, },
"relay_10": {
"name": "Relay 10"
},
"relay_2": { "relay_2": {
"name": "Relay 2" "name": "Relay 2"
}, },
@@ -118,44 +145,32 @@
"relay_9": { "relay_9": {
"name": "Relay 9" "name": "Relay 9"
}, },
"soil_monitor_battery_1": { "relay_10": {
"name": "Soil monitor battery 1" "name": "Relay 10"
},
"soil_monitor_battery_10": {
"name": "Soil monitor battery 10"
},
"soil_monitor_battery_2": {
"name": "Soil monitor battery 2"
},
"soil_monitor_battery_3": {
"name": "Soil monitor battery 3"
},
"soil_monitor_battery_4": {
"name": "Soil monitor battery 4"
},
"soil_monitor_battery_5": {
"name": "Soil monitor battery 5"
},
"soil_monitor_battery_6": {
"name": "Soil monitor battery 6"
},
"soil_monitor_battery_7": {
"name": "Soil monitor battery 7"
},
"soil_monitor_battery_8": {
"name": "Soil monitor battery 8"
},
"soil_monitor_battery_9": {
"name": "Soil monitor battery 9"
} }
}, },
"sensor": { "sensor": {
"24_hour_rain": { "24_hour_rain": {
"name": "Rain 24 hours" "name": "Rain 24 hours"
}, },
"pm25_aqi": {
"name": "PM2.5 AQI"
},
"pm25_aqi_24h_average": {
"name": "PM2.5 AQI 24 hour average"
},
"pm25_indoor_aqi": {
"name": "PM2.5 indoor AQI"
},
"pm25_indoor_aqi_24h_average": {
"name": "PM2.5 indoor AQI"
},
"absolute_pressure": { "absolute_pressure": {
"name": "Absolute pressure" "name": "Absolute pressure"
}, },
"relative_pressure": {
"name": "Relative pressure"
},
"daily_rain": { "daily_rain": {
"name": "Daily rain" "name": "Daily rain"
}, },
@@ -171,9 +186,6 @@
"humidity_1": { "humidity_1": {
"name": "Humidity 1" "name": "Humidity 1"
}, },
"humidity_10": {
"name": "Humidity 10"
},
"humidity_2": { "humidity_2": {
"name": "Humidity 2" "name": "Humidity 2"
}, },
@@ -198,11 +210,14 @@
"humidity_9": { "humidity_9": {
"name": "Humidity 9" "name": "Humidity 9"
}, },
"humidity_10": {
"name": "Humidity 10"
},
"humidity_indoor": { "humidity_indoor": {
"name": "Humidity indoor" "name": "Humidity indoor"
}, },
"inside_temperature": { "last_rain": {
"name": "Inside temperature" "name": "Last rain"
}, },
"last_lightning_strike": { "last_lightning_strike": {
"name": "Last Lightning strike" "name": "Last Lightning strike"
@@ -210,12 +225,6 @@
"last_lightning_strike_distance": { "last_lightning_strike_distance": {
"name": "Last Lightning strike distance" "name": "Last Lightning strike distance"
}, },
"last_rain": {
"name": "Last rain"
},
"lifetime_rain": {
"name": "Lifetime rain"
},
"lightning_strikes_per_day": { "lightning_strikes_per_day": {
"name": "Lightning strikes per day" "name": "Lightning strikes per day"
}, },
@@ -231,33 +240,15 @@
"pm25_24h_average": { "pm25_24h_average": {
"name": "PM2.5 24 hour average" "name": "PM2.5 24 hour average"
}, },
"pm25_aqi": {
"name": "PM2.5 AQI"
},
"pm25_aqi_24h_average": {
"name": "PM2.5 AQI 24 hour average"
},
"pm25_indoor": { "pm25_indoor": {
"name": "PM2.5 indoor" "name": "PM2.5 indoor"
}, },
"pm25_indoor_24h_average": { "pm25_indoor_24h_average": {
"name": "PM2.5 indoor 24 hour average" "name": "PM2.5 indoor 24 hour average"
}, },
"pm25_indoor_aqi": {
"name": "PM2.5 indoor AQI"
},
"pm25_indoor_aqi_24h_average": {
"name": "PM2.5 indoor AQI"
},
"relative_pressure": {
"name": "Relative pressure"
},
"soil_humidity_1": { "soil_humidity_1": {
"name": "Soil humidity 1" "name": "Soil humidity 1"
}, },
"soil_humidity_10": {
"name": "Soil humidity 10"
},
"soil_humidity_2": { "soil_humidity_2": {
"name": "Soil humidity 2" "name": "Soil humidity 2"
}, },
@@ -282,12 +273,12 @@
"soil_humidity_9": { "soil_humidity_9": {
"name": "Soil humidity 9" "name": "Soil humidity 9"
}, },
"soil_humidity_10": {
"name": "Soil humidity 10"
},
"soil_temperature_1": { "soil_temperature_1": {
"name": "Soil temperature 1" "name": "Soil temperature 1"
}, },
"soil_temperature_10": {
"name": "Soil temperature 10"
},
"soil_temperature_2": { "soil_temperature_2": {
"name": "Soil temperature 2" "name": "Soil temperature 2"
}, },
@@ -312,12 +303,12 @@
"soil_temperature_9": { "soil_temperature_9": {
"name": "Soil temperature 9" "name": "Soil temperature 9"
}, },
"soil_temperature_10": {
"name": "Soil temperature 10"
},
"temperature_1": { "temperature_1": {
"name": "Temperature 1" "name": "Temperature 1"
}, },
"temperature_10": {
"name": "Temperature 10"
},
"temperature_2": { "temperature_2": {
"name": "Temperature 2" "name": "Temperature 2"
}, },
@@ -342,18 +333,21 @@
"temperature_9": { "temperature_9": {
"name": "Temperature 9" "name": "Temperature 9"
}, },
"temperature_10": {
"name": "Temperature 10"
},
"inside_temperature": {
"name": "Inside temperature"
},
"lifetime_rain": {
"name": "Lifetime rain"
},
"uv_index": { "uv_index": {
"name": "UV index" "name": "UV index"
}, },
"weekly_rain": { "weekly_rain": {
"name": "Weekly rain" "name": "Weekly rain"
}, },
"wind_average_10m": {
"name": "Wind average 10 minutes"
},
"wind_average_2m": {
"name": "Wind average 2 minutes"
},
"wind_direction": { "wind_direction": {
"name": "Wind direction" "name": "Wind direction"
}, },
@@ -363,11 +357,17 @@
"wind_direction_average_2m": { "wind_direction_average_2m": {
"name": "Wind direction average 2 minutes" "name": "Wind direction average 2 minutes"
}, },
"wind_gust_direction": {
"name": "Wind gust direction"
},
"wind_gust": { "wind_gust": {
"name": "Wind gust" "name": "Wind gust"
}, },
"wind_gust_direction": { "wind_average_10m": {
"name": "Wind gust direction" "name": "Wind average 10 minutes"
},
"wind_average_2m": {
"name": "Wind average 2 minutes"
}, },
"yearly_rain": { "yearly_rain": {
"name": "Yearly rain" "name": "Yearly rain"

View File

@@ -1,10 +1,7 @@
{ {
"services": { "services": {
"disable_audio": { "enable_recording": {
"service": "mdi:volume-off" "service": "mdi:record-rec"
},
"disable_motion_recording": {
"service": "mdi:motion-sensor-off"
}, },
"disable_recording": { "disable_recording": {
"service": "mdi:stop" "service": "mdi:stop"
@@ -12,18 +9,18 @@
"enable_audio": { "enable_audio": {
"service": "mdi:volume-high" "service": "mdi:volume-high"
}, },
"disable_audio": {
"service": "mdi:volume-off"
},
"enable_motion_recording": { "enable_motion_recording": {
"service": "mdi:motion-sensor" "service": "mdi:motion-sensor"
}, },
"enable_recording": { "disable_motion_recording": {
"service": "mdi:record-rec" "service": "mdi:motion-sensor-off"
}, },
"goto_preset": { "goto_preset": {
"service": "mdi:pan" "service": "mdi:pan"
}, },
"ptz_control": {
"service": "mdi:pan"
},
"set_color_bw": { "set_color_bw": {
"service": "mdi:palette" "service": "mdi:palette"
}, },
@@ -32,6 +29,9 @@
}, },
"stop_tour": { "stop_tour": {
"service": "mdi:panorama-outline" "service": "mdi:panorama-outline"
},
"ptz_control": {
"service": "mdi:pan"
} }
} }
} }

View File

@@ -1,130 +1,130 @@
{ {
"services": { "services": {
"disable_audio": {
"description": "Disables audio stream.",
"fields": {
"entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
}
},
"name": "Disable audio"
},
"disable_motion_recording": {
"description": "Disables recording a clip to camera storage when motion is detected.",
"fields": {
"entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
}
},
"name": "Disable motion recording"
},
"disable_recording": {
"description": "Disables continuous recording to camera storage.",
"fields": {
"entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
}
},
"name": "Disable recording"
},
"enable_audio": {
"description": "Enables audio stream.",
"fields": {
"entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
}
},
"name": "Enable audio"
},
"enable_motion_recording": {
"description": "Enables recording a clip to camera storage when motion is detected.",
"fields": {
"entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
}
},
"name": "Enable motion recording"
},
"enable_recording": { "enable_recording": {
"name": "Enable recording",
"description": "Enables continuous recording to camera storage.", "description": "Enables continuous recording to camera storage.",
"fields": { "fields": {
"entity_id": { "entity_id": {
"description": "Name(s) of the cameras, or 'all' for all cameras.", "name": "Entity",
"name": "Entity" "description": "Name(s) of the cameras, or 'all' for all cameras."
} }
}, }
"name": "Enable recording" },
"disable_recording": {
"name": "Disable recording",
"description": "Disables continuous recording to camera storage.",
"fields": {
"entity_id": {
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
}
}
},
"enable_audio": {
"name": "Enable audio",
"description": "Enables audio stream.",
"fields": {
"entity_id": {
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
}
}
},
"disable_audio": {
"name": "Disable audio",
"description": "Disables audio stream.",
"fields": {
"entity_id": {
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
}
}
},
"enable_motion_recording": {
"name": "Enable motion recording",
"description": "Enables recording a clip to camera storage when motion is detected.",
"fields": {
"entity_id": {
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
}
}
},
"disable_motion_recording": {
"name": "Disable motion recording",
"description": "Disables recording a clip to camera storage when motion is detected.",
"fields": {
"entity_id": {
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
}
}
}, },
"goto_preset": { "goto_preset": {
"name": "Go to preset",
"description": "Moves camera to PTZ preset.", "description": "Moves camera to PTZ preset.",
"fields": { "fields": {
"entity_id": { "entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]", "name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]" "description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
}, },
"preset": { "preset": {
"description": "Preset number.", "name": "Preset",
"name": "Preset" "description": "Preset number."
} }
}, }
"name": "Go to preset"
},
"ptz_control": {
"description": "Moves (pan/tilt) and/or zoom a PTZ camera.",
"fields": {
"entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]"
},
"movement": {
"description": "Direction to move the camera.",
"name": "Movement"
},
"travel_time": {
"description": "Travel time in fractional seconds: from 0 to 1.",
"name": "Travel time"
}
},
"name": "PTZ control"
}, },
"set_color_bw": { "set_color_bw": {
"name": "Set color",
"description": "Sets camera color mode.", "description": "Sets camera color mode.",
"fields": { "fields": {
"color_bw": {
"description": "Color mode.",
"name": "Color"
},
"entity_id": { "entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]", "name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]" "description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
},
"color_bw": {
"name": "Color",
"description": "Color mode."
} }
}, }
"name": "Set color"
}, },
"start_tour": { "start_tour": {
"name": "Start tour",
"description": "Starts camera's PTZ tour function.", "description": "Starts camera's PTZ tour function.",
"fields": { "fields": {
"entity_id": { "entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]", "name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]" "description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
} }
}, }
"name": "Start tour"
}, },
"stop_tour": { "stop_tour": {
"name": "Stop tour",
"description": "Stops camera's PTZ tour function.", "description": "Stops camera's PTZ tour function.",
"fields": { "fields": {
"entity_id": { "entity_id": {
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]", "name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]" "description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
} }
}, }
"name": "Stop tour" },
"ptz_control": {
"name": "PTZ control",
"description": "Moves (pan/tilt) and/or zoom a PTZ camera.",
"fields": {
"entity_id": {
"name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]",
"description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]"
},
"movement": {
"name": "Movement",
"description": "Direction to move the camera."
},
"travel_time": {
"name": "Travel time",
"description": "Travel time in fractional seconds: from 0 to 1."
}
}
} }
} }
} }

View File

@@ -1,25 +1,47 @@
{ {
"config": { "config": {
"step": {
"user": {
"data": {
"tracked_addons": "Add-ons",
"tracked_integrations": "Integrations",
"tracked_custom_integrations": "Custom integrations"
},
"data_description": {
"tracked_addons": "Select the add-ons you want to track",
"tracked_integrations": "Select the integrations you want to track",
"tracked_custom_integrations": "Select the custom integrations you want to track"
}
}
},
"abort": { "abort": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
}, },
"error": { "error": {
"no_integrations_selected": "You must select at least one integration to track" "no_integrations_selected": "You must select at least one integration to track"
}, }
},
"options": {
"step": { "step": {
"user": { "init": {
"data": { "data": {
"tracked_addons": "Add-ons", "tracked_addons": "[%key:component::analytics_insights::config::step::user::data::tracked_addons%]",
"tracked_custom_integrations": "Custom integrations", "tracked_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_integrations%]",
"tracked_integrations": "Integrations" "tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_custom_integrations%]"
}, },
"data_description": { "data_description": {
"tracked_addons": "Select the add-ons you want to track", "tracked_addons": "[%key:component::analytics_insights::config::step::user::data_description::tracked_addons%]",
"tracked_custom_integrations": "Select the custom integrations you want to track", "tracked_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_integrations%]",
"tracked_integrations": "Select the integrations you want to track" "tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_custom_integrations%]"
} }
} }
},
"abort": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"error": {
"no_integrations_selected": "[%key:component::analytics_insights::config::error::no_integrations_selected%]"
} }
}, },
"entity": { "entity": {
@@ -34,27 +56,5 @@
"name": "Total reported integrations" "name": "Total reported integrations"
} }
} }
},
"options": {
"abort": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"error": {
"no_integrations_selected": "[%key:component::analytics_insights::config::error::no_integrations_selected%]"
},
"step": {
"init": {
"data": {
"tracked_addons": "[%key:component::analytics_insights::config::step::user::data::tracked_addons%]",
"tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_custom_integrations%]",
"tracked_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_integrations%]"
},
"data_description": {
"tracked_addons": "[%key:component::analytics_insights::config::step::user::data_description::tracked_addons%]",
"tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_custom_integrations%]",
"tracked_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_integrations%]"
}
}
}
} }
} }

View File

@@ -51,11 +51,11 @@
"torch": { "torch": {
"default": "mdi:white-balance-sunny" "default": "mdi:white-balance-sunny"
}, },
"video_recording": {
"default": "mdi:record-rec"
},
"whitebalance_lock": { "whitebalance_lock": {
"default": "mdi:white-balance-auto" "default": "mdi:white-balance-auto"
},
"video_recording": {
"default": "mdi:record-rec"
} }
} }
} }

View File

@@ -1,24 +1,24 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]", "host": "[%key:common::config_flow::data::host%]",
"password": "[%key:common::config_flow::data::password%]",
"port": "[%key:common::config_flow::data::port%]", "port": "[%key:common::config_flow::data::port%]",
"username": "[%key:common::config_flow::data::username%]" "username": "[%key:common::config_flow::data::username%]",
"password": "[%key:common::config_flow::data::password%]"
}, },
"data_description": { "data_description": {
"host": "The IP address of the device running the Android IP Webcam app. The IP address is shown in the app once you start the server." "host": "The IP address of the device running the Android IP Webcam app. The IP address is shown in the app once you start the server."
} }
} }
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
} }
} }
} }

View File

@@ -6,11 +6,11 @@
"download": { "download": {
"service": "mdi:download" "service": "mdi:download"
}, },
"learn_sendevent": {
"service": "mdi:remote"
},
"upload": { "upload": {
"service": "mdi:upload" "service": "mdi:upload"
},
"learn_sendevent": {
"service": "mdi:remote"
} }
} }
} }

View File

@@ -1,112 +1,112 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"invalid_unique_id": "Impossible to determine a valid unique ID for the device"
},
"error": {
"adbkey_not_file": "ADB key file not found",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_host": "[%key:common::config_flow::error::invalid_host%]",
"key_and_server": "Only provide ADB Key or ADB Server",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]",
"adbkey": "Path to your ADB key file (leave empty to auto generate)",
"adb_server_ip": "IP address of the ADB server (leave empty to not use)", "adb_server_ip": "IP address of the ADB server (leave empty to not use)",
"adb_server_port": "Port of the ADB server", "adb_server_port": "Port of the ADB server",
"adbkey": "Path to your ADB key file (leave empty to auto generate)",
"device_class": "The type of device", "device_class": "The type of device",
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]" "port": "[%key:common::config_flow::data::port%]"
} }
} }
} },
}, "error": {
"exceptions": { "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"failed_send": { "invalid_host": "[%key:common::config_flow::error::invalid_host%]",
"message": "Failed to send command {cmd}" "adbkey_not_file": "ADB key file not found",
"key_and_server": "Only provide ADB Key or ADB Server",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"invalid_unique_id": "Impossible to determine a valid unique ID for the device"
} }
}, },
"options": { "options": {
"error": {
"invalid_det_rules": "Invalid state detection rules"
},
"step": { "step": {
"apps": {
"data": {
"app_delete": "Check to delete this application",
"app_id": "Application ID",
"app_name": "Application name"
},
"description": "Configure application ID {app_id}",
"title": "Configure Android apps"
},
"init": { "init": {
"data": { "data": {
"apps": "Configure applications list", "apps": "Configure applications list",
"exclude_unnamed_apps": "Exclude apps with unknown name from the sources list",
"get_sources": "Retrieve the running apps as the list of sources", "get_sources": "Retrieve the running apps as the list of sources",
"exclude_unnamed_apps": "Exclude apps with unknown name from the sources list",
"screencap_interval": "Interval in minutes between screen capture for album art (set 0 to disable)", "screencap_interval": "Interval in minutes between screen capture for album art (set 0 to disable)",
"state_detection_rules": "Configure state detection rules", "state_detection_rules": "Configure state detection rules",
"turn_off_command": "ADB shell turn off command (leave empty for default)", "turn_off_command": "ADB shell turn off command (leave empty for default)",
"turn_on_command": "ADB shell turn on command (leave empty for default)" "turn_on_command": "ADB shell turn on command (leave empty for default)"
} }
}, },
"rules": { "apps": {
"title": "Configure Android apps",
"description": "Configure application ID {app_id}",
"data": { "data": {
"rule_delete": "Check to delete this rule", "app_name": "Application name",
"rule_id": "[%key:component::androidtv::options::step::apps::data::app_id%]", "app_id": "Application ID",
"rule_values": "List of state detection rules (see documentation)" "app_delete": "Check to delete this application"
}, }
},
"rules": {
"title": "Configure Android state detection rules",
"description": "Configure detection rule for application ID {rule_id}", "description": "Configure detection rule for application ID {rule_id}",
"title": "Configure Android state detection rules" "data": {
"rule_id": "[%key:component::androidtv::options::step::apps::data::app_id%]",
"rule_values": "List of state detection rules (see documentation)",
"rule_delete": "Check to delete this rule"
}
} }
},
"error": {
"invalid_det_rules": "Invalid state detection rules"
} }
}, },
"services": { "services": {
"adb_command": { "adb_command": {
"name": "ADB command",
"description": "Sends an ADB command to an Android / Fire TV device.", "description": "Sends an ADB command to an Android / Fire TV device.",
"fields": { "fields": {
"command": { "command": {
"description": "Either a key command or an ADB shell command.", "name": "Command",
"name": "Command" "description": "Either a key command or an ADB shell command."
} }
}, }
"name": "ADB command"
}, },
"download": { "download": {
"name": "Download",
"description": "Downloads a file from your Android / Fire TV device to your Home Assistant instance.", "description": "Downloads a file from your Android / Fire TV device to your Home Assistant instance.",
"fields": { "fields": {
"device_path": { "device_path": {
"description": "The filepath on the Android / Fire TV device.", "name": "Device path",
"name": "Device path" "description": "The filepath on the Android / Fire TV device."
}, },
"local_path": { "local_path": {
"description": "The filepath on your Home Assistant instance.", "name": "Local path",
"name": "Local path" "description": "The filepath on your Home Assistant instance."
} }
}, }
"name": "Download"
},
"learn_sendevent": {
"description": "Translates a key press on a remote into ADB 'sendevent' commands. You must press one button on the remote within 8 seconds of performing this action.",
"name": "Learn sendevent"
}, },
"upload": { "upload": {
"name": "Upload",
"description": "Uploads a file from your Home Assistant instance to an Android / Fire TV device.", "description": "Uploads a file from your Home Assistant instance to an Android / Fire TV device.",
"fields": { "fields": {
"device_path": { "device_path": {
"description": "[%key:component::androidtv::services::download::fields::device_path::description%]", "name": "[%key:component::androidtv::services::download::fields::device_path::name%]",
"name": "[%key:component::androidtv::services::download::fields::device_path::name%]" "description": "[%key:component::androidtv::services::download::fields::device_path::description%]"
}, },
"local_path": { "local_path": {
"description": "[%key:component::androidtv::services::download::fields::local_path::description%]", "name": "[%key:component::androidtv::services::download::fields::local_path::name%]",
"name": "[%key:component::androidtv::services::download::fields::local_path::name%]" "description": "[%key:component::androidtv::services::download::fields::local_path::description%]"
} }
}, }
"name": "Upload" },
"learn_sendevent": {
"name": "Learn sendevent",
"description": "Translates a key press on a remote into ADB 'sendevent' commands. You must press one button on the remote within 8 seconds of performing this action."
}
},
"exceptions": {
"failed_send": {
"message": "Failed to send command {cmd}"
} }
} }
} }

View File

@@ -41,11 +41,6 @@ APPS_NEW_ID = "add_new"
CONF_APP_DELETE = "app_delete" CONF_APP_DELETE = "app_delete"
CONF_APP_ID = "app_id" 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( STEP_PAIR_DATA_SCHEMA = vol.Schema(
{ {
vol.Required("pin"): str, vol.Required("pin"): str,
@@ -360,7 +355,5 @@ class AndroidTVRemoteOptionsFlowHandler(OptionsFlowWithReload):
data_schema=data_schema, data_schema=data_schema,
description_placeholders={ description_placeholders={
"app_id": f"`{app_id}`" if app_id != APPS_NEW_ID else "", "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,
}, },
) )

View File

@@ -1,11 +1,42 @@
{ {
"config": { "config": {
"abort": { "flow_title": "{name}",
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]", "step": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "user": {
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]", "description": "Enter the IP address of the Android TV you want to add to Home Assistant. It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen.",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]", "data": {
"unique_id_mismatch": "Please ensure you reconfigure against the same device." "host": "[%key:common::config_flow::data::host%]"
},
"data_description": {
"host": "The hostname or IP address of the Android TV device."
}
},
"reconfigure": {
"description": "Update the IP address of this previously configured Android TV device.",
"data": {
"host": "[%key:common::config_flow::data::host%]"
},
"data_description": {
"host": "The hostname or IP address of the Android TV device."
}
},
"zeroconf_confirm": {
"title": "Discovered Android TV",
"description": "Do you want to add the Android TV ({name}) to Home Assistant? It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen."
},
"pair": {
"description": "Enter the pairing code displayed on the Android TV ({name}).",
"data": {
"pin": "[%key:common::config_flow::data::pin%]"
},
"data_description": {
"pin": "Pairing code displayed on the Android TV device."
}
},
"reauth_confirm": {
"title": "[%key:common::config_flow::title::reauth%]",
"description": "You need to pair again with the Android TV ({name}). It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen."
}
}, },
"error": { "error": {
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]", "already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
@@ -13,42 +44,41 @@
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
}, },
"flow_title": "{name}", "abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
"unique_id_mismatch": "Please ensure you reconfigure against the same device."
}
},
"options": {
"step": { "step": {
"pair": { "init": {
"data": { "data": {
"pin": "[%key:common::config_flow::data::pin%]" "apps": "Configure applications list",
"enable_ime": "Enable IME"
}, },
"data_description": { "data_description": {
"pin": "Pairing code displayed on the Android TV device." "apps": "Here you can define the list of applications, specify names and icons that will be displayed in the UI.",
}, "enable_ime": "Enable this option to be able to get the current app name and send text as keyboard input. Disable it for devices that show 'Use keyboard on mobile device screen' instead of the on-screen keyboard."
"description": "Enter the pairing code displayed on the Android TV ({name})." }
}, },
"reauth_confirm": { "apps": {
"description": "You need to pair again with the Android TV ({name}). It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen.", "title": "Configure Android apps",
"title": "[%key:common::config_flow::title::reauth%]" "description": "Configure application ID {app_id}",
},
"reconfigure": {
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]" "app_name": "Application name",
"app_id": "Application ID",
"app_icon": "Application icon",
"app_delete": "Check to delete this application"
}, },
"data_description": { "data_description": {
"host": "The hostname or IP address of the Android TV device." "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",
"description": "Update the IP address of this previously configured Android TV device." "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."
"user": { }
"data": {
"host": "[%key:common::config_flow::data::host%]"
},
"data_description": {
"host": "The hostname or IP address of the Android TV device."
},
"description": "Enter the IP address of the Android TV you want to add to Home Assistant. It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen."
},
"zeroconf_confirm": {
"description": "Do you want to add the Android TV ({name}) to Home Assistant? It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen.",
"title": "Discovered Android TV"
} }
} }
}, },
@@ -63,36 +93,6 @@
"message": "Invalid media type: {media_type}" "message": "Invalid media type: {media_type}"
} }
}, },
"options": {
"step": {
"apps": {
"data": {
"app_delete": "Check to delete this application",
"app_icon": "Application icon",
"app_id": "Application ID",
"app_name": "Application name"
},
"data_description": {
"app_delete": "Check this box to delete the application from the list.",
"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_id": "E.g. {example_app_id} for {example_app_play_store_url}",
"app_name": "Name of the application as you would like it to be displayed in Home Assistant."
},
"description": "Configure application ID {app_id}",
"title": "Configure Android apps"
},
"init": {
"data": {
"apps": "Configure applications list",
"enable_ime": "Enable IME"
},
"data_description": {
"apps": "Here you can define the list of applications, specify names and icons that will be displayed in the UI.",
"enable_ime": "Enable this option to be able to get the current app name and send text as keyboard input. Disable it for devices that show 'Use keyboard on mobile device screen' instead of the on-screen keyboard."
}
}
}
},
"selector": { "selector": {
"apps": { "apps": {
"options": { "options": {

View File

@@ -4,15 +4,15 @@
"cook_time": { "cook_time": {
"default": "mdi:clock-outline" "default": "mdi:clock-outline"
}, },
"target_temperature": {
"default": "mdi:thermometer"
},
"cook_time_remaining": { "cook_time_remaining": {
"default": "mdi:clock-outline" "default": "mdi:clock-outline"
}, },
"heater_temperature": { "heater_temperature": {
"default": "mdi:thermometer" "default": "mdi:thermometer"
}, },
"target_temperature": {
"default": "mdi:thermometer"
},
"triac_temperature": { "triac_temperature": {
"default": "mdi:thermometer" "default": "mdi:thermometer"
}, },

View File

@@ -1,19 +1,19 @@
{ {
"config": { "config": {
"step": {
"user": {
"data": {
"username": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]"
}
},
"confirm": {
"description": "[%key:common::config_flow::description::confirm_setup%]"
}
},
"error": { "error": {
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
},
"step": {
"confirm": {
"description": "[%key:common::config_flow::description::confirm_setup%]"
},
"user": {
"data": {
"password": "[%key:common::config_flow::data::password%]",
"username": "[%key:common::config_flow::data::email%]"
}
}
} }
}, },
"entity": { "entity": {
@@ -21,39 +21,39 @@
"cook_time": { "cook_time": {
"name": "Cook time" "name": "Cook time"
}, },
"state": {
"name": "State",
"state": {
"preheating": "Preheating",
"cooking": "Cooking",
"maintaining": "Maintaining",
"timer_expired": "Timer expired",
"set_timer": "Set timer",
"no_state": "No state"
}
},
"mode": {
"name": "[%key:common::config_flow::data::mode%]",
"state": {
"startup": "Startup",
"idle": "[%key:common::state::idle%]",
"cook": "Cooking",
"low_water": "Low water",
"ota": "OTA update",
"provisioning": "Provisioning",
"high_temp": "High temperature",
"device_failure": "Device failure"
}
},
"target_temperature": {
"name": "Target temperature"
},
"cook_time_remaining": { "cook_time_remaining": {
"name": "Cook time remaining" "name": "Cook time remaining"
}, },
"heater_temperature": { "heater_temperature": {
"name": "Heater temperature" "name": "Heater temperature"
}, },
"mode": {
"name": "[%key:common::config_flow::data::mode%]",
"state": {
"cook": "Cooking",
"device_failure": "Device failure",
"high_temp": "High temperature",
"idle": "[%key:common::state::idle%]",
"low_water": "Low water",
"ota": "OTA update",
"provisioning": "Provisioning",
"startup": "Startup"
}
},
"state": {
"name": "State",
"state": {
"cooking": "Cooking",
"maintaining": "Maintaining",
"no_state": "No state",
"preheating": "Preheating",
"set_timer": "Set timer",
"timer_expired": "Timer expired"
}
},
"target_temperature": {
"name": "Target temperature"
},
"triac_temperature": { "triac_temperature": {
"name": "Triac temperature" "name": "Triac temperature"
}, },

View File

@@ -1,12 +1,5 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"cannot_receive_deviceinfo": "Failed to retrieve MAC address. Make sure the device is turned on"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
@@ -14,6 +7,13 @@
"port": "[%key:common::config_flow::data::port%]" "port": "[%key:common::config_flow::data::port%]"
} }
} }
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"cannot_receive_deviceinfo": "Failed to retrieve MAC address. Make sure the device is turned on"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
} }
} }
} }

View File

@@ -1,61 +1,61 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
},
"error": {
"authentication_error": "[%key:common::config_flow::error::invalid_auth%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"timeout_connect": "[%key:common::config_flow::error::timeout_connect%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
"api_key": "[%key:common::config_flow::data::api_key%]" "api_key": "[%key:common::config_flow::data::api_key%]"
} }
} }
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"timeout_connect": "[%key:common::config_flow::error::timeout_connect%]",
"authentication_error": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
} }
}, },
"config_subentries": { "config_subentries": {
"conversation": { "conversation": {
"abort": { "initiate_flow": {
"entry_not_loaded": "Cannot add things while the configuration is disabled.", "user": "Add conversation agent",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]" "reconfigure": "Reconfigure conversation agent"
}, },
"entry_type": "Conversation agent", "entry_type": "Conversation agent",
"error": {
"thinking_budget_too_large": "Maximum tokens must be greater than the thinking budget.",
"web_search_unsupported_model": "Web search is not supported by the selected model. Please choose a compatible model or disable web search."
},
"initiate_flow": {
"reconfigure": "Reconfigure conversation agent",
"user": "Add conversation agent"
},
"step": { "step": {
"set_options": { "set_options": {
"data": { "data": {
"chat_model": "[%key:common::generic::model%]",
"llm_hass_api": "[%key:common::config_flow::data::llm_hass_api%]",
"max_tokens": "Maximum tokens to return in response",
"name": "[%key:common::config_flow::data::name%]", "name": "[%key:common::config_flow::data::name%]",
"prompt": "[%key:common::config_flow::data::prompt%]", "prompt": "[%key:common::config_flow::data::prompt%]",
"recommended": "Recommended model settings", "chat_model": "[%key:common::generic::model%]",
"max_tokens": "Maximum tokens to return in response",
"temperature": "Temperature", "temperature": "Temperature",
"llm_hass_api": "[%key:common::config_flow::data::llm_hass_api%]",
"recommended": "Recommended model settings",
"thinking_budget": "Thinking budget", "thinking_budget": "Thinking budget",
"user_location": "Include home location",
"web_search": "Enable web search", "web_search": "Enable web search",
"web_search_max_uses": "Maximum web searches" "web_search_max_uses": "Maximum web searches",
"user_location": "Include home location"
}, },
"data_description": { "data_description": {
"prompt": "Instruct how the LLM should respond. This can be a template.", "prompt": "Instruct how the LLM should respond. This can be a template.",
"thinking_budget": "The number of tokens the model can use to think about the response out of the total maximum number of tokens. Set to 1024 or greater to enable extended thinking.", "thinking_budget": "The number of tokens the model can use to think about the response out of the total maximum number of tokens. Set to 1024 or greater to enable extended thinking.",
"user_location": "Localize search results based on home location",
"web_search": "The web search tool gives Claude direct access to real-time web content, allowing it to answer questions with up-to-date information beyond its knowledge cutoff", "web_search": "The web search tool gives Claude direct access to real-time web content, allowing it to answer questions with up-to-date information beyond its knowledge cutoff",
"web_search_max_uses": "Limit the number of searches performed per response" "web_search_max_uses": "Limit the number of searches performed per response",
"user_location": "Localize search results based on home location"
} }
} }
},
"abort": {
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
"entry_not_loaded": "Cannot add things while the configuration is disabled."
},
"error": {
"thinking_budget_too_large": "Maximum tokens must be greater than the thinking budget.",
"web_search_unsupported_model": "Web search is not supported by the selected model. Please choose a compatible model or disable web search."
} }
} }
} }

View File

@@ -5,5 +5,5 @@
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/aosmith", "documentation": "https://www.home-assistant.io/integrations/aosmith",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"requirements": ["py-aosmith==1.0.15"] "requirements": ["py-aosmith==1.0.14"]
} }

View File

@@ -1,28 +1,28 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
},
"error": {
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"step": { "step": {
"reauth_confirm": {
"data": {
"password": "[%key:common::config_flow::data::password%]"
},
"description": "Please update your password for {email}",
"title": "[%key:common::config_flow::title::reauth%]"
},
"user": { "user": {
"data": { "data": {
"email": "[%key:common::config_flow::data::email%]", "email": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]" "password": "[%key:common::config_flow::data::password%]"
}, },
"description": "Please enter your A. O. Smith credentials." "description": "Please enter your A. O. Smith credentials."
},
"reauth_confirm": {
"description": "Please update your password for {email}",
"title": "[%key:common::config_flow::title::reauth%]",
"data": {
"password": "[%key:common::config_flow::data::password%]"
}
} }
},
"error": {
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
} }
}, },
"entity": { "entity": {
@@ -30,19 +30,19 @@
"hot_water_plus_level": { "hot_water_plus_level": {
"name": "Hot Water+ level", "name": "Hot Water+ level",
"state": { "state": {
"off": "[%key:common::state::off%]",
"level1": "Level 1", "level1": "Level 1",
"level2": "Level 2", "level2": "Level 2",
"level3": "Level 3", "level3": "Level 3"
"off": "[%key:common::state::off%]"
} }
} }
}, },
"sensor": { "sensor": {
"energy_usage": {
"name": "Energy usage"
},
"hot_water_availability": { "hot_water_availability": {
"name": "Hot water availability" "name": "Hot water availability"
},
"energy_usage": {
"name": "Energy usage"
} }
} }
} }

View File

@@ -9,14 +9,11 @@
"alarm_delay": { "alarm_delay": {
"default": "mdi:alarm" "default": "mdi:alarm"
}, },
"apc_model": {
"default": "mdi:information-outline"
},
"apc_status": { "apc_status": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
"apparent_power": { "apc_model": {
"default": "mdi:gauge" "default": "mdi:information-outline"
}, },
"bad_batteries": { "bad_batteries": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
@@ -30,18 +27,30 @@
"cable_type": { "cable_type": {
"default": "mdi:ethernet-cable" "default": "mdi:ethernet-cable"
}, },
"date": { "total_time_on_battery": {
"default": "mdi:calendar-clock" "default": "mdi:timer-outline"
}, },
"date_and_time": { "date": {
"default": "mdi:calendar-clock" "default": "mdi:calendar-clock"
}, },
"dip_switch_settings": { "dip_switch_settings": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
"low_battery_signal": {
"default": "mdi:clock-alert"
},
"driver": { "driver": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
"shutdown_delay": {
"default": "mdi:timer-outline"
},
"wake_delay": {
"default": "mdi:timer-outline"
},
"date_and_time": {
"default": "mdi:calendar-clock"
},
"external_batteries": { "external_batteries": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
@@ -63,8 +72,8 @@
"load_capacity": { "load_capacity": {
"default": "mdi:gauge" "default": "mdi:gauge"
}, },
"low_battery_signal": { "apparent_power": {
"default": "mdi:clock-alert" "default": "mdi:gauge"
}, },
"manufacture_date": { "manufacture_date": {
"default": "mdi:calendar" "default": "mdi:calendar"
@@ -72,20 +81,20 @@
"master_update": { "master_update": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
"max_battery_charge": {
"default": "mdi:battery-alert"
},
"max_time": { "max_time": {
"default": "mdi:timer-off-outline" "default": "mdi:timer-off-outline"
}, },
"max_battery_charge": {
"default": "mdi:battery-alert"
},
"min_time": { "min_time": {
"default": "mdi:timer-outline" "default": "mdi:timer-outline"
}, },
"model": { "model": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
"online_status": { "transfer_count": {
"default": "mdi:information-outline" "default": "mdi:counter"
}, },
"register_1_fault": { "register_1_fault": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
@@ -99,9 +108,6 @@
"restore_capacity": { "restore_capacity": {
"default": "mdi:battery-alert" "default": "mdi:battery-alert"
}, },
"self_test_interval": {
"default": "mdi:information-outline"
},
"self_test_result": { "self_test_result": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
@@ -111,33 +117,24 @@
"serial_number": { "serial_number": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
"shutdown_delay": {
"default": "mdi:timer-outline"
},
"startup_time": { "startup_time": {
"default": "mdi:calendar-clock" "default": "mdi:calendar-clock"
}, },
"online_status": {
"default": "mdi:information-outline"
},
"status": { "status": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
"self_test_interval": {
"default": "mdi:information-outline"
},
"time_left": { "time_left": {
"default": "mdi:clock-alert" "default": "mdi:clock-alert"
}, },
"time_on_battery": { "time_on_battery": {
"default": "mdi:timer-outline" "default": "mdi:timer-outline"
}, },
"total_time_on_battery": {
"default": "mdi:timer-outline"
},
"transfer_count": {
"default": "mdi:counter"
},
"transfer_from_battery": {
"default": "mdi:transfer"
},
"transfer_to_battery": {
"default": "mdi:transfer"
},
"ups_mode": { "ups_mode": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
@@ -147,8 +144,11 @@
"version": { "version": {
"default": "mdi:information-outline" "default": "mdi:information-outline"
}, },
"wake_delay": { "transfer_from_battery": {
"default": "mdi:timer-outline" "default": "mdi:transfer"
},
"transfer_to_battery": {
"default": "mdi:transfer"
} }
} }
} }

View File

@@ -2,24 +2,13 @@
"config": { "config": {
"abort": { "abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]", "already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]", "wrong_apcupsd_daemon": "The reconfigured APC UPS Daemon is not the same as the one already configured.",
"wrong_apcupsd_daemon": "The reconfigured APC UPS Daemon is not the same as the one already configured." "reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]"
}, },
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
}, },
"step": { "step": {
"reconfigure": {
"data": {
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]"
},
"data_description": {
"host": "[%key:component::apcupsd::config::step::user::data_description::host%]",
"port": "[%key:component::apcupsd::config::step::user::data_description::port%]"
},
"description": "[%key:component::apcupsd::config::step::user::description%]"
},
"user": { "user": {
"data": { "data": {
"host": "[%key:common::config_flow::data::host%]", "host": "[%key:common::config_flow::data::host%]",
@@ -30,6 +19,17 @@
"port": "The port the APC UPS Daemon is listening on" "port": "The port the APC UPS Daemon is listening on"
}, },
"description": "Enter the host and port on which the apcupsd NIS is being served." "description": "Enter the host and port on which the apcupsd NIS is being served."
},
"reconfigure": {
"data": {
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]"
},
"data_description": {
"host": "[%key:component::apcupsd::config::step::user::data_description::host%]",
"port": "[%key:component::apcupsd::config::step::user::data_description::port%]"
},
"description": "[%key:component::apcupsd::config::step::user::description%]"
} }
} }
}, },
@@ -46,21 +46,15 @@
"ambient_temperature": { "ambient_temperature": {
"name": "Ambient temperature" "name": "Ambient temperature"
}, },
"apc_model": {
"name": "Model"
},
"apc_status": { "apc_status": {
"name": "Status data" "name": "Status data"
}, },
"apparent_power": { "apc_model": {
"name": "Load apparent power" "name": "Model"
}, },
"bad_batteries": { "bad_batteries": {
"name": "Bad batteries" "name": "Bad batteries"
}, },
"battery_nominal_voltage": {
"name": "Battery nominal voltage"
},
"battery_replacement_date": { "battery_replacement_date": {
"name": "Battery replaced" "name": "Battery replaced"
}, },
@@ -73,36 +67,45 @@
"cable_type": { "cable_type": {
"name": "Cable type" "name": "Cable type"
}, },
"total_time_on_battery": {
"name": "Total time on battery"
},
"date": { "date": {
"name": "Status date" "name": "Status date"
}, },
"date_and_time": {
"name": "Date and time"
},
"dip_switch_settings": { "dip_switch_settings": {
"name": "DIP switch settings" "name": "DIP switch settings"
}, },
"low_battery_signal": {
"name": "Low battery signal"
},
"driver": { "driver": {
"name": "Driver" "name": "Driver"
}, },
"shutdown_delay": {
"name": "Shutdown delay"
},
"wake_delay": {
"name": "Wake delay"
},
"date_and_time": {
"name": "Date and time"
},
"external_batteries": { "external_batteries": {
"name": "External batteries" "name": "External batteries"
}, },
"firmware_version": { "firmware_version": {
"name": "Firmware version" "name": "Firmware version"
}, },
"transfer_high": {
"name": "Transfer high"
},
"hostname": { "hostname": {
"name": "Hostname" "name": "Hostname"
}, },
"humidity": { "humidity": {
"name": "Ambient humidity" "name": "Ambient humidity"
}, },
"input_voltage_high": {
"name": "Input voltage high"
},
"input_voltage_low": {
"name": "Input voltage low"
},
"internal_temperature": { "internal_temperature": {
"name": "Internal temperature" "name": "Internal temperature"
}, },
@@ -124,8 +127,11 @@
"load_capacity": { "load_capacity": {
"name": "Load" "name": "Load"
}, },
"low_battery_signal": { "apparent_power": {
"name": "Low battery signal" "name": "Load apparent power"
},
"transfer_low": {
"name": "Transfer low"
}, },
"manufacture_date": { "manufacture_date": {
"name": "Manufacture date" "name": "Manufacture date"
@@ -133,32 +139,41 @@
"master_update": { "master_update": {
"name": "Master update" "name": "Master update"
}, },
"max_battery_charge": { "input_voltage_high": {
"name": "Battery shutdown" "name": "Input voltage high"
}, },
"max_time": { "max_time": {
"name": "Battery timeout" "name": "Battery timeout"
}, },
"max_battery_charge": {
"name": "Battery shutdown"
},
"input_voltage_low": {
"name": "Input voltage low"
},
"min_time": { "min_time": {
"name": "Shutdown time" "name": "Shutdown time"
}, },
"model": { "model": {
"name": "Model" "name": "Model"
}, },
"nominal_apparent_power": { "battery_nominal_voltage": {
"name": "Nominal apparent power" "name": "Battery nominal voltage"
}, },
"nominal_input_voltage": { "nominal_input_voltage": {
"name": "Nominal input voltage" "name": "Nominal input voltage"
}, },
"nominal_output_power": {
"name": "Nominal output power"
},
"nominal_output_voltage": { "nominal_output_voltage": {
"name": "Nominal output voltage" "name": "Nominal output voltage"
}, },
"online_status": { "nominal_output_power": {
"name": "Status flag" "name": "Nominal output power"
},
"nominal_apparent_power": {
"name": "Nominal apparent power"
},
"transfer_count": {
"name": "Transfer count"
}, },
"output_current": { "output_current": {
"name": "Output current" "name": "Output current"
@@ -178,9 +193,6 @@
"restore_capacity": { "restore_capacity": {
"name": "Restore requirement" "name": "Restore requirement"
}, },
"self_test_interval": {
"name": "Self-test interval"
},
"self_test_result": { "self_test_result": {
"name": "Self-test result" "name": "Self-test result"
}, },
@@ -190,39 +202,24 @@
"serial_number": { "serial_number": {
"name": "Serial number" "name": "Serial number"
}, },
"shutdown_delay": {
"name": "Shutdown delay"
},
"startup_time": { "startup_time": {
"name": "Startup time" "name": "Startup time"
}, },
"online_status": {
"name": "Status flag"
},
"status": { "status": {
"name": "Status" "name": "Status"
}, },
"self_test_interval": {
"name": "Self-test interval"
},
"time_left": { "time_left": {
"name": "Time left" "name": "Time left"
}, },
"time_on_battery": { "time_on_battery": {
"name": "Time on battery" "name": "Time on battery"
}, },
"total_time_on_battery": {
"name": "Total time on battery"
},
"transfer_count": {
"name": "Transfer count"
},
"transfer_from_battery": {
"name": "Transfer from battery"
},
"transfer_high": {
"name": "Transfer high"
},
"transfer_low": {
"name": "Transfer low"
},
"transfer_to_battery": {
"name": "Transfer to battery"
},
"ups_mode": { "ups_mode": {
"name": "Mode" "name": "Mode"
}, },
@@ -232,8 +229,11 @@
"version": { "version": {
"name": "Daemon version" "name": "Daemon version"
}, },
"wake_delay": { "transfer_from_battery": {
"name": "Wake delay" "name": "Transfer from battery"
},
"transfer_to_battery": {
"name": "Transfer to battery"
} }
} }
}, },

View File

@@ -17,40 +17,40 @@
"_appletv-v2._tcp.local.", "_appletv-v2._tcp.local.",
"_hscp._tcp.local.", "_hscp._tcp.local.",
{ {
"type": "_airplay._tcp.local.",
"properties": { "properties": {
"model": "appletv*" "model": "appletv*"
}, }
"type": "_airplay._tcp.local."
}, },
{ {
"type": "_airplay._tcp.local.",
"properties": { "properties": {
"model": "audioaccessory*" "model": "audioaccessory*"
}, }
"type": "_airplay._tcp.local."
}, },
{ {
"type": "_airplay._tcp.local.",
"properties": { "properties": {
"am": "airport*" "am": "airport*"
}, }
"type": "_airplay._tcp.local."
}, },
{ {
"type": "_raop._tcp.local.",
"properties": { "properties": {
"am": "appletv*" "am": "appletv*"
}, }
"type": "_raop._tcp.local."
}, },
{ {
"type": "_raop._tcp.local.",
"properties": { "properties": {
"am": "audioaccessory*" "am": "audioaccessory*"
}, }
"type": "_raop._tcp.local."
}, },
{ {
"type": "_raop._tcp.local.",
"properties": { "properties": {
"am": "airport*" "am": "airport*"
}, }
"type": "_raop._tcp.local."
} }
] ]
} }

View File

@@ -1,74 +1,74 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
"backoff": "Device does not accept pairing requests at this time (you might have entered an invalid PIN code too many times), try again later.",
"device_did_not_pair": "No attempt to finish pairing process was made from the device.",
"device_not_found": "Device was not found during discovery, please try adding it again.",
"inconsistent_device": "Expected protocols were not found during discovery. This normally indicates a problem with multicast DNS (Zeroconf). Please try adding the device again.",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"ipv6_not_supported": "IPv6 is not supported.",
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"setup_failed": "Failed to set up device.",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"error": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"flow_title": "{name} ({type})", "flow_title": "{name} ({type})",
"step": { "step": {
"confirm": {
"description": "You are about to add `{name}` of type `{type}` to Home Assistant.\n\n**To complete the process, you may have to enter multiple PIN codes.**\n\nPlease note that you will *not* be able to power off your Apple TV with this integration. Only the media player in Home Assistant will turn off!",
"title": "Confirm adding Apple TV"
},
"pair_no_pin": {
"description": "Pairing is required for the `{protocol}` service. Please enter PIN {pin} on your device to continue.",
"title": "Pairing"
},
"pair_with_pin": {
"data": {
"pin": "[%key:common::config_flow::data::pin%]"
},
"description": "Pairing is required for the `{protocol}` protocol. Please enter the PIN code displayed on screen. Leading zeros shall be omitted, i.e. enter 123 if the displayed code is 0123.",
"title": "Pairing"
},
"password": {
"description": "A password is required by `{protocol}`. This is not yet supported, please disable password to continue.",
"title": "Password required"
},
"protocol_disabled": {
"description": "Pairing is required for `{protocol}` but it is disabled on the device. Please review potential access restrictions (e.g. allow all devices on the local network to connect) on the device.\n\nYou may continue without pairing this protocol, but some functionality will be limited.",
"title": "Pairing not possible"
},
"restore_device": {
"description": "Reconfigure this device to restore its functionality.",
"title": "Device reconfiguration"
},
"service_problem": {
"description": "A problem occurred while pairing protocol `{protocol}`. It will be ignored.",
"title": "Failed to add service"
},
"user": { "user": {
"title": "Set up a new Apple TV",
"description": "Start by entering the device name (e.g. Kitchen or Bedroom) or IP address of the Apple TV you want to add.\n\nIf you cannot see your device or experience any issues, try specifying the device IP address.",
"data": { "data": {
"device_input": "[%key:common::config_flow::data::device%]" "device_input": "[%key:common::config_flow::data::device%]"
}, }
"description": "Start by entering the device name (e.g. Kitchen or Bedroom) or IP address of the Apple TV you want to add.\n\nIf you cannot see your device or experience any issues, try specifying the device IP address.", },
"title": "Set up a new Apple TV" "restore_device": {
"title": "Device reconfiguration",
"description": "Reconfigure this device to restore its functionality."
},
"pair_with_pin": {
"title": "Pairing",
"description": "Pairing is required for the `{protocol}` protocol. Please enter the PIN code displayed on screen. Leading zeros shall be omitted, i.e. enter 123 if the displayed code is 0123.",
"data": {
"pin": "[%key:common::config_flow::data::pin%]"
}
},
"pair_no_pin": {
"title": "Pairing",
"description": "Pairing is required for the `{protocol}` service. Please enter PIN {pin} on your device to continue."
},
"protocol_disabled": {
"title": "Pairing not possible",
"description": "Pairing is required for `{protocol}` but it is disabled on the device. Please review potential access restrictions (e.g. allow all devices on the local network to connect) on the device.\n\nYou may continue without pairing this protocol, but some functionality will be limited."
},
"confirm": {
"title": "Confirm adding Apple TV",
"description": "You are about to add `{name}` of type `{type}` to Home Assistant.\n\n**To complete the process, you may have to enter multiple PIN codes.**\n\nPlease note that you will *not* be able to power off your Apple TV with this integration. Only the media player in Home Assistant will turn off!"
},
"service_problem": {
"title": "Failed to add service",
"description": "A problem occurred while pairing protocol `{protocol}`. It will be ignored."
},
"password": {
"title": "Password required",
"description": "A password is required by `{protocol}`. This is not yet supported, please disable password to continue."
} }
},
"error": {
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"unknown": "[%key:common::config_flow::error::unknown%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]"
},
"abort": {
"ipv6_not_supported": "IPv6 is not supported.",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]",
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"device_did_not_pair": "No attempt to finish pairing process was made from the device.",
"backoff": "Device does not accept pairing requests at this time (you might have entered an invalid PIN code too many times), try again later.",
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
"unknown": "[%key:common::config_flow::error::unknown%]",
"setup_failed": "Failed to set up device.",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"device_not_found": "Device was not found during discovery, please try adding it again.",
"inconsistent_device": "Expected protocols were not found during discovery. This normally indicates a problem with multicast DNS (Zeroconf). Please try adding the device again."
} }
}, },
"options": { "options": {
"step": { "step": {
"init": { "init": {
"description": "Configure general device settings",
"data": { "data": {
"start_off": "Do not turn device on when starting Home Assistant" "start_off": "Do not turn device on when starting Home Assistant"
}, }
"description": "Configure general device settings"
} }
} }
} }

View File

@@ -1,11 +1,5 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": {
"connection_failed": "Connection failed. Please check that the host and port is correct."
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
@@ -16,6 +10,12 @@
"port": "Usually 7000 or 8000" "port": "Usually 7000 or 8000"
} }
} }
},
"error": {
"connection_failed": "Connection failed. Please check that the host and port is correct."
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
} }
}, },
"entity": { "entity": {
@@ -25,96 +25,96 @@
} }
}, },
"humidifier": { "humidifier": {
"dehumidifier": {
"name": "[%key:component::humidifier::entity_component::dehumidifier::name%]"
},
"humidifier": { "humidifier": {
"name": "[%key:component::humidifier::title%]" "name": "[%key:component::humidifier::title%]"
},
"dehumidifier": {
"name": "[%key:component::humidifier::entity_component::dehumidifier::name%]"
} }
}, },
"select": { "select": {
"air_cleaning_event": { "air_cleaning_event": {
"name": "Air cleaning event", "name": "Air cleaning event",
"state": { "state": {
"allergies": "Allergies (24 hour)", "off": "[%key:common::state::off%]",
"event_clean": "Event clean (3 hour)", "event_clean": "Event clean (3 hour)",
"off": "[%key:common::state::off%]" "allergies": "Allergies (24 hour)"
} }
}, },
"air_cleaning_mode": { "air_cleaning_mode": {
"name": "Air cleaning mode", "name": "Air cleaning mode",
"state": { "state": {
"automatic": "Automatic", "off": "[%key:common::state::off%]",
"constant_clean": "Constant clean", "constant_clean": "Constant clean",
"off": "[%key:common::state::off%]" "automatic": "Automatic"
} }
}, },
"fresh_air_event": { "fresh_air_event": {
"name": "Fresh air event", "name": "Fresh air event",
"state": { "state": {
"off": "[%key:common::state::off%]",
"3hour": "3 hour event", "3hour": "3 hour event",
"24hour": "24 hour event", "24hour": "24 hour event"
"off": "[%key:common::state::off%]"
} }
}, },
"fresh_air_mode": { "fresh_air_mode": {
"name": "Fresh air mode", "name": "Fresh air mode",
"state": { "state": {
"automatic": "[%key:component::aprilaire::entity::select::air_cleaning_mode::state::automatic%]", "off": "[%key:common::state::off%]",
"off": "[%key:common::state::off%]" "automatic": "[%key:component::aprilaire::entity::select::air_cleaning_mode::state::automatic%]"
} }
} }
}, },
"sensor": { "sensor": {
"air_cleaning_status": { "indoor_humidity_controlling_sensor": {
"name": "Air cleaning status", "name": "Indoor humidity controlling sensor"
"state": { },
"idle": "[%key:common::state::idle%]", "outdoor_humidity_controlling_sensor": {
"off": "[%key:common::state::off%]", "name": "Outdoor humidity controlling sensor"
"on": "[%key:common::state::on%]" },
} "indoor_temperature_controlling_sensor": {
"name": "Indoor temperature controlling sensor"
},
"outdoor_temperature_controlling_sensor": {
"name": "Outdoor temperature controlling sensor"
}, },
"dehumidification_status": { "dehumidification_status": {
"name": "Dehumidification status", "name": "Dehumidification status",
"state": { "state": {
"idle": "[%key:common::state::idle%]", "idle": "[%key:common::state::idle%]",
"off": "[%key:common::state::off%]", "on": "[%key:common::state::on%]",
"on": "[%key:common::state::on%]" "off": "[%key:common::state::off%]"
}
},
"fan_status": {
"name": "Fan status",
"state": {
"off": "[%key:common::state::off%]",
"on": "[%key:common::state::on%]"
} }
}, },
"humidification_status": { "humidification_status": {
"name": "Humidification status", "name": "Humidification status",
"state": { "state": {
"idle": "[%key:common::state::idle%]", "idle": "[%key:common::state::idle%]",
"off": "[%key:common::state::off%]", "on": "[%key:common::state::on%]",
"on": "[%key:common::state::on%]" "off": "[%key:common::state::off%]"
} }
}, },
"indoor_humidity_controlling_sensor": {
"name": "Indoor humidity controlling sensor"
},
"indoor_temperature_controlling_sensor": {
"name": "Indoor temperature controlling sensor"
},
"outdoor_humidity_controlling_sensor": {
"name": "Outdoor humidity controlling sensor"
},
"outdoor_temperature_controlling_sensor": {
"name": "Outdoor temperature controlling sensor"
},
"ventilation_status": { "ventilation_status": {
"name": "Ventilation status", "name": "Ventilation status",
"state": { "state": {
"idle": "[%key:common::state::idle%]", "idle": "[%key:common::state::idle%]",
"off": "[%key:common::state::off%]", "on": "[%key:common::state::on%]",
"on": "[%key:common::state::on%]" "off": "[%key:common::state::off%]"
}
},
"air_cleaning_status": {
"name": "Air cleaning status",
"state": {
"idle": "[%key:common::state::idle%]",
"on": "[%key:common::state::on%]",
"off": "[%key:common::state::off%]"
}
},
"fan_status": {
"name": "Fan status",
"state": {
"on": "[%key:common::state::on%]",
"off": "[%key:common::state::off%]"
} }
} }
} }

View File

@@ -1,11 +1,5 @@
{ {
"config": { "config": {
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"step": { "step": {
"user": { "user": {
"data": { "data": {
@@ -16,29 +10,39 @@
"port": "The integration will default to 8050, if not set, which should be suitable for most installs" "port": "The integration will default to 8050, if not set, which should be suitable for most installs"
} }
} }
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
} }
}, },
"entity": { "entity": {
"binary_sensor": { "binary_sensor": {
"off_grid_status": {
"name": "Off-grid status"
},
"dc_1_short_circuit_error_status": { "dc_1_short_circuit_error_status": {
"name": "DC 1 short circuit error status" "name": "DC 1 short circuit error status"
}, },
"dc_2_short_circuit_error_status": { "dc_2_short_circuit_error_status": {
"name": "DC 2 short circuit error status" "name": "DC 2 short circuit error status"
}, },
"off_grid_status": {
"name": "Off-grid status"
},
"output_fault_status": { "output_fault_status": {
"name": "Output fault status" "name": "Output fault status"
} }
}, },
"number": {
"max_output": {
"name": "Max output"
}
},
"sensor": { "sensor": {
"total_power": {
"name": "Total power"
},
"total_power_p1": {
"name": "Power of P1"
},
"total_power_p2": {
"name": "Power of P2"
},
"lifetime_production": { "lifetime_production": {
"name": "Total lifetime production" "name": "Total lifetime production"
}, },
@@ -56,15 +60,11 @@
}, },
"today_production_p2": { "today_production_p2": {
"name": "Production of today from P2" "name": "Production of today from P2"
}, }
"total_power": { },
"name": "Total power" "number": {
}, "max_output": {
"total_power_p1": { "name": "Max output"
"name": "Power of P1"
},
"total_power_p2": {
"name": "Power of P2"
} }
}, },
"switch": { "switch": {

View File

@@ -13,9 +13,9 @@
"wi_fi_strength": { "wi_fi_strength": {
"default": "mdi:wifi", "default": "mdi:wifi",
"state": { "state": {
"high": "mdi:wifi-strength-4",
"low": "mdi:wifi-strength-1", "low": "mdi:wifi-strength-1",
"medium": "mdi:wifi-strength-2" "medium": "mdi:wifi-strength-2",
"high": "mdi:wifi-strength-4"
} }
} }
} }

View File

@@ -1,22 +1,22 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]" "user": {
"description": "Select the brand of the softener and fill in your softener mobile app credentials",
"data": {
"brand": "Brand",
"email": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]"
}
}
}, },
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
}, },
"step": { "abort": {
"user": { "already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
"data": {
"brand": "Brand",
"email": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]"
},
"description": "Select the brand of the softener and fill in your softener mobile app credentials"
}
} }
}, },
"entity": { "entity": {
@@ -27,21 +27,21 @@
"salt_left_side_percentage": { "salt_left_side_percentage": {
"name": "Salt left side percentage" "name": "Salt left side percentage"
}, },
"salt_left_side_time_remaining": {
"name": "Salt left side time remaining"
},
"salt_right_side_percentage": { "salt_right_side_percentage": {
"name": "Salt right side percentage" "name": "Salt right side percentage"
}, },
"salt_left_side_time_remaining": {
"name": "Salt left side time remaining"
},
"salt_right_side_time_remaining": { "salt_right_side_time_remaining": {
"name": "Salt right side time remaining" "name": "Salt right side time remaining"
}, },
"wi_fi_strength": { "wi_fi_strength": {
"name": "Wi-Fi strength", "name": "Wi-Fi strength",
"state": { "state": {
"high": "[%key:common::state::high%]",
"low": "[%key:common::state::low%]", "low": "[%key:common::state::low%]",
"medium": "[%key:common::state::medium%]" "medium": "[%key:common::state::medium%]",
"high": "[%key:common::state::high%]"
} }
} }
} }

View File

@@ -1,10 +1,10 @@
{ {
"entity": { "entity": {
"sensor": { "sensor": {
"radiation_rate": { "radiation_total": {
"default": "mdi:radioactive" "default": "mdi:radioactive"
}, },
"radiation_total": { "radiation_rate": {
"default": "mdi:radioactive" "default": "mdi:radioactive"
}, },
"radon_concentration": { "radon_concentration": {

View File

@@ -3,14 +3,14 @@
"name": "Aranet", "name": "Aranet",
"bluetooth": [ "bluetooth": [
{ {
"connectable": false,
"manufacturer_id": 1794, "manufacturer_id": 1794,
"service_uuid": "f0cd1400-95da-4f4b-9ac8-aa55d312af0c" "service_uuid": "f0cd1400-95da-4f4b-9ac8-aa55d312af0c",
"connectable": false
}, },
{ {
"connectable": false,
"manufacturer_id": 1794, "manufacturer_id": 1794,
"service_uuid": "0000fce0-0000-1000-8000-00805f9b34fb" "service_uuid": "0000fce0-0000-1000-8000-00805f9b34fb",
"connectable": false
} }
], ],
"codeowners": ["@aschmitz", "@thecode", "@anrijs"], "codeowners": ["@aschmitz", "@thecode", "@anrijs"],

View File

@@ -1,25 +1,25 @@
{ {
"config": { "config": {
"step": {
"user": {
"description": "[%key:component::bluetooth::config::step::user::description%]",
"data": {
"address": "[%key:common::config_flow::data::device%]"
}
},
"bluetooth_confirm": {
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
}
},
"flow_title": "{name}",
"error": {
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": { "abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]", "already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"integrations_disabled": "This device doesn't have integrations enabled. Please enable smart home integrations using the app and try again.", "integrations_disabled": "This device doesn't have integrations enabled. Please enable smart home integrations using the app and try again.",
"no_devices_found": "No unconfigured Aranet devices found.", "no_devices_found": "No unconfigured Aranet devices found.",
"outdated_version": "This device is using outdated firmware. Please update it to at least v1.2.0 and try again." "outdated_version": "This device is using outdated firmware. Please update it to at least v1.2.0 and try again."
},
"error": {
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"flow_title": "{name}",
"step": {
"bluetooth_confirm": {
"description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]"
},
"user": {
"data": {
"address": "[%key:common::config_flow::data::device%]"
},
"description": "[%key:component::bluetooth::config::step::user::description%]"
}
} }
}, },
"entity": { "entity": {
@@ -28,8 +28,8 @@
"state": { "state": {
"error": "[%key:common::state::error%]", "error": "[%key:common::state::error%]",
"green": "Green", "green": "Green",
"red": "Red", "yellow": "Yellow",
"yellow": "Yellow" "red": "Red"
} }
} }
} }

View File

@@ -1,19 +1,19 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]" "user": {
"description": "Set up your Arve device",
"data": {
"access_token": "Arve token",
"client_secret": "Arve customer token"
}
}
}, },
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
}, },
"step": { "abort": {
"user": { "already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
"data": {
"access_token": "Arve token",
"client_secret": "Arve customer token"
},
"description": "Set up your Arve device"
}
} }
}, },
"entity": { "entity": {

View File

@@ -1,28 +1,28 @@
{ {
"config": { "config": {
"abort": { "step": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]", "user": {
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]", "data": {
"unique_id_mismatch": "The user identifier does not match the previous identifier" "email": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]"
}
},
"reauth_confirm": {
"data": {
"email": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]"
}
}
}, },
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
}, },
"step": { "abort": {
"reauth_confirm": { "already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
"data": { "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"email": "[%key:common::config_flow::data::email%]", "unique_id_mismatch": "The user identifier does not match the previous identifier"
"password": "[%key:common::config_flow::data::password%]"
}
},
"user": {
"data": {
"email": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]"
}
}
} }
}, },
"entity": { "entity": {

View File

@@ -65,6 +65,7 @@ __all__ = (
"async_create_default_pipeline", "async_create_default_pipeline",
"async_get_pipelines", "async_get_pipelines",
"async_pipeline_from_audio_stream", "async_pipeline_from_audio_stream",
"async_setup",
"async_update_pipeline", "async_update_pipeline",
) )

View File

@@ -19,14 +19,7 @@ import wave
import hass_nabucasa import hass_nabucasa
import voluptuous as vol import voluptuous as vol
from homeassistant.components import ( from homeassistant.components import conversation, stt, tts, wake_word, websocket_api
conversation,
media_player,
stt,
tts,
wake_word,
websocket_api,
)
from homeassistant.const import ATTR_SUPPORTED_FEATURES, MATCH_ALL from homeassistant.const import ATTR_SUPPORTED_FEATURES, MATCH_ALL
from homeassistant.core import Context, HomeAssistant, callback from homeassistant.core import Context, HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
@@ -137,10 +130,7 @@ SAVE_DELAY = 10
@callback @callback
def _async_local_fallback_intent_filter(result: RecognizeResult) -> bool: def _async_local_fallback_intent_filter(result: RecognizeResult) -> bool:
"""Filter out intents that are not local fallback.""" """Filter out intents that are not local fallback."""
return result.intent.name in ( return result.intent.name in (intent.INTENT_GET_STATE)
intent.INTENT_GET_STATE,
media_player.INTENT_MEDIA_SEARCH_AND_PLAY,
)
@callback @callback

View File

@@ -15,8 +15,8 @@
"vad_sensitivity": { "vad_sensitivity": {
"name": "Finished speaking detection", "name": "Finished speaking detection",
"state": { "state": {
"aggressive": "Aggressive",
"default": "Default", "default": "Default",
"aggressive": "Aggressive",
"relaxed": "Relaxed" "relaxed": "Relaxed"
} }
} }
@@ -24,14 +24,14 @@
}, },
"issues": { "issues": {
"assist_in_progress_deprecated": { "assist_in_progress_deprecated": {
"title": "{integration_name} in progress binary sensors are deprecated",
"fix_flow": { "fix_flow": {
"step": { "step": {
"confirm_disable_entity": { "confirm_disable_entity": {
"description": "The {integration_name} in progress binary sensor `{entity_id}` is deprecated.\n\nMigrate your configuration to use the corresponding `{assist_satellite_domain}` entity and then click SUBMIT to disable the in progress binary sensor and fix this issue." "description": "The {integration_name} in progress binary sensor `{entity_id}` is deprecated.\n\nMigrate your configuration to use the corresponding `{assist_satellite_domain}` entity and then click SUBMIT to disable the in progress binary sensor and fix this issue."
} }
} }
}, }
"title": "{integration_name} in progress binary sensors are deprecated"
} }
} }
} }

View File

@@ -8,11 +8,11 @@
"announce": { "announce": {
"service": "mdi:bullhorn" "service": "mdi:bullhorn"
}, },
"ask_question": {
"service": "mdi:microphone-question"
},
"start_conversation": { "start_conversation": {
"service": "mdi:forum" "service": "mdi:forum"
},
"ask_question": {
"service": "mdi:microphone-question"
} }
} }
} }

View File

@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/assist_satellite", "documentation": "https://www.home-assistant.io/integrations/assist_satellite",
"integration_type": "entity", "integration_type": "entity",
"quality_scale": "internal", "quality_scale": "internal",
"requirements": ["hassil==3.3.0"] "requirements": ["hassil==3.2.0"]
} }

View File

@@ -1,12 +1,93 @@
{ {
"title": "Assist satellite",
"entity_component": { "entity_component": {
"_": { "_": {
"name": "Assist satellite", "name": "Assist satellite",
"state": { "state": {
"idle": "[%key:common::state::idle%]", "idle": "[%key:common::state::idle%]",
"listening": "Listening", "listening": "Listening",
"processing": "Processing", "responding": "Responding",
"responding": "Responding" "processing": "Processing"
}
}
},
"services": {
"announce": {
"name": "Announce",
"description": "Lets a satellite announce a message.",
"fields": {
"message": {
"name": "Message",
"description": "The message to announce."
},
"media_id": {
"name": "Media ID",
"description": "The media ID to announce instead of using text-to-speech."
},
"preannounce": {
"name": "Preannounce",
"description": "Play a sound before the announcement."
},
"preannounce_media_id": {
"name": "Preannounce media ID",
"description": "Custom media ID to play before the announcement."
}
}
},
"start_conversation": {
"name": "Start conversation",
"description": "Starts a conversation from a satellite.",
"fields": {
"start_message": {
"name": "Message",
"description": "The message to start with."
},
"start_media_id": {
"name": "Media ID",
"description": "The media ID to start with instead of using text-to-speech."
},
"extra_system_prompt": {
"name": "Extra system prompt",
"description": "Provide background information to the AI about the request."
},
"preannounce": {
"name": "Preannounce",
"description": "Play a sound before the start message or media."
},
"preannounce_media_id": {
"name": "Preannounce media ID",
"description": "Custom media ID to play before the start message or media."
}
}
},
"ask_question": {
"name": "Ask question",
"description": "Asks a question and gets the user's response.",
"fields": {
"entity_id": {
"name": "Entity",
"description": "Assist satellite entity to ask the question on."
},
"question": {
"name": "Question",
"description": "The question to ask."
},
"question_media_id": {
"name": "Question media ID",
"description": "The media ID of the question to use instead of text-to-speech."
},
"preannounce": {
"name": "Preannounce",
"description": "Play a sound before the start message or media."
},
"preannounce_media_id": {
"name": "Preannounce media ID",
"description": "Custom media ID to play before the start message or media."
},
"answers": {
"name": "Answers",
"description": "Possible answers to the question."
}
} }
} }
}, },
@@ -17,86 +98,5 @@
"sentences": "Sentences" "sentences": "Sentences"
} }
} }
}, }
"services": {
"announce": {
"description": "Lets a satellite announce a message.",
"fields": {
"media_id": {
"description": "The media ID to announce instead of using text-to-speech.",
"name": "Media ID"
},
"message": {
"description": "The message to announce.",
"name": "Message"
},
"preannounce": {
"description": "Play a sound before the announcement.",
"name": "Preannounce"
},
"preannounce_media_id": {
"description": "Custom media ID to play before the announcement.",
"name": "Preannounce media ID"
}
},
"name": "Announce"
},
"ask_question": {
"description": "Asks a question and gets the user's response.",
"fields": {
"answers": {
"description": "Possible answers to the question.",
"name": "Answers"
},
"entity_id": {
"description": "Assist satellite entity to ask the question on.",
"name": "Entity"
},
"preannounce": {
"description": "Play a sound before the start message or media.",
"name": "Preannounce"
},
"preannounce_media_id": {
"description": "Custom media ID to play before the start message or media.",
"name": "Preannounce media ID"
},
"question": {
"description": "The question to ask.",
"name": "Question"
},
"question_media_id": {
"description": "The media ID of the question to use instead of text-to-speech.",
"name": "Question media ID"
}
},
"name": "Ask question"
},
"start_conversation": {
"description": "Starts a conversation from a satellite.",
"fields": {
"extra_system_prompt": {
"description": "Provide background information to the AI about the request.",
"name": "Extra system prompt"
},
"preannounce": {
"description": "Play a sound before the start message or media.",
"name": "Preannounce"
},
"preannounce_media_id": {
"description": "Custom media ID to play before the start message or media.",
"name": "Preannounce media ID"
},
"start_media_id": {
"description": "The media ID to start with instead of using text-to-speech.",
"name": "Media ID"
},
"start_message": {
"description": "The message to start with.",
"name": "Message"
}
},
"name": "Start conversation"
}
},
"title": "Assist satellite"
} }

View File

@@ -72,16 +72,7 @@ class WrtDevice(NamedTuple):
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
type _FuncType[_T] = Callable[ type _FuncType[_T] = Callable[[_T], Awaitable[list[Any] | tuple[Any] | dict[str, Any]]]
[_T],
Awaitable[
list[str]
| tuple[float | None, float | None]
| list[float]
| dict[str, float | str | None]
| dict[str, float]
],
]
type _ReturnFuncType[_T] = Callable[[_T], Coroutine[Any, Any, dict[str, Any]]] type _ReturnFuncType[_T] = Callable[[_T], Coroutine[Any, Any, dict[str, Any]]]
@@ -96,9 +87,7 @@ def handle_errors_and_zip[_AsusWrtBridgeT: AsusWrtBridge](
"""Run library methods and zip results or manage exceptions.""" """Run library methods and zip results or manage exceptions."""
@functools.wraps(func) @functools.wraps(func)
async def _wrapper( async def _wrapper(self: _AsusWrtBridgeT) -> dict[str, str]:
self: _AsusWrtBridgeT,
) -> dict[str, float | str | None] | dict[str, float]:
try: try:
data = await func(self) data = await func(self)
except exceptions as exc: except exceptions as exc:
@@ -125,9 +114,7 @@ class AsusWrtBridge(ABC):
@staticmethod @staticmethod
def get_bridge( def get_bridge(
hass: HomeAssistant, hass: HomeAssistant, conf: dict[str, Any], options: dict[str, Any] | None = None
conf: dict[str, str | int],
options: dict[str, str | bool | int] | None = None,
) -> AsusWrtBridge: ) -> AsusWrtBridge:
"""Get Bridge instance.""" """Get Bridge instance."""
if conf[CONF_PROTOCOL] in (PROTOCOL_HTTPS, PROTOCOL_HTTP): if conf[CONF_PROTOCOL] in (PROTOCOL_HTTPS, PROTOCOL_HTTP):
@@ -326,22 +313,22 @@ class AsusWrtLegacyBridge(AsusWrtBridge):
return [SENSORS_TEMPERATURES_LEGACY[i] for i in range(3) if availability[i]] return [SENSORS_TEMPERATURES_LEGACY[i] for i in range(3) if availability[i]]
@handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_BYTES) @handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_BYTES)
async def _get_bytes(self) -> tuple[float | None, float | None]: async def _get_bytes(self) -> Any:
"""Fetch byte information from the router.""" """Fetch byte information from the router."""
return await self._api.async_get_bytes_total() return await self._api.async_get_bytes_total()
@handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_RATES) @handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_RATES)
async def _get_rates(self) -> tuple[float, float]: async def _get_rates(self) -> Any:
"""Fetch rates information from the router.""" """Fetch rates information from the router."""
return await self._api.async_get_current_transfer_rates() return await self._api.async_get_current_transfer_rates()
@handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_LOAD_AVG) @handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_LOAD_AVG)
async def _get_load_avg(self) -> list[float]: async def _get_load_avg(self) -> Any:
"""Fetch load average information from the router.""" """Fetch load average information from the router."""
return await self._api.async_get_loadavg() return await self._api.async_get_loadavg()
@handle_errors_and_zip((OSError, ValueError), None) @handle_errors_and_zip((OSError, ValueError), None)
async def _get_temperatures(self) -> dict[str, float]: async def _get_temperatures(self) -> Any:
"""Fetch temperatures information from the router.""" """Fetch temperatures information from the router."""
return await self._api.async_get_temperature() return await self._api.async_get_temperature()

Some files were not shown because too many files have changed in this diff Show More