mirror of
				https://github.com/home-assistant/core.git
				synced 2025-10-29 21:49:33 +00:00 
			
		
		
		
	Compare commits
	
		
			130 Commits
		
	
	
		
			knx-moveou
			...
			2025.11.0b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 95ac5c0183 | ||
|   | 40995b6d32 | ||
|   | f64c029bd1 | ||
|   | a050c0cd05 | ||
|   | 0c121468e0 | ||
|   | af277651f8 | ||
|   | ca90826478 | ||
|   | dd4789af4e | ||
|   | ca49b6e7e2 | ||
|   | fdbe293483 | ||
|   | aa67b46f6f | ||
|   | 9f21a97d39 | ||
|   | 49158fad48 | ||
|   | dff8e5221b | ||
|   | dbfa0aa22c | ||
|   | ec4464d65f | ||
|   | 6c8dffd521 | ||
|   | 09763012fc | ||
|   | aa5b970102 | ||
|   | 80912045d7 | ||
|   | dbda31f6d5 | ||
|   | 24219dd8f7 | ||
|   | 77d0cf1573 | ||
|   | 1ea534e400 | ||
|   | a6ba8fa69c | ||
|   | a6c1ce86d8 | ||
|   | fbb07e16cb | ||
|   | 1387308f48 | ||
|   | 48d371eddb | ||
|   | c45c11574c | ||
|   | 14eb103338 | ||
|   | 2bdb258a39 | ||
|   | 5b323526b6 | ||
|   | 9d434c9403 | ||
|   | e4103137ef | ||
|   | d9d4cc9004 | ||
|   | 67baa2c737 | ||
|   | f9c504fcde | ||
|   | 4b25d04326 | ||
|   | 4e3eb44e69 | ||
|   | 6c84d25024 | ||
|   | c4dc4135e1 | ||
|   | 78bbdf108b | ||
|   | 47397fd736 | ||
|   | 2b62d2d636 | ||
|   | 350f99baab | ||
|   | 1245385371 | ||
|   | c86852eb21 | ||
|   | ad635d2eff | ||
|   | cf0e2b85dd | ||
|   | b9e7f1c628 | ||
|   | 079d65acea | ||
|   | 162737a473 | ||
|   | d074c5b7c8 | ||
|   | d6ae0c142e | ||
|   | 58182a344d | ||
|   | 1a1f3d6b4e | ||
|   | 71589d212f | ||
|   | 9364a40fd2 | ||
|   | 7ead8f9154 | ||
|   | 09ac47b35f | ||
|   | 404393d6fe | ||
|   | de5a26830d | ||
|   | c0b0ce0c16 | ||
|   | 88e27d9017 | ||
|   | a37ba6dba4 | ||
|   | f38c0d510e | ||
|   | be9fa9a606 | ||
|   | 2bc6e728a3 | ||
|   | 4e4a0d1e28 | ||
|   | c860aa1531 | ||
|   | 39c73cbbbd | ||
|   | ca7332f597 | ||
|   | eafedeb12a | ||
|   | ce93de7fc6 | ||
|   | 03f339b3a3 | ||
|   | 6cfeeea1ba | ||
|   | ccbdaabe74 | ||
|   | dd22c78d11 | ||
|   | 1a732accdd | ||
|   | 59d663ee6e | ||
|   | 2442a96c27 | ||
|   | f69de99501 | ||
|   | 8ce9238f7a | ||
|   | 2fe697486d | ||
|   | 0bd25dc254 | ||
|   | ed6af953af | ||
|   | 84f65c3f77 | ||
|   | 77c024fcdd | ||
|   | 27570138e7 | ||
|   | 96f84b2b99 | ||
|   | 28bee6d1aa | ||
|   | c9d68ddd5c | ||
|   | ac6dddc895 | ||
|   | f7e5dc7637 | ||
|   | 1a5f431485 | ||
|   | faa04755e2 | ||
|   | 76584161a6 | ||
|   | 103b121868 | ||
|   | 76a6b3cea6 | ||
|   | 87e7fe6e37 | ||
|   | c782489973 | ||
|   | c9dbc1458c | ||
|   | d4a33611f0 | ||
|   | f028b7ab6e | ||
|   | 86a9df761a | ||
|   | e3359fb62d | ||
|   | 84065767d1 | ||
|   | e7c60f573d | ||
|   | a59847309a | ||
|   | 3c8ac20881 | ||
|   | 6394fdbc97 | ||
|   | a7a673d437 | ||
|   | 196d7bb8cf | ||
|   | ce5538e615 | ||
|   | 6819b0ce5b | ||
|   | 91eb35d7cb | ||
|   | 256615644c | ||
|   | aff6cfb032 | ||
|   | a5d8c383c4 | ||
|   | 81df40e2b0 | ||
|   | 3e6ddda54e | ||
|   | 76c6b92910 | ||
|   | f7db56a6b3 | ||
|   | 507645a60f | ||
|   | 7c4406265a | ||
|   | 4e6bd48416 | ||
|   | 255b1efe81 | ||
|   | afa5093d7a | ||
|   | a43368675e | 
							
								
								
									
										8
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -364,13 +364,13 @@ jobs: | ||||
|       - name: Run check-json | ||||
|         run: | | ||||
|           . venv/bin/activate | ||||
|           pre-commit run --hook-stage manual check-json --all-files | ||||
|           pre-commit run --hook-stage manual check-json --all-files --show-diff-on-failure | ||||
|  | ||||
|       - name: Run prettier (fully) | ||||
|         if: needs.info.outputs.test_full_suite == 'true' | ||||
|         run: | | ||||
|           . venv/bin/activate | ||||
|           pre-commit run --hook-stage manual prettier --all-files | ||||
|           pre-commit run --hook-stage manual prettier --all-files --show-diff-on-failure | ||||
|  | ||||
|       - name: Run prettier (partially) | ||||
|         if: needs.info.outputs.test_full_suite == 'false' | ||||
| @@ -378,7 +378,7 @@ jobs: | ||||
|         run: | | ||||
|           . venv/bin/activate | ||||
|           shopt -s globstar | ||||
|           pre-commit run --hook-stage manual prettier --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/{*,**/*} | ||||
|           pre-commit run --hook-stage manual prettier --show-diff-on-failure --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/{*,**/*} | ||||
|  | ||||
|       - name: Register check executables problem matcher | ||||
|         run: | | ||||
| @@ -386,7 +386,7 @@ jobs: | ||||
|       - name: Run executables check | ||||
|         run: | | ||||
|           . venv/bin/activate | ||||
|           pre-commit run --hook-stage manual check-executables-have-shebangs --all-files | ||||
|           pre-commit run --hook-stage manual check-executables-have-shebangs --all-files --show-diff-on-failure | ||||
|  | ||||
|       - name: Register codespell problem matcher | ||||
|         run: | | ||||
|   | ||||
| @@ -33,10 +33,13 @@ repos: | ||||
|     rev: v1.37.1 | ||||
|     hooks: | ||||
|       - id: yamllint | ||||
|   - repo: https://github.com/pre-commit/mirrors-prettier | ||||
|     rev: v3.0.3 | ||||
|   - repo: https://github.com/rbubley/mirrors-prettier | ||||
|     rev: v3.6.2 | ||||
|     hooks: | ||||
|       - id: prettier | ||||
|         additional_dependencies: | ||||
|           - prettier@3.6.2 | ||||
|           - prettier-plugin-sort-json@4.1.1 | ||||
|   - repo: https://github.com/cdce8p/python-typing-update | ||||
|     rev: v0.6.0 | ||||
|     hooks: | ||||
|   | ||||
							
								
								
									
										24
									
								
								.prettierrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								.prettierrc.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| /** @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", | ||||
|         }), | ||||
|       }, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
| @@ -361,7 +361,6 @@ homeassistant.components.myuplink.* | ||||
| homeassistant.components.nam.* | ||||
| homeassistant.components.nanoleaf.* | ||||
| homeassistant.components.nasweb.* | ||||
| homeassistant.components.neato.* | ||||
| homeassistant.components.nest.* | ||||
| homeassistant.components.netatmo.* | ||||
| homeassistant.components.network.* | ||||
|   | ||||
							
								
								
									
										10
									
								
								.vscode/settings.default.jsonc
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.vscode/settings.default.jsonc
									
									
									
									
										vendored
									
									
								
							| @@ -10,16 +10,16 @@ | ||||
|   // Pyright is too pedantic for Home Assistant | ||||
|   "python.analysis.typeCheckingMode": "basic", | ||||
|   "[python]": { | ||||
|     "editor.defaultFormatter": "charliermarsh.ruff" | ||||
|     "editor.defaultFormatter": "charliermarsh.ruff", | ||||
|   }, | ||||
|   "[json][jsonc][yaml]": { | ||||
|     "editor.defaultFormatter": "esbenp.prettier-vscode" | ||||
|     "editor.defaultFormatter": "esbenp.prettier-vscode", | ||||
|   }, | ||||
|   "json.schemas": [ | ||||
|     { | ||||
|       "fileMatch": ["homeassistant/components/*/manifest.json"], | ||||
|       // This value differs between working with devcontainer and locally, therefore this value should NOT be in sync! | ||||
|       "url": "./script/json_schemas/manifest_schema.json" | ||||
|     } | ||||
|   ] | ||||
|       "url": "./script/json_schemas/manifest_schema.json", | ||||
|     }, | ||||
|   ], | ||||
| } | ||||
|   | ||||
| @@ -1,70 +1,70 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "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": { | ||||
|         "title": "Enter your MFA code for Abode", | ||||
|         "data": { | ||||
|           "mfa_code": "MFA code (6-digits)" | ||||
|         } | ||||
|       }, | ||||
|       "reauth_confirm": { | ||||
|         "title": "[%key:component::abode::config::step::user::title%]", | ||||
|         "data": { | ||||
|           "username": "[%key:common::config_flow::data::email%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "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%]" | ||||
|     }, | ||||
|     "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": { | ||||
|       "mfa": { | ||||
|         "data": { | ||||
|           "mfa_code": "MFA code (6-digits)" | ||||
|         }, | ||||
|         "title": "Enter your MFA code for Abode" | ||||
|       }, | ||||
|       "reauth_confirm": { | ||||
|         "data": { | ||||
|           "password": "[%key:common::config_flow::data::password%]", | ||||
|           "username": "[%key:common::config_flow::data::email%]" | ||||
|         }, | ||||
|         "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" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|     "capture_image": { | ||||
|       "name": "Capture image", | ||||
|       "description": "Requests a new image capture from a camera device.", | ||||
|       "fields": { | ||||
|         "entity_id": { | ||||
|           "name": "Entity", | ||||
|           "description": "Entity ID of the camera to request an image from." | ||||
|           "description": "Entity ID of the camera to request an image from.", | ||||
|           "name": "Entity" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Capture image" | ||||
|     }, | ||||
|     "change_setting": { | ||||
|       "name": "Change setting", | ||||
|       "description": "Changes an Abode system setting.", | ||||
|       "fields": { | ||||
|         "setting": { | ||||
|           "name": "Setting", | ||||
|           "description": "Setting to change." | ||||
|           "description": "Setting to change.", | ||||
|           "name": "Setting" | ||||
|         }, | ||||
|         "value": { | ||||
|           "name": "Value", | ||||
|           "description": "Value of the setting." | ||||
|           "description": "Value of the setting.", | ||||
|           "name": "Value" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Change setting" | ||||
|     }, | ||||
|     "trigger_automation": { | ||||
|       "name": "Trigger automation", | ||||
|       "description": "Triggers an Abode automation.", | ||||
|       "fields": { | ||||
|         "entity_id": { | ||||
|           "name": "Entity", | ||||
|           "description": "Entity ID of the automation to trigger." | ||||
|           "description": "Entity ID of the automation to trigger.", | ||||
|           "name": "Entity" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Trigger automation" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -4,20 +4,20 @@ | ||||
|       "timer_running": { | ||||
|         "default": "mdi:timer", | ||||
|         "state": { | ||||
|           "on": "mdi:timer-play", | ||||
|           "off": "mdi:timer-off" | ||||
|           "off": "mdi:timer-off", | ||||
|           "on": "mdi:timer-play" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "button": { | ||||
|       "tare": { | ||||
|         "default": "mdi:scale-balance" | ||||
|       }, | ||||
|       "reset_timer": { | ||||
|         "default": "mdi:timer-refresh" | ||||
|       }, | ||||
|       "start_stop": { | ||||
|         "default": "mdi:timer-play" | ||||
|       }, | ||||
|       "tare": { | ||||
|         "default": "mdi:scale-balance" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "flow_title": "{name}", | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]", | ||||
|       "no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]", | ||||
| @@ -10,18 +9,19 @@ | ||||
|       "device_not_found": "Device could not be found.", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]" | ||||
|     }, | ||||
|     "flow_title": "{name}", | ||||
|     "step": { | ||||
|       "bluetooth_confirm": { | ||||
|         "description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]" | ||||
|       }, | ||||
|       "user": { | ||||
|         "description": "[%key:component::bluetooth::config::step::user::description%]", | ||||
|         "data": { | ||||
|           "address": "[%key:common::config_flow::data::device%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "address": "Select Acaia scale you want to set up" | ||||
|         } | ||||
|         }, | ||||
|         "description": "[%key:component::bluetooth::config::step::user::description%]" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| @@ -32,14 +32,14 @@ | ||||
|       } | ||||
|     }, | ||||
|     "button": { | ||||
|       "tare": { | ||||
|         "name": "Tare" | ||||
|       }, | ||||
|       "reset_timer": { | ||||
|         "name": "Reset timer" | ||||
|       }, | ||||
|       "start_stop": { | ||||
|         "name": "Start/stop timer" | ||||
|       }, | ||||
|       "tare": { | ||||
|         "name": "Tare" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,25 +1,8 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "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%]" | ||||
|         } | ||||
|       } | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_location%]", | ||||
|       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" | ||||
|     }, | ||||
|     "create_entry": { | ||||
|       "default": "Some sensors are not enabled by default. You can enable them in the entity registry after the integration configuration." | ||||
| @@ -29,9 +12,26 @@ | ||||
|       "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." | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_location%]", | ||||
|       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" | ||||
|     "step": { | ||||
|       "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%]" | ||||
|         } | ||||
|       }, | ||||
|       "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": { | ||||
| @@ -120,9 +120,9 @@ | ||||
|       "pressure_tendency": { | ||||
|         "name": "Pressure tendency", | ||||
|         "state": { | ||||
|           "steady": "Steady", | ||||
|           "falling": "Falling", | ||||
|           "rising": "Rising", | ||||
|           "falling": "Falling" | ||||
|           "steady": "Steady" | ||||
|         }, | ||||
|         "state_attributes": { | ||||
|           "options": { | ||||
| @@ -227,9 +227,6 @@ | ||||
|       "wet_bulb_temperature": { | ||||
|         "name": "Wet bulb temperature" | ||||
|       }, | ||||
|       "wind_speed": { | ||||
|         "name": "[%key:component::weather::entity_component::_::state_attributes::wind_speed::name%]" | ||||
|       }, | ||||
|       "wind_chill_temperature": { | ||||
|         "name": "Wind chill temperature" | ||||
|       }, | ||||
| @@ -242,6 +239,9 @@ | ||||
|       "wind_gust_speed_night": { | ||||
|         "name": "Wind gust speed night {forecast_day}" | ||||
|       }, | ||||
|       "wind_speed": { | ||||
|         "name": "[%key:component::weather::entity_component::_::state_attributes::wind_speed::name%]" | ||||
|       }, | ||||
|       "wind_speed_day": { | ||||
|         "name": "Wind speed day {forecast_day}" | ||||
|       }, | ||||
|   | ||||
| @@ -1,15 +1,15 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "title": "Pick a hub to add", | ||||
|         "data": { | ||||
|           "id": "Host ID" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "abort": { | ||||
|       "no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]" | ||||
|     }, | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "id": "Host ID" | ||||
|         }, | ||||
|         "title": "Pick a hub to add" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,29 +1,29 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "title": "Actron Air OAuth2 Authorization" | ||||
|       }, | ||||
|       "timeout": { | ||||
|         "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": { | ||||
|       "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." | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_account%]", | ||||
|       "oauth2_error": "Failed to start OAuth2 flow" | ||||
|     }, | ||||
|     "error": { | ||||
|       "oauth2_error": "Failed to start OAuth2 flow. Please try again later." | ||||
|     }, | ||||
|     "abort": { | ||||
|       "oauth2_error": "Failed to start OAuth2 flow", | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_account%]" | ||||
|     "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." | ||||
|     }, | ||||
|     "step": { | ||||
|       "connection_error": { | ||||
|         "data": {}, | ||||
|         "description": "Failed to connect to Actron Air. Please check your internet connection and try again.", | ||||
|         "title": "Connection error" | ||||
|       }, | ||||
|       "timeout": { | ||||
|         "data": {}, | ||||
|         "description": "The authorization process timed out. Please try again.", | ||||
|         "title": "Authorization timeout" | ||||
|       }, | ||||
|       "user": { | ||||
|         "title": "Actron Air OAuth2 Authorization" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,34 +1,34 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "connection_type": "Select connection type" | ||||
|         }, | ||||
|         "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%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "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": { | ||||
|         "data": { | ||||
|           "connection_type": "Select connection type" | ||||
|         }, | ||||
|         "description": "Select connection type. Local requires heaters with Bluetooth" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,9 @@ | ||||
| { | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "average_processing_speed": { | ||||
|         "default": "mdi:speedometer" | ||||
|       }, | ||||
|       "dns_queries": { | ||||
|         "default": "mdi:magnify" | ||||
|       }, | ||||
| @@ -13,21 +16,18 @@ | ||||
|       "parental_control_blocked": { | ||||
|         "default": "mdi:human-male-girl" | ||||
|       }, | ||||
|       "rules_count": { | ||||
|         "default": "mdi:counter" | ||||
|       }, | ||||
|       "safe_browsing_blocked": { | ||||
|         "default": "mdi:shield-half-full" | ||||
|       }, | ||||
|       "safe_searches_enforced": { | ||||
|         "default": "mdi:shield-search" | ||||
|       }, | ||||
|       "average_processing_speed": { | ||||
|         "default": "mdi:speedometer" | ||||
|       }, | ||||
|       "rules_count": { | ||||
|         "default": "mdi:counter" | ||||
|       } | ||||
|     }, | ||||
|     "switch": { | ||||
|       "protection": { | ||||
|       "filtering": { | ||||
|         "default": "mdi:shield-check", | ||||
|         "state": { | ||||
|           "off": "mdi:shield-off" | ||||
| @@ -39,7 +39,13 @@ | ||||
|           "off": "mdi:shield-off" | ||||
|         } | ||||
|       }, | ||||
|       "safe_search": { | ||||
|       "protection": { | ||||
|         "default": "mdi:shield-check", | ||||
|         "state": { | ||||
|           "off": "mdi:shield-off" | ||||
|         } | ||||
|       }, | ||||
|       "query_log": { | ||||
|         "default": "mdi:shield-check", | ||||
|         "state": { | ||||
|           "off": "mdi:shield-off" | ||||
| @@ -51,13 +57,7 @@ | ||||
|           "off": "mdi:shield-off" | ||||
|         } | ||||
|       }, | ||||
|       "filtering": { | ||||
|         "default": "mdi:shield-check", | ||||
|         "state": { | ||||
|           "off": "mdi:shield-off" | ||||
|         } | ||||
|       }, | ||||
|       "query_log": { | ||||
|       "safe_search": { | ||||
|         "default": "mdi:shield-check", | ||||
|         "state": { | ||||
|           "off": "mdi:shield-off" | ||||
| @@ -69,17 +69,17 @@ | ||||
|     "add_url": { | ||||
|       "service": "mdi:link-plus" | ||||
|     }, | ||||
|     "remove_url": { | ||||
|       "service": "mdi:link-off" | ||||
|     "disable_url": { | ||||
|       "service": "mdi:link-variant-off" | ||||
|     }, | ||||
|     "enable_url": { | ||||
|       "service": "mdi:link-variant" | ||||
|     }, | ||||
|     "disable_url": { | ||||
|       "service": "mdi:link-variant-off" | ||||
|     }, | ||||
|     "refresh": { | ||||
|       "service": "mdi:refresh" | ||||
|     }, | ||||
|     "remove_url": { | ||||
|       "service": "mdi:link-off" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,35 +1,38 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "description": "Set up your AdGuard Home instance to allow monitoring and control.", | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]", | ||||
|           "username": "[%key:common::config_flow::data::username%]", | ||||
|           "ssl": "[%key:common::config_flow::data::ssl%]", | ||||
|           "verify_ssl": "[%key:common::config_flow::data::verify_ssl%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "The hostname or IP address of the device running your AdGuard Home." | ||||
|         } | ||||
|       }, | ||||
|       "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}?" | ||||
|       } | ||||
|     "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%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "existing_instance_updated": "Updated existing configuration.", | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_service%]" | ||||
|     "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": { | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]", | ||||
|           "ssl": "[%key:common::config_flow::data::ssl%]", | ||||
|           "username": "[%key:common::config_flow::data::username%]", | ||||
|           "verify_ssl": "[%key:common::config_flow::data::verify_ssl%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "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." | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "average_processing_speed": { | ||||
|         "name": "Average processing speed" | ||||
|       }, | ||||
|       "dns_queries": { | ||||
|         "name": "DNS queries" | ||||
|       }, | ||||
| @@ -42,94 +45,91 @@ | ||||
|       "parental_control_blocked": { | ||||
|         "name": "Parental control blocked" | ||||
|       }, | ||||
|       "rules_count": { | ||||
|         "name": "Rules count" | ||||
|       }, | ||||
|       "safe_browsing_blocked": { | ||||
|         "name": "Safe browsing blocked" | ||||
|       }, | ||||
|       "safe_searches_enforced": { | ||||
|         "name": "Safe searches enforced" | ||||
|       }, | ||||
|       "average_processing_speed": { | ||||
|         "name": "Average processing speed" | ||||
|       }, | ||||
|       "rules_count": { | ||||
|         "name": "Rules count" | ||||
|       } | ||||
|     }, | ||||
|     "switch": { | ||||
|       "protection": { | ||||
|         "name": "Protection" | ||||
|       "filtering": { | ||||
|         "name": "Filtering" | ||||
|       }, | ||||
|       "parental": { | ||||
|         "name": "Parental control" | ||||
|       }, | ||||
|       "safe_search": { | ||||
|         "name": "Safe search" | ||||
|       "protection": { | ||||
|         "name": "Protection" | ||||
|       }, | ||||
|       "query_log": { | ||||
|         "name": "Query log" | ||||
|       }, | ||||
|       "safe_browsing": { | ||||
|         "name": "Safe browsing" | ||||
|       }, | ||||
|       "filtering": { | ||||
|         "name": "Filtering" | ||||
|       }, | ||||
|       "query_log": { | ||||
|         "name": "Query log" | ||||
|       "safe_search": { | ||||
|         "name": "Safe search" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|     "add_url": { | ||||
|       "name": "Add URL", | ||||
|       "description": "Adds a new filter subscription to AdGuard Home.", | ||||
|       "fields": { | ||||
|         "name": { | ||||
|           "name": "[%key:common::config_flow::data::name%]", | ||||
|           "description": "The name of the filter subscription." | ||||
|           "description": "The name of the filter subscription.", | ||||
|           "name": "[%key:common::config_flow::data::name%]" | ||||
|         }, | ||||
|         "url": { | ||||
|           "name": "[%key:common::config_flow::data::url%]", | ||||
|           "description": "The filter URL to subscribe to, containing the filter rules." | ||||
|           "description": "The filter URL to subscribe to, containing the filter rules.", | ||||
|           "name": "[%key:common::config_flow::data::url%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "remove_url": { | ||||
|       "name": "Remove URL", | ||||
|       "description": "Removes a filter subscription from AdGuard Home.", | ||||
|       "fields": { | ||||
|         "url": { | ||||
|           "name": "[%key:common::config_flow::data::url%]", | ||||
|           "description": "The filter subscription URL to remove." | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "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." | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Add URL" | ||||
|     }, | ||||
|     "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." | ||||
|           "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": { | ||||
|       "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." | ||||
|           "description": "Force update (bypasses AdGuard Home throttling), omit for a regular refresh.", | ||||
|           "name": "Force" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Refresh" | ||||
|     }, | ||||
|     "remove_url": { | ||||
|       "description": "Removes a filter subscription from AdGuard Home.", | ||||
|       "fields": { | ||||
|         "url": { | ||||
|           "description": "The filter subscription URL to remove.", | ||||
|           "name": "[%key:common::config_flow::data::url%]" | ||||
|         } | ||||
|       }, | ||||
|       "name": "Remove URL" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,22 +1,22 @@ | ||||
| { | ||||
|   "services": { | ||||
|     "write_data_by_name": { | ||||
|       "name": "Write data by name", | ||||
|       "description": "Write a value to the connected ADS device.", | ||||
|       "fields": { | ||||
|         "adsvar": { | ||||
|           "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." | ||||
|           "description": "The data type of the variable to write to.", | ||||
|           "name": "ADS type" | ||||
|         }, | ||||
|         "adsvar": { | ||||
|           "description": "The name of the variable to write to.", | ||||
|           "name": "ADS variable" | ||||
|         }, | ||||
|         "value": { | ||||
|           "name": "Value", | ||||
|           "description": "The value to write to the variable." | ||||
|           "description": "The value to write to the variable.", | ||||
|           "name": "Value" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Write data by name" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
| @@ -19,14 +19,14 @@ | ||||
|   }, | ||||
|   "services": { | ||||
|     "set_time_to": { | ||||
|       "name": "Set time to", | ||||
|       "description": "Controls timers to turn the system on or off after a set number of minutes.", | ||||
|       "fields": { | ||||
|         "minutes": { | ||||
|           "name": "Minutes", | ||||
|           "description": "Minutes until action." | ||||
|           "description": "Minutes until action.", | ||||
|           "name": "Minutes" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Set time to" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,57 +1,57 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "api_key": "[%key:common::config_flow::data::api_key%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|     "add_tracking": { | ||||
|       "name": "Add tracking", | ||||
|       "description": "Adds a new tracking number to Aftership.", | ||||
|       "fields": { | ||||
|         "tracking_number": { | ||||
|           "name": "Tracking number", | ||||
|           "description": "Tracking number for the new tracking." | ||||
|         }, | ||||
|         "title": { | ||||
|           "name": "Title", | ||||
|           "description": "A custom title for the new tracking." | ||||
|         }, | ||||
|         "slug": { | ||||
|           "name": "Slug", | ||||
|           "description": "Slug (carrier) of the new tracking." | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "remove_tracking": { | ||||
|       "name": "Remove tracking", | ||||
|       "description": "Removes a tracking number from Aftership.", | ||||
|       "fields": { | ||||
|         "tracking_number": { | ||||
|           "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." | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "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." | ||||
|       "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.", | ||||
|       "title": "The {integration_title} YAML configuration import failed" | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|     "add_tracking": { | ||||
|       "description": "Adds a new tracking number to Aftership.", | ||||
|       "fields": { | ||||
|         "slug": { | ||||
|           "description": "Slug (carrier) of the new tracking.", | ||||
|           "name": "Slug" | ||||
|         }, | ||||
|         "title": { | ||||
|           "description": "A custom title for the new tracking.", | ||||
|           "name": "Title" | ||||
|         }, | ||||
|         "tracking_number": { | ||||
|           "description": "Tracking number for the new tracking.", | ||||
|           "name": "Tracking number" | ||||
|         } | ||||
|       }, | ||||
|       "name": "Add tracking" | ||||
|     }, | ||||
|     "remove_tracking": { | ||||
|       "description": "Removes a tracking number from Aftership.", | ||||
|       "fields": { | ||||
|         "slug": { | ||||
|           "description": "Slug (carrier) of the tracking to remove.", | ||||
|           "name": "[%key:component::aftership::services::add_tracking::fields::slug::name%]" | ||||
|         }, | ||||
|         "tracking_number": { | ||||
|           "description": "Tracking number of the tracking to remove.", | ||||
|           "name": "[%key:component::aftership::services::add_tracking::fields::tracking_number::name%]" | ||||
|         } | ||||
|       }, | ||||
|       "name": "Remove tracking" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,19 +1,19 @@ | ||||
| { | ||||
|   "services": { | ||||
|     "disable_alerts": { | ||||
|       "service": "mdi:bell-off" | ||||
|     }, | ||||
|     "enable_alerts": { | ||||
|       "service": "mdi:bell-alert" | ||||
|     }, | ||||
|     "snapshot": { | ||||
|       "service": "mdi:camera" | ||||
|     }, | ||||
|     "start_recording": { | ||||
|       "service": "mdi:record-rec" | ||||
|     }, | ||||
|     "stop_recording": { | ||||
|       "service": "mdi:stop" | ||||
|     }, | ||||
|     "enable_alerts": { | ||||
|       "service": "mdi:bell-alert" | ||||
|     }, | ||||
|     "disable_alerts": { | ||||
|       "service": "mdi:bell-off" | ||||
|     }, | ||||
|     "snapshot": { | ||||
|       "service": "mdi:camera" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,45 +1,45 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "title": "Set up Agent DVR", | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "The IP address of the Agent DVR server." | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "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": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "The IP address of the Agent DVR server." | ||||
|         }, | ||||
|         "title": "Set up Agent DVR" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|     "start_recording": { | ||||
|       "name": "Start recording", | ||||
|       "description": "Enables continuous recording." | ||||
|     }, | ||||
|     "stop_recording": { | ||||
|       "name": "Stop recording", | ||||
|       "description": "Disables continuous recording." | ||||
|     "disable_alerts": { | ||||
|       "description": "Disables alerts.", | ||||
|       "name": "Disable alerts" | ||||
|     }, | ||||
|     "enable_alerts": { | ||||
|       "name": "Enable alerts", | ||||
|       "description": "Enables alerts." | ||||
|     }, | ||||
|     "disable_alerts": { | ||||
|       "name": "Disable alerts", | ||||
|       "description": "Disables alerts." | ||||
|       "description": "Enables alerts.", | ||||
|       "name": "Enable alerts" | ||||
|     }, | ||||
|     "snapshot": { | ||||
|       "name": "Snapshot", | ||||
|       "description": "Takes a photo." | ||||
|       "description": "Takes a photo.", | ||||
|       "name": "Snapshot" | ||||
|     }, | ||||
|     "start_recording": { | ||||
|       "description": "Enables continuous recording.", | ||||
|       "name": "Start recording" | ||||
|     }, | ||||
|     "stop_recording": { | ||||
|       "description": "Disables continuous recording.", | ||||
|       "name": "Stop recording" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,52 +1,52 @@ | ||||
| { | ||||
|   "services": { | ||||
|     "generate_data": { | ||||
|       "name": "Generate data", | ||||
|       "description": "Uses AI to run a task that generates data.", | ||||
|       "fields": { | ||||
|         "task_name": { | ||||
|           "name": "Task name", | ||||
|           "description": "Name of the task." | ||||
|         }, | ||||
|         "instructions": { | ||||
|           "name": "Instructions", | ||||
|           "description": "Instructions on what needs to be done." | ||||
|         "attachments": { | ||||
|           "description": "List of files to attach for multi-modal AI analysis.", | ||||
|           "name": "Attachments" | ||||
|         }, | ||||
|         "entity_id": { | ||||
|           "name": "Entity ID", | ||||
|           "description": "Entity ID to run the task on. If not provided, the preferred entity will be used." | ||||
|           "description": "Entity ID to run the task on. If not provided, the preferred entity will be used.", | ||||
|           "name": "Entity ID" | ||||
|         }, | ||||
|         "instructions": { | ||||
|           "description": "Instructions on what needs to be done.", | ||||
|           "name": "Instructions" | ||||
|         }, | ||||
|         "structure": { | ||||
|           "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." | ||||
|           "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" | ||||
|         }, | ||||
|         "attachments": { | ||||
|           "name": "Attachments", | ||||
|           "description": "List of files to attach for multi-modal AI analysis." | ||||
|         "task_name": { | ||||
|           "description": "Name of the task.", | ||||
|           "name": "Task name" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Generate data" | ||||
|     }, | ||||
|     "generate_image": { | ||||
|       "name": "Generate image", | ||||
|       "description": "Uses AI to generate image.", | ||||
|       "fields": { | ||||
|         "task_name": { | ||||
|           "name": "Task name", | ||||
|           "description": "Name of the task." | ||||
|         }, | ||||
|         "instructions": { | ||||
|           "name": "Instructions", | ||||
|           "description": "Instructions that explains the image to be generated." | ||||
|         "attachments": { | ||||
|           "description": "List of files to attach for using as references.", | ||||
|           "name": "Attachments" | ||||
|         }, | ||||
|         "entity_id": { | ||||
|           "name": "Entity ID", | ||||
|           "description": "Entity ID to run the task on." | ||||
|           "description": "Entity ID to run the task on.", | ||||
|           "name": "Entity ID" | ||||
|         }, | ||||
|         "attachments": { | ||||
|           "name": "Attachments", | ||||
|           "description": "List of files to attach for using as references." | ||||
|         "instructions": { | ||||
|           "description": "Instructions that explains the image to be generated.", | ||||
|           "name": "Instructions" | ||||
|         }, | ||||
|         "task_name": { | ||||
|           "description": "Name of the task.", | ||||
|           "name": "Task name" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Generate image" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -9,14 +9,17 @@ | ||||
|       } | ||||
|     }, | ||||
|     "number": { | ||||
|       "led_bar_brightness": { | ||||
|       "display_brightness": { | ||||
|         "default": "mdi:brightness-percent" | ||||
|       }, | ||||
|       "display_brightness": { | ||||
|       "led_bar_brightness": { | ||||
|         "default": "mdi:brightness-percent" | ||||
|       } | ||||
|     }, | ||||
|     "select": { | ||||
|       "co2_automatic_baseline_calibration": { | ||||
|         "default": "mdi:molecule-co2" | ||||
|       }, | ||||
|       "configuration_control": { | ||||
|         "default": "mdi:cloud-cog" | ||||
|       }, | ||||
| @@ -31,23 +34,11 @@ | ||||
|       }, | ||||
|       "voc_index_learning_time_offset": { | ||||
|         "default": "mdi:clock-outline" | ||||
|       }, | ||||
|       "co2_automatic_baseline_calibration": { | ||||
|         "default": "mdi:molecule-co2" | ||||
|       } | ||||
|     }, | ||||
|     "sensor": { | ||||
|       "total_volatile_organic_component_index": { | ||||
|         "default": "mdi:molecule" | ||||
|       }, | ||||
|       "nitrogen_index": { | ||||
|         "default": "mdi:molecule" | ||||
|       }, | ||||
|       "pm003_count": { | ||||
|         "default": "mdi:blur" | ||||
|       }, | ||||
|       "led_bar_brightness": { | ||||
|         "default": "mdi:brightness-percent" | ||||
|       "co2_automatic_baseline_calibration": { | ||||
|         "default": "mdi:molecule-co2" | ||||
|       }, | ||||
|       "display_brightness": { | ||||
|         "default": "mdi:brightness-percent" | ||||
| @@ -55,17 +46,26 @@ | ||||
|       "display_temperature_unit": { | ||||
|         "default": "mdi:thermometer-lines" | ||||
|       }, | ||||
|       "led_bar_brightness": { | ||||
|         "default": "mdi:brightness-percent" | ||||
|       }, | ||||
|       "led_bar_mode": { | ||||
|         "default": "mdi:led-strip" | ||||
|       }, | ||||
|       "nitrogen_index": { | ||||
|         "default": "mdi:molecule" | ||||
|       }, | ||||
|       "nox_index_learning_time_offset": { | ||||
|         "default": "mdi:clock-outline" | ||||
|       }, | ||||
|       "pm003_count": { | ||||
|         "default": "mdi:blur" | ||||
|       }, | ||||
|       "total_volatile_organic_component_index": { | ||||
|         "default": "mdi:molecule" | ||||
|       }, | ||||
|       "voc_index_learning_time_offset": { | ||||
|         "default": "mdi:clock-outline" | ||||
|       }, | ||||
|       "co2_automatic_baseline_calibration": { | ||||
|         "default": "mdi:molecule-co2" | ||||
|       } | ||||
|     }, | ||||
|     "switch": { | ||||
|   | ||||
| @@ -1,19 +1,5 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]", | ||||
|       "already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]", | ||||
| @@ -24,6 +10,20 @@ | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", | ||||
|       "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": { | ||||
| @@ -36,14 +36,25 @@ | ||||
|       } | ||||
|     }, | ||||
|     "number": { | ||||
|       "led_bar_brightness": { | ||||
|         "name": "LED bar brightness" | ||||
|       }, | ||||
|       "display_brightness": { | ||||
|         "name": "Display brightness" | ||||
|       }, | ||||
|       "led_bar_brightness": { | ||||
|         "name": "LED bar brightness" | ||||
|       } | ||||
|     }, | ||||
|     "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": { | ||||
|         "name": "Configuration source", | ||||
|         "state": { | ||||
| @@ -51,13 +62,6 @@ | ||||
|           "local": "Local" | ||||
|         } | ||||
|       }, | ||||
|       "display_temperature_unit": { | ||||
|         "name": "Display temperature unit", | ||||
|         "state": { | ||||
|           "c": "Celsius", | ||||
|           "f": "Fahrenheit" | ||||
|         } | ||||
|       }, | ||||
|       "display_pm_standard": { | ||||
|         "name": "Display PM standard", | ||||
|         "state": { | ||||
| @@ -65,11 +69,18 @@ | ||||
|           "us_aqi": "US AQI" | ||||
|         } | ||||
|       }, | ||||
|       "display_temperature_unit": { | ||||
|         "name": "Display temperature unit", | ||||
|         "state": { | ||||
|           "c": "Celsius", | ||||
|           "f": "Fahrenheit" | ||||
|         } | ||||
|       }, | ||||
|       "led_bar_mode": { | ||||
|         "name": "LED bar mode", | ||||
|         "state": { | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]", | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "pm": "Particulate matter" | ||||
|         } | ||||
|       }, | ||||
| @@ -92,37 +103,14 @@ | ||||
|           "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%]" | ||||
|         } | ||||
|       }, | ||||
|       "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": { | ||||
|       "total_volatile_organic_component_index": { | ||||
|         "name": "VOC index" | ||||
|       "co2_automatic_baseline_calibration_days": { | ||||
|         "name": "Carbon dioxide automatic baseline calibration" | ||||
|       }, | ||||
|       "nitrogen_index": { | ||||
|         "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_brightness": { | ||||
|         "name": "[%key:component::airgradient::entity::number::display_brightness::name%]" | ||||
|       }, | ||||
|       "display_pm_standard": { | ||||
|         "name": "[%key:component::airgradient::entity::select::display_pm_standard::name%]", | ||||
| @@ -131,26 +119,6 @@ | ||||
|           "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": { | ||||
|         "name": "[%key:component::airgradient::entity::select::display_temperature_unit::name%]", | ||||
|         "state": { | ||||
| @@ -158,8 +126,40 @@ | ||||
|           "f": "[%key:component::airgradient::entity::select::display_temperature_unit::state::f%]" | ||||
|         } | ||||
|       }, | ||||
|       "display_brightness": { | ||||
|         "name": "[%key:component::airgradient::entity::number::display_brightness::name%]" | ||||
|       "led_bar_brightness": { | ||||
|         "name": "[%key:component::airgradient::entity::number::led_bar_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": { | ||||
|   | ||||
| @@ -1,30 +1,23 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_location%]", | ||||
|       "wrong_location": "[%key:component::airly::config::error::wrong_location%]" | ||||
|     } | ||||
|   }, | ||||
|   "system_health": { | ||||
|     "info": { | ||||
|       "can_reach_server": "Reach Airly server", | ||||
|       "requests_remaining": "Remaining allowed requests", | ||||
|       "requests_per_day": "Allowed requests per day" | ||||
|     }, | ||||
|     "error": { | ||||
|       "invalid_api_key": "[%key:common::config_flow::error::invalid_api_key%]", | ||||
|       "wrong_location": "No Airly measuring stations in this area." | ||||
|     }, | ||||
|     "step": { | ||||
|       "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%]" | ||||
|         }, | ||||
|         "description": "To generate API key go to {developer_registration_url}" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
| @@ -38,11 +31,18 @@ | ||||
|     } | ||||
|   }, | ||||
|   "exceptions": { | ||||
|     "update_error": { | ||||
|       "message": "An error occurred while retrieving data from the Airly API for {entry}: {error}" | ||||
|     }, | ||||
|     "no_station": { | ||||
|       "message": "An error occurred while retrieving data from the Airly API for {entry}: no measuring stations in this area" | ||||
|     }, | ||||
|     "update_error": { | ||||
|       "message": "An error occurred while retrieving data from the Airly API for {entry}: {error}" | ||||
|     } | ||||
|   }, | ||||
|   "system_health": { | ||||
|     "info": { | ||||
|       "can_reach_server": "Reach Airly server", | ||||
|       "requests_per_day": "Allowed requests per day", | ||||
|       "requests_remaining": "Remaining allowed requests" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -4,15 +4,15 @@ | ||||
|       "aqi": { | ||||
|         "default": "mdi:blur" | ||||
|       }, | ||||
|       "o3": { | ||||
|         "default": "mdi:blur" | ||||
|       }, | ||||
|       "pm10": { | ||||
|         "default": "mdi:blur" | ||||
|       }, | ||||
|       "pm25": { | ||||
|         "default": "mdi:blur" | ||||
|       }, | ||||
|       "o3": { | ||||
|         "default": "mdi:blur" | ||||
|       }, | ||||
|       "station": { | ||||
|         "default": "mdi:blur" | ||||
|       } | ||||
|   | ||||
| @@ -1,15 +1,7 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "description": "To generate API key go to {api_key_url}", | ||||
|         "data": { | ||||
|           "api_key": "[%key:common::config_flow::data::api_key%]", | ||||
|           "latitude": "[%key:common::config_flow::data::latitude%]", | ||||
|           "longitude": "[%key:common::config_flow::data::longitude%]", | ||||
|           "radius": "Station radius (miles; optional)" | ||||
|         } | ||||
|       } | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", | ||||
| @@ -17,16 +9,15 @@ | ||||
|       "invalid_location": "No results found for that location, try changing the location or station radius.", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     "step": { | ||||
|       "init": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "radius": "Station radius (miles)" | ||||
|         } | ||||
|           "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)" | ||||
|         }, | ||||
|         "description": "To generate API key go to {api_key_url}" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| @@ -43,5 +34,14 @@ | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     "step": { | ||||
|       "init": { | ||||
|         "data": { | ||||
|           "radius": "Station radius (miles)" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,17 @@ | ||||
| { | ||||
|   "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", | ||||
|     "step": { | ||||
|       "reauth_confirm": { | ||||
| @@ -19,7 +31,6 @@ | ||||
|         }, | ||||
|         "sections": { | ||||
|           "advanced_settings": { | ||||
|             "name": "[%key:component::airos::config::step::user::sections::advanced_settings::name%]", | ||||
|             "data": { | ||||
|               "ssl": "[%key:component::airos::config::step::user::sections::advanced_settings::data::ssl%]", | ||||
|               "verify_ssl": "[%key:common::config_flow::data::verify_ssl%]" | ||||
| @@ -27,24 +38,24 @@ | ||||
|             "data_description": { | ||||
|               "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%]" | ||||
|             } | ||||
|             }, | ||||
|             "name": "[%key:component::airos::config::step::user::sections::advanced_settings::name%]" | ||||
|           } | ||||
|         } | ||||
|       }, | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "username": "[%key:common::config_flow::data::username%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|           "password": "[%key:common::config_flow::data::password%]", | ||||
|           "username": "[%key:common::config_flow::data::username%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "IP address or hostname of the airOS device", | ||||
|           "username": "Administrator username for the airOS device, normally 'ubnt'", | ||||
|           "password": "Password configured through the UISP app or web interface" | ||||
|           "password": "Password configured through the UISP app or web interface", | ||||
|           "username": "Administrator username for the airOS device, normally 'ubnt'" | ||||
|         }, | ||||
|         "sections": { | ||||
|           "advanced_settings": { | ||||
|             "name": "Advanced settings", | ||||
|             "data": { | ||||
|               "ssl": "Use HTTPS", | ||||
|               "verify_ssl": "[%key:common::config_flow::data::verify_ssl%]" | ||||
| @@ -52,28 +63,17 @@ | ||||
|             "data_description": { | ||||
|               "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" | ||||
|             } | ||||
|             }, | ||||
|             "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": { | ||||
|     "binary_sensor": { | ||||
|       "port_forwarding": { | ||||
|         "name": "Port forwarding" | ||||
|       "dhcp6_server": { | ||||
|         "name": "DHCPv6 server" | ||||
|       }, | ||||
|       "dhcp_client": { | ||||
|         "name": "DHCP client" | ||||
| @@ -81,8 +81,8 @@ | ||||
|       "dhcp_server": { | ||||
|         "name": "DHCP server" | ||||
|       }, | ||||
|       "dhcp6_server": { | ||||
|         "name": "DHCPv6 server" | ||||
|       "port_forwarding": { | ||||
|         "name": "Port forwarding" | ||||
|       }, | ||||
|       "pppoe": { | ||||
|         "name": "PPPoE link" | ||||
| @@ -99,20 +99,27 @@ | ||||
|           "router": "Router" | ||||
|         } | ||||
|       }, | ||||
|       "wireless_frequency": { | ||||
|         "name": "Wireless frequency" | ||||
|       }, | ||||
|       "wireless_essid": { | ||||
|         "name": "Wireless SSID" | ||||
|       "host_uptime": { | ||||
|         "name": "Uptime" | ||||
|       }, | ||||
|       "wireless_antenna_gain": { | ||||
|         "name": "Antenna gain" | ||||
|       }, | ||||
|       "wireless_throughput_tx": { | ||||
|         "name": "Throughput transmit (actual)" | ||||
|       "wireless_distance": { | ||||
|         "name": "Wireless distance" | ||||
|       }, | ||||
|       "wireless_throughput_rx": { | ||||
|         "name": "Throughput receive (actual)" | ||||
|       "wireless_essid": { | ||||
|         "name": "Wireless SSID" | ||||
|       }, | ||||
|       "wireless_frequency": { | ||||
|         "name": "Wireless frequency" | ||||
|       }, | ||||
|       "wireless_mode": { | ||||
|         "name": "Wireless mode", | ||||
|         "state": { | ||||
|           "point_to_multipoint": "Point-to-multipoint", | ||||
|           "point_to_point": "Point-to-point" | ||||
|         } | ||||
|       }, | ||||
|       "wireless_polling_dl_capacity": { | ||||
|         "name": "Download capacity" | ||||
| @@ -123,12 +130,6 @@ | ||||
|       "wireless_remote_hostname": { | ||||
|         "name": "Remote hostname" | ||||
|       }, | ||||
|       "host_uptime": { | ||||
|         "name": "Uptime" | ||||
|       }, | ||||
|       "wireless_distance": { | ||||
|         "name": "Wireless distance" | ||||
|       }, | ||||
|       "wireless_role": { | ||||
|         "name": "Wireless role", | ||||
|         "state": { | ||||
| @@ -136,27 +137,26 @@ | ||||
|           "station": "Station" | ||||
|         } | ||||
|       }, | ||||
|       "wireless_mode": { | ||||
|         "name": "Wireless mode", | ||||
|         "state": { | ||||
|           "point_to_point": "Point-to-point", | ||||
|           "point_to_multipoint": "Point-to-multipoint" | ||||
|         } | ||||
|       "wireless_throughput_rx": { | ||||
|         "name": "Throughput receive (actual)" | ||||
|       }, | ||||
|       "wireless_throughput_tx": { | ||||
|         "name": "Throughput transmit (actual)" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "exceptions": { | ||||
|     "invalid_auth": { | ||||
|       "message": "[%key:common::config_flow::error::invalid_auth%]" | ||||
|     }, | ||||
|     "cannot_connect": { | ||||
|       "message": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "key_data_missing": { | ||||
|       "message": "Key data not returned from device" | ||||
|     }, | ||||
|     "error_data_missing": { | ||||
|       "message": "Data incomplete or missing" | ||||
|     }, | ||||
|     "invalid_auth": { | ||||
|       "message": "[%key:common::config_flow::error::invalid_auth%]" | ||||
|     }, | ||||
|     "key_data_missing": { | ||||
|       "message": "Key data not returned from device" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,36 +1,21 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "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%]" | ||||
|         } | ||||
|       } | ||||
|     "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%]", | ||||
|       "invalid_input": "[%key:common::config_flow::error::invalid_host%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     "step": { | ||||
|       "init": { | ||||
|         "title": "Configure air-Q integration", | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "return_average": "Show values averaged by the device", | ||||
|           "clip_negatives": "Clip negative values" | ||||
|           "ip_address": "[%key:common::config_flow::data::ip%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "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" | ||||
|         } | ||||
|         "description": "Provide the IP address or mDNS of the device and its password", | ||||
|         "title": "Identify the device" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| @@ -53,8 +38,11 @@ | ||||
|       "bromine": { | ||||
|         "name": "Bromine" | ||||
|       }, | ||||
|       "methanethiol": { | ||||
|         "name": "Methanethiol" | ||||
|       "carbon_disulfide": { | ||||
|         "name": "Carbon disulfide" | ||||
|       }, | ||||
|       "carbon_monoxide": { | ||||
|         "name": "[%key:component::sensor::entity_component::carbon_monoxide::name%]" | ||||
|       }, | ||||
|       "chlorine": { | ||||
|         "name": "Chlorine" | ||||
| @@ -62,12 +50,6 @@ | ||||
|       "chlorine_dioxide": { | ||||
|         "name": "Chlorine dioxide" | ||||
|       }, | ||||
|       "carbon_disulfide": { | ||||
|         "name": "Carbon disulfide" | ||||
|       }, | ||||
|       "carbon_monoxide": { | ||||
|         "name": "[%key:component::sensor::entity_component::carbon_monoxide::name%]" | ||||
|       }, | ||||
|       "dew_point": { | ||||
|         "name": "Dew point" | ||||
|       }, | ||||
| @@ -77,36 +59,51 @@ | ||||
|       "ethylene": { | ||||
|         "name": "Ethylene" | ||||
|       }, | ||||
|       "formaldehyde": { | ||||
|         "name": "Formaldehyde" | ||||
|       }, | ||||
|       "fluorine": { | ||||
|         "name": "Fluorine" | ||||
|       }, | ||||
|       "hydrogen_sulfide": { | ||||
|         "name": "Hydrogen sulfide" | ||||
|       "formaldehyde": { | ||||
|         "name": "Formaldehyde" | ||||
|       }, | ||||
|       "health_index": { | ||||
|         "name": "Health index" | ||||
|       }, | ||||
|       "hydrochloric_acid": { | ||||
|         "name": "Hydrochloric acid" | ||||
|       }, | ||||
|       "hydrogen": { | ||||
|         "name": "Hydrogen" | ||||
|       }, | ||||
|       "hydrogen_cyanide": { | ||||
|         "name": "Hydrogen cyanide" | ||||
|       }, | ||||
|       "hydrogen_fluoride": { | ||||
|         "name": "Hydrogen fluoride" | ||||
|       }, | ||||
|       "health_index": { | ||||
|         "name": "Health index" | ||||
|       }, | ||||
|       "hydrogen": { | ||||
|         "name": "Hydrogen" | ||||
|       }, | ||||
|       "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": { | ||||
|         "name": "Methane" | ||||
|       }, | ||||
|       "methanethiol": { | ||||
|         "name": "Methanethiol" | ||||
|       }, | ||||
|       "noise": { | ||||
|         "name": "Noise" | ||||
|       }, | ||||
|       "organic_acid": { | ||||
|         "name": "Organic acid" | ||||
|       }, | ||||
| @@ -116,36 +113,39 @@ | ||||
|       "performance_index": { | ||||
|         "name": "Performance index" | ||||
|       }, | ||||
|       "hydrogen_phosphide": { | ||||
|         "name": "Hydrogen phosphide" | ||||
|       }, | ||||
|       "relative_pressure": { | ||||
|         "name": "Relative pressure" | ||||
|       }, | ||||
|       "propane": { | ||||
|         "name": "Propane" | ||||
|       }, | ||||
|       "refigerant": { | ||||
|         "name": "Refrigerant" | ||||
|       }, | ||||
|       "silicon_hydride": { | ||||
|         "name": "Silicon hydride" | ||||
|       }, | ||||
|       "noise": { | ||||
|         "name": "Noise" | ||||
|       }, | ||||
|       "maximum_noise": { | ||||
|         "name": "Noise (maximum)" | ||||
|       }, | ||||
|       "radon": { | ||||
|         "name": "Radon" | ||||
|       }, | ||||
|       "industrial_volatile_organic_compounds": { | ||||
|         "name": "VOCs (industrial)" | ||||
|       "refigerant": { | ||||
|         "name": "Refrigerant" | ||||
|       }, | ||||
|       "relative_pressure": { | ||||
|         "name": "Relative pressure" | ||||
|       }, | ||||
|       "silicon_hydride": { | ||||
|         "name": "Silicon hydride" | ||||
|       }, | ||||
|       "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" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,13 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "user": { | ||||
|         "data": { | ||||
| @@ -8,29 +16,21 @@ | ||||
|         }, | ||||
|         "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": { | ||||
|     "sensor": { | ||||
|       "radon": { | ||||
|         "name": "Radon" | ||||
|       }, | ||||
|       "light": { | ||||
|         "name": "Light" | ||||
|       }, | ||||
|       "virus_risk": { | ||||
|         "name": "Virus Risk" | ||||
|       }, | ||||
|       "mold": { | ||||
|         "name": "Mold" | ||||
|       }, | ||||
|       "radon": { | ||||
|         "name": "Radon" | ||||
|       }, | ||||
|       "virus_risk": { | ||||
|         "name": "Virus Risk" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -4,10 +4,10 @@ | ||||
|       "radon_1day_avg": { | ||||
|         "default": "mdi:radioactive" | ||||
|       }, | ||||
|       "radon_longterm_avg": { | ||||
|       "radon_1day_level": { | ||||
|         "default": "mdi:radioactive" | ||||
|       }, | ||||
|       "radon_1day_level": { | ||||
|       "radon_longterm_avg": { | ||||
|         "default": "mdi:radioactive" | ||||
|       }, | ||||
|       "radon_longterm_level": { | ||||
|   | ||||
| @@ -28,5 +28,5 @@ | ||||
|   "dependencies": ["bluetooth_adapters"], | ||||
|   "documentation": "https://www.home-assistant.io/integrations/airthings_ble", | ||||
|   "iot_class": "local_polling", | ||||
|   "requirements": ["airthings-ble==1.1.1"] | ||||
|   "requirements": ["airthings-ble==1.2.0"] | ||||
| } | ||||
|   | ||||
| @@ -1,49 +1,49 @@ | ||||
| { | ||||
|   "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}", | ||||
|     "step": { | ||||
|       "bluetooth_confirm": { | ||||
|         "description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]" | ||||
|       }, | ||||
|       "user": { | ||||
|         "description": "[%key:component::bluetooth::config::step::user::description%]", | ||||
|         "data": { | ||||
|           "address": "[%key:common::config_flow::data::device%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "address": "The Airthings devices discovered via Bluetooth." | ||||
|         } | ||||
|       }, | ||||
|       "bluetooth_confirm": { | ||||
|         "description": "[%key:component::bluetooth::config::step::bluetooth_confirm::description%]" | ||||
|         }, | ||||
|         "description": "[%key:component::bluetooth::config::step::user::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": { | ||||
|     "sensor": { | ||||
|       "radon_1day_avg": { | ||||
|         "name": "Radon 1-day average" | ||||
|       }, | ||||
|       "radon_longterm_avg": { | ||||
|         "name": "Radon longterm average" | ||||
|       }, | ||||
|       "radon_1day_level": { | ||||
|         "name": "Radon 1-day level" | ||||
|       }, | ||||
|       "radon_longterm_level": { | ||||
|         "name": "Radon longterm level" | ||||
|       "ambient_noise": { | ||||
|         "name": "Ambient noise" | ||||
|       }, | ||||
|       "illuminance": { | ||||
|         "name": "[%key:component::sensor::entity_component::illuminance::name%]" | ||||
|       }, | ||||
|       "ambient_noise": { | ||||
|         "name": "Ambient noise" | ||||
|       "radon_1day_avg": { | ||||
|         "name": "Radon 1-day average" | ||||
|       }, | ||||
|       "radon_1day_level": { | ||||
|         "name": "Radon 1-day level" | ||||
|       }, | ||||
|       "radon_longterm_avg": { | ||||
|         "name": "Radon longterm average" | ||||
|       }, | ||||
|       "radon_longterm_level": { | ||||
|         "name": "Radon longterm level" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -9,13 +9,13 @@ | ||||
|     }, | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "title": "Set up your AirTouch 4 connection details.", | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "The hostname or IP address of your AirTouch controller." | ||||
|         } | ||||
|         }, | ||||
|         "title": "Set up your AirTouch 4 connection details." | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,18 +1,18 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "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": { | ||||
| @@ -21,8 +21,8 @@ | ||||
|         "state_attributes": { | ||||
|           "fan_mode": { | ||||
|             "state": { | ||||
|               "turbo": "Turbo", | ||||
|               "intelligent_auto": "Intelligent Auto" | ||||
|               "intelligent_auto": "Intelligent Auto", | ||||
|               "turbo": "Turbo" | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| { | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "pollutant_level": { | ||||
|         "default": "mdi:gauge" | ||||
|       }, | ||||
|       "pollutant_label": { | ||||
|         "default": "mdi:chemical-weapon" | ||||
|       }, | ||||
|       "pollutant_level": { | ||||
|         "default": "mdi:gauge" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,54 +1,44 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "geography_by_coords": { | ||||
|         "title": "Configure a geography", | ||||
|         "description": "Use the AirVisual cloud API to monitor a latitude/longitude.", | ||||
|         "data": { | ||||
|           "api_key": "[%key:common::config_flow::data::api_key%]", | ||||
|           "latitude": "[%key:common::config_flow::data::latitude%]", | ||||
|           "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": { | ||||
|         "title": "[%key:component::airvisual::config::step::geography_by_coords::title%]", | ||||
|         "description": "Use the AirVisual cloud API to monitor a city/state/country.", | ||||
|         "data": { | ||||
|           "api_key": "[%key:common::config_flow::data::api_key%]", | ||||
|           "city": "City", | ||||
|           "state": "State", | ||||
|           "country": "[%key:common::config_flow::data::country%]" | ||||
|         } | ||||
|           "country": "[%key:common::config_flow::data::country%]", | ||||
|           "state": "State" | ||||
|         }, | ||||
|         "description": "Use the AirVisual cloud API to monitor a city/state/country.", | ||||
|         "title": "[%key:component::airvisual::config::step::geography_by_coords::title%]" | ||||
|       }, | ||||
|       "reauth_confirm": { | ||||
|         "title": "Re-authenticate AirVisual", | ||||
|         "data": { | ||||
|           "api_key": "[%key:common::config_flow::data::api_key%]" | ||||
|         } | ||||
|         }, | ||||
|         "title": "Re-authenticate AirVisual" | ||||
|       }, | ||||
|       "user": { | ||||
|         "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" | ||||
|         } | ||||
|         "description": "Pick what type of AirVisual data you want to monitor.", | ||||
|         "title": "Configure AirVisual" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| @@ -67,19 +57,29 @@ | ||||
|       "pollutant_level": { | ||||
|         "state": { | ||||
|           "good": "Good", | ||||
|           "hazardous": "Hazardous", | ||||
|           "moderate": "Moderate", | ||||
|           "unhealthy": "Unhealthy", | ||||
|           "unhealthy_sensitive": "Unhealthy for sensitive groups", | ||||
|           "very_unhealthy": "Very unhealthy", | ||||
|           "hazardous": "Hazardous" | ||||
|           "very_unhealthy": "Very unhealthy" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "issues": { | ||||
|     "airvisual_pro_migration": { | ||||
|       "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}." | ||||
|       "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" | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     "step": { | ||||
|       "init": { | ||||
|         "data": { | ||||
|           "show_on_map": "Show monitored geography on the map" | ||||
|         }, | ||||
|         "title": "[%key:component::airvisual::config::step::user::title%]" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,40 +1,40 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "reauth_confirm": { | ||||
|         "description": "[%key:component::airvisual_pro::config::step::user::description%]", | ||||
|         "data": { | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         } | ||||
|         }, | ||||
|         "description": "[%key:component::airvisual_pro::config::step::user::description%]" | ||||
|       }, | ||||
|       "user": { | ||||
|         "description": "The password can be retrieved from the AirVisual Pro's UI.", | ||||
|         "data": { | ||||
|           "ip_address": "[%key:common::config_flow::data::host%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "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": { | ||||
|     "sensor": { | ||||
|       "pm01": { | ||||
|         "name": "PM0.1" | ||||
|       }, | ||||
|       "outdoor_air_quality_index": { | ||||
|         "name": "Outdoor air quality index" | ||||
|       }, | ||||
|       "pm01": { | ||||
|         "name": "PM0.1" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -10,15 +10,15 @@ | ||||
|     "step": { | ||||
|       "discovered_connection": { | ||||
|         "data": { | ||||
|           "id": "[%key:component::airzone::config::step::user::data::id%]", | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "id": "[%key:component::airzone::config::step::user::data::id%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]" | ||||
|         } | ||||
|       }, | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "id": "System ID", | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "id": "System ID", | ||||
|           "port": "[%key:common::config_flow::data::port%]" | ||||
|         } | ||||
|       } | ||||
| @@ -37,19 +37,19 @@ | ||||
|       "grille_angles": { | ||||
|         "name": "Cold angle", | ||||
|         "state": { | ||||
|           "90deg": "90°", | ||||
|           "50deg": "50°", | ||||
|           "40deg": "40°", | ||||
|           "45deg": "45°", | ||||
|           "40deg": "40°" | ||||
|           "50deg": "50°", | ||||
|           "90deg": "90°" | ||||
|         } | ||||
|       }, | ||||
|       "heat_angles": { | ||||
|         "name": "Heat angle", | ||||
|         "state": { | ||||
|           "90deg": "[%key:component::airzone::entity::select::grille_angles::state::90deg%]", | ||||
|           "50deg": "[%key:component::airzone::entity::select::grille_angles::state::50deg%]", | ||||
|           "40deg": "[%key:component::airzone::entity::select::grille_angles::state::40deg%]", | ||||
|           "45deg": "[%key:component::airzone::entity::select::grille_angles::state::45deg%]", | ||||
|           "40deg": "[%key:component::airzone::entity::select::grille_angles::state::40deg%]" | ||||
|           "50deg": "[%key:component::airzone::entity::select::grille_angles::state::50deg%]", | ||||
|           "90deg": "[%key:component::airzone::entity::select::grille_angles::state::90deg%]" | ||||
|         } | ||||
|       }, | ||||
|       "modes": { | ||||
| @@ -66,20 +66,20 @@ | ||||
|       "q_adapt": { | ||||
|         "name": "Q-Adapt", | ||||
|         "state": { | ||||
|           "standard": "Standard", | ||||
|           "maximum": "Maximum", | ||||
|           "minimum": "Minimum", | ||||
|           "power": "Power", | ||||
|           "silence": "Silence", | ||||
|           "minimum": "Minimum", | ||||
|           "maximum": "Maximum" | ||||
|           "standard": "Standard" | ||||
|         } | ||||
|       }, | ||||
|       "sleep_times": { | ||||
|         "name": "Sleep", | ||||
|         "state": { | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "30m": "30 minutes", | ||||
|           "60m": "60 minutes", | ||||
|           "90m": "90 minutes" | ||||
|           "90m": "90 minutes", | ||||
|           "off": "[%key:common::state::off%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|   | ||||
| @@ -10,8 +10,8 @@ | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "id": "Installation", | ||||
|           "username": "[%key:common::config_flow::data::username%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|           "password": "[%key:common::config_flow::data::password%]", | ||||
|           "username": "[%key:common::config_flow::data::username%]" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| @@ -32,9 +32,9 @@ | ||||
|       "air_quality": { | ||||
|         "name": "Air Quality mode", | ||||
|         "state": { | ||||
|           "auto": "[%key:common::state::auto%]", | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "on": "[%key:common::state::on%]", | ||||
|           "auto": "[%key:common::state::auto%]" | ||||
|           "on": "[%key:common::state::on%]" | ||||
|         } | ||||
|       }, | ||||
|       "modes": { | ||||
|   | ||||
| @@ -1,34 +1,34 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "pick_implementation": { | ||||
|         "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" | ||||
|       }, | ||||
|       "reauth_confirm": { | ||||
|         "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%]", | ||||
|       "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%]", | ||||
|       "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." | ||||
|       "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": { | ||||
|       "oauth_discovery": { | ||||
|         "description": "Home Assistant has found an Aladdin Connect device on your network. Press **Submit** to continue setting up Aladdin Connect." | ||||
|       }, | ||||
|       "pick_implementation": { | ||||
|         "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" | ||||
|       }, | ||||
|       "reauth_confirm": { | ||||
|         "description": "Aladdin Connect needs to re-authenticate your account", | ||||
|         "title": "[%key:common::config_flow::title::reauth%]" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -18,23 +18,23 @@ | ||||
|     "alarm_arm_away": { | ||||
|       "service": "mdi:shield-lock" | ||||
|     }, | ||||
|     "alarm_arm_custom_bypass": { | ||||
|       "service": "mdi:security" | ||||
|     }, | ||||
|     "alarm_arm_home": { | ||||
|       "service": "mdi:shield-home" | ||||
|     }, | ||||
|     "alarm_arm_night": { | ||||
|       "service": "mdi:shield-moon" | ||||
|     }, | ||||
|     "alarm_arm_custom_bypass": { | ||||
|       "service": "mdi:security" | ||||
|     "alarm_arm_vacation": { | ||||
|       "service": "mdi:shield-airplane" | ||||
|     }, | ||||
|     "alarm_disarm": { | ||||
|       "service": "mdi:shield-off" | ||||
|     }, | ||||
|     "alarm_trigger": { | ||||
|       "service": "mdi:bell-ring" | ||||
|     }, | ||||
|     "alarm_arm_vacation": { | ||||
|       "service": "mdi:shield-airplane" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| { | ||||
|   "title": "Alarm control panel", | ||||
|   "device_automation": { | ||||
|     "action_type": { | ||||
|       "arm_away": "Arm {entity_name} away", | ||||
| @@ -10,24 +9,24 @@ | ||||
|       "trigger": "Trigger {entity_name}" | ||||
|     }, | ||||
|     "condition_type": { | ||||
|       "is_triggered": "{entity_name} is triggered", | ||||
|       "is_disarmed": "{entity_name} is disarmed", | ||||
|       "is_armed_home": "{entity_name} is armed home", | ||||
|       "is_armed_away": "{entity_name} is armed away", | ||||
|       "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_armed_vacation": "{entity_name} is armed vacation", | ||||
|       "is_disarmed": "{entity_name} is disarmed", | ||||
|       "is_triggered": "{entity_name} is triggered" | ||||
|     }, | ||||
|     "extra_fields": { | ||||
|       "code": "Code", | ||||
|       "for": "[%key:common::device_automation::extra_fields::for%]" | ||||
|     }, | ||||
|     "trigger_type": { | ||||
|       "triggered": "{entity_name} triggered", | ||||
|       "disarmed": "{entity_name} disarmed", | ||||
|       "armed_home": "{entity_name} armed home", | ||||
|       "armed_away": "{entity_name} armed away", | ||||
|       "armed_home": "{entity_name} armed home", | ||||
|       "armed_night": "{entity_name} armed night", | ||||
|       "armed_vacation": "{entity_name} armed vacation" | ||||
|       "armed_vacation": "{entity_name} armed vacation", | ||||
|       "disarmed": "{entity_name} disarmed", | ||||
|       "triggered": "{entity_name} triggered" | ||||
|     } | ||||
|   }, | ||||
|   "entity_component": { | ||||
| @@ -35,106 +34,34 @@ | ||||
|       "name": "[%key:component::alarm_control_panel::title%]", | ||||
|       "state": { | ||||
|         "armed": "Armed", | ||||
|         "disarmed": "Disarmed", | ||||
|         "armed_home": "Armed home", | ||||
|         "armed_away": "Armed away", | ||||
|         "armed_custom_bypass": "Armed custom bypass", | ||||
|         "armed_home": "Armed home", | ||||
|         "armed_night": "Armed night", | ||||
|         "armed_vacation": "Armed vacation", | ||||
|         "armed_custom_bypass": "Armed custom bypass", | ||||
|         "pending": "Pending", | ||||
|         "arming": "Arming", | ||||
|         "disarmed": "Disarmed", | ||||
|         "disarming": "Disarming", | ||||
|         "pending": "Pending", | ||||
|         "triggered": "Triggered" | ||||
|       }, | ||||
|       "state_attributes": { | ||||
|         "code_format": { | ||||
|           "name": "Code format", | ||||
|           "state": { | ||||
|             "text": "Text", | ||||
|             "number": "Number" | ||||
|           } | ||||
|         }, | ||||
|         "changed_by": { | ||||
|           "name": "Changed by" | ||||
|         }, | ||||
|         "code_arm_required": { | ||||
|           "name": "Code for arming", | ||||
|           "state": { | ||||
|             "true": "Required", | ||||
|             "false": "Not required" | ||||
|             "false": "Not required", | ||||
|             "true": "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%]" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| @@ -143,5 +70,78 @@ | ||||
|     "code_arm_required": { | ||||
|       "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" | ||||
| } | ||||
|   | ||||
| @@ -1,101 +1,101 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "title": "Choose AlarmDecoder protocol", | ||||
|         "data": { | ||||
|           "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)" | ||||
|         } | ||||
|       } | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     }, | ||||
|     "create_entry": { | ||||
|       "default": "Successfully connected to AlarmDecoder." | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]" | ||||
|     }, | ||||
|     "create_entry": { | ||||
|       "default": "Successfully connected to AlarmDecoder." | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     "step": { | ||||
|       "protocol": { | ||||
|         "data": { | ||||
|           "device_baudrate": "Device baud rate", | ||||
|           "device_path": "Device path", | ||||
|           "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": { | ||||
|     "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": { | ||||
|       "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": { | ||||
|         "title": "Configure AlarmDecoder", | ||||
|         "description": "What would you like to edit?", | ||||
|         "data": { | ||||
|           "edit_selection": "Edit" | ||||
|         } | ||||
|       }, | ||||
|       "arm_settings": { | ||||
|         "title": "[%key:component::alarmdecoder::options::step::init::title%]", | ||||
|         "data": { | ||||
|           "auto_bypass": "Auto-bypass on arm", | ||||
|           "code_arm_required": "Code required for arming", | ||||
|           "alt_night_mode": "Alternative night mode" | ||||
|         } | ||||
|       }, | ||||
|       "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": { | ||||
|           "zone_number": "Zone number" | ||||
|         } | ||||
|         }, | ||||
|         "description": "What would you like to edit?", | ||||
|         "title": "Configure AlarmDecoder" | ||||
|       }, | ||||
|       "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_name": "Zone name", | ||||
|           "zone_relayaddr": "Relay address", | ||||
|           "zone_relaychan": "Relay channel" | ||||
|         } | ||||
|           "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": { | ||||
|         "data": { | ||||
|           "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%]" | ||||
|       } | ||||
|     }, | ||||
|     "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": { | ||||
|     "alarm_keypress": { | ||||
|       "name": "Key press", | ||||
|       "description": "Sends custom keypresses to the alarm.", | ||||
|       "fields": { | ||||
|         "keypress": { | ||||
|           "name": "[%key:component::alarmdecoder::services::alarm_keypress::name%]", | ||||
|           "description": "String to send to the alarm panel." | ||||
|           "description": "String to send to the alarm panel.", | ||||
|           "name": "[%key:component::alarmdecoder::services::alarm_keypress::name%]" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Key press" | ||||
|     }, | ||||
|     "alarm_toggle_chime": { | ||||
|       "name": "Toggle chime", | ||||
|       "description": "Sends the alarm the toggle chime command.", | ||||
|       "fields": { | ||||
|         "code": { | ||||
|           "name": "Code", | ||||
|           "description": "Code to toggle the alarm control panel chime with." | ||||
|           "description": "Code to toggle the alarm control panel chime with.", | ||||
|           "name": "Code" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Toggle chime" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| { | ||||
|   "title": "Alert", | ||||
|   "entity_component": { | ||||
|     "_": { | ||||
|       "name": "[%key:component::alert::title%]", | ||||
| @@ -12,16 +11,17 @@ | ||||
|   }, | ||||
|   "services": { | ||||
|     "toggle": { | ||||
|       "name": "[%key:common::action::toggle%]", | ||||
|       "description": "Toggles alert's notifications." | ||||
|       "description": "Toggles alert's notifications.", | ||||
|       "name": "[%key:common::action::toggle%]" | ||||
|     }, | ||||
|     "turn_off": { | ||||
|       "name": "[%key:common::action::turn_off%]", | ||||
|       "description": "Silences alert's notifications." | ||||
|       "description": "Silences alert's notifications.", | ||||
|       "name": "[%key:common::action::turn_off%]" | ||||
|     }, | ||||
|     "turn_on": { | ||||
|       "name": "[%key:common::action::turn_on%]", | ||||
|       "description": "Resets alert's notifications." | ||||
|       "description": "Resets alert's notifications.", | ||||
|       "name": "[%key:common::action::turn_on%]" | ||||
|     } | ||||
|   } | ||||
|   }, | ||||
|   "title": "Alert" | ||||
| } | ||||
|   | ||||
| @@ -26,3 +26,6 @@ COUNTRY_DOMAINS = { | ||||
|     "us": DEFAULT_DOMAIN, | ||||
|     "za": "co.za", | ||||
| } | ||||
|  | ||||
| CATEGORY_SENSORS = "sensors" | ||||
| CATEGORY_NOTIFICATIONS = "notifications" | ||||
|   | ||||
| @@ -8,5 +8,5 @@ | ||||
|   "iot_class": "cloud_polling", | ||||
|   "loggers": ["aioamazondevices"], | ||||
|   "quality_scale": "platinum", | ||||
|   "requirements": ["aioamazondevices==6.4.6"] | ||||
|   "requirements": ["aioamazondevices==6.5.5"] | ||||
| } | ||||
|   | ||||
| @@ -4,9 +4,15 @@ from __future__ import annotations | ||||
|  | ||||
| from collections.abc import Callable | ||||
| from dataclasses import dataclass | ||||
| from datetime import datetime | ||||
| from typing import Final | ||||
|  | ||||
| from aioamazondevices.api import AmazonDevice | ||||
| from aioamazondevices.const import ( | ||||
|     NOTIFICATION_ALARM, | ||||
|     NOTIFICATION_REMINDER, | ||||
|     NOTIFICATION_TIMER, | ||||
| ) | ||||
|  | ||||
| from homeassistant.components.sensor import ( | ||||
|     SensorDeviceClass, | ||||
| @@ -19,6 +25,7 @@ from homeassistant.core import HomeAssistant | ||||
| from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback | ||||
| from homeassistant.helpers.typing import StateType | ||||
|  | ||||
| from .const import CATEGORY_NOTIFICATIONS, CATEGORY_SENSORS | ||||
| from .coordinator import AmazonConfigEntry | ||||
| from .entity import AmazonEntity | ||||
|  | ||||
| @@ -36,6 +43,20 @@ class AmazonSensorEntityDescription(SensorEntityDescription): | ||||
|         and (sensor := device.sensors.get(key)) is not None | ||||
|         and sensor.error is False | ||||
|     ) | ||||
|     category: str = CATEGORY_SENSORS | ||||
|  | ||||
|  | ||||
| @dataclass(frozen=True, kw_only=True) | ||||
| class AmazonNotificationEntityDescription(SensorEntityDescription): | ||||
|     """Amazon Devices notification entity description.""" | ||||
|  | ||||
|     native_unit_of_measurement_fn: Callable[[AmazonDevice, str], str] | None = None | ||||
|     is_available_fn: Callable[[AmazonDevice, str], bool] = lambda device, key: ( | ||||
|         device.online | ||||
|         and (notification := device.notifications.get(key)) is not None | ||||
|         and notification.next_occurrence is not None | ||||
|     ) | ||||
|     category: str = CATEGORY_NOTIFICATIONS | ||||
|  | ||||
|  | ||||
| SENSORS: Final = ( | ||||
| @@ -56,6 +77,23 @@ SENSORS: Final = ( | ||||
|         state_class=SensorStateClass.MEASUREMENT, | ||||
|     ), | ||||
| ) | ||||
| NOTIFICATIONS: Final = ( | ||||
|     AmazonNotificationEntityDescription( | ||||
|         key=NOTIFICATION_ALARM, | ||||
|         translation_key="alarm", | ||||
|         device_class=SensorDeviceClass.TIMESTAMP, | ||||
|     ), | ||||
|     AmazonNotificationEntityDescription( | ||||
|         key=NOTIFICATION_REMINDER, | ||||
|         translation_key="reminder", | ||||
|         device_class=SensorDeviceClass.TIMESTAMP, | ||||
|     ), | ||||
|     AmazonNotificationEntityDescription( | ||||
|         key=NOTIFICATION_TIMER, | ||||
|         translation_key="timer", | ||||
|         device_class=SensorDeviceClass.TIMESTAMP, | ||||
|     ), | ||||
| ) | ||||
|  | ||||
|  | ||||
| async def async_setup_entry( | ||||
| @@ -74,12 +112,18 @@ async def async_setup_entry( | ||||
|         new_devices = current_devices - known_devices | ||||
|         if new_devices: | ||||
|             known_devices.update(new_devices) | ||||
|             async_add_entities( | ||||
|             sensors_list = [ | ||||
|                 AmazonSensorEntity(coordinator, serial_num, sensor_desc) | ||||
|                 for sensor_desc in SENSORS | ||||
|                 for serial_num in new_devices | ||||
|                 if coordinator.data[serial_num].sensors.get(sensor_desc.key) is not None | ||||
|             ) | ||||
|             ] | ||||
|             notifications_list = [ | ||||
|                 AmazonSensorEntity(coordinator, serial_num, notification_desc) | ||||
|                 for notification_desc in NOTIFICATIONS | ||||
|                 for serial_num in new_devices | ||||
|             ] | ||||
|             async_add_entities(sensors_list + notifications_list) | ||||
|  | ||||
|     _check_device() | ||||
|     entry.async_on_unload(coordinator.async_add_listener(_check_device)) | ||||
| @@ -88,7 +132,9 @@ async def async_setup_entry( | ||||
| class AmazonSensorEntity(AmazonEntity, SensorEntity): | ||||
|     """Sensor device.""" | ||||
|  | ||||
|     entity_description: AmazonSensorEntityDescription | ||||
|     entity_description: ( | ||||
|         AmazonSensorEntityDescription | AmazonNotificationEntityDescription | ||||
|     ) | ||||
|  | ||||
|     @property | ||||
|     def native_unit_of_measurement(self) -> str | None: | ||||
| @@ -101,9 +147,13 @@ class AmazonSensorEntity(AmazonEntity, SensorEntity): | ||||
|         return super().native_unit_of_measurement | ||||
|  | ||||
|     @property | ||||
|     def native_value(self) -> StateType: | ||||
|     def native_value(self) -> StateType | datetime: | ||||
|         """Return the state of the sensor.""" | ||||
|         return self.device.sensors[self.entity_description.key].value | ||||
|         # Sensors | ||||
|         if self.entity_description.category == CATEGORY_SENSORS: | ||||
|             return self.device.sensors[self.entity_description.key].value | ||||
|         # Notifications | ||||
|         return self.device.notifications[self.entity_description.key].next_occurrence | ||||
|  | ||||
|     @property | ||||
|     def available(self) -> bool: | ||||
|   | ||||
| @@ -1,47 +1,12 @@ | ||||
| { | ||||
|   "common": { | ||||
|     "data_code": "One-time password (OTP code)", | ||||
|     "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.", | ||||
|     "data_description_password": "The password of your Amazon account.", | ||||
|     "data_description_username": "The email address of your Amazon account.", | ||||
|     "device_id_description": "The ID of the device to send the command to." | ||||
|   }, | ||||
|   "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": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_service%]", | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", | ||||
| @@ -55,15 +20,61 @@ | ||||
|       "cannot_retrieve_data": "Unable to retrieve data from Amazon. Please try again later.", | ||||
|       "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", | ||||
|       "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": { | ||||
|     "notify": { | ||||
|       "speak": { | ||||
|         "name": "Speak" | ||||
|       }, | ||||
|       "announce": { | ||||
|         "name": "Announce" | ||||
|       }, | ||||
|       "speak": { | ||||
|         "name": "Speak" | ||||
|       } | ||||
|     }, | ||||
|     "sensor": { | ||||
|       "alarm": { | ||||
|         "name": "Next alarm" | ||||
|       }, | ||||
|       "reminder": { | ||||
|         "name": "Next reminder" | ||||
|       }, | ||||
|       "timer": { | ||||
|         "name": "Next timer" | ||||
|       } | ||||
|     }, | ||||
|     "switch": { | ||||
| @@ -72,34 +83,24 @@ | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|     "send_sound": { | ||||
|       "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." | ||||
|         } | ||||
|       } | ||||
|   "exceptions": { | ||||
|     "cannot_connect_with_error": { | ||||
|       "message": "Error connecting: {error}" | ||||
|     }, | ||||
|     "send_text_command": { | ||||
|       "name": "Send text command", | ||||
|       "description": "Sends a text command to a device", | ||||
|       "fields": { | ||||
|         "text_command": { | ||||
|           "name": "Alexa text command", | ||||
|           "description": "The text command to send." | ||||
|         }, | ||||
|         "device_id": { | ||||
|           "name": "Device", | ||||
|           "description": "[%key:component::alexa_devices::common::device_id_description%]" | ||||
|         } | ||||
|       } | ||||
|     "cannot_retrieve_data_with_error": { | ||||
|       "message": "Error retrieving data: {error}" | ||||
|     }, | ||||
|     "device_serial_number_missing": { | ||||
|       "message": "Device serial number missing: {device_id}" | ||||
|     }, | ||||
|     "entry_not_loaded": { | ||||
|       "message": "Entry not loaded: {entry}" | ||||
|     }, | ||||
|     "invalid_device_id": { | ||||
|       "message": "Invalid device ID specified: {device_id}" | ||||
|     }, | ||||
|     "invalid_sound_value": { | ||||
|       "message": "Invalid sound {sound} specified" | ||||
|     } | ||||
|   }, | ||||
|   "selector": { | ||||
| @@ -149,24 +150,34 @@ | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "exceptions": { | ||||
|     "cannot_connect_with_error": { | ||||
|       "message": "Error connecting: {error}" | ||||
|   "services": { | ||||
|     "send_sound": { | ||||
|       "description": "Sends a sound to a device", | ||||
|       "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" | ||||
|     }, | ||||
|     "cannot_retrieve_data_with_error": { | ||||
|       "message": "Error retrieving data: {error}" | ||||
|     }, | ||||
|     "device_serial_number_missing": { | ||||
|       "message": "Device serial number missing: {device_id}" | ||||
|     }, | ||||
|     "invalid_device_id": { | ||||
|       "message": "Invalid device ID specified: {device_id}" | ||||
|     }, | ||||
|     "invalid_sound_value": { | ||||
|       "message": "Invalid sound {sound} specified" | ||||
|     }, | ||||
|     "entry_not_loaded": { | ||||
|       "message": "Entry not loaded: {entry}" | ||||
|     "send_text_command": { | ||||
|       "description": "Sends a text command to a device", | ||||
|       "fields": { | ||||
|         "device_id": { | ||||
|           "description": "[%key:component::alexa_devices::common::device_id_description%]", | ||||
|           "name": "Device" | ||||
|         }, | ||||
|         "text_command": { | ||||
|           "description": "The text command to send.", | ||||
|           "name": "Alexa text command" | ||||
|         } | ||||
|       }, | ||||
|       "name": "Send text command" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,12 @@ | ||||
| { | ||||
|   "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}", | ||||
|     "step": { | ||||
|       "discovery_confirm": { | ||||
| @@ -14,37 +21,30 @@ | ||||
|         }, | ||||
|         "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": { | ||||
|     "sensor": { | ||||
|       "co2": { | ||||
|         "name": "{sensor_name} CO2" | ||||
|       }, | ||||
|       "humidity": { | ||||
|         "name": "{sensor_name} humidity" | ||||
|       }, | ||||
|       "pressure": { | ||||
|         "name": "{sensor_name} pressure" | ||||
|       }, | ||||
|       "temperature": { | ||||
|         "name": "{sensor_name} temperature" | ||||
|       }, | ||||
|       "noise_max": { | ||||
|         "name": "Maximum noise" | ||||
|       }, | ||||
|       "noise_avg": { | ||||
|         "name": "Average noise" | ||||
|       }, | ||||
|       "co2": { | ||||
|         "name": "{sensor_name} CO2" | ||||
|       "noise_max": { | ||||
|         "name": "Maximum noise" | ||||
|       }, | ||||
|       "pressure": { | ||||
|         "name": "{sensor_name} pressure" | ||||
|       }, | ||||
|       "radiation": { | ||||
|         "name": "Radiation level" | ||||
|       }, | ||||
|       "temperature": { | ||||
|         "name": "{sensor_name} temperature" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,19 +1,5 @@ | ||||
| { | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "general": { | ||||
|         "default": "mdi:transmission-tower" | ||||
|       }, | ||||
|       "controlled_load": { | ||||
|         "default": "mdi:clock-outline" | ||||
|       }, | ||||
|       "feed_in": { | ||||
|         "default": "mdi:solar-power" | ||||
|       }, | ||||
|       "renewables": { | ||||
|         "default": "mdi:solar-power" | ||||
|       } | ||||
|     }, | ||||
|     "binary_sensor": { | ||||
|       "demand_window": { | ||||
|         "default": "mdi:meter-electric", | ||||
| @@ -21,6 +7,20 @@ | ||||
|           "off": "mdi:meter-electric-outline" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "sensor": { | ||||
|       "controlled_load": { | ||||
|         "default": "mdi:clock-outline" | ||||
|       }, | ||||
|       "feed_in": { | ||||
|         "default": "mdi:solar-power" | ||||
|       }, | ||||
|       "general": { | ||||
|         "default": "mdi:transmission-tower" | ||||
|       }, | ||||
|       "renewables": { | ||||
|         "default": "mdi:solar-power" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|   | ||||
| @@ -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": { | ||||
|     "channel_not_found": { | ||||
|       "message": "There is no {channel_type} channel at this site." | ||||
|     }, | ||||
|     "integration_not_found": { | ||||
|       "message": "Config entry \"{target}\" not found in registry." | ||||
|     }, | ||||
|     "not_loaded": { | ||||
|       "message": "{target} is not loaded." | ||||
|     }, | ||||
|     "channel_not_found": { | ||||
|       "message": "There is no {channel_type} channel at this site." | ||||
|     } | ||||
|   }, | ||||
|   "selector": { | ||||
|     "channel_type": { | ||||
|       "options": { | ||||
|         "general": "General", | ||||
|         "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" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -4,15 +4,15 @@ | ||||
|       "last_rain": { | ||||
|         "default": "mdi:water" | ||||
|       }, | ||||
|       "lightning_distance": { | ||||
|         "default": "mdi:lightning-bolt" | ||||
|       }, | ||||
|       "lightning_strikes_per_day": { | ||||
|         "default": "mdi:lightning-bolt" | ||||
|       }, | ||||
|       "lightning_strikes_per_hour": { | ||||
|         "default": "mdi:lightning-bolt" | ||||
|       }, | ||||
|       "lightning_distance": { | ||||
|         "default": "mdi:lightning-bolt" | ||||
|       }, | ||||
|       "wind_direction": { | ||||
|         "default": "mdi:compass-outline" | ||||
|       } | ||||
|   | ||||
| @@ -1,42 +1,30 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "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" | ||||
|         } | ||||
|       } | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "no_stations_found": "Did not find any stations in the selected region." | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     "step": { | ||||
|       "station": { | ||||
|         "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": { | ||||
|     "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": { | ||||
|         "name": "Absolute pressure" | ||||
|       }, | ||||
|       "relative_pressure": { | ||||
|         "name": "Relative pressure" | ||||
|       }, | ||||
|       "daily_rain": { | ||||
|         "name": "Daily rain" | ||||
|       }, | ||||
| @@ -52,21 +40,33 @@ | ||||
|       "last_rain": { | ||||
|         "name": "Last rain" | ||||
|       }, | ||||
|       "lightning_distance": { | ||||
|         "name": "Lightning distance" | ||||
|       }, | ||||
|       "lightning_strikes_per_day": { | ||||
|         "name": "Lightning strikes per day" | ||||
|       }, | ||||
|       "lightning_strikes_per_hour": { | ||||
|         "name": "Lightning strikes per hour" | ||||
|       }, | ||||
|       "lightning_distance": { | ||||
|         "name": "Lightning distance" | ||||
|       }, | ||||
|       "max_daily_gust": { | ||||
|         "name": "Max daily gust" | ||||
|       }, | ||||
|       "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": { | ||||
|         "name": "UV index" | ||||
|       }, | ||||
|   | ||||
| @@ -1,20 +1,20 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "title": "Fill in your information", | ||||
|         "data": { | ||||
|           "api_key": "[%key:common::config_flow::data::api_key%]", | ||||
|           "app_key": "Application Key" | ||||
|         } | ||||
|       } | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_service%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "invalid_key": "[%key:common::config_flow::error::invalid_api_key%]", | ||||
|       "no_devices": "No devices found in account" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_service%]" | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "api_key": "[%key:common::config_flow::data::api_key%]", | ||||
|           "app_key": "Application Key" | ||||
|         }, | ||||
|         "title": "Fill in your information" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
| @@ -22,6 +22,9 @@ | ||||
|       "battery_1": { | ||||
|         "name": "Battery 1" | ||||
|       }, | ||||
|       "battery_10": { | ||||
|         "name": "Battery 10" | ||||
|       }, | ||||
|       "battery_2": { | ||||
|         "name": "Battery 2" | ||||
|       }, | ||||
| @@ -46,59 +49,11 @@ | ||||
|       "battery_9": { | ||||
|         "name": "Battery 9" | ||||
|       }, | ||||
|       "battery_10": { | ||||
|         "name": "Battery 10" | ||||
|       }, | ||||
|       "interior_battery": { | ||||
|         "name": "Interior battery" | ||||
|       }, | ||||
|       "leak_detector_battery_1": { | ||||
|         "name": "Leak detector battery 1" | ||||
|       }, | ||||
|       "leak_detector_battery_2": { | ||||
|         "name": "Leak detector battery 2" | ||||
|       }, | ||||
|       "leak_detector_battery_3": { | ||||
|         "name": "Leak detector battery 3" | ||||
|       }, | ||||
|       "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": { | ||||
|         "name": "Lightning detector battery" | ||||
|       "interior_battery": { | ||||
|         "name": "Interior battery" | ||||
|       }, | ||||
|       "leak_detector_1": { | ||||
|         "name": "Leak detector 1" | ||||
| @@ -112,15 +67,33 @@ | ||||
|       "leak_detector_4": { | ||||
|         "name": "Leak detector 4" | ||||
|       }, | ||||
|       "pm25_indoor_battery": { | ||||
|         "name": "PM25 indoor battery" | ||||
|       "leak_detector_battery_1": { | ||||
|         "name": "Leak detector battery 1" | ||||
|       }, | ||||
|       "leak_detector_battery_2": { | ||||
|         "name": "Leak detector battery 2" | ||||
|       }, | ||||
|       "leak_detector_battery_3": { | ||||
|         "name": "Leak detector battery 3" | ||||
|       }, | ||||
|       "leak_detector_battery_4": { | ||||
|         "name": "Leak detector battery 4" | ||||
|       }, | ||||
|       "lightning_detector_battery": { | ||||
|         "name": "Lightning detector battery" | ||||
|       }, | ||||
|       "pm25_battery": { | ||||
|         "name": "PM25 battery" | ||||
|       }, | ||||
|       "pm25_indoor_battery": { | ||||
|         "name": "PM25 indoor battery" | ||||
|       }, | ||||
|       "relay_1": { | ||||
|         "name": "Relay 1" | ||||
|       }, | ||||
|       "relay_10": { | ||||
|         "name": "Relay 10" | ||||
|       }, | ||||
|       "relay_2": { | ||||
|         "name": "Relay 2" | ||||
|       }, | ||||
| @@ -145,32 +118,44 @@ | ||||
|       "relay_9": { | ||||
|         "name": "Relay 9" | ||||
|       }, | ||||
|       "relay_10": { | ||||
|         "name": "Relay 10" | ||||
|       "soil_monitor_battery_1": { | ||||
|         "name": "Soil monitor battery 1" | ||||
|       }, | ||||
|       "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": { | ||||
|       "24_hour_rain": { | ||||
|         "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": { | ||||
|         "name": "Absolute pressure" | ||||
|       }, | ||||
|       "relative_pressure": { | ||||
|         "name": "Relative pressure" | ||||
|       }, | ||||
|       "daily_rain": { | ||||
|         "name": "Daily rain" | ||||
|       }, | ||||
| @@ -186,6 +171,9 @@ | ||||
|       "humidity_1": { | ||||
|         "name": "Humidity 1" | ||||
|       }, | ||||
|       "humidity_10": { | ||||
|         "name": "Humidity 10" | ||||
|       }, | ||||
|       "humidity_2": { | ||||
|         "name": "Humidity 2" | ||||
|       }, | ||||
| @@ -210,14 +198,11 @@ | ||||
|       "humidity_9": { | ||||
|         "name": "Humidity 9" | ||||
|       }, | ||||
|       "humidity_10": { | ||||
|         "name": "Humidity 10" | ||||
|       }, | ||||
|       "humidity_indoor": { | ||||
|         "name": "Humidity indoor" | ||||
|       }, | ||||
|       "last_rain": { | ||||
|         "name": "Last rain" | ||||
|       "inside_temperature": { | ||||
|         "name": "Inside temperature" | ||||
|       }, | ||||
|       "last_lightning_strike": { | ||||
|         "name": "Last Lightning strike" | ||||
| @@ -225,6 +210,12 @@ | ||||
|       "last_lightning_strike_distance": { | ||||
|         "name": "Last Lightning strike distance" | ||||
|       }, | ||||
|       "last_rain": { | ||||
|         "name": "Last rain" | ||||
|       }, | ||||
|       "lifetime_rain": { | ||||
|         "name": "Lifetime rain" | ||||
|       }, | ||||
|       "lightning_strikes_per_day": { | ||||
|         "name": "Lightning strikes per day" | ||||
|       }, | ||||
| @@ -240,15 +231,33 @@ | ||||
|       "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" | ||||
|       }, | ||||
|       "pm25_indoor": { | ||||
|         "name": "PM2.5 indoor" | ||||
|       }, | ||||
|       "pm25_indoor_24h_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": { | ||||
|         "name": "Soil humidity 1" | ||||
|       }, | ||||
|       "soil_humidity_10": { | ||||
|         "name": "Soil humidity 10" | ||||
|       }, | ||||
|       "soil_humidity_2": { | ||||
|         "name": "Soil humidity 2" | ||||
|       }, | ||||
| @@ -273,12 +282,12 @@ | ||||
|       "soil_humidity_9": { | ||||
|         "name": "Soil humidity 9" | ||||
|       }, | ||||
|       "soil_humidity_10": { | ||||
|         "name": "Soil humidity 10" | ||||
|       }, | ||||
|       "soil_temperature_1": { | ||||
|         "name": "Soil temperature 1" | ||||
|       }, | ||||
|       "soil_temperature_10": { | ||||
|         "name": "Soil temperature 10" | ||||
|       }, | ||||
|       "soil_temperature_2": { | ||||
|         "name": "Soil temperature 2" | ||||
|       }, | ||||
| @@ -303,12 +312,12 @@ | ||||
|       "soil_temperature_9": { | ||||
|         "name": "Soil temperature 9" | ||||
|       }, | ||||
|       "soil_temperature_10": { | ||||
|         "name": "Soil temperature 10" | ||||
|       }, | ||||
|       "temperature_1": { | ||||
|         "name": "Temperature 1" | ||||
|       }, | ||||
|       "temperature_10": { | ||||
|         "name": "Temperature 10" | ||||
|       }, | ||||
|       "temperature_2": { | ||||
|         "name": "Temperature 2" | ||||
|       }, | ||||
| @@ -333,21 +342,18 @@ | ||||
|       "temperature_9": { | ||||
|         "name": "Temperature 9" | ||||
|       }, | ||||
|       "temperature_10": { | ||||
|         "name": "Temperature 10" | ||||
|       }, | ||||
|       "inside_temperature": { | ||||
|         "name": "Inside temperature" | ||||
|       }, | ||||
|       "lifetime_rain": { | ||||
|         "name": "Lifetime rain" | ||||
|       }, | ||||
|       "uv_index": { | ||||
|         "name": "UV index" | ||||
|       }, | ||||
|       "weekly_rain": { | ||||
|         "name": "Weekly rain" | ||||
|       }, | ||||
|       "wind_average_10m": { | ||||
|         "name": "Wind average 10 minutes" | ||||
|       }, | ||||
|       "wind_average_2m": { | ||||
|         "name": "Wind average 2 minutes" | ||||
|       }, | ||||
|       "wind_direction": { | ||||
|         "name": "Wind direction" | ||||
|       }, | ||||
| @@ -357,17 +363,11 @@ | ||||
|       "wind_direction_average_2m": { | ||||
|         "name": "Wind direction average 2 minutes" | ||||
|       }, | ||||
|       "wind_gust_direction": { | ||||
|         "name": "Wind gust direction" | ||||
|       }, | ||||
|       "wind_gust": { | ||||
|         "name": "Wind gust" | ||||
|       }, | ||||
|       "wind_average_10m": { | ||||
|         "name": "Wind average 10 minutes" | ||||
|       }, | ||||
|       "wind_average_2m": { | ||||
|         "name": "Wind average 2 minutes" | ||||
|       "wind_gust_direction": { | ||||
|         "name": "Wind gust direction" | ||||
|       }, | ||||
|       "yearly_rain": { | ||||
|         "name": "Yearly rain" | ||||
|   | ||||
| @@ -1,7 +1,10 @@ | ||||
| { | ||||
|   "services": { | ||||
|     "enable_recording": { | ||||
|       "service": "mdi:record-rec" | ||||
|     "disable_audio": { | ||||
|       "service": "mdi:volume-off" | ||||
|     }, | ||||
|     "disable_motion_recording": { | ||||
|       "service": "mdi:motion-sensor-off" | ||||
|     }, | ||||
|     "disable_recording": { | ||||
|       "service": "mdi:stop" | ||||
| @@ -9,18 +12,18 @@ | ||||
|     "enable_audio": { | ||||
|       "service": "mdi:volume-high" | ||||
|     }, | ||||
|     "disable_audio": { | ||||
|       "service": "mdi:volume-off" | ||||
|     }, | ||||
|     "enable_motion_recording": { | ||||
|       "service": "mdi:motion-sensor" | ||||
|     }, | ||||
|     "disable_motion_recording": { | ||||
|       "service": "mdi:motion-sensor-off" | ||||
|     "enable_recording": { | ||||
|       "service": "mdi:record-rec" | ||||
|     }, | ||||
|     "goto_preset": { | ||||
|       "service": "mdi:pan" | ||||
|     }, | ||||
|     "ptz_control": { | ||||
|       "service": "mdi:pan" | ||||
|     }, | ||||
|     "set_color_bw": { | ||||
|       "service": "mdi:palette" | ||||
|     }, | ||||
| @@ -29,9 +32,6 @@ | ||||
|     }, | ||||
|     "stop_tour": { | ||||
|       "service": "mdi:panorama-outline" | ||||
|     }, | ||||
|     "ptz_control": { | ||||
|       "service": "mdi:pan" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,130 +1,130 @@ | ||||
| { | ||||
|   "services": { | ||||
|     "enable_recording": { | ||||
|       "name": "Enable recording", | ||||
|       "description": "Enables continuous recording to camera storage.", | ||||
|       "fields": { | ||||
|         "entity_id": { | ||||
|           "name": "Entity", | ||||
|           "description": "Name(s) of the cameras, or 'all' for all cameras." | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "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%]" | ||||
|           "description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]", | ||||
|           "name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "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%]" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Disable audio" | ||||
|     }, | ||||
|     "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%]" | ||||
|           "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": { | ||||
|       "description": "Enables continuous recording to camera storage.", | ||||
|       "fields": { | ||||
|         "entity_id": { | ||||
|           "description": "Name(s) of the cameras, or 'all' for all cameras.", | ||||
|           "name": "Entity" | ||||
|         } | ||||
|       }, | ||||
|       "name": "Enable recording" | ||||
|     }, | ||||
|     "goto_preset": { | ||||
|       "name": "Go to preset", | ||||
|       "description": "Moves camera to PTZ preset.", | ||||
|       "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%]" | ||||
|           "description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]", | ||||
|           "name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]" | ||||
|         }, | ||||
|         "preset": { | ||||
|           "name": "Preset", | ||||
|           "description": "Preset number." | ||||
|           "description": "Preset number.", | ||||
|           "name": "Preset" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "set_color_bw": { | ||||
|       "name": "Set color", | ||||
|       "description": "Sets camera color mode.", | ||||
|       "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%]" | ||||
|         }, | ||||
|         "color_bw": { | ||||
|           "name": "Color", | ||||
|           "description": "Color mode." | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "start_tour": { | ||||
|       "name": "Start tour", | ||||
|       "description": "Starts camera's PTZ tour function.", | ||||
|       "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%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "stop_tour": { | ||||
|       "name": "Stop tour", | ||||
|       "description": "Stops camera's PTZ tour function.", | ||||
|       "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%]" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Go to preset" | ||||
|     }, | ||||
|     "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%]" | ||||
|           "description": "[%key:component::amcrest::services::enable_recording::fields::entity_id::description%]", | ||||
|           "name": "[%key:component::amcrest::services::enable_recording::fields::entity_id::name%]" | ||||
|         }, | ||||
|         "movement": { | ||||
|           "name": "Movement", | ||||
|           "description": "Direction to move the camera." | ||||
|           "description": "Direction to move the camera.", | ||||
|           "name": "Movement" | ||||
|         }, | ||||
|         "travel_time": { | ||||
|           "name": "Travel time", | ||||
|           "description": "Travel time in fractional seconds: from 0 to 1." | ||||
|           "description": "Travel time in fractional seconds: from 0 to 1.", | ||||
|           "name": "Travel time" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "PTZ control" | ||||
|     }, | ||||
|     "set_color_bw": { | ||||
|       "description": "Sets camera color mode.", | ||||
|       "fields": { | ||||
|         "color_bw": { | ||||
|           "description": "Color mode.", | ||||
|           "name": "Color" | ||||
|         }, | ||||
|         "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": "Set color" | ||||
|     }, | ||||
|     "start_tour": { | ||||
|       "description": "Starts camera's PTZ tour function.", | ||||
|       "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": "Start tour" | ||||
|     }, | ||||
|     "stop_tour": { | ||||
|       "description": "Stops camera's PTZ tour function.", | ||||
|       "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": "Stop tour" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,47 +1,25 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "no_integrations_selected": "You must select at least one integration to track" | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     }, | ||||
|     "step": { | ||||
|       "init": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "tracked_addons": "[%key:component::analytics_insights::config::step::user::data::tracked_addons%]", | ||||
|           "tracked_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_integrations%]", | ||||
|           "tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data::tracked_custom_integrations%]" | ||||
|           "tracked_addons": "Add-ons", | ||||
|           "tracked_custom_integrations": "Custom integrations", | ||||
|           "tracked_integrations": "Integrations" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "tracked_addons": "[%key:component::analytics_insights::config::step::user::data_description::tracked_addons%]", | ||||
|           "tracked_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_integrations%]", | ||||
|           "tracked_custom_integrations": "[%key:component::analytics_insights::config::step::user::data_description::tracked_custom_integrations%]" | ||||
|           "tracked_addons": "Select the add-ons you want to track", | ||||
|           "tracked_custom_integrations": "Select the custom integrations you want to track", | ||||
|           "tracked_integrations": "Select the integrations you want to track" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "abort": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "no_integrations_selected": "[%key:component::analytics_insights::config::error::no_integrations_selected%]" | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
| @@ -56,5 +34,27 @@ | ||||
|         "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%]" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -51,11 +51,11 @@ | ||||
|       "torch": { | ||||
|         "default": "mdi:white-balance-sunny" | ||||
|       }, | ||||
|       "whitebalance_lock": { | ||||
|         "default": "mdi:white-balance-auto" | ||||
|       }, | ||||
|       "video_recording": { | ||||
|         "default": "mdi:record-rec" | ||||
|       }, | ||||
|       "whitebalance_lock": { | ||||
|         "default": "mdi:white-balance-auto" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,24 +1,24 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]", | ||||
|           "username": "[%key:common::config_flow::data::username%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         }, | ||||
|         "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." | ||||
|         } | ||||
|       } | ||||
|     "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%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]", | ||||
|           "username": "[%key:common::config_flow::data::username%]" | ||||
|         }, | ||||
|         "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." | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -6,11 +6,11 @@ | ||||
|     "download": { | ||||
|       "service": "mdi:download" | ||||
|     }, | ||||
|     "upload": { | ||||
|       "service": "mdi:upload" | ||||
|     }, | ||||
|     "learn_sendevent": { | ||||
|       "service": "mdi:remote" | ||||
|     }, | ||||
|     "upload": { | ||||
|       "service": "mdi:upload" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,112 +1,112 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "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_port": "Port of the ADB server", | ||||
|           "device_class": "The type of device", | ||||
|           "port": "[%key:common::config_flow::data::port%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", | ||||
|       "invalid_host": "[%key:common::config_flow::error::invalid_host%]", | ||||
|       "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": { | ||||
|     "step": { | ||||
|       "init": { | ||||
|         "data": { | ||||
|           "apps": "Configure applications list", | ||||
|           "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)", | ||||
|           "state_detection_rules": "Configure state detection rules", | ||||
|           "turn_off_command": "ADB shell turn off command (leave empty for default)", | ||||
|           "turn_on_command": "ADB shell turn on command (leave empty for default)" | ||||
|         } | ||||
|       }, | ||||
|       "apps": { | ||||
|         "title": "Configure Android apps", | ||||
|         "description": "Configure application ID {app_id}", | ||||
|         "data": { | ||||
|           "app_name": "Application name", | ||||
|           "app_id": "Application ID", | ||||
|           "app_delete": "Check to delete this application" | ||||
|         } | ||||
|       }, | ||||
|       "rules": { | ||||
|         "title": "Configure Android state detection rules", | ||||
|         "description": "Configure detection rule for application ID {rule_id}", | ||||
|         "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": { | ||||
|     "adb_command": { | ||||
|       "name": "ADB command", | ||||
|       "description": "Sends an ADB command to an Android / Fire TV device.", | ||||
|       "fields": { | ||||
|         "command": { | ||||
|           "name": "Command", | ||||
|           "description": "Either a key command or an ADB shell command." | ||||
|       "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": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "adb_server_ip": "IP address of the ADB server (leave empty to not use)", | ||||
|           "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", | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "download": { | ||||
|       "name": "Download", | ||||
|       "description": "Downloads a file from your Android / Fire TV device to your Home Assistant instance.", | ||||
|       "fields": { | ||||
|         "device_path": { | ||||
|           "name": "Device path", | ||||
|           "description": "The filepath on the Android / Fire TV device." | ||||
|         }, | ||||
|         "local_path": { | ||||
|           "name": "Local path", | ||||
|           "description": "The filepath on your Home Assistant instance." | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "upload": { | ||||
|       "name": "Upload", | ||||
|       "description": "Uploads a file from your Home Assistant instance to an Android / Fire TV device.", | ||||
|       "fields": { | ||||
|         "device_path": { | ||||
|           "name": "[%key:component::androidtv::services::download::fields::device_path::name%]", | ||||
|           "description": "[%key:component::androidtv::services::download::fields::device_path::description%]" | ||||
|         }, | ||||
|         "local_path": { | ||||
|           "name": "[%key:component::androidtv::services::download::fields::local_path::name%]", | ||||
|           "description": "[%key:component::androidtv::services::download::fields::local_path::description%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "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}" | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     "error": { | ||||
|       "invalid_det_rules": "Invalid state detection rules" | ||||
|     }, | ||||
|     "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": { | ||||
|         "data": { | ||||
|           "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", | ||||
|           "screencap_interval": "Interval in minutes between screen capture for album art (set 0 to disable)", | ||||
|           "state_detection_rules": "Configure state detection rules", | ||||
|           "turn_off_command": "ADB shell turn off command (leave empty for default)", | ||||
|           "turn_on_command": "ADB shell turn on command (leave empty for default)" | ||||
|         } | ||||
|       }, | ||||
|       "rules": { | ||||
|         "data": { | ||||
|           "rule_delete": "Check to delete this rule", | ||||
|           "rule_id": "[%key:component::androidtv::options::step::apps::data::app_id%]", | ||||
|           "rule_values": "List of state detection rules (see documentation)" | ||||
|         }, | ||||
|         "description": "Configure detection rule for application ID {rule_id}", | ||||
|         "title": "Configure Android state detection rules" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|     "adb_command": { | ||||
|       "description": "Sends an ADB command to an Android / Fire TV device.", | ||||
|       "fields": { | ||||
|         "command": { | ||||
|           "description": "Either a key command or an ADB shell command.", | ||||
|           "name": "Command" | ||||
|         } | ||||
|       }, | ||||
|       "name": "ADB command" | ||||
|     }, | ||||
|     "download": { | ||||
|       "description": "Downloads a file from your Android / Fire TV device to your Home Assistant instance.", | ||||
|       "fields": { | ||||
|         "device_path": { | ||||
|           "description": "The filepath on the Android / Fire TV device.", | ||||
|           "name": "Device path" | ||||
|         }, | ||||
|         "local_path": { | ||||
|           "description": "The filepath on your Home Assistant instance.", | ||||
|           "name": "Local path" | ||||
|         } | ||||
|       }, | ||||
|       "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": { | ||||
|       "description": "Uploads a file from your Home Assistant instance to an Android / Fire TV device.", | ||||
|       "fields": { | ||||
|         "device_path": { | ||||
|           "description": "[%key:component::androidtv::services::download::fields::device_path::description%]", | ||||
|           "name": "[%key:component::androidtv::services::download::fields::device_path::name%]" | ||||
|         }, | ||||
|         "local_path": { | ||||
|           "description": "[%key:component::androidtv::services::download::fields::local_path::description%]", | ||||
|           "name": "[%key:component::androidtv::services::download::fields::local_path::name%]" | ||||
|         } | ||||
|       }, | ||||
|       "name": "Upload" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,42 +1,11 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "flow_title": "{name}", | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "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.", | ||||
|         "data": { | ||||
|           "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." | ||||
|       } | ||||
|     "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." | ||||
|     }, | ||||
|     "error": { | ||||
|       "already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]", | ||||
| @@ -44,41 +13,42 @@ | ||||
|       "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_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": { | ||||
|     "flow_title": "{name}", | ||||
|     "step": { | ||||
|       "init": { | ||||
|       "pair": { | ||||
|         "data": { | ||||
|           "apps": "Configure applications list", | ||||
|           "enable_ime": "Enable IME" | ||||
|           "pin": "[%key:common::config_flow::data::pin%]" | ||||
|         }, | ||||
|         "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." | ||||
|         } | ||||
|           "pin": "Pairing code displayed on the Android TV device." | ||||
|         }, | ||||
|         "description": "Enter the pairing code displayed on the Android TV ({name})." | ||||
|       }, | ||||
|       "apps": { | ||||
|         "title": "Configure Android apps", | ||||
|         "description": "Configure application ID {app_id}", | ||||
|       "reauth_confirm": { | ||||
|         "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": "[%key:common::config_flow::title::reauth%]" | ||||
|       }, | ||||
|       "reconfigure": { | ||||
|         "data": { | ||||
|           "app_name": "Application name", | ||||
|           "app_id": "Application ID", | ||||
|           "app_icon": "Application icon", | ||||
|           "app_delete": "Check to delete this application" | ||||
|           "host": "[%key:common::config_flow::data::host%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "app_name": "Name of the application as you would like it to be displayed in Home Assistant.", | ||||
|           "app_id": "E.g. {example_app_id} for {example_app_play_store_url}", | ||||
|           "app_icon": "Image URL. From the Play Store app page, right click on the icon and select 'Copy image address' and then paste it here. Alternatively, download the image, upload it under /config/www/ and use the URL /local/filename", | ||||
|           "app_delete": "Check this box to delete the application from the list." | ||||
|         } | ||||
|           "host": "The hostname or IP address of the Android TV device." | ||||
|         }, | ||||
|         "description": "Update the IP address of this previously configured Android TV device." | ||||
|       }, | ||||
|       "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" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| @@ -93,6 +63,36 @@ | ||||
|       "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": { | ||||
|     "apps": { | ||||
|       "options": { | ||||
|   | ||||
| @@ -4,15 +4,15 @@ | ||||
|       "cook_time": { | ||||
|         "default": "mdi:clock-outline" | ||||
|       }, | ||||
|       "target_temperature": { | ||||
|         "default": "mdi:thermometer" | ||||
|       }, | ||||
|       "cook_time_remaining": { | ||||
|         "default": "mdi:clock-outline" | ||||
|       }, | ||||
|       "heater_temperature": { | ||||
|         "default": "mdi:thermometer" | ||||
|       }, | ||||
|       "target_temperature": { | ||||
|         "default": "mdi:thermometer" | ||||
|       }, | ||||
|       "triac_temperature": { | ||||
|         "default": "mdi:thermometer" | ||||
|       }, | ||||
|   | ||||
| @@ -1,19 +1,19 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", | ||||
|       "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": { | ||||
| @@ -21,39 +21,39 @@ | ||||
|       "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": { | ||||
|         "name": "Cook time remaining" | ||||
|       }, | ||||
|       "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": { | ||||
|         "name": "Triac temperature" | ||||
|       }, | ||||
|   | ||||
| @@ -1,5 +1,12 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "user": { | ||||
|         "data": { | ||||
| @@ -7,13 +14,6 @@ | ||||
|           "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%]" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,61 +1,61 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "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": { | ||||
|     "conversation": { | ||||
|       "initiate_flow": { | ||||
|         "user": "Add conversation agent", | ||||
|         "reconfigure": "Reconfigure conversation agent" | ||||
|       "abort": { | ||||
|         "entry_not_loaded": "Cannot add things while the configuration is disabled.", | ||||
|         "reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]" | ||||
|       }, | ||||
|       "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": { | ||||
|         "set_options": { | ||||
|           "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%]", | ||||
|             "prompt": "[%key:common::config_flow::data::prompt%]", | ||||
|             "chat_model": "[%key:common::generic::model%]", | ||||
|             "max_tokens": "Maximum tokens to return in response", | ||||
|             "temperature": "Temperature", | ||||
|             "llm_hass_api": "[%key:common::config_flow::data::llm_hass_api%]", | ||||
|             "recommended": "Recommended model settings", | ||||
|             "temperature": "Temperature", | ||||
|             "thinking_budget": "Thinking budget", | ||||
|             "user_location": "Include home location", | ||||
|             "web_search": "Enable web search", | ||||
|             "web_search_max_uses": "Maximum web searches", | ||||
|             "user_location": "Include home location" | ||||
|             "web_search_max_uses": "Maximum web searches" | ||||
|           }, | ||||
|           "data_description": { | ||||
|             "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.", | ||||
|             "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_max_uses": "Limit the number of searches performed per response", | ||||
|             "user_location": "Localize search results based on home location" | ||||
|             "web_search_max_uses": "Limit the number of searches performed per response" | ||||
|           } | ||||
|         } | ||||
|       }, | ||||
|       "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." | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -5,5 +5,5 @@ | ||||
|   "config_flow": true, | ||||
|   "documentation": "https://www.home-assistant.io/integrations/aosmith", | ||||
|   "iot_class": "cloud_polling", | ||||
|   "requirements": ["py-aosmith==1.0.14"] | ||||
|   "requirements": ["py-aosmith==1.0.15"] | ||||
| } | ||||
|   | ||||
| @@ -1,28 +1,28 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "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": { | ||||
|         "data": { | ||||
|           "email": "[%key:common::config_flow::data::email%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         }, | ||||
|         "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": { | ||||
| @@ -30,19 +30,19 @@ | ||||
|       "hot_water_plus_level": { | ||||
|         "name": "Hot Water+ level", | ||||
|         "state": { | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "level1": "Level 1", | ||||
|           "level2": "Level 2", | ||||
|           "level3": "Level 3" | ||||
|           "level3": "Level 3", | ||||
|           "off": "[%key:common::state::off%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "sensor": { | ||||
|       "hot_water_availability": { | ||||
|         "name": "Hot water availability" | ||||
|       }, | ||||
|       "energy_usage": { | ||||
|         "name": "Energy usage" | ||||
|       }, | ||||
|       "hot_water_availability": { | ||||
|         "name": "Hot water availability" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -9,11 +9,14 @@ | ||||
|       "alarm_delay": { | ||||
|         "default": "mdi:alarm" | ||||
|       }, | ||||
|       "apc_model": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "apc_status": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "apc_model": { | ||||
|         "default": "mdi:information-outline" | ||||
|       "apparent_power": { | ||||
|         "default": "mdi:gauge" | ||||
|       }, | ||||
|       "bad_batteries": { | ||||
|         "default": "mdi:information-outline" | ||||
| @@ -27,30 +30,18 @@ | ||||
|       "cable_type": { | ||||
|         "default": "mdi:ethernet-cable" | ||||
|       }, | ||||
|       "total_time_on_battery": { | ||||
|         "default": "mdi:timer-outline" | ||||
|       }, | ||||
|       "date": { | ||||
|         "default": "mdi:calendar-clock" | ||||
|       }, | ||||
|       "date_and_time": { | ||||
|         "default": "mdi:calendar-clock" | ||||
|       }, | ||||
|       "dip_switch_settings": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "low_battery_signal": { | ||||
|         "default": "mdi:clock-alert" | ||||
|       }, | ||||
|       "driver": { | ||||
|         "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": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
| @@ -72,8 +63,8 @@ | ||||
|       "load_capacity": { | ||||
|         "default": "mdi:gauge" | ||||
|       }, | ||||
|       "apparent_power": { | ||||
|         "default": "mdi:gauge" | ||||
|       "low_battery_signal": { | ||||
|         "default": "mdi:clock-alert" | ||||
|       }, | ||||
|       "manufacture_date": { | ||||
|         "default": "mdi:calendar" | ||||
| @@ -81,20 +72,20 @@ | ||||
|       "master_update": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "max_time": { | ||||
|         "default": "mdi:timer-off-outline" | ||||
|       }, | ||||
|       "max_battery_charge": { | ||||
|         "default": "mdi:battery-alert" | ||||
|       }, | ||||
|       "max_time": { | ||||
|         "default": "mdi:timer-off-outline" | ||||
|       }, | ||||
|       "min_time": { | ||||
|         "default": "mdi:timer-outline" | ||||
|       }, | ||||
|       "model": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "transfer_count": { | ||||
|         "default": "mdi:counter" | ||||
|       "online_status": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "register_1_fault": { | ||||
|         "default": "mdi:information-outline" | ||||
| @@ -108,6 +99,9 @@ | ||||
|       "restore_capacity": { | ||||
|         "default": "mdi:battery-alert" | ||||
|       }, | ||||
|       "self_test_interval": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "self_test_result": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
| @@ -117,24 +111,33 @@ | ||||
|       "serial_number": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "shutdown_delay": { | ||||
|         "default": "mdi:timer-outline" | ||||
|       }, | ||||
|       "startup_time": { | ||||
|         "default": "mdi:calendar-clock" | ||||
|       }, | ||||
|       "online_status": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "status": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "self_test_interval": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "time_left": { | ||||
|         "default": "mdi:clock-alert" | ||||
|       }, | ||||
|       "time_on_battery": { | ||||
|         "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": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
| @@ -144,11 +147,8 @@ | ||||
|       "version": { | ||||
|         "default": "mdi:information-outline" | ||||
|       }, | ||||
|       "transfer_from_battery": { | ||||
|         "default": "mdi:transfer" | ||||
|       }, | ||||
|       "transfer_to_battery": { | ||||
|         "default": "mdi:transfer" | ||||
|       "wake_delay": { | ||||
|         "default": "mdi:timer-outline" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -2,24 +2,13 @@ | ||||
|   "config": { | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]", | ||||
|       "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%]" | ||||
|       "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." | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "The hostname or IP address of the APC UPS Daemon", | ||||
|           "port": "The port the APC UPS Daemon is listening on" | ||||
|         }, | ||||
|         "description": "Enter the host and port on which the apcupsd NIS is being served." | ||||
|       }, | ||||
|       "reconfigure": { | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
| @@ -30,6 +19,17 @@ | ||||
|           "port": "[%key:component::apcupsd::config::step::user::data_description::port%]" | ||||
|         }, | ||||
|         "description": "[%key:component::apcupsd::config::step::user::description%]" | ||||
|       }, | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "The hostname or IP address of the APC UPS Daemon", | ||||
|           "port": "The port the APC UPS Daemon is listening on" | ||||
|         }, | ||||
|         "description": "Enter the host and port on which the apcupsd NIS is being served." | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| @@ -46,15 +46,21 @@ | ||||
|       "ambient_temperature": { | ||||
|         "name": "Ambient temperature" | ||||
|       }, | ||||
|       "apc_status": { | ||||
|         "name": "Status data" | ||||
|       }, | ||||
|       "apc_model": { | ||||
|         "name": "Model" | ||||
|       }, | ||||
|       "apc_status": { | ||||
|         "name": "Status data" | ||||
|       }, | ||||
|       "apparent_power": { | ||||
|         "name": "Load apparent power" | ||||
|       }, | ||||
|       "bad_batteries": { | ||||
|         "name": "Bad batteries" | ||||
|       }, | ||||
|       "battery_nominal_voltage": { | ||||
|         "name": "Battery nominal voltage" | ||||
|       }, | ||||
|       "battery_replacement_date": { | ||||
|         "name": "Battery replaced" | ||||
|       }, | ||||
| @@ -67,45 +73,36 @@ | ||||
|       "cable_type": { | ||||
|         "name": "Cable type" | ||||
|       }, | ||||
|       "total_time_on_battery": { | ||||
|         "name": "Total time on battery" | ||||
|       }, | ||||
|       "date": { | ||||
|         "name": "Status date" | ||||
|       }, | ||||
|       "date_and_time": { | ||||
|         "name": "Date and time" | ||||
|       }, | ||||
|       "dip_switch_settings": { | ||||
|         "name": "DIP switch settings" | ||||
|       }, | ||||
|       "low_battery_signal": { | ||||
|         "name": "Low battery signal" | ||||
|       }, | ||||
|       "driver": { | ||||
|         "name": "Driver" | ||||
|       }, | ||||
|       "shutdown_delay": { | ||||
|         "name": "Shutdown delay" | ||||
|       }, | ||||
|       "wake_delay": { | ||||
|         "name": "Wake delay" | ||||
|       }, | ||||
|       "date_and_time": { | ||||
|         "name": "Date and time" | ||||
|       }, | ||||
|       "external_batteries": { | ||||
|         "name": "External batteries" | ||||
|       }, | ||||
|       "firmware_version": { | ||||
|         "name": "Firmware version" | ||||
|       }, | ||||
|       "transfer_high": { | ||||
|         "name": "Transfer high" | ||||
|       }, | ||||
|       "hostname": { | ||||
|         "name": "Hostname" | ||||
|       }, | ||||
|       "humidity": { | ||||
|         "name": "Ambient humidity" | ||||
|       }, | ||||
|       "input_voltage_high": { | ||||
|         "name": "Input voltage high" | ||||
|       }, | ||||
|       "input_voltage_low": { | ||||
|         "name": "Input voltage low" | ||||
|       }, | ||||
|       "internal_temperature": { | ||||
|         "name": "Internal temperature" | ||||
|       }, | ||||
| @@ -127,11 +124,8 @@ | ||||
|       "load_capacity": { | ||||
|         "name": "Load" | ||||
|       }, | ||||
|       "apparent_power": { | ||||
|         "name": "Load apparent power" | ||||
|       }, | ||||
|       "transfer_low": { | ||||
|         "name": "Transfer low" | ||||
|       "low_battery_signal": { | ||||
|         "name": "Low battery signal" | ||||
|       }, | ||||
|       "manufacture_date": { | ||||
|         "name": "Manufacture date" | ||||
| @@ -139,17 +133,11 @@ | ||||
|       "master_update": { | ||||
|         "name": "Master update" | ||||
|       }, | ||||
|       "input_voltage_high": { | ||||
|         "name": "Input voltage high" | ||||
|       }, | ||||
|       "max_time": { | ||||
|         "name": "Battery timeout" | ||||
|       }, | ||||
|       "max_battery_charge": { | ||||
|         "name": "Battery shutdown" | ||||
|       }, | ||||
|       "input_voltage_low": { | ||||
|         "name": "Input voltage low" | ||||
|       "max_time": { | ||||
|         "name": "Battery timeout" | ||||
|       }, | ||||
|       "min_time": { | ||||
|         "name": "Shutdown time" | ||||
| @@ -157,23 +145,20 @@ | ||||
|       "model": { | ||||
|         "name": "Model" | ||||
|       }, | ||||
|       "battery_nominal_voltage": { | ||||
|         "name": "Battery nominal voltage" | ||||
|       "nominal_apparent_power": { | ||||
|         "name": "Nominal apparent power" | ||||
|       }, | ||||
|       "nominal_input_voltage": { | ||||
|         "name": "Nominal input voltage" | ||||
|       }, | ||||
|       "nominal_output_voltage": { | ||||
|         "name": "Nominal output voltage" | ||||
|       }, | ||||
|       "nominal_output_power": { | ||||
|         "name": "Nominal output power" | ||||
|       }, | ||||
|       "nominal_apparent_power": { | ||||
|         "name": "Nominal apparent power" | ||||
|       "nominal_output_voltage": { | ||||
|         "name": "Nominal output voltage" | ||||
|       }, | ||||
|       "transfer_count": { | ||||
|         "name": "Transfer count" | ||||
|       "online_status": { | ||||
|         "name": "Status flag" | ||||
|       }, | ||||
|       "output_current": { | ||||
|         "name": "Output current" | ||||
| @@ -193,6 +178,9 @@ | ||||
|       "restore_capacity": { | ||||
|         "name": "Restore requirement" | ||||
|       }, | ||||
|       "self_test_interval": { | ||||
|         "name": "Self-test interval" | ||||
|       }, | ||||
|       "self_test_result": { | ||||
|         "name": "Self-test result" | ||||
|       }, | ||||
| @@ -202,24 +190,39 @@ | ||||
|       "serial_number": { | ||||
|         "name": "Serial number" | ||||
|       }, | ||||
|       "shutdown_delay": { | ||||
|         "name": "Shutdown delay" | ||||
|       }, | ||||
|       "startup_time": { | ||||
|         "name": "Startup time" | ||||
|       }, | ||||
|       "online_status": { | ||||
|         "name": "Status flag" | ||||
|       }, | ||||
|       "status": { | ||||
|         "name": "Status" | ||||
|       }, | ||||
|       "self_test_interval": { | ||||
|         "name": "Self-test interval" | ||||
|       }, | ||||
|       "time_left": { | ||||
|         "name": "Time left" | ||||
|       }, | ||||
|       "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": { | ||||
|         "name": "Mode" | ||||
|       }, | ||||
| @@ -229,11 +232,8 @@ | ||||
|       "version": { | ||||
|         "name": "Daemon version" | ||||
|       }, | ||||
|       "transfer_from_battery": { | ||||
|         "name": "Transfer from battery" | ||||
|       }, | ||||
|       "transfer_to_battery": { | ||||
|         "name": "Transfer to battery" | ||||
|       "wake_delay": { | ||||
|         "name": "Wake delay" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   | ||||
| @@ -17,40 +17,40 @@ | ||||
|     "_appletv-v2._tcp.local.", | ||||
|     "_hscp._tcp.local.", | ||||
|     { | ||||
|       "type": "_airplay._tcp.local.", | ||||
|       "properties": { | ||||
|         "model": "appletv*" | ||||
|       } | ||||
|       }, | ||||
|       "type": "_airplay._tcp.local." | ||||
|     }, | ||||
|     { | ||||
|       "type": "_airplay._tcp.local.", | ||||
|       "properties": { | ||||
|         "model": "audioaccessory*" | ||||
|       } | ||||
|       }, | ||||
|       "type": "_airplay._tcp.local." | ||||
|     }, | ||||
|     { | ||||
|       "type": "_airplay._tcp.local.", | ||||
|       "properties": { | ||||
|         "am": "airport*" | ||||
|       } | ||||
|       }, | ||||
|       "type": "_airplay._tcp.local." | ||||
|     }, | ||||
|     { | ||||
|       "type": "_raop._tcp.local.", | ||||
|       "properties": { | ||||
|         "am": "appletv*" | ||||
|       } | ||||
|       }, | ||||
|       "type": "_raop._tcp.local." | ||||
|     }, | ||||
|     { | ||||
|       "type": "_raop._tcp.local.", | ||||
|       "properties": { | ||||
|         "am": "audioaccessory*" | ||||
|       } | ||||
|       }, | ||||
|       "type": "_raop._tcp.local." | ||||
|     }, | ||||
|     { | ||||
|       "type": "_raop._tcp.local.", | ||||
|       "properties": { | ||||
|         "am": "airport*" | ||||
|       } | ||||
|       }, | ||||
|       "type": "_raop._tcp.local." | ||||
|     } | ||||
|   ] | ||||
| } | ||||
|   | ||||
| @@ -1,74 +1,74 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "flow_title": "{name} ({type})", | ||||
|     "step": { | ||||
|       "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": { | ||||
|           "device_input": "[%key:common::config_flow::data::device%]" | ||||
|         } | ||||
|       }, | ||||
|       "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." | ||||
|       } | ||||
|     "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": { | ||||
|       "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." | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]" | ||||
|     }, | ||||
|     "flow_title": "{name} ({type})", | ||||
|     "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": { | ||||
|         "data": { | ||||
|           "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" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     "step": { | ||||
|       "init": { | ||||
|         "description": "Configure general device settings", | ||||
|         "data": { | ||||
|           "start_off": "Do not turn device on when starting Home Assistant" | ||||
|         } | ||||
|         }, | ||||
|         "description": "Configure general device settings" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,5 +1,11 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "user": { | ||||
|         "data": { | ||||
| @@ -10,12 +16,6 @@ | ||||
|           "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": { | ||||
| @@ -25,96 +25,96 @@ | ||||
|       } | ||||
|     }, | ||||
|     "humidifier": { | ||||
|       "humidifier": { | ||||
|         "name": "[%key:component::humidifier::title%]" | ||||
|       }, | ||||
|       "dehumidifier": { | ||||
|         "name": "[%key:component::humidifier::entity_component::dehumidifier::name%]" | ||||
|       }, | ||||
|       "humidifier": { | ||||
|         "name": "[%key:component::humidifier::title%]" | ||||
|       } | ||||
|     }, | ||||
|     "select": { | ||||
|       "air_cleaning_event": { | ||||
|         "name": "Air cleaning event", | ||||
|         "state": { | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "allergies": "Allergies (24 hour)", | ||||
|           "event_clean": "Event clean (3 hour)", | ||||
|           "allergies": "Allergies (24 hour)" | ||||
|           "off": "[%key:common::state::off%]" | ||||
|         } | ||||
|       }, | ||||
|       "air_cleaning_mode": { | ||||
|         "name": "Air cleaning mode", | ||||
|         "state": { | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "automatic": "Automatic", | ||||
|           "constant_clean": "Constant clean", | ||||
|           "automatic": "Automatic" | ||||
|           "off": "[%key:common::state::off%]" | ||||
|         } | ||||
|       }, | ||||
|       "fresh_air_event": { | ||||
|         "name": "Fresh air event", | ||||
|         "state": { | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "3hour": "3 hour event", | ||||
|           "24hour": "24 hour event" | ||||
|           "24hour": "24 hour event", | ||||
|           "off": "[%key:common::state::off%]" | ||||
|         } | ||||
|       }, | ||||
|       "fresh_air_mode": { | ||||
|         "name": "Fresh air mode", | ||||
|         "state": { | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "automatic": "[%key:component::aprilaire::entity::select::air_cleaning_mode::state::automatic%]" | ||||
|           "automatic": "[%key:component::aprilaire::entity::select::air_cleaning_mode::state::automatic%]", | ||||
|           "off": "[%key:common::state::off%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "sensor": { | ||||
|       "indoor_humidity_controlling_sensor": { | ||||
|         "name": "Indoor humidity controlling sensor" | ||||
|       }, | ||||
|       "outdoor_humidity_controlling_sensor": { | ||||
|         "name": "Outdoor humidity controlling sensor" | ||||
|       }, | ||||
|       "indoor_temperature_controlling_sensor": { | ||||
|         "name": "Indoor temperature controlling sensor" | ||||
|       }, | ||||
|       "outdoor_temperature_controlling_sensor": { | ||||
|         "name": "Outdoor temperature controlling sensor" | ||||
|       "air_cleaning_status": { | ||||
|         "name": "Air cleaning status", | ||||
|         "state": { | ||||
|           "idle": "[%key:common::state::idle%]", | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "on": "[%key:common::state::on%]" | ||||
|         } | ||||
|       }, | ||||
|       "dehumidification_status": { | ||||
|         "name": "Dehumidification status", | ||||
|         "state": { | ||||
|           "idle": "[%key:common::state::idle%]", | ||||
|           "on": "[%key:common::state::on%]", | ||||
|           "off": "[%key:common::state::off%]" | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "on": "[%key:common::state::on%]" | ||||
|         } | ||||
|       }, | ||||
|       "fan_status": { | ||||
|         "name": "Fan status", | ||||
|         "state": { | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "on": "[%key:common::state::on%]" | ||||
|         } | ||||
|       }, | ||||
|       "humidification_status": { | ||||
|         "name": "Humidification status", | ||||
|         "state": { | ||||
|           "idle": "[%key:common::state::idle%]", | ||||
|           "on": "[%key:common::state::on%]", | ||||
|           "off": "[%key:common::state::off%]" | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "on": "[%key:common::state::on%]" | ||||
|         } | ||||
|       }, | ||||
|       "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": { | ||||
|         "name": "Ventilation status", | ||||
|         "state": { | ||||
|           "idle": "[%key:common::state::idle%]", | ||||
|           "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%]" | ||||
|           "off": "[%key:common::state::off%]", | ||||
|           "on": "[%key:common::state::on%]" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   | ||||
| @@ -1,5 +1,11 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
| @@ -10,39 +16,29 @@ | ||||
|           "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": { | ||||
|     "binary_sensor": { | ||||
|       "off_grid_status": { | ||||
|         "name": "Off-grid status" | ||||
|       }, | ||||
|       "dc_1_short_circuit_error_status": { | ||||
|         "name": "DC 1 short circuit error status" | ||||
|       }, | ||||
|       "dc_2_short_circuit_error_status": { | ||||
|         "name": "DC 2 short circuit error status" | ||||
|       }, | ||||
|       "off_grid_status": { | ||||
|         "name": "Off-grid status" | ||||
|       }, | ||||
|       "output_fault_status": { | ||||
|         "name": "Output fault status" | ||||
|       } | ||||
|     }, | ||||
|     "number": { | ||||
|       "max_output": { | ||||
|         "name": "Max output" | ||||
|       } | ||||
|     }, | ||||
|     "sensor": { | ||||
|       "total_power": { | ||||
|         "name": "Total power" | ||||
|       }, | ||||
|       "total_power_p1": { | ||||
|         "name": "Power of P1" | ||||
|       }, | ||||
|       "total_power_p2": { | ||||
|         "name": "Power of P2" | ||||
|       }, | ||||
|       "lifetime_production": { | ||||
|         "name": "Total lifetime production" | ||||
|       }, | ||||
| @@ -60,11 +56,15 @@ | ||||
|       }, | ||||
|       "today_production_p2": { | ||||
|         "name": "Production of today from P2" | ||||
|       } | ||||
|     }, | ||||
|     "number": { | ||||
|       "max_output": { | ||||
|         "name": "Max output" | ||||
|       }, | ||||
|       "total_power": { | ||||
|         "name": "Total power" | ||||
|       }, | ||||
|       "total_power_p1": { | ||||
|         "name": "Power of P1" | ||||
|       }, | ||||
|       "total_power_p2": { | ||||
|         "name": "Power of P2" | ||||
|       } | ||||
|     }, | ||||
|     "switch": { | ||||
|   | ||||
| @@ -13,9 +13,9 @@ | ||||
|       "wi_fi_strength": { | ||||
|         "default": "mdi:wifi", | ||||
|         "state": { | ||||
|           "high": "mdi:wifi-strength-4", | ||||
|           "low": "mdi:wifi-strength-1", | ||||
|           "medium": "mdi:wifi-strength-2", | ||||
|           "high": "mdi:wifi-strength-4" | ||||
|           "medium": "mdi:wifi-strength-2" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   | ||||
| @@ -1,22 +1,22 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "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%]" | ||||
|         } | ||||
|       } | ||||
|     "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%]", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "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": { | ||||
| @@ -27,21 +27,21 @@ | ||||
|       "salt_left_side_percentage": { | ||||
|         "name": "Salt left side percentage" | ||||
|       }, | ||||
|       "salt_right_side_percentage": { | ||||
|         "name": "Salt right side percentage" | ||||
|       }, | ||||
|       "salt_left_side_time_remaining": { | ||||
|         "name": "Salt left side time remaining" | ||||
|       }, | ||||
|       "salt_right_side_percentage": { | ||||
|         "name": "Salt right side percentage" | ||||
|       }, | ||||
|       "salt_right_side_time_remaining": { | ||||
|         "name": "Salt right side time remaining" | ||||
|       }, | ||||
|       "wi_fi_strength": { | ||||
|         "name": "Wi-Fi strength", | ||||
|         "state": { | ||||
|           "high": "[%key:common::state::high%]", | ||||
|           "low": "[%key:common::state::low%]", | ||||
|           "medium": "[%key:common::state::medium%]", | ||||
|           "high": "[%key:common::state::high%]" | ||||
|           "medium": "[%key:common::state::medium%]" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| { | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "radiation_total": { | ||||
|       "radiation_rate": { | ||||
|         "default": "mdi:radioactive" | ||||
|       }, | ||||
|       "radiation_rate": { | ||||
|       "radiation_total": { | ||||
|         "default": "mdi:radioactive" | ||||
|       }, | ||||
|       "radon_concentration": { | ||||
|   | ||||
| @@ -3,14 +3,14 @@ | ||||
|   "name": "Aranet", | ||||
|   "bluetooth": [ | ||||
|     { | ||||
|       "connectable": false, | ||||
|       "manufacturer_id": 1794, | ||||
|       "service_uuid": "f0cd1400-95da-4f4b-9ac8-aa55d312af0c", | ||||
|       "connectable": false | ||||
|       "service_uuid": "f0cd1400-95da-4f4b-9ac8-aa55d312af0c" | ||||
|     }, | ||||
|     { | ||||
|       "connectable": false, | ||||
|       "manufacturer_id": 1794, | ||||
|       "service_uuid": "0000fce0-0000-1000-8000-00805f9b34fb", | ||||
|       "connectable": false | ||||
|       "service_uuid": "0000fce0-0000-1000-8000-00805f9b34fb" | ||||
|     } | ||||
|   ], | ||||
|   "codeowners": ["@aschmitz", "@thecode", "@anrijs"], | ||||
|   | ||||
| @@ -1,25 +1,25 @@ | ||||
| { | ||||
|   "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": { | ||||
|       "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.", | ||||
|       "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." | ||||
|     }, | ||||
|     "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": { | ||||
| @@ -28,8 +28,8 @@ | ||||
|         "state": { | ||||
|           "error": "[%key:common::state::error%]", | ||||
|           "green": "Green", | ||||
|           "yellow": "Yellow", | ||||
|           "red": "Red" | ||||
|           "red": "Red", | ||||
|           "yellow": "Yellow" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   | ||||
| @@ -1,19 +1,19 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "description": "Set up your Arve device", | ||||
|         "data": { | ||||
|           "access_token": "Arve token", | ||||
|           "client_secret": "Arve customer token" | ||||
|         } | ||||
|       } | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "access_token": "Arve token", | ||||
|           "client_secret": "Arve customer token" | ||||
|         }, | ||||
|         "description": "Set up your Arve device" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
|   | ||||
| @@ -1,28 +1,28 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "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%]" | ||||
|         } | ||||
|       } | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_account%]", | ||||
|       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]", | ||||
|       "unique_id_mismatch": "The user identifier does not match the previous identifier" | ||||
|     }, | ||||
|     "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%]", | ||||
|       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]", | ||||
|       "unique_id_mismatch": "The user identifier does not match the previous identifier" | ||||
|     "step": { | ||||
|       "reauth_confirm": { | ||||
|         "data": { | ||||
|           "email": "[%key:common::config_flow::data::email%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         } | ||||
|       }, | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "email": "[%key:common::config_flow::data::email%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
|   | ||||
| @@ -15,8 +15,8 @@ | ||||
|       "vad_sensitivity": { | ||||
|         "name": "Finished speaking detection", | ||||
|         "state": { | ||||
|           "default": "Default", | ||||
|           "aggressive": "Aggressive", | ||||
|           "default": "Default", | ||||
|           "relaxed": "Relaxed" | ||||
|         } | ||||
|       } | ||||
| @@ -24,14 +24,14 @@ | ||||
|   }, | ||||
|   "issues": { | ||||
|     "assist_in_progress_deprecated": { | ||||
|       "title": "{integration_name} in progress binary sensors are deprecated", | ||||
|       "fix_flow": { | ||||
|         "step": { | ||||
|           "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." | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "title": "{integration_name} in progress binary sensors are deprecated" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -8,11 +8,11 @@ | ||||
|     "announce": { | ||||
|       "service": "mdi:bullhorn" | ||||
|     }, | ||||
|     "start_conversation": { | ||||
|       "service": "mdi:forum" | ||||
|     }, | ||||
|     "ask_question": { | ||||
|       "service": "mdi:microphone-question" | ||||
|     }, | ||||
|     "start_conversation": { | ||||
|       "service": "mdi:forum" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -6,5 +6,5 @@ | ||||
|   "documentation": "https://www.home-assistant.io/integrations/assist_satellite", | ||||
|   "integration_type": "entity", | ||||
|   "quality_scale": "internal", | ||||
|   "requirements": ["hassil==3.2.0"] | ||||
|   "requirements": ["hassil==3.4.0"] | ||||
| } | ||||
|   | ||||
| @@ -1,93 +1,12 @@ | ||||
| { | ||||
|   "title": "Assist satellite", | ||||
|   "entity_component": { | ||||
|     "_": { | ||||
|       "name": "Assist satellite", | ||||
|       "state": { | ||||
|         "idle": "[%key:common::state::idle%]", | ||||
|         "listening": "Listening", | ||||
|         "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." | ||||
|         } | ||||
|         "processing": "Processing", | ||||
|         "responding": "Responding" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| @@ -98,5 +17,86 @@ | ||||
|         "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" | ||||
| } | ||||
|   | ||||
| @@ -1,20 +1,23 @@ | ||||
| { | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "cpu_core_usage": { | ||||
|         "default": "mdi:cpu-32-bit" | ||||
|       }, | ||||
|       "cpu_usage": { | ||||
|         "default": "mdi:cpu-32-bit" | ||||
|       }, | ||||
|       "devices_connected": { | ||||
|         "default": "mdi:router-network" | ||||
|       }, | ||||
|       "download_speed": { | ||||
|         "default": "mdi:download-network" | ||||
|       }, | ||||
|       "upload_speed": { | ||||
|         "default": "mdi:upload-network" | ||||
|       }, | ||||
|       "download": { | ||||
|         "default": "mdi:download" | ||||
|       }, | ||||
|       "upload": { | ||||
|         "default": "mdi:upload" | ||||
|       "download_speed": { | ||||
|         "default": "mdi:download-network" | ||||
|       }, | ||||
|       "load_avg_15m": { | ||||
|         "default": "mdi:cpu-32-bit" | ||||
|       }, | ||||
|       "load_avg_1m": { | ||||
|         "default": "mdi:cpu-32-bit" | ||||
| @@ -22,23 +25,20 @@ | ||||
|       "load_avg_5m": { | ||||
|         "default": "mdi:cpu-32-bit" | ||||
|       }, | ||||
|       "load_avg_15m": { | ||||
|         "default": "mdi:cpu-32-bit" | ||||
|       }, | ||||
|       "cpu_usage": { | ||||
|         "default": "mdi:cpu-32-bit" | ||||
|       }, | ||||
|       "cpu_core_usage": { | ||||
|         "default": "mdi:cpu-32-bit" | ||||
|       "memory_free": { | ||||
|         "default": "mdi:memory" | ||||
|       }, | ||||
|       "memory_usage": { | ||||
|         "default": "mdi:memory" | ||||
|       }, | ||||
|       "memory_free": { | ||||
|         "default": "mdi:memory" | ||||
|       }, | ||||
|       "memory_used": { | ||||
|         "default": "mdi:memory" | ||||
|       }, | ||||
|       "upload": { | ||||
|         "default": "mdi:upload" | ||||
|       }, | ||||
|       "upload_speed": { | ||||
|         "default": "mdi:upload-network" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,26 +1,8 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "description": "Set required parameter to connect to your router", | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "username": "[%key:common::config_flow::data::username%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]", | ||||
|           "ssh_key": "Path to your SSH key file (instead of password)", | ||||
|           "protocol": "Communication protocol to use", | ||||
|           "port": "Port (leave empty for protocol default)" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "The hostname or IP address of your ASUSWRT router." | ||||
|         } | ||||
|       }, | ||||
|       "legacy": { | ||||
|         "description": "Set required parameters to connect to your router", | ||||
|         "data": { | ||||
|           "mode": "Router operating mode" | ||||
|         } | ||||
|       } | ||||
|     "abort": { | ||||
|       "invalid_unique_id": "Impossible to determine a valid unique ID for the device", | ||||
|       "no_unique_id": "A device without a valid unique ID is already configured. Configuration of multiple instances is not possible" | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", | ||||
| @@ -30,40 +12,66 @@ | ||||
|       "ssh_not_file": "SSH key file not found", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "invalid_unique_id": "Impossible to determine a valid unique ID for the device", | ||||
|       "no_unique_id": "A device without a valid unique ID is already configured. Configuration of multiple instances is not possible" | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     "step": { | ||||
|       "init": { | ||||
|       "legacy": { | ||||
|         "data": { | ||||
|           "consider_home": "Seconds to wait before considering a device away", | ||||
|           "track_unknown": "Track unknown / unnamed devices", | ||||
|           "interface": "The interface that you want statistics from (e.g. eth0, eth1 etc)", | ||||
|           "dnsmasq": "The location of the dnsmasq.leases file in the router", | ||||
|           "require_ip": "Devices must have IP (for access point mode)" | ||||
|         } | ||||
|           "mode": "Router operating mode" | ||||
|         }, | ||||
|         "description": "Set required parameters to connect to your router" | ||||
|       }, | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]", | ||||
|           "port": "Port (leave empty for protocol default)", | ||||
|           "protocol": "Communication protocol to use", | ||||
|           "ssh_key": "Path to your SSH key file (instead of password)", | ||||
|           "username": "[%key:common::config_flow::data::username%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "The hostname or IP address of your ASUSWRT router." | ||||
|         }, | ||||
|         "description": "Set required parameter to connect to your router" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "5ghz_2_temperature": { | ||||
|         "name": "5GHz temperature (Radio 2)" | ||||
|       }, | ||||
|       "5ghz_temperature": { | ||||
|         "name": "5GHz temperature" | ||||
|       }, | ||||
|       "6ghz_temperature": { | ||||
|         "name": "6GHz temperature" | ||||
|       }, | ||||
|       "24ghz_temperature": { | ||||
|         "name": "2.4GHz temperature" | ||||
|       }, | ||||
|       "cpu_core_usage": { | ||||
|         "name": "CPU core {core_id} usage" | ||||
|       }, | ||||
|       "cpu_temperature": { | ||||
|         "name": "CPU temperature" | ||||
|       }, | ||||
|       "cpu_usage": { | ||||
|         "name": "CPU usage" | ||||
|       }, | ||||
|       "devices_connected": { | ||||
|         "name": "Devices connected" | ||||
|       }, | ||||
|       "download_speed": { | ||||
|         "name": "Download speed" | ||||
|       }, | ||||
|       "upload_speed": { | ||||
|         "name": "Upload speed" | ||||
|       }, | ||||
|       "download": { | ||||
|         "name": "Download" | ||||
|       }, | ||||
|       "upload": { | ||||
|         "name": "Upload" | ||||
|       "download_speed": { | ||||
|         "name": "Download speed" | ||||
|       }, | ||||
|       "last_boot": { | ||||
|         "name": "Last boot" | ||||
|       }, | ||||
|       "load_avg_15m": { | ||||
|         "name": "Average load (15 min)" | ||||
|       }, | ||||
|       "load_avg_1m": { | ||||
|         "name": "Average load (1 min)" | ||||
| @@ -71,52 +79,44 @@ | ||||
|       "load_avg_5m": { | ||||
|         "name": "Average load (5 min)" | ||||
|       }, | ||||
|       "load_avg_15m": { | ||||
|         "name": "Average load (15 min)" | ||||
|       }, | ||||
|       "24ghz_temperature": { | ||||
|         "name": "2.4GHz temperature" | ||||
|       }, | ||||
|       "5ghz_temperature": { | ||||
|         "name": "5GHz temperature" | ||||
|       }, | ||||
|       "cpu_temperature": { | ||||
|         "name": "CPU temperature" | ||||
|       }, | ||||
|       "5ghz_2_temperature": { | ||||
|         "name": "5GHz temperature (Radio 2)" | ||||
|       }, | ||||
|       "6ghz_temperature": { | ||||
|         "name": "6GHz temperature" | ||||
|       }, | ||||
|       "cpu_usage": { | ||||
|         "name": "CPU usage" | ||||
|       }, | ||||
|       "cpu_core_usage": { | ||||
|         "name": "CPU core {core_id} usage" | ||||
|       "memory_free": { | ||||
|         "name": "Memory free" | ||||
|       }, | ||||
|       "memory_usage": { | ||||
|         "name": "Memory usage" | ||||
|       }, | ||||
|       "memory_free": { | ||||
|         "name": "Memory free" | ||||
|       }, | ||||
|       "memory_used": { | ||||
|         "name": "Memory used" | ||||
|       }, | ||||
|       "last_boot": { | ||||
|         "name": "Last boot" | ||||
|       "upload": { | ||||
|         "name": "Upload" | ||||
|       }, | ||||
|       "upload_speed": { | ||||
|         "name": "Upload speed" | ||||
|       }, | ||||
|       "uptime": { | ||||
|         "name": "Uptime" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     "step": { | ||||
|       "init": { | ||||
|         "data": { | ||||
|           "consider_home": "Seconds to wait before considering a device away", | ||||
|           "dnsmasq": "The location of the dnsmasq.leases file in the router", | ||||
|           "interface": "The interface that you want statistics from (e.g. eth0, eth1 etc)", | ||||
|           "require_ip": "Devices must have IP (for access point mode)", | ||||
|           "track_unknown": "Track unknown / unnamed devices" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "selector": { | ||||
|     "protocols": { | ||||
|       "options": { | ||||
|         "https": "HTTPS", | ||||
|         "http": "HTTP", | ||||
|         "https": "HTTPS", | ||||
|         "ssh": "SSH", | ||||
|         "telnet": "Telnet" | ||||
|       } | ||||
|   | ||||
| @@ -1,23 +1,23 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", | ||||
|       "unauthorized": "Pairing denied, check device for auth request" | ||||
|     }, | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "description": "Connect to the device", | ||||
|         "data": { | ||||
|           "host": "[%key:common::config_flow::data::host%]", | ||||
|           "port": "[%key:common::config_flow::data::port%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "host": "The hostname or IP address of the Atag device." | ||||
|         } | ||||
|         }, | ||||
|         "description": "Connect to the device" | ||||
|       } | ||||
|     }, | ||||
|     "error": { | ||||
|       "unauthorized": "Pairing denied, check device for auth request", | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,39 +1,33 @@ | ||||
| { | ||||
|   "issues": { | ||||
|     "yale_brand_migration": { | ||||
|       "title": "Yale Home has a new integration", | ||||
|       "description": "Add the [Yale integration]({migrate_url}), and remove the August integration as soon as possible to avoid an interruption in service. The Yale Home brand will stop working with the August integration soon and will be removed in a future release." | ||||
|     } | ||||
|   }, | ||||
|   "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%]", | ||||
|       "missing_configuration": "[%key:common::config_flow::abort::oauth2_missing_configuration%]", | ||||
|       "missing_credentials": "[%key:common::config_flow::abort::oauth2_missing_credentials%]", | ||||
|       "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_invalid_user": "Reauthenticate must use the same account.", | ||||
|       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]", | ||||
|       "user_rejected_authorize": "[%key:common::config_flow::abort::oauth2_user_rejected_authorize%]" | ||||
|     }, | ||||
|     "create_entry": { | ||||
|       "default": "[%key:common::config_flow::create_entry::authenticated%]" | ||||
|     }, | ||||
|     "step": { | ||||
|       "pick_implementation": { | ||||
|         "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", | ||||
|         "data": { | ||||
|           "implementation": "[%key:common::config_flow::data::implementation%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "implementation": "[%key:common::config_flow::description::implementation%]" | ||||
|         } | ||||
|         }, | ||||
|         "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" | ||||
|       } | ||||
|     }, | ||||
|     "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%]", | ||||
|       "missing_configuration": "[%key:common::config_flow::abort::oauth2_missing_configuration%]", | ||||
|       "missing_credentials": "[%key:common::config_flow::abort::oauth2_missing_credentials%]", | ||||
|       "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%]", | ||||
|       "oauth_timeout": "[%key:common::config_flow::abort::oauth2_timeout%]", | ||||
|       "oauth_unauthorized": "[%key:common::config_flow::abort::oauth2_unauthorized%]", | ||||
|       "oauth_failed": "[%key:common::config_flow::abort::oauth2_failed%]", | ||||
|       "reauth_invalid_user": "Reauthenticate must use the same account." | ||||
|     }, | ||||
|     "create_entry": { | ||||
|       "default": "[%key:common::config_flow::create_entry::authenticated%]" | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
| @@ -55,11 +49,6 @@ | ||||
|         "name": "[%key:component::camera::title%]" | ||||
|       } | ||||
|     }, | ||||
|     "sensor": { | ||||
|       "operator": { | ||||
|         "name": "Operator" | ||||
|       } | ||||
|     }, | ||||
|     "event": { | ||||
|       "doorbell": { | ||||
|         "state_attributes": { | ||||
| @@ -79,6 +68,17 @@ | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "sensor": { | ||||
|       "operator": { | ||||
|         "name": "Operator" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "issues": { | ||||
|     "yale_brand_migration": { | ||||
|       "description": "Add the [Yale integration]({migrate_url}), and remove the August integration as soon as possible to avoid an interruption in service. The Yale Home brand will stop working with the August integration soon and will be removed in a future release.", | ||||
|       "title": "Yale Home has a new integration" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,28 +1,18 @@ | ||||
| { | ||||
|   "title": "NOAA Aurora Sensor", | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "name": "[%key:common::config_flow::data::name%]", | ||||
|           "longitude": "[%key:common::config_flow::data::longitude%]", | ||||
|           "latitude": "[%key:common::config_flow::data::latitude%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_service%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]" | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     }, | ||||
|     "step": { | ||||
|       "init": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "forecast_threshold": "Threshold (%)" | ||||
|           "latitude": "[%key:common::config_flow::data::latitude%]", | ||||
|           "longitude": "[%key:common::config_flow::data::longitude%]", | ||||
|           "name": "[%key:common::config_flow::data::name%]" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| @@ -38,5 +28,15 @@ | ||||
|         "name": "Visibility" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }, | ||||
|   "options": { | ||||
|     "step": { | ||||
|       "init": { | ||||
|         "data": { | ||||
|           "forecast_threshold": "Threshold (%)" | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "title": "NOAA Aurora Sensor" | ||||
| } | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| { | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "r_iso": { | ||||
|         "default": "mdi:omega" | ||||
|       }, | ||||
|       "alarm": { | ||||
|         "default": "mdi:alert-octagon" | ||||
|       }, | ||||
|       "r_iso": { | ||||
|         "default": "mdi:omega" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,37 +1,34 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "description": "The inverter must be connected via an RS485 adaptor, please select serial port and the inverter's address as configured on the LCD panel", | ||||
|         "data": { | ||||
|           "port": "RS485 or USB-RS485 adaptor port", | ||||
|           "address": "Inverter address" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "Unable to connect, please check serial port, address, electrical connection and that inverter is on (in daylight)", | ||||
|       "invalid_serial_port": "Serial port is not a valid device or could not be opened", | ||||
|       "cannot_open_serial_port": "Cannot open serial port, please check and try again" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_device%]", | ||||
|       "no_serial_ports": "No com ports found. The integration needs a valid RS485 device to communicate." | ||||
|     }, | ||||
|     "error": { | ||||
|       "cannot_connect": "Unable to connect, please check serial port, address, electrical connection and that inverter is on (in daylight)", | ||||
|       "cannot_open_serial_port": "Cannot open serial port, please check and try again", | ||||
|       "invalid_serial_port": "Serial port is not a valid device or could not be opened" | ||||
|     }, | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "address": "Inverter address", | ||||
|           "port": "RS485 or USB-RS485 adaptor port" | ||||
|         }, | ||||
|         "description": "The inverter must be connected via an RS485 adaptor, please select serial port and the inverter's address as configured on the LCD panel" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "grid_voltage": { | ||||
|         "name": "Grid voltage" | ||||
|       "alarm": { | ||||
|         "name": "Alarm status" | ||||
|       }, | ||||
|       "grid_current": { | ||||
|         "name": "Grid current" | ||||
|       }, | ||||
|       "alarm": { | ||||
|         "name": "Alarm status" | ||||
|       }, | ||||
|       "power_output": { | ||||
|         "name": "Power output" | ||||
|       "grid_voltage": { | ||||
|         "name": "Grid voltage" | ||||
|       }, | ||||
|       "i_leak_dcdc": { | ||||
|         "name": "DC-DC leak current" | ||||
| @@ -39,11 +36,14 @@ | ||||
|       "i_leak_inverter": { | ||||
|         "name": "Inverter leak current" | ||||
|       }, | ||||
|       "total_energy": { | ||||
|         "name": "Total energy" | ||||
|       "power_output": { | ||||
|         "name": "Power output" | ||||
|       }, | ||||
|       "r_iso": { | ||||
|         "name": "Isolation resistance" | ||||
|       }, | ||||
|       "total_energy": { | ||||
|         "name": "Total energy" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,38 +1,38 @@ | ||||
| { | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "billing_cycle_length": { | ||||
|         "default": "mdi:calendar-range" | ||||
|       }, | ||||
|       "billing_cycle_remaining": { | ||||
|         "default": "mdi:calendar-clock" | ||||
|       }, | ||||
|       "data_used": { | ||||
|         "default": "mdi:network" | ||||
|       }, | ||||
|       "downloaded": { | ||||
|         "default": "mdi:download-network" | ||||
|       }, | ||||
|       "uploaded": { | ||||
|         "default": "mdi:upload-network" | ||||
|       }, | ||||
|       "national_calls": { | ||||
|         "default": "mdi:phone" | ||||
|       "international_calls": { | ||||
|         "default": "mdi:phone-plus" | ||||
|       }, | ||||
|       "mobile_calls": { | ||||
|         "default": "mdi:phone" | ||||
|       }, | ||||
|       "international_calls": { | ||||
|         "default": "mdi:phone-plus" | ||||
|       }, | ||||
|       "sms_sent": { | ||||
|         "default": "mdi:message-processing" | ||||
|       }, | ||||
|       "voicemail_calls": { | ||||
|       "national_calls": { | ||||
|         "default": "mdi:phone" | ||||
|       }, | ||||
|       "other_calls": { | ||||
|         "default": "mdi:phone" | ||||
|       }, | ||||
|       "billing_cycle_length": { | ||||
|         "default": "mdi:calendar-range" | ||||
|       "sms_sent": { | ||||
|         "default": "mdi:message-processing" | ||||
|       }, | ||||
|       "billing_cycle_remaining": { | ||||
|         "default": "mdi:calendar-clock" | ||||
|       "uploaded": { | ||||
|         "default": "mdi:upload-network" | ||||
|       }, | ||||
|       "voicemail_calls": { | ||||
|         "default": "mdi:phone" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,86 +1,86 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "step": { | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "username": "[%key:common::config_flow::data::username%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         } | ||||
|       }, | ||||
|       "service": { | ||||
|         "title": "Select Services", | ||||
|         "data": { | ||||
|           "services": "Services" | ||||
|         } | ||||
|       }, | ||||
|       "reauth_confirm": { | ||||
|         "title": "[%key:common::config_flow::title::reauth%]", | ||||
|         "description": "Update password for {username}", | ||||
|         "data": { | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "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_account%]", | ||||
|       "no_services_found": "No services were found for this account", | ||||
|       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     }, | ||||
|     "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": { | ||||
|       "init": { | ||||
|         "title": "[%key:component::aussie_broadband::config::step::service::title%]", | ||||
|       "reauth_confirm": { | ||||
|         "data": { | ||||
|           "services": "[%key:component::aussie_broadband::config::step::service::data::services%]" | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         }, | ||||
|         "description": "Update password for {username}", | ||||
|         "title": "[%key:common::config_flow::title::reauth%]" | ||||
|       }, | ||||
|       "service": { | ||||
|         "data": { | ||||
|           "services": "Services" | ||||
|         }, | ||||
|         "title": "Select Services" | ||||
|       }, | ||||
|       "user": { | ||||
|         "data": { | ||||
|           "password": "[%key:common::config_flow::data::password%]", | ||||
|           "username": "[%key:common::config_flow::data::username%]" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "abort": { | ||||
|       "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%]" | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "billing_cycle_length": { | ||||
|         "name": "Billing cycle length" | ||||
|       }, | ||||
|       "billing_cycle_remaining": { | ||||
|         "name": "Billing cycle remaining" | ||||
|       }, | ||||
|       "data_used": { | ||||
|         "name": "Data used" | ||||
|       }, | ||||
|       "downloaded": { | ||||
|         "name": "Downloaded" | ||||
|       }, | ||||
|       "uploaded": { | ||||
|         "name": "Uploaded" | ||||
|       }, | ||||
|       "national_calls": { | ||||
|         "name": "National calls" | ||||
|       "international_calls": { | ||||
|         "name": "International calls" | ||||
|       }, | ||||
|       "mobile_calls": { | ||||
|         "name": "Mobile calls" | ||||
|       }, | ||||
|       "international_calls": { | ||||
|         "name": "International calls" | ||||
|       }, | ||||
|       "sms_sent": { | ||||
|         "name": "SMS sent" | ||||
|       }, | ||||
|       "voicemail_calls": { | ||||
|         "name": "Voicemail calls" | ||||
|       "national_calls": { | ||||
|         "name": "National calls" | ||||
|       }, | ||||
|       "other_calls": { | ||||
|         "name": "Other calls" | ||||
|       }, | ||||
|       "billing_cycle_length": { | ||||
|         "name": "Billing cycle length" | ||||
|       "sms_sent": { | ||||
|         "name": "SMS sent" | ||||
|       }, | ||||
|       "billing_cycle_remaining": { | ||||
|         "name": "Billing cycle remaining" | ||||
|       "uploaded": { | ||||
|         "name": "Uploaded" | ||||
|       }, | ||||
|       "voicemail_calls": { | ||||
|         "name": "Voicemail calls" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "options": { | ||||
|     "abort": { | ||||
|       "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": { | ||||
|       "init": { | ||||
|         "data": { | ||||
|           "services": "[%key:component::aussie_broadband::config::step::service::data::services%]" | ||||
|         }, | ||||
|         "title": "[%key:component::aussie_broadband::config::step::service::title%]" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,47 +1,47 @@ | ||||
| { | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "power_production": { | ||||
|         "default": "mdi:flash" | ||||
|       "charged_month": { | ||||
|         "default": "mdi:battery-arrow-up" | ||||
|       }, | ||||
|       "energy_production_today": { | ||||
|         "default": "mdi:solar-power" | ||||
|       "charged_today": { | ||||
|         "default": "mdi:battery-arrow-up" | ||||
|       }, | ||||
|       "energy_production_month": { | ||||
|         "default": "mdi:solar-power" | ||||
|       }, | ||||
|       "energy_production_total": { | ||||
|         "default": "mdi:solar-power" | ||||
|       }, | ||||
|       "out_ac_power": { | ||||
|         "default": "mdi:flash" | ||||
|       }, | ||||
|       "out_ac_energy_total": { | ||||
|         "default": "mdi:solar-power" | ||||
|       }, | ||||
|       "flow_now": { | ||||
|         "default": "mdi:flash" | ||||
|       }, | ||||
|       "state_of_charge": { | ||||
|         "default": "mdi:home-battery" | ||||
|       }, | ||||
|       "discharged_today": { | ||||
|         "default": "mdi:battery-arrow-down" | ||||
|       "charged_total": { | ||||
|         "default": "mdi:battery-arrow-up" | ||||
|       }, | ||||
|       "discharged_month": { | ||||
|         "default": "mdi:battery-arrow-down" | ||||
|       }, | ||||
|       "discharged_today": { | ||||
|         "default": "mdi:battery-arrow-down" | ||||
|       }, | ||||
|       "discharged_total": { | ||||
|         "default": "mdi:battery-arrow-down" | ||||
|       }, | ||||
|       "charged_today": { | ||||
|         "default": "mdi:battery-arrow-up" | ||||
|       "energy_production_month": { | ||||
|         "default": "mdi:solar-power" | ||||
|       }, | ||||
|       "charged_month": { | ||||
|         "default": "mdi:battery-arrow-up" | ||||
|       "energy_production_today": { | ||||
|         "default": "mdi:solar-power" | ||||
|       }, | ||||
|       "charged_total": { | ||||
|         "default": "mdi:battery-arrow-up" | ||||
|       "energy_production_total": { | ||||
|         "default": "mdi:solar-power" | ||||
|       }, | ||||
|       "flow_now": { | ||||
|         "default": "mdi:flash" | ||||
|       }, | ||||
|       "out_ac_energy_total": { | ||||
|         "default": "mdi:solar-power" | ||||
|       }, | ||||
|       "out_ac_power": { | ||||
|         "default": "mdi:flash" | ||||
|       }, | ||||
|       "power_production": { | ||||
|         "default": "mdi:flash" | ||||
|       }, | ||||
|       "state_of_charge": { | ||||
|         "default": "mdi:home-battery" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,8 +1,25 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_account%]", | ||||
|       "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%]" | ||||
|     }, | ||||
|     "step": { | ||||
|       "reauth_confirm": { | ||||
|         "data": { | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "password": "[%key:component::autarco::config::step::user::data_description::password%]" | ||||
|         }, | ||||
|         "description": "The password for {email} is no longer valid.", | ||||
|         "title": "[%key:common::config_flow::title::reauth%]" | ||||
|       }, | ||||
|       "user": { | ||||
|         "description": "Connect to your Autarco account, to get information about your sites.", | ||||
|         "data": { | ||||
|           "email": "[%key:common::config_flow::data::email%]", | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
| @@ -10,71 +27,54 @@ | ||||
|         "data_description": { | ||||
|           "email": "The email address of your Autarco account.", | ||||
|           "password": "The password of your Autarco account." | ||||
|         } | ||||
|       }, | ||||
|       "reauth_confirm": { | ||||
|         "title": "[%key:common::config_flow::title::reauth%]", | ||||
|         "description": "The password for {email} is no longer valid.", | ||||
|         "data": { | ||||
|           "password": "[%key:common::config_flow::data::password%]" | ||||
|         }, | ||||
|         "data_description": { | ||||
|           "password": "[%key:component::autarco::config::step::user::data_description::password%]" | ||||
|         } | ||||
|         "description": "Connect to your Autarco account, to get information about your sites." | ||||
|       } | ||||
|     }, | ||||
|     "error": { | ||||
|       "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", | ||||
|       "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured": "[%key:common::config_flow::abort::already_configured_account%]", | ||||
|       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "flow_now": { | ||||
|         "name": "Flow now" | ||||
|       }, | ||||
|       "state_of_charge": { | ||||
|         "name": "State of charge" | ||||
|       }, | ||||
|       "discharged_today": { | ||||
|         "name": "Discharged today" | ||||
|       }, | ||||
|       "discharged_month": { | ||||
|         "name": "Discharged month" | ||||
|       }, | ||||
|       "discharged_total": { | ||||
|         "name": "Discharged total" | ||||
|       "charged_month": { | ||||
|         "name": "Charged month" | ||||
|       }, | ||||
|       "charged_today": { | ||||
|         "name": "Charged today" | ||||
|       }, | ||||
|       "charged_month": { | ||||
|         "name": "Charged month" | ||||
|       }, | ||||
|       "charged_total": { | ||||
|         "name": "Charged total" | ||||
|       }, | ||||
|       "power_production": { | ||||
|         "name": "Power production" | ||||
|       "discharged_month": { | ||||
|         "name": "Discharged month" | ||||
|       }, | ||||
|       "energy_production_today": { | ||||
|         "name": "Energy production today" | ||||
|       "discharged_today": { | ||||
|         "name": "Discharged today" | ||||
|       }, | ||||
|       "discharged_total": { | ||||
|         "name": "Discharged total" | ||||
|       }, | ||||
|       "energy_production_month": { | ||||
|         "name": "Energy production month" | ||||
|       }, | ||||
|       "energy_production_today": { | ||||
|         "name": "Energy production today" | ||||
|       }, | ||||
|       "energy_production_total": { | ||||
|         "name": "Energy production total" | ||||
|       }, | ||||
|       "flow_now": { | ||||
|         "name": "Flow now" | ||||
|       }, | ||||
|       "out_ac_energy_total": { | ||||
|         "name": "Energy AC output total" | ||||
|       }, | ||||
|       "out_ac_power": { | ||||
|         "name": "Power AC output" | ||||
|       }, | ||||
|       "out_ac_energy_total": { | ||||
|         "name": "Energy AC output total" | ||||
|       "power_production": { | ||||
|         "name": "Power production" | ||||
|       }, | ||||
|       "state_of_charge": { | ||||
|         "name": "State of charge" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,52 +1,52 @@ | ||||
| { | ||||
|   "mfa_setup": { | ||||
|     "totp": { | ||||
|       "title": "TOTP", | ||||
|       "step": { | ||||
|         "init": { | ||||
|           "title": "Set up two-factor authentication using TOTP", | ||||
|           "description": "To activate two-factor authentication using time-based one-time passwords, scan the QR code with your authentication app. If you don't have one, we recommend either [Google Authenticator]({google_authenticator_url}) or [Authy]({authy_url}).\n\n{qr_code}\n\nAfter scanning the code, enter the six-digit code from your app to verify the setup. If you have problems scanning the QR code, do a manual setup with code **`{code}`**." | ||||
|         } | ||||
|       }, | ||||
|       "error": { | ||||
|         "invalid_code": "Invalid code, please try again. If you get this error consistently, please make sure the clock of your Home Assistant system is accurate." | ||||
|       } | ||||
|     }, | ||||
|     "notify": { | ||||
|       "title": "Notify one-time password", | ||||
|       "step": { | ||||
|         "init": { | ||||
|           "title": "Set up one-time password delivered by notify component", | ||||
|           "description": "Please select one of the notification services:" | ||||
|         }, | ||||
|         "setup": { | ||||
|           "title": "Verify setup", | ||||
|           "description": "A one-time password has been sent via **notify.{notify_service}**. Please enter it below:" | ||||
|         } | ||||
|       }, | ||||
|       "abort": { | ||||
|         "no_available_service": "No notification services available." | ||||
|       }, | ||||
|       "error": { | ||||
|         "invalid_code": "Invalid code, please try again." | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "exceptions": { | ||||
|     "user_not_found": { | ||||
|       "message": "User not found" | ||||
|     }, | ||||
|     "username_already_exists": { | ||||
|       "message": "Username \"{username}\" already exists" | ||||
|     }, | ||||
|     "username_not_normalized": { | ||||
|       "message": "Username \"{new_username}\" is not normalized. Please make sure the username is lowercase and does not contain any whitespace." | ||||
|     }, | ||||
|     "user_not_found": { | ||||
|       "message": "User not found" | ||||
|     } | ||||
|   }, | ||||
|   "issues": { | ||||
|     "homeassistant_provider_not_normalized_usernames": { | ||||
|       "title": "Not normalized usernames detected", | ||||
|       "description": "The Home Assistant auth provider is running in legacy mode because we detected not normalized usernames. The legacy mode is deprecated and will be removed. Please change the following usernames:\n\n{usernames}\n\nNormalized usernames are case folded (lower case) and stripped of whitespaces." | ||||
|       "description": "The Home Assistant auth provider is running in legacy mode because we detected not normalized usernames. The legacy mode is deprecated and will be removed. Please change the following usernames:\n\n{usernames}\n\nNormalized usernames are case folded (lower case) and stripped of whitespaces.", | ||||
|       "title": "Not normalized usernames detected" | ||||
|     } | ||||
|   }, | ||||
|   "mfa_setup": { | ||||
|     "notify": { | ||||
|       "abort": { | ||||
|         "no_available_service": "No notification services available." | ||||
|       }, | ||||
|       "error": { | ||||
|         "invalid_code": "Invalid code, please try again." | ||||
|       }, | ||||
|       "step": { | ||||
|         "init": { | ||||
|           "description": "Please select one of the notification services:", | ||||
|           "title": "Set up one-time password delivered by notify component" | ||||
|         }, | ||||
|         "setup": { | ||||
|           "description": "A one-time password has been sent via **notify.{notify_service}**. Please enter it below:", | ||||
|           "title": "Verify setup" | ||||
|         } | ||||
|       }, | ||||
|       "title": "Notify one-time password" | ||||
|     }, | ||||
|     "totp": { | ||||
|       "error": { | ||||
|         "invalid_code": "Invalid code, please try again. If you get this error consistently, please make sure the clock of your Home Assistant system is accurate." | ||||
|       }, | ||||
|       "step": { | ||||
|         "init": { | ||||
|           "description": "To activate two-factor authentication using time-based one-time passwords, scan the QR code with your authentication app. If you don't have one, we recommend either [Google Authenticator]({google_authenticator_url}) or [Authy]({authy_url}).\n\n{qr_code}\n\nAfter scanning the code, enter the six-digit code from your app to verify the setup. If you have problems scanning the QR code, do a manual setup with code **`{code}`**.", | ||||
|           "title": "Set up two-factor authentication using TOTP" | ||||
|         } | ||||
|       }, | ||||
|       "title": "TOTP" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -9,11 +9,8 @@ | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|     "turn_on": { | ||||
|       "service": "mdi:robot" | ||||
|     }, | ||||
|     "turn_off": { | ||||
|       "service": "mdi:robot-off" | ||||
|     "reload": { | ||||
|       "service": "mdi:reload" | ||||
|     }, | ||||
|     "toggle": { | ||||
|       "service": "mdi:robot" | ||||
| @@ -21,8 +18,11 @@ | ||||
|     "trigger": { | ||||
|       "service": "mdi:robot" | ||||
|     }, | ||||
|     "reload": { | ||||
|       "service": "mdi:reload" | ||||
|     "turn_off": { | ||||
|       "service": "mdi:robot-off" | ||||
|     }, | ||||
|     "turn_on": { | ||||
|       "service": "mdi:robot" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -2,7 +2,6 @@ | ||||
|   "common": { | ||||
|     "validation_failed_title": "Automation {name} failed to set up" | ||||
|   }, | ||||
|   "title": "Automation", | ||||
|   "entity_component": { | ||||
|     "_": { | ||||
|       "name": "[%key:component::automation::title%]", | ||||
| @@ -37,69 +36,70 @@ | ||||
|   }, | ||||
|   "issues": { | ||||
|     "service_not_found": { | ||||
|       "title": "{name} uses an unknown action", | ||||
|       "fix_flow": { | ||||
|         "step": { | ||||
|           "confirm": { | ||||
|             "title": "[%key:component::automation::issues::service_not_found::title%]", | ||||
|             "description": "The automation \"{name}\" (`{entity_id}`) has an unknown action: `{service}`.\n\nThis error prevents the automation from running correctly. Maybe this action is no longer available, or perhaps a typo caused it.\n\nTo fix this error, [edit the automation]({edit}) and remove this action.\n\nSelect **Submit** below to confirm you have fixed this automation." | ||||
|             "description": "The automation \"{name}\" (`{entity_id}`) has an unknown action: `{service}`.\n\nThis error prevents the automation from running correctly. Maybe this action is no longer available, or perhaps a typo caused it.\n\nTo fix this error, [edit the automation]({edit}) and remove this action.\n\nSelect **Submit** below to confirm you have fixed this automation.", | ||||
|             "title": "[%key:component::automation::issues::service_not_found::title%]" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "title": "{name} uses an unknown action" | ||||
|     }, | ||||
|     "validation_failed_actions": { | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]", | ||||
|       "description": "The automation \"{name}\" (`{entity_id}`) is not active because its actions could not be set up.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration." | ||||
|       "description": "The automation \"{name}\" (`{entity_id}`) is not active because its actions could not be set up.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration.", | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]" | ||||
|     }, | ||||
|     "validation_failed_blueprint": { | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]", | ||||
|       "description": "The blueprinted automation \"{name}\" (`{entity_id}`) failed to set up.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration." | ||||
|       "description": "The blueprinted automation \"{name}\" (`{entity_id}`) failed to set up.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration.", | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]" | ||||
|     }, | ||||
|     "validation_failed_conditions": { | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]", | ||||
|       "description": "The automation \"{name}\" (`{entity_id}`) is not active because its conditions could not be set up.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration." | ||||
|       "description": "The automation \"{name}\" (`{entity_id}`) is not active because its conditions could not be set up.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration.", | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]" | ||||
|     }, | ||||
|     "validation_failed_schema": { | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]", | ||||
|       "description": "The automation \"{name}\" (`{entity_id}`) is not active because the configuration has errors.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration." | ||||
|       "description": "The automation \"{name}\" (`{entity_id}`) is not active because the configuration has errors.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration.", | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]" | ||||
|     }, | ||||
|     "validation_failed_triggers": { | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]", | ||||
|       "description": "The automation \"{name}\" (`{entity_id}`) is not active because its triggers could not be set up.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration." | ||||
|       "description": "The automation \"{name}\" (`{entity_id}`) is not active because its triggers could not be set up.\n\nError:`{error}`.\n\nTo fix this error, [edit the automation]({edit}) to correct it, then save and reload the automation configuration.", | ||||
|       "title": "[%key:component::automation::common::validation_failed_title%]" | ||||
|     } | ||||
|   }, | ||||
|   "services": { | ||||
|     "turn_on": { | ||||
|       "name": "[%key:common::action::turn_on%]", | ||||
|       "description": "Enables an automation." | ||||
|     }, | ||||
|     "turn_off": { | ||||
|       "name": "[%key:common::action::turn_off%]", | ||||
|       "description": "Disables an automation.", | ||||
|       "fields": { | ||||
|         "stop_actions": { | ||||
|           "name": "Stop actions", | ||||
|           "description": "Stops currently running actions." | ||||
|         } | ||||
|       } | ||||
|     "reload": { | ||||
|       "description": "Reloads the automation configuration.", | ||||
|       "name": "[%key:common::action::reload%]" | ||||
|     }, | ||||
|     "toggle": { | ||||
|       "name": "[%key:common::action::toggle%]", | ||||
|       "description": "Toggles (enable / disable) an automation." | ||||
|       "description": "Toggles (enable / disable) an automation.", | ||||
|       "name": "[%key:common::action::toggle%]" | ||||
|     }, | ||||
|     "trigger": { | ||||
|       "name": "Trigger", | ||||
|       "description": "Triggers the actions of an automation.", | ||||
|       "fields": { | ||||
|         "skip_condition": { | ||||
|           "name": "Skip conditions", | ||||
|           "description": "Defines whether or not the conditions will be skipped." | ||||
|           "description": "Defines whether or not the conditions will be skipped.", | ||||
|           "name": "Skip conditions" | ||||
|         } | ||||
|       } | ||||
|       }, | ||||
|       "name": "Trigger" | ||||
|     }, | ||||
|     "reload": { | ||||
|       "name": "[%key:common::action::reload%]", | ||||
|       "description": "Reloads the automation configuration." | ||||
|     "turn_off": { | ||||
|       "description": "Disables an automation.", | ||||
|       "fields": { | ||||
|         "stop_actions": { | ||||
|           "description": "Stops currently running actions.", | ||||
|           "name": "Stop actions" | ||||
|         } | ||||
|       }, | ||||
|       "name": "[%key:common::action::turn_off%]" | ||||
|     }, | ||||
|     "turn_on": { | ||||
|       "description": "Enables an automation.", | ||||
|       "name": "[%key:common::action::turn_on%]" | ||||
|     } | ||||
|   } | ||||
|   }, | ||||
|   "title": "Automation" | ||||
| } | ||||
|   | ||||
| @@ -9,8 +9,8 @@ | ||||
|   "requirements": ["python-awair==0.2.4"], | ||||
|   "zeroconf": [ | ||||
|     { | ||||
|       "type": "_http._tcp.local.", | ||||
|       "name": "awair*" | ||||
|       "name": "awair*", | ||||
|       "type": "_http._tcp.local." | ||||
|     } | ||||
|   ] | ||||
| } | ||||
|   | ||||
| @@ -1,12 +1,29 @@ | ||||
| { | ||||
|   "config": { | ||||
|     "abort": { | ||||
|       "already_configured_account": "[%key:common::config_flow::abort::already_configured_account%]", | ||||
|       "already_configured_device": "[%key:common::config_flow::abort::already_configured_device%]", | ||||
|       "no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]", | ||||
|       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]", | ||||
|       "unreachable": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "error": { | ||||
|       "invalid_access_token": "[%key:common::config_flow::error::invalid_access_token%]", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]", | ||||
|       "unreachable": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "flow_title": "{model} ({device_id})", | ||||
|     "step": { | ||||
|       "cloud": { | ||||
|         "description": "You must register for an Awair developer access token at: {url}", | ||||
|         "data": { | ||||
|           "access_token": "[%key:common::config_flow::data::access_token%]", | ||||
|           "email": "[%key:common::config_flow::data::email%]" | ||||
|         } | ||||
|         }, | ||||
|         "description": "You must register for an Awair developer access token at: {url}" | ||||
|       }, | ||||
|       "discovery_confirm": { | ||||
|         "description": "Do you want to set up {model} ({device_id})?" | ||||
|       }, | ||||
|       "local": { | ||||
|         "description": "Follow [these instructions]({url}) on how to enable the Awair Local API.\n\nSelect **Submit** when done." | ||||
| @@ -18,48 +35,31 @@ | ||||
|         } | ||||
|       }, | ||||
|       "reauth_confirm": { | ||||
|         "description": "Please re-enter your Awair developer access token.", | ||||
|         "data": { | ||||
|           "access_token": "[%key:common::config_flow::data::access_token%]", | ||||
|           "email": "[%key:common::config_flow::data::email%]" | ||||
|         } | ||||
|       }, | ||||
|       "discovery_confirm": { | ||||
|         "description": "Do you want to set up {model} ({device_id})?" | ||||
|         }, | ||||
|         "description": "Please re-enter your Awair developer access token." | ||||
|       }, | ||||
|       "user": { | ||||
|         "description": "Pick local for the best experience. Only use cloud if the device is not connected to the same network as Home Assistant, or if you have a legacy device.", | ||||
|         "menu_options": { | ||||
|           "cloud": "Connect via the cloud", | ||||
|           "local": "Connect locally (preferred)" | ||||
|         }, | ||||
|         "description": "Pick local for the best experience. Only use cloud if the device is not connected to the same network as Home Assistant, or if you have a legacy device." | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "error": { | ||||
|       "invalid_access_token": "[%key:common::config_flow::error::invalid_access_token%]", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]", | ||||
|       "unreachable": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "abort": { | ||||
|       "already_configured_account": "[%key:common::config_flow::abort::already_configured_account%]", | ||||
|       "already_configured_device": "[%key:common::config_flow::abort::already_configured_device%]", | ||||
|       "no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]", | ||||
|       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]", | ||||
|       "unknown": "[%key:common::config_flow::error::unknown%]", | ||||
|       "unreachable": "[%key:common::config_flow::error::cannot_connect%]" | ||||
|     }, | ||||
|     "flow_title": "{model} ({device_id})" | ||||
|     } | ||||
|   }, | ||||
|   "entity": { | ||||
|     "sensor": { | ||||
|       "dew_point": { | ||||
|         "name": "Dew point" | ||||
|       }, | ||||
|       "score": { | ||||
|         "name": "Score" | ||||
|       }, | ||||
|       "sound_level": { | ||||
|         "name": "Sound level" | ||||
|       }, | ||||
|       "dew_point": { | ||||
|         "name": "Dew point" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user