diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 7db182f60dd..1197fec7c97 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -7,8 +7,8 @@ contact_links:
url: https://www.home-assistant.io/help
about: We use GitHub for tracking bugs, check our website for resources on getting help.
- name: Feature Request
- url: https://community.home-assistant.io/c/feature-requests
- about: Please use our Community Forum for doing feature requests.
+ url: https://github.com/orgs/home-assistant/discussions
+ about: Please use this link to request new features or enhancements to existing features.
- name: I'm unsure where to go
url: https://www.home-assistant.io/join-chat
about: If you are unsure where to go, then joining our chat is recommended; Just ask!
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index cbaa7729539..c31e7639a95 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -14,6 +14,16 @@ jobs:
with:
node-version: 20
cache: "npm"
+ - name: Check for .md files and suggest renaming
+ run: |
+ echo "Checking for .md files in source/_integrations..."
+ MD_FILES=$(find source/_integrations -type f -name "*.md")
+ if [ -n "$MD_FILES" ]; then
+ echo "Found the following .md files:"
+ echo "$MD_FILES"
+ echo "⚠️ Please rename these files from .md to .markdown"
+ exit 1
+ fi
- name: Install dependencies
run: npm install
env:
diff --git a/CODEOWNERS b/CODEOWNERS
index 4a9dd190c77..69f8ceef5d9 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -15,7 +15,7 @@ source/_integrations/acaia.markdown @zweckj
source/_integrations/accuweather.markdown @bieniu
source/_integrations/acmeda.markdown @atmurray
source/_integrations/acomax.markdown @starkillerOG
-source/_integrations/adax.markdown @danielhiversen
+source/_integrations/adax.markdown @danielhiversen @lazytarget
source/_integrations/adguard.markdown @frenck
source/_integrations/ads.markdown @mrpasztoradam
source/_integrations/advantage_air.markdown @Bre77
@@ -41,6 +41,7 @@ source/_integrations/alarm_control_panel.template.markdown @home-assistant/core
source/_integrations/alert.markdown @home-assistant/core @frenck
source/_integrations/alexa.markdown @home-assistant/cloud @ochlocracy @jbouwh
source/_integrations/alexa.smart_home.markdown @home-assistant/cloud @ochlocracy @jbouwh
+source/_integrations/amazon_devices.markdown @chemelli74
source/_integrations/amazon_polly.markdown @jschlyter
source/_integrations/amberelectric.markdown @madpilot
source/_integrations/ambient_network.markdown @thomaskistler
@@ -92,6 +93,7 @@ source/_integrations/auth.markdown @home-assistant/core
source/_integrations/automation.markdown @home-assistant/core
source/_integrations/avea.markdown @pattyland
source/_integrations/awair.markdown @ahayworth @danielsjf
+source/_integrations/aws_s3.markdown @tomasbedrich
source/_integrations/axis.markdown @Kane610
source/_integrations/azure_data_explorer.markdown @kaareseras
source/_integrations/azure_devops.markdown @timmo001
@@ -112,7 +114,7 @@ source/_integrations/blebox.markdown @bbx-a @swistakm
source/_integrations/blink.markdown @fronzbot @mkmer
source/_integrations/bliss_automation.markdown @starkillerOG
source/_integrations/bloc_blinds.markdown @starkillerOG
-source/_integrations/blue_current.markdown @Floris272 @gleeuwen
+source/_integrations/blue_current.markdown @gleeuwen @NickKoepr @jtodorova23
source/_integrations/bluemaestro.markdown @bdraco
source/_integrations/blueprint.markdown @home-assistant/core
source/_integrations/bluesound.markdown @thrawnarn @LouisChrist
@@ -177,7 +179,6 @@ source/_integrations/cozytouch.markdown @imicknl
source/_integrations/cpuspeed.markdown @fabaff
source/_integrations/cribl.markdown @Bre77
source/_integrations/crownstone.markdown @Crownstone @RicArch97
-source/_integrations/cups.markdown @fabaff
source/_integrations/dacia.markdown @epenet
source/_integrations/daikin.markdown @fredrike
source/_integrations/date.markdown @home-assistant/core
@@ -269,7 +270,7 @@ source/_integrations/event.markdown @home-assistant/core
source/_integrations/evergy.markdown @tronikos
source/_integrations/evil_genius_labs.markdown @balloob
source/_integrations/evohome.markdown @zxdavb
-source/_integrations/ezviz.markdown @RenierM26 @baqs
+source/_integrations/ezviz.markdown @RenierM26
source/_integrations/faa_delays.markdown @ntilley905
source/_integrations/fan.markdown @home-assistant/core
source/_integrations/fan.template.markdown @home-assistant/core
@@ -414,6 +415,7 @@ source/_integrations/image_upload.markdown @home-assistant/core
source/_integrations/imap.markdown @jbouwh
source/_integrations/imeon_inverter.markdown @Imeon-Energy
source/_integrations/imgw_pib.markdown @bieniu
+source/_integrations/immich.markdown @mib1185
source/_integrations/improv_ble.markdown @emontnemery
source/_integrations/incomfort.markdown @jbouwh
source/_integrations/indianamichiganpower.markdown @tronikos
@@ -454,6 +456,7 @@ source/_integrations/jewish_calendar.markdown @tsvi
source/_integrations/juicenet.markdown @jesserockz
source/_integrations/justnimbus.markdown @kvanzuijlen
source/_integrations/jvc_projector.markdown @SteveEasley @msavazzi
+source/_integrations/kaiser_nienhaus.markdown @starkillerOG
source/_integrations/kaiterra.markdown @Michsior14
source/_integrations/kaleidescape.markdown @SteveEasley
source/_integrations/keba.markdown @dannerph
@@ -647,7 +650,7 @@ source/_integrations/openhome.markdown @bazwilliams
source/_integrations/opensky.markdown @joostlek
source/_integrations/opentherm_gw.markdown @mvn23
source/_integrations/openuv.markdown @bachya
-source/_integrations/openweathermap.markdown @fabaff @freekode @nzapponi
+source/_integrations/openweathermap.markdown @fabaff @freekode @nzapponi @wittypluck
source/_integrations/opnsense.markdown @mtreinish
source/_integrations/opower.markdown @tronikos
source/_integrations/oralb.markdown @bdraco @Lash-L
@@ -662,6 +665,7 @@ source/_integrations/ovo_energy.markdown @timmo001
source/_integrations/p1_monitor.markdown @klaasnicolaas
source/_integrations/palazzetti.markdown @dotvav
source/_integrations/panel_custom.markdown @home-assistant/frontend
+source/_integrations/paperless_ngx.markdown @fvgarrel
source/_integrations/pcs_lighting.markdown @gwww
source/_integrations/peblar.markdown @frenck
source/_integrations/peco.markdown @IceBotYT
@@ -689,6 +693,7 @@ source/_integrations/portlandgeneral.markdown @tronikos
source/_integrations/powerfox.markdown @klaasnicolaas
source/_integrations/powerwall.markdown @bdraco @jrester @daniel-simpson
source/_integrations/private_ble_device.markdown @Jc2k
+source/_integrations/probe_plus.markdown @pantherale0
source/_integrations/profiler.markdown @bdraco
source/_integrations/profilo.markdown @DavidMStraub @Diegorro98 @MartinHjelmare
source/_integrations/progettihwsw.markdown @ardaseremet
@@ -768,7 +773,6 @@ source/_integrations/russound_rnet.markdown @noahhusby
source/_integrations/ruuvi_gateway.markdown @akx
source/_integrations/ruuvitag_ble.markdown @akx
source/_integrations/rympro.markdown @OnFreund @elad-bar @maorcc
-source/_integrations/s3.markdown @tomasbedrich
source/_integrations/sabnzbd.markdown @shaiu @jpbede
source/_integrations/saj.markdown @fredericvl
source/_integrations/samsam.markdown @klaasnicolaas
@@ -827,6 +831,7 @@ source/_integrations/slide_local.markdown @dontinelli
source/_integrations/slimproto.markdown @marcelveldt
source/_integrations/sma.markdown @kellerza @rklomp @erwindouna
source/_integrations/smappee.markdown @bsmappee
+source/_integrations/smarla.markdown @explicatis @rlint-explicatis
source/_integrations/smart_blinds.markdown @starkillerOG
source/_integrations/smart_home.markdown @starkillerOG
source/_integrations/smart_meter_texas.markdown @grahamwetzler
@@ -871,7 +876,7 @@ source/_integrations/stream.markdown @hunterjm @uvjustin @allenporter
source/_integrations/stt.markdown @home-assistant/core
source/_integrations/subaru.markdown @G-Two
source/_integrations/suez_water.markdown @ooii @jb101010-2
-source/_integrations/sun.markdown @Swamp-Ig
+source/_integrations/sun.markdown @home-assistant/core
source/_integrations/supla.markdown @mwegrzynek
source/_integrations/surepetcare.markdown @benleb @danielhiversen
source/_integrations/swepco.markdown @tronikos
@@ -881,7 +886,7 @@ source/_integrations/switch.markdown @home-assistant/core
source/_integrations/switch.template.markdown @home-assistant/core
source/_integrations/switch_as_x.markdown @home-assistant/core
source/_integrations/switchbee.markdown @jafar-atili
-source/_integrations/switchbot.markdown @danielhiversen @RenierM26 @murtas @Eloston @dsypniewski
+source/_integrations/switchbot.markdown @danielhiversen @RenierM26 @murtas @Eloston @dsypniewski @zerzhang
source/_integrations/switchbot_cloud.markdown @SeraphicRav @laurence-presland @Gigatrappeur
source/_integrations/switcher_kis.markdown @thecode @YogevBokobza
source/_integrations/switchmate.markdown @danielhiversen @qiz-li
@@ -904,7 +909,7 @@ source/_integrations/tautulli.markdown @ludeeus @tkdrob
source/_integrations/technove.markdown @Moustachauve
source/_integrations/tedee.markdown @patrickhilker @zweckj
source/_integrations/tellduslive.markdown @fredrike
-source/_integrations/template.markdown @Petro31 @PhracturedBlue @home-assistant/core
+source/_integrations/template.markdown @Petro31 @home-assistant/core
source/_integrations/tesla_fleet.markdown @Bre77
source/_integrations/tesla_wall_connector.markdown @einarhauks
source/_integrations/teslemetry.markdown @Bre77
@@ -984,7 +989,7 @@ source/_integrations/vizio.markdown @raman325
source/_integrations/vlc_telnet.markdown @rodripf @MartinHjelmare
source/_integrations/vodafone_station.markdown @paoloantinori @chemelli74
source/_integrations/voice_assistant.markdown @balloob @synesthesiam
-source/_integrations/voip.markdown @balloob @synesthesiam
+source/_integrations/voip.markdown @balloob @synesthesiam @jaminh
source/_integrations/volumio.markdown @OnFreund
source/_integrations/volvooncall.markdown @molobrakos
source/_integrations/vulcan.markdown @Antoni-Czaplicki
@@ -1049,6 +1054,7 @@ source/_integrations/zeroconf.markdown @bdraco
source/_integrations/zerproc.markdown @emlove
source/_integrations/zeversolar.markdown @kvanzuijlen
source/_integrations/zha.markdown @dmulcahey @adminiuga @puddly @TheJulianJES
+source/_integrations/zimi.markdown @markhannon
source/_integrations/zodiac.markdown @JulienTant
source/_integrations/zondergas.markdown @klaasnicolaas
source/_integrations/zone.markdown @home-assistant/core
diff --git a/Gemfile b/Gemfile
index 8d1af9974ff..164f3031537 100644
--- a/Gemfile
+++ b/Gemfile
@@ -3,16 +3,16 @@ source 'https://rubygems.org'
ruby '> 2.5.0'
group :development do
- gem 'rake', '13.2.1'
+ gem 'rake', '13.3.0'
gem 'jekyll', '4.4.1'
gem 'compass', '1.0.3'
gem 'sass-globbing', '1.1.5'
gem 'stringex', '2.8.6'
# > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189
gem 'sassc', '2.1.0'
- gem 'sass-embedded', '1.89.0'
- gem 'rubocop', '1.75.7'
- gem 'ruby-lsp', '0.23.23'
+ gem 'sass-embedded', '1.89.2'
+ gem 'rubocop', '1.76.2'
+ gem 'ruby-lsp', '0.24.1'
gem 'rackup', '2.2.1'
end
diff --git a/Gemfile.lock b/Gemfile.lock
index 3e2faf63535..a5411621419 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -4,8 +4,8 @@ GEM
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
ast (2.4.3)
- base64 (0.2.0)
- bigdecimal (3.1.9)
+ base64 (0.3.0)
+ bigdecimal (3.2.2)
chunky_png (1.4.0)
colorator (1.1.0)
commonmarker (0.23.11)
@@ -22,7 +22,7 @@ GEM
compass-import-once (1.0.5)
sass (>= 3.2, < 3.5)
concurrent-ruby (1.3.5)
- csv (3.3.4)
+ csv (3.3.5)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
@@ -30,10 +30,10 @@ GEM
ffi (1.17.2-arm64-darwin)
ffi (1.17.2-x86_64-linux-gnu)
forwardable-extended (2.6.0)
- google-protobuf (4.31.0-arm64-darwin)
+ google-protobuf (4.31.1-arm64-darwin)
bigdecimal
rake (>= 13)
- google-protobuf (4.31.0-x86_64-linux-gnu)
+ google-protobuf (4.31.1-x86_64-linux-gnu)
bigdecimal
rake (>= 13)
http_parser.rb (0.8.0)
@@ -99,7 +99,7 @@ GEM
prism (1.4.0)
public_suffix (6.0.2)
racc (1.8.1)
- rack (3.1.15)
+ rack (3.1.16)
rack-protection (4.1.1)
base64 (>= 0.1.0)
logger (>= 1.6.0)
@@ -110,7 +110,7 @@ GEM
rackup (2.2.1)
rack (>= 3)
rainbow (3.1.1)
- rake (13.2.1)
+ rake (13.3.0)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
@@ -119,7 +119,7 @@ GEM
regexp_parser (2.10.0)
rexml (3.4.1)
rouge (4.5.2)
- rubocop (1.75.7)
+ rubocop (1.76.2)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
@@ -127,13 +127,13 @@ GEM
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.9.3, < 3.0)
- rubocop-ast (>= 1.44.0, < 2.0)
+ rubocop-ast (>= 1.45.1, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0)
- rubocop-ast (1.44.1)
+ rubocop-ast (1.45.1)
parser (>= 3.3.7.2)
prism (~> 1.4)
- ruby-lsp (0.23.23)
+ ruby-lsp (0.24.1)
language_server-protocol (~> 3.17.0)
prism (>= 1.2, < 2.0)
rbs (>= 3, < 5)
@@ -142,9 +142,9 @@ GEM
ruby2_keywords (0.0.5)
safe_yaml (1.0.5)
sass (3.4.25)
- sass-embedded (1.89.0-arm64-darwin)
+ sass-embedded (1.89.2-arm64-darwin)
google-protobuf (~> 4.31)
- sass-embedded (1.89.0-x86_64-linux-gnu)
+ sass-embedded (1.89.2-x86_64-linux-gnu)
google-protobuf (~> 4.31)
sass-globbing (1.1.5)
sass (>= 3.1)
@@ -159,7 +159,7 @@ GEM
rack-protection (= 4.1.1)
rack-session (>= 2.0.0, < 3)
tilt (~> 2.0)
- sorbet-runtime (0.5.12130)
+ sorbet-runtime (0.5.12189)
stringex (2.8.6)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@@ -184,10 +184,10 @@ DEPENDENCIES
jekyll-toc (= 0.19.0)
nokogiri (= 1.18.8)
rackup (= 2.2.1)
- rake (= 13.2.1)
- rubocop (= 1.75.7)
- ruby-lsp (= 0.23.23)
- sass-embedded (= 1.89.0)
+ rake (= 13.3.0)
+ rubocop (= 1.76.2)
+ ruby-lsp (= 0.24.1)
+ sass-embedded (= 1.89.2)
sass-globbing (= 1.1.5)
sassc (= 2.1.0)
sinatra (= 4.1.1)
diff --git a/_config.yml b/_config.yml
index cd202946ed4..56c825995db 100644
--- a/_config.yml
+++ b/_config.yml
@@ -107,9 +107,9 @@ social:
# Home Assistant release details
current_major_version: 2025
-current_minor_version: 5
-current_patch_version: 3
-date_released: 2025-05-23
+current_minor_version: 6
+current_patch_version: 1
+date_released: 2025-06-13
# Either # or the anchor link to latest release notes in the blog post.
# Must be prefixed with a # and have double quotes around it.
diff --git a/package-lock.json b/package-lock.json
index a0af2537106..0bc05b6f025 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,21 +20,12 @@
"remark-lint-prohibited-strings": "^4.0.0",
"remark-lint-unordered-list-marker-style": "^4.0.1",
"remark-stringify": "^11.0.0",
- "textlint": "^14.7.2",
+ "textlint": "^14.8.4",
"textlint-filter-rule-comments": "^1.2.2",
"textlint-rule-common-misspellings": "^1.0.1",
"textlint-rule-terminology": "^5.0.13"
}
},
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/@azu/format-text": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz",
@@ -298,14 +289,38 @@
}
},
"node_modules/@keyv/serialize": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.2.tgz",
- "integrity": "sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz",
+ "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"buffer": "^6.0.3"
}
},
+ "node_modules/@modelcontextprotocol/sdk": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.12.1.tgz",
+ "integrity": "sha512-KG1CZhZfWg+u8pxeM/mByJDScJSrjjxLc8fwQqbsS8xCjBmQfMNEBTotYdNanKekepnfRI85GtgQlctLFpcYPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.6",
+ "content-type": "^1.0.5",
+ "cors": "^2.8.5",
+ "cross-spawn": "^7.0.5",
+ "eventsource": "^3.0.2",
+ "express": "^5.0.1",
+ "express-rate-limit": "^7.5.0",
+ "pkce-challenge": "^5.0.0",
+ "raw-body": "^3.0.0",
+ "zod": "^3.23.8",
+ "zod-to-json-schema": "^3.24.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@npmcli/config": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/@npmcli/config/-/config-6.3.0.tgz",
@@ -427,75 +442,75 @@
"dev": true
},
"node_modules/@textlint/ast-tester": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-14.7.2.tgz",
- "integrity": "sha512-nlS1xJkIgyBinOx9zlMTU7e+06G8k6Xg8QBBeB+8oiY2UD4XKNHv0A3kOtW30DKtHcw1onZku00gI2ep1er77w==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-14.8.4.tgz",
+ "integrity": "sha512-j6YKPuEaASeXQ2Y/ode993r4A8ugdGEFnPhp96HVGjNVoAsandlR/L0WEMDG1FdIJj3W9+9rlcikXhFQSFc0lA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2",
- "debug": "^4.4.0"
+ "@textlint/ast-node-types": "14.8.4",
+ "debug": "^4.4.1"
}
},
"node_modules/@textlint/ast-tester/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.4.tgz",
+ "integrity": "sha512-+fI7miec/r9VeniFV9ppL4jRCmHNsTxieulTUf/4tvGII3db5hGriKHC4p/diq1SkQ9Sgs7kg6UyydxZtpTz1Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/ast-traverse": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-14.7.2.tgz",
- "integrity": "sha512-H2pH4NhxBO4nHf9bpEn1v5MZ3E1fKFyrGP3uminXWSqnz+ZEX3fVGYde8EyTdLXpwntUjBg67HBVM4EyTKuhTg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-14.8.4.tgz",
+ "integrity": "sha512-bnmgt0dB5RxBhRXQnaTd6wblfuv+cRWrGuyMp6CIuPTyWXyA5AO3NhqQYjQLCbrPDByiwbHAQwIZYOw6sVvn9Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2"
+ "@textlint/ast-node-types": "14.8.4"
}
},
"node_modules/@textlint/ast-traverse/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.4.tgz",
+ "integrity": "sha512-+fI7miec/r9VeniFV9ppL4jRCmHNsTxieulTUf/4tvGII3db5hGriKHC4p/diq1SkQ9Sgs7kg6UyydxZtpTz1Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/config-loader": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-14.7.2.tgz",
- "integrity": "sha512-06Fqpe36ur7I+SZTtqZbJbsIbbu8uilJuiQG5t+7NIRPNo/d0TrioaMN2Ru/Yr+hq4eSJu+roZ20FNWHMEJb1Q==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-14.8.4.tgz",
+ "integrity": "sha512-TWIfYkGIl6zZz4GJWQVrWurK25YG0j0Br/Jexn2EAh7sun5wDsb7hHK1Y2aWHIAeWHOn5D2C0OdHT3jH8YToGA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/kernel": "^14.7.2",
- "@textlint/module-interop": "^14.7.2",
- "@textlint/resolver": "^14.7.2",
- "@textlint/types": "^14.7.2",
- "@textlint/utils": "^14.7.2",
- "debug": "^4.4.0",
+ "@textlint/kernel": "14.8.4",
+ "@textlint/module-interop": "14.8.4",
+ "@textlint/resolver": "14.8.4",
+ "@textlint/types": "14.8.4",
+ "@textlint/utils": "14.8.4",
+ "debug": "^4.4.1",
"rc-config-loader": "^4.1.3"
}
},
"node_modules/@textlint/feature-flag": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-14.7.2.tgz",
- "integrity": "sha512-zfNbBZVrwgDJ4xTWe2FyL/vLvbfw1kTdPRStkFp1tu7I0ypsfwaMh41XZX8rbRqQ5x4p06rLexuOLig9HySyZg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-14.8.4.tgz",
+ "integrity": "sha512-bI1HpZtArzgmbPsMubKe3AYLIOYPOqHJ8R8JlhSuduszVd6gFsyptmMTHdI+1gWRTo1Dv9LRGEmI9W9rAV7Dmg==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/fixer-formatter": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-14.7.2.tgz",
- "integrity": "sha512-KISSckKJD1JAHLy57D+EWRscp/GV7XM/nzPxRARpooIJyGlFNvg/VDkGDzU2ZitH63IduI5qdBxKzvbgk4OgdQ==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-14.8.4.tgz",
+ "integrity": "sha512-lpEaVF1iUBL4d+X04BIus7ubiPk5PeRmriFosxoCKT9RqJFXMnC6ApBGpWX5fLBTRK9XNesOpP0c+tXprOAPdw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/module-interop": "^14.7.2",
- "@textlint/resolver": "^14.7.2",
- "@textlint/types": "^14.7.2",
+ "@textlint/module-interop": "14.8.4",
+ "@textlint/resolver": "14.8.4",
+ "@textlint/types": "14.8.4",
"chalk": "^4.1.2",
- "debug": "^4.4.0",
+ "debug": "^4.4.1",
"diff": "^5.2.0",
"string-width": "^4.2.3",
"strip-ansi": "^6.0.1",
@@ -503,45 +518,45 @@
}
},
"node_modules/@textlint/kernel": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-14.7.2.tgz",
- "integrity": "sha512-sb2npadp7rsnrVvwv4Ia13/HcwZtVZnY04cJYnDOS6R4TthnYRyP55WF7ftB8GX1bw7FIY/NPvJN/UuWTKQ8XA==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-14.8.4.tgz",
+ "integrity": "sha512-fBk8Lm4Ph7ogvqpSpRFiB0NM/rQVWOnOMLSJqZsdyvA40IVeZZYs+2bM1WgVdAZLUQTHSzKMExsHu2c91YVpKw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2",
- "@textlint/ast-tester": "^14.7.2",
- "@textlint/ast-traverse": "^14.7.2",
- "@textlint/feature-flag": "^14.7.2",
- "@textlint/source-code-fixer": "^14.7.2",
- "@textlint/types": "^14.7.2",
- "@textlint/utils": "^14.7.2",
- "debug": "^4.4.0",
+ "@textlint/ast-node-types": "14.8.4",
+ "@textlint/ast-tester": "14.8.4",
+ "@textlint/ast-traverse": "14.8.4",
+ "@textlint/feature-flag": "14.8.4",
+ "@textlint/source-code-fixer": "14.8.4",
+ "@textlint/types": "14.8.4",
+ "@textlint/utils": "14.8.4",
+ "debug": "^4.4.1",
"fast-equals": "^4.0.3",
"structured-source": "^4.0.0"
}
},
"node_modules/@textlint/kernel/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.4.tgz",
+ "integrity": "sha512-+fI7miec/r9VeniFV9ppL4jRCmHNsTxieulTUf/4tvGII3db5hGriKHC4p/diq1SkQ9Sgs7kg6UyydxZtpTz1Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/linter-formatter": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-14.7.2.tgz",
- "integrity": "sha512-QZOqft5uK+o/UN8UcEF3cHgfbG1r3+OWqlJojyjGNkEBbBNPSyDfYlVxDjHqnOAwm7jBaeqVGlwvw/7PUFmsmw==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-14.8.4.tgz",
+ "integrity": "sha512-sZ0UfYRDBNHnfMVBqLqqYnqTB7Ec169ljlmo+SEHR1T+dHUPYy1/DZK4p7QREXlBSFL4cnkswETCbc9xRodm4Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@azu/format-text": "^1.0.2",
"@azu/style-format": "^1.0.1",
- "@textlint/module-interop": "^14.7.2",
- "@textlint/resolver": "^14.7.2",
- "@textlint/types": "^14.7.2",
+ "@textlint/module-interop": "14.8.4",
+ "@textlint/resolver": "14.8.4",
+ "@textlint/types": "14.8.4",
"chalk": "^4.1.2",
- "debug": "^4.4.0",
+ "debug": "^4.4.1",
"js-yaml": "^3.14.1",
"lodash": "^4.17.21",
"pluralize": "^2.0.0",
@@ -552,27 +567,28 @@
}
},
"node_modules/@textlint/markdown-to-ast": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-14.7.2.tgz",
- "integrity": "sha512-gfOQaBFoFVTj/9rzhEjnJonWZwWjM1RLmaO4J7GHIOFBAo/qr/EJRO3QijQWaAJFoH8xd/3cpUCEzpRwhwkeoA==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-14.8.4.tgz",
+ "integrity": "sha512-9x7xqpk//79nREP4Hb219UG3N3lERNorlhXOl1XX4A0y8BcDAKKDv70WftkF9VZ+sx4ys4dv/iOsBA29I0nNQA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2",
- "debug": "^4.4.0",
+ "@textlint/ast-node-types": "14.8.4",
+ "debug": "^4.4.1",
"mdast-util-gfm-autolink-literal": "^0.1.3",
- "neotraverse": "^0.6.15",
+ "neotraverse": "^0.6.18",
"remark-footnotes": "^3.0.0",
"remark-frontmatter": "^3.0.0",
"remark-gfm": "^1.0.0",
"remark-parse": "^9.0.0",
+ "structured-source": "^4.0.0",
"unified": "^9.2.2"
}
},
"node_modules/@textlint/markdown-to-ast/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.4.tgz",
+ "integrity": "sha512-+fI7miec/r9VeniFV9ppL4jRCmHNsTxieulTUf/4tvGII3db5hGriKHC4p/diq1SkQ9Sgs7kg6UyydxZtpTz1Q==",
"dev": true,
"license": "MIT"
},
@@ -819,88 +835,90 @@
}
},
"node_modules/@textlint/module-interop": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-14.7.2.tgz",
- "integrity": "sha512-rDQhFERa2+xMqhyrPFvAL9d5Tb4RpQGKQExwrezvtCTREh6Zsp/nKxtK0r6o0P9xn1+zq2sZHW9NZjpe7av3xw==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-14.8.4.tgz",
+ "integrity": "sha512-1LdPYLAVpa27NOt6EqvuFO99s4XLB0c19Hw9xKSG6xQ1K82nUEyuWhzTQKb3KJ5Qx7qj14JlXZLfnEuL6A16Bw==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/resolver": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-14.7.2.tgz",
- "integrity": "sha512-FCZa9XJx5KihK/4gxXLhS/KfOnBD6vD5UxAMtgrvbifn+JFrW9Kh17uZLCcuJDDJJCnZOHq8jdT7AU+rpmJZ+w==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-14.8.4.tgz",
+ "integrity": "sha512-nMDOgDAVwNU9ommh+Db0U+MCMNDPbQ/1HBNjbnHwxZkCpcT6hsAJwBe38CW/DtWVUv8yeR4R40IYNPT84srNwA==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/source-code-fixer": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-14.7.2.tgz",
- "integrity": "sha512-1aWxLIzUIYq9pnrHx7NT7huNbdMONBGORrxYNFC6yIAlSjPo4j44yZabaOMTxjGTPMOvFTUVl2gXTUYqygBGOA==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-14.8.4.tgz",
+ "integrity": "sha512-/BTSLTgpRqrgwqB2Jmu/sRMEgB3sn9dxhDRmSX4hFFbtD2wT8/d4TcxD7rTe3NdWAPCCHQ8xCBUHDuZrTqDA4w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/types": "^14.7.2",
- "debug": "^4.4.0"
+ "@textlint/types": "14.8.4",
+ "debug": "^4.4.1"
}
},
"node_modules/@textlint/text-to-ast": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-14.7.2.tgz",
- "integrity": "sha512-8+4WvYnaDR0F7gDszhs9iCQp5kbbEQ9itbvQHcFDhHi4XCDksWdrQz6XJ+Kw/zbLUEz9QtvoXZ1VjZRiwgtTIg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-14.8.4.tgz",
+ "integrity": "sha512-BWWEM12WqWUKmI9BQvnjtu4CElExWhm1asPE3j//jFTyR6oLv14NaFUaR26xGJWAI28WIa293AmWfE60ygHdRA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2"
+ "@textlint/ast-node-types": "14.8.4"
}
},
"node_modules/@textlint/text-to-ast/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.4.tgz",
+ "integrity": "sha512-+fI7miec/r9VeniFV9ppL4jRCmHNsTxieulTUf/4tvGII3db5hGriKHC4p/diq1SkQ9Sgs7kg6UyydxZtpTz1Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/textlint-plugin-markdown": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-14.7.2.tgz",
- "integrity": "sha512-s6CR68bK9Y/+c0jvM+9oDT5LgvgRbP2A8IzPwuGVhqwFQBJmrSdG4KvBN4ycsq+h3EACTCeyv9bN9no0td9vgw==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-14.8.4.tgz",
+ "integrity": "sha512-WWFo05mIsXaJPrWiR/nsvaLd/nUS0xWWeJg6AcpOkrxyIqH//PyTuQHD9sYpJkCFopWP1/8GeCba+a/m2llX4g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/markdown-to-ast": "^14.7.2"
+ "@textlint/markdown-to-ast": "14.8.4",
+ "@textlint/types": "14.8.4"
}
},
"node_modules/@textlint/textlint-plugin-text": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-14.7.2.tgz",
- "integrity": "sha512-ZtO/i4cZ+y9j7KqsP8P3cbj/XpUDMyedkV+fQP8DkJb238vJ/EUrW8wBwvIq0BmGe7DKIgIl3WeFp8AKxNw7aw==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-14.8.4.tgz",
+ "integrity": "sha512-FY7H9a2I07/DzQtouQK9/Fs+9fgMAw5xQvHgAiqOffGU/i8WvWnsywflciW/IRi/By1TCd5nhdN/YRBvzuvfnw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/text-to-ast": "^14.7.2"
+ "@textlint/text-to-ast": "14.8.4",
+ "@textlint/types": "14.8.4"
}
},
"node_modules/@textlint/types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/types/-/types-14.7.2.tgz",
- "integrity": "sha512-VpsmtJf9+7cnIxmKtAVVGVzI6f2k09kBZnzjdTAO8JZ+HTmV46jeoVrotpSfQbWDpuQk2UFPfrsZL/LNf/99ew==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/types/-/types-14.8.4.tgz",
+ "integrity": "sha512-9nyY8vVXlr8hHKxa6+37omJhXWCwovMQcgMteuldYd4dOxGm14AK2nXdkgtKEUQnzLGaXy46xwLCfhQy7V7/YA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2"
+ "@textlint/ast-node-types": "14.8.4"
}
},
"node_modules/@textlint/types/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.4.tgz",
+ "integrity": "sha512-+fI7miec/r9VeniFV9ppL4jRCmHNsTxieulTUf/4tvGII3db5hGriKHC4p/diq1SkQ9Sgs7kg6UyydxZtpTz1Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@textlint/utils": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-14.7.2.tgz",
- "integrity": "sha512-NMLtiALWVYtl/zqRB0GIw3CJLNSV5bq8u35v1qaJOLrWhBVxOkbWISItHhQGndCalHTt8uYkntHXYKpk0oSPtQ==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-14.8.4.tgz",
+ "integrity": "sha512-ByRbUBtxhvZoI43CJJCy0oVPwpvB4/r8FhH33QguW9DSVk33y8ful5YIhV8ziSGjNJbwxGhe3rqR8YBmUkrnsQ==",
"dev": true,
"license": "MIT"
},
@@ -1007,17 +1025,31 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
"dev": true,
"license": "MIT",
"dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
},
"funding": {
"type": "github",
@@ -1115,7 +1147,8 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ]
+ ],
+ "license": "MIT"
},
"node_modules/binary-extensions": {
"version": "2.2.0",
@@ -1126,6 +1159,27 @@
"node": ">=8"
}
},
+ "node_modules/body-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
+ "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.0",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.6.3",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.0",
+ "raw-body": "^3.0.0",
+ "type-is": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/boundary": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz",
@@ -1163,6 +1217,7 @@
"url": "https://feross.org/support"
}
],
+ "license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
@@ -1174,14 +1229,56 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
- "node_modules/cacheable": {
- "version": "1.8.7",
- "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.7.tgz",
- "integrity": "sha512-AbfG7dAuYNjYxFUtL1lAqmlWdxczCJ47w7cFjhGcnGnUdwSo6VgmSojfoW3tUI12HUkgTJ5kqj78yyq6TsFtlg==",
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cacheable": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.0.tgz",
+ "integrity": "sha512-SSgQTAnhd7WlJXnGlIi4jJJOiHzgnM5wRMEPaXAU4kECTAMpBoYKoZ9i5zHmclIEZbxcu3j7yY/CF8DTmwIsHg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "hookified": "^1.6.0",
- "keyv": "^5.2.3"
+ "hookified": "^1.8.2",
+ "keyv": "^5.3.3"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/ccount": {
@@ -1358,11 +1455,69 @@
"typedarray": "^0.0.6"
}
},
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "node_modules/content-disposition": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -1382,10 +1537,11 @@
}
},
"node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ms": "^2.1.3"
},
@@ -1415,7 +1571,18 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
},
"node_modules/dequal": {
"version": "2.0.3",
@@ -1449,18 +1616,50 @@
"node": ">=0.3.1"
}
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"dev": true
},
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -1470,6 +1669,46 @@
"is-arrayish": "^0.2.1"
}
},
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -1497,6 +1736,98 @@
"node": ">=4"
}
},
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventsource": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
+ "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eventsource-parser": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/eventsource-parser": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.2.tgz",
+ "integrity": "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.0",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express-rate-limit": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz",
+ "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/express-rate-limit"
+ },
+ "peerDependencies": {
+ "express": "^4.11 || 5 || ^5.0.0-beta.1"
+ }
+ },
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -1517,11 +1848,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/fast-uri": {
"version": "3.0.6",
@@ -1554,12 +1893,13 @@
}
},
"node_modules/file-entry-cache": {
- "version": "10.0.5",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.5.tgz",
- "integrity": "sha512-umpQsJrBNsdMDgreSryMEXvJh66XeLtZUwA8Gj7rHGearGufUFv6rB/bcXRFsiGWw/VeSUgUofF4Rf2UKEOrTA==",
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz",
+ "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "flat-cache": "^6.1.5"
+ "flat-cache": "^6.1.10"
}
},
"node_modules/fill-range": {
@@ -1574,6 +1914,24 @@
"node": ">=8"
}
},
+ "node_modules/finalhandler": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
@@ -1587,21 +1945,23 @@
}
},
"node_modules/flat-cache": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.5.tgz",
- "integrity": "sha512-QR+2kN38f8nMfiIQ1LHYjuDEmZNZVjxuxY+HufbS3BW0EX01Q5OnH7iduOYRutmgiXb797HAKcXUeXrvRjjgSQ==",
+ "version": "6.1.10",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.10.tgz",
+ "integrity": "sha512-B6/v1f0NwjxzmeOhzfXPGWpKBVA207LS7lehaVKQnFrVktcFRfkzjZZ2gwj2i1TkEUMQht7ZMJbABUT5N+V1Nw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cacheable": "^1.8.7",
- "flatted": "^3.3.2",
- "hookified": "^1.6.0"
+ "cacheable": "^1.10.0",
+ "flatted": "^3.3.3",
+ "hookified": "^1.9.1"
}
},
"node_modules/flatted": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
- "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
- "dev": true
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/foreground-child": {
"version": "3.1.1",
@@ -1628,6 +1988,26 @@
"node": ">=0.4.x"
}
},
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -1643,10 +2023,53 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
},
"node_modules/glob-parent": {
"version": "5.1.2",
@@ -1660,6 +2083,19 @@
"node": ">= 6"
}
},
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -1688,11 +2124,38 @@
"node": ">=8"
}
},
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/hookified": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.6.0.tgz",
- "integrity": "sha512-se7cpwTA+iA/eY548Bu03JJqBiEZAqU2jnyKdj5B5qurtBg64CZGHTgqCv4Yh7NWu6FGI09W61MCq+NoPj9GXA==",
- "dev": true
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.1.tgz",
+ "integrity": "sha512-u3pxtGhKjcSXnGm1CX6aXS9xew535j3lkOCegbA6jdyh0BaAjTbXI4aslKstCr6zUNtoCxFGFKwjbSHdGrMB8g==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/hosted-git-info": {
"version": "2.8.9",
@@ -1700,6 +2163,46 @@
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-errors/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -1718,7 +2221,8 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ]
+ ],
+ "license": "BSD-3-Clause"
},
"node_modules/ignore": {
"version": "5.2.4",
@@ -1754,6 +2258,16 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/is-alphabetical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
@@ -1895,6 +2409,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@@ -1961,9 +2482,9 @@
}
},
"node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true,
"license": "MIT"
},
@@ -1980,12 +2501,13 @@
}
},
"node_modules/keyv": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.3.tgz",
- "integrity": "sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==",
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.4.tgz",
+ "integrity": "sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@keyv/serialize": "^1.0.2"
+ "@keyv/serialize": "^1.0.3"
}
},
"node_modules/levn": {
@@ -1993,6 +2515,7 @@
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
@@ -2124,6 +2647,16 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/md5": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
@@ -3051,6 +3584,29 @@
"@types/unist": "*"
}
},
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/micromark": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
@@ -3735,6 +4291,29 @@
}
]
},
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
@@ -3777,6 +4356,16 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/neotraverse": {
"version": "0.6.18",
"resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz",
@@ -3832,18 +4421,65 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
@@ -3930,6 +4566,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
@@ -3982,6 +4628,16 @@
"integrity": "sha512-tmciSlVyHnX0LC86+zSr+0LURw9rDPw8ilhXcmTpVUOnI6OsKdCzXQs5fTG10Bjz26IBdnKL3XIaP+QvGsk5YQ==",
"dev": true
},
+ "node_modules/path-to-regexp": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
+ "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/path-type": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
@@ -4038,6 +4694,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/pkce-challenge": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz",
+ "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
"node_modules/pluralize": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz",
@@ -4050,6 +4716,7 @@
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.8.0"
}
@@ -4063,6 +4730,46 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/quotation": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/quotation/-/quotation-2.0.3.tgz",
@@ -4073,6 +4780,32 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
+ "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.6.3",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/rc-config-loader": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz",
@@ -5800,6 +6533,23 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -5820,6 +6570,13 @@
}
]
},
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -5829,6 +6586,52 @@
"semver": "bin/semver"
}
},
+ "node_modules/send": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.5",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "mime-types": "^3.0.1",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -5850,6 +6653,82 @@
"node": ">=8"
}
},
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -5929,6 +6808,16 @@
"dev": true,
"license": "BSD-3-Clause"
},
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -6091,6 +6980,30 @@
"node": ">=10.0.0"
}
},
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -6098,37 +7011,39 @@
"dev": true
},
"node_modules/textlint": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/textlint/-/textlint-14.7.2.tgz",
- "integrity": "sha512-SRff/IHVonktwTMm0momjMZeh0WTPWbQR0S0NXHoU7MUwLM9e4VJeQvkq7V0d37GiM1WfXJSkbaTVidOhOE+0Q==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/textlint/-/textlint-14.8.4.tgz",
+ "integrity": "sha512-oV7DwKjdbIk+5LlAhtTtWsudzNdUnEpP2KW2iIRnjdZ0uM/vXhffDh66UL6P3nk7Io37qhSRb3E82fdVHqyblw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^14.7.2",
- "@textlint/ast-traverse": "^14.7.2",
- "@textlint/config-loader": "^14.7.2",
- "@textlint/feature-flag": "^14.7.2",
- "@textlint/fixer-formatter": "^14.7.2",
- "@textlint/kernel": "^14.7.2",
- "@textlint/linter-formatter": "^14.7.2",
- "@textlint/module-interop": "^14.7.2",
- "@textlint/resolver": "^14.7.2",
- "@textlint/textlint-plugin-markdown": "^14.7.2",
- "@textlint/textlint-plugin-text": "^14.7.2",
- "@textlint/types": "^14.7.2",
- "@textlint/utils": "^14.7.2",
- "debug": "^4.4.0",
- "file-entry-cache": "^10.0.5",
+ "@modelcontextprotocol/sdk": "^1.12.1",
+ "@textlint/ast-node-types": "14.8.4",
+ "@textlint/ast-traverse": "14.8.4",
+ "@textlint/config-loader": "14.8.4",
+ "@textlint/feature-flag": "14.8.4",
+ "@textlint/fixer-formatter": "14.8.4",
+ "@textlint/kernel": "14.8.4",
+ "@textlint/linter-formatter": "14.8.4",
+ "@textlint/module-interop": "14.8.4",
+ "@textlint/resolver": "14.8.4",
+ "@textlint/textlint-plugin-markdown": "14.8.4",
+ "@textlint/textlint-plugin-text": "14.8.4",
+ "@textlint/types": "14.8.4",
+ "@textlint/utils": "14.8.4",
+ "debug": "^4.4.1",
+ "file-entry-cache": "^10.0.8",
"glob": "^10.4.5",
"md5": "^2.3.0",
"mkdirp": "^0.5.6",
- "optionator": "^0.9.3",
+ "optionator": "^0.9.4",
"path-to-glob-pattern": "^2.0.1",
"rc-config-loader": "^4.1.3",
"read-pkg": "^1.1.0",
"read-pkg-up": "^3.0.0",
"structured-source": "^4.0.0",
- "unique-concat": "^0.2.2"
+ "unique-concat": "^0.2.2",
+ "zod": "^3.25.56"
},
"bin": {
"textlint": "bin/textlint.js"
@@ -6240,9 +7155,9 @@
}
},
"node_modules/textlint/node_modules/@textlint/ast-node-types": {
- "version": "14.7.2",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.7.2.tgz",
- "integrity": "sha512-3rZc9vD8y/DlcFe3Y/cyKRRVgBH4ElEUzVFYdRVDwoMSwV/cIyZgYzVG6ZuOItQt+cHSREuijuucZ4VqZynbtg==",
+ "version": "14.8.4",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.4.tgz",
+ "integrity": "sha512-+fI7miec/r9VeniFV9ppL4jRCmHNsTxieulTUf/4tvGII3db5hGriKHC4p/diq1SkQ9Sgs7kg6UyydxZtpTz1Q==",
"dev": true,
"license": "MIT"
},
@@ -6317,6 +7232,16 @@
"node": ">=8.0"
}
},
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
"node_modules/trough": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz",
@@ -6332,6 +7257,7 @@
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1"
},
@@ -6351,6 +7277,21 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/type-is": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -6867,6 +7808,26 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -6883,6 +7844,16 @@
"spdx-expression-parse": "^3.0.0"
}
},
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/vfile": {
"version": "5.3.7",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
@@ -7273,6 +8244,16 @@
"node": ">= 8"
}
},
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
@@ -7370,6 +8351,13 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -7385,6 +8373,26 @@
"node": ">= 14"
}
},
+ "node_modules/zod": {
+ "version": "3.25.57",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.57.tgz",
+ "integrity": "sha512-6tgzLuwVST5oLUxXTmBqoinKMd3JeesgbgseXeFasKKj8Q1FCZrHnbqJOyiEvr4cVAlbug+CgIsmJ8cl/pU5FA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-to-json-schema": {
+ "version": "3.24.5",
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz",
+ "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==",
+ "dev": true,
+ "license": "ISC",
+ "peerDependencies": {
+ "zod": "^3.24.1"
+ }
+ },
"node_modules/zwitch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
diff --git a/package.json b/package.json
index ea593d5a90e..84d01f1d4a4 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
"remark-lint-prohibited-strings": "^4.0.0",
"remark-lint-unordered-list-marker-style": "^4.0.1",
"remark-stringify": "^11.0.0",
- "textlint": "^14.7.2",
+ "textlint": "^14.8.4",
"textlint-filter-rule-comments": "^1.2.2",
"textlint-rule-common-misspellings": "^1.0.1",
"textlint-rule-terminology": "^5.0.13"
diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown
index a2bf1ede505..b50e46d9f6a 100644
--- a/source/_docs/authentication/providers.markdown
+++ b/source/_docs/authentication/providers.markdown
@@ -161,7 +161,7 @@ Assuming you have only the owner created though onboarding process, no other use
The command line auth provider executes a configurable shell command to perform user authentication. Two environment variables, `username` and `password`, are passed to the command. Access is granted when the command exits successfully (with exit code 0).
-This provider can be used to integrate Home Assistant with arbitrary external authentication services, from plaintext databases over LDAP to RADIUS. A compatible script for LDAP authentication is [this one](https://github.com/bob1de/ldap-auth-sh), for instance. Please note, this will only work when using the Home Assistant Core installation type.
+This provider can be used to integrate Home Assistant with arbitrary external authentication services, from plaintext databases over LDAP to RADIUS.
Here is a configuration example:
diff --git a/source/_docs/blueprint/schema.markdown b/source/_docs/blueprint/schema.markdown
index 02b44b173cb..602caef5a82 100644
--- a/source/_docs/blueprint/schema.markdown
+++ b/source/_docs/blueprint/schema.markdown
@@ -16,16 +16,18 @@ related:
## The blueprint schema
+Blueprint schemas currently supports three types of schema depending on its domain: [`automation`](/docs/automation/yaml/); `script`; and [`template`](/integrations/template/#using-blueprints).
+
The configuration schema of a blueprint consists of 2 parts:
-1. The blueprint's high-level metadata: name, description, the input required from the user.
-2. The schema of the thing the blueprint describes.
+1. The blueprint's high-level metadata: name, domain and, optionally, any input required from the user.
+2. The schema for the blueprint domain it describes.
The first part is referred to as the *blueprint schema*. It contains the
blueprint's metadata.
-The only requirement for a blueprint is a name. In its most basic form,
-a blueprint would look like:
+Minimum required metadata for a blueprint is its name and domain. In its most basic form,
+a blueprint looks like:
```yaml
blueprint:
@@ -35,10 +37,9 @@ blueprint:
Although this is a valid blueprint, it is not very useful.
-The second part depends on the use case of the blueprint. For example, if you create a blueprint for an automation, the full
+The second part depends on its domain, the type of blueprint. For example, when creating a blueprint for an automation, the full
schema for an [automation](/docs/automation/yaml/) applies.
-You can add a description of the blueprint's use case and user inputs.
This is the full blueprint schema:
@@ -50,13 +51,13 @@ name:
description:
description: >
The description of the blueprint. While optional, this field is highly
- recommended. Describe what the blueprint does and describe the inputs the blueprint provide. The description can
+ recommended. Describe what the blueprint does and describe the inputs the blueprint requires. The description can
include [Markdown](https://commonmark.org/help/).
type: string
required: false
domain:
description: >
- The domain in which this blueprint is used. Currently, only
+ The domain in which this blueprint is used. Currently, only three types,
[`automation`](/docs/automation/yaml/), `script` and [`template`](/integrations/template/#using-blueprints) are supported.
type: string
required: true
@@ -66,7 +67,7 @@ author:
required: false
homeassistant:
description: >
- Home Assistant requirements to be able to use the blueprint successfully.
+ Home Assistant version required for the blueprint to work successfully.
type: map
required: false
keys:
@@ -90,10 +91,9 @@ input:
### Blueprint inputs
-As described above, a blueprint can accept one (or multiple)
-inputs from the blueprint user.
+A blueprint can accept one or multiple inputs from the user, but does not require any input.
-These inputs can be of any type (string, boolean, list, dictionary). They can have
+These inputs can be of any type (string, boolean, list, map). They can have
a default value and also provide a [selector](/docs/blueprint/selectors/) that
ensures a matching input field in the user interface.
@@ -126,9 +126,9 @@ A blueprint input has the following configuration:
{% endconfiguration %}
Each input field can be referred to, outside of the blueprint metadata, using
-the `!input` custom YAML tag.
+the `!input` custom YAML tag before its name.
-The following example shows a minimal blueprint with a single input:
+The following example shows a minimal *blueprint schema* with a single input:
```yaml
blueprint:
@@ -161,7 +161,7 @@ A section is differentiated from an input by the presence of an additional `inpu
Input sections are a new feature in version 2024.6.0. Set the `min_version` for the blueprint to at least this version if using input sections. Otherwise, the blueprint will generate errors on older versions. See [this section](/docs/blueprint/schema/#min_version) for more details.
{% endcaution %}
-The full configuration for a section is below:
+The full configuration for an input section is below:
{% configuration %}
@@ -194,7 +194,7 @@ input:
-The following example shows a blueprint with some inputs in a section:
+The following example shows a *blueprint schema* with some inputs in a section:
```yaml
blueprint:
@@ -232,7 +232,8 @@ variables:
The [built-in blueprints][blueprint-built-in]
are great examples to get a bit of a feeling of how blueprints work.
-Here is the built-in motion light automation blueprint:
+Here is the built-in motion light automation blueprint.
+Note the *blueprint schema* under the blueprint key is followed by its domain schema. In this example, an automation schema.
```yaml
blueprint:
diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown
index cc6f0f60ccd..7040bfd2fb5 100644
--- a/source/_docs/configuration/templating.markdown
+++ b/source/_docs/configuration/templating.markdown
@@ -52,8 +52,8 @@ There are a few very important rules to remember when adding templates to YAML:
1. You **must** surround single-line templates with double quotes (`"`) or single quotes (`'`).
2. It is advised that you prepare for undefined variables by using `if ... is not none` or the [`default` filter](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.default), or both.
-3. It is advised that when comparing numbers, you convert the number(s) to a [`float`](https://jinja.palletsprojects.com/en/latest/templates/#float) or an [`int`](https://jinja.palletsprojects.com/en/latest/templates/#int) by using the respective [filter](https://jinja.palletsprojects.com/en/latest/templates/#list-of-builtin-filters).
-4. While the [`float`](https://jinja.palletsprojects.com/en/latest/templates/#float) and [`int`](https://jinja.palletsprojects.com/en/latest/templates/#int) filters do allow a default fallback value if the conversion is unsuccessful, they do not provide the ability to catch undefined variables.
+3. It is advised that when comparing numbers, you convert the number(s) to a [`float`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.float) or an [`int`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.int) by using the respective [filter](https://jinja.palletsprojects.com/en/latest/templates/#list-of-builtin-filters).
+4. While the [`float`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.float) and [`int`](https://jinja.palletsprojects.com/en/latest/templates/#jinja-filters.int) filters do allow a default fallback value if the conversion is unsuccessful, they do not provide the ability to catch undefined variables.
Remembering these simple rules will help save you from many headaches and endless hours of frustration when using automation templates.
@@ -97,7 +97,7 @@ In your automations, you could then reuse this macro by importing it:
{{ format_entity('sensor.temperature') }}
```
-{$ endraw %}
+{% endraw %}
Home Assistant also allows you to write macros with non-string return values by
taking a named argument called `returns` and calling it with a return value. Once created,
@@ -774,7 +774,7 @@ For example, if you wanted to select a field from `trigger` in an automation bas
{% endraw %}
-- `as_datetime(value, default)` converts a string containing a timestamp, or valid UNIX timestamp, to a datetime object. If that fails, it returns the `default` value or, if omitted, raises an error. When the input is already a datetime object it will be returned as is. in case the input is a datetime.date object, midnight will be added as time. This function can also be used as a filter.
+- `as_datetime(value, default)` converts a string containing a timestamp or a valid UNIX timestamp to a datetime object. If conversion fails, the function returns the `default` value. If no `default` is provided and the input is a string that cannot be converted to a datetime, it returns `None`. For other invalid inputs (e.g., a list, dictionary, or a numeric value too large to convert), it raises an error when no `default` is supplied. In case the input is already a datetime object, it is returned unchanged. If the input is a `datetime.date` object, midnight is added as the time. This function can also be used as a filter.
- `as_timestamp(value, default)` converts a datetime object or string to UNIX timestamp. If that fails, returns the `default` value, or if omitted raises an error. This function can also be used as a filter.
- `as_local()` converts a datetime object to local time. This function can also be used as a filter.
- `strptime(string, format, default)` parses a string based on a [format](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior) and returns a datetime object. If that fails, it returns the `default` value or, if omitted, raises an error.
diff --git a/source/_docs/z-wave/controllers.markdown b/source/_docs/z-wave/controllers.markdown
index 79a0dacc826..7fc945521ff 100644
--- a/source/_docs/z-wave/controllers.markdown
+++ b/source/_docs/z-wave/controllers.markdown
@@ -1,6 +1,9 @@
---
title: "Z-Wave Controllers"
description: "Extended instructions how to setup Z-Wave."
+related:
+ - docs: /integrations/zwave_js/
+ title: Z-Wave integration
---
## Supported Z-Wave USB Sticks & Hardware Modules
diff --git a/source/_includes/asides/component_navigation.html b/source/_includes/asides/component_navigation.html
index 0f2198ebdcb..33995c96ee0 100644
--- a/source/_includes/asides/component_navigation.html
+++ b/source/_includes/asides/component_navigation.html
@@ -69,13 +69,11 @@
{%- endif -%}
{% if page.works_with %}
- {%- for type in page.works_with -%}
-
- {%- endfor -%}
+
{%- endif -%}
{% if page.ha_domain %}
diff --git a/source/_includes/common-tasks/network_storage.md b/source/_includes/common-tasks/network_storage.md
index b8cb9a77ddb..b7feb0bafa2 100644
--- a/source/_includes/common-tasks/network_storage.md
+++ b/source/_includes/common-tasks/network_storage.md
@@ -9,14 +9,6 @@ To list all your currently connected network storages, go to **{% my storage tit
You need to update to Home Assistant Operating System 10.2 before you can use this feature.
{% endimportant %}
-{% else %}
-
-{% important %}
-
-You need to make sure you run a supported {% term "Home Assistant Supervised" %} installation with the latest version of the [os-agent](https://github.com/home-assistant/os-agent). Make sure that your supervisor uses [slave bind propagation](https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation) for the data volume.
-
-{% endimportant %}
-
{% endif %}
diff --git a/source/_includes/common-tasks/update.md b/source/_includes/common-tasks/update.md
index 19c6f7cc2dc..bacdb23648f 100644
--- a/source/_includes/common-tasks/update.md
+++ b/source/_includes/common-tasks/update.md
@@ -1,9 +1,12 @@
-Best practice for updating Home Assistant Core:
+#### Prerequisites
1. [Back up your installation](/common-tasks/general/#backups) and store the backup and the [backup emergency kit](/more-info/backup-emergency-kit/) somewhere safe.
- This ensures that you can [restore your installation from backup](/common-tasks/general/#restoring-a-backup) if needed.
2. Check the release notes for backward-incompatible changes on [Home Assistant release notes](/blog/categories/core/). Be sure to check all release notes between the version you are running and the one you are upgrading to. Use the search function in your browser (`CTRL + f` / `CMD + f`) and search for **Backward-incompatible changes**.
-3. To update Home Assistant Core, choose one of the following options.
+
+#### To update Home Assistant Core
+
+To update Home Assistant Core, choose one of the following options.
{% if page.installation == "os" %}
@@ -20,6 +23,10 @@ Best practice for updating Home Assistant Core:
- Go to {% my updates title="**System** > **Updates**" %}.
- Select the update notification.
- Select the cogwheel {% icon "mdi:cog-outline" %}, then set **Visible** to active.
+ 4. Open the notification for the component you want to update.
+ 5. If you want to backup the system first (recommended), enable the backup toggle.
+ 6. Select **Update**.
+ 7. After the update completed, check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
- title: Using the CLI
content: |
@@ -57,6 +64,7 @@ Best practice for updating Home Assistant Core:
{% endtabbed_block %}
+After the update, check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
+
{% endif %}
-4. Check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
diff --git a/source/_includes/custom/news.html b/source/_includes/custom/news.html
index 5610e459f6f..1afa2c24901 100644
--- a/source/_includes/custom/news.html
+++ b/source/_includes/custom/news.html
@@ -1,13 +1,6 @@
-
-
-
-
{% assign releases_post_limit = 2 %}
{% assign blog_post_limit = 4 %}
@@ -37,33 +30,40 @@
-
-
-
{% icon "mdi:newspaper-variant-multiple" %} Recent Blog Posts
-
-
- {% assign current = 0 %}
-
- {% for post in site.posts %}
- {% if post.categories contains "Release-Notes" %}
- {% else %}
- {% assign current = current | plus: 1 %}
-
- {% if current > blog_post_limit %}
- {% break %}
- {% endif %}
-
- {% assign post_date = post.date | date: "%Y-%m-%d" %}
- {% assign post_date_formatted = post_date | date: "%B %d, %Y" %}
- {% assign post.date_formatted = post_date_formatted %}
- -
- {{ post.title }}
- {{ post.date_formatted }}
-
+
+
+
{% icon "mdi:newspaper-variant-multiple" %} Recent Blog Posts
+
+
+ {% assign current = 0 %}
+
+ {% for post in site.posts %}
+ {% if post.categories contains "Release-Notes" %}
+ {% else %}
+ {% assign current = current | plus: 1 %}
+
+ {% if current > blog_post_limit %}
+ {% break %}
{% endif %}
- {% endfor %}
-
-
+
+ {% assign post_date = post.date | date: "%Y-%m-%d" %}
+ {% assign post_date_formatted = post_date | date: "%B %d, %Y" %}
+ {% assign post.date_formatted = post_date_formatted %}
+ -
+ {{ post.title }}
+ {{ post.date_formatted }}
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+
Design Portal {% icon "tabler:external-link" %}
Data Science Portal {% icon "tabler:external-link" %}
Community Forum {% icon "tabler:external-link" %}
+ Creator Network {% icon "tabler:external-link" %}
+ Works With Home Assistant {% icon "tabler:external-link" %}
Reporting issues
- Community Merch Store
System status
diff --git a/source/_integrations/adax.markdown b/source/_integrations/adax.markdown
index 35d3ee3a7c2..503606044e0 100644
--- a/source/_integrations/adax.markdown
+++ b/source/_integrations/adax.markdown
@@ -3,14 +3,17 @@ title: Adax
description: Instructions on how to integrate Adax heater into Home Assistant.
ha_category:
- Climate
+ - Sensor
ha_release: 2021.8
ha_iot_class: Local Polling
ha_codeowners:
- '@danielhiversen'
+ - '@lazytarget'
ha_domain: adax
ha_config_flow: true
ha_platforms:
- climate
+ - sensor
ha_integration_type: integration
---
@@ -41,3 +44,13 @@ You will also need a credential, which you can create in the Adax app:
In the configuration popup you will need the Account ID, and the generated API password (not the account password)
{% include integrations/config_flow.md %}
+
+## Energy monitoring
+
+When using the cloud integration, the Adax integration provides energy monitoring sensors that track the power consumption of your heaters. These sensors are only available when using the cloud connection, as the local integration does not support energy data.
+
+The integration creates the following energy sensors:
+
+- **Individual energy sensors** - One sensor for each Adax heater showing its energy consumption in Wh
+
+The energy sensors use the `total_increasing` state class, making them suitable for use with Home Assistant's energy dashboard to track your heating costs and consumption over time.
diff --git a/source/_integrations/airgradient.markdown b/source/_integrations/airgradient.markdown
index 6bd789f5ce6..f2c0bd03353 100644
--- a/source/_integrations/airgradient.markdown
+++ b/source/_integrations/airgradient.markdown
@@ -27,6 +27,18 @@ ha_zeroconf: true
The AirGradient integration will fetch data from your [AirGradient devices](https://www.airgradient.com/).
AirGradient creates indoor and outdoor air quality monitors that enable you know if the air quality is healthy or not. They measure metrics such as PM2.5, CO2, TVOCs, and NOx. Both the software and hardware are open-source, allowing you to customize or extend the device functionality.
+## Use cases
+
+- Monitor indoor and outdoor air quality.
+- Warn to open windows when CO2 levels are too high.
+- Control ventilation systems based on air quality.
+
+## Supported devices
+
+- AirGradient DIY Air Quality Monitor
+- AirGradient Indoor Air Quality Monitor
+- AirGradient Outdoor Air Quality Monitor
+
{% important %}
In order for the device to be set up or discovered by Home Assistant, the [firmware](https://www.airgradient.com/documentation/firmwares) version should be at least 3.1.1.
{% endimportant %}
@@ -38,7 +50,11 @@ Host:
description: "The IP address or hostname for your AirGradient device."
{% endconfiguration_basic %}
-## Available sensors
+## Supported functionality
+
+Below is a complete overview of the entities this integration provides.
+
+### Available sensors
The integration will fetch data from each device. The following sensors are supported:
@@ -65,7 +81,7 @@ A number of configuration entities are available as sensors to automate with if
- Display temperature unit
- Display brightness
-## Available configuration entities
+### Available configuration entities
The integration provides a few configuration entities to customize the device experience.
The settings are only available when the configuration source is set to local.
@@ -84,6 +100,67 @@ The following entities are supported:
- NOx learning offset
- Total volatile organic compounds learning offset
+### Updates
+
+The AirGradient integration provides an update entity that checks for firmware updates for your AirGradient device.
+To install the update, the device needs to be rebooted.
+
+## Data updates
+
+This integration uses local {% term polling %}, meaning it checks for changes to all entities by regularly communicating with the AirGradient device.
+
+The integration will retrieve data from the device every minute.
+
+The updates for the device are checked once every hour.
+
+## Actions
+
+This integration does not provide additional actions. All actions available
+for this integration are provided by their respective entities.
+
+## Examples
+
+The following examples show how to use the AirGradient integration in Home
+Assistant automations. These examples are just a starting point, and you can
+use them as inspiration to create your own automations.
+
+### Notify when the CO2 level is too high
+
+The following example sends a notification to your mobile device when the CO2 level exceeds 1000 ppm.
+
+{% raw %}
+
+```yaml
+automation:
+ - alias: "Notify when CO2 level is too high"
+ triggers:
+ - trigger: numeric_state
+ entity_id: sensor.airgradient_carbon_dioxide
+ above: 1000
+
+ actions:
+ - action: notify.mobile_app_your_device
+ data:
+ title: "High CO2 Level Alert"
+ message: >
+ The CO2 level is too high at {{ states('sensor.airgradient_carbon_dioxide') }} ppm.
+ Please consider ventilating the room.
+```
+
+{% endraw %}
+
+## Known limitations
+
+The AirGradient integration currently has the following limitations:
+- The update entity is not able to install updates automatically. You will need to reboot the device manually after installing the update.
+
+## Troubleshooting
+
+If you're experiencing issues with your AirGradient integration, try these general troubleshooting steps:
+
+1. Make sure your AirGradient is powered on and properly connected to your home network.
+2. If the integration shows as unavailable, try restarting both your AirGradient and Home Assistant.
+
## Removing the integration
This integration follows standard integration removal, no extra steps are required.
diff --git a/source/_integrations/airthings.markdown b/source/_integrations/airthings.markdown
index f8842ee5af9..16e27c13b6b 100644
--- a/source/_integrations/airthings.markdown
+++ b/source/_integrations/airthings.markdown
@@ -15,6 +15,7 @@ ha_config_flow: true
ha_platforms:
- sensor
ha_integration_type: integration
+ha_dhcp: true
---
Integrates Airthings sensors into Home Assistant.
diff --git a/source/_integrations/alarm_control_panel.markdown b/source/_integrations/alarm_control_panel.markdown
index a5c4810db2e..5ccb8b0a88d 100644
--- a/source/_integrations/alarm_control_panel.markdown
+++ b/source/_integrations/alarm_control_panel.markdown
@@ -12,12 +12,12 @@ ha_integration_type: entity
related:
- docs: /integrations/manual/
title: Manual alarm
- - docs: /integrations/alarm_control_panel.template/
+ - docs: /integrations/template/#alarm-control-panel
title: Template alarm
---
Home Assistant can give you an interface which is similar to a classic alarm system.
-Please see [manual alarm](/integrations/manual) or [template alarm](/integrations/alarm_control_panel.template) for alarm configuration.
+Please see [manual alarm](/integrations/manual) or [template alarm](/integrations/template/#alarm-control-panel) for alarm configuration.
{% include integrations/building_block_integration.md %}
diff --git a/source/_integrations/alarm_control_panel.template.markdown b/source/_integrations/alarm_control_panel.template.markdown
deleted file mode 100644
index 47bc9d9b3f6..00000000000
--- a/source/_integrations/alarm_control_panel.template.markdown
+++ /dev/null
@@ -1,147 +0,0 @@
----
-title: "Template Alarm control panel"
-description: "Instructions on how to integrate template alarm control panels into Home Assistant."
-ha_category:
- - Alarm
- - Helper
-ha_release: 0.105
-ha_iot_class: "Local Push"
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_config_flow: true
-ha_platforms:
- - alarm_control_panel
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` {% term integration %} creates alarm control panels that combine integrations or adds preprocessing logic to actions.
-
-There are several powerful ways to use this {% term integration %}, including grouping existing integrations into a simpler integrations, or adding logic that Home Assistant will execute when accessed.
-
-For example, if you want to expose a true alarm panel to Google Home, Alexa, or HomeKit - but limit its ability to disarm when there's no one home, you can do that using a template.
-
-Another use case could be grouping a series of sensors and services together to represent various "armed" and "disarmed" states and actions.
-
-This can simplify the GUI and make it easier to write automations.
-
-In optimistic mode, the alarm control panel will immediately change state after every command. Otherwise, the alarm control panel will wait for state confirmation from the template. Try to enable it, if experiencing incorrect operation.
-
-{% include integrations/config_flow.md %}
-
-## YAML Configuration
-
-To enable a template alarm control panel in your installation, add the following to your {% term "`configuration.yaml`" %} file.
-{% include integrations/restart_ha_after_config_inclusion.md %}
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-alarm_control_panel:
- - platform: template
- panels:
- safe_alarm_panel:
- value_template: "{{ states('alarm_control_panel.real_alarm') }}"
- arm_away:
- action: alarm_control_panel.alarm_arm_away
- target:
- entity_id: alarm_control_panel.real_alarm
- data:
- code: !secret alarm_code
- arm_home:
- action: alarm_control_panel.alarm_arm_home
- target:
- entity_id: alarm_control_panel.real_alarm
- data:
- code: !secret alarm_code
- disarm:
- - condition: state
- entity_id: device_tracker.paulus
- state: "home"
- - action: alarm_control_panel.alarm_disarm
- target:
- entity_id: alarm_control_panel.real_alarm
- data:
- code: !secret alarm_code
-```
-
-{% endraw %}
-
-{% configuration %}
-panels:
- description: List of your panels.
- required: true
- type: map
- keys:
- alarm_control_panel_name:
- description: The slug of the panel.
- required: true
- type: map
- keys:
- name:
- description: Name to use in the frontend.
- required: false
- type: string
- default: Template Alarm Control Panel
- unique_id:
- description: An ID that uniquely identifies this alarm control panel. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: "Defines a template to set the state of the alarm panel. Only the states `armed_away`, `armed_home`, `armed_night`, `armed_vacation`, `arming`, `disarmed`, `pending`, `triggered` and `unavailable` are used."
- required: false
- type: template
- disarm:
- description: Defines an action to run when the alarm is disarmed.
- required: false
- type: action
- arm_away:
- description: Defines an action to run when the alarm is armed to away mode.
- required: false
- type: action
- arm_home:
- description: Defines an action to run when the alarm is armed to home mode.
- required: false
- type: action
- arm_night:
- description: Defines an action to run when the alarm is armed to night mode.
- required: false
- type: action
- arm_vacation:
- description: Defines an action to run when the alarm is armed to vacation mode.
- required: false
- type: action
- arm_custom_bypass:
- description: Defines an action to run when the alarm is armed to custom bypass mode.
- required: false
- type: action
- trigger:
- description: Defines an action to run when the alarm is triggered.
- required: false
- type: action
- code_arm_required:
- description: If true, the code is required to arm the alarm.
- required: false
- type: boolean
- default: true
- code_format:
- description: One of `number`, `text` or `no_code`. Format for the code used to arm/disarm the alarm.
- required: false
- type: string
- default: number
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of an integration that takes extra time to load, the template alarm control panel may get an `unknown` state during startup. This results in error messages in your log file until that integration has completed loading. If you use `is_state()` function in your template, you can avoid this situation.
-
-For example, you would replace {% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %} with this equivalent that returns `true`/`false` and never gives an unknown result: {% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
diff --git a/source/_integrations/alexa_devices.markdown b/source/_integrations/alexa_devices.markdown
index 3d94cae61fb..2b06005251a 100644
--- a/source/_integrations/alexa_devices.markdown
+++ b/source/_integrations/alexa_devices.markdown
@@ -4,15 +4,17 @@ description: Instructions on how to integrate Alexa Devices into Home Assistant.
ha_category:
- Binary Sensor
- Notify
+ - Switch
ha_release: '2025.6'
ha_domain: alexa_devices
ha_config_flow: true
ha_codeowners:
- '@chemelli74'
-ha_iot_class: Local Polling
+ha_iot_class: Cloud Polling
ha_platforms:
- binary_sensor
- notify
+ - switch
ha_integration_type: hub
ha_quality_scale: bronze
---
@@ -31,7 +33,7 @@ There is support for the following device families within Home Assistant:
- **Amazon Echo Plus**
- **Amazon Echo Show**
- **Amazon Fire TV Stick**
-- **Fire Tablet**
+- **Amazon Fire Tablet**
and all 3rd party that has Alexa capabilities built-in
@@ -113,6 +115,7 @@ The **Alexa Devices** {% term integration %} provides the following entities:
- Binary sensor - main and Bluetooth connectivity
- Notify - Speak and Announce notifications
+- Switch - Do not disturb
## Removing the integration
diff --git a/source/_integrations/aqara.markdown b/source/_integrations/aqara.markdown
index a418c8b7650..6c94d1cef47 100644
--- a/source/_integrations/aqara.markdown
+++ b/source/_integrations/aqara.markdown
@@ -15,10 +15,4 @@ ha_iot_standard: matter
ha_brand: true
---
-[Aqara](https://www.aqara.com/) is a member of the Works with Home Assistant partner program for their Matter products. Aqara is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Aqara Matter devices work locally and integrate seamlessly with the Matter integration in Home Assistant. As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
-
-{% my add_matter_device badge domain=page.ha_domain %}
-
-[Learn more about Matter in Home Assistant.](/integrations/matter/)
\ No newline at end of file
+{% include integrations/wwha.md url="https://www.aqara.com/" %}
diff --git a/source/_integrations/balay.markdown b/source/_integrations/balay.markdown
index 2196a2f82ea..4d28584e8f0 100644
--- a/source/_integrations/balay.markdown
+++ b/source/_integrations/balay.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_zeroconf: true
---
{% include integrations/supported_brand.md %}
diff --git a/source/_integrations/blue_current.markdown b/source/_integrations/blue_current.markdown
index 3510cec4bac..c88b7270063 100644
--- a/source/_integrations/blue_current.markdown
+++ b/source/_integrations/blue_current.markdown
@@ -13,6 +13,7 @@ ha_codeowners:
- '@jtodorova23'
ha_domain: blue_current
ha_platforms:
+ - button
- sensor
ha_integration_type: integration
---
diff --git a/source/_integrations/bluesound.markdown b/source/_integrations/bluesound.markdown
index f62b71ce814..f4b8393ba66 100644
--- a/source/_integrations/bluesound.markdown
+++ b/source/_integrations/bluesound.markdown
@@ -7,8 +7,8 @@ ha_release: 0.51
ha_iot_class: Local Polling
ha_domain: bluesound
ha_platforms:
- - media_player
- button
+ - media_player
ha_codeowners:
- '@thrawnarn'
- '@LouisChrist'
diff --git a/source/_integrations/bosch_alarm.markdown b/source/_integrations/bosch_alarm.markdown
index 1688537a4c0..e580c1e25eb 100644
--- a/source/_integrations/bosch_alarm.markdown
+++ b/source/_integrations/bosch_alarm.markdown
@@ -21,6 +21,7 @@ ha_platforms:
- switch
ha_integration_type: device
ha_quality_scale: bronze
+ha_dhcp: true
---
The **Bosch Alarm Panel** {% term integration %} allows you to connect your [Bosch Alarm Panel](https://www.boschsecurity.com) to Home Assistant to control and monitor your Bosch Alarm Panel.
diff --git a/source/_integrations/comelit.markdown b/source/_integrations/comelit.markdown
index e05e6c339ae..1ba6d2ad627 100644
--- a/source/_integrations/comelit.markdown
+++ b/source/_integrations/comelit.markdown
@@ -26,7 +26,7 @@ ha_platforms:
- sensor
- switch
ha_integration_type: hub
-ha_quality_scale: bronze
+ha_quality_scale: silver
---
The **Comelit SimpleHome** {% term integration %} allows you to control your [Comelit home automation devices](https://comelitgroup.it/installatore/offerta/home-building-automation/).
diff --git a/source/_integrations/constructa.markdown b/source/_integrations/constructa.markdown
index 81324c5b23a..76db3aa534e 100644
--- a/source/_integrations/constructa.markdown
+++ b/source/_integrations/constructa.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_zeroconf: true
---
{% include integrations/supported_brand.md %}
diff --git a/source/_integrations/cover.template.markdown b/source/_integrations/cover.template.markdown
deleted file mode 100644
index c24773e2854..00000000000
--- a/source/_integrations/cover.template.markdown
+++ /dev/null
@@ -1,376 +0,0 @@
----
-title: "Template cover"
-description: "Instructions on how to integrate template covers into Home Assistant."
-ha_category:
- - Cover
- - Helper
-ha_release: 0.48
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - cover
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform can create covers that combine integrations and provides
-the ability to run scripts or invoke actions for each of the open,
-close, stop, position and tilt commands of a cover.
-
-## Configuration
-
-To enable Template Covers in your installation,
-add the following to your {% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-cover:
- - platform: template
- covers:
- garage_door:
- device_class: garage
- friendly_name: "Garage Door"
- value_template: "{{ states('sensor.garage_door')|float > 0 }}"
- open_cover:
- action: script.open_garage_door
- close_cover:
- action: script.close_garage_door
- stop_cover:
- action: script.stop_garage_door
-```
-
-{% endraw %}
-
-{% configuration %}
- covers:
- description: List of your covers.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this cover. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `value_template` and a `position_template`](#combining-value_template-and-position_template) are specified, only `opening` and `closing` are set from the `value_template`. If the template produces a `None` value the state will be set to `unknown`.
- required: false
- type: template
- position_template:
- description: Defines a template to get the position of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current position will be set to `unknown`.
- required: false
- type: template
- icon_template:
- description: Defines a template to specify which icon to use.
- required: false
- type: template
- entity_picture_template:
- description: Defines a template for the entity picture of the cover.
- required: false
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison is not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- device_class:
- description: Sets the [class of the device](/integrations/cover/), changing the device state and icon that is displayed on the frontend.
- required: false
- type: string
- open_cover:
- description: Defines an action to open the cover. If [`open_cover`](#open_cover) is specified, [`close_cover`](#close_cover) must also be specified. At least one of [`open_cover`](#open_cover) and [`set_cover_position`](#set_cover_position) must be specified.
- required: inclusive
- type: action
- close_cover:
- description: Defines an action to close the cover.
- required: inclusive
- type: action
- stop_cover:
- description: Defines an action to stop the cover.
- required: false
- type: action
- set_cover_position:
- description: Defines an action to set to a cover position (between `0` and `100`). The variable `position` will contain the entity's set position.
- required: false
- type: action
- set_cover_tilt_position:
- description: Defines an action to set the tilt of a cover (between `0` and `100`). The variable `tilt` will contain the entity's set tilt position.
- required: false
- type: action
- optimistic:
- description: Force cover position to use [optimistic mode](#optimistic-mode).
- required: false
- type: boolean
- default: false
- tilt_optimistic:
- description: Force cover tilt position to use [optimistic mode](#optimistic-mode).
- required: false
- type: boolean
- default: false
- tilt_template:
- description: Defines a template to get the tilt state of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current tilt state will be set to `unknown`.
- required: false
- type: template
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of a platform that takes extra time to load, the
-Template Cover may get an `unknown` state during startup. This results in error
-messages in your log file until that platform has completed loading.
-If you use `is_state()` function in your template, you can avoid this situation.
-For example, you would replace
-{% raw %}`{{ states.cover.source.state == 'open' }}`{% endraw %}
-with this equivalent that returns `true`/`false` and never gives an unknown
-result:
-{% raw %}`{{ is_state('cover.source', 'open') }}`{% endraw %}
-
-## Optimistic mode
-
-In optimistic mode, the cover position state is maintained internally. This mode
-is automatically enabled if neither [`value_template`](#value_template) or
-[`position_template`](#position_template) are specified. Note that this is
-unlikely to be very reliable without some feedback mechanism, since there is
-otherwise no way to know if the cover is moving properly. The cover can be
-forced into optimistic mode by using the [`optimistic`](#optimistic) attribute.
-There is an equivalent mode for `tilt_position` that is enabled when
-[`tilt_template`](#tilt_template) is not specified or when the
-[`tilt_optimistic`](#tilt_optimistic) attribute is used.
-
-## Combining `value_template` and `position_template`
-
-If both a [`value_template`](#value_template) and a [`position_template`](#position_template) are specified only `opening` and `closing` states are set directly from the `value_template`, the `open` and `closed` states will instead be derived from the cover position.
-
-| value_template output | result |
-| --------------------- | ------------------------------------ |
-| open | state defined by `position_template` |
-| closed | state defined by `position_template` |
-| true | state defined by `position_template` |
-| false | state defined by `position_template` |
-| opening | state set to `opening` |
-| closing | state set to `closing` |
-| | No change of state or position |
-
-## Examples
-
-In this section you will find some real-life examples of how to use this cover.
-
-### Garage door
-
-This example converts a garage door with a controllable switch and position
-sensor into a cover. The condition check is optional, but suggested if you
-use the same switch to open and close the garage.
-
-{% raw %}
-
-```yaml
-cover:
- - platform: template
- covers:
- garage_door:
- device_class: garage
- friendly_name: "Garage Door"
- position_template: "{{ states('sensor.garage_door') }}"
- open_cover:
- - condition: state
- entity_id: sensor.garage_door
- state: "off"
- - action: switch.turn_on
- target:
- entity_id: switch.garage_door
- close_cover:
- - condition: state
- entity_id: sensor.garage_door
- state: "on"
- - action: switch.turn_off
- target:
- entity_id: switch.garage_door
- stop_cover:
- action: switch.turn_on
- target:
- entity_id: switch.garage_door
- icon_template: >-
- {% if states('sensor.garage_door')|float > 0 %}
- mdi:garage-open
- {% else %}
- mdi:garage
- {% endif %}
-```
-
-{% endraw %}
-
-### Multiple covers
-
-This example allows you to control two or more covers at once.
-
-{% raw %}
-
-```yaml
-homeassistant:
- customize:
- cover_group:
- assumed_state: true
-
-cover:
- - platform: template
- covers:
- cover_group:
- friendly_name: "Cover Group"
- open_cover:
- action: script.cover_group
- data:
- modus: "open"
- close_cover:
- action: script.cover_group
- data:
- modus: "close"
- stop_cover:
- action: script.cover_group
- data:
- modus: "stop"
- set_cover_position:
- action: script.cover_group_position
- data:
- position: "{{position}}"
- set_cover_tilt_position:
- action: script.cover_group_tilt_position
- data:
- tilt: "{{tilt}}"
- value_template: "{{is_state('sensor.cover_group', 'open')}}"
- icon_template: >-
- {% if is_state('sensor.cover_group', 'open') %}
- mdi:window-open
- {% else %}
- mdi:window-closed
- {% endif %}
-
-sensor:
- - platform: template
- sensors:
- cover_group:
- value_template: >-
- {% if is_state('cover.bedroom', 'open') %}
- open
- {% elif is_state('cover.livingroom', 'open') %}
- open
- {% else %}
- closed
- {% endif %}
-
-script:
- cover_group:
- sequence:
- - action: "cover.{{modus}}_cover"
- target:
- entity_id:
- - cover.bedroom
- - cover.livingroom
- cover_group_position:
- sequence:
- - action: cover.set_cover_position
- target:
- entity_id:
- - cover.bedroom
- - cover.livingroom
- data:
- position: "{{position}}"
-
-automation:
- - alias: "Close covers at night"
- triggers:
- - trigger: sun
- event: sunset
- offset: "+00:30:00"
- actions:
- - action: cover.set_cover_position
- target:
- entity_id: cover.cover_group
- data:
- position: 25
-```
-
-{% endraw %}
-
-### Change the icon
-
-This example shows how to change the icon based on the cover state.
-
-{% raw %}
-
-```yaml
-cover:
- - platform: template
- covers:
- cover_group:
- friendly_name: "Cover Group"
- open_cover:
- action: script.cover_group
- data:
- modus: "open"
- close_cover:
- action: script.cover_group
- data:
- modus: "close"
- stop_cover:
- action: script.cover_group
- data:
- modus: "stop"
- value_template: "{{is_state('sensor.cover_group', 'open')}}"
- icon_template: >-
- {% if is_state('sensor.cover_group', 'open') %}
- mdi:window-open
- {% else %}
- mdi:window-closed
- {% endif %}
-```
-
-{% endraw %}
-
-### Change the entity picture
-
-This example shows how to change the entity picture based on the cover state.
-
-{% raw %}
-
-```yaml
-cover:
- - platform: template
- covers:
- cover_group:
- friendly_name: "Cover Group"
- open_cover:
- action: script.cover_group
- data:
- modus: "open"
- close_cover:
- action: script.cover_group
- data:
- modus: "close"
- stop_cover:
- action: script.cover_group
- data:
- modus: "stop"
- value_template: "{{is_state('sensor.cover_group', 'open')}}"
- entity_picture_template: >-
- {% if is_state('sensor.cover_group', 'open') %}
- /local/cover-open.png
- {% else %}
- /local/cover-closed.png
- {% endif %}
-```
-
-{% endraw %}
diff --git a/source/_integrations/eafm.md b/source/_integrations/eafm.markdown
similarity index 97%
rename from source/_integrations/eafm.md
rename to source/_integrations/eafm.markdown
index 9e308858fb1..6e9e99e0d32 100644
--- a/source/_integrations/eafm.md
+++ b/source/_integrations/eafm.markdown
@@ -1,27 +1,27 @@
----
-title: UK Environment Agency Flood Monitoring
-description: Monitor nearby water levels and be prepared for flooding with the UK Environment Agency API integration.
-ha_category:
- - Sensor
-ha_release: 0.115
-ha_iot_class: Cloud Polling
-ha_config_flow: true
-ha_codeowners:
- - '@Jc2k'
----
-
-The `eafm` integration offers integration with the [UK Environment Agency Flood Monitoring](https://environment.data.gov.uk/flood-monitoring/doc/reference) API to provide sensors for nearby water levels. Combined with Home Assistant notifications, you could give yourself a warning if a nearby river was likely to flood your local cycle path or the only road out of your village.
-
-{% important %}
-
-The UK Environment Agency Flood Monitoring only provides data for England - Northern Ireland, Scotland and Wales have their own flood agencies.
-
-{% endimportant %}
-
-## Configuration
-
-Home Assistant offers the flood monitoring integration through **Settings** -> **Devices & services** -> **Environment Agency Flood Gauges**.
-
-You will be prompted to select a monitoring station. You can find the name of nearby monitoring stations on the Flood information service [website](https://check-for-flooding.service.gov.uk/river-and-sea-levels).
-
-Sensors for that monitoring station should then appear in your Home Assistant instance.
+---
+title: UK Environment Agency Flood Monitoring
+description: Monitor nearby water levels and be prepared for flooding with the UK Environment Agency API integration.
+ha_category:
+ - Sensor
+ha_release: 0.115
+ha_iot_class: Cloud Polling
+ha_config_flow: true
+ha_codeowners:
+ - '@Jc2k'
+---
+
+The `eafm` integration offers integration with the [UK Environment Agency Flood Monitoring](https://environment.data.gov.uk/flood-monitoring/doc/reference) API to provide sensors for nearby water levels. Combined with Home Assistant notifications, you could give yourself a warning if a nearby river was likely to flood your local cycle path or the only road out of your village.
+
+{% important %}
+
+The UK Environment Agency Flood Monitoring only provides data for England - Northern Ireland, Scotland and Wales have their own flood agencies.
+
+{% endimportant %}
+
+## Configuration
+
+Home Assistant offers the flood monitoring integration through **Settings** -> **Devices & services** -> **Environment Agency Flood Gauges**.
+
+You will be prompted to select a monitoring station. You can find the name of nearby monitoring stations on the Flood information service [website](https://check-for-flooding.service.gov.uk/river-and-sea-levels).
+
+Sensors for that monitoring station should then appear in your Home Assistant instance.
diff --git a/source/_integrations/eheimdigital.markdown b/source/_integrations/eheimdigital.markdown
index 66b5e2cc6b9..0a99de2a4f8 100644
--- a/source/_integrations/eheimdigital.markdown
+++ b/source/_integrations/eheimdigital.markdown
@@ -18,6 +18,7 @@ ha_domain: eheimdigital
ha_integration_type: hub
ha_platforms:
- climate
+ - diagnostics
- light
- number
- select
diff --git a/source/_integrations/esphome.markdown b/source/_integrations/esphome.markdown
index 112f5f03c5b..c0228670388 100644
--- a/source/_integrations/esphome.markdown
+++ b/source/_integrations/esphome.markdown
@@ -49,11 +49,12 @@ ha_quality_scale: platinum
## Overview
-This integration allows [ESPHome](https://esphome.io) devices to connect directly to Home Assistant with the [native ESPHome API](https://esphome.io/components/api.html).
+The **ESPHome** {% term integration %} allows [ESPHome](https://esphome.io) devices to connect directly to Home Assistant with the [native ESPHome API](https://esphome.io/components/api.html).
ESPHome is a firmware generator and configuration system that enables the transformation of microcontrollers into fully customizable smart home devices. Using a simple YAML configuration file, ESPHome allows users to define hardware components like sensors, actuators, and peripherals. These configurations are then compiled into custom firmware that can be flashed onto the target device.
-### Key Features
+### Key features
+
- **YAML Configuration**: Specify hardware components, sensors, actuators, and integrations using a clean and straightforward YAML syntax.
- **Custom Firmware Generation**: ESPHome compiles the provided configuration into a highly optimized, device-specific firmware image that is ready to be flashed onto microcontrollers.
- **Seamless Integration**: After flashing, ESPHome devices can integrate seamlessly with Home Assistant using the ESPHome native API. This documentation page focuses on the [native API](https://esphome.io/components/api.html), which allows devices to communicate directly with Home Assistant for real-time automation and monitoring. For other integrations, such as MQTT or HTTP, please refer to the relevant sections of the [ESPHome documentation](https://esphome.io/).
@@ -95,12 +96,6 @@ password:
For more information, see the [ESPHome Native API Component documentation](https://esphome.io/components/api.html).
-## Removing the integration
-
-This integration follows the standard integration removal process; no extra steps are required.
-
-{% include integrations/remove_device_service.md %}
-
{% include integrations/option_flow.md %}
These options are disabled by default and not required—only set them if specifically needed.
@@ -114,25 +109,26 @@ Subscribe to logs from the device:
## Supported devices
-The ESPHome integration works with devices that run ESPHome firmware and expose their functionality through the [native ESPHome API](https://esphome.io/components/api.html). This API is designed for tight, efficient integration with Home Assistant, enabling ESPHome devices to push updates directly to Home Assistant in **near real time**.
+The ESPHome {% term integration %} works with devices that run ESPHome firmware and expose their functionality through the [native ESPHome API](https://esphome.io/components/api.html). This API is designed for tight, efficient integration with Home Assistant, enabling ESPHome devices to push updates directly to Home Assistant in **near real time**.
## Updating data
Rather than polling for sensor values or device states, Home Assistant maintains a persistent connection to each ESPHome device using the native API. This allows state changes—such as a temperature sensor update, a button press, or a binary sensor trigger—to be sent immediately as they happen, reducing latency and improving responsiveness in automations.
-### Additional Technical Details
+### Additional technical details
+
- **Efficient Communication Protocol**: ESPHome uses a lightweight, bi-directional protocol over TCP, optimized for microcontrollers. This protocol is implemented in [aioesphomeapi](https://github.com/esphome/aioesphomeapi), the async Python library used by Home Assistant to handle real-time communication with ESPHome devices. It enables low-latency updates and near instant command execution.
- **Automatic Reconnection**: Home Assistant maintains a persistent connection to each ESPHome device and will automatically attempt to reconnect if the connection is lost. This includes support for "sleepy" or battery-powered devices that periodically wake from deep sleep. When such a device comes online, Home Assistant quickly re-establishes the connection—especially when **mDNS** (Multicast DNS) is available—allowing the device to be discovered and connected without requiring static IPs or manual configuration.
This real-time behavior enables fast, reactive automations and a smooth user experience compared to traditional polling-based integrations.
-## Supported Functionality
+## Supported functionality
### Entities
The available entities depend on the components defined in the ESPHome YAML configuration for each device. These entities are exposed through the [Native API Component](https://esphome.io/components/api.html).
-### Firing Events on the Home Assistant Event Bus
+### Firing events on the Home Assistant event bus
When using the native API with Home Assistant, you can trigger events on the Home Assistant event bus directly from ESPHome. For more details, see the [homeassistant.event Action](https://esphome.io/components/api.html#homeassistant-event-action).
@@ -140,15 +136,15 @@ When using the native API with Home Assistant, you can trigger events on the Hom
Each device can define Home Assistant Actions based on its ESPHome YAML configuration. For more information, refer to the [Actions](https://esphome.io/components/api.html#actions) section in the [Native API Component](https://esphome.io/components/api.html) documentation.
-### Retrieving Data from Home Assistant
+### Retrieving data from Home Assistant
ESPHome can retrieve the state of Home Assistant entities using the [Native API](https://esphome.io/components/api.html) with [User-Defined Actions](https://esphome.io/components/api.html#user-defined-actions).
-### Home Assistant Actions
+### Home Assistant actions
ESPHome devices can call any [Home Assistant Action](https://esphome.io/components/api.html#homeassistant-service-action). This feature is not enabled by default for newly added devices but can be enabled through the options flow on a per-device basis.
-### Tag Scanning Support
+### Tag scanning support
The [Native API Component](https://esphome.io/components/api.html) also supports sending tag scan events to Home Assistant. See the [homeassistant.tag_scanned Action](https://esphome.io/components/api.html#homeassistant-tag-scanned-action) for more information.
@@ -184,18 +180,20 @@ The entity will be named `livingroomdesk Temperature` and will default to having
## Troubleshooting
-### Viewing Live Logs
+### Viewing live logs
To troubleshoot your ESPHome devices, you can easily view live logs, whether you're using the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon) or the **ESPHome CLI**. The logs contain detailed information such as Wi-Fi connection status, errors, and debug messages, which can help you identify and resolve issues with your device.
#### Using the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon)
+
1. In the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon) add-on, find the device you're working with.
2. Click the **LOGS** button to open the log view.
#### Using the **ESPHome CLI**
+
If you're using the **ESPHome CLI**, follow the instructions for the [logs Command](https://esphome.io/guides/cli.html#logs-command) to access the logs.
-### Obtaining Logs from the Device
+### Obtaining logs from the device
If you want the device to send logs without requiring you to be actively monitoring, follow these steps:
@@ -216,7 +214,7 @@ If you want the device to send logs without requiring you to be actively monitor
This integration supports reconfiguration, allowing you to make changes—such as updating the IP address—even after a device has already been set up.
-### Name Conflict Resolution
+### Name conflict resolution
If Home Assistant detects multiple devices with the same [**name**](https://esphome.io/components/esphome.html#configuration-variables), it will automatically initiate **Name Conflict Resolution**. This process is designed to help you seamlessly replace a failed or retired device with new hardware, while preserving your existing configuration if desired.
@@ -232,7 +230,7 @@ If you’re using the same YAML file on the new device, choose **Migrate**. If i
---
-### Requirements for Name Conflict Resolution
+### Requirements for name conflict resolution
To trigger Name Conflict Resolution, all of the following must be true:
@@ -242,7 +240,7 @@ To trigger Name Conflict Resolution, all of the following must be true:
---
-### How to Trigger Name Conflict Resolution
+### How to trigger name conflict resolution
You can trigger Name Conflict Resolution in several ways:
@@ -251,8 +249,14 @@ You can trigger Name Conflict Resolution in several ways:
- Configuring a **newly discovered device** that uses the same name.
- **Manually adding** a device with the same name via the integration setup.
-## Known Limitations
+## Known limitations
Each ESPHome device must have a **unique name**. This name is important for mDNS announcements, ensuring that the device can be properly discovered, quickly reconnected when it comes online or wakes from deep sleep (for devices that support deep sleep), and correctly linked to the [**ESPHome Device Builder Add-on**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome&repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon). It's also crucial for **DHCP discovery** if mDNS is not available.
Using duplicate names can lead to connection issues, failed discovery, and unexpected behavior with both the integration and the add-on.
+
+## Removing the integration
+
+This integration follows the standard integration removal process; no extra steps are required.
+
+{% include integrations/remove_device_service.md %}
\ No newline at end of file
diff --git a/source/_integrations/eve.markdown b/source/_integrations/eve.markdown
index c3fb407b6af..da9061ac325 100644
--- a/source/_integrations/eve.markdown
+++ b/source/_integrations/eve.markdown
@@ -13,15 +13,11 @@ ha_platforms:
- sensor
ha_iot_standard: matter
ha_brand: true
+works_with:
+ - matter
---
-[Eve](https://www.evehome.com/) is a member of the Works with Home Assistant partner program for their Matter products. Eve is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Eve Matter devices work locally and integrate seamlessly with the Matter integration in Home Assistant. As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
-
-{% my add_matter_device badge domain=page.ha_domain %}
-
-[Learn more about Matter in Home Assistant.](/integrations/matter/)
+{% include integrations/wwha.md url="https://www.evehome.com/" %}
The following devices are supported:
diff --git a/source/_integrations/ezviz.markdown b/source/_integrations/ezviz.markdown
index ee803638997..0d5d817328c 100644
--- a/source/_integrations/ezviz.markdown
+++ b/source/_integrations/ezviz.markdown
@@ -9,7 +9,6 @@ ha_iot_class: Cloud Polling
ha_domain: ezviz
ha_codeowners:
- '@RenierM26'
- - '@baqs'
ha_config_flow: true
ha_platforms:
- alarm_control_panel
diff --git a/source/_integrations/fan.template.markdown b/source/_integrations/fan.template.markdown
deleted file mode 100644
index b2d4caa0871..00000000000
--- a/source/_integrations/fan.template.markdown
+++ /dev/null
@@ -1,266 +0,0 @@
----
-title: "Template fan"
-description: "Instructions how to setup the template fans within Home Assistant."
-ha_category:
- - Fan
- - Helper
-ha_release: 0.69
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - fan
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The **Template** {% term integration %} creates fans that combine integrations and provides the
-ability to run scripts or invoke actions for each of the `turn_on`, `turn_off`, `set_percentage`,
-`set_preset_mode`, `set_oscillating`, and `set_direction` commands of a fan.
-
-## Configuration
-
-To enable template fans in your installation, add the following to your
-{% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-fan:
- - platform: template
- fans:
- bedroom_fan:
- friendly_name: "Bedroom fan"
- value_template: "{{ states('input_boolean.state') }}"
- percentage_template: "{{ states('input_number.percentage') }}"
- preset_mode_template: "{{ states('input_select.preset_mode') }}"
- oscillating_template: "{{ states('input_select.osc') }}"
- direction_template: "{{ states('input_select.direction') }}"
- turn_on:
- action: script.fan_on
- turn_off:
- action: script.fan_off
- set_percentage:
- action: script.fans_set_speed
- data:
- percentage: "{{ percentage }}"
- set_preset_mode:
- action: script.fans_set_preset_mode
- data:
- preset_mode: "{{ preset_mode }}"
- set_oscillating:
- action: script.fan_oscillating
- data:
- oscillating: "{{ oscillating }}"
- set_direction:
- action: script.fan_direction
- data:
- direction: "{{ direction }}"
- speed_count: 6
- preset_modes:
- - 'auto'
- - 'smart'
- - 'whoosh'
-```
-
-{% endraw %}
-
-{% configuration %}
- fans:
- description: List of your fans.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this fan. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: "Defines a template to get the state of the fan. Valid values: `on`, `off`"
- required: true
- type: template
- percentage_template:
- description: Defines a template to get the speed percentage of the fan.
- required: false
- type: template
- preset_mode_template:
- description: Defines a template to get the preset mode of the fan.
- required: false
- type: template
- oscillating_template:
- description: "Defines a template to get the osc state of the fan. Valid values: `true`, `false`"
- required: false
- type: template
- direction_template:
- description: "Defines a template to get the direction of the fan. Valid values: `forward`, `reverse`"
- required: false
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- turn_on:
- description: Defines an action to run when the fan is turned on.
- required: true
- type: action
- turn_off:
- description: Defines an action to run when the fan is turned off.
- required: true
- type: action
- set_percentage:
- description: Defines an action to run when the fan is given a speed percentage command.
- required: false
- type: action
- set_preset_mode:
- description: Defines an action to run when the fan is given a preset command.
- required: false
- type: action
- set_oscillating:
- description: Defines an action to run when the fan is given an osc state command.
- required: false
- type: action
- set_direction:
- description: Defines an action to run when the fan is given a direction command.
- required: false
- type: action
- preset_modes:
- description: List of preset modes the fan is capable of. This is an arbitrary list of strings and must not contain any speeds.
- required: false
- type: [string, list]
- default: []
- speed_count:
- description: The number of speeds the fan supports. Used to calculate the percentage step for the `fan.increase_speed` and `fan.decrease_speed` actions.
- required: false
- type: integer
- default: 100
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Converting from speeds to percentage
-
-When converting a fan with 3 speeds from the old fan entity model, the following percentages can be used:
-
-0 - `off`
-33 - `low`
-66 - `medium`
-100 - `high`
-
-## Examples
-
-### Helper fan
-
-This example uses an input_boolean and an input_number to mimic a fan, and
-the example shows multiple actions for `set_percentage`.
-
-{% raw %}
-
-```yaml
-fan:
- - platform: template
- fans:
- helper_fan:
- friendly_name: "Helper Fan"
- value_template: "{{ states('input_boolean.state') }}"
- turn_on:
- - action: input_boolean.turn_on
- target:
- entity_id: input_boolean.state
- turn_off:
- - action: input_boolean.turn_off
- target:
- entity_id: input_boolean.state
- percentage_template: >
- {{ states('input_number.percentage') if is_state('input_boolean.state', 'on') else 0 }}
- speed_count: 6
- set_percentage:
- - action: input_boolean.turn_{{ 'on' if percentage > 0 else 'off' }}
- target:
- entity_id: input_boolean.state
- - action: input_number.set_value
- target:
- entity_id: input_number.percentage
- data:
- value: "{{ percentage }}"
-```
-
-{% endraw %}
-
-### Preset modes fan
-
-This example uses an existing fan with only a percentage. It extends the
-percentage value into useable preset modes without a helper entity.
-
-{% raw %}
-
-```yaml
-fan:
- - platform: template
- fans:
- preset_mode_fan:
- friendly_name: "Preset Mode Fan Example"
- value_template: "{{ states('fan.percentage_fan') }}"
- turn_on:
- - action: fan.turn_on
- target:
- entity_id: fan.percentage_fan
- turn_off:
- - action: fan.turn_off
- target:
- entity_id: fan.percentage_fan
- percentage_template: >
- {{ state_attr('fan.percentage_fan', 'percentage') }}
- speed_count: 3
- set_percentage:
- - action: fan.set_percentage
- target:
- entity_id: fan.percentage_fan
- data:
- percentage: "{{ percentage }}"
- preset_modes:
- - "off"
- - "low"
- - "medium"
- - "high"
- preset_mode_template: >
- {% if is_state('fan.percentage_fan', 'on') %}
- {% if state_attr('fan.percentage_fan', 'percentage') == 100 %}
- high
- {% elif state_attr('fan.percentage_fan', 'percentage') == 66 %}
- medium
- {% else %}
- low
- {% endif %}
- {% else %}
- off
- {% endif %}
- set_preset_mode:
- - action: fan.set_percentage
- target:
- entity_id: fan.percentage_fan
- data:
- percentage: >-
- {% if preset_mode == 'high' %}
- 100
- {% elif preset_mode == 'medium' %}
- 66
- {% elif preset_mode == 'low' %}
- 33
- {% else %}
- 0
- {% endif %}
-```
-
-{% endraw %}
diff --git a/source/_integrations/gaggenau.markdown b/source/_integrations/gaggenau.markdown
index 4e9182b5dfc..e8d8bcb86b5 100644
--- a/source/_integrations/gaggenau.markdown
+++ b/source/_integrations/gaggenau.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_zeroconf: true
---
{% include integrations/supported_brand.md %}
diff --git a/source/_integrations/govee_ble.markdown b/source/_integrations/govee_ble.markdown
index cbb0babb24c..8e76801b033 100644
--- a/source/_integrations/govee_ble.markdown
+++ b/source/_integrations/govee_ble.markdown
@@ -32,7 +32,7 @@ The Govee BLE integration will automatically discover devices once the [Bluetoot
- H5071 Hygrometer Thermometer
- H5072 Hygrometer Thermometer
- H5074 Hygrometer Thermometer (Active scans required)
-- [H5075 Bluetooth Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-bluetooth-hygrometer-thermometer-h5075)
+- [H5075 Bluetooth Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-bluetooth-hygrometer-thermometer-h5075) (Active scans required)
- [H5100 Hygrometer Thermometer](https://us.govee.com/collections/thermo-hydrometer/products/govee-h5100-mini-hygrometer-thermometer-sensors)
- H5101 Hygrometer Thermometer
- H5102 Hygrometer Thermometer
@@ -49,6 +49,7 @@ The Govee BLE integration will automatically discover devices once the [Bluetoot
- H5125 2 Button Switch
- H5126 6 Button Switch
- H5127 Presence Sensor
+- [H5129 Hygrometer Thermometer](https://us.govee.com/products/wi-fi-temperature-humidity-sensor) (Active scans required)
- H5130 Pressure Sensor
- [H5177/5178 Bluetooth Thermo-Hygrometer](https://us.govee.com/collections/thermo-hydrometer/products/bluetooth-thermo-hygrometer)
- H5174 Hygrometer Thermometer
diff --git a/source/_integrations/growatt_server.markdown b/source/_integrations/growatt_server.markdown
index 192db9e3ed7..619cd891d6e 100644
--- a/source/_integrations/growatt_server.markdown
+++ b/source/_integrations/growatt_server.markdown
@@ -24,4 +24,9 @@ Users keen to explore all current supported servers and configuration possibilit
Once integrated, the sensor logs into the user's Growatt account and accesses the first "Plant." It then retrieves the inverters associated with this plant and generates sensors for these inverters, as well as overall plant sensors.
+## Prerequisites
+
+- Growatt account
+- Login credentials to that Growatt account, you will need them during setup of the integration
+
{% include integrations/config_flow.md %}
diff --git a/source/_integrations/home_connect.markdown b/source/_integrations/home_connect.markdown
index e9d3389001d..0e66fd0d1cb 100644
--- a/source/_integrations/home_connect.markdown
+++ b/source/_integrations/home_connect.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- time
ha_integration_type: integration
ha_zeroconf: true
+ha_dhcp: true
---
The Home Connect integration allows users to integrate their home appliances supporting the Home Connect standard for Bosch and Siemens using the [official cloud API](https://developer.home-connect.com).
@@ -725,7 +726,7 @@ Both entities can use these options, but the availability of these will depend o
### Sensor
-{% details "List of binary sensors" %}
+{% details "List of sensors" %}
- **Finish time**:
- **Description**: Represents the time when the program will end.
diff --git a/source/_integrations/homee.markdown b/source/_integrations/homee.markdown
index ca693c821c3..8faee60be19 100644
--- a/source/_integrations/homee.markdown
+++ b/source/_integrations/homee.markdown
@@ -10,7 +10,7 @@ ha_codeowners:
- '@Taraman17'
ha_domain: homee
ha_platforms:
- - alarm-control-panel
+ - alarm_control_panel
- binary_sensor
- button
- climate
diff --git a/source/_integrations/immich.markdown b/source/_integrations/immich.markdown
index 31b25df1c47..ff1548a84a2 100644
--- a/source/_integrations/immich.markdown
+++ b/source/_integrations/immich.markdown
@@ -14,7 +14,8 @@ ha_platforms:
- sensor
ha_codeowners:
- '@mib1185'
-ha_integration_type: service
+ha_integration_type: integration
+ha_quality_scale: silver
---
This integration allows adding an [Immich](https://immich.app/) user account to Home Assistant.
diff --git a/source/_integrations/ipp.md b/source/_integrations/ipp.markdown
similarity index 97%
rename from source/_integrations/ipp.md
rename to source/_integrations/ipp.markdown
index 6f0cb9a41c3..a341df7efd8 100644
--- a/source/_integrations/ipp.md
+++ b/source/_integrations/ipp.markdown
@@ -1,18 +1,18 @@
----
-title: Internet Printing Protocol (IPP)
-description: Instructions on how to integrate printers that support the Internet Printing Protocol (IPP) into Home Assistant.
-ha_category:
- - System monitor
-ha_release: 0.108
-ha_iot_class: Local Polling
-ha_config_flow: true
-ha_codeowners:
- - '@ctalkington'
-ha_domain: ipp
----
-
-The `Internet Printing Protocol (IPP)` integration allows you to read current data from your networked printer that supports the [Internet Printing Protocol](https://www.pwg.org/ipp/everywhere.html).
-
-It provides information about the printer's state and remaining ink levels.
-
-{% include integrations/config_flow.md %}
+---
+title: Internet Printing Protocol (IPP)
+description: Instructions on how to integrate printers that support the Internet Printing Protocol (IPP) into Home Assistant.
+ha_category:
+ - System monitor
+ha_release: 0.108
+ha_iot_class: Local Polling
+ha_config_flow: true
+ha_codeowners:
+ - '@ctalkington'
+ha_domain: ipp
+---
+
+The `Internet Printing Protocol (IPP)` integration allows you to read current data from your networked printer that supports the [Internet Printing Protocol](https://www.pwg.org/ipp/everywhere.html).
+
+It provides information about the printer's state and remaining ink levels.
+
+{% include integrations/config_flow.md %}
diff --git a/source/_integrations/jasco.markdown b/source/_integrations/jasco.markdown
index 474134d852c..d60a862a338 100644
--- a/source/_integrations/jasco.markdown
+++ b/source/_integrations/jasco.markdown
@@ -17,10 +17,4 @@ ha_iot_standard: zwave
ha_brand: true
---
-[Jasco](https://byjasco.com/) is a member of the Works with Home Assistant partner program for their Z-Wave products. Jasco is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Jasco Z-Wave devices work locally and integrate seamlessly with the Z-Wave integration in Home Assistant (Z-Wave stick required). As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
-
-{% my add_zwave_device badge domain=page.ha_domain %}
-
-[Learn more about Z-Wave in Home Assistant.](/integrations/zwave_js/)
\ No newline at end of file
+{% include integrations/wwha.md url="https://byjasco.com/" %}
diff --git a/source/_integrations/jewish_calendar.markdown b/source/_integrations/jewish_calendar.markdown
index 1593fe0bc82..97f12db4f95 100644
--- a/source/_integrations/jewish_calendar.markdown
+++ b/source/_integrations/jewish_calendar.markdown
@@ -10,6 +10,7 @@ ha_codeowners:
ha_domain: jewish_calendar
ha_platforms:
- binary_sensor
+ - diagnostics
- sensor
ha_integration_type: integration
ha_config_flow: true
diff --git a/source/_integrations/knocki.markdown b/source/_integrations/knocki.markdown
index a10add6610f..520f7074557 100644
--- a/source/_integrations/knocki.markdown
+++ b/source/_integrations/knocki.markdown
@@ -14,6 +14,7 @@ ha_domain: knocki
ha_platforms:
- event
ha_integration_type: hub
+ha_dhcp: true
---
The **Knocki** {% term integration %} allows you to trigger your favorite automations simply by tapping custom patterns (such as triple taps) on ordinary surfaces.
diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown
index 3842ebfbfaf..386b2e5f3e2 100644
--- a/source/_integrations/knx.markdown
+++ b/source/_integrations/knx.markdown
@@ -555,7 +555,7 @@ address:
required: true
type: [string, list]
remove:
- description: If `True` the group address will be removed.
+ description: If `true` the group address will be removed.
required: false
type: boolean
default: false
@@ -571,7 +571,7 @@ The `knx.exposure_register` action can be used to register (or unregister) expos
{% configuration %}
remove:
- description: In addition to the configuration variables of [expose](#exposing-entity-states-entity-attributes-or-time-to-knx-bus) `remove` set to `True` can be used to remove exposures. Only `address` is required for removal.
+ description: In addition to the configuration variables of [expose](#exposing-entity-states-entity-attributes-or-time-to-knx-bus) `remove` set to `true` can be used to remove exposures. Only `address` is required for removal.
required: false
type: boolean
default: false
@@ -1279,7 +1279,7 @@ state_address:
required: false
type: [string, list]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -1346,7 +1346,7 @@ state_address:
required: false
type: [string, list]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -1750,7 +1750,7 @@ type:
required: true
type: [string, integer]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -1883,7 +1883,7 @@ options:
required: true
type: integer
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -2219,7 +2219,7 @@ invert:
type: boolean
default: false
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -2282,7 +2282,7 @@ type:
type: [string, integer]
default: latin_1
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
@@ -2335,7 +2335,7 @@ state_address:
required: false
type: [string, list]
respond_to_read:
- description: Respond to GroupValueRead telegrams received to the configured `address`.
+ description: If `true`, the entity will respond to GroupValueRead telegrams received on the configured `address` by sending a GroupValueResponse to the same `address`. This is typically used when Home Assistant acts as the state provider for the KNX bus. In such cases, only `address` is configured, and `state_address` is not set. Read-requests to passive or state addresses don't trigger responses.
required: false
type: boolean
default: false
diff --git a/source/_integrations/lcn.markdown b/source/_integrations/lcn.markdown
index 77ee7de26b6..4c27dc3cd5e 100644
--- a/source/_integrations/lcn.markdown
+++ b/source/_integrations/lcn.markdown
@@ -39,6 +39,27 @@ The `lcn` integration allows connections to more than one hardware coupler. For
{% include integrations/config_flow.md %}
+To set up the integration, you need to provide the following information:
+
+{% configuration_basic %}
+Name:
+ description: "Name to identify the integration entry"
+IP address:
+ description: "IP address or hostname of the PCHK server"
+Port:
+ description: "Port used by the PCHK server"
+Username:
+ description: "Username for authorization on the PCHK server"
+Password:
+ description: "Password for authorization on the PCHK server"
+Segment coupler scan attempts:
+ description: "Number of attempts to find a segment coupler in your installation. Increase this number, if not all segment couplers are identified correctly. If no segment coupler is in your installation, leave this number at 0."
+Dimming mode:
+ description: "The number of steps used for dimming outputs of all LCN modules. This setting is system-specific and depends on the capabilities of the installed LCN modules."
+Request acknowledgement from modules:
+ description: "LCN modules can transmit a confirmation message for received commands. Commands are resent if this confirmation is not received. However, the activation of acknowledgements increases the bus traffic, which can lead to message losses if there are many modules in the installation."
+{% endconfiguration_basic %}
+
## Supported device types
There is currently support for the following device types within Home Assistant:
diff --git a/source/_integrations/light.template.markdown b/source/_integrations/light.template.markdown
deleted file mode 100644
index d19dfc5228f..00000000000
--- a/source/_integrations/light.template.markdown
+++ /dev/null
@@ -1,430 +0,0 @@
----
-title: "Template Light"
-description: "Instructions on how to integrate Template Lights into Home Assistant."
-ha_category:
- - Light
- - Helper
-ha_release: 0.46
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - light
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform creates lights that combine integrations and provides the
-ability to run scripts or invoke actions for each of the on, off, and
-brightness commands of a light.
-
-To enable Template Lights in your installation, add the following to your
-{% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-light:
- - platform: template
- lights:
- theater_lights:
- friendly_name: "Theater Lights"
- level_template: "{{ state_attr('sensor.theater_brightness', 'lux')|int }}"
- value_template: "{{ state_attr('sensor.theater_brightness', 'lux')|int > 0 }}"
- temperature_template: "{{states('input_number.temperature_input') | int}}"
- hs_template: "({{states('input_number.h_input') | int}}, {{states('input_number.s_input') | int}})"
- effect_list_template: "{{ state_attr('light.led_strip', 'effect_list') }}"
- turn_on:
- action: script.theater_lights_on
- turn_off:
- action: script.theater_lights_off
- set_level:
- action: script.theater_lights_level
- data:
- brightness: "{{ brightness }}"
- set_temperature:
- action: input_number.set_value
- data:
- value: "{{ color_temp }}"
- entity_id: input_number.temperature_input
- set_hs:
- - action: input_number.set_value
- data:
- value: "{{ h }}"
- entity_id: input_number.h_input
- - action: input_number.set_value
- data:
- value: "{{ s }}"
- entity_id: input_number.s_input
- - action: light.turn_on
- data:
- entity_id:
- - light.led_strip
- transition: "{{ transition | float }}"
- hs_color:
- - "{{ hs[0] }}"
- - "{{ hs[1] }}"
- set_effect:
- - action: light.turn_on
- data:
- entity_id:
- - light.led_strip
- effect: "{{ effect }}"
- supports_transition_template: "{{ true }}"
-```
-
-{% endraw %}
-
-{% configuration %}
- lights:
- description: List of your lights.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this light. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: Defines a template to get the state of the light.
- required: false
- type: template
- default: optimistic
- level_template:
- description: Defines a template to get the brightness of the light.
- required: false
- type: template
- default: optimistic
- temperature_template:
- description: Defines a template to get the color temperature of the light.
- required: false
- type: template
- default: optimistic
- hs_template:
- description: Defines a template to get the HS color of the light. Must render a tuple (hue, saturation).
- required: false
- type: template
- default: optimistic
- rgb_template:
- description: Defines a template to get the RGB color of the light. Must render a tuple or a list (red, green, blue).
- required: false
- type: template
- default: optimistic
- rgbw_template:
- description: Defines a template to get the RGBW color of the light. Must render a tuple or a list (red, green, blue, white).
- required: false
- type: template
- default: optimistic
- rgbww_template:
- description: Defines a template to get the RGBWW color of the light. Must render a tuple or a list (red, green, blue, cold white, warm white).
- required: false
- type: template
- default: optimistic
- supports_transition_template:
- description: Defines a template to get if light supports transition. Should return boolean value (True/False). If this value is `True` transition parameter in a turn on or turn off call will be passed as a named parameter `transition` to either of the scripts.
- required: false
- type: template
- default: false
- effect_list_template:
- description: Defines a template to get the list of supported effects. Must render a list
- required: inclusive
- type: template
- default: optimistic
- effect_template:
- description: Defines a template to get the effect of the light.
- required: inclusive
- type: template
- default: optimistic
- min_mireds_template:
- description: Defines a template to get the min mireds value of the light.
- required: false
- type: template
- default: optimistic
- max_mireds_template:
- description: Defines a template to get the max mireds value of the light.
- required: false
- type: template
- default: optimistic
- icon_template:
- description: Defines a template for an icon or picture, e.g., showing a different icon for different states.
- required: false
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- turn_on:
- description: Defines an action to run when the light is turned on. May receive variables `brightness` and/or `transition`.
- required: true
- type: action
- turn_off:
- description: Defines an action to run when the light is turned off. May receive variable `transition`.
- required: true
- type: action
- set_level:
- description: Defines an action to run when the light is given a brightness command. The script will only be called if the `turn_on` call only has brightness, and optionally transition. Receives variables `brightness` and optionally `transition`.
- required: false
- type: action
- set_temperature:
- description: Defines an action to run when the light is given a color temperature command. Receives variable `color_temp`. May also receive variables `brightness` and/or `transition`.
- required: false
- type: action
- set_hs:
- description: "Defines an action to run when the light is given a hs color command. Available variables: `hs` as a tuple, `h` and `s`"
- required: false
- type: action
- set_rgb:
- description: "Defines an action to run when the light is given an RGB color command. Available variables: `rgb` as a tuple, `r`, `g` and `b`."
- required: false
- type: action
- set_rgbw:
- description: "Defines an action to run when the light is given an RGBW color command. Available variables: `rgbw` as a tuple, `rgb` as a tuple, `r`, `g`, `b` and `w`."
- required: false
- type: action
- set_rgbww:
- description: "Defines an action to run when the light is given an RGBWW color command. Available variables: `rgbww` as a tuple, `rgb` as a tuple, `r`, `g`, `b`, `cw` and `ww`."
- required: false
- type: action
- set_effect:
- description: Defines an action to run when the light is given an effect command. Receives variable `effect`. May also receive variables `brightness` and/or `transition`.
- required: inclusive
- type: action
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of a platform that takes extra time to load, the
-Template Light may get an `unknown` state during startup. This results
-in error messages in your log file until that platform has completed loading.
-If you use `is_state()` function in your template, you can avoid this situation.
-For example, you would replace
-{% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %}
-with this equivalent that returns `true`/`false` and never gives an unknown
-result:
-{% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
-Transition doesn't have its own script, it will instead be passed as a named parameter `transition` to the `turn_on`, `turn_off`, `brightness`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts.
-Brightness will be passed as a named parameter `brightness` to either of `turn_on`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts if the corresponding parameter is also in the call. In this case, the brightness script (`set_level`) will not be called.
-If only brightness is passed to `light.turn_on` action, then `set_level` script is called.
-
-## Examples
-
-In this section you will find some real-life examples of how to use this light.
-
-### Theater Volume Control
-
-This example shows a light that is actually a home theater's volume. This
-integration gives you the flexibility to provide whatever you'd like to send as
-the payload to the consumer including any scale conversions you may need to
-make; the [media player integration](/integrations/media_player/) needs a floating
-point percentage value from `0.0` to `1.0`.
-
-{% raw %}
-
-```yaml
-light:
- - platform: template
- lights:
- theater_volume:
- friendly_name: "Receiver Volume"
- value_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- off
- {% else %}
- on
- {% endif %}
- {% else %}
- off
- {% endif %}
- turn_on:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: false
- turn_off:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: true
- set_level:
- action: media_player.volume_set
- target:
- entity_id: media_player.receiver
- data:
- volume_level: "{{ (brightness / 255 * 100)|int / 100 }}"
- level_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {{ (state_attr('media_player.receiver', 'volume_level')|float * 255)|int }}
- {% else %}
- 0
- {% endif %}
-```
-
-{% endraw %}
-
-### Change The Icon
-
-This example shows how to change the icon based on the light state.
-
-{% raw %}
-
-```yaml
-light:
- - platform: template
- lights:
- theater_volume:
- friendly_name: "Receiver Volume"
- value_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- off
- {% else %}
- on
- {% endif %}
- {% else %}
- off
- {% endif %}
- icon_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- mdi:lightbulb-off
- {% else %}
- mdi:lightbulb-on
- {% endif %}
- {% else %}
- mdi:lightbulb-off
- {% endif %}
- turn_on:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: false
- turn_off:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: true
-```
-
-{% endraw %}
-
-### Change The Entity Picture
-
-This example shows how to change the entity picture based on the light state.
-
-{% raw %}
-
-```yaml
-light:
- - platform: template
- lights:
- theater_volume:
- friendly_name: "Receiver Volume"
- value_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- off
- {% else %}
- on
- {% endif %}
- {% else %}
- off
- {% endif %}
- icon_template: >-
- {% if is_state('media_player.receiver', 'on') %}
- {% if state_attr('media_player.receiver', 'is_volume_muted') %}
- /local/lightbulb-off.png
- {% else %}
- /local/lightbulb-on.png
- {% endif %}
- {% else %}
- /local/lightbulb-off.png
- {% endif %}
- turn_on:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: false
- turn_off:
- action: media_player.volume_mute
- target:
- entity_id: media_player.receiver
- data:
- is_volume_muted: true
-```
-
-{% endraw %}
-
-### Make a global light entity for a multi-segment WLED light
-
-This example shows how to group together 2 RGBW segments from the same WLED controller into a single usable light
-
-{% raw %}
-
-```yaml
-light:
- - platform: template
- lights:
- wled_global:
- unique_id: 28208f257b54c44e50deb2d618d44710
- friendly_name: "Multi-segment Wled control"
- value_template: "{{ states('light.wled_master') }}"
- level_template: "{{ state_attr('light.wled_master', 'brightness')|d(0,true)|int }}"
- rgbw_template: (
- {{ (state_attr('light.wled_segment_0', 'rgbw_color')[0]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[0]|d(0))/2 }},
- {{ (state_attr('light.wled_segment_0', 'rgbw_color')[1]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[1]|d(0))/2 }},
- {{ (state_attr('light.wled_segment_0', 'rgbw_color')[2]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[2]|d(0))/2 }},
- {{ (state_attr('light.wled_segment_0', 'rgbw_color')[3]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[3]|d(0))/2 }}
- )
- effect_list_template: "{{ state_attr('light.wled_segment_0', 'effect_list') }}"
- effect_template: "{{ state_attr('light.wled_segment_0', 'effect') if state_attr('light.wled_segment_0', 'effect') == state_attr('light.wled_segment_1', 'effect') else none }}"
- availability_template: "{{ not is_state('light.wled_master', 'unknown') }}"
-
- turn_on:
- action: light.turn_on
- entity_id: light.wled_segment_0, light.wled_segment_1, light.wled_master
- turn_off:
- action: light.turn_off
- entity_id: light.wled_master
- set_level:
- action: light.turn_on
- entity_id: light.wled_master
- data:
- brightness: "{{ brightness }}"
- set_rgbw:
- action: light.turn_on
- entity_id: light.wled_segment_0, light.wled_segment_1
- data:
- rgbw_color:
- - "{{ r }}"
- - "{{ g }}"
- - "{{ b }}"
- - "{{ w }}"
- effect: "Solid"
- set_effect:
- action: light.turn_on
- entity_id: light.wled_segment_0, light.wled_segment_1
- data:
- effect: "{{ effect }}"
-```
-
-{% endraw %}
diff --git a/source/_integrations/linkplay.md b/source/_integrations/linkplay.markdown
similarity index 97%
rename from source/_integrations/linkplay.md
rename to source/_integrations/linkplay.markdown
index 122541b531f..59ec73e140b 100644
--- a/source/_integrations/linkplay.md
+++ b/source/_integrations/linkplay.markdown
@@ -1,54 +1,54 @@
----
-title: LinkPlay
-description: Connect and control your LinkPlay media players using the LinkPlay integration
-ha_category:
- - Media player
-ha_domain: linkplay
-ha_zeroconf: true
-ha_integration_type: integration
-ha_release: 2024.8
-ha_codeowners:
- - '@Velleman'
-ha_config_flow: true
-ha_platforms:
- - media_player
- - button
-ha_iot_class: Local Polling
----
-
-The LinkPlay {% term integrations %} for Home Assistant allows you to control various media players based on the LinkPlay protocol. The integration supports auto-discovery on your local network through [Zeroconf](/integrations/zeroconf).
-
-{% include integrations/config_flow.md %}
-
-## Features
-
-### Media Player
-
-The media player entity offers robust controls and playback features from the media player integration and provides additionally:
-
-- **Preset playback**: Play LinkPlay presets configured on the device using the action `linkplay.play_preset`.
-- **Multiroom**: Combine multiple LinkPlay devices in a multiroom. Use the actions `media_player.join` and `media_player.unjoin`.
-
-### Buttons
-
-The button entities provide some additional LinkPlay features available on the device:
-
-- **Time Sync**: Synchronize the device's internal clock with the current time in Home Assistant.
-- **Restart Device**: Reboot the device, allowing for convenient troubleshooting and maintenance.
-
-## Actions
-
-The LinkPlay integration makes various custom actions available in addition to the [standard media player actions](/integrations/media_player/#actions).
-
-### Action `linkplay.play_preset`
-
-Play a preset on a LinkPlay media player.
-
-{% note %}
-Companion apps, such as 4stream, allow to save music presets (for example, Spotify playlists). This action can be used to start playing these presets.
-{% endnote %}
-
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | ----------- |
-| `entity_id` | no | The speakers to target. To target all LinkPlay devices, use `all`.
-| `preset_number` | no | The number of the preset to play.
+---
+title: LinkPlay
+description: Connect and control your LinkPlay media players using the LinkPlay integration
+ha_category:
+ - Media player
+ha_domain: linkplay
+ha_zeroconf: true
+ha_integration_type: integration
+ha_release: 2024.8
+ha_codeowners:
+ - '@Velleman'
+ha_config_flow: true
+ha_platforms:
+ - media_player
+ - button
+ha_iot_class: Local Polling
+---
+
+The LinkPlay {% term integrations %} for Home Assistant allows you to control various media players based on the LinkPlay protocol. The integration supports auto-discovery on your local network through [Zeroconf](/integrations/zeroconf).
+
+{% include integrations/config_flow.md %}
+
+## Features
+
+### Media Player
+
+The media player entity offers robust controls and playback features from the media player integration and provides additionally:
+
+- **Preset playback**: Play LinkPlay presets configured on the device using the action `linkplay.play_preset`.
+- **Multiroom**: Combine multiple LinkPlay devices in a multiroom. Use the actions `media_player.join` and `media_player.unjoin`.
+
+### Buttons
+
+The button entities provide some additional LinkPlay features available on the device:
+
+- **Time Sync**: Synchronize the device's internal clock with the current time in Home Assistant.
+- **Restart Device**: Reboot the device, allowing for convenient troubleshooting and maintenance.
+
+## Actions
+
+The LinkPlay integration makes various custom actions available in addition to the [standard media player actions](/integrations/media_player/#actions).
+
+### Action `linkplay.play_preset`
+
+Play a preset on a LinkPlay media player.
+
+{% note %}
+Companion apps, such as 4stream, allow to save music presets (for example, Spotify playlists). This action can be used to start playing these presets.
+{% endnote %}
+
+| Data attribute | Optional | Description |
+| ---------------------- | -------- | ----------- |
+| `entity_id` | no | The speakers to target. To target all LinkPlay devices, use `all`.
+| `preset_number` | no | The number of the preset to play.
diff --git a/source/_integrations/locative.md b/source/_integrations/locative.markdown
similarity index 98%
rename from source/_integrations/locative.md
rename to source/_integrations/locative.markdown
index 3f28d27707d..fbbd1ad0b6d 100644
--- a/source/_integrations/locative.md
+++ b/source/_integrations/locative.markdown
@@ -1,23 +1,23 @@
----
-title: "Locative"
-description: "Instructions on how to use Locative to track devices in Home Assistant."
-ha_category:
- - Presence detection
-ha_release: 0.86
-ha_iot_class: Cloud Push
-ha_domain: locative
----
-
-This platform allows you to detect presence using [Locative](https://www.locative.app/). Locative is an open source app for [iOS](https://apps.apple.com/us/app/locative/id725198453?ign-mpt=uo%3D4) that allows users to set up a `GET` or `POST` request when a geofence is entered or exited. This can be configured with Home Assistant to update your location.
-
-Install on your smartphone:
-
-- [iOS](https://apps.apple.com/us/app/locative/id725198453?ign-mpt=uo%3D4)
-
-To configure Locative, you must set it up via the integrations panel in the configuration screen. You must set up the app to send a POST request to your Home Assistant instance at the webhook URL provided by the integration during setup. When you enter or exit a geofence, Locative will send the appropriate request to that URL, updating Home Assistant. You are not able to specify a device name in Locative. Instead, you will need to look in your `dev-state` menu for a new device that Locative will have created on its first `GET`. If you had been or are using Owntracks as well, you will need to update the device name used in the Owntracks setup with the name that Locative generated.
-
-
-
-
-
-When you enter a geofence, your location name in Home Assistant will be set to the name of the geofence in Locative. When you exit a geofence, your location name in Home Assistant will be set to "not home".
+---
+title: "Locative"
+description: "Instructions on how to use Locative to track devices in Home Assistant."
+ha_category:
+ - Presence detection
+ha_release: 0.86
+ha_iot_class: Cloud Push
+ha_domain: locative
+---
+
+This platform allows you to detect presence using [Locative](https://www.locative.app/). Locative is an open source app for [iOS](https://apps.apple.com/us/app/locative/id725198453?ign-mpt=uo%3D4) that allows users to set up a `GET` or `POST` request when a geofence is entered or exited. This can be configured with Home Assistant to update your location.
+
+Install on your smartphone:
+
+- [iOS](https://apps.apple.com/us/app/locative/id725198453?ign-mpt=uo%3D4)
+
+To configure Locative, you must set it up via the integrations panel in the configuration screen. You must set up the app to send a POST request to your Home Assistant instance at the webhook URL provided by the integration during setup. When you enter or exit a geofence, Locative will send the appropriate request to that URL, updating Home Assistant. You are not able to specify a device name in Locative. Instead, you will need to look in your `dev-state` menu for a new device that Locative will have created on its first `GET`. If you had been or are using Owntracks as well, you will need to update the device name used in the Owntracks setup with the name that Locative generated.
+
+
+
+
+
+When you enter a geofence, your location name in Home Assistant will be set to the name of the geofence in Locative. When you exit a geofence, your location name in Home Assistant will be set to "not home".
diff --git a/source/_integrations/lock.template.markdown b/source/_integrations/lock.template.markdown
deleted file mode 100644
index ddfeaf7f367..00000000000
--- a/source/_integrations/lock.template.markdown
+++ /dev/null
@@ -1,213 +0,0 @@
----
-title: "Template Lock"
-description: "Instructions on how to integrate Template Locks into Home Assistant."
-ha_category:
- - Lock
- - Helper
-ha_release: 0.81
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - lock
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform creates locks that combines components.
-
-For example, if you have a garage door with a toggle switch that operates the motor and a sensor that allows you know whether the door is open or closed, you can combine these into a lock that knows whether the garage door is open or closed.
-
-This can simplify the GUI and make it easier to write automations.
-
-In optimistic mode, the lock will immediately change state after every command. Otherwise, the lock will wait for state confirmation from the template. Try to enable it, if experiencing incorrect lock operation.
-
-## Configuration
-
-To enable Template Locks in your installation, add the following to your {% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-lock:
- - platform: template
- name: Garage door
- value_template: "{{ is_state('sensor.door', 'on') }}"
- lock:
- action: switch.turn_on
- target:
- entity_id: switch.door
- unlock:
- action: switch.turn_off
- target:
- entity_id: switch.door
-```
-
-{% endraw %}
-
-{% configuration %}
- name:
- description: Name to use in the frontend.
- required: false
- type: string
- default: Template Lock
- unique_id:
- description: An ID that uniquely identifies this lock. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: Defines a template to set the state of the lock.
- required: true
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- code_format_template:
- description: Defines a template to get the `code_format` attribute of the entity. This template must evaluate to a valid [Python regular expression](https://docs.python.org/3/library/re.html#regular-expression-syntax) or `None`. If it evaluates to a not-`None` value, the user is prompted to enter a code when interacting with the lock. The code will be matched against the regular expression, and only if it matches, the lock/unlock actions will be executed. The actual _validity_ of the entered code must be verified within these actions. If there's a syntax error in the template, the entity will be unavailable. If the template fails to render for other reasons or if the regular expression is invalid, no code will be accepted and the lock/unlock actions will never be invoked.
- required: false
- type: template
- default: None
- lock:
- description: Defines an action to run when the lock is locked.
- required: true
- type: action
- unlock:
- description: Defines an action to run when the lock is unlocked.
- required: true
- type: action
- open:
- description: Defines an action to run when the lock is opened.
- required: false
- type: action
- optimistic:
- description: Flag that defines if lock works in optimistic mode.
- required: false
- type: boolean
- default: false
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of a platform that takes extra time to load, the Template Lock may get an `unknown` state during startup. This results in error messages in your log file until that platform has completed loading. If you use `is_state()` function in your template, you can avoid this situation. For example, you would replace {% raw %}`{{ state('switch.source') == 'on') }}`{% endraw %} with this equivalent that returns `true`/`false` and never gives an unknown result: {% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
-
-## Examples
-
-In this section, you find some real-life examples of how to use this lock.
-
-### Lock from Switch
-
-This example shows a lock that copies data from a switch.
-
-{% raw %}
-
-```yaml
-lock:
- - platform: template
- name: Garage Door
- value_template: "{{ is_state('switch.source', 'on') }}"
- lock:
- action: switch.turn_on
- target:
- entity_id: switch.source
- unlock:
- action: switch.turn_off
- target:
- entity_id: switch.source
-```
-
-{% endraw %}
-
-### Optimistic mode
-
-This example shows a lock in optimistic mode. This lock will immediately change state after command and will not wait for state update from the sensor.
-
-{% raw %}
-
-```yaml
-lock:
- - platform: template
- name: Garage Door
- value_template: "{{ is_state('sensor.skylight.state', 'on') }}"
- optimistic: true
- lock:
- action: switch.turn_on
- target:
- entity_id: switch.source
- unlock:
- action: switch.turn_off
- target:
- entity_id: switch.source
-```
-
-{% endraw %}
-
-### Sensor and Two Switches
-
-This example shows a lock that takes its state from a sensor, and uses two momentary switches to control a device.
-
-{% raw %}
-
-```yaml
-lock:
- - platform: template
- name: Garage Door
- value_template: "{{ is_state('sensor.skylight.state', 'on') }}"
- lock:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_open
- unlock:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_close
-```
-
-{% endraw %}
-
-### Lock from switch with dynamic code
-
-This example shows a lock that copies data from a switch. It needs a PIN code defined as a [secret](/docs/configuration/secrets) to unlock and no code to lock. Note that the actual validity check of the code is part of the `unlock` action and should always happen there or in scripts called from these actions. In this way, you can not only perform code checks against static values, but also dynamic ones (for instance, TOTPs).
-
-{% raw %}
-
-```yaml
-lock:
- - platform: template
- name: Garage Door
- value_template: "{{ is_state('switch.source', 'on') }}"
- code_format_template: "{{ '\\d{4}' if is_state('switch.source', 'on') else None }}"
- lock:
- - action: switch.turn_on
- target:
- entity_id: switch.source
- unlock:
- - variables:
- pin: !secret garage_door_pin
- - condition: "{{ code == pin }}"
- - action: switch.turn_off
- target:
- entity_id: switch.source
-```
-
-{% endraw %}
-
-In `secrets.yaml`:
-
-{% raw %}
-
-```yaml
-garage_door_pin: "1234"
-```
-
-{% endraw %}
diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown
index 3ed9312ef91..dc99f0c7fe8 100644
--- a/source/_integrations/matter.markdown
+++ b/source/_integrations/matter.markdown
@@ -386,7 +386,7 @@ NOTE for Android users: You need to follow the instructions at the bottom of the
### General recommendations
-- Using Thread-based Matter devices in Home Assistant requires Home Assistant OS version 10 and above. Not using Home Assistant OS is at your own risk. We do provide some [documentation](https://github.com/home-assistant-libs/python-matter-server/blob/main/README.md) on how to run the Matter Server as a Docker container. The documentation includes a description of the host and networking requirements.
+- Using Thread-based Matter devices in Home Assistant requires Home Assistant OS version 10 and above. Home Assistant OS with the Matter Server add-on is the supported path for using Matter with Home Assistant. Running Matter Server as a standalone Docker container is unsupported, but we provide [documentation](https://github.com/home-assistant-libs/python-matter-server/blob/main/README.md) including a description of the host and networking requirements.
- To use {% term Thread %} devices you will need a {% term Thread %} network with at least one Thread border router in your network nearby the {% term Thread %} device(s). Apple users, for example, need the Apple TV 4K or the HomePod Mini, while Google users need a Nest Hub (2nd Gen). Use the Thread integration in Home Assistant to diagnose your {% term Thread %} network(s).
diff --git a/source/_integrations/met_eireann.markdown b/source/_integrations/met_eireann.markdown
index 29c317692d7..623f27c7d17 100644
--- a/source/_integrations/met_eireann.markdown
+++ b/source/_integrations/met_eireann.markdown
@@ -17,14 +17,14 @@ ha_integration_type: integration
The Met Éireann integration uses the [Met Éireann](https://met.ie) (The Irish Meteorological Service) Public Weather Forecast API to provide current and forecasted weather data for a given location. This integration is in no way affiliated with or endorsed by Met Éireann.
{% note %}
-The Met Éireann API will only provide data for Ireland, the UK and a small part of northern France. For specific coverage, please see the Notes on API document available [here](https://data.gov.ie/dataset/met-eireann-weather-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1).
+The Met Éireann API will only provide data for Ireland, the UK and a small part of northern France. For specific coverage, please see the Notes on API document available [here](https://data.gov.ie/dataset/met-eireann-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1).
{% endnote %}
{% include integrations/config_flow.md %}
## Data license
-The data provided by Met Éireann is licensed under the Met Éireann Open Data Custom License (similar to a Creative Commons CC BY 4.0 license). A license summary and the full license are available [here](https://data.gov.ie/dataset/met-eireann-weather-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1). In short, if you distribute, broadcast or make Met Éireann data available on the public internet you must give credit to Met Éireann and display their weather warnings.
+The data provided by Met Éireann is licensed under the Met Éireann Open Data Custom License (similar to a Creative Commons CC BY 4.0 license). A license summary and the full license are available [here](https://data.gov.ie/dataset/met-eireann-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1). In short, if you distribute, broadcast or make Met Éireann data available on the public internet you must give credit to Met Éireann and display their weather warnings.
## Data changes
diff --git a/source/_integrations/motionmount.md b/source/_integrations/motionmount.markdown
similarity index 97%
rename from source/_integrations/motionmount.md
rename to source/_integrations/motionmount.markdown
index 0ce8902df51..1478f0dff77 100644
--- a/source/_integrations/motionmount.md
+++ b/source/_integrations/motionmount.markdown
@@ -1,115 +1,115 @@
----
-title: Vogel's MotionMount
-description: Instructions on how to integrate Vogel's MotionMount into Home Assistant.
-ha_category:
- - Number
- - Select
- - Binary sensor
- - Sensor
-ha_release: 2024.1
-ha_iot_class: Local Push
-ha_config_flow: true
-ha_platforms:
- - number
- - select
- - binary_sensor
- - sensor
-ha_codeowners:
- - '@RJPoelstra'
-ha_domain: motionmount
-ha_zeroconf: true
----
-
-The `motionmount` {% term integration %} allows you to control the position of your [TVM 7675 Pro](https://www.vogels.com/p/tvm-7675-pro-motorized-tv-wall-mount-black) SIGNATURE MotionMount from Vogel's.
-
-This integration uses the Ethernet (IP) connection of your MotionMount. It's not possible to connect using the RS-232 connection.
-
-It provides information about the current position of the mount and allows setting a new position.
-
-A use case would be to position the TV based on whether anyone is actively watching. The MotionMount provides an HDMI connection to monitor whether the TV is turned on and in response move it to a preset position or the last known position. However, if you also use the TV for background music, you probably don't want the MotionMount to extend. By using a presence sensor to check whether anyone is actually in front of the TV, you can ensure the MotionMount only extends when the TV is actively being watched.
-
-{% include integrations/config_flow.md %}
-
-{% configuration_basic %}
-Host:
- description: Hostname or IP address of the device, for example:`192.168.1.2`.
-Port:
- description: The TCP port of the device. Defaults to 23. Only change this when you're absolutely certain that it shouldn't be 23.
-PIN:
- description: The user level pincode, if configured on the device.
-{% endconfiguration_basic %}
-
-## Removing the integration
-
-This integration follows standard integration removal. No extra steps are required.
-
-{% include integrations/remove_device_service.md %}
-
-## Data updates
-
-The MotionMount pushes new data to the integration.
-The only exception is the presets. Changes to the presets are {% term polling polled %}, by default every 60 seconds.
-
-## Known limitations
-
-The integration does not provide the ability to configure the MotionMount.
-All settings, including configuring presets, should be done via the MotionMount app.
-
-Only IP connections are supported. Connection via RS-232 or Bluetooth Low Energy is not supported.
-
-## Supported devices
-
-The following devices are supported:
-
-- TVM 7675 Pro (SIGNATURE MotionMount with Pro extension)
-
-## Unsupported devices
-
-The following devices are *not* supported:
-
-- TVM 7675 (SIGNATURE MotionMount without Pro extension)
-- TVM 7355 (NEXT MotionMount)
-
-## Supported functionality
-
-### Entities
-
-#### Sensors
-
-- **Moving**
- - **Description**: Indicates whether the MotionMount is moving.
-
-- **Error Status**
- - **Description**: The error status of the MotionMount.
- - None: There is no error.
- - Motor: There is a problem communicating with the motor.
- - HDMI CEC: There is a problem communicating with the TV. Check the HDMI cable.
- - Obstruction: The MotionMount detected an obstacle and stopped moving.
- - TV Width Constraint: The MotionMount detected that the TV moved too close to the wall and stopped moving.
- - Internal: There is an internal error. Refer to the MotionMount app for support.
-
-#### Numbers
-
-- **Extension**
- - **Description**: The current extension of the MotionMount from the wall.
-
-- **Turn**
- - **Description**: The current rotation of the MotionMount.
-
-#### Selects
-
-- **Presets**
- - **Description**: If the MotionMount is at a preset location, this shows the corresponding preset.
- Any preset can be selected to move the MotionMount to this preset position.
-
-## Troubleshooting
-
-### Can't connect to device
-
-1. Make sure the device is powered on.
-2. Make sure the device is connected to the same network as Home Assistant.
-3. Make sure the IP address of the MotionMount is configured correctly.
- - In case of doubt, perform a network reset by holding the reset button for approx. 5 seconds.
- - **Result**: The LED will start to blink slowly. This indicates that the network configuration is being reset to use DHCP.
- - **Important**: Don't hold the reset button for too long (approx. 10 s). Holding the button for 10 s or longer starts a factory reset. A factory reset is indicated by the LED blinking fast.
-
+---
+title: Vogel's MotionMount
+description: Instructions on how to integrate Vogel's MotionMount into Home Assistant.
+ha_category:
+ - Number
+ - Select
+ - Binary sensor
+ - Sensor
+ha_release: 2024.1
+ha_iot_class: Local Push
+ha_config_flow: true
+ha_platforms:
+ - number
+ - select
+ - binary_sensor
+ - sensor
+ha_codeowners:
+ - '@RJPoelstra'
+ha_domain: motionmount
+ha_zeroconf: true
+---
+
+The `motionmount` {% term integration %} allows you to control the position of your [TVM 7675 Pro](https://www.vogels.com/p/tvm-7675-pro-motorized-tv-wall-mount-black) SIGNATURE MotionMount from Vogel's.
+
+This integration uses the Ethernet (IP) connection of your MotionMount. It's not possible to connect using the RS-232 connection.
+
+It provides information about the current position of the mount and allows setting a new position.
+
+A use case would be to position the TV based on whether anyone is actively watching. The MotionMount provides an HDMI connection to monitor whether the TV is turned on and in response move it to a preset position or the last known position. However, if you also use the TV for background music, you probably don't want the MotionMount to extend. By using a presence sensor to check whether anyone is actually in front of the TV, you can ensure the MotionMount only extends when the TV is actively being watched.
+
+{% include integrations/config_flow.md %}
+
+{% configuration_basic %}
+Host:
+ description: Hostname or IP address of the device, for example:`192.168.1.2`.
+Port:
+ description: The TCP port of the device. Defaults to 23. Only change this when you're absolutely certain that it shouldn't be 23.
+PIN:
+ description: The user level pincode, if configured on the device.
+{% endconfiguration_basic %}
+
+## Removing the integration
+
+This integration follows standard integration removal. No extra steps are required.
+
+{% include integrations/remove_device_service.md %}
+
+## Data updates
+
+The MotionMount pushes new data to the integration.
+The only exception is the presets. Changes to the presets are {% term polling polled %}, by default every 60 seconds.
+
+## Known limitations
+
+The integration does not provide the ability to configure the MotionMount.
+All settings, including configuring presets, should be done via the MotionMount app.
+
+Only IP connections are supported. Connection via RS-232 or Bluetooth Low Energy is not supported.
+
+## Supported devices
+
+The following devices are supported:
+
+- TVM 7675 Pro (SIGNATURE MotionMount with Pro extension)
+
+## Unsupported devices
+
+The following devices are *not* supported:
+
+- TVM 7675 (SIGNATURE MotionMount without Pro extension)
+- TVM 7355 (NEXT MotionMount)
+
+## Supported functionality
+
+### Entities
+
+#### Sensors
+
+- **Moving**
+ - **Description**: Indicates whether the MotionMount is moving.
+
+- **Error Status**
+ - **Description**: The error status of the MotionMount.
+ - None: There is no error.
+ - Motor: There is a problem communicating with the motor.
+ - HDMI CEC: There is a problem communicating with the TV. Check the HDMI cable.
+ - Obstruction: The MotionMount detected an obstacle and stopped moving.
+ - TV Width Constraint: The MotionMount detected that the TV moved too close to the wall and stopped moving.
+ - Internal: There is an internal error. Refer to the MotionMount app for support.
+
+#### Numbers
+
+- **Extension**
+ - **Description**: The current extension of the MotionMount from the wall.
+
+- **Turn**
+ - **Description**: The current rotation of the MotionMount.
+
+#### Selects
+
+- **Presets**
+ - **Description**: If the MotionMount is at a preset location, this shows the corresponding preset.
+ Any preset can be selected to move the MotionMount to this preset position.
+
+## Troubleshooting
+
+### Can't connect to device
+
+1. Make sure the device is powered on.
+2. Make sure the device is connected to the same network as Home Assistant.
+3. Make sure the IP address of the MotionMount is configured correctly.
+ - In case of doubt, perform a network reset by holding the reset button for approx. 5 seconds.
+ - **Result**: The LED will start to blink slowly. This indicates that the network configuration is being reset to use DHCP.
+ - **Important**: Don't hold the reset button for too long (approx. 10 s). Holding the button for 10 s or longer starts a factory reset. A factory reset is indicated by the LED blinking fast.
+
diff --git a/source/_integrations/mqtt.markdown b/source/_integrations/mqtt.markdown
index 53c07829ee2..965021e3dc8 100644
--- a/source/_integrations/mqtt.markdown
+++ b/source/_integrations/mqtt.markdown
@@ -1082,7 +1082,7 @@ payload_not_available:
required: false
type: string
default: offline
-{% endconfiguration %}
+{% endconfiguration %}
{% enddetails %}
@@ -1225,7 +1225,7 @@ Setting up a light, switch etc. is similar but requires a `command_topic` as men
- Configuration topic: `homeassistant/switch/irrigation/config`
- State topic: `homeassistant/switch/irrigation/state`
- Command topic: `homeassistant/switch/irrigation/set`
-- Payload:
+- Payload:
```json
{
@@ -1371,7 +1371,7 @@ The following software has built-in support for MQTT discovery:
- [Tasmota](https://github.com/arendst/Tasmota) (starting with 5.11.1e, development halted)
- [TeddyCloud](https://github.com/toniebox-reverse-engineering/teddycloud)
- [Teleinfo MQTT](https://fmartinou.github.io/teleinfo2mqtt) (starting with 3.0.0)
-- [Tydom2MQTT](https://fmartinou.github.io/tydom2mqtt/)
+- [Tydom2MQTT](https://tydom2mqtt.github.io/tydom2mqtt/)
- [What's up Docker?](https://fmartinou.github.io/whats-up-docker/) (starting with 3.5.0)
- [WyzeSense2MQTT](https://github.com/raetha/wyzesense2mqtt)
- [Xiaomi DaFang Hacks](https://github.com/EliasKotlyar/Xiaomi-Dafang-Hacks)
@@ -1433,7 +1433,7 @@ Note that MQTT device payloads often contain information for updating multiple e
### The last reported state attribute
-Because MQTT state updates are often repeated frequently, even when no actual changes exist, it is up to the MQTT subscriber to determine whether a status update was received. If the latest update is missed, it might take some time before the next one arrives. If a retained payload exists at the broker, that value will be replayed first, but it will be an update of a previous last state.
+Because MQTT state updates are often repeated frequently, even when no actual changes exist, it is up to the MQTT subscriber to determine whether a status update was received. If the latest update is missed, it might take some time before the next one arrives. If a retained payload exists at the broker, that value will be replayed first, but it will be an update of a previous last state.
MQTT devices often continuously generate numerous state updates. MQTT does not update `last_reported` to avoid impacting system stability unless `force_update` is set. Alternatively, an MQTT sensor can be created to measure the last update.
diff --git a/source/_integrations/music_assistant.markdown b/source/_integrations/music_assistant.markdown
index a54f35becc1..6fef6f2df37 100644
--- a/source/_integrations/music_assistant.markdown
+++ b/source/_integrations/music_assistant.markdown
@@ -28,11 +28,14 @@ The `media_content_id` payload for `media_player.play_media` can be any of the f
- The name of a track, artist, or album. For example, `Queen`.
- A track or album combined with the artist's name. For example, `Queen - Innuendo`.
- A streaming provider URI. For example, `spotify://artist/12345`.
+- A streaming provider URL. For example, `https://open.spotify.com/track/31cWPvM99ZHxMl3mdgiw4I`.
The `media_content_id` payload for `media_player.browse_media` must be a URI of the form `library://artist/1`, `library://album/20`, or `spotify://album/5zj4Ej0FrlJQaSo0d6cttH`. The type of item that the URI refers to must be an album or artist.
These URIs can be obtained from, for example, the output of the `get_library` or `search` actions described below or the `media_player.browse_media` action from Home Assistant.
+Streaming provider URLs can be obtained from the web interface of the provider.
+
{% include integrations/config_flow.md %}
### Manual configuration
diff --git a/source/_integrations/neff.markdown b/source/_integrations/neff.markdown
index 2b5f2da4ae7..82506976177 100644
--- a/source/_integrations/neff.markdown
+++ b/source/_integrations/neff.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/nextcloud.markdown b/source/_integrations/nextcloud.markdown
index f2c8edad40b..9be8ffc562b 100644
--- a/source/_integrations/nextcloud.markdown
+++ b/source/_integrations/nextcloud.markdown
@@ -35,3 +35,100 @@ This integration has the following Nextcloud Server prerequisites:
- (Recommended) A Nextcloud App password should be generated for use in Home Assistant (__*Nextcloud*__ > __*Settings*__ > __*Personal*__ > __*Security*__ > __*Devices & sessions*__ > __*Create new app password*__)
{% include integrations/config_flow.md %}
+
+## Sensors
+
+For each entry, the integration will create the following {% term sensors %}:
+
+| Sensor | Enabled by default |
+| ------ | ------------------ |
+| Amount of active users last 5 minutes | ✅ |
+| Amount of active users last day | ✅ |
+| Amount of active users last hour | ✅ |
+| Amount of files | ✅ |
+| Amount of group shares | ✅ |
+| Amount of link shares | ✅ |
+| Amount of local storages | ✅ |
+| Amount of mail shares | ✅ |
+| Amount of other storages | ✅ |
+| Amount of passwordless link shares | ✅ |
+| Amount of room shares | ✅ |
+| Amount of shares | ✅ |
+| Amount of shares received | ✅ |
+| Amount of shares sent | ✅ |
+| Amount of storages | ✅ |
+| Amount of storages at home | ✅ |
+| Amount of user | ✅ |
+| Amount of user shares | ✅ |
+| Apps installed | ✅ |
+| Avatars enabled | ✅ |
+| CPU load last 1 minute | ✅ |
+| CPU load last 15 minutes | ✅ |
+| CPU load last 5 minutes | ✅ |
+| Cache TTL | ❌ |
+| Cache expunges | ❌ |
+| Cache memory | ❌ |
+| Cache memory size | ✅ |
+| Cache number of entries | ❌ |
+| Cache number of hits | ❌ |
+| Cache number of inserts | ❌ |
+| Cache number of misses | ❌ |
+| Cache number of slots | ❌ |
+| Cache start time | ❌ |
+| Database size | ✅ |
+| Database type | ✅ |
+| Database version | ✅ |
+| Debug enabled | ✅ |
+| Filelocking enabled | ✅ |
+| Free memory | ✅ |
+| Free space | ✅ |
+| Free swap memory | ✅ |
+| Interned buffer size | ❌ |
+| Interned free memory | ❌ |
+| Interned number of strings | ❌ |
+| Interned used memory | ❌ |
+| JIT active | ❌ |
+| JIT buffer free | ❌ |
+| JIT buffer size | ❌ |
+| JIT enabled | ❌ |
+| JIT kind | ❌ |
+| JIT opt flags | ❌ |
+| JIT opt level | ❌ |
+| Opcache blacklist miss ratio | ❌ |
+| Opcache blacklist misses | ❌ |
+| Opcache cached keys | ❌ |
+| Opcache cached scripts | ❌ |
+| Opcache current wasted percentage | ❌ |
+| Opcache free memory | ❌ |
+| Opcache hash restarts | ❌ |
+| Opcache hit rate | ❌ |
+| Opcache hits | ❌ |
+| Opcache last restart time | ❌ |
+| Opcache manual restarts | ❌ |
+| Opcache max cached keys | ❌ |
+| Opcache misses | ❌ |
+| Opcache out of memory restarts | ❌ |
+| Opcache start time | ❌ |
+| Opcache used memory | ❌ |
+| Opcache wasted memory | ❌ |
+| PHP max execution time | ✅ |
+| PHP memory limit | ✅ |
+| PHP upload maximum filesize | ✅ |
+| PHP version | ✅ |
+| Previews enabled | ✅ |
+| SMA available memory | ❌ |
+| SMA number of segments | ❌ |
+| SMA segment size | ❌ |
+| System memcache distributed | ❌ |
+| System memcache local | ❌ |
+| System memcache locking | ❌ |
+| System theme | ✅ |
+| System version | ✅ |
+| Total memory | ✅ |
+| Total swap memory | ✅ |
+| Updates available | ✅ |
+| Webserver | ✅ |
+
+## Update entity
+
+An {% term update %} entity will be created for each entry.
diff --git a/source/_integrations/octoprint.markdown b/source/_integrations/octoprint.markdown
index 03893304c7c..609c83c481e 100644
--- a/source/_integrations/octoprint.markdown
+++ b/source/_integrations/octoprint.markdown
@@ -61,10 +61,14 @@ The OctoPrint integration lets you monitor various states of your 3D printer and
Supported sensors:
+- Actual Bed Temperature
+- Actual Tool (Nozzle) Temperature
- Current Printer State
-- Job Completed Percentage
- Estimated Finish Time
+- Job Completed Percentage
- Estimated Start Time
+- Target Bed Temperature
+- Target Tool (Nozzle) Temperature
## Camera
@@ -75,11 +79,11 @@ The OctoPrint integration provides a camera feed if one is configured in OctoPri
The OctoPrint integration provides the following buttons:
- Pause Job
-- Resume Job
-- Stop Job
-- Shutdown System
- Reboot System
- Restart Octoprint
+- Resume Job
+- Shutdown System
+- Stop Job
## Troubleshooting
diff --git a/source/_integrations/openweathermap.markdown b/source/_integrations/openweathermap.markdown
index c0601e360c3..3c200ef1497 100644
--- a/source/_integrations/openweathermap.markdown
+++ b/source/_integrations/openweathermap.markdown
@@ -11,6 +11,7 @@ ha_codeowners:
- '@fabaff'
- '@freekode'
- '@nzapponi'
+ - '@wittypluck'
ha_domain: openweathermap
ha_platforms:
- sensor
diff --git a/source/_integrations/overkiz.markdown b/source/_integrations/overkiz.markdown
index 321348d2695..8981d2bd3a9 100644
--- a/source/_integrations/overkiz.markdown
+++ b/source/_integrations/overkiz.markdown
@@ -105,7 +105,7 @@ Even though most Overkiz hubs support adding Zigbee, Z-Wave, Hue, and Sonos devi
### Stateless RTS covers
-RTS covers do not report their state back to the hub, so Home Assistant cannot track their state after they are controlled. If you only control your RTS cover from Home Assistant, you can use the [template cover](/integrations/cover.template/) to create a stateful cover entity. This will help you track the current state (open or closed) and use the cover in automations and scenes.
+RTS covers do not report their state back to the hub, so Home Assistant cannot track their state after they are controlled. If you only control your RTS cover from Home Assistant, you can use the [template cover](/integrations/template/#cover) to create a stateful cover entity. This will help you track the current state (open or closed) and use the cover in automations and scenes.
```yaml
cover:
diff --git a/source/_integrations/paperless_ngx.markdown b/source/_integrations/paperless_ngx.markdown
index 70b2d5ac8a1..3258c6b22ed 100644
--- a/source/_integrations/paperless_ngx.markdown
+++ b/source/_integrations/paperless_ngx.markdown
@@ -15,6 +15,9 @@ ha_quality_scale: silver
related:
- url: https://docs.paperless-ngx.com/
title: Paperless-ngx
+ha_platforms:
+ - diagnostics
+ - sensor
---
The **Paperless-ngx** {% term integration %} allows you to connect your [Paperless-ngx](https://docs.paperless-ngx.com/) instance to Home Assistant and monitor its status and activity.
diff --git a/source/_integrations/pitsos.markdown b/source/_integrations/pitsos.markdown
index dd984659c10..750f2eb91f6 100644
--- a/source/_integrations/pitsos.markdown
+++ b/source/_integrations/pitsos.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/probe_plus.markdown b/source/_integrations/probe_plus.markdown
index 784c811ff3f..ca3fec49afb 100644
--- a/source/_integrations/probe_plus.markdown
+++ b/source/_integrations/probe_plus.markdown
@@ -4,7 +4,7 @@ description: Instructions on how to integrate Probe Plus food temperature probes
ha_release: 2025.6
ha_category:
- Sensor
-ha_iot_class: local_push
+ha_iot_class: Local Push
ha_config_flow: true
ha_domain: probe_plus
ha_platforms:
diff --git a/source/_integrations/profilo.markdown b/source/_integrations/profilo.markdown
index 0caa7b2898c..478034af125 100644
--- a/source/_integrations/profilo.markdown
+++ b/source/_integrations/profilo.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/recorder.markdown b/source/_integrations/recorder.markdown
index 95dca003352..6c1ecc8a587 100644
--- a/source/_integrations/recorder.markdown
+++ b/source/_integrations/recorder.markdown
@@ -253,6 +253,39 @@ Perform the action `recorder.disable` to stop saving events and states to the da
Perform the action `recorder.enable` to start again saving events and states to the database. This is the opposite of `recorder.disable`.
+### Action `get_statistics`
+
+Perform the action `recorder.get_statistics` to retrieve statistics for one or more entities from the recorder database. This action is useful for automations or scripts that need to access historical statistics, such as mean, min, max, or sum values, for supported entities like sensors.
+
+| Data attribute | Optional | Description |
+| -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `statistic_ids`| no | The entity IDs or statistic IDs to get statistics for. |
+| `start_time` | no | The start time for the statistics query. |
+| `end_time` | yes | The end time for the statistics query. If omitted, returns all statistics from start time onward. |
+| `period` | no | The time period to group statistics by (`5minute`, `hour`, `day`, `week`, or `month`). |
+| `types` | no | The types of statistics values to return (`change`, `last_reset`, `max`, `mean`, `min`, `state`, or `sum`). |
+| `units` | yes | Optional unit conversion mapping. An object where keys are [device classes](https://www.home-assistant.io/integrations/sensor#device-class) and values are the desired target units. This allows retrieving statistics converted to different units than what's stored in the database. |
+
+#### Example using get_statistics
+
+```yaml
+action: recorder.get_statistics
+data:
+ statistic_ids:
+ - sensor.energy_meter
+ - sensor.water_usage
+ start_time: "2025-06-10 00:00:00"
+ end_time: "2025-06-11 23:00:00"
+ period: hour
+ types:
+ - sum
+ - mean
+ units:
+ energy: kWh
+ volume: L
+response_variable: consumption_stats
+```
+
## Handling disk corruption and hardware failures
When using SQLite, if the system encounters unrecoverable disk corruption, it will move the database aside and create a new database to keep the system online. In this case, having at least 2.5x the database size available in free disk space is essential. Starting a new database is the system's last resort recovery option and is usually caused by failing flash storage, an inadequate power supply, an unclean shutdown, or another hardware failure.
diff --git a/source/_integrations/rehlko.markdown b/source/_integrations/rehlko.markdown
index 4f57fccf127..c2b7023b98e 100644
--- a/source/_integrations/rehlko.markdown
+++ b/source/_integrations/rehlko.markdown
@@ -12,6 +12,7 @@ ha_codeowners:
ha_dhcp: true
ha_domain: rehlko
ha_platforms:
+ - binary_sensor
- sensor
ha_integration_type: integration
ha_quality_scale: silver
diff --git a/source/_integrations/remote_calendar.markdown b/source/_integrations/remote_calendar.markdown
index ca1069d31fa..038e2a4c2a5 100644
--- a/source/_integrations/remote_calendar.markdown
+++ b/source/_integrations/remote_calendar.markdown
@@ -20,7 +20,7 @@ The **Remote calendar** {% term integration %} allows you to read a calendar in
## Known limitations
-The integration does not provide the ability to connect to an resource that requires authentication or special headers.
+The integration does not provide the ability to connect to a resource that requires authentication or special headers.
## Installation instructions
diff --git a/source/_integrations/russound_rio.markdown b/source/_integrations/russound_rio.markdown
index dfe280966f8..7db8867b7dd 100644
--- a/source/_integrations/russound_rio.markdown
+++ b/source/_integrations/russound_rio.markdown
@@ -27,6 +27,7 @@ This integration allows you to connect the following controllers:
- Russound MBX-PRE
- Russound MBX-AMP
+- Russound ACA-E5
- Russound MCA-C3
- Russound MCA-C5
- Russound MCA-66
diff --git a/source/_integrations/russound_rnet.markdown b/source/_integrations/russound_rnet.markdown
index 1030d639a95..4f7828622d0 100644
--- a/source/_integrations/russound_rnet.markdown
+++ b/source/_integrations/russound_rnet.markdown
@@ -27,7 +27,6 @@ Connecting to the Russound device is only possible by TCP, you can make use of a
This integration allows you to connect the following controllers:
-- Russound ACA-E5
- Russound CAS44
- Russound CAA66
- Russound CAM6.6
diff --git a/source/_integrations/scrape.markdown b/source/_integrations/scrape.markdown
index 3d19471847e..fd53b078ccb 100644
--- a/source/_integrations/scrape.markdown
+++ b/source/_integrations/scrape.markdown
@@ -54,6 +54,10 @@ payload:
description: The payload to send with a POST request. Depends on the service, but usually formed as JSON.
required: false
type: string
+payload_template:
+ description: The payload to send with a POST request with template support.
+ required: false
+ type: template
verify_ssl:
description: Verify the SSL certificate of the endpoint.
required: false
diff --git a/source/_integrations/shelly.markdown b/source/_integrations/shelly.markdown
index 6fc908c3505..74ddcd28cc3 100644
--- a/source/_integrations/shelly.markdown
+++ b/source/_integrations/shelly.markdown
@@ -43,6 +43,7 @@ ha_platforms:
- update
- valve
ha_integration_type: device
+ha_quality_scale: silver
---
Integrate [Shelly devices](https://shelly.com) into Home Assistant.
diff --git a/source/_integrations/shelly_zwave.markdown b/source/_integrations/shelly_zwave.markdown
index 87014a9d4c8..041c35bec32 100644
--- a/source/_integrations/shelly_zwave.markdown
+++ b/source/_integrations/shelly_zwave.markdown
@@ -9,8 +9,6 @@ ha_category:
- Plug
ha_domain: shelly
ha_integration_type: brand
-works_with:
- - zwave
ha_platforms:
- binary_sensor
- sensor
@@ -19,9 +17,7 @@ ha_iot_standard: zwave
ha_brand: true
---
-[Shelly](https://shelly.com) is a member of the Works with Home Assistant partner program for their Z-Wave products. Shelly is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Shelly Z-Wave devices work locally and integrate seamlessly with the Z-Wave integration in Home Assistant (Z-Wave stick required). As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
+[Shelly](https://shelly.com) Z-Wave devices work locally and integrate seamlessly with the Z-Wave integration in Home Assistant (Z-Wave stick required). As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
{% my add_zwave_device badge domain=page.ha_domain %}
diff --git a/source/_integrations/siemens.markdown b/source/_integrations/siemens.markdown
index 99802d877c2..2d742d70e30 100644
--- a/source/_integrations/siemens.markdown
+++ b/source/_integrations/siemens.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/spotify.markdown b/source/_integrations/spotify.markdown
index 8ec0fdb380a..179837fbc73 100644
--- a/source/_integrations/spotify.markdown
+++ b/source/_integrations/spotify.markdown
@@ -29,7 +29,7 @@ library from Home Assistant.
- Spotify compatible playback [source](#selecting-output-source) device
- A Spotify Developer application. Instructions for that are in
the next step.
-
+
### Create a Spotify application
For Home Assistant to communicate with Spotify, we need to create
@@ -45,17 +45,17 @@ to allow you to log in with your Spotify account.
3. Select the [**Create app**](https://developer.spotify.com/dashboard/create) button in the top right.
- 
-
+ 
+
4. Enter a name and description; feel free to use any name and description you like.
- Set the _"Redirect URI"_ to the following:
-
- `https://my.home-assistant.io/redirect/oauth`
+ - Set the _"Redirect URI"_ to the following:
- Please copy and paste the exact URL above. You **do not** have to change it.
+ `https://my.home-assistant.io/redirect/oauth`
- 
+ - Please copy and paste the exact URL above. You **do not** have to change it.
+
+ 
5. Select Web API.
@@ -65,22 +65,22 @@ to allow you to log in with your Spotify account.
7. Spotify will now show the new application you have just created. Select
the **Settings** button in the top right to configure it.
- 
+ 
8. Before we can start configuring Home Assistant, we need to grab the application
credentials Home Assistant needs.
- Select on the **View client secret** button to reveal the client secret.
+ - Select on the **View client secret** button to reveal the client secret.
- 
+ 
9. The _"Client ID"_ and _"Client secret"_ are the two pieces of information
that Home Assistant needs to communicate with Spotify and is what we
call: Application credentials.
- 
+ 
- You will need the _"Client ID"_ and _"Client secret"_ during the Spotify
+ - You will need the _"Client ID"_ and _"Client secret"_ during the Spotify
integration setup process in Home Assistant.
You can now continue with the next chapter to configure the Spotify integration
@@ -103,7 +103,7 @@ Internal examples: `http://192.168.0.2:8123/auth/external/callback`, `http://hom
## Data updates
-The integration polls at least every 30 seconds.
+The integration {% term polling polls %} at least every 30 seconds.
If the track that is playing ends in less than 30 seconds, the integration will poll again after the track has ended to update the state again.
## Using multiple Spotify accounts
diff --git a/source/_integrations/sql.markdown b/source/_integrations/sql.markdown
index dc7daae9421..f2f8e0b7a2a 100644
--- a/source/_integrations/sql.markdown
+++ b/source/_integrations/sql.markdown
@@ -120,6 +120,17 @@ sql:
type: template
{% endconfiguration %}
+## Data updates
+
+By default, the integration executes the SQL query to update the sensor every 30 seconds.
+If you wish to update at a different interval, you can disable the automatic refresh in the integration’s system options (**Enable polling for updates**) and create your own automation with your desired frequency.
+
+For more detailed steps on how to define a custom interval, follow the procedure below.
+
+### Defining a custom polling interval
+
+{% include common-tasks/define_custom_polling.md %}
+
## Information
See [supported engines](/integrations/recorder/#custom-database-engines) for which you can connect with this integration.
diff --git a/source/_integrations/squeezebox.markdown b/source/_integrations/squeezebox.markdown
index c75fe02431b..01be6ee92a0 100644
--- a/source/_integrations/squeezebox.markdown
+++ b/source/_integrations/squeezebox.markdown
@@ -3,6 +3,7 @@ title: Squeezebox (Lyrion Music Server)
description: Instructions on how to integrate Squeezebox players and a Lyrion Music Server (LMS) into Home Assistant.
ha_category:
- Media player
+ - Update
ha_release: pre 0.7
ha_iot_class: Local Polling
ha_domain: squeezebox
diff --git a/source/_integrations/sun.markdown b/source/_integrations/sun.markdown
index 26e5f270b2e..8958c285055 100644
--- a/source/_integrations/sun.markdown
+++ b/source/_integrations/sun.markdown
@@ -6,7 +6,7 @@ ha_category:
ha_release: pre 0.7
ha_quality_scale: internal
ha_codeowners:
- - '@Swamp-Ig'
+ - '@home-assistant/core'
ha_iot_class: Calculated
ha_domain: sun
ha_config_flow: true
diff --git a/source/_integrations/switch.template.markdown b/source/_integrations/switch.template.markdown
deleted file mode 100644
index a986dbde679..00000000000
--- a/source/_integrations/switch.template.markdown
+++ /dev/null
@@ -1,285 +0,0 @@
----
-title: "Template Switch"
-description: "Instructions on how to integrate Template Switches into Home Assistant."
-ha_category:
- - Switch
- - Helper
-ha_release: 0.13
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_config_flow: true
-ha_platforms:
- - switch
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform creates switches that combines components.
-
-For example, if you have a garage door with a toggle switch that operates the motor and a sensor that allows you know whether the door is open or closed, you can combine these into a switch that knows whether the garage door is open or closed.
-
-This can simplify the GUI and make it easier to write automations.
-
-{% include integrations/config_flow.md %}
-
-{% important %}
-To be able to add **{% my helpers title="Helpers" %}** via the user interface, you should have `default_config:` in your {% term "`configuration.yaml`" %}. It should already be there by default unless you removed it.
-{% endimportant %}
-
-{% note %}
-Configuration using our user interface provides a more limited subset of options, making this integration more accessible while covering most use cases.
-
-If you need more specific features for your use case, the manual [YAML-configuration section](#yaml-configuration) of this integration might provide them.
-{% endnote %}
-
-## YAML Configuration
-
-To enable Template Switches in your installation, add the following to your {% term "`configuration.yaml`" %} file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-switch:
- - platform: template
- switches:
- skylight:
- value_template: "{{ is_state('sensor.skylight', 'on') }}"
- turn_on:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_open
- turn_off:
- action: switch.turn_off
- target:
- entity_id: switch.skylight_close
-```
-
-{% endraw %}
-
-{% configuration %}
- switches:
- description: List of your switches.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this switch. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: Defines a template to set the state of the switch. If not defined, the switch will optimistically assume all commands are successful.
- required: false
- type: template
- default: optimistic
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- turn_on:
- description: Defines an action or list of actions to run when the switch is turned on.
- required: true
- type: action
- turn_off:
- description: Defines an action or list of actions to run when the switch is turned off.
- required: true
- type: action
- icon_template:
- description: Defines a template for the icon of the switch.
- required: false
- type: template
- entity_picture_template:
- description: Defines a template for the picture of the switch.
- required: false
- type: template
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an entity's state and attribute in templates and actions.
-
-## Considerations
-
-If you are using the state of a platform that takes extra time to load, the Template Switch may get an `unknown` state during startup. This results in error messages in your log file until that platform has completed loading. If you use `is_state()` function in your template, you can avoid this situation. For example, you would replace {% raw %}`{{ states.switch.source.state == 'on') }}`{% endraw %} with this equivalent that returns `true`/`false` and never gives an unknown result: {% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %}
-
-## Examples
-
-In this section you find some real-life examples of how to use this switch.
-
-### Invert a Switch
-
-This example shows a switch that is the inverse of another switch.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- invert:
- value_template: "{{ not is_state('switch.target', 'on') }}"
- availability_template: "{{ has_value('switch.target') }}"
- turn_on:
- action: switch.turn_off
- target:
- entity_id: switch.target
- turn_off:
- action: switch.turn_on
- target:
- entity_id: switch.target
-```
-
-{% endraw %}
-
-### Toggle Switch
-
-This example shows a switch that takes its state from a sensor and toggles a switch.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- blind:
- friendly_name: "Blind"
- value_template: "{{ is_state_attr('switch.blind_toggle', 'sensor_state', 'on') }}"
- turn_on:
- action: switch.toggle
- target:
- entity_id: switch.blind_toggle
- turn_off:
- action: switch.toggle
- target:
- entity_id: switch.blind_toggle
-```
-
-{% endraw %}
-
-### Multiple actions for turn_on or turn_off
-
-This example shows multiple actions for turn_on and turn_off.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- copy:
- value_template: "{{ is_state('switch.source', 'on') }}"
- turn_on:
- - action: switch.turn_on
- target:
- entity_id: switch.target
- - action: light.turn_on
- target:
- entity_id: light.target
- data:
- brightness_pct: 40
- turn_off:
- - action: switch.turn_off
- target:
- entity_id: switch.target
- - action: light.turn_off
- target:
- entity_id: light.target
-```
-
-{% endraw %}
-
-### Sensor and Two Switches
-
-This example shows a switch that takes its state from a sensor, and uses two
-momentary switches to control a device.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- skylight:
- friendly_name: "Skylight"
- value_template: "{{ is_state('sensor.skylight', 'on') }}"
- turn_on:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_open
- turn_off:
- action: switch.turn_on
- target:
- entity_id: switch.skylight_close
-```
-
-{% endraw %}
-
-### Change The Icon
-
-This example shows how to change the icon based on the state of the garage door.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- garage:
- value_template: "{{ is_state('cover.garage_door', 'open') }}"
- turn_on:
- action: cover.open_cover
- target:
- entity_id: cover.garage_door
- turn_off:
- action: cover.close_cover
- target:
- entity_id: cover.garage_door
- icon_template: >-
- {% if is_state('cover.garage_door', 'open') %}
- mdi:garage-open
- {% else %}
- mdi:garage
- {% endif %}
-```
-
-{% endraw %}
-
-### Change The Entity Picture
-
-This example shows how to change the entity picture based on the state of the garage door.
-
-{% raw %}
-
-```yaml
-switch:
- - platform: template
- switches:
- garage:
- value_template: "{{ is_state('cover.garage_door', 'open') }}"
- turn_on:
- action: cover.open_cover
- target:
- entity_id: cover.garage_door
- turn_off:
- action: cover.close_cover
- target:
- entity_id: cover.garage_door
- entity_picture_template: >-
- {% if is_state('cover.garage_door', 'open') %}
- /local/garage-open.png
- {% else %}
- /local/garage-closed.png
- {% endif %}
-```
-
-{% endraw %}
diff --git a/source/_integrations/switchbot.markdown b/source/_integrations/switchbot.markdown
index 486b6271200..25ad07a6d2c 100644
--- a/source/_integrations/switchbot.markdown
+++ b/source/_integrations/switchbot.markdown
@@ -4,12 +4,12 @@ description: Instructions on how to set up SwitchBot Devices.
ha_category:
- Binary sensor
- Cover
+ - Fan
- Light
- Lock
- Sensor
- Switch
- Vacuum
- - Fan
ha_release: 0.78
ha_iot_class: Local Push
ha_codeowners:
@@ -18,6 +18,7 @@ ha_codeowners:
- '@murtas'
- '@Eloston'
- '@dsypniewski'
+ - '@zerzhang'
ha_domain: switchbot
ha_bluetooth: true
ha_platforms:
@@ -33,6 +34,7 @@ ha_platforms:
- vacuum
ha_config_flow: true
ha_integration_type: integration
+ha_quality_scale: gold
---
The SwitchBot integration allows you to control SwitchBot [devices](https://www.switch-bot.com/) such as sensors, locks, shades, lights, plugs, robot vacuums, hubs and etc.
@@ -258,7 +260,7 @@ The close button will close the blinds to the closest closed position (either 0%
##### Simple cover template entity
-Some integrations may expose your SwitchBot Blind Tilt to other actions which expect that 100% is open and 0% is fully closed. Using a [Cover Template](/integrations/cover.template), a proxy entity can be created which will be open at 100% and closed at 0%. This template entity is limited to closing in one direction.
+Some integrations may expose your SwitchBot Blind Tilt to other actions which expect that 100% is open and 0% is fully closed. Using a [Cover Template](/integrations/template/#cover), a proxy entity can be created which will be open at 100% and closed at 0%. This template entity is limited to closing in one direction.
{% raw %}
diff --git a/source/_integrations/switchbot_cloud.markdown b/source/_integrations/switchbot_cloud.markdown
index dfa0d89a348..71115ac577a 100644
--- a/source/_integrations/switchbot_cloud.markdown
+++ b/source/_integrations/switchbot_cloud.markdown
@@ -76,4 +76,4 @@ For vacuums, the states are updated from SwitchBot's cloud.
{% warning %}
Only ONE webhook URL seems to be accepted by the SwitchBot's cloud. So, if you want several applications notified, you need to use a “proxy” to re-dispatch the message to the other applications.
-{% endwarning %}
\ No newline at end of file
+{% endwarning %}
diff --git a/source/_integrations/tasmota.markdown b/source/_integrations/tasmota.markdown
index 185dcf63f94..78b10d153a7 100644
--- a/source/_integrations/tasmota.markdown
+++ b/source/_integrations/tasmota.markdown
@@ -31,7 +31,7 @@ This integration allows you to control [Tasmota](https://tasmota.github.io/docs/
- MQTT broker and the [MQTT integration](/integrations/mqtt/) set up in Home Assistant.
- Tasmota devices' MQTT setting configured to communicate with the MQTT broker.
- Tasmota devices flashed with version 9.2, or later (`tasmota-lite.bin` does not support this integration).
-- Tasmota devices configured for native discovery (`SetOption19 0`).
+- Tasmota devices configured for native discovery (`SetOption19 0`). Go to the web interface of your Tasmota device, select **Tools** and then **Console**. Where you can see the placeholder **Enter command** type or paste `SetOption19 0` and hit **Return**.
- Although the Tasmota integration supports custom fulltopic it is strongly suggested to leave fulltopic at its default, Tasmota does not prevent setting an invalid or non-unique fulltopic, for example a fulltopic without the `%prefix%` or `%topic%` tokens.
## Supported features
diff --git a/source/_integrations/tedee.markdown b/source/_integrations/tedee.markdown
index 0c254a7385b..a2f8e82af8c 100644
--- a/source/_integrations/tedee.markdown
+++ b/source/_integrations/tedee.markdown
@@ -58,6 +58,10 @@ This integration supports
- **Semi locked**: indicates whether the lock is in a "semi-locked" position. "Semi-locked" means the lock has been turned manually and is between its normal end positions. The lock itself will be unavailable in this position.
- **Lock uncalibrated** (disabled by default): Shows when the lock is in an "uncalibrated state".
+{% note %}
+The `lock.open` service will only pull the spring if the lock is configured with "**auto pull-spring enabled**" in the tedee app. That is due to a limitation in tedee's API.
+{% endnote %}
+
## Sensors
The integration currently offers two sensors: A **battery** sensor, indicating the charge of your lock, and a **"pull spring duration"** sensor, indicating how long (in seconds) your latch will stay pulled after a pull operation (if supported).
diff --git a/source/_integrations/template.markdown b/source/_integrations/template.markdown
index 6ad3510d90f..d7364e7d59c 100644
--- a/source/_integrations/template.markdown
+++ b/source/_integrations/template.markdown
@@ -22,7 +22,6 @@ ha_iot_class: Local Push
ha_quality_scale: internal
ha_codeowners:
- '@Petro31'
- - '@PhracturedBlue'
- '@home-assistant/core'
ha_domain: template
ha_platforms:
@@ -51,18 +50,22 @@ related:
The `template` integration allows creating entities which derive their values from other data. This is done by specifying [templates](/docs/configuration/templating/) for properties of an entity, like the name or the state.
-Alarm control panels, binary sensors, buttons, covers, fans, images, lights, locks, numbers, selects, sensors, switches, vacuums, and weathers are covered on this page. They can be configured using [UI](#configuration) or [YAML](#yaml-configuration) file.
+There is currently support for the following device types within Home Assistant:
-For Legacy types, please see the specific pages:
-
-- [Alarm control panel](/integrations/alarm_control_panel.template/)
-- [Cover](/integrations/cover.template/)
-- [Fan](/integrations/fan.template/)
-- [Light](/integrations/light.template/)
-- [Lock](/integrations/lock.template/)
-- [Switch](/integrations/switch.template/)
-- [Vacuum](/integrations/vacuum.template/)
-- [Weather](/integrations/weather.template/)
+- [Alarm control panel](#alarm-control-panel)
+- [Binary sensor](#binary-sensor)
+- [Button](#button)
+- [Cover](#cover)
+- [Fan](#fan)
+- [Image](#image)
+- [Light](#light)
+- [Lock](#lock)
+- [Number](#number)
+- [Select](#select)
+- [Sensor](#sensor)
+- [Switch](#switch)
+- [Vacuum](#vacuum)
+- [Weather](#weather)
{% include integrations/config_flow.md %}
@@ -78,11 +81,9 @@ If you need more specific features for your use case, the manual [YAML-configura
## YAML configuration
-Entities (alarm control panels, binary sensors, buttons, covers, fans, images, lights, locks, numbers, selects, sensors, switches, vacuums, and weathers) are defined in your YAML configuration files under the `template:` key. You can define multiple configuration blocks as a list. Each block defines sensor/binary sensor/number/select entities and can contain optional update triggers.
+Entities are defined in your YAML configuration files under the `template:` key. You can define multiple configuration blocks as a list. Each block defines sensor/binary sensor/number/select entities and can contain optional update triggers.
-_For old sensor/binary sensor configuration format, [see below](#legacy-binary-sensor-configuration-format)._
-
-### State-based template alarm control panels, binary sensors, buttons, covers, fans, images, lights, numbers, selects, sensors, switches, vacuums, and weathers
+### State-based template entities
Template entities will by default update as soon as any of the referenced data in the template updates.
@@ -140,6 +141,14 @@ template:
### Configuration reference
{% configuration %}
+actions:
+ description: Define actions to be executed when the trigger fires (for trigger-based entities only). Optional. Variables set by the action script are available when evaluating entity templates. This can be used to interact with anything using actions, in particular actions with [response data](/docs/scripts/perform-actions#use-templates-to-handle-response-data). [See action documentation](/docs/automation/action).
+ required: false
+ type: list
+conditions:
+ description: Define conditions that have to be met after a trigger fires and before any actions are executed or sensor updates are performed (for trigger-based entities only). Optional. [See condition documentation](/docs/automation/condition).
+ required: false
+ type: list
triggers:
description: Define one or multiple automation triggers to update the entities. Optional. If omitted will update based on referenced entities. [See trigger documentation](/docs/automation/trigger).
required: false
@@ -148,16 +157,8 @@ unique_id:
description: The unique ID for this config block. This will be prefixed to all unique IDs of all entities in this block.
required: false
type: string
-conditions:
- description: Define conditions that have to be met after a trigger fires and before any actions are executed or sensor updates are performed (for trigger-based entities only). Optional. [See condition documentation](/docs/automation/condition).
- required: false
- type: list
-actions:
- description: Define actions to be executed when the trigger fires (for trigger-based entities only). Optional. Variables set by the action script are available when evaluating entity templates. This can be used to interact with anything using actions, in particular actions with [response data](/docs/scripts/perform-actions#use-templates-to-handle-response-data). [See action documentation](/docs/automation/action).
- required: false
- type: list
variables:
- description: Key-value pairs of variable definitions which can be referenced and used in the templates below (for trigger-based entities only). Mostly used by blueprints.
+ description: Key-value pairs of variable definitions which can be referenced and used in the templates below (for trigger-based entities only). Mostly used by blueprints. With State-based template entities, variables are only resolved when the configuration is loaded or reloaded. Trigger based template entities resolve variables between triggers and actions.
required: false
type: map
keys:
@@ -165,91 +166,111 @@ variables:
description: The variable name and corresponding value.
required: true
type: string
-sensor:
- description: List of sensors
- required: true
- type: list
- keys:
- state:
- description: "Defines a template to get the state of the sensor. If the sensor is numeric, i.e. it has a `state_class` or a `unit_of_measurement`, the state template must render to a number or to `none`. The state template must not render to a string, including `unknown` or `unavailable`. An `availability` template may be defined to suppress rendering of the state template."
- required: true
- type: template
- unit_of_measurement:
- description: "Defines the units of measurement of the sensor, if any. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value."
- required: false
- type: string
- default: None
- state_class:
- description: "The [state_class](https://developers.home-assistant.io/docs/core/entity/sensor#available-state-classes) of the sensor. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value. If you desire to include the sensor in long-term statistics, include this key and assign it the appropriate value"
- required: false
- type: string
- default: None
- last_reset:
- description: "Defines a template that describes when the state of the sensor was last reset. Must render to a valid `datetime`. Only available when `state_class` is set to `total`"
- required: false
- type: template
- default: None
-binary_sensor:
- description: List of binary sensors
- required: true
- type: list
- keys:
- state:
- description: The sensor is `on` if the template evaluates as `True`, `yes`, `on`, `enable` or a positive number. Any other value will render it as `off`. The actual appearance in the frontend (`Open`/`Closed`, `Detected`/`Clear` etc) depends on the sensor's device_class value
- required: true
- type: template
- delay_on:
- description: The amount of time (e.g. `0:00:05`) the template state must be ***met*** before this sensor will switch to `on`. This can also be a template.
- required: false
- type: time
- delay_off:
- description: The amount of time the template state must be ***not met*** before this sensor will switch to `off`. This can also be a template.
- required: false
- type: time
- auto_off:
- description: "**Requires a trigger.** After how much time the entity should turn off after it rendered 'on'."
- required: false
- type: time
-"[both sensor and binary_sensor entities]":
- description: Fields that can be used above for both sensors and binary sensors.
- required: false
- type: map
- keys:
- picture:
- description: Defines a template for the entity picture of the sensor.
- required: false
- type: template
- attributes:
- description: Defines templates for attributes of the sensor.
- required: false
- type: map
- keys:
- "attribute: template":
- description: The attribute and corresponding template.
- required: true
- type: template
- device_class:
- description: Sets the class of the device, changing the device state and icon that is displayed on the UI (see below). It does not set the `unit_of_measurement`.
- required: false
- type: device_class
- default: None
+
+{% endconfiguration %}
+
+## Common Device Configuration Options
+
+Each entity platform has its own set of configuration options, but there are some common options that can be used across all entity platforms.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ binary_sensor:
+ # Common configuration options
+ - unique_id: my_unique_sensor_id
+ availability: "{{ 'sensor.watts' | has_value }}"
+ icon: "{{ 'mdi:flash-alert' if states('sensor.watts') | float > 100 else 'mdi:flash' }}"
+ name: "{{ states('sensor.watts') }} Alert"
+ # Entity specific configuration options
+ state: "{{ states('sensor.watts') | float > 100}}"
+ device_class: problem
+```
+
+{% endraw %}
+
+{% configuration %}
+ availability:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison is not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ icon:
+ description: Defines a template for the icon of the entity.
+ required: false
+ type: template
+ picture:
+ description: Defines a template for the entity picture of the sensor.
+ required: false
+ type: template
+ name:
+ description: Defines a template to get the name of the entity.
+ required: false
+ type: template
+ unique_id:
+ description: An ID that uniquely identifies this entity. Will be combined with the unique ID of the configuration block if available. This allows changing the `name`, `icon` and `entity_id` from the web interface.
+ required: false
+ type: string
+
+{% endconfiguration %}
+
+## Alarm Control Panel
+
+The template alarm control panel platform allows you to create a alarm control panels with templates to define the state and scripts to define each actions.
+
+Alarm control panel entities can be created from the frontend in the Helpers section or via YAML. Alarm control panel entities do not support trigger-based configurations.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - alarm_control_panel:
+ - name: "Alarm Control Panel 1"
+ state: "{{ states('input_select.panel_1_state') }}"
+ arm_away:
+ action: script.arm_panel_away
+ arm_home:
+ action: script.arm_panel_home
+ disarm:
+ action: script.disarm_panel
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: input_select.panel_1_state
+ alarm_control_panel:
+ - name: "Alarm Control Panel 1"
+ state: "{{ states('input_select.panel_1_state') }}"
+ arm_away:
+ action: script.arm_panel_away
+ arm_home:
+ action: script.arm_panel_home
+ disarm:
+ action: script.disarm_panel
+```
+
+{% endraw %}
+
+{% configuration %}
alarm_control_panel:
description: List of alarm control panels
required: true
type: map
keys:
- state:
- description: "Defines a template to set the state of the alarm panel. Only the states `armed_away`, `armed_home`, `armed_night`, `armed_vacation`, `arming`, `disarmed`, `pending`, `triggered` and `unavailable` are used."
- required: false
- type: template
- disarm:
- description: Defines an action to run when the alarm is disarmed.
- required: false
- type: action
arm_away:
description: Defines an action to run when the alarm is armed to away mode.
required: false
type: action
+ arm_custom_bypass:
+ description: Defines an action to run when the alarm is armed to custom bypass mode.
+ required: false
+ type: action
arm_home:
description: Defines an action to run when the alarm is armed to home mode.
required: false
@@ -262,14 +283,6 @@ alarm_control_panel:
description: Defines an action to run when the alarm is armed to vacation mode.
required: false
type: action
- arm_custom_bypass:
- description: Defines an action to run when the alarm is armed to custom bypass mode.
- required: false
- type: action
- trigger:
- description: Defines an action to run when the alarm is triggered.
- required: false
- type: action
code_arm_required:
description: If true, the code is required to arm the alarm.
required: false
@@ -280,65 +293,239 @@ alarm_control_panel:
required: false
type: string
default: number
-number:
- description: List of numbers
- required: true
- type: map
- keys:
- state:
- description: Template for the number's current value.
- required: true
- type: template
- unit_of_measurement:
- description: Defines the units of measurement of the number, if any.
+ disarm:
+ description: Defines an action to run when the alarm is disarmed.
required: false
- type: string
+ type: action
+ state:
+ description: "Defines a template to set the state of the alarm panel. Only the states `armed_away`, `armed_home`, `armed_night`, `armed_vacation`, `arming`, `disarmed`, `pending`, `triggered` and `unavailable` are used."
+ required: false
+ type: template
+ trigger:
+ description: Defines an action to run when the alarm is triggered.
+ required: false
+ type: action
+{% endconfiguration %}
+
+## Binary Sensor
+
+The template binary sensor platform allows you to create binary sensors with templates to define the state and attributes.
+
+Binary sensor entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - binary_sensor:
+ - name: Sun Up
+ state: >
+ {{ is_state("sun.sun", "above_horizon") }}
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sun.sun
+ binary_sensor:
+ - name: Sun Up
+ state: >
+ {{ is_state("sun.sun", "above_horizon") }}
+```
+
+{% endraw %}
+
+{% configuration %}
+binary_sensor:
+ description: List of binary sensors
+ required: true
+ type: list
+ keys:
+ attributes:
+ description: Defines templates for attributes of the entity.
+ required: false
+ type: map
+ keys:
+ "attribute: template":
+ description: The attribute and corresponding template.
+ required: true
+ type: template
+ auto_off:
+ description: "**Requires a trigger.** After how much time the entity should turn off after it rendered 'on'."
+ required: false
+ type: time
+ delay_off:
+ description: The amount of time the template state must be ***not met*** before this sensor will switch to `off`. This can also be a template.
+ required: false
+ type: time
+ delay_on:
+ description: The amount of time (e.g. `0:00:05`) the template state must be ***met*** before this sensor will switch to `on`. This can also be a template.
+ required: false
+ type: time
+ device_class:
+ description: Sets the class of the device, changing the device state and icon that is displayed on the UI (see below). It does not set the `unit_of_measurement`.
+ required: false
+ type: device_class
default: None
- set_value:
- description: Defines actions to run when the number value changes. The variable `value` will contain the number entered.
- required: true
- type: action
- step:
- description: Template for the number's increment/decrement step.
- required: true
- type: template
- min:
- description: Template for the number's minimum value.
- required: false
- type: template
- default: 0.0
- max:
- description: Template for the number's maximum value.
- required: false
- type: template
- default: 100.0
- optimistic:
- description: Flag that defines if number works in optimistic mode. When enabled, the number's state will update immediately when changed through the UI or service calls, without waiting for the template defined in `state` to update. When disabled (default), the number will only update when the `state` template returns a new value.
- required: false
- type: boolean
- default: false
-select:
- description: List of selects
- required: true
- type: map
- keys:
state:
- description: Template for the select's current value.
+ description: The sensor is `on` if the template evaluates as `True`, `yes`, `on`, `enable` or a positive number. Any other value will render it as `off`. The actual appearance in the frontend (`Open`/`Closed`, `Detected`/`Clear` etc) depends on the sensor's device_class value
required: true
type: template
- select_option:
- description: Defines actions to run to select an option from the `options` list. The variable `option` will contain the option selected.
- required: true
- type: action
- options:
- description: Template for the select's available options.
- required: true
- type: template
- optimistic:
- description: Flag that defines if select works in optimistic mode. When enabled, the select's state will update immediately when a new option is chosen through the UI or service calls, without waiting for the template defined in `state` to update. When disabled (default), the select will only update when the `state` template returns a new value.
- required: false
- type: boolean
- default: false
+
+{% endconfiguration %}
+
+### State based binary sensor - Washing Machine Running
+
+This example creates a washing machine "load running" sensor by monitoring an
+energy meter connected to the washer. During the washer's operation, the energy meter will fluctuate wildly, hitting zero frequently even before the load is finished. By utilizing `delay_off`, we can have this sensor only turn off if there has been no washer activity for 5 minutes.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+# Determine when the washing machine has a load running.
+template:
+ - binary_sensor:
+ - name: "Washing Machine"
+ delay_off:
+ minutes: 5
+ state: >
+ {{ states('sensor.washing_machine_power')|float > 0 }}
+```
+
+{% endraw %}
+
+### State based binary sensor - Is Anyone Home
+
+This example is determining if anyone is home based on the combination of device tracking and motion sensors. It's extremely useful if you have kids/baby sitter/grand parents who might still be in your house that aren't represented by a trackable device in Home Assistant. This is providing a composite of Wi-Fi based device tracking and Z-Wave multisensor presence sensors.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - binary_sensor:
+ - name: People home
+ state: >
+ {{ is_state('device_tracker.sean', 'home')
+ or is_state('device_tracker.susan', 'home')
+ or is_state('binary_sensor.office_124', 'on')
+ or is_state('binary_sensor.hallway_134', 'on')
+ or is_state('binary_sensor.living_room_139', 'on')
+ or is_state('binary_sensor.porch_ms6_1_129', 'on')
+ or is_state('binary_sensor.family_room_144', 'on') }}
+```
+
+{% endraw %}
+
+### State based binary sensor - device tracker sensor with latitude and longitude attributes
+
+This example shows how to combine a non-GPS (e.g., NMAP) and GPS device tracker while still including latitude and longitude attributes
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - binary_sensor:
+ - name: My Device
+ state: >
+ {{ is_state('device_tracker.my_device_nmap', 'home') or is_state('device_tracker.my_device_gps', 'home') }}
+ device_class: "presence"
+ attributes:
+ latitude: >
+ {% if is_state('device_tracker.my_device_nmap', 'home') %}
+ {{ state_attr('zone.home', 'latitude') }}
+ {% else %}
+ {{ state_attr('device_tracker.my_device_gps', 'latitude') }}
+ {% endif %}
+ longitude: >
+ {% if is_state('device_tracker.my_device_nmap', 'home') %}
+ {{ state_attr('zone.home', 'longitude') }}
+ {% else %}
+ {{ state_attr('device_tracker.my_device_gps', 'longitude') }}
+ {% endif %}
+```
+
+{% endraw %}
+
+### State based binary sensor - Change the icon when a state changes
+
+This example demonstrates how to use template to change the icon as its state changes. This icon is referencing its own state.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - binary_sensor:
+ - name: Sun Up
+ state: >
+ {{ is_state("sun.sun", "above_horizon") }}
+ icon: >
+ {% if is_state("binary_sensor.sun_up", "on") %}
+ mdi:weather-sunset-up
+ {% else %}
+ mdi:weather-sunset-down
+ {% endif %}
+```
+
+{% endraw %}
+
+### Trigger based binary sensor - Change state and icon when a custom event is received
+
+A more advanced use case could be to set the icon based on the sensor's own state like above, but when triggered by an event. This example demonstrates a binary sensor that turns on momentarily, such as when a doorbell button is pressed.
+
+The binary sensor turns on and sets the matching icon when the appropriate event is received. After 5 seconds, the binary sensor turns off automatically. To ensure the icon gets updated, there must be a trigger for when the state changes to off.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - triggers:
+ - trigger: event
+ event_type: YOUR_EVENT
+ - trigger: state
+ entity_id: binary_sensor.doorbell_rang
+ to: "off"
+ binary_sensor:
+ name: doorbell_rang
+ icon: "{{ (trigger.platform == 'event') | iif('mdi:bell-ring-outline', 'mdi:bell-outline') }}"
+ state: "{{ trigger.platform == 'event' }}"
+ auto_off:
+ seconds: 5
+```
+
+{% endraw %}
+
+## Button
+
+The template button platform allows you to create button entities with scripts to define each action.
+
+Button entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - button:
+ - name: Fast Forward
+ press:
+ action: remote.send_command
+ target:
+ entity_id: remote.living_room
+ data:
+ command: fast_forward
+```
+
+{% endraw %}
+
+{% configuration %}
button:
description: List of buttons
required: true
@@ -348,34 +535,77 @@ button:
description: Defines actions to run to press the button.
required: true
type: action
+{% endconfiguration %}
+
+## Cover
+
+The template cover platform allows you to create covers with templates to define the state and scripts to define each action.
+
+Cover entities can only be created from YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - cover:
+ - name: Garage Door
+ state: "{{ states('sensor.garage_door')|float > 0 }}"
+ device_class: garage
+ open_cover:
+ action: script.open_garage_door
+ close_cover:
+ action: script.close_garage_door
+ stop_cover:
+ action: script.stop_garage_door
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sensor.garage_door
+ cover:
+ - name: Garage Door
+ state: "{{ trigger.to_state.state|float(0) > 0 }}"
+ device_class: garage
+ open_cover:
+ action: script.open_garage_door
+ close_cover:
+ action: script.close_garage_door
+ stop_cover:
+ action: script.stop_garage_door
+```
+
+{% endraw %}
+
+{% configuration %}
cover:
description: Characteristics of a cover
type: map
keys:
- state:
- description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `value_template` and a `position_template`](#combining-value_template-and-position_template) are specified, only `opening` and `closing` are set from the `value_template`. If the template produces a `None` value the state will be set to `unknown`.
- required: false
- type: template
- position:
- description: Defines a template to get the position of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current position will be set to `unknown`.
- required: false
- type: template
+ close_cover:
+ description: Defines an action to close the cover.
+ required: inclusive
+ type: action
device_class:
description: Sets the [class of the device](/integrations/cover/), changing the device state and icon that is displayed on the frontend.
required: false
type: string
open_cover:
- description: Defines an action to open the cover. If [`open_cover`](#open_cover) is specified, [`close_cover`](#close_cover) must also be specified. At least one of [`open_cover`](#open_cover) and [`set_cover_position`](#set_cover_position) must be specified.
+ description: Defines an action to open the cover. If `open_cover` is specified, `close_cover` must also be specified. At least one of `open_cover` and `set_cover_position` must be specified.
required: inclusive
type: action
- close_cover:
- description: Defines an action to close the cover.
- required: inclusive
- type: action
- stop_cover:
- description: Defines an action to stop the cover.
+ optimistic:
+ description: Force cover position to use [optimistic mode](#cover-optimistic-mode).
required: false
- type: action
+ type: boolean
+ default: false
+ position:
+ description: Defines a template to get the position of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current position will be set to `unknown`.
+ required: false
+ type: template
set_cover_position:
description: Defines an action to set to a cover position (between `0` and `100`). The variable `position` will contain the entity's set position.
required: false
@@ -384,28 +614,171 @@ cover:
description: Defines an action to set the tilt of a cover (between `0` and `100`). The variable `tilt` will contain the entity's set tilt position.
required: false
type: action
- optimistic:
- description: Force cover position to use [optimistic mode](#optimistic-mode).
- required: false
- type: boolean
- default: false
- tilt_optimistic:
- description: Force cover tilt position to use [optimistic mode](#optimistic-mode).
- required: false
- type: boolean
- default: false
- tilt:
- description: Defines a template to get the tilt state of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value, the current tilt state will be set to `unknown`.
+ state:
+ description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `state` and a `position` template](#combining-state-and-position-templates) are specified, only `opening` and `closing` are set from the `state` template. If the template produces a `None` value the state will be set to `unknown`.
required: false
type: template
+ stop_cover:
+ description: Defines an action to stop the cover.
+ required: false
+ type: action
+ tilt:
+ description: Defines a template to get the tilt state of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value, the current tilt state will be set to `unknown`.
+ required: false
+ type: template
+ tilt_optimistic:
+ description: Force cover tilt position to use [optimistic mode](#cover-optimistic-mode).
+ required: false
+ type: boolean
+ default: false
+
+{% endconfiguration %}
+
+### Cover Optimistic Mode
+
+In optimistic mode, the cover position state is maintained internally. This mode is automatically enabled if neither `state` or `position` are specified. Note that this is unlikely to be very reliable without some feedback mechanism, since there is otherwise no way to know if the cover is moving properly. The cover can be forced into optimistic mode by using the `optimistic` attribute. There is an equivalent mode for `tilt_position` that is enabled when `tilt` is not specified or when the `tilt_optimistic` attribute is used.
+
+### Combining `state` and `position` templates
+
+If both a `state` and a `position` are specified only `opening` and `closing` states are set directly from the `state`, the `open` and `closed` states will instead be derived from the cover position.
+
+| value_template output | result |
+| --------------------- | ------------------------------------ |
+| open | state defined by `position_template` |
+| closed | state defined by `position_template` |
+| true | state defined by `position_template` |
+| false | state defined by `position_template` |
+| opening | state set to `opening` |
+| closing | state set to `closing` |
+| | No change of state or position |
+
+### State based cover - Garage Door
+
+This example converts a garage door with a controllable switch and position sensor into a cover. The condition check is optional, but suggested if you use the same switch to open and close the garage.
+
+{% raw %}
+
+```yaml
+template:
+ - cover:
+ - name: Garage Door
+ device_class: garage
+ position: "{{ states('sensor.garage_door') }}"
+ open_cover:
+ - condition: state
+ entity_id: sensor.garage_door
+ state: "off"
+ - action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+ close_cover:
+ - condition: state
+ entity_id: sensor.garage_door
+ state: "on"
+ - action: switch.turn_off
+ target:
+ entity_id: switch.garage_door
+ stop_cover:
+ action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+ icon: >-
+ {% if states('sensor.garage_door')|float > 0 %}
+ mdi:garage-open
+ {% else %}
+ mdi:garage
+ {% endif %}
+```
+
+{% endraw %}
+
+### State based cover - Optimistic Garage Door with Momentary Switch
+
+This example converts a garage door with a momentary switch.
+
+{% raw %}
+
+```yaml
+template:
+ - cover:
+ - name: Garage Door
+ device_class: garage
+ open_cover:
+ - action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+ close_cover:
+ - action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+ stop_cover:
+ - action: switch.turn_on
+ target:
+ entity_id: switch.garage_door
+```
+
+{% endraw %}
+
+## Fan
+
+The template fan platform allows you to create fans with templates to define the state and scripts to define each action.
+
+Fan entities can only be created from YAML. Fan entities do not support trigger-based configurations.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - fan:
+ - name: "Bedroom fan"
+ state: "{{ states('input_boolean.state') }}"
+ percentage: "{{ states('input_number.percentage') }}"
+ preset_mode: "{{ states('input_select.preset_mode') }}"
+ oscillating: "{{ states('input_select.osc') }}"
+ direction: "{{ states('input_select.direction') }}"
+ turn_on:
+ action: script.fan_on
+ turn_off:
+ action: script.fan_off
+ set_percentage:
+ action: script.fans_set_speed
+ data:
+ percentage: "{{ percentage }}"
+ set_preset_mode:
+ action: script.fans_set_preset_mode
+ data:
+ preset_mode: "{{ preset_mode }}"
+ set_oscillating:
+ action: script.fan_oscillating
+ data:
+ oscillating: "{{ oscillating }}"
+ set_direction:
+ action: script.fan_direction
+ data:
+ direction: "{{ direction }}"
+ speed_count: 6
+ preset_modes:
+ - 'auto'
+ - 'smart'
+ - 'whoosh'
+```
+
+{% endraw %}
+
+{% configuration %}
fan:
description: List of fans
required: true
type: map
keys:
- state:
- description: "Defines a template to get the state of the fan. Valid values: `on`, `off`."
- required: true
+ oscillating:
+ description: "Defines a template to get the osc state of the fan. Valid values: `true`, `false`."
+ required: false
+ type: template
+ direction:
+ description: "Defines a template to get the direction of the fan. Valid values: `forward`, `reverse`."
+ required: false
type: template
percentage:
description: Defines a template to get the speed percentage of the fan.
@@ -415,22 +788,11 @@ fan:
description: Defines a template to get the preset mode of the fan.
required: false
type: template
- oscillating:
- description: "Defines a template to get the osc state of the fan. Valid values: `true`, `false`."
+ preset_modes:
+ description: List of preset modes the fan is capable of. This is an arbitrary list of strings and must not contain any speeds.
required: false
- type: template
- direction:
- description: "Defines a template to get the direction of the fan. Valid values: `forward`, `reverse`."
- required: false
- type: template
- turn_on:
- description: Defines an action to run when the fan is turned on.
- required: true
- type: action
- turn_off:
- description: Defines an action to run when the fan is turned off.
- required: true
- type: action
+ type: [string, list]
+ default: []
set_percentage:
description: Defines an action to run when the fan is given a speed percentage command.
required: false
@@ -447,16 +809,170 @@ fan:
description: Defines an action to run when the fan is given a direction command.
required: false
type: action
- preset_modes:
- description: List of preset modes the fan is capable of. This is an arbitrary list of strings and must not contain any speeds.
- required: false
- type: [string, list]
- default: []
speed_count:
description: The number of speeds the fan supports. Used to calculate the percentage step for the `fan.increase_speed` and `fan.decrease_speed` actions.
required: false
type: integer
default: 100
+ state:
+ description: "Defines a template to get the state of the fan. Valid values: `on`, `off`."
+ required: true
+ type: template
+ turn_on:
+ description: Defines an action to run when the fan is turned on.
+ required: true
+ type: action
+ turn_off:
+ description: Defines an action to run when the fan is turned off.
+ required: true
+ type: action
+
+{% endconfiguration %}
+
+### Converting from speeds to percentage
+
+When converting a fan with 3 speeds from the old fan entity model, the following percentages can be used:
+
+0 - `off`
+33 - `low`
+66 - `medium`
+100 - `high`
+
+### State based fan - Helper fan
+
+This example uses an input_boolean and an input_number to mimic a fan, and the example shows multiple actions for `set_percentage`.
+
+{% raw %}
+
+```yaml
+template:
+ - fan:
+ - name: "Helper Fan"
+ state: "{{ states('input_boolean.state') }}"
+ turn_on:
+ - action: input_boolean.turn_on
+ target:
+ entity_id: input_boolean.state
+ turn_off:
+ - action: input_boolean.turn_off
+ target:
+ entity_id: input_boolean.state
+ speed_count: 6
+ percentage: >
+ {{ states('input_number.percentage') if is_state('input_boolean.state', 'on') else 0 }}
+ set_percentage:
+ - action: input_boolean.turn_{{ 'on' if percentage > 0 else 'off' }}
+ target:
+ entity_id: input_boolean.state
+ - action: input_number.set_value
+ target:
+ entity_id: input_number.percentage
+ data:
+ value: "{{ percentage }}"
+```
+
+{% endraw %}
+
+### State based fan - Fan with preset modes
+
+This example uses an existing fan with only a percentage. It extends the percentage value into useable preset modes without a helper entity.
+
+{% raw %}
+
+```yaml
+template:
+ - fan:
+ - name: "Preset Mode Fan Example"
+ state: "{{ states('fan.percentage_fan') }}"
+ turn_on:
+ - action: fan.turn_on
+ target:
+ entity_id: fan.percentage_fan
+ turn_off:
+ - action: fan.turn_off
+ target:
+ entity_id: fan.percentage_fan
+ percentage: >
+ {{ state_attr('fan.percentage_fan', 'percentage') }}
+ speed_count: 3
+ set_percentage:
+ - action: fan.set_percentage
+ target:
+ entity_id: fan.percentage_fan
+ data:
+ percentage: "{{ percentage }}"
+ preset_modes:
+ - "off"
+ - "low"
+ - "medium"
+ - "high"
+ preset_mode: >
+ {% if is_state('fan.percentage_fan', 'on') %}
+ {% if state_attr('fan.percentage_fan', 'percentage') == 100 %}
+ high
+ {% elif state_attr('fan.percentage_fan', 'percentage') == 66 %}
+ medium
+ {% else %}
+ low
+ {% endif %}
+ {% else %}
+ off
+ {% endif %}
+ set_preset_mode:
+ - action: fan.set_percentage
+ target:
+ entity_id: fan.percentage_fan
+ data:
+ percentage: >-
+ {% if preset_mode == 'high' %}
+ 100
+ {% elif preset_mode == 'medium' %}
+ 66
+ {% elif preset_mode == 'low' %}
+ 33
+ {% else %}
+ 0
+ {% endif %}
+```
+
+{% endraw %}
+
+## Image
+
+The template image platform allows you to create image entities with templates to define the image URL.
+
+Image entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - image:
+ - name: "My Image"
+ url: "http://example.com/image.jpg"
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id:
+ - input_boolean.state
+ image:
+ - name: "My Image"
+ url: >
+ {% if is_state('input_boolean.state', 'on') %}
+ http://example.com/image_on.jpg
+ {% else %}
+ http://example.com/image_off.jpg
+ {% endif %}
+```
+
+{% endraw %}
+
+{% configuration %}
image:
description: List of images
required: true
@@ -471,13 +987,142 @@ image:
required: false
type: boolean
default: true
+{% endconfiguration %}
+
+## Light
+
+The template light platform allows you to create lights with templates to define the state and scripts to define each action.
+
+Light entities can only be created from YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+light:
+ - light:
+ - name: "Theater Lights"
+ level: "{{ state_attr('sensor.theater_brightness', 'lux')|int }}"
+ state: "{{ state_attr('sensor.theater_brightness', 'lux')|int > 0 }}"
+ temperature: "{{states('input_number.temperature_input') | int}}"
+ hs_template: "({{states('input_number.h_input') | int}}, {{states('input_number.s_input') | int}})"
+ effect_list: "{{ state_attr('light.led_strip', 'effect_list') }}"
+ turn_on:
+ action: script.theater_lights_on
+ turn_off:
+ action: script.theater_lights_off
+ set_level:
+ action: script.theater_lights_level
+ data:
+ brightness: "{{ brightness }}"
+ set_temperature:
+ action: input_number.set_value
+ data:
+ value: "{{ color_temp }}"
+ entity_id: input_number.temperature_input
+ set_hs:
+ - action: input_number.set_value
+ data:
+ value: "{{ h }}"
+ entity_id: input_number.h_input
+ - action: input_number.set_value
+ data:
+ value: "{{ s }}"
+ entity_id: input_number.s_input
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ transition: "{{ transition | float }}"
+ hs_color:
+ - "{{ hs[0] }}"
+ - "{{ hs[1] }}"
+ set_effect:
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ effect: "{{ effect }}"
+ supports_transition: "{{ true }}"
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id:
+ - sensor.theater_brightness
+ - input_number.temperature_input
+ - input_number.h_input
+ - input_number.s_input
+ - light.led_strip
+ light:
+ - name: "Theater Lights"
+ level: "{{ state_attr('sensor.theater_brightness', 'lux')|int }}"
+ state: "{{ state_attr('sensor.theater_brightness', 'lux')|int > 0 }}"
+ temperature: "{{states('input_number.temperature_input') | int}}"
+ hs_template: "({{states('input_number.h_input') | int}}, {{states('input_number.s_input') | int}})"
+ effect_list: "{{ state_attr('light.led_strip', 'effect_list') }}"
+ turn_on:
+ action: script.theater_lights_on
+ turn_off:
+ action: script.theater_lights_off
+ set_level:
+ action: script.theater_lights_level
+ data:
+ brightness: "{{ brightness }}"
+ set_temperature:
+ action: input_number.set_value
+ data:
+ value: "{{ color_temp }}"
+ entity_id: input_number.temperature_input
+ set_hs:
+ - action: input_number.set_value
+ data:
+ value: "{{ h }}"
+ entity_id: input_number.h_input
+ - action: input_number.set_value
+ data:
+ value: "{{ s }}"
+ entity_id: input_number.s_input
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ transition: "{{ transition | float }}"
+ hs_color:
+ - "{{ hs[0] }}"
+ - "{{ hs[1] }}"
+ set_effect:
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ effect: "{{ effect }}"
+ supports_transition: "{{ true }}"
+```
+
+{% endraw %}
+
+{% configuration %}
light:
description: List of your lights.
required: true
type: map
keys:
- state:
- description: Defines a template to set the state of the light. If not defined, the switch will optimistically assume all commands are successful.
+ effect:
+ description: Defines a template to get the effect of the light.
+ required: inclusive
+ type: template
+ default: optimistic
+ effect_list:
+ description: Defines a template to get the list of supported effects. Must render a list.
+ required: inclusive
+ type: template
+ default: optimistic
+ hs:
+ description: Defines a template to get the HS color of the light. Must render a tuple (hue, saturation).
required: false
type: template
default: optimistic
@@ -486,13 +1131,13 @@ light:
required: false
type: template
default: optimistic
- temperature:
- description: Defines a template to get the color temperature of the light.
+ min_mireds:
+ description: Defines a template to get the minimum mired value of the light.
required: false
type: template
default: optimistic
- hs:
- description: Defines a template to get the HS color of the light. Must render a tuple (hue, saturation).
+ max_mireds:
+ description: Defines a template to get the maximum mired value of the light.
required: false
type: template
default: optimistic
@@ -511,38 +1156,9 @@ light:
required: false
type: template
default: optimistic
- supports_transition:
- description: Defines a template to get if the light supports transition. Should return a boolean value (True/False). If this value is `True`, the transition parameter in a `turn on` or `turn off` call will be passed as a named parameter `transition` in either of the scripts.
- required: false
- type: template
- default: false
- effect_list:
- description: Defines a template to get the list of supported effects. Must render a list.
+ set_effect:
+ description: Defines an action to run when the light is given an effect command. Receives the variable `effect`. May also receive the variables `brightness`, and/or `transition`.
required: inclusive
- type: template
- default: optimistic
- effect:
- description: Defines a template to get the effect of the light.
- required: inclusive
- type: template
- default: optimistic
- min_mireds:
- description: Defines a template to get the minimum mired value of the light.
- required: false
- type: template
- default: optimistic
- max_mireds:
- description: Defines a template to get the maximum mired value of the light.
- required: false
- type: template
- default: optimistic
- turn_on:
- description: Defines an action to run when the light is turned on. May receive the variables `brightness` and/or `transition`.
- required: true
- type: action
- turn_off:
- description: Defines an action to run when the light is turned off. May receive the variable `transition`.
- required: true
type: action
set_level:
description: Defines an action to run when the light is given a brightness command. The script will only be called if the `turn_on` call only ha brightness, and optionally transition. Receives variables `brightness` and, optionally, `transition`.
@@ -568,19 +1184,174 @@ light:
description: "Defines an action to run when the light is given an RGBWW color command. Available variables: `rgbww` as a tuple, `rgb` as a tuple, `r`, `g` `b`, `cw` and `ww`."
required: false
type: action
- set_effect:
- description: Defines an action to run when the light is given an effect command. Receives the variable `effect`. May also receive the variables `brightness`, and/or `transition`.
- required: inclusive
+ state:
+ description: Defines a template to set the state of the light. If not defined, the switch will optimistically assume all commands are successful.
+ required: false
+ type: template
+ default: optimistic
+ supports_transition:
+ description: Defines a template to get if the light supports transition. Should return a boolean value (True/False). If this value is `True`, the transition parameter in a `turn on` or `turn off` call will be passed as a named parameter `transition` in either of the scripts.
+ required: false
+ type: template
+ default: false
+ temperature:
+ description: Defines a template to get the color temperature of the light.
+ required: false
+ type: template
+ default: optimistic
+ turn_on:
+ description: Defines an action to run when the light is turned on. May receive the variables `brightness` and/or `transition`.
+ required: true
type: action
+ turn_off:
+ description: Defines an action to run when the light is turned off. May receive the variable `transition`.
+ required: true
+ type: action
+
+{% endconfiguration %}
+
+### Light Considerations
+
+Transition doesn't have its own script, it will instead be passed as a named parameter `transition` to the `turn_on`, `turn_off`, `brightness`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts. Brightness will be passed as a named parameter `brightness` to either of `turn_on`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts if the corresponding parameter is also in the call. In this case, the brightness script (`set_level`) will not be called. If only brightness is passed to `light.turn_on` action, then `set_level` script is called.
+
+### State based light - Theater Volume Control
+
+This example shows a light that is actually a home theater's volume. This
+integration gives you the flexibility to provide whatever you'd like to send as
+the payload to the consumer including any scale conversions you may need to
+make; the [media player integration](/integrations/media_player/) needs a floating
+point percentage value from `0.0` to `1.0`.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+template:
+ - light:
+ - name: Receiver Volume
+ state: >-
+ {% if is_state('media_player.receiver', 'on') %}
+ {% if state_attr('media_player.receiver', 'is_volume_muted') %}
+ off
+ {% else %}
+ on
+ {% endif %}
+ {% else %}
+ off
+ {% endif %}
+ turn_on:
+ action: media_player.volume_mute
+ target:
+ entity_id: media_player.receiver
+ data:
+ is_volume_muted: false
+ turn_off:
+ action: media_player.volume_mute
+ target:
+ entity_id: media_player.receiver
+ data:
+ is_volume_muted: true
+ set_level:
+ action: media_player.volume_set
+ target:
+ entity_id: media_player.receiver
+ data:
+ volume_level: "{{ (brightness / 255 * 100)|int / 100 }}"
+ level: >-
+ {% if is_state('media_player.receiver', 'on') %}
+ {{ (state_attr('media_player.receiver', 'volume_level')|float * 255)|int }}
+ {% else %}
+ 0
+ {% endif %}
+```
+
+{% endraw %}
+
+### State based light - Make a global light entity for a multi-segment WLED light
+
+This example shows how to group together 2 RGBW segments from the same WLED controller into a single usable light.
+
+{% raw %}
+
+```yaml
+template:
+ - light:
+ unique_id: 28208f257b54c44e50deb2d618d44710
+ name: Multi-segment Wled control
+ state: "{{ states('light.wled_master') }}"
+ level: "{{ state_attr('light.wled_master', 'brightness')|d(0,true)|int }}"
+ rgbw: (
+ {{ (state_attr('light.wled_segment_0', 'rgbw_color')[0]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[0]|d(0))/2 }},
+ {{ (state_attr('light.wled_segment_0', 'rgbw_color')[1]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[1]|d(0))/2 }},
+ {{ (state_attr('light.wled_segment_0', 'rgbw_color')[2]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[2]|d(0))/2 }},
+ {{ (state_attr('light.wled_segment_0', 'rgbw_color')[3]|d(0) + state_attr('light.wled_segment_1', 'rgbw_color')[3]|d(0))/2 }}
+ )
+ effect_list: "{{ state_attr('light.wled_segment_0', 'effect_list') }}"
+ effect: "{{ state_attr('light.wled_segment_0', 'effect') if state_attr('light.wled_segment_0', 'effect') == state_attr('light.wled_segment_1', 'effect') else none }}"
+ availability: "{{ not is_state('light.wled_master', 'unknown') }}"
+
+ turn_on:
+ action: light.turn_on
+ entity_id: light.wled_segment_0, light.wled_segment_1, light.wled_master
+ turn_off:
+ action: light.turn_off
+ entity_id: light.wled_master
+ set_level:
+ action: light.turn_on
+ entity_id: light.wled_master
+ data:
+ brightness: "{{ brightness }}"
+ set_rgbw:
+ action: light.turn_on
+ entity_id: light.wled_segment_0, light.wled_segment_1
+ data:
+ rgbw_color:
+ - "{{ r }}"
+ - "{{ g }}"
+ - "{{ b }}"
+ - "{{ w }}"
+ effect: "Solid"
+ set_effect:
+ action: light.turn_on
+ entity_id: light.wled_segment_0, light.wled_segment_1
+ data:
+ effect: "{{ effect }}"
+```
+
+{% endraw %}
+
+## Lock
+
+The template lock platform allows you to create locks with templates to define the state and scripts to define each action.
+
+Lock entities can only be created from YAML. Lock entities do not support trigger-based configurations.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - lock:
+ - name: Garage door
+ state: "{{ is_state('sensor.door', 'on') }}"
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.door
+ unlock:
+ action: switch.turn_off
+ target:
+ entity_id: switch.door
+```
+
+{% endraw %}
+
+{% configuration %}
lock:
description: List of locks
required: true
type: map
keys:
- state:
- description: Defines a template to set the state of the lock.
- required: true
- type: template
code_format:
description: Defines a template to get the `code_format` attribute of the entity. This template must evaluate to a valid [Python regular expression](https://docs.python.org/3/library/re.html#regular-expression-syntax) or `None`. If it evaluates to a not-`None` value, you are prompted to enter a code when interacting with the lock. The code will be matched against the regular expression, and the lock/unlock actions will be executed only if they match. The actual _validity_ of the entered code must be verified within these actions. If there's a syntax error in the template, the entity will be unavailable. If the template fails to render for other reasons or if the regular expression is invalid, no code will be accepted, and the lock/unlock actions will never be invoked.
required: false
@@ -590,10 +1361,6 @@ lock:
description: Defines an action to run when the lock is locked.
required: true
type: action
- unlock:
- description: Defines an action to run when the lock is unlocked.
- required: true
- type: action
open:
description: Defines an action to run when the lock is opened.
required: false
@@ -603,6 +1370,533 @@ lock:
required: false
type: boolean
default: false
+ state:
+ description: Defines a template to set the state of the lock.
+ required: true
+ type: template
+ unlock:
+ description: Defines an action to run when the lock is unlocked.
+ required: true
+ type: action
+{% endconfiguration %}
+
+### State based lock - Lock from a switch
+
+This example shows a lock that copies data from a switch.
+
+{% raw %}
+
+```yaml
+template:
+ - lock:
+ - name: Garage Door
+ state: "{{ is_state('switch.source', 'on') }}"
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.source
+ unlock:
+ action: switch.turn_off
+ target:
+ entity_id: switch.source
+```
+
+{% endraw %}
+
+### State based lock - Optimistic mode
+
+This example shows a lock in optimistic mode. This lock will immediately change state after command and will not wait for state update from the sensor.
+
+{% raw %}
+
+```yaml
+template:
+ - lock:
+ - name: Garage Door
+ state: "{{ is_state('sensor.skylight.state', 'on') }}"
+ optimistic: true
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.source
+ unlock:
+ action: switch.turn_off
+ target:
+ entity_id: switch.source
+```
+
+{% endraw %}
+
+### State based lock - Sensor and Two Switches
+
+This example shows a lock that takes its state from a sensor, and uses two momentary switches to control a device.
+
+{% raw %}
+
+```yaml
+template:
+ - lock:
+ - name: Garage Door
+ state: "{{ is_state('sensor.skylight.state', 'on') }}"
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ unlock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_close
+```
+
+{% endraw %}
+
+### State based lock - Secret code
+
+This example shows a lock that copies data from a switch. It needs a PIN code defined as a [secret](/docs/configuration/secrets) to unlock and no code to lock. Note that the actual validity check of the code is part of the `unlock` action and should always happen there or in scripts called from these actions. In this way, you can not only perform code checks against static values, but also dynamic ones (for instance, TOTPs).
+
+{% raw %}
+
+```yaml
+template:
+ - lock:
+ - name: Garage Door
+ state: "{{ is_state('switch.source', 'on') }}"
+ code_format: "{{ '\\d{4}' if is_state('switch.source', 'on') else None }}"
+ lock:
+ - action: switch.turn_on
+ target:
+ entity_id: switch.source
+ unlock:
+ - variables:
+ pin: !secret garage_door_pin
+ - condition: "{{ code == pin }}"
+ - action: switch.turn_off
+ target:
+ entity_id: switch.source
+```
+
+{% endraw %}
+
+In `secrets.yaml`:
+
+{% raw %}
+
+```yaml
+garage_door_pin: "1234"
+```
+
+{% endraw %}
+
+## Number
+
+The template number platform allows you to create number entities with templates to define the state and scripts to define each action.
+
+Number entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - number:
+ - name: Desk Height
+ unit_of_measurement: "in"
+ state: "{{ states('sensor.desk_height') }}"
+ set_value:
+ - action: script.set_desk_height
+ data:
+ value: "{{ value }}"
+ step: 0.5
+ min: 1
+ max: 24
+ icon: mdi:ruler
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sensor.desk_height
+ - number:
+ - name: Desk Height
+ unit_of_measurement: "in"
+ state: "{{ states('sensor.desk_height') }}"
+ set_value:
+ - action: script.set_desk_height
+ data:
+ value: "{{ value }}"
+ step: 0.5
+ min: 1
+ max: 24
+ icon: mdi:ruler
+```
+
+{% endraw %}
+
+{% configuration %}
+number:
+ description: List of numbers
+ required: true
+ type: map
+ keys:
+ max:
+ description: Template for the number's maximum value.
+ required: false
+ type: template
+ default: 100.0
+ min:
+ description: Template for the number's minimum value.
+ required: false
+ type: template
+ default: 0.0
+ optimistic:
+ description: Flag that defines if number works in optimistic mode. When enabled, the number's state will update immediately when changed through the UI or service calls, without waiting for the template defined in `state` to update. When disabled (default), the number will only update when the `state` template returns a new value.
+ required: false
+ type: boolean
+ default: false
+ set_value:
+ description: Defines actions to run when the number value changes. The variable `value` will contain the number entered.
+ required: true
+ type: action
+ state:
+ description: Template for the number's current value.
+ required: true
+ type: template
+ unit_of_measurement:
+ description: Defines the units of measurement of the number, if any.
+ required: false
+ type: string
+ default: None
+ step:
+ description: Template for the number's increment/decrement step.
+ required: true
+ type: template
+
+{% endconfiguration %}
+
+### State based number - Changing the unit of measurement of another number
+
+This example demonstrates the usage of a template number with a unit of measurement set to change a unit-less value of another number entity.
+
+{% raw %}
+
+```yaml
+template:
+ - number:
+ - name: "Cutting Height"
+ unit_of_measurement: "cm"
+ unique_id: automower_cutting_height
+ state: "{{ states('number.automower_cutting_height_raw')|int(0) * 0.5 + 1.5 }}"
+ set_value:
+ - service: number.set_value
+ target:
+ entity_id: number.automower_cutting_height_raw
+ data:
+ value: "{{ (value - 1.5) * 2 }}"
+ step: 0.5
+ min: 2
+ max: 6
+ icon: mdi:ruler
+```
+
+{% endraw %}
+
+## Select
+
+The template select platform allows you to create select entities with templates to define the state and scripts to define each action.
+
+Select entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - select:
+ - name: Camera Day-Night Mode
+ state: "{{ state_attr('camera.porch', 'day_night_mode') }}"
+ options: "{{ ['off', 'on', 'auto'] }}"
+ select_option:
+ - action: script.porch_camera_day_night_mode
+ data:
+ day_night_mode: "{{ option }}"
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: camera.porch
+ attribute: day_night_mode
+ select:
+ - name: Camera Day-Night Mode
+ state: "{{ state_attr('camera.porch', 'day_night_mode') }}"
+ options: "{{ ['off', 'on', 'auto'] }}"
+ select_option:
+ - action: script.porch_camera_day_night_mode
+ data:
+ day_night_mode: "{{ option }}"
+```
+
+{% endraw %}
+
+{% configuration %}
+select:
+ description: List of selects
+ required: true
+ type: map
+ keys:
+ optimistic:
+ description: Flag that defines if select works in optimistic mode. When enabled, the select's state will update immediately when a new option is chosen through the UI or service calls, without waiting for the template defined in `state` to update. When disabled (default), the select will only update when the `state` template returns a new value.
+ required: false
+ type: boolean
+ default: false
+ options:
+ description: Template for the select's available options.
+ required: true
+ type: template
+ select_option:
+ description: Defines actions to run to select an option from the `options` list. The variable `option` will contain the option selected.
+ required: true
+ type: action
+ state:
+ description: Template for the select's current value.
+ required: true
+ type: template
+{% endconfiguration %}
+
+### State based select - Control Day/Night mode of a camera
+
+This show how a state based template select can be used to perform an action.
+
+{% raw %}
+
+```yaml
+template:
+ select:
+ - name: "Porch Camera Day-Night Mode"
+ unique_id: porch_camera_day_night_mode
+ state: "{{ state_attr('camera.porch_camera_sd', 'day_night_mode') }}"
+ options: "{{ ['off', 'on', 'auto'] }}"
+ select_option:
+ - action: tapo_control.set_day_night_mode
+ data:
+ day_night_mode: "{{ option }}"
+ target:
+ entity_id: camera.porch_camera_sd
+```
+
+{% endraw %}
+
+## Sensor
+
+The template sensor platform allows you to create sensors with templates to define the state and attributes.
+
+Sensor entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - sensor:
+ - name: "Kettle"
+ state: >
+ {% if is_state('switch.kettle', 'off') %}
+ off
+ {% elif state_attr('switch.kettle', 'W')|float < 1000 %}
+ standby
+ {% elif is_state('switch.kettle', 'on') %}
+ on
+ {% else %}
+ failed
+ {% endif %}
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: sensor.outside_temperature
+ not_to:
+ - unknown
+ - unavailable
+ sensor:
+ - name: Outside Temperature
+ device_class: temperature
+ unit_of_measurement: °C
+ state: "{{ (states('sensor.outside_temperature') | float - 32) * 5/9 }}"
+```
+
+{% endraw %}
+
+{% configuration %}
+sensor:
+ description: List of sensors
+ required: true
+ type: list
+ keys:
+ attributes:
+ description: Defines templates for attributes of the entity.
+ required: false
+ type: map
+ keys:
+ "attribute: template":
+ description: The attribute and corresponding template.
+ required: true
+ type: template
+ last_reset:
+ description: "Defines a template that describes when the state of the sensor was last reset. Must render to a valid `datetime`. Only available when `state_class` is set to `total`"
+ required: false
+ type: template
+ default: None
+ state:
+ description: "Defines a template to get the state of the sensor. If the sensor is numeric, i.e. it has a `state_class` or a `unit_of_measurement`, the state template must render to a number or to `none`. The state template must not render to a string, including `unknown` or `unavailable`. An `availability` template may be defined to suppress rendering of the state template."
+ required: true
+ type: template
+ state_class:
+ description: "The [state_class](https://developers.home-assistant.io/docs/core/entity/sensor#available-state-classes) of the sensor. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value. If you desire to include the sensor in long-term statistics, include this key and assign it the appropriate value"
+ required: false
+ type: string
+ default: None
+ unit_of_measurement:
+ description: "Defines the units of measurement of the sensor, if any. This will also display the value based on the user profile Number Format setting and influence the graphical presentation in the history visualization as a continuous value."
+ required: false
+ type: string
+ default: None
+
+{% endconfiguration %}
+
+### State based sensor - Exposing sun angle
+
+This example shows the sun angle in the frontend.
+
+{% raw %}
+
+```yaml
+template:
+ - sensor:
+ - name: Sun Angle
+ unit_of_measurement: "°"
+ state: "{{ '%+.1f'|format(state_attr('sun.sun', 'elevation')) }}"
+```
+
+{% endraw %}
+
+### State based sensor - Modifying another sensor's output
+
+If you don't like the wording of a sensor output, then the Template Sensor can help too. Let's rename the output of the [Sun integration](/integrations/sun/) as a simple example:
+
+{% raw %}
+
+```yaml
+template:
+ - sensor:
+ - name: "Sun State"
+ state: >
+ {% if is_state('sun.sun', 'above_horizon') %}
+ up
+ {% else %}
+ down
+ {% endif %}
+```
+
+{% endraw %}
+
+### State based sensor - Changing the unit of measurement of another sensor
+
+With a Template Sensor, it's easy to convert given values into others if the unit of measurement doesn't fit your needs.
+Because the sensors do math on the source sensor's state and need to render to a numeric value, an availability template is used
+to suppress rendering of the state template if the source sensor does not have a valid numeric state.
+
+{% raw %}
+
+```yaml
+template:
+ - sensor:
+ - name: "Transmission Down Speed"
+ unit_of_measurement: "kB/s"
+ state: "{{ states('sensor.transmission_down_speed')|float * 1024 }}"
+ availability: "{{ is_number(states('sensor.transmission_down_speed')) }}"
+
+ - name: "Transmission Up Speed"
+ unit_of_measurement: "kB/s"
+ state: "{{ states('sensor.transmission_up_speed')|float * 1024 }}"
+ availability: "{{ is_number(states('sensor.transmission_up_speed')) }}"
+```
+
+{% endraw %}
+
+### Trigger based sensor - Using conditions to control updates
+
+This example shows how to store the last valid value of a temperature sensor. It will update as long as the source sensor has a valid (numeric) state. Otherwise, the template sensor's state will remain unchanged.
+
+{% raw %}
+
+```yaml
+template:
+ - triggers:
+ trigger: state
+ entity_id: sensor.outside_temperature
+ conditions:
+ - condition: template
+ value_template: "{{ is_number(states('sensor.outside_temperature')) }}"
+ sensor:
+ - name: Outside Temperature last known value
+ state: "{{ states('sensor.outside_temperature') }}"
+```
+
+{% endraw %}
+
+## Switch
+
+The template switch platform allows you to create switches with templates to define the state and scripts to define each action.
+
+Switch entities can be created from the frontend in the Helpers section or via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - switch:
+ - name: Skylight
+ state: "{{ is_state('binary_sensor.skylight', 'on') }}"
+ turn_on:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ turn_off:
+ action: switch.turn_off
+ target:
+ entity_id: switch.skylight_close
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id: binary_sensor.skylight
+ switch:
+ - name: Skylight
+ state: "{{ is_state('binary_sensor.skylight', 'on') }}"
+ turn_on:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ turn_off:
+ action: switch.turn_off
+ target:
+ entity_id: switch.skylight_close
+```
+
+{% endraw %}
+
+{% configuration %}
switch:
description: List of switches
required: true
@@ -613,33 +1907,136 @@ switch:
required: false
type: template
default: optimistic
- turn_on:
- description: Defines an action or list of actions to run when the switch is turned on.
- required: true
- type: action
turn_off:
description: Defines an action or list of actions to run when the switch is turned off.
required: true
type: action
+ turn_on:
+ description: Defines an action or list of actions to run when the switch is turned on.
+ required: true
+ type: action
+
+{% endconfiguration %}
+
+### State based switch - Invert a Switch
+
+This example shows a switch that is the inverse of another switch.
+
+{% raw %}
+
+```yaml
+template:
+ - switch:
+ - state: "{{ not is_state('switch.target', 'on') }}"
+ availability: "{{ has_value('switch.target') }}"
+ turn_on:
+ action: switch.turn_off
+ target:
+ entity_id: switch.target
+ turn_off:
+ action: switch.turn_on
+ target:
+ entity_id: switch.target
+```
+
+{% endraw %}
+
+### State based switch - Toggle Switch
+
+This example shows a switch that takes its state from a sensor and toggles a switch.
+
+{% raw %}
+
+```yaml
+template:
+ - switch:
+ - name: "Blind"
+ state: "{{ is_state_attr('switch.blind_toggle', 'sensor_state', 'on') }}"
+ turn_on:
+ action: switch.toggle
+ target:
+ entity_id: switch.blind_toggle
+ turn_off:
+ action: switch.toggle
+ target:
+ entity_id: switch.blind_toggle
+```
+
+{% endraw %}
+
+### State based switch - Sensor and Two Switches
+
+This example shows a switch that takes its state from a sensor, and uses two
+momentary switches to control a device.
+
+{% raw %}
+
+```yaml
+template:
+ - switch:
+ - name: "Skylight"
+ value_template: "{{ is_state('sensor.skylight', 'on') }}"
+ turn_on:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ turn_off:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_close
+```
+
+{% endraw %}
+
+### State based switch - Optimistic Switch
+
+This example switch with an assumed state based on the actions performed. This switch will immediately change state after a `turn_on`/`turn_off` command.
+
+{% raw %}
+
+```yaml
+template:
+ - switch:
+ - name: "Blind"
+ turn_on:
+ action: switch.toggle
+ target:
+ entity_id: switch.blind_toggle
+ turn_off:
+ action: switch.toggle
+ target:
+ entity_id: switch.blind_toggle
+```
+
+{% endraw %}
+
+## Vacuum
+
+The template vacuum platform allows you to create vacuum entities with templates to define the state and scripts to define each action.
+
+Vacuum entities can only be created via YAML. Vacuum entities do not support trigger-based configurations.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - vacuum:
+ - name: Living Room Vacuum
+ start:
+ action: script.vacuum_start
+```
+
+{% endraw %}
+
+{% configuration %}
vacuum:
description: List of vacuum entities
required: true
type: map
keys:
- state:
- description: "Defines a template to get the state of the vacuum. Valid value: `docked`/`cleaning`/`idle`/`paused`/`returning`/`error`"
- required: false
- type: template
- battery_level:
- description: "Defines a template to get the battery level of the vacuum. Legal values are numbers between `0` and `100`."
- required: false
- type: template
- fan_speed:
- description: Defines a template to get the fan speed of the vacuum.
- required: false
- type: template
attributes:
- description: Defines templates for attributes of the sensor.
+ description: Defines templates for attributes of the entity.
required: false
type: map
keys:
@@ -647,107 +2044,173 @@ vacuum:
description: The attribute and corresponding template.
required: true
type: template
- start:
- description: Defines an action to run when the vacuum is started.
- required: true
+ battery_level:
+ description: "Defines a template to get the battery level of the vacuum. Legal values are numbers between `0` and `100`."
+ required: false
+ type: template
+ clean_spot:
+ description: Defines an action to run when the vacuum is given a clean spot command.
+ required: false
+ type: action
+ fan_speed:
+ description: Defines a template to get the fan speed of the vacuum.
+ required: false
+ type: template
+ fan_speeds:
+ description: List of fan speeds supported by the vacuum.
+ required: false
+ type: [string, list]
+ locate:
+ description: Defines an action to run when the vacuum is given a locate command.
+ required: false
type: action
pause:
description: Defines an action to run when the vacuum is paused.
required: false
type: action
- stop:
- description: Defines an action to run when the vacuum is stopped.
- required: false
- type: action
return_to_base:
description: Defines an action to run when the vacuum is given a return to base command.
required: false
type: action
- clean_spot:
- description: Defines an action to run when the vacuum is given a clean spot command.
- required: false
- type: action
- locate:
- description: Defines an action to run when the vacuum is given a locate command.
- required: false
- type: action
set_fan_speed:
description: Defines an action to run when the vacuum is given a command to set the fan speed.
required: false
type: action
- fan_speeds:
- description: List of fan speeds supported by the vacuum.
+ start:
+ description: Defines an action to run when the vacuum is started.
+ required: true
+ type: action
+ state:
+ description: "Defines a template to get the state of the vacuum. Valid value: `docked`/`cleaning`/`idle`/`paused`/`returning`/`error`"
required: false
- type: [string, list]
+ type: template
+ stop:
+ description: Defines an action to run when the vacuum is stopped.
+ required: false
+ type: action
+{% endconfiguration %}
+
+### State based vacuum - Control vacuum with Harmony Hub
+
+This example shows how you can use a Template Vacuum to control an IR vacuum cleaner using the [Harmony Hub Remote integration](/integrations/harmony).
+
+```yaml
+vacuum:
+ - platform: template
+ vacuums:
+ living_room_vacuum:
+ start:
+ - action: remote.send_command
+ target:
+ entity_id: remote.harmony_hub
+ data:
+ command: Clean
+ device: 52840686
+ return_to_base:
+ - action: remote.send_command
+ target:
+ entity_id: remote.harmony_hub
+ data:
+ command: Home
+ device: 52840686
+ clean_spot:
+ - action: remote.send_command
+ target:
+ entity_id: remote.harmony_hub
+ data:
+ command: SpotCleaning
+ device: 52840686
+```
+
+### State based vacuum - Custom attributes
+
+This example shows how to add custom attributes.
+
+{% raw %}
+
+```yaml
+vacuum:
+ - platform: template
+ vacuums:
+ living_room_vacuum:
+ value_template: "{{ states('sensor.vacuum_state') }}"
+ battery_level_template: "{{ states('sensor.vacuum_battery_level')|int }}"
+ fan_speed_template: "{{ states('sensor.vacuum_fan_speed') }}"
+ attribute_templates:
+ status: >-
+ {% if (states('sensor.robot_vacuum_robot_cleaner_movement') == "after" and states('sensor.robot_vacuum_robot_cleaner_cleaning_mode') == "stop") %}
+ Charging to Resume
+ {% elif states('sensor.robot_vacuum_robot_cleaner_cleaning_mode') == "auto" %}
+ Cleaning
+ {% else %}
+ Charging
+ {% endif %}
+```
+
+{% endraw %}
+
+## Weather
+
+The template weather platform allows you to create weather entities with templates to define the state and attributes.
+
+Weather entities can only be created via YAML.
+
+{% raw %}
+
+```yaml
+# Example state-based configuration.yaml entry
+template:
+ - weather:
+ - name: "My Weather Station"
+ condition_template: "{{ states('weather.my_region') }}"
+ temperature_template: "{{ states('sensor.temperature') | float }}"
+ temperature_unit: "°C"
+ humidity_template: "{{ states('sensor.humidity') | float }}"
+ forecast_daily_template: "{{ state_attr('weather.my_region', 'forecast_data') }}"
+```
+
+```yaml
+# Example trigger-based configuration.yaml entry
+template:
+ - triggers:
+ - trigger: state
+ entity_id:
+ - weather.my_region
+ - sensor.temperature
+ - sensor.humidity
+ weather:
+ - name: "My Weather Station"
+ condition_template: "{{ states('weather.my_region') }}"
+ temperature_template: "{{ states('sensor.temperature') | float }}"
+ temperature_unit: "°C"
+ humidity_template: "{{ states('sensor.humidity') | float }}"
+ forecast_daily_template: "{{ state_attr('weather.my_region', 'forecast_data') }}"
+```
+
+{% endraw %}
+
+{% configuration %}
weather:
description: List of weather entities
required: true
type: map
keys:
- condition_template:
- description: The current weather condition.
- required: true
- type: template
- temperature_template:
- description: The current temperature.
- required: true
- type: template
- dew_point_template:
- description: The current dew point.
- required: false
- type: template
apparent_temperature_template:
description: The current apparent (feels-like) temperature.
required: false
type: template
- temperature_unit:
- description: Unit for temperature_template output. Valid options are °C, °F, and K.
- required: false
- type: string
- humidity_template:
- description: The current humidity.
- required: true
- type: template
- pressure_template:
- description: The current air pressure.
- required: false
- type: template
- pressure_unit:
- description: Unit for pressure_template output. Valid options are Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, psi.
- required: false
- type: string
- wind_speed_template:
- description: The current wind speed.
- required: false
- type: template
- wind_gust_speed_template:
- description: The current wind gust speed.
- required: false
- type: template
- wind_speed_unit:
- description: Unit for wind_speed_template output. Valid options are m/s, km/h, mph, mm/d, in/d, and in/h.
- required: false
- type: string
- wind_bearing_template:
- description: The current wind bearing.
- required: false
- type: template
- ozone_template:
- description: The current ozone level.
- required: false
- type: template
cloud_coverage_template:
description: The current cloud coverage.
required: false
type: template
- visibility_template:
- description: The current visibility.
+ condition_template:
+ description: The current weather condition.
+ required: true
+ type: template
+ dew_point_template:
+ description: The current dew point.
required: false
type: template
- visibility_unit:
- description: Unit for visibility_template output. Valid options are km, mi, ft, m, cm, mm, in, yd.
- required: false
- type: string
forecast_daily_template:
description: Daily forecast data.
required: false
@@ -760,36 +2223,99 @@ weather:
description: Twice daily forecast data.
required: false
type: template
+ humidity_template:
+ description: The current humidity.
+ required: true
+ type: template
+ ozone_template:
+ description: The current ozone level.
+ required: false
+ type: template
precipitation_unit:
description: Unit for precipitation output. Valid options are km, mi, ft, m, cm, mm, in, yd.
required: false
type: string
-"[all sensor, binary sensor, button, image, light, number, select, switch, weather entities]":
- description: Fields that can be used above for sensors, binary sensors, buttons, numbers, and selects.
- required: false
- type: map
- keys:
- name:
- description: Defines a template to get the name of the entity.
+ pressure_template:
+ description: The current air pressure.
required: false
type: template
- unique_id:
- description: An ID that uniquely identifies this entity. Will be combined with the unique ID of the configuration block if available. This allows changing the `name`, `icon` and `entity_id` from the web interface.
+ pressure_unit:
+ description: Unit for pressure_template output. Valid options are Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, psi.
required: false
type: string
- icon:
- description: Defines a template for the icon of the entity.
+ temperature_template:
+ description: The current temperature.
+ required: true
+ type: template
+ temperature_unit:
+ description: Unit for temperature_template output. Valid options are °C, °F, and K.
+ required: false
+ type: string
+ visibility_template:
+ description: The current visibility.
required: false
type: template
- availability:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison is not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ visibility_unit:
+ description: Unit for visibility_template output. Valid options are km, mi, ft, m, cm, mm, in, yd.
+ required: false
+ type: string
+ wind_gust_speed_template:
+ description: The current wind gust speed.
+ required: false
+ type: template
+ wind_speed_template:
+ description: The current wind speed.
+ required: false
+ type: template
+ wind_speed_unit:
+ description: Unit for wind_speed_template output. Valid options are m/s, km/h, mph, mm/d, in/d, and in/h.
+ required: false
+ type: string
+ wind_bearing_template:
+ description: The current wind bearing.
required: false
type: template
- default: true
{% endconfiguration %}
-The above configuration variables describe a configuration section. The template integration allows defining multiple sections.
+### Trigger based weather - Weather Forecast from response data
+
+This example demonstrates how to use an `action` to call a [action with response data](/docs/scripts/perform-actions/#use-templates-to-handle-response-data)
+and use the response in a template.
+
+{% raw %}
+
+```yaml
+template:
+ - triggers:
+ - trigger: time_pattern
+ hours: /1
+ actions:
+ - action: weather.get_forecasts
+ data:
+ type: hourly
+ target:
+ entity_id: weather.home
+ response_variable: hourly
+ sensor:
+ - name: Weather Forecast Hourly
+ unique_id: weather_forecast_hourly
+ state: "{{ now().isoformat() }}"
+ attributes:
+ forecast: "{{ hourly['weather.home'].forecast }}"
+```
+
+{% endraw %}
+
+#### Video tutorial
+
+This video tutorial explains how to set up a trigger based template that makes use of an action to retrieve the weather forecast (precipitation).
+
+
+
+## Combining multiple template entities
+
+The template integration allows defining multiple sections.
```yaml
# Example configuration.yaml entry with two sections
@@ -811,13 +2337,44 @@ template:
[trigger-doc]: /docs/automation/trigger
-#### Video tutorial
+### Trigger based sensor and binary sensor storing webhook information
-This video tutorial explains how to set up a trigger based template that makes use of an action to retrieve the weather forecast (precipitation).
+Template entities can be triggered using any automation trigger, including webhook triggers. Use a trigger-based template entity to store this information in template entities.
-
+{% raw %}
-### Template and action variables
+```yaml
+template:
+ - triggers:
+ - trigger: webhook
+ webhook_id: my-super-secret-webhook-id
+ sensor:
+ - name: "Webhook Temperature"
+ state: "{{ trigger.json.temperature }}"
+ unit_of_measurement: °C
+
+ - name: "Webhook Humidity"
+ state: "{{ trigger.json.humidity }}"
+ unit_of_measurement: %
+
+ binary_sensor:
+ - name: "Motion"
+ state: "{{ trigger.json.motion }}"
+ device_class: motion
+```
+
+{% endraw %}
+
+You can test this trigger entity with the following CURL command:
+
+```bash
+curl --header "Content-Type: application/json" \
+ --request POST \
+ --data '{"temperature": 5, "humidity": 34, "motion": true}' \
+ http://homeassistant.local:8123/api/webhook/my-super-secret-webhook-id
+```
+
+## Template and action variables
State-based and trigger-based template entities have the special template variable `this` available in their templates and actions. The `this` variable is the current [state object](/docs/configuration/state_object) of the entity and aids [self-referencing](#self-referencing) of an entity's state and attributes in templates and actions. Trigger-based entities also provide [the trigger data](/docs/automation/templating/).
@@ -825,7 +2382,25 @@ State-based and trigger-based template entities have the special template variab
Self-referencing using `this` provides the state and attributes for the entity before rendering the templates to calculate a new state. In other words, it contains the previous state.
{% endnote %}
-### Optimistic mode
+### Self referencing
+
+This example demonstrates how the `this` variable can be used in templates for self-referencing.
+
+{% raw %}
+
+```yaml
+template:
+ - sensor:
+ - name: test
+ state: "{{ this.attributes.test | default('Value when missing') }}"
+ # not: "{{ state_attr('sensor.test', 'test') }}"
+ attributes:
+ test: "{{ now() }}"
+```
+
+{% endraw %}
+
+## Optimistic mode
For template entities that support interactivity (like `number` and `select`), you can enable optimistic mode by setting the `optimistic` parameter to `true`. This affects how the entity's state updates when you interact with it:
@@ -841,7 +2416,7 @@ Optimistic mode is particularly useful when:
When optimistic mode is disabled (default), you get more accuracy but potentially a less responsive UI, as the entity only updates after confirmation from the underlying system.
-### Rate limiting updates
+## Rate limiting updates
When there are entities present in the template and no triggers are defined, the template will be re-rendered when one of the entities changes states. To avoid this taking up too many resources in Home Assistant, rate limiting will be automatically applied if too many states are observed.
@@ -882,11 +2457,11 @@ template:
If the template accesses every state on the system, a rate limit of one update per minute is applied. If the template accesses all states under a specific domain, a rate limit of one update per second is applied. If the template only accesses specific states, receives update events for specifically referenced entities, or the `homeassistant.update_entity` action is used, no rate limit is applied.
-### Considerations
+## Considerations
-#### Startup
+### Startup
-If you are using the state of a platform that might not be available during startup, the Template Sensor may get an `unknown` state. To avoid this, use the `states()` function in your template. For example, you should replace {% raw %}`{{ states.sensor.moon.state }}`{% endraw %} with this equivalent that returns the state and never results in `unknown`: {% raw %}`{{ states('sensor.moon') }}` {% endraw %}.
+If you are using the state of a platform that might not be available during startup, the Template Sensor may get an `unknown` state. To avoid this, use the `states()` function in your template. For example, you should replace {% raw %}`{{ states.sensor.moon.state }}`{% endraw %} with this equivalent that returns the state and never results in `unknown`: {% raw %}`{{ states('sensor.moon') }}` {% endraw %}.
The same would apply to the `is_state()` function. You should replace {% raw %}`{{ states.switch.source.state == 'on' }}`{% endraw %} with this equivalent that returns `true`/`false` and never gives an `unknown` result:
@@ -938,387 +2513,119 @@ The blueprint can now be used for creating template entities.
[blueprint-forums]: /get-blueprints
-## Examples
+## Event `event_template_reloaded`
-In this section, you find some real-life examples of how to use template sensors.
+Event `event_template_reloaded` is fired when Template entities have been reloaded and entities thus might have changed.
-### Trigger based sensor and binary sensor storing webhook information
+This event has no additional data.
-Template entities can be triggered using any automation trigger, including webhook triggers. Use a trigger-based template entity to store this information in template entities.
+## Legacy Alarm Control Panel configuration format
+
+_These formats still work but are no longer recommended. [Use modern configuration](#alarm-control-panel)._
+
+This format is configured as a platform for the `alarm_control_panel` integration and not directly under the `template` integration.
{% raw %}
```yaml
-template:
- - triggers:
- - trigger: webhook
- webhook_id: my-super-secret-webhook-id
- sensor:
- - name: "Webhook Temperature"
- state: "{{ trigger.json.temperature }}"
- unit_of_measurement: °C
-
- - name: "Webhook Humidity"
- state: "{{ trigger.json.humidity }}"
- unit_of_measurement: %
-
- binary_sensor:
- - name: "Motion"
- state: "{{ trigger.json.motion }}"
- device_class: motion
-```
-
-{% endraw %}
-
-You can test this trigger entity with the following CURL command:
-
-```bash
-curl --header "Content-Type: application/json" \
- --request POST \
- --data '{"temperature": 5, "humidity": 34, "motion": true}' \
- http://homeassistant.local:8123/api/webhook/my-super-secret-webhook-id
-```
-
-### Turning an event into a trigger based binary sensor
-
-You can use a trigger-based template entity to convert any event or other automation trigger into a binary sensor. The below configuration will turn on a binary sensor for 5 seconds when the automation trigger triggers.
-
-```yaml
-template:
- - triggers:
- trigger: event
- event_type: my_event
- binary_sensor:
- - name: Event recently fired
- auto_off: 5
- state: "true"
-```
-
-### Using conditions with triggers to control status updates
-
-This example shows how to store the last valid value of a temperature sensor. It will update as long as the source sensor has a valid (numeric) state. Otherwise, the template sensor's state will remain unchanged.
-
-{% raw %}
-
-```yaml
-template:
- - triggers:
- trigger: state
- entity_id: sensor.outside_temperature
- conditions:
- - condition: template
- value_template: "{{ is_number(states('sensor.outside_temperature')) }}"
- sensor:
- - name: Outside Temperature last known value
- state: "{{ states('sensor.outside_temperature') }}"
-```
-
-{% endraw %}
-
-### State based sensor exposing sun angle
-
-This example shows the sun angle in the frontend.
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: Sun Angle
- unit_of_measurement: "°"
- state: "{{ '%+.1f'|format(state_attr('sun.sun', 'elevation')) }}"
-```
-
-{% endraw %}
-
-### State based sensor modifying another sensor's output
-
-If you don't like the wording of a sensor output, then the Template Sensor can help too. Let's rename the output of the [Sun integration](/integrations/sun/) as a simple example:
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: "Sun State"
- state: >
- {% if is_state('sun.sun', 'above_horizon') %}
- up
- {% else %}
- down
- {% endif %}
-```
-
-{% endraw %}
-
-### State based sensor with multiline template with an `if` test
-
-This example shows a multiple line template with an `if` test. It looks at a sensing switch and shows `on`/`off` in the frontend, and shows 'standby' if the power use is less than 1000 watts.
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: "Kettle"
- state: >
- {% if is_state('switch.kettle', 'off') %}
- off
- {% elif state_attr('switch.kettle', 'W')|float < 1000 %}
- standby
- {% elif is_state('switch.kettle', 'on') %}
- on
- {% else %}
- failed
- {% endif %}
-```
-
-{% endraw %}
-
-### State based sensor changing the unit of measurement of another sensor
-
-With a Template Sensor, it's easy to convert given values into others if the unit of measurement doesn't fit your needs.
-Because the sensors do math on the source sensor's state and need to render to a numeric value, an availability template is used
-to suppress rendering of the state template if the source sensor does not have a valid numeric state.
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: "Transmission Down Speed"
- unit_of_measurement: "kB/s"
- state: "{{ states('sensor.transmission_down_speed')|float * 1024 }}"
- availability: "{{ is_number(states('sensor.transmission_down_speed')) }}"
-
- - name: "Transmission Up Speed"
- unit_of_measurement: "kB/s"
- state: "{{ states('sensor.transmission_up_speed')|float * 1024 }}"
- availability: "{{ is_number(states('sensor.transmission_up_speed')) }}"
-```
-
-{% endraw %}
-
-### State based binary sensor - Washing Machine Running
-
-This example creates a washing machine "load running" sensor by monitoring an
-energy meter connected to the washer. During the washer's operation, the energy meter will fluctuate wildly, hitting zero frequently even before the load is finished. By utilizing `delay_off`, we can have this sensor only turn off if there has been no washer activity for 5 minutes.
-
-{% raw %}
-
-```yaml
-# Determine when the washing machine has a load running.
-template:
- - binary_sensor:
- - name: "Washing Machine"
- delay_off:
- minutes: 5
- state: >
- {{ states('sensor.washing_machine_power')|float > 0 }}
-```
-
-{% endraw %}
-
-### State based binary sensor - Is Anyone Home
-
-This example is determining if anyone is home based on the combination of device tracking and motion sensors. It's extremely useful if you have kids/baby sitter/grand parents who might still be in your house that aren't represented by a trackable device in Home Assistant. This is providing a composite of Wi-Fi based device tracking and Z-Wave multisensor presence sensors.
-
-{% raw %}
-
-```yaml
-template:
- - binary_sensor:
- - name: People home
- state: >
- {{ is_state('device_tracker.sean', 'home')
- or is_state('device_tracker.susan', 'home')
- or is_state('binary_sensor.office_124', 'on')
- or is_state('binary_sensor.hallway_134', 'on')
- or is_state('binary_sensor.living_room_139', 'on')
- or is_state('binary_sensor.porch_ms6_1_129', 'on')
- or is_state('binary_sensor.family_room_144', 'on') }}
-```
-
-{% endraw %}
-
-### State based binary sensor - device tracker sensor with latitude and longitude attributes
-
-This example shows how to combine a non-GPS (e.g., NMAP) and GPS device tracker while still including latitude and longitude attributes
-
-{% raw %}
-
-```yaml
-template:
- - binary_sensor:
- - name: My Device
- state: >
- {{ is_state('device_tracker.my_device_nmap', 'home') or is_state('device_tracker.my_device_gps', 'home') }}
- device_class: "presence"
- attributes:
- latitude: >
- {% if is_state('device_tracker.my_device_nmap', 'home') %}
- {{ state_attr('zone.home', 'latitude') }}
- {% else %}
- {{ state_attr('device_tracker.my_device_gps', 'latitude') }}
- {% endif %}
- longitude: >
- {% if is_state('device_tracker.my_device_nmap', 'home') %}
- {{ state_attr('zone.home', 'longitude') }}
- {% else %}
- {{ state_attr('device_tracker.my_device_gps', 'longitude') }}
- {% endif %}
-```
-
-{% endraw %}
-
-### State based binary sensor - Change the icon when a state changes
-
-This example demonstrates how to use template to change the icon as its state changes. This icon is referencing its own state.
-
-{% raw %}
-
-```yaml
-template:
- - binary_sensor:
- - name: Sun Up
- state: >
- {{ is_state("sun.sun", "above_horizon") }}
- icon: >
- {% if is_state("binary_sensor.sun_up", "on") %}
- mdi:weather-sunset-up
- {% else %}
- mdi:weather-sunset-down
- {% endif %}
-```
-
-{% endraw %}
-
-A more advanced use case could be to set the icon based on the sensor's own state like above, but when triggered by an event. This example demonstrates a binary sensor that turns on momentarily, such as when a doorbell button is pressed.
-
-The binary sensor turns on and sets the matching icon when the appropriate event is received. After 5 seconds, the binary sensor turns off automatically. To ensure the icon gets updated, there must be a trigger for when the state changes to off.
-
-{% raw %}
-
-```yaml
-template:
- - triggers:
- - trigger: event
- event_type: YOUR_EVENT
- - trigger: state
- entity_id: binary_sensor.doorbell_rang
- to: "off"
- binary_sensor:
- name: doorbell_rang
- icon: "{{ (trigger.platform == 'event') | iif('mdi:bell-ring-outline', 'mdi:bell-outline') }}"
- state: "{{ trigger.platform == 'event' }}"
- auto_off:
- seconds: 5
-```
-
-{% endraw %}
-
-### State based select - Control Day/Night mode of a camera
-
-This show how a state based template select can be used to perform an action.
-
-{% raw %}
-
-
-```yaml
-template:
- select:
- - name: "Porch Camera Day-Night Mode"
- unique_id: porch_camera_day_night_mode
- state: "{{ state_attr('camera.porch_camera_sd', 'day_night_mode') }}"
- options: "{{ ['off', 'on', 'auto'] }}"
- select_option:
- - action: tapo_control.set_day_night_mode
- data:
- day_night_mode: "{{ option }}"
+# Example configuration.yaml entry
+alarm_control_panel:
+ - platform: template
+ panels:
+ safe_alarm_panel:
+ value_template: "{{ states('alarm_control_panel.real_alarm') }}"
+ arm_away:
+ action: alarm_control_panel.alarm_arm_away
target:
- entity_id: camera.porch_camera_sd
-```
-
-{% endraw %}
-
-### Self referencing
-
-This example demonstrates how the `this` variable can be used in templates for self-referencing.
-
-{% raw %}
-
-```yaml
-template:
- - sensor:
- - name: test
- state: "{{ this.attributes.test | default('Value when missing') }}"
- # not: "{{ state_attr('sensor.test', 'test') }}"
- attributes:
- test: "{{ now() }}"
-```
-
-{% endraw %}
-
-### Trigger based handling of action response data
-
-This example demonstrates how to use an `action` to call a [action with response data](/docs/scripts/perform-actions/#use-templates-to-handle-response-data)
-and use the response in a template.
-
-{% raw %}
-
-```yaml
-template:
- - triggers:
- - trigger: time_pattern
- hours: /1
- actions:
- - action: weather.get_forecasts
- data:
- type: hourly
- target:
- entity_id: weather.home
- response_variable: hourly
- sensor:
- - name: Weather Forecast Hourly
- unique_id: weather_forecast_hourly
- state: "{{ now().isoformat() }}"
- attributes:
- forecast: "{{ hourly['weather.home'].forecast }}"
-```
-
-{% endraw %}
-
-### Number entity changing the unit of measurement of another number
-
-This example demonstrates the usage of a template number with a unit of measurement set to change a unit-less value of another number entity.
-
-{% raw %}
-
-```yaml
-template:
- - number:
- - name: "Cutting Height"
- unit_of_measurement: "cm"
- unique_id: automower_cutting_height
- state: "{{ states('number.automower_cutting_height_raw')|int(0) * 0.5 + 1.5 }}"
- set_value:
- - service: number.set_value
+ entity_id: alarm_control_panel.real_alarm
+ data:
+ code: !secret alarm_code
+ arm_home:
+ action: alarm_control_panel.alarm_arm_home
+ target:
+ entity_id: alarm_control_panel.real_alarm
+ data:
+ code: !secret alarm_code
+ disarm:
+ - condition: state
+ entity_id: device_tracker.paulus
+ state: "home"
+ - action: alarm_control_panel.alarm_disarm
target:
- entity_id: number.automower_cutting_height_raw
+ entity_id: alarm_control_panel.real_alarm
data:
- value: "{{ (value - 1.5) * 2 }}"
- step: 0.5
- min: 2
- max: 6
- icon: mdi:ruler
+ code: !secret alarm_code
```
{% endraw %}
+{% configuration %}
+panels:
+ description: List of your panels.
+ required: true
+ type: map
+ keys:
+ alarm_control_panel_name:
+ description: The slug of the panel.
+ required: true
+ type: map
+ keys:
+ name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ default: Template Alarm Control Panel
+ unique_id:
+ description: An ID that uniquely identifies this alarm control panel. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: "Defines a template to set the state of the alarm panel. Only the states `armed_away`, `armed_home`, `armed_night`, `armed_vacation`, `arming`, `disarmed`, `pending`, `triggered` and `unavailable` are used."
+ required: false
+ type: template
+ disarm:
+ description: Defines an action to run when the alarm is disarmed.
+ required: false
+ type: action
+ arm_away:
+ description: Defines an action to run when the alarm is armed to away mode.
+ required: false
+ type: action
+ arm_home:
+ description: Defines an action to run when the alarm is armed to home mode.
+ required: false
+ type: action
+ arm_night:
+ description: Defines an action to run when the alarm is armed to night mode.
+ required: false
+ type: action
+ arm_vacation:
+ description: Defines an action to run when the alarm is armed to vacation mode.
+ required: false
+ type: action
+ arm_custom_bypass:
+ description: Defines an action to run when the alarm is armed to custom bypass mode.
+ required: false
+ type: action
+ trigger:
+ description: Defines an action to run when the alarm is triggered.
+ required: false
+ type: action
+ code_arm_required:
+ description: If true, the code is required to arm the alarm.
+ required: false
+ type: boolean
+ default: true
+ code_format:
+ description: One of `number`, `text` or `no_code`. Format for the code used to arm/disarm the alarm.
+ required: false
+ type: string
+ default: number
+{% endconfiguration %}
-## Legacy binary sensor configuration format
+## Legacy Binary Sensor configuration format
-_This format still works but is no longer recommended. [Use modern configuration](#configuration-variables)._
+_These formats still work but are no longer recommended. [Use modern configuration](#binary-sensor)._
This format is configured as a platform for the `binary_sensor` integration and not directly under the `template` integration.
@@ -1396,9 +2703,486 @@ sensors:
type: time
{% endconfiguration %}
+## Legacy Cover configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#cover)._
+
+This format is configured as a platform for the `cover` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+cover:
+ - platform: template
+ covers:
+ garage_door:
+ device_class: garage
+ friendly_name: "Garage Door"
+ value_template: "{{ states('sensor.garage_door')|float > 0 }}"
+ open_cover:
+ action: script.open_garage_door
+ close_cover:
+ action: script.close_garage_door
+ stop_cover:
+ action: script.stop_garage_door
+```
+
+{% endraw %}
+
+{% configuration %}
+ covers:
+ description: List of your covers.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this cover. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: Defines a template to get the state of the cover. Valid output values from the template are `open`, `opening`, `closing` and `closed` which are directly mapped to the corresponding states. In addition, `true` is valid as a synonym to `open` and `false` as a synonym to `closed`. If [both a `value_template` and a `position_template`](#combining-state-and-position-templates) are specified, only `opening` and `closing` are set from the `value_template`. If the template produces a `None` value the state will be set to `unknown`.
+ required: false
+ type: template
+ position_template:
+ description: Defines a template to get the position of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current position will be set to `unknown`.
+ required: false
+ type: template
+ icon_template:
+ description: Defines a template to specify which icon to use.
+ required: false
+ type: template
+ entity_picture_template:
+ description: Defines a template for the entity picture of the cover.
+ required: false
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison is not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ device_class:
+ description: Sets the [class of the device](/integrations/cover/), changing the device state and icon that is displayed on the frontend.
+ required: false
+ type: string
+ open_cover:
+ description: Defines an action to open the cover. If `open_cover` is specified, `close_cover` must also be specified. At least one of `open_cover` and `set_cover_position` must be specified.
+ required: inclusive
+ type: action
+ close_cover:
+ description: Defines an action to close the cover.
+ required: inclusive
+ type: action
+ stop_cover:
+ description: Defines an action to stop the cover.
+ required: false
+ type: action
+ set_cover_position:
+ description: Defines an action to set to a cover position (between `0` and `100`). The variable `position` will contain the entity's set position.
+ required: false
+ type: action
+ set_cover_tilt_position:
+ description: Defines an action to set the tilt of a cover (between `0` and `100`). The variable `tilt` will contain the entity's set tilt position.
+ required: false
+ type: action
+ optimistic:
+ description: Force cover position to use [optimistic mode](#cover-optimistic-mode).
+ required: false
+ type: boolean
+ default: false
+ tilt_optimistic:
+ description: Force cover tilt position to use [optimistic mode](#cover-optimistic-mode).
+ required: false
+ type: boolean
+ default: false
+ tilt_template:
+ description: Defines a template to get the tilt state of the cover. Legal values are numbers between `0` (closed) and `100` (open). If the template produces a `None` value the current tilt state will be set to `unknown`.
+ required: false
+ type: template
+{% endconfiguration %}
+
+## Legacy Fan configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#fan)._
+
+This format is configured as a platform for the `fan` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+fan:
+ - platform: template
+ fans:
+ bedroom_fan:
+ friendly_name: "Bedroom fan"
+ value_template: "{{ states('input_boolean.state') }}"
+ percentage_template: "{{ states('input_number.percentage') }}"
+ preset_mode_template: "{{ states('input_select.preset_mode') }}"
+ oscillating_template: "{{ states('input_select.osc') }}"
+ direction_template: "{{ states('input_select.direction') }}"
+ turn_on:
+ action: script.fan_on
+ turn_off:
+ action: script.fan_off
+ set_percentage:
+ action: script.fans_set_speed
+ data:
+ percentage: "{{ percentage }}"
+ set_preset_mode:
+ action: script.fans_set_preset_mode
+ data:
+ preset_mode: "{{ preset_mode }}"
+ set_oscillating:
+ action: script.fan_oscillating
+ data:
+ oscillating: "{{ oscillating }}"
+ set_direction:
+ action: script.fan_direction
+ data:
+ direction: "{{ direction }}"
+ speed_count: 6
+ preset_modes:
+ - 'auto'
+ - 'smart'
+ - 'whoosh'
+```
+
+{% endraw %}
+
+{% configuration %}
+ fans:
+ description: List of your fans.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this fan. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: "Defines a template to get the state of the fan. Valid values: `on`, `off`"
+ required: true
+ type: template
+ percentage_template:
+ description: Defines a template to get the speed percentage of the fan.
+ required: false
+ type: template
+ preset_mode_template:
+ description: Defines a template to get the preset mode of the fan.
+ required: false
+ type: template
+ oscillating_template:
+ description: "Defines a template to get the osc state of the fan. Valid values: `true`, `false`"
+ required: false
+ type: template
+ direction_template:
+ description: "Defines a template to get the direction of the fan. Valid values: `forward`, `reverse`"
+ required: false
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ turn_on:
+ description: Defines an action to run when the fan is turned on.
+ required: true
+ type: action
+ turn_off:
+ description: Defines an action to run when the fan is turned off.
+ required: true
+ type: action
+ set_percentage:
+ description: Defines an action to run when the fan is given a speed percentage command.
+ required: false
+ type: action
+ set_preset_mode:
+ description: Defines an action to run when the fan is given a preset command.
+ required: false
+ type: action
+ set_oscillating:
+ description: Defines an action to run when the fan is given an osc state command.
+ required: false
+ type: action
+ set_direction:
+ description: Defines an action to run when the fan is given a direction command.
+ required: false
+ type: action
+ preset_modes:
+ description: List of preset modes the fan is capable of. This is an arbitrary list of strings and must not contain any speeds.
+ required: false
+ type: [string, list]
+ default: []
+ speed_count:
+ description: The number of speeds the fan supports. Used to calculate the percentage step for the `fan.increase_speed` and `fan.decrease_speed` actions.
+ required: false
+ type: integer
+ default: 100
+{% endconfiguration %}
+
+## Legacy Light configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#light)._
+
+This format is configured as a platform for the `light` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+light:
+ - platform: template
+ lights:
+ theater_lights:
+ friendly_name: "Theater Lights"
+ level_template: "{{ state_attr('sensor.theater_brightness', 'lux')|int }}"
+ value_template: "{{ state_attr('sensor.theater_brightness', 'lux')|int > 0 }}"
+ temperature_template: "{{states('input_number.temperature_input') | int}}"
+ hs_template: "({{states('input_number.h_input') | int}}, {{states('input_number.s_input') | int}})"
+ effect_list_template: "{{ state_attr('light.led_strip', 'effect_list') }}"
+ turn_on:
+ action: script.theater_lights_on
+ turn_off:
+ action: script.theater_lights_off
+ set_level:
+ action: script.theater_lights_level
+ data:
+ brightness: "{{ brightness }}"
+ set_temperature:
+ action: input_number.set_value
+ data:
+ value: "{{ color_temp }}"
+ entity_id: input_number.temperature_input
+ set_hs:
+ - action: input_number.set_value
+ data:
+ value: "{{ h }}"
+ entity_id: input_number.h_input
+ - action: input_number.set_value
+ data:
+ value: "{{ s }}"
+ entity_id: input_number.s_input
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ transition: "{{ transition | float }}"
+ hs_color:
+ - "{{ hs[0] }}"
+ - "{{ hs[1] }}"
+ set_effect:
+ - action: light.turn_on
+ data:
+ entity_id:
+ - light.led_strip
+ effect: "{{ effect }}"
+ supports_transition_template: "{{ true }}"
+```
+
+{% endraw %}
+
+{% configuration %}
+ lights:
+ description: List of your lights.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this light. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: Defines a template to get the state of the light.
+ required: false
+ type: template
+ default: optimistic
+ level_template:
+ description: Defines a template to get the brightness of the light.
+ required: false
+ type: template
+ default: optimistic
+ temperature_template:
+ description: Defines a template to get the color temperature of the light.
+ required: false
+ type: template
+ default: optimistic
+ hs_template:
+ description: Defines a template to get the HS color of the light. Must render a tuple (hue, saturation).
+ required: false
+ type: template
+ default: optimistic
+ rgb_template:
+ description: Defines a template to get the RGB color of the light. Must render a tuple or a list (red, green, blue).
+ required: false
+ type: template
+ default: optimistic
+ rgbw_template:
+ description: Defines a template to get the RGBW color of the light. Must render a tuple or a list (red, green, blue, white).
+ required: false
+ type: template
+ default: optimistic
+ rgbww_template:
+ description: Defines a template to get the RGBWW color of the light. Must render a tuple or a list (red, green, blue, cold white, warm white).
+ required: false
+ type: template
+ default: optimistic
+ supports_transition_template:
+ description: Defines a template to get if light supports transition. Should return boolean value (True/False). If this value is `True` transition parameter in a turn on or turn off call will be passed as a named parameter `transition` to either of the scripts.
+ required: false
+ type: template
+ default: false
+ effect_list_template:
+ description: Defines a template to get the list of supported effects. Must render a list
+ required: inclusive
+ type: template
+ default: optimistic
+ effect_template:
+ description: Defines a template to get the effect of the light.
+ required: inclusive
+ type: template
+ default: optimistic
+ min_mireds_template:
+ description: Defines a template to get the min mireds value of the light.
+ required: false
+ type: template
+ default: optimistic
+ max_mireds_template:
+ description: Defines a template to get the max mireds value of the light.
+ required: false
+ type: template
+ default: optimistic
+ icon_template:
+ description: Defines a template for an icon or picture, e.g., showing a different icon for different states.
+ required: false
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ turn_on:
+ description: Defines an action to run when the light is turned on. May receive variables `brightness` and/or `transition`.
+ required: true
+ type: action
+ turn_off:
+ description: Defines an action to run when the light is turned off. May receive variable `transition`.
+ required: true
+ type: action
+ set_level:
+ description: Defines an action to run when the light is given a brightness command. The script will only be called if the `turn_on` call only has brightness, and optionally transition. Receives variables `brightness` and optionally `transition`.
+ required: false
+ type: action
+ set_temperature:
+ description: Defines an action to run when the light is given a color temperature command. Receives variable `color_temp`. May also receive variables `brightness` and/or `transition`.
+ required: false
+ type: action
+ set_hs:
+ description: "Defines an action to run when the light is given a hs color command. Available variables: `hs` as a tuple, `h` and `s`"
+ required: false
+ type: action
+ set_rgb:
+ description: "Defines an action to run when the light is given an RGB color command. Available variables: `rgb` as a tuple, `r`, `g` and `b`."
+ required: false
+ type: action
+ set_rgbw:
+ description: "Defines an action to run when the light is given an RGBW color command. Available variables: `rgbw` as a tuple, `rgb` as a tuple, `r`, `g`, `b` and `w`."
+ required: false
+ type: action
+ set_rgbww:
+ description: "Defines an action to run when the light is given an RGBWW color command. Available variables: `rgbww` as a tuple, `rgb` as a tuple, `r`, `g`, `b`, `cw` and `ww`."
+ required: false
+ type: action
+ set_effect:
+ description: Defines an action to run when the light is given an effect command. Receives variable `effect`. May also receive variables `brightness` and/or `transition`.
+ required: inclusive
+ type: action
+{% endconfiguration %}
+
+## Legacy Lock configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#lock)._
+
+This format is configured as a platform for the `lock` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+lock:
+ - platform: template
+ name: Garage door
+ value_template: "{{ is_state('sensor.door', 'on') }}"
+ lock:
+ action: switch.turn_on
+ target:
+ entity_id: switch.door
+ unlock:
+ action: switch.turn_off
+ target:
+ entity_id: switch.door
+```
+
+{% endraw %}
+
+{% configuration %}
+ name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ default: Template Lock
+ unique_id:
+ description: An ID that uniquely identifies this lock. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: Defines a template to set the state of the lock.
+ required: true
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ code_format_template:
+ description: Defines a template to get the `code_format` attribute of the entity. This template must evaluate to a valid [Python regular expression](https://docs.python.org/3/library/re.html#regular-expression-syntax) or `None`. If it evaluates to a not-`None` value, the user is prompted to enter a code when interacting with the lock. The code will be matched against the regular expression, and only if it matches, the lock/unlock actions will be executed. The actual _validity_ of the entered code must be verified within these actions. If there's a syntax error in the template, the entity will be unavailable. If the template fails to render for other reasons or if the regular expression is invalid, no code will be accepted and the lock/unlock actions will never be invoked.
+ required: false
+ type: template
+ default: None
+ lock:
+ description: Defines an action to run when the lock is locked.
+ required: true
+ type: action
+ unlock:
+ description: Defines an action to run when the lock is unlocked.
+ required: true
+ type: action
+ open:
+ description: Defines an action to run when the lock is opened.
+ required: false
+ type: action
+ optimistic:
+ description: Flag that defines if lock works in optimistic mode.
+ required: false
+ type: boolean
+ default: false
+{% endconfiguration %}
+
## Legacy Sensor configuration format
-_This format still works but is no longer recommended. [Use modern configuration](#configuration-variables)._
+_This format still works but is no longer recommended. [Use modern configuration](#sensor)._
This format is configured as a platform for the `sensor` integration and not directly under the `template` integration.
@@ -1476,8 +3260,282 @@ sensor:
default: None
{% endconfiguration %}
-## Event `event_template_reloaded`
+## Legacy Switch configuration format
-Event `event_template_reloaded` is fired when Template entities have been reloaded and entities thus might have changed.
+_This format still works but is no longer recommended. [Use modern configuration](#switch)._
-This event has no additional data.
+This format is configured as a platform for the `switch` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+switch:
+ - platform: template
+ switches:
+ skylight:
+ value_template: "{{ is_state('sensor.skylight', 'on') }}"
+ turn_on:
+ action: switch.turn_on
+ target:
+ entity_id: switch.skylight_open
+ turn_off:
+ action: switch.turn_off
+ target:
+ entity_id: switch.skylight_close
+```
+
+{% endraw %}
+
+{% configuration %}
+ switches:
+ description: List of your switches.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this switch. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: Defines a template to set the state of the switch. If not defined, the switch will optimistically assume all commands are successful.
+ required: false
+ type: template
+ default: optimistic
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ turn_on:
+ description: Defines an action or list of actions to run when the switch is turned on.
+ required: true
+ type: action
+ turn_off:
+ description: Defines an action or list of actions to run when the switch is turned off.
+ required: true
+ type: action
+ icon_template:
+ description: Defines a template for the icon of the switch.
+ required: false
+ type: template
+ entity_picture_template:
+ description: Defines a template for the picture of the switch.
+ required: false
+ type: template
+{% endconfiguration %}
+
+## Legacy Vacuum configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#vacuum)._
+
+This format is configured as a platform for the `vacuum` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+vacuum:
+ - platform: template
+ vacuums:
+ living_room_vacuum:
+ start:
+ action: script.vacuum_start
+```
+
+{% endraw %}
+
+{% configuration %}
+ vacuums:
+ description: List of your vacuums.
+ required: true
+ type: map
+ keys:
+ friendly_name:
+ description: Name to use in the frontend.
+ required: false
+ type: string
+ unique_id:
+ description: An ID that uniquely identifies this vacuum. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+ value_template:
+ description: "Defines a template to get the state of the vacuum. Valid value: `docked`/`cleaning`/`idle`/`paused`/`returning`/`error`"
+ required: false
+ type: template
+ battery_level_template:
+ description: "Defines a template to get the battery level of the vacuum. Legal values are numbers between `0` and `100`."
+ required: false
+ type: template
+ fan_speed_template:
+ description: Defines a template to get the fan speed of the vacuum.
+ required: false
+ type: template
+ attribute_templates:
+ description: Defines templates for attributes of the sensor.
+ required: false
+ type: map
+ keys:
+ "attribute: template":
+ description: The attribute and corresponding template.
+ required: true
+ type: template
+ availability_template:
+ description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
+ required: false
+ type: template
+ default: true
+ start:
+ description: Defines an action to run when the vacuum is started.
+ required: true
+ type: action
+ pause:
+ description: Defines an action to run when the vacuum is paused.
+ required: false
+ type: action
+ stop:
+ description: Defines an action to run when the vacuum is stopped.
+ required: false
+ type: action
+ return_to_base:
+ description: Defines an action to run when the vacuum is given a return to base command.
+ required: false
+ type: action
+ clean_spot:
+ description: Defines an action to run when the vacuum is given a clean spot command.
+ required: false
+ type: action
+ locate:
+ description: Defines an action to run when the vacuum is given a locate command.
+ required: false
+ type: action
+ set_fan_speed:
+ description: Defines an action to run when the vacuum is given a command to set the fan speed.
+ required: false
+ type: action
+ fan_speeds:
+ description: List of fan speeds supported by the vacuum.
+ required: false
+ type: [string, list]
+{% endconfiguration %}
+
+## Legacy Weather configuration format
+
+_This format still works but is no longer recommended. [Use modern configuration](#weather)._
+
+This format is configured as a platform for the `weather` integration and not directly under the `template` integration.
+
+{% raw %}
+
+```yaml
+# Example configuration.yaml entry
+weather:
+ - platform: template
+ name: "My Weather Station"
+ condition_template: "{{ states('weather.my_region') }}"
+ temperature_template: "{{ states('sensor.temperature') | float }}"
+ temperature_unit: "°C"
+ humidity_template: "{{ states('sensor.humidity') | float }}"
+ forecast_daily_template: "{{ state_attr('weather.my_region', 'forecast_data') }}"
+```
+
+{% endraw %}
+
+{% configuration %}
+name:
+ description: Name to use in the frontend.
+ required: true
+ type: template
+unique_id:
+ description: An ID that uniquely identifies this weather entity. Set this to a unique value to allow customization through the UI.
+ required: false
+ type: string
+condition_template:
+ description: The current weather condition.
+ required: true
+ type: template
+temperature_template:
+ description: The current temperature.
+ required: true
+ type: template
+dew_point_template:
+ description: The current dew point.
+ required: false
+ type: template
+apparent_temperature_template:
+ description: The current apparent (feels-like) temperature.
+ required: false
+ type: template
+temperature_unit:
+ description: Unit for temperature_template output. Valid options are °C, °F, and K.
+ required: false
+ type: string
+humidity_template:
+ description: The current humidity.
+ required: true
+ type: template
+attribution_template:
+ description: The attribution to be shown in the frontend.
+ required: false
+ type: string
+pressure_template:
+ description: The current air pressure.
+ required: false
+ type: template
+pressure_unit:
+ description: Unit for pressure_template output. Valid options are Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, psi.
+ required: false
+ type: string
+wind_speed_template:
+ description: The current wind speed.
+ required: false
+ type: template
+wind_gust_speed_template:
+ description: The current wind gust speed.
+ required: false
+ type: template
+wind_speed_unit:
+ description: Unit for wind_speed_template output. Valid options are m/s, km/h, mph, mm/d, in/d, and in/h.
+ required: false
+ type: string
+wind_bearing_template:
+ description: The current wind bearing.
+ required: false
+ type: template
+ozone_template:
+ description: The current ozone level.
+ required: false
+ type: template
+cloud_coverage_template:
+ description: The current cloud coverage.
+ required: false
+ type: template
+visibility_template:
+ description: The current visibility.
+ required: false
+ type: template
+visibility_unit:
+ description: Unit for visibility_template output. Valid options are km, mi, ft, m, cm, mm, in, yd.
+ required: false
+ type: string
+forecast_daily_template:
+ description: Daily forecast data.
+ required: false
+ type: template
+forecast_hourly_template:
+ description: Hourly forecast data.
+ required: false
+ type: template
+forecast_twice_daily_template:
+ description: Twice daily forecast data.
+ required: false
+ type: template
+precipitation_unit:
+ description: Unit for precipitation output. Valid options are km, mi, ft, m, cm, mm, in, yd.
+ required: false
+ type: string
+{% endconfiguration %}
diff --git a/source/_integrations/tesla_fleet.markdown b/source/_integrations/tesla_fleet.markdown
index 3bca66294c3..2a4fb705fca 100644
--- a/source/_integrations/tesla_fleet.markdown
+++ b/source/_integrations/tesla_fleet.markdown
@@ -36,11 +36,11 @@ ha_platforms:
ha_integration_type: integration
---
-The Tesla Fleet API {% term integration %} exposes various sensors from Tesla vehicles and energy sites using the [Tesla Fleet API](https://developer.tesla.com/).
+The **Tesla Fleet** {% term integration %} lets you control Tesla vehicles and energy sites using the [Tesla Fleet API](https://developer.tesla.com/).
## Prerequisites
-You must have:
+You need to configure developer credentials and host a public key file to allow Home Assistant to communicate with your Tesla account.
- A [Tesla](https://tesla.com) account
- A [Developer Application](https://developer.tesla.com/en_US/dashboard)
@@ -97,51 +97,55 @@ While the [Tesla Fleet API documentation Step 3](https://developer.tesla.com/doc
1. During the integration setup, you will be provided your public key. Save this as `com.tesla.3p.public-key.pem`
2. Host this file on your domain at the path `/.well-known/appspecific/com.tesla.3p.public-key.pem`. Do not use redirection logic to handle this, or the Tesla API will not recognize your app later in the process.
-{% enddetails %}
+### Step 4: Connect to Home Assistant
-{% details "Linking the Developer Application with Home Assistant" %}
+{% include integrations/config_flow.md %}
-1. Get your OAuth details by going to your [Developer dashboard](https://developer.tesla.com/en_US/dashboard). Select **View Details** under the app you set up for Home Assistant integration. Then, select the **Credentials & APIs** tab. Note the `Client ID` and `Client Secret` strings, these will be needed later.
-2. In Home Assistant, the integration wizard should walk you through the default steps. If not already started, scroll above and select the **ADD INTEGRATION TO MY** button to start the integration wizard. The integration will ask you for all of the necessary integration configurations.
-3. In the **Add credentials** step in the wizard, enter your Tesla Fleet developer application name (from step 5 in the **Setting up the Developer Application** section above), and the Oauth Client ID and Client Secret (from step 1 above). Select **Submit**.
-4. At this step, you should be taken to the Tesla authentication page. You will need to re-enter your Tesla account login credentials.
-5. At the confirmation page with the header **Allow ha-integration access to your Tesla Account** (the specific application name will be whatever you set earlier), select the **Select All** button. This list of scopes is already limited to the specific scopes you chose for the application information earlier, so it is not necessary to review them again. Select **Allow**.
-6. You should now see a Home Assistant page asking if you would like to **Link account to Home Assistant?**. Select **Link account**.
-7. You're all set! The integration should fetch your device details into Home Assistant.
+1. Start the integration setup:
+ - In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}
+ - Select **Add Integration** and search for **Tesla Fleet**
-{% enddetails %}
+2. Enter your application details:
+ - **Application name**: Enter the name you used when creating your Tesla Developer Application
+ - **Client ID: From** your Tesla Developer Dashboard
+ - **Client Secret**: From your Tesla Developer Dashboard
-## Vehicle data polling interval
+3. Authenticate with Tesla:
+ - You'll be redirected to Tesla's login page
+ - Enter your Tesla account credentials
+ - On the authorization page, select **Select All** and then **Allow**
-The integration is configured to {% term polling poll %} each vehicle every 10 minutes while it's awake.
-This is long enough that a single vehicle can be polled 24/7 without exceeding the USD$10 credit Tesla provides.
-It is expected that most vehicles are asleep over 50% of the day, so the defaults should also suit users with multiple vehicles or that want to run automated commands.
+4. Complete the setup:
+ - Confirm you want to **Link account to Home Assistant**
+ - The {% term integration %} will automatically discover your Tesla vehicles and energy products
-If the default polling interval does not suit your needs, you can [define a custom polling interval](https://www.home-assistant.io/common-tasks/general/#defining-a-custom-polling-interval).
+{% tip %}
+If you encounter any issues during setup, check the troubleshooting section below for common solutions.
+{% endtip %}
-## Scopes
+## Data updates
-When connecting your Tesla account to Home Assistant, you **must** select at least one of the `Vehicle Information` or `Energy Product Information` scopes. It is recommended you select all scopes for full functionality. The `Vehicle Location` scope was added in Home Assistant 2024.1, so any authorizations performed on previous releases that want this scope will need to be [modified](https://accounts.tesla.com/en_au/account-settings/security?tab=tpty-apps).
+The {% term integration %} {% term polling polls %} each vehicle every 10 minutes while it's awake. This is designed to stay within Tesla's $10 monthly credit for most users. Energy product APIs are free to use.
-## Pay per use
+{% note %}
+Tesla charges for API calls starting January 2025. The default polling interval is optimized to stay within the free tier for typical usage.
+{% endnote %}
-Previously, Tesla restricted this integration to a very modest rate limit. However, from January 2025, accounts in eligible countries will be charged for every API call. Here's what you need to know:
+If you need different polling intervals, you can [define a custom polling interval](https://www.home-assistant.io/common-tasks/general/#defining-a-custom-polling-interval).
-- Tesla provides a USD$10 credit per developer account per calendar month
-- Every vehicle coordinator refresh, vehicle command, and wake up has a cost
-- This credit only allows for a maximum of 5000 coordinator refreshes
-- Energy product APIs are free to use at this time
-- To go beyond the free credit, you must provide payment details to Tesla
+## Scopes and billing
-For more details, please see [developer.tesla.com](https://developer.tesla.com).
+When connecting your Tesla account, you **must** select at least one of **Vehicle Information** or **Energy Product Information**. All scopes are recommended for full functionality.
-Note that Tesla does not support billing in all countries yet. **Developers in countries that do not yet support payments will not be able to review their billing or usage**. For countries that do support billing, the current billing usage can be viewed at any time by going to your [Developer Dashboard](https://developer.tesla.com/en_US/dashboard), select **View Details** under the app you set up for Home Assistant integration. Then, select the **Application Usage** tab.
+Tesla provides a $10 monthly credit for personal API usage. You can monitor usage in your [Tesla Developer Dashboard](https://developer.tesla.com/en_US/dashboard).
## Command signing
-Certain vehicles, including all vehicles manufactured since late 2023, require vehicle commands to be signed with a private key. All actions on vehicle entities will fail with an error if this is required and the key has not been setup correctly.W
+Certain vehicles, including all vehicles manufactured since late 2023, require vehicle commands to be signed with a private key. All {% term actions %} on vehicle {% term entities %} will fail with an error if this is required and the key has not been setup correctly.
-Your public key must be added to each of your vehicles by visiting https://tesla.com/_ak/YOUR.DOMAIN and following the instructions in the Tesla app.
+The {% term integration %} expects your private key to be located at `config/tesla_fleet.key`. This should be the same private key file (`tesla_fleet.key`) that you created during the prerequisites setup, copied to this location as instructed in the setup steps above.
+
+Your public key must be added to each of your vehicles by visiting `https://tesla.com/_ak/YOUR_DOMAIN` and following the instructions in the Tesla app.
If you're using an iPhone, you may need to use Safari to open the webpage and finish the setup.
For more details see [Tesla Fleet API vehicle commands documentation](https://developer.tesla.com/docs/fleet-api/endpoints/vehicle-commands#key-pairing).
@@ -295,22 +299,19 @@ These are the entities available in the Tesla Fleet integration. Not all entitie
## Vehicle sleep
-Constant API polling will prevent most Model S and Model X vehicles manufactured before 2021 from sleeping, so the integration will stop polling these vehicles for 15 minutes, after 15 minutes of inactivity. You can call the `homeassistant.update_entity` service to force polling the API, which will reset the timer.
+Constant API {% term polling %} will prevent most Model S and Model X vehicles manufactured before 2021 from sleeping. The {% term integration %} automatically stops {% term polling %} these vehicles for 15 minutes after inactivity. You can call the `homeassistant.update_entity` {% term action %} to force {% term polling %}, which will reset the timer.
+
+## Removing the integration
+
+{% include integrations/remove_device_service.md %}
+
+- Removing the {% term integration %} does not delete your Tesla Developer Application - you can remove it manually from the [Tesla Developer Dashboard](https://developer.tesla.com/en_US/dashboard) if no longer needed.
## Troubleshooting
-- **General troubleshooting steps**
- 1. Confirm that your vehicle or energy product can be accessed and updates within the official Tesla app. This rules out any issues that are outside the control of Home Assistant or this integration.
- 2. For some errors in the integration, waking the vehicle or energy product through the official app, then restarting Home Assistant will sometimes help re-authenticate the connection with Tesla's API. You may be asked to re-authenticate through the Tesla website.
+- **Setup errors**: Verify your public key is accessible at the correct URL and you've completed all registration steps with Tesla
+- **Command failures**: Ensure `tesla_fleet.key` exists in your Home Assistant config directory and add your public key to vehicles via `https://tesla.com/_ak/YOUR_DOMAIN`
+- **{% term Integration %} stopped working**: Use the reconfigure option in {% my integrations title="**Settings** > **Devices & services**" %} > **Tesla Fleet**
+- **Billing errors**: Check your Tesla Developer Dashboard for usage limits and add billing information if needed
-- **Integration is broken or needs to be reconfigured**
- 1. Ensure that you have a Tesla developer application ready for usage (refer to the instructions in the **Setting up the Developer Application** section above).
- 2. Go to your Tesla Fleet integration page in Home Assistant, then select the **Reconfigure** button to bring the integration wizard up.
- - If the **Reconfigure** button is not visible, clear any Application Credentials related to Tesla Fleet from your Application Credentials page (can be found at `http://homeassistant.local:PORT/config/application_credentials`), then restart Home Assistant. After the restart, navigate to the Tesla Fleet integration page, and the **Reconfigure ** button should be visible.
- 3. Follow the steps in the **Linking the Developer Application with Home Assistant** section above.
-
-- **Integration no longer works after the January 2025 API pricing updates**
- 1. Refer to the **Integration is broken** troubleshooting steps above.
-
-- **Integration shows `a condition has not been met to process the request`**
- 1. Confirm that you've run all the steps from both the **Hosting a Public/Private Key Pair** and **Register your application as a Fleet API partner** sections above.
+If you have an error with your credentials, you can delete them in the {% my application_credentials title="Application Credentials" %} user interface.
diff --git a/source/_integrations/thermador.markdown b/source/_integrations/thermador.markdown
index cebeedf5072..972e25e9872 100644
--- a/source/_integrations/thermador.markdown
+++ b/source/_integrations/thermador.markdown
@@ -31,6 +31,7 @@ ha_platforms:
- switch
- time
ha_iot_class: Cloud Push
+ha_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/third_reality.markdown b/source/_integrations/third_reality.markdown
index 46039115399..70960ec6fe2 100644
--- a/source/_integrations/third_reality.markdown
+++ b/source/_integrations/third_reality.markdown
@@ -28,18 +28,4 @@ ha_iot_standard:
ha_brand: true
---
-[Third Reality](https://3reality.com) is a member of the Works with Home Assistant partner program for their Zigbee and Matter products. Third Reality is committed to making sure their products are up-to-date and ready to use in Home Assistant.
-
-Third Reality Zigbee devices work locally and integrate seamlessly with the Zigbee integration in Home Assistant (Zigbee stick required).
-
-To add Third Reality products, pair them as Zigbee or Matter devices, depending on which you have purchased:
-
-{% my add_zigbee_device badge brand=page.ha_domain %}
-
-[Learn more about Zigbee in Home Assistant.](/integrations/zha/)
-
-Third Reality Matter devices work locally and integrate seamlessly with the Matter integration in Home Assistant. As all connectivity is happening locally, status updates and controlling your devices happen instantly in Home Assistant.
-
-{% my add_matter_device badge domain=page.ha_domain %}
-
-[Learn more about Matter in Home Assistant.](/integrations/matter/)
+{% include integrations/wwha.md url="https://3reality.com/" %}
diff --git a/source/_integrations/tts.markdown b/source/_integrations/tts.markdown
index dbf10248b44..06aff3f940d 100644
--- a/source/_integrations/tts.markdown
+++ b/source/_integrations/tts.markdown
@@ -46,7 +46,7 @@ Screenshot showing the state of a text-to-speech entity in the developer tools.
Modern platforms will create entities under the `tts` domain, where each entity represents one text-to-speech service provider. These entities may be used as targets for the `tts.speak` action.
-the `tts.speak` action supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`, and the media player that should output the sound is selected with `media_player_entity_id`.
+The `tts.speak` action supports `message`, `language`, `cache`, `media_player_entity_id` and `options` options. The text that should be spoken is set with `message`, and the media player that should output the sound is selected with `media_player_entity_id`. The language can be set with `language`, using the format required by the target entity platform (refer to specific platform documentation). See [cache section](#cache) for information on `cache` option. Additional settings can be specified with the `options` option, which include preferred audio settings (see [preferred audio settings](#preferred-audio-settings) section for more info) and further settings of the target entity platform, e.g., _voice, motion, speed, etc._ (refer to specific platform documentation for any supported settings).
```yaml
action: tts.speak
@@ -59,7 +59,7 @@ data:
### Action say (legacy)
-The `say` action supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`. Since release 0.92, action name can be defined in configuration `service_name` option.
+The `say` action supports `message`, `language`, `cache` and `options` options. The text that should be spoken is set with `message`. The language can be set with `language`, using the format required by the platform (refer to specific platform documentation). See [cache section](#cache) for information on `cache` option. Additional settings can be specified with the `options` option, which include preferred audio settings (see [preferred audio settings](#preferred-audio-settings) section for more info) and further settings of the target platform, e.g., _voice, motion, speed, etc._ (refer to specific platform documentation for any supported settings). Since release 0.92, action name can be defined in configuration `service_name` option.
Say to all `media_player` entities:
@@ -105,13 +105,40 @@ data:
## Cache
-The integration cache can be controlled with the `cache` option in the action to `speak` or `say`. A long time cache will be located on the file system. The in-memory cache for fast responses to media players will be auto-cleaned after a short period.
+The integration cache can be controlled with the `cache` option in the action to `speak` or `say`, setting it to `True` to enable it (default), or `False` to disable it. A long time cache will be located on the file system. The in-memory cache for fast responses to media players will be auto-cleaned after a short period.
+
+## Preferred audio settings
+
+Each TTS platform produces audio samples in different formats, not always compatible with every media player. TTS integration building block supports a way to configure preferred target audio format through `options` option of `speak` or `say` actions.
+
+TTS integration building block uses [FFmpeg integration](/integrations/ffmpeg) to perform audio transcoding when target entity platform does not support one or all the specified preferred audio format settings (refer to specific platform documentation for any supported setting with related supported values).
+
+Available preferred audio settings, all optional, are:
+
+- `preferred_format`: Set the audio format. When not supported by the target entity platform, the value is a file extension like `wav`, `mp3`, `ogg`, etc., among ones supported by FFmpeg tool for output files.
+- `preferred_sample_rate`: Set the sample rate. When not supported by the target entity platform, the value is in Hz as a number, among ones supported by the `-ar` parameter of FFmpeg tool.
+- `preferred_sample_channels`: Set the number of audio channels. When not supported by the target entity platform, the value is a number among ones supported by the `-ac` parameter of FFmpeg tool.
+- `preferred_sample_bytes`: Set the audio bit sampling. When not supported by the target entity platform, can only be set to `2` to use 16-bit audio sampling (any other value is ignored).
+
+Example to produce an MP3 audio at 22050Hz:
+
+```yaml
+action: tts.speak
+target:
+ entity_id: tts.example
+data:
+ media_player_entity_id: media_player.kitchen
+ message: "May the force be with you."
+ options:
+ preferred_format: mp3
+ preferred_sample_rate: 22050
+```
## REST API
### POST `/api/tts_get_url`
-Returns a URL to the generated TTS file. The `engine_id` or `platform` parameter together with `message` are required.
+Returns a URL to the generated TTS file. The `engine_id` (which is the entity id) or `platform` parameter together with `message` are required. Additional parameters `cache`, `language` and `options` are supported, as JSON attributes, as described for `speak` action.
```json
{
@@ -166,3 +193,9 @@ These requirements present the following problems, all of which create problems
- If you are using SSL (e.g., `https://yourhost.example.org/...`) then you _must_ use the hostname in the certificate (e.g., `external_url: https://yourhost.example.org`). You cannot use an IP address since the certificate won't be valid for the IP address, and the cast device will refuse the connection.
The recommended way to overcome these obstacles is to not manually configure a local Home Assistant URL.
+
+### Partial, corrupted or no audio
+
+Some media players could reproduce only partial, corrupted or no audio at all when the audio format is not fully supported. In such cases it is required to experiment with different combinations of audio formats, channels, sample rates and bits using [preferred audio settings](#preferred-audio-settings) options.
+
+For example, some Google Cast devices skip initial audio part when the audio is sampled at 22050Hz, and to fix the problem it is required to set the `preferred_sample_rate` setting in the `options` option to `44100`.
diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown
index f2c8ba628e5..0a264f648fa 100644
--- a/source/_integrations/unifiprotect.markdown
+++ b/source/_integrations/unifiprotect.markdown
@@ -57,7 +57,7 @@ UCKP with Firmware v1.x **do NOT run UniFi OS**, you must upgrade to firmware [`
### Software support
-The absolute **minimal** software version is [`v1.20.0`](https://community.ui.com/releases/UniFi-Protect-Application-1-20-0/d43c0905-3fb4-456b-a7ca-73aa830cb011) for UniFi Protect. If you have an older version, you will get errors trying to set up the integration. However, the general advice is the latest 2 minor versions of UniFi Protect and hardware supported by those are supported.
+The **absolute minimum** software version is [`v1.20.0`](https://community.ui.com/releases/UniFi-Protect-Application-1-20-0/d43c0905-3fb4-456b-a7ca-73aa830cb011) for UniFi Protect. If you have an older version, you will get errors trying to set up the integration. However, the general advice is the latest 2 minor versions of UniFi Protect are supported.
{% important %}
**Early Access and Release Candidate versions are not supported by Home Assistant.**
@@ -420,9 +420,9 @@ actions:
You can obtain the `nfc_id` using the [Action unifiprotect.get_user_keyring_info](#action-unifiprotectget_user_keyring_info).
-**Warning:**
-
+{% warning %}
When processing NFC scans, always validate the scanned ID. Unknown NFC cards also trigger the scan event. Additionally, this event was developed using third-party cards, as the developer did not have access to official UniFi cards at the time. With third-party cards, the scan relies on the card's serial number. While this approach is not uncommon, it is essential to note that the card's serial number is generally not considered a secure identifier and can be duplicated relatively easily. When the device becomes unavailable and becomes available again in Home Assistant, repeated event processing can occur. The state change is not an issue with the integration but should be considered, mainly if the device is used for actions such as unlocking doors.
+{% endwarning %}
### Fingerprint Identified Event
@@ -463,39 +463,9 @@ action:
title: "Fingerprint Scan Notification"
```
-**Warning:**
-
+{% warning %}
Similar to NFC, an event is triggered when a fingerprint is recognized and not recognized. However, unlike NFC, at the time of implementation, no fingerprint ID is included in the event if the fingerprint is unknown. When the device becomes unavailable and becomes available again in Home Assistant, repeated event processing can occur. The state change is not an issue with the integration but should be considered, mainly if the device is used for actions such as unlocking doors.
-
-#### Example G4 Doorbell Fingerprint Identified Automation
-
-```yaml
-alias: G4 Doorbell Fingerprint Identified Automation
-description: Automation that triggers when a fingerprint is successfully identified on the G4 Doorbell Pro
-trigger:
- - platform: event
- event_type: state_changed
- event_data:
- entity_id: event.g4_doorbell_pro_poe_fingerprint # Replace with your doorbell entity
-condition:
- - condition: template
- value_template: >
- {% raw %}{{
- trigger.event.data.new_state is not none and
- trigger.event.data.new_state.attributes.event_type == 'identified' and
- (trigger.event.data.new_state.attributes.ulp_id|default('')) != '' and
- trigger.event.data.new_state.attributes.ulp_id in ['ALLOWED_ID1', 'ALLOWED_ID2']
- }}{% endraw %}
-action:
- - service: notify.mobile_app_your_device # Replace with your notification target
- data:
- {% raw %}message: "Fingerprint identified with ID: {{ trigger.event.data.new_state.attributes.ulp_id }}"{% endraw %}
- title: "Fingerprint Scan Notification"
-```
-
-**Warning:**
-
-Similar to NFC, an event is triggered when a fingerprint is recognized and not recognized. However, unlike NFC, at the time of implementation, no fingerprint ID is included in the event if the fingerprint is unknown.
+{% endwarning %}
## Troubleshooting
diff --git a/source/_integrations/vacuum.template.markdown b/source/_integrations/vacuum.template.markdown
deleted file mode 100644
index 4fedbb92c83..00000000000
--- a/source/_integrations/vacuum.template.markdown
+++ /dev/null
@@ -1,217 +0,0 @@
----
-title: "Template vacuum"
-description: "Instructions how to setup template vacuums within Home Assistant."
-ha_category:
- - Vacuum
- - Helper
-ha_release: 0.96
-ha_iot_class: Local Push
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - vacuum
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` platform creates vacuums that combine integrations and provides the
-ability to run scripts or invoke actions for each of the start, pause, stop,
-return_to_base, clean_spot, locate and set_fan_speed commands of a vacuum.
-
-To enable Template Vacuums in your installation, add the following to your
-`configuration.yaml` file:
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-vacuum:
- - platform: template
- vacuums:
- living_room_vacuum:
- start:
- action: script.vacuum_start
-```
-
-{% endraw %}
-
-{% configuration %}
- vacuums:
- description: List of your vacuums.
- required: true
- type: map
- keys:
- friendly_name:
- description: Name to use in the frontend.
- required: false
- type: string
- unique_id:
- description: An ID that uniquely identifies this vacuum. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
- value_template:
- description: "Defines a template to get the state of the vacuum. Valid value: `docked`/`cleaning`/`idle`/`paused`/`returning`/`error`"
- required: false
- type: template
- battery_level_template:
- description: "Defines a template to get the battery level of the vacuum. Legal values are numbers between `0` and `100`."
- required: false
- type: template
- fan_speed_template:
- description: Defines a template to get the fan speed of the vacuum.
- required: false
- type: template
- attribute_templates:
- description: Defines templates for attributes of the sensor.
- required: false
- type: map
- keys:
- "attribute: template":
- description: The attribute and corresponding template.
- required: true
- type: template
- availability_template:
- description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed.
- required: false
- type: template
- default: true
- start:
- description: Defines an action to run when the vacuum is started.
- required: true
- type: action
- pause:
- description: Defines an action to run when the vacuum is paused.
- required: false
- type: action
- stop:
- description: Defines an action to run when the vacuum is stopped.
- required: false
- type: action
- return_to_base:
- description: Defines an action to run when the vacuum is given a return to base command.
- required: false
- type: action
- clean_spot:
- description: Defines an action to run when the vacuum is given a clean spot command.
- required: false
- type: action
- locate:
- description: Defines an action to run when the vacuum is given a locate command.
- required: false
- type: action
- set_fan_speed:
- description: Defines an action to run when the vacuum is given a command to set the fan speed.
- required: false
- type: action
- fan_speeds:
- description: List of fan speeds supported by the vacuum.
- required: false
- type: [string, list]
-{% endconfiguration %}
-
-### Template and action variables
-
-State-based template entities have the special template variable `this` available in their templates and actions. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an {% term entity %}'s state and attribute in templates and actions.
-
-## Examples
-
-### Control vacuum with Harmony Hub
-
-This example shows how you can use a Template Vacuum to control an IR vacuum cleaner using the [Harmony Hub Remote integration](/integrations/harmony).
-
-```yaml
-vacuum:
- - platform: template
- vacuums:
- living_room_vacuum:
- start:
- - action: remote.send_command
- target:
- entity_id: remote.harmony_hub
- data:
- command: Clean
- device: 52840686
- return_to_base:
- - action: remote.send_command
- target:
- entity_id: remote.harmony_hub
- data:
- command: Home
- device: 52840686
- clean_spot:
- - action: remote.send_command
- target:
- entity_id: remote.harmony_hub
- data:
- command: SpotCleaning
- device: 52840686
-```
-
-### Vacuum with state
-
-This example shows how to use templates to specify the state of the vacuum.
-
-{% raw %}
-
-```yaml
-vacuum:
- - platform: template
- vacuums:
- living_room_vacuum:
- value_template: "{{ states('sensor.vacuum_state') }}"
- battery_level_template: "{{ states('sensor.vacuum_battery_level')|int }}"
- fan_speed_template: "{{ states('sensor.vacuum_fan_speed') }}"
- start:
- action: script.vacuum_start
- pause:
- action: script.vacuum_pause
- stop:
- action: script.vacuum_stop
- return_to_base:
- action: script.vacuum_return_to_base
- clean_spot:
- action: script.vacuum_clean_spot
- locate:
- action: script.vacuum_locate_vacuum
- set_fan_speed:
- action: script.vacuum_set_fan_speed
- data:
- speed: "{{ fan_speed }}"
- fan_speeds:
- - Low
- - Medium
- - High
-```
-
-{% endraw %}
-
-### Add custom attributes
-
-This example shows how to add custom attributes.
-
-{% raw %}
-
-```yaml
-vacuum:
- - platform: template
- vacuums:
- living_room_vacuum:
- value_template: "{{ states('sensor.vacuum_state') }}"
- battery_level_template: "{{ states('sensor.vacuum_battery_level')|int }}"
- fan_speed_template: "{{ states('sensor.vacuum_fan_speed') }}"
- attribute_templates:
- status: >-
- {% if (states('sensor.robot_vacuum_robot_cleaner_movement') == "after" and states('sensor.robot_vacuum_robot_cleaner_cleaning_mode') == "stop") %}
- Charging to Resume
- {% elif states('sensor.robot_vacuum_robot_cleaner_cleaning_mode') == "auto" %}
- Cleaning
- {% else %}
- Charging
- {% endif %}
-```
-
-{% endraw %}
diff --git a/source/_integrations/voip.markdown b/source/_integrations/voip.markdown
index aeb38fe6693..228e77bc829 100644
--- a/source/_integrations/voip.markdown
+++ b/source/_integrations/voip.markdown
@@ -8,6 +8,7 @@ ha_release: '2023.5'
ha_codeowners:
- '@balloob'
- '@synesthesiam'
+ - '@jaminh'
ha_domain: voip
ha_integration_type: integration
ha_quality_scale: internal
diff --git a/source/_integrations/weather.template.markdown b/source/_integrations/weather.template.markdown
deleted file mode 100644
index f5ded2771be..00000000000
--- a/source/_integrations/weather.template.markdown
+++ /dev/null
@@ -1,148 +0,0 @@
----
-title: "Template Weather Provider"
-description: "Instructions on how to integrate Template Weather provider into Home Assistant."
-ha_category:
- - Weather
- - Helper
-ha_release: 2021.3
-ha_iot_class: "Local Push"
-ha_quality_scale: internal
-ha_codeowners:
- - '@home-assistant/core'
-ha_domain: template
-ha_platforms:
- - weather
-ha_integration_type: helper
-related:
- - docs: /docs/configuration/
- title: Configuration file
----
-
-The `template` integrations creates weather provider that combines integrations and an existing weather provider into a fused weather provider.
-
-There are several powerful ways to use this {% term integration %}, including localizing your weather provider information with local information from temperature, humidity, pressure sensors that you own.
-
-Another use case could be using temperature and humidity from one weather platform, with forecasts from a different one.
-
-Output will be converted according to the user's unit system or {% term entity %} override, see [documentation](https://developers.home-assistant.io/docs/core/entity/weather/#unit-conversion).
-
-## Configuration
-
-To enable a Template Weather provider in your installation, add the following to your {% term "`configuration.yaml`" %} file:
-
-(Note, be sure to update my_region in the condition and forecast templates to an appropriate value for your setup).
-
-{% raw %}
-
-```yaml
-# Example configuration.yaml entry
-weather:
- - platform: template
- name: "My Weather Station"
- condition_template: "{{ states('weather.my_region') }}"
- temperature_template: "{{ states('sensor.temperature') | float }}"
- temperature_unit: "°C"
- humidity_template: "{{ states('sensor.humidity') | float }}"
- forecast_daily_template: "{{ state_attr('weather.my_region', 'forecast_data') }}"
-```
-
-{% endraw %}
-
-{% configuration %}
-name:
- description: Name to use in the frontend.
- required: true
- type: template
-unique_id:
- description: An ID that uniquely identifies this weather entity. Set this to a unique value to allow customization through the UI.
- required: false
- type: string
-condition_template:
- description: The current weather condition.
- required: true
- type: template
-temperature_template:
- description: The current temperature.
- required: true
- type: template
-dew_point_template:
- description: The current dew point.
- required: false
- type: template
-apparent_temperature_template:
- description: The current apparent (feels-like) temperature.
- required: false
- type: template
-temperature_unit:
- description: Unit for temperature_template output. Valid options are °C, °F, and K.
- required: false
- type: string
-humidity_template:
- description: The current humidity.
- required: true
- type: template
-attribution_template:
- description: The attribution to be shown in the frontend.
- required: false
- type: string
-pressure_template:
- description: The current air pressure.
- required: false
- type: template
-pressure_unit:
- description: Unit for pressure_template output. Valid options are Pa, hPa, kPa, bar, cbar, mbar, mmHg, inHg, psi.
- required: false
- type: string
-wind_speed_template:
- description: The current wind speed.
- required: false
- type: template
-wind_gust_speed_template:
- description: The current wind gust speed.
- required: false
- type: template
-wind_speed_unit:
- description: Unit for wind_speed_template output. Valid options are m/s, km/h, mph, mm/d, in/d, and in/h.
- required: false
- type: string
-wind_bearing_template:
- description: The current wind bearing.
- required: false
- type: template
-ozone_template:
- description: The current ozone level.
- required: false
- type: template
-cloud_coverage_template:
- description: The current cloud coverage.
- required: false
- type: template
-visibility_template:
- description: The current visibility.
- required: false
- type: template
-visibility_unit:
- description: Unit for visibility_template output. Valid options are km, mi, ft, m, cm, mm, in, yd.
- required: false
- type: string
-forecast_daily_template:
- description: Daily forecast data.
- required: false
- type: template
-forecast_hourly_template:
- description: Hourly forecast data.
- required: false
- type: template
-forecast_twice_daily_template:
- description: Twice daily forecast data.
- required: false
- type: template
-precipitation_unit:
- description: Unit for precipitation output. Valid options are km, mi, ft, m, cm, mm, in, yd.
- required: false
- type: string
-{% endconfiguration %}
-
-### Template variables
-
-State-based template entities have the special template variable `this` available in their templates. The `this` variable aids [self-referencing](/integrations/template#self-referencing) of an {% term entity %}'s state and attribute in templates.
diff --git a/source/_integrations/zimi.markdown b/source/_integrations/zimi.markdown
index a378fbfce32..60e23a09b74 100644
--- a/source/_integrations/zimi.markdown
+++ b/source/_integrations/zimi.markdown
@@ -1,12 +1,11 @@
---
-title: Zimi Cloud Controller
+title: zimi
description: Access and control your Zimi Cloud Controller and its connected Zimi-based devices.
featured: false
ha_iot_class: Local Push
ha_release: 2025.6
ha_codeowners:
- '@markhannon'
- - '@mhannon11'
ha_category:
- Cover
- Fan
@@ -25,6 +24,8 @@ quality_scale: bronze
integration_type: hub
related:
- url: https://zimi.life/
+ha_quality_scale: bronze
+ha_integration_type: integration
---
The **Zimi Cloud Controller** {% term integration %} allows you to connect your Zimi Cloud Controller to Home Assistant and, via this integration, control local devices connected to the Zimi mesh.
diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown
index 803f6f0c602..c27f3237e26 100644
--- a/source/_integrations/zwave_js.markdown
+++ b/source/_integrations/zwave_js.markdown
@@ -82,7 +82,7 @@ For more Z-Wave term definitions, refer to the [terminology section](#z-wave-ter
To run a Z-Wave network, you need the following elements:
- A [supported Z-Wave controller](/docs/z-wave/controllers/#supported-z-wave-usb-sticks--hardware-modules). First-time user? For recommendations on what to buy, go [here](#which-z-wave-controller-should-i-buy).
-- A running Z-Wave JS server.
+- A running [Z-Wave JS server](#setting-up-a-z-wave-js-server).
- An installed Z-Wave integration in Home Assistant.
### Setting up a Z-Wave JS server
@@ -95,8 +95,11 @@ Follow these steps:
1. Open the Home Assistant user interface.
2. Plug the Z-Wave dongle into the device running Home Assistant.
- - Most likely, your dongle will be recognized automatically. On the user interface, you will be asked if you want to set up this device with the Z-Wave JS add-on. Select **Submit**.
- - If your dongle is not recognized, follow these steps:
+ - Most likely, your dongle will be recognized automatically.
+ - In the dialog, select **Recommended installation**.
+ - This will install the Z-Wave JS add-on on the Home Assistant server.
+ - Add the device to an {% term area %} and select **Finish**.
+ - **Troubleshooting**: If your dongle is not recognized, follow these steps:
{% details "Manual setup steps" %}
Use this My button:
@@ -113,7 +116,7 @@ Use this My button:
{% enddetails %}
3. Wait for the installation to complete.
-4. You are prompted for network security keys.
+4. Depending on your Home Assistant version, you may be prompted for network security keys.
- If you are using Z-Wave for the first time, leave all the fields empty and select **Submit**. The system will generate network security keys for you.
- If this Z-Wave dongle has already been paired with secure devices, you need to enter the previously used network key as the S0 network key. S2 security keys will be automatically generated for you.
- Make sure that you keep a backup of these keys in a safe place in case you need to move your Z-Wave dongle to another device. Copy and paste them somewhere safe.
@@ -155,6 +158,8 @@ While your Z-Wave mesh is permanently stored on your dongle, the additional meta
### Removing a device from the Z-Wave network
+Do this before using the device with another controller, or when you don't use the device anymore. It removes the device from the Z-Wave network stored on the controller. It also removes the device and all its entities from Home Assistant. You can not join a device to a new network if it is still paired with a controller.
+
1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
2. Select the **Z-Wave** integration. Then, select **Configure**.
3. Select **Remove device**, then **Start exclusion**.
@@ -162,6 +167,122 @@ While your Z-Wave mesh is permanently stored on your dongle, the additional meta
4. Put the device you want to remove in exclusion mode. Refer to its manual how this is done.
5. The UI should confirm that the device was removed and the device and entities will be removed from Home Assistant.
+## Migrating a Z-Wave network to a new controller
+
+Do this if you have an existing Z-Wave network and want to use a new controller. This will reset your current controller (remove all network information from it) and remove the controller from Home Assistant. The Z-Wave integration with all its entities will stay in Home Assistant. The new controller is added to Home Assistant and paired with the existing network.
+
+### Prerequisites
+
+- Administrator rights in Home Assistant
+- If you want to migrate from a 500 series controller, before starting migration, update the controller to SDK 6.61+
+ - Check the documentation of your device to see if and how they can be updated.
+ - [Steps to update Aeotec Z-Stick 5](https://aeotec.freshdesk.com/support/solutions/articles/6000252294-z-stick-gen5-v1-02-firmware-update).
+
+### To migrate a Z-Wave network to a new controller
+
+1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Select the **Z-Wave** integration. Then, select **Configure**.
+3. Under **Backup and restore**, select **Migrate controller**.
+4. Select **Migrate to a new controller**.
+ - To confirm device reset, select **Submit**.
+ - **Info**: This will initiate a backup of the network information and factory reset the controller. All the stored network information will be removed.
+5. When the **Unplug your controller** dialog shows up, unplug your old controller.
+ - Connect the new controller.
+ - Confirm that you connected the new controller by selecting **Submit**.
+6. Follow the steps on screen.
+
+## Overriding the radio frequency region of the controller in the Z-Wave JS add-on
+
+The frequency used by Z-Wave devices depends on your region. For 700 and 800 series controllers, this frequency can be changed. The frequency of end devices cannot, so you need to make sure to buy devices specific to your region.
+
+If you are using the Z-Wave JS add-on, Home Assistant automatically changes the radio frequency region to match the region/country you're in. If needed, you can override this setting.
+
+### Prerequisites
+
+- Administrator rights in Home Assistant
+- All your Z-Wave devices must be specified for that region
+- Note: this procedure only applies if your controller is [set up using the Z-Wave JS add-on](#setting-up-a-z-wave-js-server)
+
+### To override the radio frequency region of your Z-Wave controller
+
+1. Go to {% my supervisor_addon addon="core_zwave_js" title="**Settings** > **Add-ons** > **Z-Wave JS**" %}.
+2. Open the **Configuration** tab.
+3. In the **Options** section, select the **Radio Frequency Region**.
+4. To apply your changes, select **Save**.
+ - Your Z-Wave controller is now ready to communicate with devices that were specified for your chosen region.
+5. To return to the default setting and use the region defined by Home Assistant, under **Radio Frequency Region** choose **Automatic**.
+
+## Backing up your Z-Wave network
+
+It's recommended to create a backup before making any major changes to your Z-Wave network. For example, before migrating from one controller to another, or before resetting your controller. The backup stores your Z-Wave controller's non-volatile memory (NVM), which contains your network information including paired devices. It is stored in a binary file that you can download.
+
+### Prerequisites
+
+- Administrator rights in Home Assistant
+
+### To backup your Z-Wave network
+
+1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Select the **Z-Wave** integration. Then, select **Configure**.
+3. Under **Backup and restore**, select **Download backup**.
+ - **Result**: The backup file is downloaded to the device from which you initiated the download.
+4. Done! Store the backup file somewhere safe in case you need it later to restore your Z-Wave network.
+
+## Updating the firmware of your Z-Wave device
+
+Controllers and devices with the Firmware Update Metadata Command Class allow you to update the firmware by uploading a firmware file. In those cases, you can start the firmware update from the device page in Home Assistant. Refer to the documentation of the device manufacturer to find the corresponding firmware file. An example is the [firmware page by Zooz](https://www.support.getzooz.com/kb/article/1158-zooz-ota-firmware-files/).
+
+{% caution %}
+**Risk of damage to the device due to firmware update**
+
+A firmware update can damage your Z-Wave device.
+
+- Before updating your Z-Wave device, make sure an update is necessary, and that you have the correct firmware file matching your device.
+- Once you have started the update process, you must not interrupt the update process but let it complete.
+
+The Home Assistant and Z-Wave JS teams do not take any responsibility for any damages to your device as a result of the firmware update and will not be able to help you if you render your device useless due to firmware update.
+{% endcaution %}
+
+### Prerequisites
+
+- Administrator rights in Home Assistant
+- Downloaded the firmware file from the manufacturer website
+
+### To update firmware of a Z-Wave device
+
+1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Select the **Z-Wave** integration. Then, select **Configure** and select the controller.
+3. Under **Device info**, select **Update**.
+4. Select the firmware file that you previously downloaded to your computer.
+ - **Caution: Risk of damage to the device**
+ - Make sure you select the correct firmware file.
+ - An incorrect firmware file can damage your device.
+ - Once you start the update process, you must wait for the update to complete.
+ - An interrupted update can damage your device.
+5. Select **Begin firmware update** and wait for it to complete.
+
+## Resetting a Z-Wave controller
+
+It is recommended to back up your Z-Wave network before resetting the device.
+
+- The controller will forget all devices it is paired with.
+- All Z-Wave devices for this network will be removed from Home Assistant.
+- If there are any devices still paired with the controller when it is reset, they will have to go through the exclusion process before they can be re-paired.
+- The device firmware will remain on the device.
+
+### Prerequisites
+
+- Administrator rights on Home Assistant
+
+### To reset a Z-Wave controller
+
+1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Select the **Z-Wave** integration. Then, select the controller.
+3. Under **Device info**, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Factory reset**.
+
+ 
+4. Once the process is finished, you can use this controller to start a new network, or pass it on to someone else.
+
## Special Z-Wave entities
The Z-Wave integration provides several special entities, some of which are available for every Z-Wave device, and some of which are conditional based on the device.
@@ -201,19 +322,6 @@ Some features can be accessed from the menu of integration itself. As they are n
- **[Download diagnostics](/docs/configuration/troubleshooting/#download-diagnostics):** Exports a JSON file describing the entities of all devices registered with this integration.
-### Device panel
-
-#### Controller
-
-The following features can be accessed from the device panel of a Z-Wave controller:
-
-- **Factory reset:** Exercise extreme caution when using this action! Once initiated, your controller will be reset to factory settings, it will forget all devices it is paired with, it will establish a new network ID that will prevent any recovery of your old network, and all Z-Wave devices for this network will be removed from Home Assistant. If there are any devices still paired with the controller when it is reset, they will have to go through the exclusion process before they can be re-paired.
-
-
-
-Screenshot showing the device panel of a Z-Wave controller.
-
-
#### Network devices
The following features can be accessed from the device panel of any Z-Wave device on your network aside from the controller:
@@ -819,7 +927,7 @@ You can also keep track of the road map for the Z-Wave integration [here](https:
### Which Z-Wave controller should I buy?
-Z-Wave supports all known 500 and 700 series Z-Wave controllers. If you are just starting out, we recommend that you purchase a 700 series controller (with firmware updated to >=7.17.2).
+Z-Wave supports all known 500-, 700-, and 800-series Z-Wave controllers. If you are just starting out, we recommend that you purchase a 800-series controller (with firmware updated to >=7.23.2).
For more information, see [Supported Z-Wave dongles](/docs/z-wave/controllers/#supported-z-wave-usb-sticks--hardware-modules)
@@ -946,7 +1054,7 @@ If the interview is complete, then the device does not yet have a device file fo
When trying to determine why something isn't working as you expect, or when reporting an issue with the integration, it is helpful to know what Z-Wave JS sees as the current state of your Z-Wave network. To get a dump of your current network state, follow these steps:
1. Go to {% my integrations title="**Settings** > **Devices & services**" %}.
-2. Select the **Z-Wave** integration. Then, select the three dots.
+2. Select the **Z-Wave** integration. Then, select the three dots {% icon "mdi:dots-vertical" %} menu.
3. From the dropdown menu, select **Download diagnostics**.
### How do I address interference issues?
@@ -1062,3 +1170,25 @@ No further action is required and the SmartStart product will be added automatic
### Terminology mapping table
For some of the concepts, the terminology used in Home Assistant does not correspond to the terminology used in Z-Wave documentation. Refer to the [terminology mapping table](#z-wave-terminology-and-home-assistant) for a list of term equivalents.
+
+## Removing Z-Wave JS from Home Assistant
+
+This removes all paired Z-Wave devices and their entities, the Z-Wave JS add-on, and the Z-Wave integration from Home Assistant.
+
+### To remove Z-Wave JS from Home Assistant
+
+1. [Remove the device from your Z-Wave network](/integrations/zwave_js/#removing-a-device-from-the-z-wave-network).
+ - Do this for each device that is joined to your network so that it is no longer paired to the controller.
+ - You cannot add a device to a new controller while it is still paired with an old one.
+ - Alternatively, you can factory reset each device. Refer to the device manual to see how this is done.
+ - This usually involves finding the device in your household and pressing a button.
+2. Remove the Z-Wave integration.
+ - Go to {% my integrations title="**Settings** > **Devices & services**" %} and select the integration card.
+ - Next to the integration entry, select the three-dot {% icon "mdi:dots-vertical" %} menu.
+ - Select **Delete**.
+3. If it hasn't been deleted automatically, remove the Z-Wave JS add-on.
+ - Go to {% my supervisor_addon addon="core_zwave_js" title="**Settings** > **Add-ons** > **Z-Wave JS**" %}.
+ - Select **Uninstall**.
+ - Decide whether to also delete the data related to the add-on or whether to keep it.
+4. Done. Z-Wave JS is now completely removed from your Home Assistant server.
+ - You can now use your Z-Wave devices and controller on a new server.
diff --git a/source/_posts/2016-02-13-speedtest-bloomsky-splunk-and-garage-doors.markdown b/source/_posts/2016-02-13-speedtest-bloomsky-splunk-and-garage-doors.markdown
index c2c2984d575..c1a4f7c7b19 100644
--- a/source/_posts/2016-02-13-speedtest-bloomsky-splunk-and-garage-doors.markdown
+++ b/source/_posts/2016-02-13-speedtest-bloomsky-splunk-and-garage-doors.markdown
@@ -108,7 +108,7 @@ Not only did we gain a lot of test coverage, we also attracted a lot of new deve
[Snapcast]: /integrations/snapcast
[mqtt-publish]: /integrations/mqtt/#publish-service
[REST]: /integrations/notify.rest/
-[template]: /integrations/switch.template/
+[template]: /integrations/template/#switch
[Honeywell]: /integrations/honeywell/
[zwave-polling]: /integrations/zwave/#configuration
[zwave-scene]: /integrations/zwave/#events
diff --git a/source/_posts/2023-01-04-release-20231.markdown b/source/_posts/2023-01-04-release-20231.markdown
index b0626a93511..f284d0c8a01 100644
--- a/source/_posts/2023-01-04-release-20231.markdown
+++ b/source/_posts/2023-01-04-release-20231.markdown
@@ -83,7 +83,7 @@ repository, and [we are looking for contributions](https://github.com/home-assis
So, feel free to jump in and help out!
An overview of the current status of all intents and languages can be found on
-[this page](https://home-assistant.github.io/intents/). The page gives insight
+[this page](https://ohf-voice.github.io/intents/). The page gives insight
into the parts we need help with.
Lastly, we are also looking for language leaders! Each language is maintained
diff --git a/source/_posts/2023-01-26-year-of-the-voice-chapter-1.markdown b/source/_posts/2023-01-26-year-of-the-voice-chapter-1.markdown
index 67fb3bf7159..6e5a3f83d59 100644
--- a/source/_posts/2023-01-26-year-of-the-voice-chapter-1.markdown
+++ b/source/_posts/2023-01-26-year-of-the-voice-chapter-1.markdown
@@ -20,7 +20,7 @@ _To watch the video presentation of this blog post, including live demos, check
The core of a voice assistant is to be able to understand the intention of a spoken sentence. What is it the user wants to do? To extract these intentions we created our own template sentence matching format and intent recognizer named [Hassil](https://github.com/home-assistant/hassil).
-This new format is used by our new [Home Assistant Intents](https://github.com/home-assistant/intents) project. The goal of this project is to collect home automation sentences in every possible language. Since it's start a month ago, we have had 112 people contribute. The project now supports [22 languages and 14 more are in progress](https://home-assistant.github.io/intents/).
+This new format is used by our new [Home Assistant Intents](https://github.com/home-assistant/intents) project. The goal of this project is to collect home automation sentences in every possible language. Since it's start a month ago, we have had 112 people contribute. The project now supports [22 languages and 14 more are in progress](https://ohf-voice.github.io/intents/).
## Assist
diff --git a/source/_posts/2023-02-01-release-20232.markdown b/source/_posts/2023-02-01-release-20232.markdown
index db5e7606d37..a3a0f58319c 100644
--- a/source/_posts/2023-02-01-release-20232.markdown
+++ b/source/_posts/2023-02-01-release-20232.markdown
@@ -77,7 +77,7 @@ Today we like you to meet:
allows you to use natural language to control Home Assistant. It is powered by
[Hassil](https://github.com/home-assistant/hassil) and the sentences
(contributed by 112! people) from the
-[Home Assistant Intents](https://home-assistant.github.io/intents/) project.
+[Home Assistant Intents](https://ohf-voice.github.io/intents/) project.
We believe technology is meant to be played with, and projects should be
usable as soon as possible. Together with the community, we can then iterate
diff --git a/source/_posts/2023-04-27-year-of-the-voice-chapter-2.markdown b/source/_posts/2023-04-27-year-of-the-voice-chapter-2.markdown
index bf39238eca8..db28363160f 100644
--- a/source/_posts/2023-04-27-year-of-the-voice-chapter-2.markdown
+++ b/source/_posts/2023-04-27-year-of-the-voice-chapter-2.markdown
@@ -25,7 +25,7 @@ _To watch the video presentation of this blog post, including live demos, check
[Year of the Voice]: https://www.home-assistant.io/blog/2022/12/20/year-of-voice/
[Chapter 1]: https://www.home-assistant.io/blog/2023/01/26/year-of-the-voice-chapter-1/
-[45 languages]: https://home-assistant.github.io/intents/
+[45 languages]: https://ohf-voice.github.io/intents/
[live-stream]: https://youtube.com/live/Tk-pnm7FY7c?feature=share
[assist]: /voice_control/
diff --git a/source/_posts/2023-07-20-year-of-the-voice-chapter-3.markdown b/source/_posts/2023-07-20-year-of-the-voice-chapter-3.markdown
index f8795a1fe89..cad73925c50 100644
--- a/source/_posts/2023-07-20-year-of-the-voice-chapter-3.markdown
+++ b/source/_posts/2023-07-20-year-of-the-voice-chapter-3.markdown
@@ -29,7 +29,7 @@ _To watch the video presentation of this blog post, including live demos, check
[Year of the Voice]: https://www.home-assistant.io/blog/2022/12/20/year-of-voice/
[Chapter 1]: https://www.home-assistant.io/blog/2023/01/26/year-of-the-voice-chapter-1/
[Chapter 2]: https://www.home-assistant.io/blog/2023/04/27/year-of-the-voice-chapter-2/
-[50 languages]: https://home-assistant.github.io/intents/
+[50 languages]: https://ohf-voice.github.io/intents/
[live-stream]: https://youtube.com/live/sXzItFksYFA?feature=share
[Assist]: /voice_control/
[ESPHome]: /voice_control/thirteen-usd-voice-remote/
diff --git a/source/_posts/2023-10-12-year-of-the-voice-chapter-4-wakewords.markdown b/source/_posts/2023-10-12-year-of-the-voice-chapter-4-wakewords.markdown
index 7eb244eb19b..58c259cd9f6 100644
--- a/source/_posts/2023-10-12-year-of-the-voice-chapter-4-wakewords.markdown
+++ b/source/_posts/2023-10-12-year-of-the-voice-chapter-4-wakewords.markdown
@@ -16,7 +16,7 @@ This year is Home Assistant’s [Year of the Voice](https://www.home-assistant.i
We’ve got great news: wake words are finally here! After 4 chapters, we now have the final building block for voice in Home Assistant.
-In [Chapter 1](https://www.home-assistant.io/blog/2023/01/26/year-of-the-voice-chapter-1/), we started with text commands such as “turn on the kitchen light” and “open garage door”. We now [support 56 languages](https://home-assistant.github.io/intents/) and have 188 contributors helping to translate common smart home commands for everyone.
+In [Chapter 1](https://www.home-assistant.io/blog/2023/01/26/year-of-the-voice-chapter-1/), we started with text commands such as “turn on the kitchen light” and “open garage door”. We now [support 56 languages](https://ohf-voice.github.io/intents/) and have 188 contributors helping to translate common smart home commands for everyone.
[Chapter 2](https://www.home-assistant.io/blog/2023/04/27/year-of-the-voice-chapter-2/) introduced audio for voice commands: both speech-to-text and text-to-speech. This included local options for maximum privacy as well as support for Home Assistant Cloud for incredible speed and language coverage. Lastly in [Chapter 3](https://www.home-assistant.io/blog/2023/07/20/year-of-the-voice-chapter-3/), we added the ability to set Home Assistant as your default assistant on Android phones and watches.
diff --git a/source/_posts/2024-12-04-release-202412.markdown b/source/_posts/2024-12-04-release-202412.markdown
index c2cba5d6a15..359409caa34 100644
--- a/source/_posts/2024-12-04-release-202412.markdown
+++ b/source/_posts/2024-12-04-release-202412.markdown
@@ -99,7 +99,7 @@ it is currently set up, but it will not apply it. You can then switch to the
actual scenery and snapshot it again once you are happy with the changes.
Additionally, if you prefer {% term YAML %}, you can edit scenes directly from
-the scene editor by selecting **“Edit in YAML”** from the three-dotted
+the scene editor by selecting **“Edit in YAML”** from the three-dotted
{% icon "mdi:dots-vertical" %} overflow menu in the top right corner.
[@karwosts]: https://github.com/karwosts
@@ -169,7 +169,7 @@ extremely hard to polish support for their language.
The number of contributions to our [intents repository] (where we store the
supported sentences) skyrocketed during the last month, which we all truly
appreciate. More and more languages are becoming usable or even complete!
-You can follow the progress [here](https://home-assistant.github.io/intents/).
+You can follow the progress [here](https://ohf-voice.github.io/intents/).
We won’t list them all, but rest assured, someone is likely working hard to
ensure your native language works seamlessly, so you can use it comfortably
@@ -230,7 +230,7 @@ We now have a total of 4 scaled tiers:
- **🏆 [Platinum](/docs/quality_scale/#-platinum)**:
The epitome of quality, supreme code quality, and optimal performance.
-We also have four additional (non-scaled) special tiers:
+We also have four additional (non-scaled) special tiers:
- **❓ [No score](/docs/quality_scale/#-no-score)**:
For integrations that are not yet scored against the new scale.
@@ -253,7 +253,7 @@ developer documentation].
[each integration documentation page]: /integrations/homewizard
[Integration Quality Scale page]: /docs/quality_scale/
-[extensively documented every rule and requirement for each tier in our developer documentation]: https://developers.home-assistant.io/docs/core/integration-quality-scale/#integration-quality-scale-rules
+[extensively documented every rule and requirement for each tier in our developer documentation]: https://developers.home-assistant.io/docs/core/integration-quality-scale/#integration-quality-scale-rules
## Integrations
@@ -264,16 +264,16 @@ and improvements to existing ones! You’re all awesome. 🥰
We welcome the following new integrations in this release:
-- **[Acaia]**, added by [@zweckj]
+- **[Acaia]**, added by [@zweckj]
Adds support for [Acaia coffee scales] to Home Assistant.
-- **[Music Assistant]**, added by [@jozefKruszynski]
+- **[Music Assistant]**, added by [@jozefKruszynski]
The integration for [Music Assistant](https://music-assistant.io/) is making
its way into Home Assistant! 🎉
-- **[NASweb]**, added by [@nasWebio]
+- **[NASweb]**, added by [@nasWebio]
Brings in support for the NASweb automation system to Home Assistant.
-- **[Nord Pool]**, added by [@gjohansson-ST]
+- **[Nord Pool]**, added by [@gjohansson-ST]
Pulls in latest energy prices from the Nord Pool energy market as sensors.
-- **[Sky Remote]**, added by [@dunnmj]
+- **[Sky Remote]**, added by [@dunnmj]
Control your [Sky] box using automations or from your Home Assistant
dashboards.
diff --git a/source/_posts/2024-12-19-voice-chapter-8-assist-in-the-home.markdown b/source/_posts/2024-12-19-voice-chapter-8-assist-in-the-home.markdown
index 7404e0d1d9e..21dc8018a2e 100644
--- a/source/_posts/2024-12-19-voice-chapter-8-assist-in-the-home.markdown
+++ b/source/_posts/2024-12-19-voice-chapter-8-assist-in-the-home.markdown
@@ -83,7 +83,7 @@ Assist can't understand spoken words and needs something to take that audio and
See if your language is supported with our checker.
-Assist aims to support more languages than other voice assistants, and this has been a massive undertaking for our community - We need more help. The first step for language support is getting the commands (intents) right, and we have [over 25 major languages](https://home-assistant.github.io/intents/) that are ready to use today. Our wake words are also getting better at understanding different accents thanks to our [Wake Word Collective tool](https://ohf-voice.github.io/wake-word-collective/).
+Assist aims to support more languages than other voice assistants, and this has been a massive undertaking for our community - We need more help. The first step for language support is getting the commands (intents) right, and we have [over 25 major languages](https://ohf-voice.github.io/intents/) that are ready to use today. Our wake words are also getting better at understanding different accents thanks to our [Wake Word Collective tool](https://ohf-voice.github.io/wake-word-collective/).
### Text-to-speech
diff --git a/source/_posts/2025-02-05-release-20252.markdown b/source/_posts/2025-02-05-release-20252.markdown
index 91e12fbec1e..3206f78a4c5 100644
--- a/source/_posts/2025-02-05-release-20252.markdown
+++ b/source/_posts/2025-02-05-release-20252.markdown
@@ -252,7 +252,7 @@ and did not make it this release)._
You can now broadcast messages to every other voice assistant in your home.
Try it by saying _"Broadcast it is time for dinner"_.
As always with new intents, support may vary
-[depending on your language](https://home-assistant.github.io/intents/),
+[depending on your language](https://ohf-voice.github.io/intents/),
but our language leaders are working hard on making sure it will be supported
soon in your language!
diff --git a/source/_posts/2025-06-11-release-20256.markdown b/source/_posts/2025-06-11-release-20256.markdown
new file mode 100644
index 00000000000..786fd21081a
--- /dev/null
+++ b/source/_posts/2025-06-11-release-20256.markdown
@@ -0,0 +1,448 @@
+---
+layout: post
+title: "2025.6: Getting picky about Bluetooth"
+description: "Great new Bluetooth connection graphs, all pickers have been revamped, sidebar management improvements, (un)group media players straight from your dashboards, and more!"
+date: 2025-06-11 00:00:00
+date_formatted: "June 11, 2025"
+author: Franck Nijhof
+author_twitter: frenck
+comments: true
+categories:
+ - Release-Notes
+ - Core
+og_image: /images/blog/2025-06/social.png
+---
+
+
+
+Home Assistant 2025.6! 🎉
+
+We are already half way through 2025, can you believe it? I personally can't, as it feels like we just started the year. Not just that, there are so many exciting things to still come this year, and I can't wait to share them with you!
+
+Anyway, the June release is here! A week later than usual, but it also means we had an extra week to polish and beta test this release. Like the [previous release](/blog/2025/05/07/release-20255/), this release is packed with quality-of-life improvements!
+
+Last release my favorite feature was the new entity picker; this release, we improved ALL other pickers! No surprise that this, again, makes it to my top favorite this release. Although the ability to group media players directly from the media player card is a close second. It is so nice to see how Home Assistant keeps getting better and better, and how our community keeps contributing to it. 😍
+
+If you are leveraging Bluetooth in your Home Assistant setup, you will also love the new Bluetooth connection graph that shows how your Bluetooth devices are connected, including Bluetooth proxies. Troubleshooting Bluetooth has become so much easier now!
+
+Enjoy the release!
+
+../Frenck
+
+_PS: We will pick up the regular release schedule again now, so expect the next release on the first Wednesday of July (July 2nd)._
+
+
+
+- [Improving all the "pickers"](#improving-all-the-pickers)
+- [Making sense of Bluetooth](#making-sense-of-bluetooth)
+- [Iterations of the experimental area dashboard](#iterations-of-the-experimental-area-dashboard)
+- [Deprecating installation methods and 32-bit architectures](#deprecating-installation-methods-and-32-bit-architectures)
+- [Integrations](#integrations)
+ - [New integrations](#new-integrations)
+ - [Noteworthy improvements to existing integrations](#noteworthy-improvements-to-existing-integrations)
+ - [Integration quality scale achievements](#integration-quality-scale-achievements)
+ - [Farewell to the following](#farewell-to-the-following)
+- [Other noteworthy changes](#other-noteworthy-changes)
+- [Sidebar improvements](#sidebar-improvements)
+- [Join/unjoin groups of media players](#joinunjoin-groups-of-media-players)
+- [Reset/restore entity IDs](#resetrestore-entity-ids)
+- [Patch releases](#patch-releases)
+ - [2025.6.1 - June 13](#202561---june-13)
+- [Need help? Join the community!](#need-help-join-the-community)
+- [Backward-incompatible changes](#backward-incompatible-changes)
+- [All changes](#all-changes)
+
+## Improving all the "pickers"
+
+Pickers are those dropdowns you use to select entities, devices, areas, and more. Pickers are *everywhere* in Home Assistant, being used in automations, scripts, and configuration options.
+
+Last release, we [introduced a new entity picker](/blog/2025/05/07/release-20255/#picking-entities), which was a big hit! This release takes things further by refining the search experience based on your feedback.
+
+Even better, that same improved search experience now comes to the area, category, floor, label, user, and device pickers too! They are consistent, fast, and easy to use, no matter what you're selecting.
+
+And the device picker? It now has a fresh look to match, complete with manufacturer logos and styling inspired by the entity picker.
+
+
+
+## Making sense of Bluetooth
+
+Home Assistant has powerful [Bluetooth capabilities], and with the use of something like [ESPHome Bluetooth proxies], you can extend your Bluetooth network to cover your entire home. This release brings some improvements to the Bluetooth integration that will help you understand your Bluetooth network better.
+
+The Bluetooth integration now provides a visualization that shows how your Bluetooth devices are connected to your Home Assistant instance, whether that's directly to your system or through a Bluetooth proxy.
+
+
+
+It not only shows the actively connected devices, but also the devices that are in range, but not yet known to Home Assistant. This is a great way to see what devices are around you and where they can be potentially connected.
+
+Oh! And now that the Bluetooth integration has a sleek new visualization, the [Zigbee integration], which already has a similar feature, has been given a visual update. This makes visualizations consistent across Home Assistant.
+
+[Bluetooth capabilities]: /integrations/bluetooth
+[ESPHome Bluetooth proxies]: https://esphome.io/projects/?type=bluetooth
+[Zigbee integration]: /integrations/zha
+
+## Iterations of the experimental area dashboard
+
+In the April release, we introduced a [new experimental Areas dashboard](/blog/2025/04/02/release-20254/#a-new-experimental-areas-dashboard), which automatically generates a ready-to-use dashboard based on the areas you’ve set up in your home. It uses sections and tile cards for a modern, clean, and intuitive look --- all built for you in a couple of clicks.
+
+As this is experimental, it is being continuously iterated on. This release brings some nice changes, based on your feedback, to subtly refine the experience.
+
+We added a new "Actions" section that includes scripts, automations, and scenes. We also added number entities (and number helpers), button entities (and button helpers), counters, and timer helpers to the "Others" section. This makes it easier to find and manage your automations and scenes in the context of your areas.
+
+Finally, we renamed the "Entertainment" section to "Media players". This makes it clearer that this section is specifically for your players, and may not include your DIY arcade machine 👾.
+
+
+
+## Deprecating installation methods and 32-bit architectures
+
+This release introduces important deprecation announcements, and though they only affect a small percentage of users, it is important that they understand the impacts. We've written [a detailed blog](/blog/2025/05/22/deprecating-core-and-supervised-installation-methods-and-32-bit-systems/) that explains the rationale, timeline, and tips on how to migrate --- which I highly suggest reading if you think you're affected.
+
+- **Installation Methods**: The **Core** and **Supervised** installation methods are now officially deprecated. These are advanced setups that are only used by a small portion of users, as they involve running Home Assistant in a Python environment or installing the Supervisor on top of your own operating system. Moving forward, we are focusing our support on the more streamlined and maintainable installation methods: **Home Assistant OS** and **Home Assistant Container**.
+
+- **32-bit Architectures**: Support for legacy 32-bit CPU architectures (**i386**, **armhf**, and **armv7**) is also being deprecated. These architectures are increasingly uncommon and pose challenges for maintaining compatibility and performance.
+
+To assist you during this transition, Home Assistant will now raise a **repair issue** after upgrading if your system is affected by these deprecations. This notification will appear in the repair dashboard, providing information about the deprecation along with guidance on how to migrate to a supported setup.
+
+It's important to note that while these methods and architectures are deprecated, they will continue to receive support for the next six months, until the release of Home Assistant 2025.12. You can continue to use them after this point, but we would highly recommend migrating. After this 6-month period, they will become unsupported, meaning they will no longer receive updates or official assistance.
+
+If you don't receive this repair message, you're not affected. However, you can double-check using [our guide](/blog/2025/05/22/deprecating-core-and-supervised-installation-methods-and-32-bit-systems/#what-does-deprecated-and-unsupported-mean) if you'd like. We also have specific information on what becoming deprecated and unsupported [means for your installation](/blog/2025/05/22/deprecating-core-and-supervised-installation-methods-and-32-bit-systems/#what-does-deprecated-and-unsupported-mean). Lastly, we have detailed information on [how best to migrate](/blog/2025/05/22/deprecating-core-and-supervised-installation-methods-and-32-bit-systems/#how-to-migrate) to a supported system.
+
+## Integrations
+
+Thanks to our community for keeping pace with the new {% term integrations %}
+and improvements to existing ones! You’re all awesome 🥰
+
+### New integrations
+
+We welcome the following new integrations in this release:
+
+- **[Alexa Devices]**, added by [@chemelli74]
+ Connect to and control your Amazon devices like Echo, Fire TV, and Alexa-enabled devices.
+- **[Immich]**, added by [@mib1185]
+ Integrates with [Immich App], a self-hosted photo and video backup solution that puts you in control of your personal media.
+- **[Paperless-ngx]**, added by [@fvgarrel]
+ Connect to your [Paperless-ngx system] to track and manage your digital documents from Home Assistant.
+- **[Probe Plus]**, added by [@pantherale0]
+ Integrate wireless Bluetooth meat thermometers compatible with the PROBE PLUS app, bringing real-time temperature monitoring during cooking into Home Assistant.
+- **[Zimi Cloud Connect]**, added by [@mhannon11]
+ Connect to [Zimi Cloud] devices to monitor and control your Zimi smart home products.
+
+[@chemelli74]: https://github.com/chemelli74
+[@fvgarrel]: https://github.com/fvgarrel
+[@mhannon11]: https://github.com/mhannon11
+[@mib1185]: https://github.com/mib1185
+[@pantherale0]: https://github.com/pantherale0
+[@starkillerOG]: https://github.com/starkillerOG
+[Alexa Devices]: /integrations/alexa_devices
+[Immich App]: https://immich.app/
+[Immich]: /integrations/immich
+[Paperless-ngx system]: https://docs.paperless-ngx.com/
+[Paperless-ngx]: /integrations/paperless_ngx
+[Probe Plus]: /integrations/probe_plus
+[Zimi Cloud Connect]: /integrations/zimi
+[Zimi Cloud]: https://www.zimi.com.au/
+
+This release also has new virtual integrations. Virtual integrations are stubs that are handled by other (existing) integrations to help with findability. These ones are new:
+
+- **[Kaiser Nienhaus]**, provided by [Motionblinds], added by [@starkillerOG]
+
+[@starkillerOG]: https://github.com/starkillerOG
+[Kaiser Nienhaus]: /integrations/kaiser_nienhaus
+[Motionblinds]: /integrations/motionblinds
+
+### Noteworthy improvements to existing integrations
+
+It is not just new {% term integrations %} that have been added; existing
+integrations are also being constantly improved. Here are some of the noteworthy
+changes to existing integrations:
+
+- [@bdraco] added support for updating [ESPHome] devices that are in deep sleep.
+ A very welcome improvement for battery-powered devices!
+- The [Homee] integration now supports fans and provides alarm control panels.
+ Thanks for expanding its capabilities, [@Taraman17]!
+- [Teslemetry] keeps getting better—[@Bre77] added a hazard lights binary sensor,
+ a valet mode switch, and a credit balance sensor. Nice!
+- [@bieniu] improved the [Shelly] integration to use sub-devices for multi-channel devices.
+ A notable change for complex setups!
+- The [SmartThings] integration saw a huge round of improvements by [@joostlek], including:
+ support for cooktops, hobs, water heaters, hood fan speeds, Steam closet modes,
+ freezer and cooler temperatures, washer spin and soil levels, valve positions,
+ heat pump zone climates, and atmospheric pressure. Amazing!
+- [Miele] keeps on shining with new features from [@astrandb], like vacuum support,
+ drying step sensors, washer-dryer program phases, and hob plate sensors.
+ [@generically-named] added energy and water forecasts too—very cool!
+- [@agorecki] added a Lux sensor to the [Airthings Cloud] integration—bright idea!
+- The [Squeezebox] integration now includes service update entities, thanks to [@pssc]!
+- [@tedvdb] added a status sensor to the [Whois] integration. Simple, but effective.
+- [@zerzhang] added support for [SwitchBot]
+ [vacuums](https://www.switch-bot.com/products/switchbot-robot-vacuum-k10-plus),
+ and new lock models: the [Lock Ultra](https://www.switch-bot.com/products/switchbot-lock-ultra)
+ and [Lock Lite](https://www.switch-bot.com/products/switchbot-lock-lite)!
+- [@danielvandenberg95] updated the [Sonos] integration to show playlists under favorites.
+ A great UX win!
+- The [Kostal Plenticore] integration now supports installer login.
+ Thanks for that improvement, [@Schlauer-Hax]!
+- [@Shulyaka] added support for [Anthropic] Claude 4. Welcome to the future!
+- And finally, [@chemelli74] added preset mode support to the [Comelit] climate integration.
+ Another nice quality-of-life addition!
+
+[@agorecki]: https://github.com/agorecki
+[@astrandb]: https://github.com/astrandb
+[@bdraco]: https://github.com/bdraco
+[@bieniu]: https://github.com/bieniu
+[@Bre77]: https://github.com/Bre77
+[@chemelli74]: https://github.com/chemelli74
+[@danielvandenberg95]: https://github.com/danielvandenberg95
+[@generically-named]: https://github.com/generically-named
+[@joostlek]: https://github.com/joostlek
+[@pssc]: https://github.com/pssc
+[@Schlauer-Hax]: https://github.com/Schlauer-Hax
+[@Shulyaka]: https://github.com/Shulyaka
+[@Taraman17]: https://github.com/Taraman17
+[@tedvdb]: https://github.com/tedvdb
+[@zerzhang]: https://github.com/zerzhang
+[Airthings Cloud]: /integrations/airthings
+[Anthropic]: /integrations/anthropic
+[Comelit]: /integrations/comelit
+[ESPHome]: /integrations/esphome
+[Homee]: /integrations/homee
+[Kostal Plenticore]: /integrations/kostal_plenticore
+[Miele]: /integrations/miele
+[Shelly]: /integrations/shelly
+[SmartThings]: /integrations/smartthings
+[Sonos]: /integrations/sonos
+[Squeezebox]: /integrations/squeezebox
+[SwitchBot]: /integrations/switchbot
+[Teslemetry]: /integrations/teslemetry
+[Whois]: /integrations/whois
+
+### Integration quality scale achievements
+
+One thing we are incredibly proud of in Home Assistant is our
+[integration quality scale]. This scale helps us and our contributors to ensure
+integrations are of high quality, maintainable, and provide the best possible
+user experience.
+
+This release, we celebrate several {% term integrations %} that have improved
+their quality scale:
+
+- **1 integration reached gold** 🥇
+ - [SwitchBot], thanks to [@zerzhang]
+
+- **1 integration reached silver** 🥈
+ - [Shelly], thanks to [@bieniu]
+
+This is a huge achievement for these integrations and their maintainers. The
+effort and dedication required to reach these quality levels is significant,
+as it involves extensive testing, documentation, error handling, and often
+complete rewrites of parts of the integration.
+
+A big thank you to all the contributors involved! 👏
+
+[integration quality scale]: https://www.home-assistant.io/docs/quality_scale/
+[@astrandb]: https://github.com/astrandb
+[@bieniu]: https://github.com/bieniu
+[@zerzhang]: https://github.com/zerzhang
+[Miele]: /integrations/miele
+[Shelly]: /integrations/shelly
+[SwitchBot]: /integrations/switchbot
+
+### Farewell to the following
+
+The following {% term integrations %} are also no longer available as
+of this release:
+
+- **RTSPtoWebRTC** has been removed as it has been replaced by the [go2rtc] integration.
+
+[go2rtc]: /integrations/go2rtc
+
+## Other noteworthy changes
+
+There are many more improvements in this release; here are some of the other noteworthy changes:
+
+- A small but neat one: [@balloob] made it so discoveries shown on an integration page are now sorted by title. Helpful!
+- The [Home Assistant Cloud] integration will now raise a repair issue when your subscription has expired, helping make sure you’re aware and not caught off guard. Nice one, [@ludeeus]!
+- More backup improvements! 🎉
+ - Home Assistant will now raise a repair issue if not all add-ons or folders were successfully backed up. Thanks, [@emontnemery]!
+ - [@agners] made it so that when an add-on is auto-updated, a backup is now correctly created as an "add-on"-backup. Great!
+ - A new automatic backup [event entity] has been added to track automatic backups made by the system. Great addition by [@mib1185]!
+- [@lboue] added support for the [Matter] pump device type. Another one
+ added to the list—awesome!
+- The Template integration got a big boost!
+ - [@Petro31] added modern-style YAML support for template fans, locks, alarm control panels, vacuums, and covers. So clean!
+ - You can now create **trigger-based template covers**. Yep, also by [@Petro31]!
+ - The `trigger_variables` option is now supported when using `for` in a trigger. A small but powerful feature. Thanks, [@Petro31]!
+ - New template filters! You can now use `from_hex`, and `base64_encode` now supports both bytes and strings. Handy additions from [@Petro31]!
+- New sensor capabilities:
+ - [@Passific] added a new device class and units for **reactive energy**. Nice!
+ - A new unit for **energy distance (Wh/km)** has been added. Thanks, [@frenck]!
+ - Sensors now support **mg/m³** as a concentration unit—another nice addition by [@frenck]!
+ - [@Arnie97] added support for **liters** as a unit for gas sensors. Much appreciated!
+- The new `recorder.get_statistics` action lets you query statistics directly
+ from the recorder. Powerful stuff, [@Hypfer]!
+
+[@agners]: https://github.com/agners
+[@Arnie97]: https://github.com/Arnie97
+[@balloob]: https://github.com/balloob
+[@emontnemery]: https://github.com/emontnemery
+[@frenck]: https://github.com/frenck
+[@Hypfer]: https://github.com/Hypfer
+[@lboue]: https://github.com/lboue
+[@ludeeus]: https://github.com/ludeeus
+[@mib1185]: https://github.com/mib1185
+[@Passific]: https://github.com/Passific
+[@Petro31]: https://github.com/Petro31
+[event entity]: /integrations/event
+[Home Assistant Cloud]: /integrations/cloud
+[Matter]: /integrations/matter
+[template entities]: /integrations/template/
+
+## Sidebar improvements
+
+If you didn't know yet, you can actually adjust the contents of your Home Assistant sidebar. You can change the order and show/hide items by pressing and holding the "Home Assistant" text at the top of the sidebar, or by going to your user profile page and selecting "Change the order and hide items from the sidebar".
+
+This release brings a couple of much-needed improvements to this feature. When you customize the sidebar, it will now bring up a nice and clean dialog that allows you to drag and drop items to change their order, or hide them by clicking the eye icon next to them.
+
+
+
+The biggest improvement is actually found somewhere else! Previously, the customization of the sidebar was only applied to the device you made the changes on; and even more annoying, sometimes it would lose the changes, or it would magically forget your settings on our [mobile companion apps] when you switched between your home network (and thus the internal URL). 🥲
+
+In this release, this annoyance has been fixed! The sidebar customization is now stored in your user profile, so your personalized layout follows you across all devices you use with Home Assistant!
+
+## Join/unjoin groups of media players
+
+Media players in Home Assistant can provide actions for media players to join or unjoin a group of media players. This is a great way to dynamically control your media players and the groups they are in. However, this feature was somewhat limited, as it could only be used as actions within things like automations or scripts.
+
+Now, [@AlexGustafsson] changed that! 🎉
+
+You can now use the media player card to join or unjoin groups of media players. This is a great way to control your media players and their groups directly from the UI.
+
+
+
+Please note that, you can only join or unjoin groups of media players that support this feature. Unfortunately, not all media players support this, so it might not be available for all your media players.
+
+Anyhow, amazing contribution Alex! 👏
+
+[@AlexGustafsson]: https://github.com/AlexGustafsson
+
+## Reset/restore entity IDs
+
+You can now restore the ID of an entity to its original value. This is useful if you have renamed an entity and want to revert it back to its original entity ID.
+
+This feature is available in the entity configuration dialog, where you can now find a "Reset" icon on the entity ID field. When clicked, it will restore the entity ID to its original value. Additionally, there is the option called "Recreate entity IDs" in the top right three-dotted menu on the device page, to reset all entity IDs of a device to their original values.
+
+
+
+## Patch releases
+
+We will also release patch releases for Home Assistant 2025.6 in June.
+These patch releases only contain bug fixes. Our goal is to release a patch
+release every Friday.
+
+### 2025.6.1 - June 13
+
+- Fix palette handling for LIFX Ceiling SKY effect ([@Djelibeybi] - [#146582])
+- Fix fan is_on status in xiaomi_miio ([@epenet] - [#146592])
+- Drop HostKeyAlgorithms in aruba ([@aethrvmn] - [#146619])
+- Update frontend to 20250531.3 ([@piitaya] - [#146638])
+- Fix cookies with aiohttp >= 3.12.7 for Vodafone Station ([@chemelli74] - [#146647])
+- Bump wakeonlan to 3.1.0 ([@epenet] - [#146655])
+- Bump hdate to 1.1.2 ([@tsvi] - [#146659])
+- Bump linkplay to v0.2.12 ([@silamon] - [#146669])
+- Filter speak notify entity for WHA devices in Alexa Devices ([@chemelli74] - [#146688])
+- Bump aioamazondevices to 3.1.2 ([@chemelli74] - [#146690])
+- Fix opower to work with aiohttp>=3.12.7 by disabling cookie quoting ([@tronikos] - [#146697])
+- Revert scan interval change in local calendar ([@allenporter] - [#146700])
+- Partial revert of update to remote calendar to fix issue where calendar does not update ([@allenporter] - [#146702])
+- Ignore lingering pycares shutdown thread ([@cdce8p] - [#146733])
+- Bump aiodns to 3.5.0 ([@bdraco] - [#146758])
+- Fix throttling issue in HomematicIP Cloud ([@hahn-th] - [#146683])
+
+[#145650]: https://github.com/home-assistant/core/pull/145650
+[#146582]: https://github.com/home-assistant/core/pull/146582
+[#146592]: https://github.com/home-assistant/core/pull/146592
+[#146619]: https://github.com/home-assistant/core/pull/146619
+[#146638]: https://github.com/home-assistant/core/pull/146638
+[#146647]: https://github.com/home-assistant/core/pull/146647
+[#146655]: https://github.com/home-assistant/core/pull/146655
+[#146659]: https://github.com/home-assistant/core/pull/146659
+[#146669]: https://github.com/home-assistant/core/pull/146669
+[#146683]: https://github.com/home-assistant/core/pull/146683
+[#146688]: https://github.com/home-assistant/core/pull/146688
+[#146690]: https://github.com/home-assistant/core/pull/146690
+[#146697]: https://github.com/home-assistant/core/pull/146697
+[#146700]: https://github.com/home-assistant/core/pull/146700
+[#146702]: https://github.com/home-assistant/core/pull/146702
+[#146733]: https://github.com/home-assistant/core/pull/146733
+[#146758]: https://github.com/home-assistant/core/pull/146758
+[@Djelibeybi]: https://github.com/Djelibeybi
+[@aethrvmn]: https://github.com/aethrvmn
+[@allenporter]: https://github.com/allenporter
+[@bdraco]: https://github.com/bdraco
+[@cdce8p]: https://github.com/cdce8p
+[@chemelli74]: https://github.com/chemelli74
+[@epenet]: https://github.com/epenet
+[@frenck]: https://github.com/frenck
+[@hahn-th]: https://github.com/hahn-th
+[@piitaya]: https://github.com/piitaya
+[@silamon]: https://github.com/silamon
+[@tronikos]: https://github.com/tronikos
+[@tsvi]: https://github.com/tsvi
+
+
+## Need help? Join the community!
+
+Home Assistant has a great community of users who are all more than willing
+to help each other out. So, join us!
+
+Our very active [Discord chat server](/join-chat) is an excellent place to be
+at, and don't forget to join our amazing [forums](https://community.home-assistant.io/).
+
+Found a bug or issue? Please report it in our [issue tracker](https://github.com/home-assistant/core/issues),
+to get it fixed! Or, check [our help page](/help) for guidance for more
+places you can go.
+
+Are you more into email? [Sign-up for our Building the Open Home Newsletter](/newsletter)
+to get the latest news about features, things happening in our community and
+other news about building an Open Home; straight into your inbox.
+
+## Backward-incompatible changes
+
+We do our best to avoid making changes to existing functionality that might
+unexpectedly impact your Home Assistant installation. Unfortunately, sometimes,
+it is inevitable.
+
+We always make sure to document these changes to make the transition as easy as
+possible for you. This release has the following backward-incompatible changes:
+
+{% details "Met Office" %}
+
+Met Office [deprecated the Datapoint API](https://www.metoffice.gov.uk/services/data/datapoint/datapoint-retirement-faqs) used by this integration, causing it to stop working. To address this, it is now migrated to [DataHub API](https://www.metoffice.gov.uk/services/data/met-office-weather-datahub).
+
+To keep using this integration, you will need to provide a new API key, which can be obtained by signing up for [DataHub](https://datahub.metoffice.gov.uk/) and subscribing to [Global spot dataset](https://datahub.metoffice.gov.uk/pricing/site-specific). The free subscription provides 360 calls per day, which is enough for this integration to work.
+
+Some sensors have changed due to the new data source:
+
+- Hourly forecast provided by the weather entity now has actual hourly entries as opposed to 3-hourly in the old version
+- Instead of `visibility` and `visibility_distance` sensors showing a range and qualitative description (such as "1-4 km" and "Poor"), the integration now exposes a single `visibility` sensor with precise visibility distance in meters
+- The integration no longer exposes "daily" and "3-hourly" sensors; there is a single set of them now
+- The integration sensors no longer expose `Site ID`, `Site name` and `Sensor ID` attributes as these don't provide any additional value
+
+([@avee87] - [#131425]) ([documentation](/integrations/metoffice))
+
+[@avee87]: https://github.com/avee87
+[#131425]: https://github.com/home-assistant/core/pull/131425
+
+{% enddetails %}
+
+If you are a custom integration developer and want to learn about changes and
+new features available for your integration: Be sure to follow our
+[developer blog][devblog]. The following changes are the most notable for this release:
+
+- [Icon translations now support ranges](https://developers.home-assistant.io/blog/2025/05/22/range-based-icons/)
+- [Sensor device classes now have default display precision](https://developers.home-assistant.io/blog/2025/05/26/sensor-default-display-precision/)
+
+[devblog]: https://developers.home-assistant.io/blog/
+
+## All changes
+
+Of course, there is a lot more in this release. You can find a list of all changes made here: [Full changelog for Home Assistant Core 2025.6](/changelogs/core-2025.6)
diff --git a/source/_redirects b/source/_redirects
index 7f336c2fc73..2d51e66bb6b 100644
--- a/source/_redirects
+++ b/source/_redirects
@@ -127,18 +127,22 @@ layout: null
/components/cover.group /integrations/cover.group
/components/cover.mqtt /integrations/cover.mqtt
/components/cover.mysensors /integrations/mysensors#cover
-/components/cover.template /integrations/cover.template
+/components/cover.template /integrations/template/#cover
+/integrations/cover.template /integrations/template/#cover
/components/device_tracker.mqtt /integrations/device_tracker.mqtt
/components/device_tracker.mysensors /integrations/mysensors#device-tracker
/components/fan.mqtt /integrations/fan.mqtt
-/components/fan.template /integrations/fan.template
+/components/fan.template /integrations/cover.template
+/integrations/fan.template /integrations/template/#fan
/components/light.group /integrations/light.group
/components/light.mqtt /integrations/light.mqtt
/components/light.mysensors /integrations/mysensors#light
/components/light.switch /integrations/light.switch
/components/light.template /integrations/light.template
+/integrations/light.template /integrations/template/#light
/components/lock.mqtt /integrations/lock.mqtt
/components/lock.template /integrations/lock.template
+/integrations/lock.template /integrations/template/#lock
/components/notify.command_line /integrations/notify.command_line
/components/notify.group /integrations/notify.group
/components/notify.mysensors /integrations/mysensors#notify
@@ -152,11 +156,13 @@ layout: null
/components/switch.mysensors /integrations/mysensors#switch
/components/switch.rest /integrations/switch.rest
/components/switch.template /integrations/switch.template
-/components/telegram_bot.broadcast /integrations/telegram_bot
-/components/telegram_bot.polling /integrations/telegram_bot
-/components/telegram_bot.webhooks /integrations/telegram_bot
+/integrations/switch.template /integrations/template/#switch
+/components/telegram_bot.broadcast /integrations/telegram_broadcast
+/components/telegram_bot.polling /integrations/telegram_polling
+/components/telegram_bot.webhooks /integrations/telegram_webhooks
/components/vacuum.mqtt /integrations/vacuum.mqtt
/components/vacuum.template /integrations/vacuum.template
+/integrations/vacuum.template /integrations/template/#vacuum
/integrations/binary_sensor.group /integrations/group
/integrations/binary_sensor.knx /integrations/knx#binary-sensor
/integrations/binary_sensor.modbus /integrations/modbus/#configuring-binary-sensor-entities
diff --git a/source/changelogs/core-2025.6.markdown b/source/changelogs/core-2025.6.markdown
new file mode 100644
index 00000000000..52d2850fae8
--- /dev/null
+++ b/source/changelogs/core-2025.6.markdown
@@ -0,0 +1,1547 @@
+---
+title: Full changelog for Home Assistant Core 2025.6
+description: Detailed changelog for the Home Assistant Core 2025.6 release
+replace_regex: \s\(\[?[a-z0-9\-\s_]+\]?\)$
+---
+
+These are all the changes included in the Home Assistant Core 2025.6 release.
+
+For a summary in a more readable format:
+[Release notes blog for this release](/blog/2025/06/11/release-20256/).
+
+## All changes
+
+- Bump version to 2025.6.0dev0 ([@frenck] - [#143983])
+- Matter Cooktop fixture ([@lboue] - [#143984])
+- Move huawei_lte sensor icons to icons.json where applicable ([@scop] - [#143999])
+- Remove deprecated action `api_call` from Habitica integration ([@tr4nt0r] - [#143978])
+- Remove unused client param at Home Connect diagnostics ([@Diegorro98] - [#144017])
+- Remove `_attr_should_poll` from Home Connect base entity ([@Diegorro98] - [#144016])
+- Remove default brightness values from Home Connect light entities ([@Diegorro98] - [#144019])
+- Remove translation key for battery level in Home Connect sensor ([@Diegorro98] - [#144020])
+- Use common percentage const at Home Connect ([@Diegorro98] - [#144021])
+- Remove non required Home Connect tests ([@Diegorro98] - [#144024])
+- Set `autouse` to `setup_credentials` Home Connect fixture ([@Diegorro98] - [#144028])
+- Listen for an event just once at Home Connect test ([@Diegorro98] - [#144031])
+- Sort Home Connect test params ([@Diegorro98] - [#144035])
+- Matter Laundry Dryer fixture ([@lboue] - [#144043])
+- Update miele program codes and strings ([@astrandb] - [#144049])
+- Matter Solar power fixture ([@lboue] - [#144058])
+- Remove deprecated binary sensor in Husqvarna Automower ([@Thomas55555] - [#144064])
+- Flag strict typing for miele ([@astrandb] - [#144060])
+- Set Shelly PARALLEL_UPDATES ([@thecode] - [#144070])
+- Move Home Connect entry state assertion at tests ([@Diegorro98] - [#144027])
+- Move SamsungTV test constants to fixture files ([@epenet] - [#144086])
+- Use `is` instead of `==` on check against enum value at Home Connect ([@Diegorro98] - [#144083])
+- Mark exception-translations done in Shelly ([@thecode] - [#144073])
+- Handle missing action exceptions in SamsungTV ([@chemelli74] - [#143630])
+- Avoid working out suggested id in entity_platform when already registered ([@bdraco] - [#144079])
+- Improve handling of missing miele program codes ([@astrandb] - [#144093])
+- Add DHCP discovery to Knocki ([@joostlek] - [#144048])
+- Fix fritz coordinator typing ([@cdce8p] - [#144146])
+- Fix litterrobot entity typing ([@cdce8p] - [#144147])
+- Improve select platform in Husqvarna Automower ([@Thomas55555] - [#144117])
+- Mark Shelly icon-translations as done ([@thecode] - [#144148])
+- Mark Shelly docs-data-update as done ([@thecode] - [#144151])
+- Add DHCP discovery to Home Connect ([@Diegorro98] - [#144095])
+- Improve supported color modes description ([@jbouwh] - [#144144])
+- Make the network device tracking feature optional in AVM Fritz!Tools ([@mib1185] - [#144149])
+- Pass requestor_uuid to bond API calls ([@bdraco] - [#144128])
+- Add support for updating ESPHome deep sleep devices ([@bdraco] - [#144161])
+- Fix spelling of "comma-separated (list)" in `fritzbox_callmonitor` ([@NoRi2909] - [#144191])
+- Fix spelling of "comma-separated" and "IP address" in `cast` ([@NoRi2909] - [#144188])
+- Fix spelling of "comma-separated (list)" in `huawei_lte` ([@NoRi2909] - [#144189])
+- Fix spelling of "comma-separated (list / event name)" in `doorbird` ([@NoRi2909] - [#144190])
+- Add hazard lights binary sensor to Teslemetry ([@Bre77] - [#144166])
+- Add better typing to Teslemetry switch platform ([@Bre77] - [#144168])
+- Improve typing of binary sensors in Teslemetry ([@Bre77] - [#144169])
+- Update models const in Teslemetry ([@Bre77] - [#144175])
+- Rename classes in Teslemetry ([@Bre77] - [#144179])
+- Fix spelling of "comma-separated (network addresses)" in `nmap_tracker` ([@NoRi2909] - [#144197])
+- Add Zimi Cloud Connect Integration ([@mhannon11] - [#129876])
+- Update `denonavr` to `1.1.0` ([@ol-iver] - [#144199])
+- Fix sentence-casing of "Phone number" in `peco` ([@NoRi2909] - [#144208])
+- Make spelling of "Auto-charge" switch consistent in TechnoVE ([@NoRi2909] - [#144206])
+- Remove unnecessary intermediate functions in `entry_data` for ESPHome ([@bdraco] - [#144173])
+- Improve the user-facing strings of `heos` ([@NoRi2909] - [#144218])
+- Fix sentence-casing in user-facing strings of `tami4` ([@NoRi2909] - [#144212])
+- Fix spelling of "sign in" and "setup" in `verisure` ([@NoRi2909] - [#144214])
+- Improve user-facing strings of `blink` ([@NoRi2909] - [#144219])
+- Replace "Sign-in …" with "Sign in …" in `ring` ([@NoRi2909] - [#144222])
+- Replace "log-in" with "log in" in `zwave_me` ([@NoRi2909] - [#144223])
+- Change roborock to use home_data_v3 ([@Lash-L] - [#144238])
+- Increase the local calendar update interval to avoid re-parsing the calendar state unnecessarily ([@allenporter] - [#144234])
+- Add valet switch to Teslemetry ([@Bre77] - [#144167])
+- Set api type more specifically in Teslemetry ([@Bre77] - [#144178])
+- Change some strings to international English in `fronius` ([@NoRi2909] - [#144244])
+- Remove unused huawei_lte YAML schemas, error out on YAML config ([@scop] - [#144217])
+- Add last attempted automatic backup sensor ([@mib1185] - [#144194])
+- Move more SamsungTV test constants to fixture files ([@epenet] - [#144249])
+- Bump nexia to 2.9.0 ([@jrhillery] - [#144153])
+- Bump github/codeql-action from 3.28.16 to 3.28.17 (@dependabot - [#144245])
+- Cleanup invalid CONF_ID from samsungtv tests ([@epenet] - [#144252])
+- Fix hassfest expecting strings file for custom components ([@mj23000] - [#135789])
+- Fix balboa mocks ([@emontnemery] - [#144264])
+- Fix deako mocks ([@emontnemery] - [#144265])
+- Fix imeon_inverter mocks ([@emontnemery] - [#144266])
+- Fix velbus mocks ([@emontnemery] - [#144267])
+- Fix palazzetti mocks ([@emontnemery] - [#144268])
+- Fix fibaro mocks ([@emontnemery] - [#144270])
+- Fix matter mocks ([@emontnemery] - [#144271])
+- Fail tests which JSON serialize mocks ([@emontnemery] - [#144261])
+- Change "recognized" to international English spelling in `hive` ([@NoRi2909] - [#144284])
+- Use international English spelling for "authorization" in `reolink` ([@NoRi2909] - [#144305])
+- Drop alias from local DOMAIN import ([@epenet] - [#144311])
+- Invert DOMAIN alias in telegram ([@epenet] - [#144313])
+- Add MQTT binary_sensor as entity platform on MQTT subentries ([@jbouwh] - [#144142])
+- Use runtime_data in geocaching ([@epenet] - [#144310])
+- Use runtime_data in gdacs ([@epenet] - [#144309])
+- Add async_delete_repair_issue method to CloudClient ([@ludeeus] - [#144302])
+- Allow liter for gas sensor device class ([@Arnie97] - [#141518])
+- Improve type hints in gc100 ([@epenet] - [#144308])
+- Remove ThingTalk server configuration and related websocket command from cloud integration ([@ludeeus] - [#144301])
+- Use runtime_data in geonetnz_quakes ([@epenet] - [#144319])
+- Use runtime_data in geonetnz_volcano ([@epenet] - [#144320])
+- Use runtime_data in gogogate2 ([@epenet] - [#144322])
+- Manage unsupported sources on Samsung TV ([@chemelli74] - [#144221])
+- Remove deprecated freebox reboot service ([@epenet] - [#144303])
+- Use runtime_data in freebox ([@epenet] - [#144326])
+- Drop alias from local const DOMAIN import ([@epenet] - [#144312])
+- Add MQTT button as entity platform on MQTT subentries ([@jbouwh] - [#144204])
+- Use runtime_data in google_assistant ([@epenet] - [#144332])
+- Move service definitions to separate module in guardian ([@epenet] - [#144306])
+- Use runtime_data in google_assistant_sdk ([@epenet] - [#144335])
+- Use config entry title to name SamsungTV entities ([@epenet] - [#144254])
+- Use runtime_data in goodwe ([@epenet] - [#144325])
+- Use runtime_data in guardian ([@epenet] - [#144344])
+- Use runtime_data in google ([@epenet] - [#144331])
+- Bump aioesphomeapi to 30.2.0 ([@bdraco] - [#144348])
+- Use runtime_data in here_travel_time ([@epenet] - [#144340])
+- Use config location for Homelink in Teslemetry ([@Bre77] - [#144171])
+- Bump nexia to 2.10.0 ([@jrhillery] - [#144363])
+- Add switch entity to Zimi integration ([@markhannon] - [#144236])
+- Remove entity name input from Samsung TV config flow ([@epenet] - [#144372])
+- Modify require_admin decorator to take parameters for Unauthorized ([@emontnemery] - [#144346])
+- Use runtime_data in hko ([@epenet] - [#144368])
+- Allow no_subscription repair issue in cloud ([@ludeeus] - [#144380])
+- Cleanup old config flow IMPORT constants in samsungtv tests ([@epenet] - [#144394])
+- Bump hass-nabucasa from 0.96.0 to 0.100.0 ([@ludeeus] - [#144341])
+- Add typing to smartthings climate target_temperature_low ([@wilbiev] - [#143713])
+- Improve SamsungTV ssdp test fixtures ([@epenet] - [#144376])
+- Do not duplicate model and model_id in SamsungTV device info ([@epenet] - [#144402])
+- Add discovery schema for Matter CumulativeEnergyExported ([@lboue] - [#144061])
+- Fix spelling in user-facing strings of `auth` component ([@NoRi2909] - [#144412])
+- Add missing hyphen to "eight-digit HomeKit pairing code" ([@NoRi2909] - [#144416])
+- Fix spelling of "HomeKit" and "Gateway" in `tradfri` ([@NoRi2909] - [#144420])
+- Add missing hyphen to "6-digit … codes" in `opower` ([@NoRi2909] - [#144417])
+- Fix user-facing strings in `totalconnect` ([@NoRi2909] - [#144411])
+- Add sensor for brew start time to lamarzocco ([@zweckj] - [#144423])
+- Fix sentence-casing in user-facing strings of `isy994` ([@NoRi2909] - [#144428])
+- Matter Mounted dimmable load control fixture ([@lboue] - [#144097])
+- Include runner arch in CI cache key ([@cdce8p] - [#144038])
+- Sentence-case "multi-factor authentication" in `sense` ([@NoRi2909] - [#144450])
+- Add missing hyphen to "two-factor authentication" in `nextcloud` ([@NoRi2909] - [#144448])
+- Add missing hyphen to "two-factor authentication" in `august` ([@NoRi2909] - [#144447])
+- Add missing hyphen to "two-factor authentication" in `subaru` ([@NoRi2909] - [#144446])
+- Add test coverage for inkbird IBS-P02B ([@bdraco] - [#144433])
+- Fix sentence-casing and missing hyphen in `electrasmart` ([@NoRi2909] - [#144443])
+- Include channel in Reolink device URL ([@starkillerOG] - [#144456])
+- Small fixes in user-facing strings of `nest` ([@NoRi2909] - [#144444])
+- Set Z-Wave platforms fixture in light tests ([@MartinHjelmare] - [#144473])
+- Set Z-Wave platforms fixture in helpers tests ([@MartinHjelmare] - [#144472])
+- Set Z-Wave platforms fixture in config flow tests ([@MartinHjelmare] - [#144470])
+- Remove RTSPtoWebRTC ([@edenhaus] - [#144328])
+- Fix capitalization and grammar in `simplefin` ([@NoRi2909] - [#144246])
+- Remove deprecated services in SABnzbd ([@joostlek] - [#144405])
+- Add cooktop operating state to SmartThings ([@joostlek] - [#144500])
+- Add hob support to SmartThings ([@joostlek] - [#144493])
+- Add miele devices dynamically ([@astrandb] - [#144216])
+- Add missing hyphen to "single-board computers" in `homekit` ([@NoRi2909] - [#144505])
+- Remove unused OpenWeatherMap const values ([@wittypluck] - [#144510])
+- Show warning message for Z-Wave devices in interview stage ([@MindFreeze] - [#144483])
+- Bump pynina to 0.3.6 ([@DeerMaximum] - [#144494])
+- Improve Husqvarna Automower tests ([@Thomas55555] - [#143113])
+- Cleanup unused CONF_IP_ADDRESS from SamsungTV tests ([@epenet] - [#144379])
+- Use runtime_data in hlk_sw16 ([@epenet] - [#144370])
+- Use runtime_data in hive ([@epenet] - [#144367])
+- Use async_release_notes in ESPHome update entity ([@jesserockz] - [#144440])
+- Jewish calendar entity translations ([@tsvi] - [#144414])
+- Fix voip test RuntimeWarning ([@cdce8p] - [#144519])
+- Update test fixture for Miele dishwasher ([@astrandb] - [#144537])
+- Bump actions/dependency-review-action from 4.6.0 to 4.7.0 (@dependabot - [#144532])
+- Catch and log unexpected backup ciphering errors ([@emontnemery] - [#144531])
+- Add backup tests showing that unknown files are not ciphered ([@emontnemery] - [#144529])
+- Use HassKey in hardware ([@epenet] - [#144337])
+- Add common translation section to Teslemetry ([@Bre77] - [#144361])
+- Move hardware initialisation to package module ([@epenet] - [#144540])
+- Add support to create KNX Cover entities from UI ([@farmio] - [#141944])
+- Bump PySwitchbot to 0.62.0 ([@zerzhang] - [#144527])
+- Matter refrigerator fixture ([@lboue] - [#144491])
+- Update knx-frontend to 2025.4.1.91934 - Enable UI to create KNX Cover entities ([@farmio] - [#141993])
+- Add drying step sensor for Miele tumble dryers ([@astrandb] - [#144515])
+- SMA add re-authentication flow ([@erwindouna] - [#144538])
+- Remove redundant coordinator reference in OpenWeatherMap sensor ([@wittypluck] - [#144548])
+- Add snapshot tests for OpenWeatherMap sensors ([@wittypluck] - [#139657])
+- Remove deprecated camera frontend_stream_type ([@edenhaus] - [#144539])
+- Add exception-translations for switchbot integration ([@zerzhang] - [#143444])
+- Add fan entity to Zimi integration ([@markhannon] - [#144327])
+- Exempt entity categories for Comelit ([@chemelli74] - [#142858])
+- Add left & right temp request entities to Teslemetry ([@Bre77] - [#144364])
+- Add vacuum platform to miele ([@astrandb] - [#143757])
+- Remove deprecated legacy WebRTC provider ([@edenhaus] - [#144547])
+- Remove deprecated async_forward_entry_setup function ([@edenhaus] - [#144560])
+- Remove deprecated core set_time_zone function ([@edenhaus] - [#144559])
+- Add Lux sensor to Airthings Cloud ([@agorecki] - [#141035])
+- Remove deprecated address argument in all lcn services ([@edenhaus] - [#144557])
+- Make all devolo Home Network conflig flow tests end correctly ([@Shutgun] - [#144378])
+- Add Squeezebox service update entities ([@pssc] - [#125764])
+- Deprecate Homee valve sensor ([@Taraman17] - [#139578])
+- Switch to PyEzvizApi ([@RenierM26] - [#135926])
+- Add control bus mode selector to Cambridge Audio ([@ichbinsteffen] - [#139131])
+- Skip check for entry updated by current flow in _async_abort_entries_match ([@alengwenus] - [#141003])
+- Replace custom actions for sleep timer with buttons in bluesound integration ([@LouisChrist] - [#133604])
+- Refactor Bring! integration to poll activity data at a slower interval ([@tr4nt0r] - [#142621])
+- Avoid split of unique id to build OpenWeatherMap sensors ([@wittypluck] - [#144546])
+- Add switch platform to bosch alarm ([@sanjay900] - [#142157])
+- Add status to whois ([@tedvdb] - [#141051])
+- Matter pump fixture ([@lboue] - [#144572])
+- Add water flowing status for YoLink water meter(YS5018). ([@matrixd2] - [#144535])
+- Use device and entity name for OpenWeather map entities ([@wittypluck] - [#144513])
+- Airthings DHCP discovery ([@LaStrada] - [#144280])
+- Add homee fan platform ([@Taraman17] - [#143524])
+- Fix sensor setup during dynamic addition of Miele devices ([@astrandb] - [#144551])
+- Fix sentence-casing in config fields of `aurora_abb_powerone` ([@NoRi2909] - [#144577])
+- Sentence-case names and remove "True/False" in `emulated_roku` setup ([@NoRi2909] - [#144579])
+- SMA add snapshots & tests ([@erwindouna] - [#144555])
+- Use strict typing for ConfigEntry on remove in NUT ([@tdfountain] - [#144588])
+- Add codeowner to Adax ([@LazyTarget] - [#144587])
+- Add switchbot vacuum support ([@zerzhang] - [#144550])
+- Matter Oven fixture ([@lboue] - [#144603])
+- Fix squeezebox test serializing mocks ([@emontnemery] - [#144600])
+- Delete deprecated program switches from Home Connect ([@Diegorro98] - [#144606])
+- Add Codeowner to OpenWeatherMap ([@wittypluck] - [#144605])
+- Fix licenses check for jaraco.itertools ([@cdce8p] - [#144631])
+- Update pylint to 3.3.7 + astroid to 3.3.10 ([@cdce8p] - [#144630])
+- Fix sentence-casing and spelling of "SIA-based" in `sia` ([@NoRi2909] - [#144659])
+- Fix typo in ntfy integration ([@tr4nt0r] - [#144650])
+- Add missing hyphen to "file-based" in `file` ([@NoRi2909] - [#144640])
+- Add missing hyphen to "time-based" in `filter` ([@NoRi2909] - [#144639])
+- Add missing hyphen to "time-based" in `integration` ([@NoRi2909] - [#144638])
+- Add missing hyphen to "time-weighted" in `derivative` ([@NoRi2909] - [#144637])
+- Add missing hyphen to "volume-weighted" in `kraken` ([@NoRi2909] - [#144636])
+- Improve user-facing strings of `plaato` ([@NoRi2909] - [#144633])
+- Fix grammar in description of `unifi.remove_clients` action ([@NoRi2909] - [#144632])
+- Add PARALLEL_UPDATES to Squeezebox ([@peteS-UK] - [#144618])
+- Fix typos in Miele device names to match enum ([@aturri] - [#144609])
+- Remove unused constant from entity_platform tests ([@emontnemery] - [#144601])
+- Add missing hyphens to "condition-based" and "pre-entry" in `bmw_connected_drive` ([@NoRi2909] - [#144685])
+- Take into account coordinator availability for SamsungTV ([@chemelli74] - [#144545])
+- Add missing hyphen to "WebSocket-based" in `mqtt` ([@NoRi2909] - [#144686])
+- Fix missing sentence-casing in `alarmdecoder` ([@NoRi2909] - [#144690])
+- Bump dependency pymiele to 0.5.1 ([@astrandb] - [#144688])
+- Add program phases for Miele washer-dryer ([@astrandb] - [#144664])
+- Override available property in button platform for Squeezebox ([@peteS-UK] - [#144693])
+- Move Assist Pipeline tests to right file ([@balloob] - [#144696])
+- Sort list items alphabetically in Bring integration ([@tr4nt0r] - [#144700])
+- Increase test coverage for ntfy integration ([@tr4nt0r] - [#144701])
+- Rename samsung legacy test fixtures and constants ([@epenet] - [#144715])
+- Improve SamsungTV test coverage ([@epenet] - [#144717])
+- Add target temp sensor to Miele washing machines ([@astrandb] - [#144507])
+- Rename samsung websocket test fixtures and constants ([@epenet] - [#144719])
+- Rename samsung encrypted websocket test fixtures and constants ([@epenet] - [#144726])
+- Refactor frontend user store ([@emontnemery] - [#144723])
+- Remove obsolete tests in SamsungTV ([@epenet] - [#144735])
+- Remove deprecated camera async_handle_web_rtc_offer function ([@edenhaus] - [#144561])
+- Improve user-facing strings of `velbus` ([@NoRi2909] - [#144716])
+- Deduplicate condition schemas ([@emontnemery] - [#144739])
+- Merge websocket test constants in samsungtv tests ([@epenet] - [#144741])
+- Make it possible to subscribe to frontend user store ([@emontnemery] - [#144724])
+- Add missing hyphen to "password-protected" in `Shelly` ([@NoRi2909] - [#144746])
+- Spelling fixes in user-facing strings of `fronius` ([@NoRi2909] - [#144744])
+- Add a test for Assist Pipeline streaming deltas to TTS ([@balloob] - [#144711])
+- Log instead of ValueError for missing cloud translation key ([@ludeeus] - [#144732])
+- Fix outdated help center URL in `plaato` ([@NoRi2909] - [#144748])
+- Improve config flow description in ntfy integration ([@tr4nt0r] - [#144581])
+- Simplify unique config_entry check for LCN ([@alengwenus] - [#135756])
+- Track if TTS entity supports streaming input ([@balloob] - [#144697])
+- Update xknx to 3.8.0 ([@farmio] - [#144753])
+- Allow subscription_expired repair issue in cloud ([@ludeeus] - [#144316])
+- Add MAC connection through DHCP discovery to Home Connect devices ([@Diegorro98] - [#144611])
+- Assert resulting data in devolo Home Network test_form_reauth ([@Shutgun] - [#144760])
+- Rework platform setup tests for devolo Home Network ([@Shutgun] - [#143114])
+- Update pipdeptree to 2.26.1 ([@frenck] - [#144775])
+- Set PARALLEL_UPDATES and update quality_scale for Miele integration ([@astrandb] - [#144770])
+- Bump aiodhcpwatcher to 1.2.0 ([@davidrapan] - [#144769])
+- Move sun conditions to the sun integration ([@emontnemery] - [#144742])
+- Link Shelly device entry with Shelly BT scanner entry ([@bieniu] - [#144626])
+- Add comments to samsungtv config flow tests ([@epenet] - [#144787])
+- Create stream on demand in Teslemetry ([@Bre77] - [#144777])
+- Update debugpy to v1.8.14 ([@frenck] - [#144755])
+- Remove obsolete compatibility code from SamsungTV ([@epenet] - [#144800])
+- Refactor config flow tests to improve result variable usage in Overkiz ([@iMicknl] - [#143374])
+- Add typing to wsdot ([@ucodery] - [#143117])
+- Do not abort on invalid host in SamsungTV user flow ([@epenet] - [#144794])
+- Improve SamsungTV config flow type hints ([@epenet] - [#144820])
+- Bump automower-ble to 0.2.1 ([@alistair23] - [#144817])
+- Update codeowner for switchbot Integration ([@zerzhang] - [#144829])
+- Bump dependency pymiele -> 0.5.2 ([@astrandb] - [#144758])
+- Add device registry snapshots to samsungtv tests ([@epenet] - [#144804])
+- Remove support for condition platforms defining only a CONDITION_SCHEMA ([@emontnemery] - [#144832])
+- Improve user-facing strings of `incomfort` ([@NoRi2909] - [#144844])
+- Add service response support to admin services ([@abmantis] - [#144837])
+- Bump aioesphomeapi to 31.0.0 ([@bdraco] - [#144778])
+- Jewish calendar - Fix Parasha values ([@tsvi] - [#144646])
+- Add config flow data descriptions to Squeezebox ([@peteS-UK] - [#144619])
+- Provide ability to select nexia RoomIQ sensors ([@jrhillery] - [#144278])
+- Adjust handling of SamsungTV misaligned MAC ([@epenet] - [#144810])
+- Make DHCP discovery aware of the network integration ([@davidrapan] - [#144767])
+- Change unknown to unknown_code for missing Miele codes to avoid confusion ([@astrandb] - [#144699])
+- Remove myself as code owner of sun component ([@Swamp-Ig] - [#144854])
+- Fix spelling of "IP address" in `plugwise` ([@NoRi2909] - [#144861])
+- Bump actions/dependency-review-action from 4.7.0 to 4.7.1 (@dependabot - [#144856])
+- Use HassKey in ps4 ([@epenet] - [#144868])
+- Finish cleaning up SamsungTV init tests ([@epenet] - [#144865])
+- Add parallel_updates to new updates platform for Squeezebox ([@peteS-UK] - [#144864])
+- Move ps4 services to separate module ([@epenet] - [#144870])
+- Show Sonos playlists under favorites ([@danielvandenberg95] - [#142357])
+- Bump influxdb-client to 1.48.0 ([@RobBie1221] - [#144845])
+- Add credit balance sensor to Teslemetry ([@Bre77] - [#144365])
+- Drop alias from local DOMAIN import ([@epenet] - [#144867])
+- Introduce recorder.get_statistics service ([@Hypfer] - [#142602])
+- Fix pandora.media_player to not sleep during event loop ([@ucodery] - [#141957])
+- Add plate sensors for Miele hobs ([@astrandb] - [#144400])
+- Add modbus light brightness and color temperature ([@DioSWolF] - [#139703])
+- Add Fronius current and voltage for up to 4 MPP trackers ([@farmio] - [#140120])
+- Add mac address to airgradient devices ([@edenhaus] - [#144876])
+- Add Kostal plenticore Installer login support ([@Schlauer-Hax] - [#133773])
+- Use runtime_data in gree ([@epenet] - [#144880])
+- Fix substitutions in strings.json in Miele integration ([@astrandb] - [#144881])
+- Use entry.async_on_unload in geofency ([@epenet] - [#144882])
+- Use HassKey in greeneye_monitor ([@epenet] - [#144878])
+- Fix pin strings in Teslemetry ([@Bre77] - [#144873])
+- Use entry.async_on_unload in gpslogger ([@epenet] - [#144883])
+- Use runtime_data in gpslogger ([@epenet] - [#144884])
+- Add flow detection to Rachio hose timer ([@brg468] - [#144075])
+- Refactor template optional configuration attributes ([@Petro31] - [#144887])
+- Use snapshot testing for APCUPSD integration ([@yuxincs] - [#130770])
+- Use runtime_data in rachio ([@epenet] - [#144896])
+- Positioning for LCN covers ([@alengwenus] - [#143588])
+- Fix "tunneling" spelling in KNX ([@farmio] - [#144895])
+- Handle unit conversion in lib for niko_home_control ([@VandeurenGlenn] - [#141837])
+- Fix snapshots in APC ([@joostlek] - [#144901])
+- Refactor DeviceAutomationTriggerProtocol ([@emontnemery] - [#144888])
+- Add fan for ventilator ([@LG-ThinQ-Integration] - [#142444])
+- Add support for identify buttons to WMS WebControl pro ([@mback2k] - [#143339])
+- Add buttons to Blue current integration ([@NickKoepr] - [#143964])
+- Add system LED brightness to eheimdigital ([@autinerd] - [#144915])
+- Add binary sensors to bosch_alarm ([@sanjay900] - [#142147])
+- Add sensor for alarm status in bosch_alarm ([@sanjay900] - [#142564])
+- Add media search and play intent ([@balloob] - [#144269])
+- Remove duplicated code in unit conversion util ([@abmantis] - [#144912])
+- Use runtime_data and HassKey in geofency ([@epenet] - [#144886])
+- Use runtime_data in homematicip_cloud ([@epenet] - [#144892])
+- Add another EHS SmartThings fixture ([@joostlek] - [#144920])
+- Translate raised exceptions for Squeezebox ([@peteS-UK] - [#144842])
+- Bump aioesphomeapi to 31.0.1 ([@bdraco] - [#144939])
+- Add modern style configuration for template fan ([@Petro31] - [#144751])
+- Emoncms remove useless var in tests ([@alexandrecuer] - [#144942])
+- Add sensor entity to Zimi integration ([@markhannon] - [#144329])
+- Add modern style template lock ([@Petro31] - [#144756])
+- Add modern configuration for template alarm control panel ([@Petro31] - [#144834])
+- Add reactive energy device class and units ([@Passific] - [#143941])
+- Use runtime_data in iotawatt ([@epenet] - [#144977])
+- Use runtime_data in ipma ([@epenet] - [#144972])
+- Use runtime_data in intellifire ([@epenet] - [#144979])
+- Add template vacuum modern style ([@Petro31] - [#144843])
+- Move iqvia coordinator to separate module ([@epenet] - [#144969])
+- Add water heater support to SmartThings ([@joostlek] - [#144927])
+- Use runtime_data in iqvia ([@epenet] - [#144984])
+- Fix wrong UNIT_CLASS for reactive energy converter ([@Passific] - [#144982])
+- Fix missing mock in hue v2 bridge tests ([@epenet] - [#144947])
+- Use runtime_data in isy994 ([@epenet] - [#144961])
+- Mark Reolink doorbell visitor sensor as always available ([@starkillerOG] - [#145002])
+- Bump codecov/codecov-action from 5.4.2 to 5.4.3 (@dependabot - [#145023])
+- Bump docker/build-push-action from 6.16.0 to 6.17.0 (@dependabot - [#145022])
+- Add DHCP discovery flow to bosch_alarm ([@sanjay900] - [#142250])
+- Initialize select _attr_current_option with None ([@autinerd] - [#145026])
+- Bump plugwise to v1.7.4 ([@bouwew] - [#145021])
+- Bump PySwitchbot to 0.62.2 ([@zerzhang] - [#145018])
+- Add lamp capability to SmartThings ([@joostlek] - [#144918])
+- Cleanup huisbaasje tests ([@epenet] - [#144954])
+- Deprecate DHW switch for SmartThings ([@joostlek] - [#145011])
+- Use generic in iaqualink entity ([@epenet] - [#144989])
+- Set parallel_updates for bosch_alarm ([@sanjay900] - [#145028])
+- Use runtime_data in iaqualink ([@epenet] - [#144988])
+- Update bosch_alarm door switch strings so they are more user friendly ([@sanjay900] - [#144607])
+- Move icloud services to separate module ([@epenet] - [#144980])
+- Use typed config entry in Habitica coordinator ([@epenet] - [#144956])
+- Move huisbaasje coordinator to separate module ([@epenet] - [#144955])
+- Fix non-DHW heat pump in SmartThings ([@joostlek] - [#145008])
+- Fix errors in strings in SmartThings ([@joostlek] - [#145030])
+- Small code optimization for Plugwise ([@bouwew] - [#145037])
+- Add hood fan speed capability to SmartThings ([@joostlek] - [#144919])
+- Use runtime_data in hue ([@epenet] - [#144946])
+- Sync SmartThings EHS fixture ([@joostlek] - [#145042])
+- Update Matter MicrowaveOven fixture ([@lboue] - [#145057])
+- Use runtime_data in hydrawise ([@epenet] - [#144950])
+- Use runtime_data in homeworks ([@epenet] - [#144944])
+- Deprecate SmartThings water heater sensors ([@joostlek] - [#145060])
+- Add additional explanation for Reolink password requirements ([@starkillerOG] - [#145000])
+- OpenAI prompt is optional ([@balloob] - [#145065])
+- Remove address parameter from services.yaml ([@alengwenus] - [#145052])
+- Add number entities for freezer setpoint in SmartThings ([@joostlek] - [#145069])
+- Bump pysuezV2 to 2.0.5 ([@jb101010-2] - [#145047])
+- Bump motionblinds to 0.6.27 ([@starkillerOG] - [#145094])
+- Refactor fan in vesync ([@cdnninja] - [#135744])
+- Ensure that OpenAI tool call deltas have a role ([@balloob] - [#145085])
+- Fix mapping from program_phase to vacuum_activity for Miele integration ([@astrandb] - [#145115])
+- Add Steam closet keep fresh mode to SmartThings ([@joostlek] - [#145107])
+- Add Steam closet auto cycle link to SmartThings ([@joostlek] - [#145111])
+- Add Steam closet sanitize to SmartThings ([@joostlek] - [#145110])
+- Bump cryptography to 45.0.1 and pyopenssl to 25.1.0 ([@bdraco] - [#145121])
+- Set the default upgrade icon for the MQTT device to the default icon for Home Assistant instead of the icon for the MQTT integration ([@XiaoXianNv-boot] - [#144295])
+- OpenAI Conversation split out chat log processing ([@balloob] - [#145129])
+- Bump zcc-helper to 3.5.2 ([@markhannon] - [#144926])
+- Bump google-maps-routing to 0.6.15 ([@bdraco] - [#145130])
+- Fix enum values for program phases by appliance type on Miele appliances ([@aturri] - [#144916])
+- Add Pterodactyl binary sensor tests ([@elmurato] - [#142401])
+- Add has_entity_name attribute to LCN entities ([@alengwenus] - [#145045])
+- Add select platform to eheimdigital ([@autinerd] - [#145031])
+- Add Homee alarm-control-panel platform ([@Taraman17] - [#140041])
+- Add YoLink new device types support 5009 & 5029 ([@matrixd2] - [#144323])
+- Remove deprecated aux heat from elkm1 ([@gjohansson-ST] - [#145148])
+- Add Immich integration ([@mib1185] - [#145125])
+- Update `denonavr` to `1.1.1` ([@ol-iver] - [#145155])
+- Remove deprecated aux heat from Nexia ([@gjohansson-ST] - [#145147])
+- Fix Nanoleaf light state propagation after change from home asisstant ([@tyriis] - [#144291])
+- Add energy/water forecast for Miele integration ([@generically-named] - [#144822])
+- Enable RFDEBUG on RFLink "Enable debug logging" ([@javicalle] - [#138571])
+- Add Kaiser Nienhaus virtual motionblinds integration ([@starkillerOG] - [#145096])
+- Remove deprecated aux heat from econet ([@gjohansson-ST] - [#145149])
+- Bump grpcio to 1.72.0 and protobuf to 6.30.2 ([@bdraco] - [#143633])
+- Sort and simplify DeletedDeviceEntry ([@emontnemery] - [#145171])
+- Cleanup unused string in samsungtv ([@epenet] - [#145174])
+- Jewish calendar: use const in action code ([@tsvi] - [#145007])
+- Bump github/codeql-action from 3.28.17 to 3.28.18 (@dependabot - [#145173])
+- Bump aioesphomeapi to 31.1.0 ([@bdraco] - [#145170])
+- Bump hass-nabucasa from 0.100.0 to 0.101.0 ([@ludeeus] - [#145172])
+- Add ability to mark type hints as compulsory on specific functions ([@epenet] - [#139730])
+- Fix test results parsing error ([@edenhaus] - [#145077])
+- Add athmospheric pressure capability to SmartThings ([@joostlek] - [#145103])
+- Use runtime_data in huisbaasje ([@epenet] - [#144953])
+- Use runtime_data in hvv_departures ([@epenet] - [#144951])
+- Use runtime_data in ialarm ([@epenet] - [#145178])
+- Use runtime_data in icloud ([@epenet] - [#145179])
+- Fix runtime_data in iqvia ([@epenet] - [#145181])
+- Add battery entity for LockV2 in yolink ([@matrixd2] - [#145169])
+- Improve device registry restore tests ([@emontnemery] - [#145186])
+- Mark type hint as compulsory for entity.available property ([@epenet] - [#145189])
+- Mark all _FUNCTION_MATCH as mandatory in pylint plugin ([@epenet] - [#145194])
+- Mark type hint as compulsory for entity.assumed_state property ([@epenet] - [#145187])
+- Remove deprecated aux heat from ephember ([@gjohansson-ST] - [#145152])
+- Minor cleanup for pipeline tts stream test ([@balloob] - [#145146])
+- Revert "Link Shelly device entry with Shelly BT scanner entry (#144626)" ([@bieniu] - [#145177])
+- Move downloader service to separate module ([@epenet] - [#145183])
+- Add lamp capability for hood component in SmartThings ([@joostlek] - [#145036])
+- Add diagnostics platform to Immich integration ([@mib1185] - [#145162])
+- [ci] Skip step if coverage is skipped ([@cdce8p] - [#145202])
+- Bump go2rtc-client to 0.1.3b0 ([@edenhaus] - [#145192])
+- Mark all _CLASS_MATCH as mandatory in pylint plugin ([@epenet] - [#145200])
+- update pyatmo to version 9.2.0 ([@wuede] - [#145203])
+- Fix pylance warning on SnapshotAssertion import ([@chemelli74] - [#145206])
+- Update quality_scale rules status for Comelit ([@chemelli74] - [#143592])
+- Sort and simplify DeletedRegistryEntry ([@emontnemery] - [#145207])
+- Prevent import from syrupy.SnapshotAssertion ([@epenet] - [#145208])
+- Add exception translation for switchbot device initialization ([@zerzhang] - [#144828])
+- Add cover entity to Zimi integration ([@markhannon] - [#144330])
+- Fix typo in Ecovacs get_supported_entities ([@edenhaus] - [#145215])
+- Add missing type hint in zestimate ([@epenet] - [#145218])
+- Add full test coverage for Comelit cover ([@chemelli74] - [#144761])
+- Remove pylance warnings for Comelit tests ([@chemelli74] - [#145199])
+- Add missing type hint in vlc ([@epenet] - [#145223])
+- Improve type hints in rtorrent ([@epenet] - [#145222])
+- Use _attr_native_value in repetier ([@epenet] - [#145219])
+- Use shorthand attributes in yandex transport sensor ([@epenet] - [#145225])
+- Improve entity registry restore test ([@emontnemery] - [#145220])
+- Add device reconfigure to Comelit config flow ([@chemelli74] - [#142866])
+- Finish reconfigure test for Vodafone Station ([@chemelli74] - [#145230])
+- Add trigger_variables to template trigger 'for' field ([@Petro31] - [#136672])
+- Add action exceptions to Comelit integration ([@chemelli74] - [#143581])
+- Split update method in pioneer media player ([@epenet] - [#145212])
+- Fix invalid type hints in netgear switch ([@epenet] - [#145226])
+- Add missing type hint in homematic ([@epenet] - [#145214])
+- Allow TTS streams to generate temporary media source IDs ([@balloob] - [#145080])
+- Add missing type hint in plex ([@epenet] - [#145217])
+- Add support_streaming to ConversationEntity ([@balloob] - [#144998])
+- Fix wording of "Estimated power production" sensors in `forecast_solar` ([@NoRi2909] - [#145201])
+- Jewish Calendar: Implement diagnostics ([@tsvi] - [#145180])
+- TTS to only use stream entity method when streaming request comes in ([@balloob] - [#145167])
+- Add missing Miele tumble dryer program codes ([@astrandb] - [#145236])
+- Jewish calendar - quality scale - fix missing translations ([@tsvi] - [#144410])
+- Jewish calendar: set parallel updates to 0 ([@tsvi] - [#144986])
+- Jewish Calendar - quality scale - use specific config flow ([@tsvi] - [#144408])
+- Only pass serializable data to media player intent ([@balloob] - [#145244])
+- Fix streaming window cover entity in Teslemetry ([@Bre77] - [#145012])
+- Updated code owners for the blue current integration. ([@NickKoepr] - [#144962])
+- Add media_source platform to Immich integration ([@mib1185] - [#145159])
+- Mark entity methods and properties as mandatory in pylint plugin ([@epenet] - [#145210])
+- Add new Probe Plus integration ([@pantherale0] - [#143424])
+- Improve type hints in xiaomi_aqara light turn_on ([@epenet] - [#145257])
+- Use shorthand attributes in raspyrfm ([@epenet] - [#145250])
+- Improve type hints in omnilogic ([@epenet] - [#145259])
+- Sort usb ports in Z-Wave flow so unknown devices are last ([@MindFreeze] - [#145211])
+- Use runtime_data in smarttub ([@epenet] - [#145279])
+- Improve type hints in blebox climate ([@epenet] - [#145282])
+- Use shorthand attributes in yi camera ([@epenet] - [#145276])
+- Bump aiontfy to 0.5.3 ([@tr4nt0r] - [#145263])
+- Use shorthand attributes in tfiac climate ([@epenet] - [#145289])
+- Drop useless unit conversion in smarttub ([@epenet] - [#145287])
+- Use shorthand attributes in melissa climate ([@epenet] - [#145286])
+- Use shorthand attributes in intesishome climate ([@epenet] - [#145285])
+- Use shorthand attributes in push camera ([@epenet] - [#145273])
+- Improve type hints in homematic climate ([@epenet] - [#145283])
+- Use shorthand attributes in touchline climate ([@epenet] - [#145292])
+- Use shorthand attributes in vivotek camera ([@epenet] - [#145275])
+- Use shorthand attributes in venstar climate ([@epenet] - [#145294])
+- Use shorthand attributes in xs1 climate ([@epenet] - [#145298])
+- Improve type hints in xs1 entities ([@epenet] - [#145299])
+- add date and time service to bosch_alarm ([@sanjay900] - [#142243])
+- Refactor set_temperature in venstar climate ([@epenet] - [#145297])
+- Use shorthand attributes in xiaomi_aqara ([@epenet] - [#145253])
+- Use shorthand attributes in rpi_camera camera ([@epenet] - [#145274])
+- Mark button methods and properties as mandatory in pylint plugin ([@epenet] - [#145269])
+- Fix typos in user-facing strings of `zha` ([@NoRi2909] - [#145305])
+- Mark alarm_control_panel methods and properties as mandatory in pylint plugin ([@epenet] - [#145270])
+- Mark calendar methods and properties as mandatory in pylint plugin ([@epenet] - [#145271])
+- Add class init type hint to xiaomi_aqara ([@epenet] - [#145255])
+- Tidy up service call for bosch_alarm ([@sanjay900] - [#145306])
+- Mark turn_on/turn_off/toggle as mandatory in pylint plugin ([@epenet] - [#145249])
+- Fix issues with bosch alarm dhcp discovery ([@sanjay900] - [#145034])
+- Bump teslemetry_stream to 0.7.9 in Teslemetry ([@Bre77] - [#145303])
+- Add Wh/km unit for energy distance ([@frenck] - [#145243])
+- Mark camera methods and properties as mandatory in pylint plugin ([@epenet] - [#145272])
+- Mark climate methods and properties as mandatory in pylint plugin ([@epenet] - [#145280])
+- Make spelling of "setpoint" consistent in `opentherm_gw` ([@NoRi2909] - [#145318])
+- Update binary sensor translations for bosch_alarm ([@sanjay900] - [#145315])
+- Use preferred spelling of "setpoint" in `smartthings` ([@NoRi2909] - [#145319])
+- Remove deprecated aux heat from Climate Entity component ([@gjohansson-ST] - [#145151])
+- Add solar charging options to Wallbox integration ([@jorisdrenth] - [#139286])
+- Create repair issue if not all add-ons or folders were backed up ([@emontnemery] - [#144999])
+- Add Albanian (Shqip) language ([@bramkragten] - [#145324])
+- Suez water: fetch historical data in statistics ([@jb101010-2] - [#131166])
+- Jewish calendar : icon translations ([@tsvi] - [#145329])
+- bump aioimmich to 0.6.0 ([@mib1185] - [#145334])
+- Jewish calendar: move value calculation to entity description (1/3) ([@tsvi] - [#144272])
+- bump aiokem to 0.5.11 ([@PeteRager] - [#145332])
+- Assist Pipeline stream TTS when supported and long response ([@balloob] - [#145264])
+- Add support for videos in Immich media source ([@mib1185] - [#145254])
+- Added support for shared spaces in Synology DSM (Photo Station) ([@lodesmets] - [#144044])
+- Add date sensors to Rehlko ([@PeteRager] - [#145314])
+- Add support for music library folder to Sonos ([@PeteRager] - [#139554])
+- Remove the old ZWave controller from the list of migration targets ([@MindFreeze] - [#145281])
+- Bump xiaomi-ble to 0.39.0 ([@Ernst79] - [#145348])
+- Add sensors to Wallbox ([@jorisdrenth] - [#145247])
+- Bump pyswitchbot to 0.64.1 ([@zerzhang] - [#145360])
+- Minor code deduplication in backup manager ([@emontnemery] - [#145366])
+- Add hub3 support for switchbot integration ([@zerzhang] - [#145371])
+- Update links to user docs: Connect-ZBT-1, Green, Yellow ([@c0ffeeca7] - [#145374])
+- Bump eheimdigital to 1.2.0 ([@autinerd] - [#145372])
+- Add lock ultra and lock lite for switchbot integration ([@zerzhang] - [#145373])
+- Improve comment explaining planned backup store version bump ([@emontnemery] - [#145368])
+- Recommended installation option for Z-Wave ([@MindFreeze] - [#145327])
+- Bump lcn-frontend to 0.2.5 ([@alengwenus] - [#144983])
+- Improve failing backup repair messages ([@emontnemery] - [#145388])
+- Prevent types-*/setuptools/wheel runtime requirements in dependencies ([@epenet] - [#145381])
+- Fix Z-Wave installation type string ([@MartinHjelmare] - [#145390])
+- Improve Z-Wave config flow test fixtures ([@MartinHjelmare] - [#145378])
+- Jewish Calendar: Make exception translatable ([@tsvi] - [#145376])
+- Enable B009 ([@joostlek] - [#144192])
+- Update bluetooth-auto-recovery to 1.5.2 ([@cdce8p] - [#145395])
+- Update inkbird-ble to 0.16.2 ([@cdce8p] - [#145396])
+- Update sensorpro-ble to 0.7.1 ([@cdce8p] - [#145397])
+- Update igloohome-api to 0.1.1 ([@cdce8p] - [#145401])
+- Add SmartThings capability for Washer spin level ([@joostlek] - [#145039])
+- Add power cool and power freeze to SmartThings ([@joostlek] - [#145102])
+- wsdot component adopts wsdot package ([@ucodery] - [#144914])
+- Reword sunset event exception ([@tsvi] - [#145400])
+- ZHA repairs: remove links to obsolete docs ([@c0ffeeca7] - [#145398])
+- Add SmartThings capability for Washer soil level ([@joostlek] - [#145041])
+- Add thermostat fixture to SmartThings ([@joostlek] - [#145407])
+- Update metoffice to use DataHub API ([@avee87] - [#131425])
+- Update exception handling for initialization for Squeezebox ([@peteS-UK] - [#144674])
+- Bump lektricowifi to 0.1 ([@Lektrico] - [#145393])
+- Mark cover methods and properties as mandatory in pylint plugin ([@epenet] - [#145308])
+- Mark fan methods and properties as mandatory in pylint plugin ([@epenet] - [#145311])
+- Mark LLMs that support streaming as such ([@balloob] - [#145405])
+- Mark geo_location methods and properties as mandatory in pylint plugin ([@epenet] - [#145313])
+- Bump habiticalib to v.0.4.0 ([@tr4nt0r] - [#145414])
+- Clean up AbstractTemplateEntity ([@Petro31] - [#145409])
+- Catch blocking version pinning in dependencies early ([@epenet] - [#145364])
+- Add CancelBoost for Matter Water heater ([@lboue] - [#145316])
+- Remove unneeded parenthesis in comparison for Sonos ([@PeteRager] - [#145413])
+- Centralise MockStreamReaderChunked helper ([@mib1185] - [#145404])
+- Add valve position capability to SmartThings ([@joostlek] - [#144923])
+- Add climate entity for heatpump zones in SmartThings ([@joostlek] - [#144991])
+- Add binary_sensor platform to Rehlko ([@PeteRager] - [#145391])
+- Improve type hints in doods ([@epenet] - [#145426])
+- Hotfix for incorrect bracket in messages for Squeezebox ([@peteS-UK] - [#145418])
+- Add new button to the Lektrico integration ([@Lektrico] - [#145420])
+- Improve type hints in microsoft_face_identify ([@epenet] - [#145419])
+- Improve type hints in dlib_face_detect ([@epenet] - [#145422])
+- Improve type hints in dlib_face_identify ([@epenet] - [#145423])
+- Move to explicit exports in test helpers ([@joostlek] - [#145392])
+- Improve Z-Wave config flow test typing ([@MartinHjelmare] - [#145438])
+- Improve type hints in microsoft_face ([@epenet] - [#145417])
+- Catch invalid settings error in geocaching ([@marc7s] - [#139944])
+- Improve type hints in tensorflow ([@epenet] - [#145433])
+- Improve type hints in qrcode ([@epenet] - [#145430])
+- Improve type hints in openalpr_cloud ([@epenet] - [#145429])
+- Improve type hints in seven_segments ([@epenet] - [#145431])
+- Add range support to icon translations ([@frenck] - [#145340])
+- Improve type hints in sighthound ([@epenet] - [#145432])
+- switchbot_cloud: Add Smart Lock door and calibration state ([@mrueg] - [#143695])
+- Improve type hints in microsoft_face_detect ([@epenet] - [#145421])
+- Add paperless integration ([@fvgarrel] - [#145239])
+- Quantum Gateway device tracker tests ([@tamwahba] - [#145161])
+- Add webhook in switchbot cloud integration ([@Gigatrappeur] - [#132882])
+- Mark image_processing methods and properties as mandatory in pylint plugin ([@epenet] - [#145435])
+- Add Matter test to select attribute ([@joostlek] - [#145440])
+- Add matter attributes ([@jvmahon] - [#140843])
+- Matter Device Energy Management cluster ESAState attribute ([@lboue] - [#144430])
+- Don't add dynamically Home Connect event sensors and disable them by default ([@Diegorro98] - [#144757])
+- Add SMLIGHT button entities for second radio ([@tl-sl] - [#141463])
+- HomeKit Bridge integration: Adding `h264_qsv` as valid VIDEO_CODEC option ([@dalanmiller] - [#145448])
+- Add AbstractTemplateFan class in preparation for trigger based entity ([@Petro31] - [#144968])
+- Add AbstractTemplateLock to prepare for trigger based template locks ([@Petro31] - [#144978])
+- Add AbstractTemplate cover to prepare for trigger based template covers ([@Petro31] - [#144907])
+- Add AbstractTempleAlarmControlPanel class to prepare for trigger based template alarm control panels ([@Petro31] - [#144974])
+- Add AbstractTemplateVacuum to prepare for trigger based template vacuums ([@Petro31] - [#144990])
+- Add HomeKit thermostat fan state mapping for preheating, defrosting ([@jz-v] - [#145353])
+- Mark device_tracker methods and properties as mandatory in pylint plugin ([@epenet] - [#145309])
+- Add configuration url to Immich device info ([@mib1185] - [#145456])
+- Fix typo in reauth_confirm description of `metoffice` ([@NoRi2909] - [#145458])
+- Add default sensor data for Tesla Wall Connector tests ([@abmantis] - [#145462])
+- Replace empty mock in GoalZero tests ([@abmantis] - [#145463])
+- Make Powerwall energy sensors TOTAL_INCREASING to fix hardware swaps ([@exciton] - [#145165])
+- Add pending damage and pending quest items sensors ([@tr4nt0r] - [#145449])
+- Add pytest/codecov to forbidden runtime dependencies ([@epenet] - [#145447])
+- Prefer to create backups in local storage if selected ([@emontnemery] - [#145331])
+- Add paperless-ngx to strict typing ([@joostlek] - [#145466])
+- Add diagnostics to Paperless-ngx ([@joostlek] - [#145465])
+- Add support for Tuya Wireless Switch entity ([@lanthaler] - [#123284])
+- Improve mqtt subentry selector validation and remove redundant validators ([@jbouwh] - [#145499])
+- Add MQTT cover as entity platform on MQTT subentries ([@jbouwh] - [#144381])
+- Bump aiohttp to 3.12.0b3 ([@bdraco] - [#145358])
+- Bump Anthropic library to 0.52.0 ([@Shulyaka] - [#145494])
+- Improve type hints in xiaomi_miio humidifier ([@epenet] - [#145506])
+- Add concentration conversion support for mg/m³ ([@frenck] - [#145325])
+- Mark light methods and properties as mandatory in pylint plugin ([@epenet] - [#145510])
+- Don't manipulate hvac modes based on device active mode in AVM Fritz!SmartHome ([@mib1185] - [#145513])
+- Mark humidifier methods and properties as mandatory in pylint plugin ([@epenet] - [#145507])
+- Add Anthropic Claude 4 support ([@Shulyaka] - [#145505])
+- Add trigger based template cover ([@Petro31] - [#145455])
+- Add automatic backup event entity to Home Assistant Backup system ([@mib1185] - [#145350])
+- Use runtime_data in xiaomi_miio ([@epenet] - [#145517])
+- Support readonly selectors in config_flows ([@karwosts] - [#129456])
+- Bump py-sucks to 0.9.11 ([@mib1185] - [#145518])
+- Add Matter Pump device type ([@lboue] - [#145335])
+- Add MQTT fan as entity platform on MQTT subentries ([@jbouwh] - [#144698])
+- Remove repoze.lru from license exceptions ([@epenet] - [#145519])
+- Add read_only selectors to Statistics Options Flow ([@karwosts] - [#145522])
+- Use _handle_coordinator_update() instead of own callback in Feedreader event entity ([@mib1185] - [#145520])
+- Remove inactive codeowner from template integration ([@Petro31] - [#145535])
+- Bump aiohttp to 3.12.0rc0 ([@bdraco] - [#145540])
+- Bump incomfort-client to v0.6.9 ([@jbouwh] - [#145546])
+- Simplify ZBT-1 setup string ([@abmantis] - [#145532])
+- Bump androidtvremote2 to 0.2.2 ([@tronikos] - [#145542])
+- Add data descriptions in the Android TV Remote Configure Android apps ([@tronikos] - [#145537])
+- Fix translation strings for MQTT subentries ([@jbouwh] - [#145529])
+- Bump python-linkplay to v0.2.8 ([@silamon] - [#145550])
+- Bump aiohttp to 3.12.0rc1 ([@bdraco] - [#145562])
+- Add preset mode to Comelit climate ([@chemelli74] - [#145195])
+- Bump pylamarzocco to 2.0.5 ([@zweckj] - [#145560])
+- Bump aiokem to 0.5.12 ([@PeteRager] - [#145565])
+- Bump aiohttp to 3.12.0 ([@bdraco] - [#145570])
+- Remove global registry reference in coordinator for UptimeRobot ([@chemelli74] - [#142938])
+- Bump opower to 0.12.2 ([@tronikos] - [#145573])
+- Add SmartThings freezer and cooler temperatures ([@joostlek] - [#145468])
+- Safe get for backflush status in lamarzocco ([@zweckj] - [#145559])
+- Add reauth and reconfigure to paperless ([@fvgarrel] - [#145469])
+- Fix aiohttp MockPayloadWriter ([@cdce8p] - [#145579])
+- Add `returned energy` sensor for Shelly RPC switch component ([@bieniu] - [#145490])
+- New integration Amazon Devices ([@chemelli74] - [#144422])
+- Add DHCP discovery to Amazon Devices ([@joostlek] - [#145587])
+- Change cooler name to fridge in SmartThings ([@joostlek] - [#145590])
+- Bump uiprotect to version 7.9.2 ([@RaHehl] - [#145583])
+- Pipeline to stream TTS on tool call ([@balloob] - [#145477])
+- Bump uiprotect to version 7.10.0 ([@RaHehl] - [#145596])
+- Bump pylamarzocco to 2.0.6 ([@zweckj] - [#145595])
+- Enable message Streaming in the Gemini integration. ([@IvanLH] - [#144937])
+- Bump ZHA to 0.0.59 ([@TheJulianJES] - [#145597])
+- Add issue trackers to requirements script exceptions ([@epenet] - [#145608])
+- Use sub-devices for Shelly multi-channel devices ([@bieniu] - [#144100])
+- Add more mac-addresses for Amazon Devices autodiscovery ([@chemelli74] - [#145598])
+- Improve Bluetooth binary_sensor for Amazon Devices ([@chemelli74] - [#145600])
+- Add payload ON and OFF options to MQTT switch subentry component ([@jbouwh] - [#144627])
+- Disable last cleaning sensor for gs3mp model in lamarzocco ([@zweckj] - [#145576])
+- Fix reference to "tilt command topic" in MQTT translation strings ([@jbouwh] - [#145563])
+- Bump aiolifx to 1.1.5 to improve the identification of LIFX Luna ([@Djelibeybi] - [#145416])
+- Mark Shelly quality as silver ([@bieniu] - [#145610])
+- Fulfilled quality rules - gold and platinum tiers for Miele integration ([@astrandb] - [#144773])
+- Add from_hex filter ([@Petro31] - [#145229])
+- Improve type hints in XiaomiGatewayDevice derived entities ([@epenet] - [#145605])
+- Allow base64_encode to support bytes and strings ([@Petro31] - [#145227])
+- Download backup if restore fails in Z-Wave migration ([@MindFreeze] - [#145434])
+- Add Homee event platform ([@Taraman17] - [#145569])
+- Empty response returns empty list in Nord Pool ([@gjohansson-ST] - [#145514])
+
+## Release 2025.6.1 - June 13
+
+- Fix palette handling for LIFX Ceiling SKY effect ([@Djelibeybi] - [#146582])
+- Fix fan is_on status in xiaomi_miio ([@epenet] - [#146592])
+- Drop HostKeyAlgorithms in aruba ([@aethrvmn] - [#146619])
+- Update frontend to 20250531.3 ([@piitaya] - [#146638])
+- Fix cookies with aiohttp >= 3.12.7 for Vodafone Station ([@chemelli74] - [#146647])
+- Bump wakeonlan to 3.1.0 ([@epenet] - [#146655])
+- Bump hdate to 1.1.2 ([@tsvi] - [#146659])
+- Bump linkplay to v0.2.12 ([@silamon] - [#146669])
+- Filter speak notify entity for WHA devices in Alexa Devices ([@chemelli74] - [#146688])
+- Bump aioamazondevices to 3.1.2 ([@chemelli74] - [#146690])
+- Fix opower to work with aiohttp>=3.12.7 by disabling cookie quoting ([@tronikos] - [#146697])
+- Revert scan interval change in local calendar ([@allenporter] - [#146700])
+- Partial revert of update to remote calendar to fix issue where calendar does not update ([@allenporter] - [#146702])
+- Ignore lingering pycares shutdown thread ([@cdce8p] - [#146733])
+- Bump aiodns to 3.5.0 ([@bdraco] - [#146758])
+- Fix throttling issue in HomematicIP Cloud ([@hahn-th] - [#146683])
+
+[#145650]: https://github.com/home-assistant/core/pull/145650
+[#146582]: https://github.com/home-assistant/core/pull/146582
+[#146592]: https://github.com/home-assistant/core/pull/146592
+[#146619]: https://github.com/home-assistant/core/pull/146619
+[#146638]: https://github.com/home-assistant/core/pull/146638
+[#146647]: https://github.com/home-assistant/core/pull/146647
+[#146655]: https://github.com/home-assistant/core/pull/146655
+[#146659]: https://github.com/home-assistant/core/pull/146659
+[#146669]: https://github.com/home-assistant/core/pull/146669
+[#146683]: https://github.com/home-assistant/core/pull/146683
+[#146688]: https://github.com/home-assistant/core/pull/146688
+[#146690]: https://github.com/home-assistant/core/pull/146690
+[#146697]: https://github.com/home-assistant/core/pull/146697
+[#146700]: https://github.com/home-assistant/core/pull/146700
+[#146702]: https://github.com/home-assistant/core/pull/146702
+[#146733]: https://github.com/home-assistant/core/pull/146733
+[#146758]: https://github.com/home-assistant/core/pull/146758
+[@Djelibeybi]: https://github.com/Djelibeybi
+[@aethrvmn]: https://github.com/aethrvmn
+[@allenporter]: https://github.com/allenporter
+[@bdraco]: https://github.com/bdraco
+[@cdce8p]: https://github.com/cdce8p
+[@chemelli74]: https://github.com/chemelli74
+[@epenet]: https://github.com/epenet
+[@frenck]: https://github.com/frenck
+[@hahn-th]: https://github.com/hahn-th
+[@piitaya]: https://github.com/piitaya
+[@silamon]: https://github.com/silamon
+[@tronikos]: https://github.com/tronikos
+[@tsvi]: https://github.com/tsvi
+
+[#123284]: https://github.com/home-assistant/core/pull/123284
+[#125764]: https://github.com/home-assistant/core/pull/125764
+[#129456]: https://github.com/home-assistant/core/pull/129456
+[#129876]: https://github.com/home-assistant/core/pull/129876
+[#130770]: https://github.com/home-assistant/core/pull/130770
+[#131166]: https://github.com/home-assistant/core/pull/131166
+[#131425]: https://github.com/home-assistant/core/pull/131425
+[#132882]: https://github.com/home-assistant/core/pull/132882
+[#133604]: https://github.com/home-assistant/core/pull/133604
+[#133773]: https://github.com/home-assistant/core/pull/133773
+[#135744]: https://github.com/home-assistant/core/pull/135744
+[#135756]: https://github.com/home-assistant/core/pull/135756
+[#135789]: https://github.com/home-assistant/core/pull/135789
+[#135926]: https://github.com/home-assistant/core/pull/135926
+[#136672]: https://github.com/home-assistant/core/pull/136672
+[#138571]: https://github.com/home-assistant/core/pull/138571
+[#139131]: https://github.com/home-assistant/core/pull/139131
+[#139286]: https://github.com/home-assistant/core/pull/139286
+[#139554]: https://github.com/home-assistant/core/pull/139554
+[#139578]: https://github.com/home-assistant/core/pull/139578
+[#139657]: https://github.com/home-assistant/core/pull/139657
+[#139703]: https://github.com/home-assistant/core/pull/139703
+[#139730]: https://github.com/home-assistant/core/pull/139730
+[#139944]: https://github.com/home-assistant/core/pull/139944
+[#140041]: https://github.com/home-assistant/core/pull/140041
+[#140120]: https://github.com/home-assistant/core/pull/140120
+[#140843]: https://github.com/home-assistant/core/pull/140843
+[#141003]: https://github.com/home-assistant/core/pull/141003
+[#141035]: https://github.com/home-assistant/core/pull/141035
+[#141051]: https://github.com/home-assistant/core/pull/141051
+[#141463]: https://github.com/home-assistant/core/pull/141463
+[#141518]: https://github.com/home-assistant/core/pull/141518
+[#141837]: https://github.com/home-assistant/core/pull/141837
+[#141944]: https://github.com/home-assistant/core/pull/141944
+[#141957]: https://github.com/home-assistant/core/pull/141957
+[#141993]: https://github.com/home-assistant/core/pull/141993
+[#142147]: https://github.com/home-assistant/core/pull/142147
+[#142157]: https://github.com/home-assistant/core/pull/142157
+[#142243]: https://github.com/home-assistant/core/pull/142243
+[#142250]: https://github.com/home-assistant/core/pull/142250
+[#142357]: https://github.com/home-assistant/core/pull/142357
+[#142401]: https://github.com/home-assistant/core/pull/142401
+[#142444]: https://github.com/home-assistant/core/pull/142444
+[#142564]: https://github.com/home-assistant/core/pull/142564
+[#142602]: https://github.com/home-assistant/core/pull/142602
+[#142621]: https://github.com/home-assistant/core/pull/142621
+[#142858]: https://github.com/home-assistant/core/pull/142858
+[#142866]: https://github.com/home-assistant/core/pull/142866
+[#142938]: https://github.com/home-assistant/core/pull/142938
+[#143113]: https://github.com/home-assistant/core/pull/143113
+[#143114]: https://github.com/home-assistant/core/pull/143114
+[#143117]: https://github.com/home-assistant/core/pull/143117
+[#143339]: https://github.com/home-assistant/core/pull/143339
+[#143374]: https://github.com/home-assistant/core/pull/143374
+[#143424]: https://github.com/home-assistant/core/pull/143424
+[#143444]: https://github.com/home-assistant/core/pull/143444
+[#143524]: https://github.com/home-assistant/core/pull/143524
+[#143581]: https://github.com/home-assistant/core/pull/143581
+[#143588]: https://github.com/home-assistant/core/pull/143588
+[#143592]: https://github.com/home-assistant/core/pull/143592
+[#143630]: https://github.com/home-assistant/core/pull/143630
+[#143633]: https://github.com/home-assistant/core/pull/143633
+[#143695]: https://github.com/home-assistant/core/pull/143695
+[#143713]: https://github.com/home-assistant/core/pull/143713
+[#143757]: https://github.com/home-assistant/core/pull/143757
+[#143941]: https://github.com/home-assistant/core/pull/143941
+[#143964]: https://github.com/home-assistant/core/pull/143964
+[#143978]: https://github.com/home-assistant/core/pull/143978
+[#143983]: https://github.com/home-assistant/core/pull/143983
+[#143984]: https://github.com/home-assistant/core/pull/143984
+[#143999]: https://github.com/home-assistant/core/pull/143999
+[#144016]: https://github.com/home-assistant/core/pull/144016
+[#144017]: https://github.com/home-assistant/core/pull/144017
+[#144019]: https://github.com/home-assistant/core/pull/144019
+[#144020]: https://github.com/home-assistant/core/pull/144020
+[#144021]: https://github.com/home-assistant/core/pull/144021
+[#144024]: https://github.com/home-assistant/core/pull/144024
+[#144027]: https://github.com/home-assistant/core/pull/144027
+[#144028]: https://github.com/home-assistant/core/pull/144028
+[#144031]: https://github.com/home-assistant/core/pull/144031
+[#144035]: https://github.com/home-assistant/core/pull/144035
+[#144038]: https://github.com/home-assistant/core/pull/144038
+[#144043]: https://github.com/home-assistant/core/pull/144043
+[#144044]: https://github.com/home-assistant/core/pull/144044
+[#144048]: https://github.com/home-assistant/core/pull/144048
+[#144049]: https://github.com/home-assistant/core/pull/144049
+[#144058]: https://github.com/home-assistant/core/pull/144058
+[#144060]: https://github.com/home-assistant/core/pull/144060
+[#144061]: https://github.com/home-assistant/core/pull/144061
+[#144064]: https://github.com/home-assistant/core/pull/144064
+[#144070]: https://github.com/home-assistant/core/pull/144070
+[#144073]: https://github.com/home-assistant/core/pull/144073
+[#144075]: https://github.com/home-assistant/core/pull/144075
+[#144079]: https://github.com/home-assistant/core/pull/144079
+[#144083]: https://github.com/home-assistant/core/pull/144083
+[#144086]: https://github.com/home-assistant/core/pull/144086
+[#144093]: https://github.com/home-assistant/core/pull/144093
+[#144095]: https://github.com/home-assistant/core/pull/144095
+[#144097]: https://github.com/home-assistant/core/pull/144097
+[#144100]: https://github.com/home-assistant/core/pull/144100
+[#144117]: https://github.com/home-assistant/core/pull/144117
+[#144128]: https://github.com/home-assistant/core/pull/144128
+[#144142]: https://github.com/home-assistant/core/pull/144142
+[#144144]: https://github.com/home-assistant/core/pull/144144
+[#144146]: https://github.com/home-assistant/core/pull/144146
+[#144147]: https://github.com/home-assistant/core/pull/144147
+[#144148]: https://github.com/home-assistant/core/pull/144148
+[#144149]: https://github.com/home-assistant/core/pull/144149
+[#144151]: https://github.com/home-assistant/core/pull/144151
+[#144153]: https://github.com/home-assistant/core/pull/144153
+[#144161]: https://github.com/home-assistant/core/pull/144161
+[#144166]: https://github.com/home-assistant/core/pull/144166
+[#144167]: https://github.com/home-assistant/core/pull/144167
+[#144168]: https://github.com/home-assistant/core/pull/144168
+[#144169]: https://github.com/home-assistant/core/pull/144169
+[#144171]: https://github.com/home-assistant/core/pull/144171
+[#144173]: https://github.com/home-assistant/core/pull/144173
+[#144175]: https://github.com/home-assistant/core/pull/144175
+[#144178]: https://github.com/home-assistant/core/pull/144178
+[#144179]: https://github.com/home-assistant/core/pull/144179
+[#144188]: https://github.com/home-assistant/core/pull/144188
+[#144189]: https://github.com/home-assistant/core/pull/144189
+[#144190]: https://github.com/home-assistant/core/pull/144190
+[#144191]: https://github.com/home-assistant/core/pull/144191
+[#144192]: https://github.com/home-assistant/core/pull/144192
+[#144194]: https://github.com/home-assistant/core/pull/144194
+[#144197]: https://github.com/home-assistant/core/pull/144197
+[#144199]: https://github.com/home-assistant/core/pull/144199
+[#144204]: https://github.com/home-assistant/core/pull/144204
+[#144206]: https://github.com/home-assistant/core/pull/144206
+[#144208]: https://github.com/home-assistant/core/pull/144208
+[#144212]: https://github.com/home-assistant/core/pull/144212
+[#144214]: https://github.com/home-assistant/core/pull/144214
+[#144216]: https://github.com/home-assistant/core/pull/144216
+[#144217]: https://github.com/home-assistant/core/pull/144217
+[#144218]: https://github.com/home-assistant/core/pull/144218
+[#144219]: https://github.com/home-assistant/core/pull/144219
+[#144221]: https://github.com/home-assistant/core/pull/144221
+[#144222]: https://github.com/home-assistant/core/pull/144222
+[#144223]: https://github.com/home-assistant/core/pull/144223
+[#144234]: https://github.com/home-assistant/core/pull/144234
+[#144236]: https://github.com/home-assistant/core/pull/144236
+[#144238]: https://github.com/home-assistant/core/pull/144238
+[#144244]: https://github.com/home-assistant/core/pull/144244
+[#144245]: https://github.com/home-assistant/core/pull/144245
+[#144246]: https://github.com/home-assistant/core/pull/144246
+[#144249]: https://github.com/home-assistant/core/pull/144249
+[#144252]: https://github.com/home-assistant/core/pull/144252
+[#144254]: https://github.com/home-assistant/core/pull/144254
+[#144261]: https://github.com/home-assistant/core/pull/144261
+[#144264]: https://github.com/home-assistant/core/pull/144264
+[#144265]: https://github.com/home-assistant/core/pull/144265
+[#144266]: https://github.com/home-assistant/core/pull/144266
+[#144267]: https://github.com/home-assistant/core/pull/144267
+[#144268]: https://github.com/home-assistant/core/pull/144268
+[#144269]: https://github.com/home-assistant/core/pull/144269
+[#144270]: https://github.com/home-assistant/core/pull/144270
+[#144271]: https://github.com/home-assistant/core/pull/144271
+[#144272]: https://github.com/home-assistant/core/pull/144272
+[#144278]: https://github.com/home-assistant/core/pull/144278
+[#144280]: https://github.com/home-assistant/core/pull/144280
+[#144284]: https://github.com/home-assistant/core/pull/144284
+[#144291]: https://github.com/home-assistant/core/pull/144291
+[#144295]: https://github.com/home-assistant/core/pull/144295
+[#144301]: https://github.com/home-assistant/core/pull/144301
+[#144302]: https://github.com/home-assistant/core/pull/144302
+[#144303]: https://github.com/home-assistant/core/pull/144303
+[#144305]: https://github.com/home-assistant/core/pull/144305
+[#144306]: https://github.com/home-assistant/core/pull/144306
+[#144308]: https://github.com/home-assistant/core/pull/144308
+[#144309]: https://github.com/home-assistant/core/pull/144309
+[#144310]: https://github.com/home-assistant/core/pull/144310
+[#144311]: https://github.com/home-assistant/core/pull/144311
+[#144312]: https://github.com/home-assistant/core/pull/144312
+[#144313]: https://github.com/home-assistant/core/pull/144313
+[#144316]: https://github.com/home-assistant/core/pull/144316
+[#144319]: https://github.com/home-assistant/core/pull/144319
+[#144320]: https://github.com/home-assistant/core/pull/144320
+[#144322]: https://github.com/home-assistant/core/pull/144322
+[#144323]: https://github.com/home-assistant/core/pull/144323
+[#144325]: https://github.com/home-assistant/core/pull/144325
+[#144326]: https://github.com/home-assistant/core/pull/144326
+[#144327]: https://github.com/home-assistant/core/pull/144327
+[#144328]: https://github.com/home-assistant/core/pull/144328
+[#144329]: https://github.com/home-assistant/core/pull/144329
+[#144330]: https://github.com/home-assistant/core/pull/144330
+[#144331]: https://github.com/home-assistant/core/pull/144331
+[#144332]: https://github.com/home-assistant/core/pull/144332
+[#144335]: https://github.com/home-assistant/core/pull/144335
+[#144337]: https://github.com/home-assistant/core/pull/144337
+[#144340]: https://github.com/home-assistant/core/pull/144340
+[#144341]: https://github.com/home-assistant/core/pull/144341
+[#144344]: https://github.com/home-assistant/core/pull/144344
+[#144346]: https://github.com/home-assistant/core/pull/144346
+[#144348]: https://github.com/home-assistant/core/pull/144348
+[#144361]: https://github.com/home-assistant/core/pull/144361
+[#144363]: https://github.com/home-assistant/core/pull/144363
+[#144364]: https://github.com/home-assistant/core/pull/144364
+[#144365]: https://github.com/home-assistant/core/pull/144365
+[#144367]: https://github.com/home-assistant/core/pull/144367
+[#144368]: https://github.com/home-assistant/core/pull/144368
+[#144370]: https://github.com/home-assistant/core/pull/144370
+[#144372]: https://github.com/home-assistant/core/pull/144372
+[#144376]: https://github.com/home-assistant/core/pull/144376
+[#144378]: https://github.com/home-assistant/core/pull/144378
+[#144379]: https://github.com/home-assistant/core/pull/144379
+[#144380]: https://github.com/home-assistant/core/pull/144380
+[#144381]: https://github.com/home-assistant/core/pull/144381
+[#144394]: https://github.com/home-assistant/core/pull/144394
+[#144400]: https://github.com/home-assistant/core/pull/144400
+[#144402]: https://github.com/home-assistant/core/pull/144402
+[#144405]: https://github.com/home-assistant/core/pull/144405
+[#144408]: https://github.com/home-assistant/core/pull/144408
+[#144410]: https://github.com/home-assistant/core/pull/144410
+[#144411]: https://github.com/home-assistant/core/pull/144411
+[#144412]: https://github.com/home-assistant/core/pull/144412
+[#144414]: https://github.com/home-assistant/core/pull/144414
+[#144416]: https://github.com/home-assistant/core/pull/144416
+[#144417]: https://github.com/home-assistant/core/pull/144417
+[#144420]: https://github.com/home-assistant/core/pull/144420
+[#144422]: https://github.com/home-assistant/core/pull/144422
+[#144423]: https://github.com/home-assistant/core/pull/144423
+[#144428]: https://github.com/home-assistant/core/pull/144428
+[#144430]: https://github.com/home-assistant/core/pull/144430
+[#144433]: https://github.com/home-assistant/core/pull/144433
+[#144440]: https://github.com/home-assistant/core/pull/144440
+[#144443]: https://github.com/home-assistant/core/pull/144443
+[#144444]: https://github.com/home-assistant/core/pull/144444
+[#144446]: https://github.com/home-assistant/core/pull/144446
+[#144447]: https://github.com/home-assistant/core/pull/144447
+[#144448]: https://github.com/home-assistant/core/pull/144448
+[#144450]: https://github.com/home-assistant/core/pull/144450
+[#144456]: https://github.com/home-assistant/core/pull/144456
+[#144470]: https://github.com/home-assistant/core/pull/144470
+[#144472]: https://github.com/home-assistant/core/pull/144472
+[#144473]: https://github.com/home-assistant/core/pull/144473
+[#144483]: https://github.com/home-assistant/core/pull/144483
+[#144491]: https://github.com/home-assistant/core/pull/144491
+[#144493]: https://github.com/home-assistant/core/pull/144493
+[#144494]: https://github.com/home-assistant/core/pull/144494
+[#144500]: https://github.com/home-assistant/core/pull/144500
+[#144505]: https://github.com/home-assistant/core/pull/144505
+[#144507]: https://github.com/home-assistant/core/pull/144507
+[#144510]: https://github.com/home-assistant/core/pull/144510
+[#144513]: https://github.com/home-assistant/core/pull/144513
+[#144515]: https://github.com/home-assistant/core/pull/144515
+[#144519]: https://github.com/home-assistant/core/pull/144519
+[#144527]: https://github.com/home-assistant/core/pull/144527
+[#144529]: https://github.com/home-assistant/core/pull/144529
+[#144531]: https://github.com/home-assistant/core/pull/144531
+[#144532]: https://github.com/home-assistant/core/pull/144532
+[#144535]: https://github.com/home-assistant/core/pull/144535
+[#144537]: https://github.com/home-assistant/core/pull/144537
+[#144538]: https://github.com/home-assistant/core/pull/144538
+[#144539]: https://github.com/home-assistant/core/pull/144539
+[#144540]: https://github.com/home-assistant/core/pull/144540
+[#144545]: https://github.com/home-assistant/core/pull/144545
+[#144546]: https://github.com/home-assistant/core/pull/144546
+[#144547]: https://github.com/home-assistant/core/pull/144547
+[#144548]: https://github.com/home-assistant/core/pull/144548
+[#144550]: https://github.com/home-assistant/core/pull/144550
+[#144551]: https://github.com/home-assistant/core/pull/144551
+[#144555]: https://github.com/home-assistant/core/pull/144555
+[#144557]: https://github.com/home-assistant/core/pull/144557
+[#144559]: https://github.com/home-assistant/core/pull/144559
+[#144560]: https://github.com/home-assistant/core/pull/144560
+[#144561]: https://github.com/home-assistant/core/pull/144561
+[#144572]: https://github.com/home-assistant/core/pull/144572
+[#144577]: https://github.com/home-assistant/core/pull/144577
+[#144579]: https://github.com/home-assistant/core/pull/144579
+[#144581]: https://github.com/home-assistant/core/pull/144581
+[#144587]: https://github.com/home-assistant/core/pull/144587
+[#144588]: https://github.com/home-assistant/core/pull/144588
+[#144600]: https://github.com/home-assistant/core/pull/144600
+[#144601]: https://github.com/home-assistant/core/pull/144601
+[#144603]: https://github.com/home-assistant/core/pull/144603
+[#144605]: https://github.com/home-assistant/core/pull/144605
+[#144606]: https://github.com/home-assistant/core/pull/144606
+[#144607]: https://github.com/home-assistant/core/pull/144607
+[#144609]: https://github.com/home-assistant/core/pull/144609
+[#144611]: https://github.com/home-assistant/core/pull/144611
+[#144618]: https://github.com/home-assistant/core/pull/144618
+[#144619]: https://github.com/home-assistant/core/pull/144619
+[#144626]: https://github.com/home-assistant/core/pull/144626
+[#144627]: https://github.com/home-assistant/core/pull/144627
+[#144630]: https://github.com/home-assistant/core/pull/144630
+[#144631]: https://github.com/home-assistant/core/pull/144631
+[#144632]: https://github.com/home-assistant/core/pull/144632
+[#144633]: https://github.com/home-assistant/core/pull/144633
+[#144636]: https://github.com/home-assistant/core/pull/144636
+[#144637]: https://github.com/home-assistant/core/pull/144637
+[#144638]: https://github.com/home-assistant/core/pull/144638
+[#144639]: https://github.com/home-assistant/core/pull/144639
+[#144640]: https://github.com/home-assistant/core/pull/144640
+[#144646]: https://github.com/home-assistant/core/pull/144646
+[#144650]: https://github.com/home-assistant/core/pull/144650
+[#144659]: https://github.com/home-assistant/core/pull/144659
+[#144664]: https://github.com/home-assistant/core/pull/144664
+[#144674]: https://github.com/home-assistant/core/pull/144674
+[#144685]: https://github.com/home-assistant/core/pull/144685
+[#144686]: https://github.com/home-assistant/core/pull/144686
+[#144688]: https://github.com/home-assistant/core/pull/144688
+[#144690]: https://github.com/home-assistant/core/pull/144690
+[#144693]: https://github.com/home-assistant/core/pull/144693
+[#144696]: https://github.com/home-assistant/core/pull/144696
+[#144697]: https://github.com/home-assistant/core/pull/144697
+[#144698]: https://github.com/home-assistant/core/pull/144698
+[#144699]: https://github.com/home-assistant/core/pull/144699
+[#144700]: https://github.com/home-assistant/core/pull/144700
+[#144701]: https://github.com/home-assistant/core/pull/144701
+[#144711]: https://github.com/home-assistant/core/pull/144711
+[#144715]: https://github.com/home-assistant/core/pull/144715
+[#144716]: https://github.com/home-assistant/core/pull/144716
+[#144717]: https://github.com/home-assistant/core/pull/144717
+[#144719]: https://github.com/home-assistant/core/pull/144719
+[#144723]: https://github.com/home-assistant/core/pull/144723
+[#144724]: https://github.com/home-assistant/core/pull/144724
+[#144726]: https://github.com/home-assistant/core/pull/144726
+[#144732]: https://github.com/home-assistant/core/pull/144732
+[#144735]: https://github.com/home-assistant/core/pull/144735
+[#144739]: https://github.com/home-assistant/core/pull/144739
+[#144741]: https://github.com/home-assistant/core/pull/144741
+[#144742]: https://github.com/home-assistant/core/pull/144742
+[#144744]: https://github.com/home-assistant/core/pull/144744
+[#144746]: https://github.com/home-assistant/core/pull/144746
+[#144748]: https://github.com/home-assistant/core/pull/144748
+[#144751]: https://github.com/home-assistant/core/pull/144751
+[#144753]: https://github.com/home-assistant/core/pull/144753
+[#144755]: https://github.com/home-assistant/core/pull/144755
+[#144756]: https://github.com/home-assistant/core/pull/144756
+[#144757]: https://github.com/home-assistant/core/pull/144757
+[#144758]: https://github.com/home-assistant/core/pull/144758
+[#144760]: https://github.com/home-assistant/core/pull/144760
+[#144761]: https://github.com/home-assistant/core/pull/144761
+[#144767]: https://github.com/home-assistant/core/pull/144767
+[#144769]: https://github.com/home-assistant/core/pull/144769
+[#144770]: https://github.com/home-assistant/core/pull/144770
+[#144773]: https://github.com/home-assistant/core/pull/144773
+[#144775]: https://github.com/home-assistant/core/pull/144775
+[#144777]: https://github.com/home-assistant/core/pull/144777
+[#144778]: https://github.com/home-assistant/core/pull/144778
+[#144787]: https://github.com/home-assistant/core/pull/144787
+[#144794]: https://github.com/home-assistant/core/pull/144794
+[#144800]: https://github.com/home-assistant/core/pull/144800
+[#144804]: https://github.com/home-assistant/core/pull/144804
+[#144810]: https://github.com/home-assistant/core/pull/144810
+[#144817]: https://github.com/home-assistant/core/pull/144817
+[#144820]: https://github.com/home-assistant/core/pull/144820
+[#144822]: https://github.com/home-assistant/core/pull/144822
+[#144828]: https://github.com/home-assistant/core/pull/144828
+[#144829]: https://github.com/home-assistant/core/pull/144829
+[#144832]: https://github.com/home-assistant/core/pull/144832
+[#144834]: https://github.com/home-assistant/core/pull/144834
+[#144837]: https://github.com/home-assistant/core/pull/144837
+[#144842]: https://github.com/home-assistant/core/pull/144842
+[#144843]: https://github.com/home-assistant/core/pull/144843
+[#144844]: https://github.com/home-assistant/core/pull/144844
+[#144845]: https://github.com/home-assistant/core/pull/144845
+[#144854]: https://github.com/home-assistant/core/pull/144854
+[#144856]: https://github.com/home-assistant/core/pull/144856
+[#144861]: https://github.com/home-assistant/core/pull/144861
+[#144864]: https://github.com/home-assistant/core/pull/144864
+[#144865]: https://github.com/home-assistant/core/pull/144865
+[#144867]: https://github.com/home-assistant/core/pull/144867
+[#144868]: https://github.com/home-assistant/core/pull/144868
+[#144870]: https://github.com/home-assistant/core/pull/144870
+[#144873]: https://github.com/home-assistant/core/pull/144873
+[#144876]: https://github.com/home-assistant/core/pull/144876
+[#144878]: https://github.com/home-assistant/core/pull/144878
+[#144880]: https://github.com/home-assistant/core/pull/144880
+[#144881]: https://github.com/home-assistant/core/pull/144881
+[#144882]: https://github.com/home-assistant/core/pull/144882
+[#144883]: https://github.com/home-assistant/core/pull/144883
+[#144884]: https://github.com/home-assistant/core/pull/144884
+[#144886]: https://github.com/home-assistant/core/pull/144886
+[#144887]: https://github.com/home-assistant/core/pull/144887
+[#144888]: https://github.com/home-assistant/core/pull/144888
+[#144892]: https://github.com/home-assistant/core/pull/144892
+[#144895]: https://github.com/home-assistant/core/pull/144895
+[#144896]: https://github.com/home-assistant/core/pull/144896
+[#144901]: https://github.com/home-assistant/core/pull/144901
+[#144907]: https://github.com/home-assistant/core/pull/144907
+[#144912]: https://github.com/home-assistant/core/pull/144912
+[#144914]: https://github.com/home-assistant/core/pull/144914
+[#144915]: https://github.com/home-assistant/core/pull/144915
+[#144916]: https://github.com/home-assistant/core/pull/144916
+[#144918]: https://github.com/home-assistant/core/pull/144918
+[#144919]: https://github.com/home-assistant/core/pull/144919
+[#144920]: https://github.com/home-assistant/core/pull/144920
+[#144923]: https://github.com/home-assistant/core/pull/144923
+[#144926]: https://github.com/home-assistant/core/pull/144926
+[#144927]: https://github.com/home-assistant/core/pull/144927
+[#144937]: https://github.com/home-assistant/core/pull/144937
+[#144939]: https://github.com/home-assistant/core/pull/144939
+[#144942]: https://github.com/home-assistant/core/pull/144942
+[#144944]: https://github.com/home-assistant/core/pull/144944
+[#144946]: https://github.com/home-assistant/core/pull/144946
+[#144947]: https://github.com/home-assistant/core/pull/144947
+[#144950]: https://github.com/home-assistant/core/pull/144950
+[#144951]: https://github.com/home-assistant/core/pull/144951
+[#144953]: https://github.com/home-assistant/core/pull/144953
+[#144954]: https://github.com/home-assistant/core/pull/144954
+[#144955]: https://github.com/home-assistant/core/pull/144955
+[#144956]: https://github.com/home-assistant/core/pull/144956
+[#144961]: https://github.com/home-assistant/core/pull/144961
+[#144962]: https://github.com/home-assistant/core/pull/144962
+[#144968]: https://github.com/home-assistant/core/pull/144968
+[#144969]: https://github.com/home-assistant/core/pull/144969
+[#144972]: https://github.com/home-assistant/core/pull/144972
+[#144974]: https://github.com/home-assistant/core/pull/144974
+[#144977]: https://github.com/home-assistant/core/pull/144977
+[#144978]: https://github.com/home-assistant/core/pull/144978
+[#144979]: https://github.com/home-assistant/core/pull/144979
+[#144980]: https://github.com/home-assistant/core/pull/144980
+[#144982]: https://github.com/home-assistant/core/pull/144982
+[#144983]: https://github.com/home-assistant/core/pull/144983
+[#144984]: https://github.com/home-assistant/core/pull/144984
+[#144986]: https://github.com/home-assistant/core/pull/144986
+[#144988]: https://github.com/home-assistant/core/pull/144988
+[#144989]: https://github.com/home-assistant/core/pull/144989
+[#144990]: https://github.com/home-assistant/core/pull/144990
+[#144991]: https://github.com/home-assistant/core/pull/144991
+[#144998]: https://github.com/home-assistant/core/pull/144998
+[#144999]: https://github.com/home-assistant/core/pull/144999
+[#145000]: https://github.com/home-assistant/core/pull/145000
+[#145002]: https://github.com/home-assistant/core/pull/145002
+[#145007]: https://github.com/home-assistant/core/pull/145007
+[#145008]: https://github.com/home-assistant/core/pull/145008
+[#145011]: https://github.com/home-assistant/core/pull/145011
+[#145012]: https://github.com/home-assistant/core/pull/145012
+[#145018]: https://github.com/home-assistant/core/pull/145018
+[#145021]: https://github.com/home-assistant/core/pull/145021
+[#145022]: https://github.com/home-assistant/core/pull/145022
+[#145023]: https://github.com/home-assistant/core/pull/145023
+[#145026]: https://github.com/home-assistant/core/pull/145026
+[#145028]: https://github.com/home-assistant/core/pull/145028
+[#145030]: https://github.com/home-assistant/core/pull/145030
+[#145031]: https://github.com/home-assistant/core/pull/145031
+[#145034]: https://github.com/home-assistant/core/pull/145034
+[#145036]: https://github.com/home-assistant/core/pull/145036
+[#145037]: https://github.com/home-assistant/core/pull/145037
+[#145039]: https://github.com/home-assistant/core/pull/145039
+[#145041]: https://github.com/home-assistant/core/pull/145041
+[#145042]: https://github.com/home-assistant/core/pull/145042
+[#145045]: https://github.com/home-assistant/core/pull/145045
+[#145047]: https://github.com/home-assistant/core/pull/145047
+[#145052]: https://github.com/home-assistant/core/pull/145052
+[#145057]: https://github.com/home-assistant/core/pull/145057
+[#145060]: https://github.com/home-assistant/core/pull/145060
+[#145065]: https://github.com/home-assistant/core/pull/145065
+[#145069]: https://github.com/home-assistant/core/pull/145069
+[#145077]: https://github.com/home-assistant/core/pull/145077
+[#145080]: https://github.com/home-assistant/core/pull/145080
+[#145085]: https://github.com/home-assistant/core/pull/145085
+[#145094]: https://github.com/home-assistant/core/pull/145094
+[#145096]: https://github.com/home-assistant/core/pull/145096
+[#145102]: https://github.com/home-assistant/core/pull/145102
+[#145103]: https://github.com/home-assistant/core/pull/145103
+[#145107]: https://github.com/home-assistant/core/pull/145107
+[#145110]: https://github.com/home-assistant/core/pull/145110
+[#145111]: https://github.com/home-assistant/core/pull/145111
+[#145115]: https://github.com/home-assistant/core/pull/145115
+[#145121]: https://github.com/home-assistant/core/pull/145121
+[#145125]: https://github.com/home-assistant/core/pull/145125
+[#145129]: https://github.com/home-assistant/core/pull/145129
+[#145130]: https://github.com/home-assistant/core/pull/145130
+[#145146]: https://github.com/home-assistant/core/pull/145146
+[#145147]: https://github.com/home-assistant/core/pull/145147
+[#145148]: https://github.com/home-assistant/core/pull/145148
+[#145149]: https://github.com/home-assistant/core/pull/145149
+[#145151]: https://github.com/home-assistant/core/pull/145151
+[#145152]: https://github.com/home-assistant/core/pull/145152
+[#145155]: https://github.com/home-assistant/core/pull/145155
+[#145159]: https://github.com/home-assistant/core/pull/145159
+[#145161]: https://github.com/home-assistant/core/pull/145161
+[#145162]: https://github.com/home-assistant/core/pull/145162
+[#145165]: https://github.com/home-assistant/core/pull/145165
+[#145167]: https://github.com/home-assistant/core/pull/145167
+[#145169]: https://github.com/home-assistant/core/pull/145169
+[#145170]: https://github.com/home-assistant/core/pull/145170
+[#145171]: https://github.com/home-assistant/core/pull/145171
+[#145172]: https://github.com/home-assistant/core/pull/145172
+[#145173]: https://github.com/home-assistant/core/pull/145173
+[#145174]: https://github.com/home-assistant/core/pull/145174
+[#145177]: https://github.com/home-assistant/core/pull/145177
+[#145178]: https://github.com/home-assistant/core/pull/145178
+[#145179]: https://github.com/home-assistant/core/pull/145179
+[#145180]: https://github.com/home-assistant/core/pull/145180
+[#145181]: https://github.com/home-assistant/core/pull/145181
+[#145183]: https://github.com/home-assistant/core/pull/145183
+[#145186]: https://github.com/home-assistant/core/pull/145186
+[#145187]: https://github.com/home-assistant/core/pull/145187
+[#145189]: https://github.com/home-assistant/core/pull/145189
+[#145192]: https://github.com/home-assistant/core/pull/145192
+[#145194]: https://github.com/home-assistant/core/pull/145194
+[#145195]: https://github.com/home-assistant/core/pull/145195
+[#145199]: https://github.com/home-assistant/core/pull/145199
+[#145200]: https://github.com/home-assistant/core/pull/145200
+[#145201]: https://github.com/home-assistant/core/pull/145201
+[#145202]: https://github.com/home-assistant/core/pull/145202
+[#145203]: https://github.com/home-assistant/core/pull/145203
+[#145206]: https://github.com/home-assistant/core/pull/145206
+[#145207]: https://github.com/home-assistant/core/pull/145207
+[#145208]: https://github.com/home-assistant/core/pull/145208
+[#145210]: https://github.com/home-assistant/core/pull/145210
+[#145211]: https://github.com/home-assistant/core/pull/145211
+[#145212]: https://github.com/home-assistant/core/pull/145212
+[#145214]: https://github.com/home-assistant/core/pull/145214
+[#145215]: https://github.com/home-assistant/core/pull/145215
+[#145217]: https://github.com/home-assistant/core/pull/145217
+[#145218]: https://github.com/home-assistant/core/pull/145218
+[#145219]: https://github.com/home-assistant/core/pull/145219
+[#145220]: https://github.com/home-assistant/core/pull/145220
+[#145222]: https://github.com/home-assistant/core/pull/145222
+[#145223]: https://github.com/home-assistant/core/pull/145223
+[#145225]: https://github.com/home-assistant/core/pull/145225
+[#145226]: https://github.com/home-assistant/core/pull/145226
+[#145227]: https://github.com/home-assistant/core/pull/145227
+[#145229]: https://github.com/home-assistant/core/pull/145229
+[#145230]: https://github.com/home-assistant/core/pull/145230
+[#145236]: https://github.com/home-assistant/core/pull/145236
+[#145239]: https://github.com/home-assistant/core/pull/145239
+[#145243]: https://github.com/home-assistant/core/pull/145243
+[#145244]: https://github.com/home-assistant/core/pull/145244
+[#145247]: https://github.com/home-assistant/core/pull/145247
+[#145249]: https://github.com/home-assistant/core/pull/145249
+[#145250]: https://github.com/home-assistant/core/pull/145250
+[#145253]: https://github.com/home-assistant/core/pull/145253
+[#145254]: https://github.com/home-assistant/core/pull/145254
+[#145255]: https://github.com/home-assistant/core/pull/145255
+[#145257]: https://github.com/home-assistant/core/pull/145257
+[#145259]: https://github.com/home-assistant/core/pull/145259
+[#145263]: https://github.com/home-assistant/core/pull/145263
+[#145264]: https://github.com/home-assistant/core/pull/145264
+[#145269]: https://github.com/home-assistant/core/pull/145269
+[#145270]: https://github.com/home-assistant/core/pull/145270
+[#145271]: https://github.com/home-assistant/core/pull/145271
+[#145272]: https://github.com/home-assistant/core/pull/145272
+[#145273]: https://github.com/home-assistant/core/pull/145273
+[#145274]: https://github.com/home-assistant/core/pull/145274
+[#145275]: https://github.com/home-assistant/core/pull/145275
+[#145276]: https://github.com/home-assistant/core/pull/145276
+[#145279]: https://github.com/home-assistant/core/pull/145279
+[#145280]: https://github.com/home-assistant/core/pull/145280
+[#145281]: https://github.com/home-assistant/core/pull/145281
+[#145282]: https://github.com/home-assistant/core/pull/145282
+[#145283]: https://github.com/home-assistant/core/pull/145283
+[#145285]: https://github.com/home-assistant/core/pull/145285
+[#145286]: https://github.com/home-assistant/core/pull/145286
+[#145287]: https://github.com/home-assistant/core/pull/145287
+[#145289]: https://github.com/home-assistant/core/pull/145289
+[#145292]: https://github.com/home-assistant/core/pull/145292
+[#145294]: https://github.com/home-assistant/core/pull/145294
+[#145297]: https://github.com/home-assistant/core/pull/145297
+[#145298]: https://github.com/home-assistant/core/pull/145298
+[#145299]: https://github.com/home-assistant/core/pull/145299
+[#145303]: https://github.com/home-assistant/core/pull/145303
+[#145305]: https://github.com/home-assistant/core/pull/145305
+[#145306]: https://github.com/home-assistant/core/pull/145306
+[#145308]: https://github.com/home-assistant/core/pull/145308
+[#145309]: https://github.com/home-assistant/core/pull/145309
+[#145311]: https://github.com/home-assistant/core/pull/145311
+[#145313]: https://github.com/home-assistant/core/pull/145313
+[#145314]: https://github.com/home-assistant/core/pull/145314
+[#145315]: https://github.com/home-assistant/core/pull/145315
+[#145316]: https://github.com/home-assistant/core/pull/145316
+[#145318]: https://github.com/home-assistant/core/pull/145318
+[#145319]: https://github.com/home-assistant/core/pull/145319
+[#145324]: https://github.com/home-assistant/core/pull/145324
+[#145325]: https://github.com/home-assistant/core/pull/145325
+[#145327]: https://github.com/home-assistant/core/pull/145327
+[#145329]: https://github.com/home-assistant/core/pull/145329
+[#145331]: https://github.com/home-assistant/core/pull/145331
+[#145332]: https://github.com/home-assistant/core/pull/145332
+[#145334]: https://github.com/home-assistant/core/pull/145334
+[#145335]: https://github.com/home-assistant/core/pull/145335
+[#145340]: https://github.com/home-assistant/core/pull/145340
+[#145348]: https://github.com/home-assistant/core/pull/145348
+[#145350]: https://github.com/home-assistant/core/pull/145350
+[#145353]: https://github.com/home-assistant/core/pull/145353
+[#145358]: https://github.com/home-assistant/core/pull/145358
+[#145360]: https://github.com/home-assistant/core/pull/145360
+[#145364]: https://github.com/home-assistant/core/pull/145364
+[#145366]: https://github.com/home-assistant/core/pull/145366
+[#145368]: https://github.com/home-assistant/core/pull/145368
+[#145371]: https://github.com/home-assistant/core/pull/145371
+[#145372]: https://github.com/home-assistant/core/pull/145372
+[#145373]: https://github.com/home-assistant/core/pull/145373
+[#145374]: https://github.com/home-assistant/core/pull/145374
+[#145376]: https://github.com/home-assistant/core/pull/145376
+[#145378]: https://github.com/home-assistant/core/pull/145378
+[#145381]: https://github.com/home-assistant/core/pull/145381
+[#145388]: https://github.com/home-assistant/core/pull/145388
+[#145390]: https://github.com/home-assistant/core/pull/145390
+[#145391]: https://github.com/home-assistant/core/pull/145391
+[#145392]: https://github.com/home-assistant/core/pull/145392
+[#145393]: https://github.com/home-assistant/core/pull/145393
+[#145395]: https://github.com/home-assistant/core/pull/145395
+[#145396]: https://github.com/home-assistant/core/pull/145396
+[#145397]: https://github.com/home-assistant/core/pull/145397
+[#145398]: https://github.com/home-assistant/core/pull/145398
+[#145400]: https://github.com/home-assistant/core/pull/145400
+[#145401]: https://github.com/home-assistant/core/pull/145401
+[#145404]: https://github.com/home-assistant/core/pull/145404
+[#145405]: https://github.com/home-assistant/core/pull/145405
+[#145407]: https://github.com/home-assistant/core/pull/145407
+[#145409]: https://github.com/home-assistant/core/pull/145409
+[#145413]: https://github.com/home-assistant/core/pull/145413
+[#145414]: https://github.com/home-assistant/core/pull/145414
+[#145416]: https://github.com/home-assistant/core/pull/145416
+[#145417]: https://github.com/home-assistant/core/pull/145417
+[#145418]: https://github.com/home-assistant/core/pull/145418
+[#145419]: https://github.com/home-assistant/core/pull/145419
+[#145420]: https://github.com/home-assistant/core/pull/145420
+[#145421]: https://github.com/home-assistant/core/pull/145421
+[#145422]: https://github.com/home-assistant/core/pull/145422
+[#145423]: https://github.com/home-assistant/core/pull/145423
+[#145426]: https://github.com/home-assistant/core/pull/145426
+[#145429]: https://github.com/home-assistant/core/pull/145429
+[#145430]: https://github.com/home-assistant/core/pull/145430
+[#145431]: https://github.com/home-assistant/core/pull/145431
+[#145432]: https://github.com/home-assistant/core/pull/145432
+[#145433]: https://github.com/home-assistant/core/pull/145433
+[#145434]: https://github.com/home-assistant/core/pull/145434
+[#145435]: https://github.com/home-assistant/core/pull/145435
+[#145438]: https://github.com/home-assistant/core/pull/145438
+[#145440]: https://github.com/home-assistant/core/pull/145440
+[#145447]: https://github.com/home-assistant/core/pull/145447
+[#145448]: https://github.com/home-assistant/core/pull/145448
+[#145449]: https://github.com/home-assistant/core/pull/145449
+[#145455]: https://github.com/home-assistant/core/pull/145455
+[#145456]: https://github.com/home-assistant/core/pull/145456
+[#145458]: https://github.com/home-assistant/core/pull/145458
+[#145462]: https://github.com/home-assistant/core/pull/145462
+[#145463]: https://github.com/home-assistant/core/pull/145463
+[#145465]: https://github.com/home-assistant/core/pull/145465
+[#145466]: https://github.com/home-assistant/core/pull/145466
+[#145468]: https://github.com/home-assistant/core/pull/145468
+[#145469]: https://github.com/home-assistant/core/pull/145469
+[#145477]: https://github.com/home-assistant/core/pull/145477
+[#145490]: https://github.com/home-assistant/core/pull/145490
+[#145494]: https://github.com/home-assistant/core/pull/145494
+[#145499]: https://github.com/home-assistant/core/pull/145499
+[#145505]: https://github.com/home-assistant/core/pull/145505
+[#145506]: https://github.com/home-assistant/core/pull/145506
+[#145507]: https://github.com/home-assistant/core/pull/145507
+[#145510]: https://github.com/home-assistant/core/pull/145510
+[#145513]: https://github.com/home-assistant/core/pull/145513
+[#145514]: https://github.com/home-assistant/core/pull/145514
+[#145517]: https://github.com/home-assistant/core/pull/145517
+[#145518]: https://github.com/home-assistant/core/pull/145518
+[#145519]: https://github.com/home-assistant/core/pull/145519
+[#145520]: https://github.com/home-assistant/core/pull/145520
+[#145522]: https://github.com/home-assistant/core/pull/145522
+[#145529]: https://github.com/home-assistant/core/pull/145529
+[#145532]: https://github.com/home-assistant/core/pull/145532
+[#145535]: https://github.com/home-assistant/core/pull/145535
+[#145537]: https://github.com/home-assistant/core/pull/145537
+[#145540]: https://github.com/home-assistant/core/pull/145540
+[#145542]: https://github.com/home-assistant/core/pull/145542
+[#145546]: https://github.com/home-assistant/core/pull/145546
+[#145550]: https://github.com/home-assistant/core/pull/145550
+[#145559]: https://github.com/home-assistant/core/pull/145559
+[#145560]: https://github.com/home-assistant/core/pull/145560
+[#145562]: https://github.com/home-assistant/core/pull/145562
+[#145563]: https://github.com/home-assistant/core/pull/145563
+[#145565]: https://github.com/home-assistant/core/pull/145565
+[#145569]: https://github.com/home-assistant/core/pull/145569
+[#145570]: https://github.com/home-assistant/core/pull/145570
+[#145573]: https://github.com/home-assistant/core/pull/145573
+[#145576]: https://github.com/home-assistant/core/pull/145576
+[#145579]: https://github.com/home-assistant/core/pull/145579
+[#145583]: https://github.com/home-assistant/core/pull/145583
+[#145587]: https://github.com/home-assistant/core/pull/145587
+[#145590]: https://github.com/home-assistant/core/pull/145590
+[#145595]: https://github.com/home-assistant/core/pull/145595
+[#145596]: https://github.com/home-assistant/core/pull/145596
+[#145597]: https://github.com/home-assistant/core/pull/145597
+[#145598]: https://github.com/home-assistant/core/pull/145598
+[#145600]: https://github.com/home-assistant/core/pull/145600
+[#145605]: https://github.com/home-assistant/core/pull/145605
+[#145608]: https://github.com/home-assistant/core/pull/145608
+[#145610]: https://github.com/home-assistant/core/pull/145610
+[@Arnie97]: https://github.com/Arnie97
+[@Bre77]: https://github.com/Bre77
+[@DeerMaximum]: https://github.com/DeerMaximum
+[@Diegorro98]: https://github.com/Diegorro98
+[@DioSWolF]: https://github.com/DioSWolF
+[@Djelibeybi]: https://github.com/Djelibeybi
+[@Ernst79]: https://github.com/Ernst79
+[@Gigatrappeur]: https://github.com/Gigatrappeur
+[@Hypfer]: https://github.com/Hypfer
+[@IvanLH]: https://github.com/IvanLH
+[@LG-ThinQ-Integration]: https://github.com/LG-ThinQ-Integration
+[@LaStrada]: https://github.com/LaStrada
+[@Lash-L]: https://github.com/Lash-L
+[@LazyTarget]: https://github.com/LazyTarget
+[@Lektrico]: https://github.com/Lektrico
+[@LouisChrist]: https://github.com/LouisChrist
+[@MartinHjelmare]: https://github.com/MartinHjelmare
+[@MindFreeze]: https://github.com/MindFreeze
+[@NickKoepr]: https://github.com/NickKoepr
+[@NoRi2909]: https://github.com/NoRi2909
+[@Passific]: https://github.com/Passific
+[@PeteRager]: https://github.com/PeteRager
+[@Petro31]: https://github.com/Petro31
+[@RaHehl]: https://github.com/RaHehl
+[@RenierM26]: https://github.com/RenierM26
+[@RobBie1221]: https://github.com/RobBie1221
+[@Schlauer-Hax]: https://github.com/Schlauer-Hax
+[@Shulyaka]: https://github.com/Shulyaka
+[@Shutgun]: https://github.com/Shutgun
+[@Swamp-Ig]: https://github.com/Swamp-Ig
+[@Taraman17]: https://github.com/Taraman17
+[@TheJulianJES]: https://github.com/TheJulianJES
+[@Thomas55555]: https://github.com/Thomas55555
+[@VandeurenGlenn]: https://github.com/VandeurenGlenn
+[@XiaoXianNv-boot]: https://github.com/XiaoXianNv-boot
+[@abmantis]: https://github.com/abmantis
+[@agorecki]: https://github.com/agorecki
+[@alengwenus]: https://github.com/alengwenus
+[@alexandrecuer]: https://github.com/alexandrecuer
+[@alistair23]: https://github.com/alistair23
+[@allenporter]: https://github.com/allenporter
+[@astrandb]: https://github.com/astrandb
+[@aturri]: https://github.com/aturri
+[@autinerd]: https://github.com/autinerd
+[@avee87]: https://github.com/avee87
+[@balloob]: https://github.com/balloob
+[@bdraco]: https://github.com/bdraco
+[@bieniu]: https://github.com/bieniu
+[@bouwew]: https://github.com/bouwew
+[@bramkragten]: https://github.com/bramkragten
+[@brg468]: https://github.com/brg468
+[@c0ffeeca7]: https://github.com/c0ffeeca7
+[@cdce8p]: https://github.com/cdce8p
+[@cdnninja]: https://github.com/cdnninja
+[@chemelli74]: https://github.com/chemelli74
+[@dalanmiller]: https://github.com/dalanmiller
+[@danielvandenberg95]: https://github.com/danielvandenberg95
+[@davidrapan]: https://github.com/davidrapan
+[@edenhaus]: https://github.com/edenhaus
+[@elmurato]: https://github.com/elmurato
+[@emontnemery]: https://github.com/emontnemery
+[@epenet]: https://github.com/epenet
+[@erwindouna]: https://github.com/erwindouna
+[@exciton]: https://github.com/exciton
+[@farmio]: https://github.com/farmio
+[@frenck]: https://github.com/frenck
+[@fvgarrel]: https://github.com/fvgarrel
+[@generically-named]: https://github.com/generically-named
+[@gjohansson-ST]: https://github.com/gjohansson-ST
+[@iMicknl]: https://github.com/iMicknl
+[@ichbinsteffen]: https://github.com/ichbinsteffen
+[@javicalle]: https://github.com/javicalle
+[@jb101010-2]: https://github.com/jb101010-2
+[@jbouwh]: https://github.com/jbouwh
+[@jesserockz]: https://github.com/jesserockz
+[@joostlek]: https://github.com/joostlek
+[@jorisdrenth]: https://github.com/jorisdrenth
+[@jrhillery]: https://github.com/jrhillery
+[@jvmahon]: https://github.com/jvmahon
+[@jz-v]: https://github.com/jz-v
+[@karwosts]: https://github.com/karwosts
+[@lanthaler]: https://github.com/lanthaler
+[@lboue]: https://github.com/lboue
+[@lodesmets]: https://github.com/lodesmets
+[@ludeeus]: https://github.com/ludeeus
+[@marc7s]: https://github.com/marc7s
+[@markhannon]: https://github.com/markhannon
+[@matrixd2]: https://github.com/matrixd2
+[@mback2k]: https://github.com/mback2k
+[@mhannon11]: https://github.com/mhannon11
+[@mib1185]: https://github.com/mib1185
+[@mj23000]: https://github.com/mj23000
+[@mrueg]: https://github.com/mrueg
+[@ol-iver]: https://github.com/ol-iver
+[@pantherale0]: https://github.com/pantherale0
+[@peteS-UK]: https://github.com/peteS-UK
+[@pssc]: https://github.com/pssc
+[@sanjay900]: https://github.com/sanjay900
+[@scop]: https://github.com/scop
+[@silamon]: https://github.com/silamon
+[@starkillerOG]: https://github.com/starkillerOG
+[@tamwahba]: https://github.com/tamwahba
+[@tdfountain]: https://github.com/tdfountain
+[@tedvdb]: https://github.com/tedvdb
+[@thecode]: https://github.com/thecode
+[@tl-sl]: https://github.com/tl-sl
+[@tr4nt0r]: https://github.com/tr4nt0r
+[@tronikos]: https://github.com/tronikos
+[@tsvi]: https://github.com/tsvi
+[@tyriis]: https://github.com/tyriis
+[@ucodery]: https://github.com/ucodery
+[@wilbiev]: https://github.com/wilbiev
+[@wittypluck]: https://github.com/wittypluck
+[@wuede]: https://github.com/wuede
+[@yuxincs]: https://github.com/yuxincs
+[@zerzhang]: https://github.com/zerzhang
+[@zweckj]: https://github.com/zweckj
diff --git a/source/common-tasks/general.markdown b/source/common-tasks/general.markdown
index aa6bd725dbb..13a39e928d6 100644
--- a/source/common-tasks/general.markdown
+++ b/source/common-tasks/general.markdown
@@ -13,11 +13,11 @@ This section provides tasks that do not depend on a specific Home Assistant inst
If you want to define a specific interval at which your device is being polled for data, you can disable the default polling interval and create your own polling automation.
-## What is data polling?
+### What is data polling?
Data polling is the process of querying a device or service at regular intervals to check for updates or retrieve data. By defining a custom polling interval, you can control how frequently your system checks for new data, which can help optimize performance and reduce unnecessary network traffic.
-## Why use an automation instead of changing the integration's polling configuration?
+### Why use an automation instead of changing the integration's polling configuration?
Creating an automation for polling gives you more flexibility on when to poll:
diff --git a/source/common-tasks/os.markdown b/source/common-tasks/os.markdown
index 833a4e851ae..e49b4b6a7be 100644
--- a/source/common-tasks/os.markdown
+++ b/source/common-tasks/os.markdown
@@ -31,7 +31,9 @@ If you have the {% term "Home Assistant Operating System" %} installed, you rece
- {% term "Home Assistant Operating System" %}
- {% term "Home Assistant Supervisor" %}
- {% term "Home Assistant Core" %}
-- Add-ons, if you have any installed
+- {% term "Add-ons" %}, if you have any installed
+
+Each of these components needs to be updated separately.
### Updating the Home Assistant Operating System
@@ -39,8 +41,9 @@ Updates of the {% term "Home Assistant Operating System" %} are independent of o
#### Prerequisites
-- [Backup](/common-tasks/general/#backups) your installation.
- - Make sure the backup is downloaded and stored outside of the system.
+- [Backup your installation](/common-tasks/general/#backups).
+ - Make sure the backup is stored on a [backup location](/common-tasks/general/#defining-backup-locations) outside of the device where Home Assistant is installed.
+ - For example, if Home Assistant is installed on [Home Assistant Green](https://www.home-assistant.io/green), make sure it is stored on [Home Assistant Cloud](/common-tasks/general/#about-the-backup-storage-on-home-assistant-cloud) or another location.
- So that you can [restore from that backup](/common-tasks/general/#restoring-a-backup) in case there is an issue with the system.
#### To update the Home Assistant Operating System
@@ -52,9 +55,16 @@ Updates of the {% term "Home Assistant Operating System" %} are independent of o
1. Open the **Settings** panel.
2. On the top you will be presented with an update notification.
-
- _If you do not see that notification, in the top right, select the three dots menu and select **Check for updates**"._
-
+ - **Troubleshooting**: If you do not see that notification:
+ - In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Check for updates**.
+ - Go to {% my updates title="**System** > **Updates**" %}.
+ - Select the update notification.
+ - Select the cogwheel {% icon "mdi:cog-outline" %}, then set **Visible** to active.
+ 3. Open the notification for the component you want to update.
+ 4. If you want to update the system first (recommended), enable the backup toggle.
+ 5. Select **Update**.
+ 6. Check if there are any repair issues and check the logs to see if there are any issues with your configuration that need to be addressed.
+
- title: Using the CLI
content: |
@@ -66,6 +76,8 @@ Updates of the {% term "Home Assistant Operating System" %} are independent of o
{% endtabbed_block %}
+{% details "Advanced: changing the boot slot used during the update" %}
+
#### About boot slots used during the update
The {% term "Home Assistant Operating System" %} uses two boot slots. On first installation, boot slot A is used. After that, on each Operating System update, the other boot slot is updated and reboot is triggered. On that reboot, the system boots from the other boot slot (A ➝ B ➝ A,...). When booting fails, the system automatically uses the previous boot slot, so that it boots from the last working operating system.
@@ -89,6 +101,8 @@ You can manually define that the previous boot slot is used. This can be useful
Alternatively, if the Operating Systems runs on a platform that uses the GRUB bootloader, a boot menu is presented early in the boot. The alternative boot slot can be selected here, marking it active for future boots if the following boot attempt is successful.
+{% enddetails %}
+
### Updating Home Assistant Core
{% include common-tasks/update.md %}
diff --git a/source/green/index.html b/source/green/index.html
index 794deaf24c8..542d3575c21 100644
--- a/source/green/index.html
+++ b/source/green/index.html
@@ -485,8 +485,7 @@ dark_header: true
- Home Assistant Green is the easiest way to run Home Assistant for the
- low price of $99. Try out Home Assistant for your smart home or share
+ Home Assistant Green is the easiest way to run Home Assistant. Try out Home Assistant for your smart home or share
the love with family and friends.
diff --git a/source/help/index.markdown b/source/help/index.markdown
index b40f41bac77..20e18481d54 100644
--- a/source/help/index.markdown
+++ b/source/help/index.markdown
@@ -18,7 +18,7 @@ There are various ways to get in touch with the Home Assistant community. It doe
Have you found an issue in your Home Assistant installation? Please report it. Reporting it makes it easy to track and ensures that it gets fixed. For more details please refer to [Reporting issues](/help/reporting_issues/) page.
-- [Feature requests](https://community.home-assistant.io/c/feature-requests) (Don't post feature requests in the issue trackers. Thanks!)
+- [Feature requests](https://github.com/orgs/home-assistant/discussions) (Don't post feature requests in the issue trackers. Thanks!)
- [Issue tracker Home Assistant Core](https://github.com/home-assistant/core/issues)
- [Issue tracker Home Assistant Frontend](https://github.com/home-assistant/frontend/issues)
- [Issue tracker Home Assistant Supervisor](https://github.com/home-assistant/supervisor/issues)
diff --git a/source/images/assist/esp32-atom_silence_detection_01.png b/source/images/assist/esp32-atom_silence_detection_01.png
index 1821369c6f8..bcccc6a1fd5 100644
Binary files a/source/images/assist/esp32-atom_silence_detection_01.png and b/source/images/assist/esp32-atom_silence_detection_01.png differ
diff --git a/source/images/blog/2025-06/areas-dashboard.png b/source/images/blog/2025-06/areas-dashboard.png
new file mode 100644
index 00000000000..3931f784bdc
Binary files /dev/null and b/source/images/blog/2025-06/areas-dashboard.png differ
diff --git a/source/images/blog/2025-06/bluetooth-connection-graph.png b/source/images/blog/2025-06/bluetooth-connection-graph.png
new file mode 100644
index 00000000000..b70fe32b920
Binary files /dev/null and b/source/images/blog/2025-06/bluetooth-connection-graph.png differ
diff --git a/source/images/blog/2025-06/group-media-players-from-media-player-card.png b/source/images/blog/2025-06/group-media-players-from-media-player-card.png
new file mode 100644
index 00000000000..542de423566
Binary files /dev/null and b/source/images/blog/2025-06/group-media-players-from-media-player-card.png differ
diff --git a/source/images/blog/2025-06/new-device-picker.png b/source/images/blog/2025-06/new-device-picker.png
new file mode 100644
index 00000000000..70588d96c41
Binary files /dev/null and b/source/images/blog/2025-06/new-device-picker.png differ
diff --git a/source/images/blog/2025-06/reset-entity-id.png b/source/images/blog/2025-06/reset-entity-id.png
new file mode 100644
index 00000000000..ef1417dcc0d
Binary files /dev/null and b/source/images/blog/2025-06/reset-entity-id.png differ
diff --git a/source/images/blog/2025-06/sidebar-customization.png b/source/images/blog/2025-06/sidebar-customization.png
new file mode 100644
index 00000000000..a5d4f978dfc
Binary files /dev/null and b/source/images/blog/2025-06/sidebar-customization.png differ
diff --git a/source/images/blog/2025-06/social.png b/source/images/blog/2025-06/social.png
new file mode 100644
index 00000000000..697d588a3b8
Binary files /dev/null and b/source/images/blog/2025-06/social.png differ
diff --git a/source/images/frontpage/community-day-2025.webp b/source/images/frontpage/community-day-2025.webp
deleted file mode 100644
index 9b70ed29e4e..00000000000
Binary files a/source/images/frontpage/community-day-2025.webp and /dev/null differ
diff --git a/source/images/frontpage/community-meetup.webp b/source/images/frontpage/community-meetup.webp
new file mode 100644
index 00000000000..dd4d039c31c
Binary files /dev/null and b/source/images/frontpage/community-meetup.webp differ
diff --git a/source/installation/troubleshooting.markdown b/source/installation/troubleshooting.markdown
index d857dd4c224..e480fd0c72e 100644
--- a/source/installation/troubleshooting.markdown
+++ b/source/installation/troubleshooting.markdown
@@ -72,7 +72,7 @@ You are in the onboarding procedure, but the process seems stuck at the step **P
### Resolution
-1. Select the pulsing blue dot to view the log files.
+1. Select **Show details** to view the log files.
- The log files might provide more information on the current status.
2. Make sure your network has internet access.
- During first startup, time will be synchronized. Ensure NTP is allowed in your network.
diff --git a/source/more-info/unsupported/lxc.markdown b/source/more-info/unsupported/lxc.markdown
index 4e2c24ea615..e5385dbc0f6 100644
--- a/source/more-info/unsupported/lxc.markdown
+++ b/source/more-info/unsupported/lxc.markdown
@@ -12,4 +12,4 @@ with the Supervisor is not supported.
## The solution
You need to reinstall the host operating system that runs the Supervisor,
-for instructions on how to prosed with that [have a look here](/more-info/unsupported/os).
+for instructions on how to proceed with that [have a look here](/more-info/unsupported/os).
diff --git a/source/voice-pe/index.html b/source/voice-pe/index.html
index d16b2fd2f7f..8f8e9ebd249 100644
--- a/source/voice-pe/index.html
+++ b/source/voice-pe/index.html
@@ -208,7 +208,7 @@ frontpage_image: /images/frontpage/voice-pe-frontpage.jpg
Preview the future of voice for just
-
$59*
+
$69 / €59 *
@@ -217,7 +217,7 @@ frontpage_image: /images/frontpage/voice-pe-frontpage.jpg
alt="Front view of the Voice Preview Edition showing the speaker holes">
Buy now
-
* Recommended MSRP. Pricing subject to individual retailers.
+
* Recommended MSRP. Prices differ between regions due to varying local market costs and conditions, and subject to individual retailers.
diff --git a/source/voice-pe/styles.css b/source/voice-pe/styles.css
index 4f7e836a838..f591f1e456a 100644
--- a/source/voice-pe/styles.css
+++ b/source/voice-pe/styles.css
@@ -174,14 +174,19 @@ article.page h3 {
--subtitle-medium-mobile: 24;
--price: 170;
- --price-mobile: 120;
-
+ --price-mobile: 60;
+
--wrapper-radius: 0px;
-
+
isolation: isolate;
position: relative;
}
+@media only screen and (min-width: 875px) {
+ :root{
+ --price-mobile: 120;
+ }
+}
@media only screen and (min-width: 2180px) {
.vpe-main {
--wrapper-radius: 40px;
@@ -2881,7 +2886,7 @@ section#hero .bg-gradient {
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
- margin-bottom: -20px;
+ margin-bottom: -10px;
display: flex;
margin-top: 8px;
}
@@ -4894,6 +4899,11 @@ section#hero .bg-gradient {
}
}
+@media (min-width: 940px) {
+ .vpe-main #pricing .fs-price {
+ margin-bottom: -10px;
+ }
+}
@media (min-width: 940px) {
.vpe-main {
--columns: 11;
@@ -5190,7 +5200,7 @@ section#hero .bg-gradient {
}
.vpe-main #pricing .fs-price {
- margin-bottom: -26px;
+ margin-bottom: -20px;
margin-top: 20px;
}
diff --git a/source/voice_control/index.markdown b/source/voice_control/index.markdown
index cbdc67b036f..92fd1d894f3 100644
--- a/source/voice_control/index.markdown
+++ b/source/voice_control/index.markdown
@@ -30,7 +30,7 @@ As for the rest of Home Assistant core functionalities, Assist can be personaliz
-## Getting Started
+## Getting started
When you configure voice assistant hardware made for Home Assistant, it will use a wizard to help you configure your system and get started to use voice.
@@ -41,7 +41,7 @@ In case your hardware does not support our wizard, do not worry. Here are two de
- [I plan to process my voice locally](/voice_control/voice_remote_local_assistant/)
- [I plan to use Home Assistant Cloud](/voice_control/voice_remote_cloud_assistant/) (recommended as it is the simplest)
-## Expand and Experiment
+## Expand and experiment
Once your setup is up and running and you follow the [best practices](/voice_control/best_practices), check all the possibilities we found for [Expanding your Assist setup](/voice_control/expanding_assist), and further experiment with different setups like [wake words](/voice_control/about_wake_word/). Do you want to talk to Super Mario? Or another figure? If you want Assist to respond in a fun way, you can create an assistant with an [AI personality](/voice_control/assist_create_open_ai_personality/).
diff --git a/source/voice_control/thirteen-usd-voice-remote.markdown b/source/voice_control/thirteen-usd-voice-remote.markdown
index 6bb74278405..079419eeed9 100644
--- a/source/voice_control/thirteen-usd-voice-remote.markdown
+++ b/source/voice_control/thirteen-usd-voice-remote.markdown
@@ -70,18 +70,15 @@ Before you can use this device with Home Assistant, you need to install a bit of

-6. To add the newly discovered device, select the ATOM Echo from the list.
- - Add your ATOM Echo to a room and select **Finish**.
-7. You should now see the **ESPHome** integration.
- 
-8. Select the **ESPHome** integration. Under **Devices**, you should see the **M5Stack Atom Echo** listed.
- 
- - Your ATOM Echo is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply.
-9. Congratulations! You can now voice control Home Assistant. Now give some commands.
+6. This starts the a wizard to customize the your voice assistant.
+ - Follow the wizard steps to define the wake word and choose the voice.
+ - When you are finished, select **Done**.
+7. Your ATOM Echo is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply.
+8. Congratulations! You can now voice control Home Assistant. Now give some commands.
## Controlling Home Assistant over the ATOM Echo
-1. Say your wake word. For this tutorial, use "OK, Nabu".
+1. Say the wake word you configured. For example, use "OK, Nabu".
- Wait for the LED to start blinking in blue.
2. Say a [supported voice command](/voice_control/builtin_sentences/). For example, *Turn off the light in the kitchen*.
- While you are speaking, the blue LED keeps pulsing.
@@ -93,8 +90,8 @@ Before you can use this device with Home Assistant, you need to install a bit of
3. Your command is not supported? Add your own commands using [a sentence trigger](/voice_control/custom_sentences/).
4. You find ATOM Echo takes too long to start processing your command?
- Adjust the silence detection settings.
- - Go to {% my integrations title="**Settings** > **Devices & Services**" %} and select the **ESPHome** integration.
- - Under **M5Stack ATOM Echo**, select **1 device**. Under **Configuration**, change the **Finish speaking detection**.
+ - Go to {% my integrations title="**Settings** > **Devices & services**" %} and select the **ESPHome** integration.
+ - Under **M5Stack ATOM Echo**, select **1 device**. Under **Configuration**, change the **Finished speaking detection**.
- This setting defines how much silence is needed for Assist to find you're done speaking and it can start processing your command.

@@ -104,3 +101,21 @@ Before you can use this device with Home Assistant, you need to install a bit of
Are things not working as expected?
- Checkout the [general troubleshooting section for Assist](/voice_control/troubleshooting/).
+
+## Removing the Wi-Fi credentials from the ATOM Echo
+
+If you no longer use the device or want to pass it on to someone else, you can remove the Wi-Fi credentials that are stored on the device.
+
+1. Make sure this page is opened in a Chromium-based browser on a desktop. It does not work on a tablet or phone.
+ - Select the **Connect** button below. If your browser does not support web serial, you will see a warning instead of a button.
+
+
+
+
+2. To connect the ATOM Echo to your computer, follow these steps:
+ - In the pop-up window, view the available ports.
+ - Plug the USB-C cable into the ATOM Echo and connect it to your computer.
+ - In the pop-up window, there should now appear a new entry. Select this USB serial port and select **Connect**.
+3. In the dialog, select **Erase user data**.
+ - **Result**: Your Wi-Fi credentials are deleted from the device.
+ - The firmware stays on the device.