diff --git a/.textlintrc.json b/.textlintrc.json
index 623a2d0aaf7..c24a0d15072 100644
--- a/.textlintrc.json
+++ b/.textlintrc.json
@@ -1,6 +1,20 @@
{
"filters": {
- "comments": true
+ "comments": true,
+ "allowlist": {
+ "allow": [
+ "2fa:",
+ "alexa:",
+ "homeassistant:",
+ "homekit:",
+ "led:",
+ "sms:",
+ "sql:",
+ "ssl:",
+ "twitter:",
+ "url:"
+ ]
+ }
},
"rules": {
"common-misspellings": {
diff --git a/CODEOWNERS b/CODEOWNERS
index 09fabe80486..a5aeb9093e1 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -37,11 +37,11 @@ source/_integrations/airvisual_pro.markdown @bachya
source/_integrations/airzone.markdown @Noltari
source/_integrations/airzone_cloud.markdown @Noltari
source/_integrations/alarm_control_panel.markdown @home-assistant/core
-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/alexa_devices.markdown @chemelli74
+source/_integrations/altruist.markdown @airalab @LoSk-p
source/_integrations/amazon_polly.markdown @jschlyter
source/_integrations/amberelectric.markdown @madpilot
source/_integrations/ambient_network.markdown @thomaskistler
@@ -174,7 +174,6 @@ source/_integrations/cookidoo.markdown @miaucl
source/_integrations/coolmaster.markdown @OnFreund
source/_integrations/counter.markdown @fabaff
source/_integrations/cover.markdown @home-assistant/core
-source/_integrations/cover.template.markdown @home-assistant/core
source/_integrations/cozytouch.markdown @imicknl
source/_integrations/cpuspeed.markdown @fabaff
source/_integrations/cribl.markdown @Bre77
@@ -193,7 +192,7 @@ source/_integrations/delmarva.markdown @tronikos
source/_integrations/deluge.markdown @tkdrob
source/_integrations/demo.markdown @home-assistant/core
source/_integrations/denonavr.markdown @ol-iver @starkillerOG
-source/_integrations/derivative.markdown @afaucogney
+source/_integrations/derivative.markdown @afaucogney @karwosts
source/_integrations/devialet.markdown @fwestenberg
source/_integrations/device_automation.markdown @home-assistant/core
source/_integrations/device_tracker.markdown @home-assistant/core
@@ -225,6 +224,7 @@ source/_integrations/duotecno.markdown @cereal2nd
source/_integrations/duquesne_light.markdown @tronikos
source/_integrations/dwd_weather_warnings.markdown @runningman84 @stephan192 @andarotajo
source/_integrations/dynalite.markdown @ziv1234
+source/_integrations/eafm.markdown @Jc2k
source/_integrations/eastron.markdown @DCSBL
source/_integrations/easyenergy.markdown @klaasnicolaas
source/_integrations/ecoforest.markdown @pjanuario
@@ -273,7 +273,6 @@ source/_integrations/evohome.markdown @zxdavb
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
source/_integrations/fastdotcom.markdown @rohankapoorcom @erwindouna
source/_integrations/feedreader.markdown @mib1185
source/_integrations/fibaro.markdown @rappenze
@@ -438,6 +437,7 @@ source/_integrations/iotawatt.markdown @gtdiehl @jyavenard
source/_integrations/iotty.markdown @shapournemati-iotty
source/_integrations/iperf3.markdown @rohankapoorcom
source/_integrations/ipma.markdown @dgomes
+source/_integrations/ipp.markdown @ctalkington
source/_integrations/iqvia.markdown @bachya
source/_integrations/irish_rail_transport.markdown @ttroy50
source/_integrations/iron_os.markdown @tr4nt0r
@@ -496,10 +496,10 @@ source/_integrations/lg_thinq.markdown @LG-ThinQ-Integration
source/_integrations/lidarr.markdown @tkdrob
source/_integrations/lifx.markdown @Djelibeybi
source/_integrations/light.markdown @home-assistant/core
-source/_integrations/light.template.markdown @home-assistant/core
source/_integrations/linak.markdown @abmantis
source/_integrations/linear_garage_door.markdown @IceBotYT
source/_integrations/linkedgo.markdown @balloob @bieniu @thecode @chemelli74 @bdraco
+source/_integrations/linkplay.markdown @Velleman
source/_integrations/linux_battery.markdown @fabaff
source/_integrations/linx.markdown @starkillerOG
source/_integrations/litejet.markdown @joncar
@@ -509,7 +509,6 @@ source/_integrations/local_calendar.markdown @allenporter
source/_integrations/local_ip.markdown @issacg
source/_integrations/local_todo.markdown @allenporter
source/_integrations/lock.markdown @home-assistant/core
-source/_integrations/lock.template.markdown @home-assistant/core
source/_integrations/logbook.markdown @home-assistant/core
source/_integrations/logger.markdown @home-assistant/core
source/_integrations/london_underground.markdown @jpbede
@@ -573,6 +572,7 @@ source/_integrations/motion_blinds.markdown @starkillerOG
source/_integrations/motionblinds_ble.markdown @LennP @jerrybboy
source/_integrations/motionblinds_matter.markdown @home-assistant/matter
source/_integrations/motioneye.markdown @dermotduffy
+source/_integrations/motionmount.markdown @laiho-vogels
source/_integrations/mqtt.markdown @emontnemery @jbouwh @bdraco
source/_integrations/msteams.markdown @peroyvind
source/_integrations/mullvad.markdown @meichthys
@@ -683,6 +683,7 @@ source/_integrations/ping.markdown @jpbede
source/_integrations/piper.markdown @balloob @synesthesiam
source/_integrations/pitsos.markdown @DavidMStraub @Diegorro98 @MartinHjelmare
source/_integrations/plaato.markdown @JohNan
+source/_integrations/playstation_network.markdown @jackjpowell @tr4nt0r
source/_integrations/plex.markdown @jjlawren
source/_integrations/plugwise.markdown @CoMPaTech @bouwew
source/_integrations/plum_lightpad.markdown @ColinHarrington @prystupa
@@ -743,7 +744,7 @@ source/_integrations/recovery_mode.markdown @home-assistant/core
source/_integrations/refoss.markdown @ashionky
source/_integrations/rehlko.markdown @bdraco @peterager
source/_integrations/remote.markdown @home-assistant/core
-source/_integrations/remote_calendar.markdown @Thomas55555
+source/_integrations/remote_calendar.markdown @Thomas55555 @allenporter
source/_integrations/renault.markdown @epenet
source/_integrations/renson.markdown @jimmyd-be
source/_integrations/reolink.markdown @starkillerOG
@@ -807,7 +808,6 @@ source/_integrations/sfr_box.markdown @epenet
source/_integrations/sharkiq.markdown @JeffResc @funkybunch
source/_integrations/shell_command.markdown @home-assistant/core
source/_integrations/shelly.markdown @balloob @bieniu @thecode @chemelli74 @bdraco
-source/_integrations/shelly_zwave.markdown @home-assistant/z-wave
source/_integrations/shodan.markdown @fabaff
source/_integrations/sia.markdown @eavanvalkenburg
source/_integrations/siemens.markdown @DavidMStraub @Diegorro98 @MartinHjelmare
@@ -841,7 +841,6 @@ source/_integrations/smarttub.markdown @mdz
source/_integrations/smarty.markdown @z0mbieprocess
source/_integrations/smhi.markdown @gjohansson-ST
source/_integrations/smlight.markdown @tl-sl
-source/_integrations/sms.markdown @ocalvo
source/_integrations/smud.markdown @tronikos
source/_integrations/snapcast.markdown @luar123
source/_integrations/snmp.markdown @nmaggioni
@@ -882,7 +881,6 @@ source/_integrations/swepco.markdown @tronikos
source/_integrations/swiss_hydrological_data.markdown @fabaff
source/_integrations/swiss_public_transport.markdown @fabaff @miaucl
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 @zerzhang
@@ -907,6 +905,7 @@ source/_integrations/tasmota.markdown @emontnemery
source/_integrations/tautulli.markdown @ludeeus @tkdrob
source/_integrations/technove.markdown @Moustachauve
source/_integrations/tedee.markdown @patrickhilker @zweckj
+source/_integrations/telegram_bot.markdown @hanwg
source/_integrations/tellduslive.markdown @fredrike
source/_integrations/template.markdown @Petro31 @home-assistant/core
source/_integrations/tesla_fleet.markdown @Bre77
@@ -972,9 +971,9 @@ source/_integrations/usgs_earthquakes_feed.markdown @exxamalte
source/_integrations/utility_meter.markdown @dgomes
source/_integrations/v2c.markdown @dgomes
source/_integrations/vacuum.markdown @home-assistant/core
-source/_integrations/vacuum.template.markdown @home-assistant/core
source/_integrations/vallox.markdown @andre-richter @slovdahl @viiru- @yozik04
source/_integrations/valve.markdown @home-assistant/core
+source/_integrations/vegehub.markdown @ghowevege
source/_integrations/velbus.markdown @Cereal2nd @brefra
source/_integrations/velux.markdown @Julius2342 @DeerMaximum @pawlizio
source/_integrations/venstar.markdown @garbled1 @jhollowe
@@ -1003,7 +1002,6 @@ source/_integrations/watson_tts.markdown @rutkai
source/_integrations/watttime.markdown @bachya
source/_integrations/waze_travel_time.markdown @eifinger
source/_integrations/weather.markdown @home-assistant/core
-source/_integrations/weather.template.markdown @home-assistant/core
source/_integrations/weatherflow.markdown @natekspencer @jeeftor
source/_integrations/weatherflow_cloud.markdown @jeeftor
source/_integrations/weatherkit.markdown @tjhorner
diff --git a/Gemfile.lock b/Gemfile.lock
index fb440a48e01..e0890044666 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -159,7 +159,7 @@ GEM
rack-protection (= 4.1.1)
rack-session (>= 2.0.0, < 3)
tilt (~> 2.0)
- sorbet-runtime (0.5.12201)
+ sorbet-runtime (0.5.12216)
stringex (2.8.6)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
diff --git a/_config.yml b/_config.yml
index 77e7d604eb1..3fa452b033f 100644
--- a/_config.yml
+++ b/_config.yml
@@ -107,9 +107,9 @@ social:
# Home Assistant release details
current_major_version: 2025
-current_minor_version: 6
-current_patch_version: 3
-date_released: 2025-06-24
+current_minor_version: 7
+current_patch_version: 0
+date_released: 2025-07-02
# 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 afe61b34772..3beb48835c4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,25 +20,24 @@
"remark-lint-prohibited-strings": "^4.0.0",
"remark-lint-unordered-list-marker-style": "^4.0.1",
"remark-stringify": "^11.0.0",
- "textlint": "^15.0.1",
+ "textlint": "^15.1.0",
+ "textlint-filter-rule-allowlist": "^4.0.0",
"textlint-filter-rule-comments": "^1.2.2",
"textlint-rule-common-misspellings": "^1.0.1",
- "textlint-rule-terminology": "^5.0.13"
+ "textlint-rule-terminology": "^5.2.13"
}
},
"node_modules/@azu/format-text": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz",
"integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==",
- "dev": true,
- "license": "BSD-3-Clause"
+ "dev": true
},
"node_modules/@azu/style-format": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz",
"integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==",
"dev": true,
- "license": "WTFPL",
"dependencies": {
"@azu/format-text": "^1.0.1"
}
@@ -271,76 +270,70 @@
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-13.4.1.tgz",
"integrity": "sha512-qrZyhCh8Ekk6nwArx3BROybm9BnX6vF7VcZbijetV/OM3yfS4rTYhoMWISmhVEP2H2re0CtWEyMl/XF+WdvVLQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@textlint/ast-tester": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-15.0.1.tgz",
- "integrity": "sha512-rPWRFMn8CtOJS6kubBv5IIs/TjPxoueeP7VuWSw7UFsf4lVQtBi8KvkVXEqA8k0AnQE6e8K9hEaKGxeTQsrpRg==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-15.1.0.tgz",
+ "integrity": "sha512-/CF1FssZt2lA7kmgT59bcQoM48cF0MiSfpvoChIGvZTRurzeHEVMZN+cmQNHQxCiYi4IRYSCWtnwHhNeIyZVfA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "15.0.1",
+ "@textlint/ast-node-types": "15.1.0",
"debug": "^4.4.1"
}
},
"node_modules/@textlint/ast-tester/node_modules/@textlint/ast-node-types": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.0.1.tgz",
- "integrity": "sha512-e93SMkYpyHsAy62UDfOm3P91M/6Lm4akVfYd7cGqsAW8VjvGeJTEuo1kDJxlddOrck3WWid8h8KwGPCBbHfRBg==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.1.0.tgz",
+ "integrity": "sha512-R7laalVk8drfbHDrbRNRHXibmqQLB+s3mVgb2lWliivNrylX1oviz+vB9TT5SRur6PIEJJ54L4WV3gBlJETB5Q==",
+ "dev": true
},
"node_modules/@textlint/ast-traverse": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-15.0.1.tgz",
- "integrity": "sha512-xslCOzIUd2ZYWYrkyrNLiU7Tq7VpvqnJOUaeN60FHQfN4uQTcmm7JQPbbv9BTRkD3E/tuWhKR14gm+f0FPRRYg==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-15.1.0.tgz",
+ "integrity": "sha512-303pqxfT4B6nwN7pwF0Hr+/glI1S0lL8GHgUVjo+U5JSGilmsL4/UXK+dEpkFjrdah3Lne/233/fEbvWPgLnmQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "15.0.1"
+ "@textlint/ast-node-types": "15.1.0"
}
},
"node_modules/@textlint/ast-traverse/node_modules/@textlint/ast-node-types": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.0.1.tgz",
- "integrity": "sha512-e93SMkYpyHsAy62UDfOm3P91M/6Lm4akVfYd7cGqsAW8VjvGeJTEuo1kDJxlddOrck3WWid8h8KwGPCBbHfRBg==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.1.0.tgz",
+ "integrity": "sha512-R7laalVk8drfbHDrbRNRHXibmqQLB+s3mVgb2lWliivNrylX1oviz+vB9TT5SRur6PIEJJ54L4WV3gBlJETB5Q==",
+ "dev": true
},
"node_modules/@textlint/config-loader": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-15.0.1.tgz",
- "integrity": "sha512-K2Ly59lMIYt9ygo1QS5i6iskF7AdSts/d4O4TH9a62KJ/ymUO22suW0qKaXm2Gv6oO3rh1LAECxPNPDBAIVKHg==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-15.1.0.tgz",
+ "integrity": "sha512-QrMNa5Rk4Ji1gDr5UY5jD4+1aOp68kUow0DBy68J43u+w8MtfesU8Gskz4EbGf4l5VRt74Ncnh7HBGMqiSTddQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/kernel": "15.0.1",
- "@textlint/module-interop": "15.0.1",
- "@textlint/resolver": "15.0.0",
- "@textlint/types": "15.0.1",
- "@textlint/utils": "15.0.1",
+ "@textlint/kernel": "15.1.0",
+ "@textlint/module-interop": "15.1.0",
+ "@textlint/resolver": "15.1.0",
+ "@textlint/types": "15.1.0",
+ "@textlint/utils": "15.1.0",
"debug": "^4.4.1",
"rc-config-loader": "^4.1.3"
}
},
"node_modules/@textlint/feature-flag": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-15.0.1.tgz",
- "integrity": "sha512-4eAoh1viI0dukpqL+Zi2X+Vti7/K6Tho+sE9Fv2yQTTXlDc8A7Xmgdvyzkbz6GXNKLEWf6N9VzBQGK9YPRPqnQ==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-15.1.0.tgz",
+ "integrity": "sha512-di4POvizQWGMTfaX8s7Tz3bDNtNT5yn0oox2MVbxBNTzKKD5zMYAfGQWWOiWBulnNPqwpPGtWC3z8OvzjJGHnA==",
+ "dev": true
},
"node_modules/@textlint/fixer-formatter": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-15.0.1.tgz",
- "integrity": "sha512-PbZxLcVDrcb3YDjRfSKgJrJtgJboQXaUAx8Mo0h6TKRWv8rGaUyFoIgxEAM2sTTG2wMlrphVFFJieouhZwNx5Q==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-15.1.0.tgz",
+ "integrity": "sha512-OOGjMMtB44TcURwz7jo7SqEfUSjXbCdcCNyXT187zPV9IFDstYXET+4NG1CQDON0Xe2TLJlRr5zcuVwjPvWk2A==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/module-interop": "15.0.1",
- "@textlint/resolver": "15.0.0",
- "@textlint/types": "15.0.1",
+ "@textlint/module-interop": "15.1.0",
+ "@textlint/resolver": "15.1.0",
+ "@textlint/types": "15.1.0",
"chalk": "^4.1.2",
"debug": "^4.4.1",
"diff": "^5.2.0",
@@ -349,44 +342,47 @@
"text-table": "^0.2.0"
}
},
+ "node_modules/@textlint/get-config-base-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@textlint/get-config-base-dir/-/get-config-base-dir-2.0.0.tgz",
+ "integrity": "sha512-J3cG1pl2llYD4ZaZMe0qVgVaHT8RvT+/SW1FHQ8HRceNalMM9O0Y8iIgtl4GGOx4vMghoIPKFVLASw8P8bJ3ZA==",
+ "dev": true
+ },
"node_modules/@textlint/kernel": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-15.0.1.tgz",
- "integrity": "sha512-JgyRwMzU483AtzjXxVWpMxoThUJLBSaMHJqJ9EzzAthI4c4qPb5Vb9silwDryWXrFQvOCL2uCnVBCKoChzdhHw==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-15.1.0.tgz",
+ "integrity": "sha512-D5yAchuZSqoU+NP3/lLaZBwKkOJe9ga+WMB5Tvhzw+FMLQrUYox4zLHFTHsuI2PdV04qRtLh4zGuHnVQCZZnpw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "15.0.1",
- "@textlint/ast-tester": "15.0.1",
- "@textlint/ast-traverse": "15.0.1",
- "@textlint/feature-flag": "15.0.1",
- "@textlint/source-code-fixer": "15.0.1",
- "@textlint/types": "15.0.1",
- "@textlint/utils": "15.0.1",
+ "@textlint/ast-node-types": "15.1.0",
+ "@textlint/ast-tester": "15.1.0",
+ "@textlint/ast-traverse": "15.1.0",
+ "@textlint/feature-flag": "15.1.0",
+ "@textlint/source-code-fixer": "15.1.0",
+ "@textlint/types": "15.1.0",
+ "@textlint/utils": "15.1.0",
"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": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.0.1.tgz",
- "integrity": "sha512-e93SMkYpyHsAy62UDfOm3P91M/6Lm4akVfYd7cGqsAW8VjvGeJTEuo1kDJxlddOrck3WWid8h8KwGPCBbHfRBg==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.1.0.tgz",
+ "integrity": "sha512-R7laalVk8drfbHDrbRNRHXibmqQLB+s3mVgb2lWliivNrylX1oviz+vB9TT5SRur6PIEJJ54L4WV3gBlJETB5Q==",
+ "dev": true
},
"node_modules/@textlint/linter-formatter": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.0.1.tgz",
- "integrity": "sha512-iDj8d4vi9h7zC/k4X5NgyNA+rt25fonR2enNT7Xsur+L5Dv5dI5RPSc+N6ORhHwhg0d9nsB1YM6uf5CPI1QDrw==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.1.0.tgz",
+ "integrity": "sha512-5IPC64Q7fBq1VepmjEd2w0MMc4BMlnlfURktuVWDErddCueJ2jord6fcjZBbXi8c8RybRCMQzK21j/NjbGJwVg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@azu/format-text": "^1.0.2",
"@azu/style-format": "^1.0.1",
- "@textlint/module-interop": "15.0.1",
- "@textlint/resolver": "15.0.0",
- "@textlint/types": "15.0.1",
+ "@textlint/module-interop": "15.1.0",
+ "@textlint/resolver": "15.1.0",
+ "@textlint/types": "15.1.0",
"chalk": "^4.1.2",
"debug": "^4.4.1",
"js-yaml": "^3.14.1",
@@ -399,13 +395,12 @@
}
},
"node_modules/@textlint/markdown-to-ast": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-15.0.1.tgz",
- "integrity": "sha512-78p2a2TEln71sFd3eWlNX9ZJekaLC1YiuAec4Ixo3jMCh5t29AS35FdW1ZNF1iHBXjhvkyKW30TquQWkNwfTuw==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-15.1.0.tgz",
+ "integrity": "sha512-BmkMknfh13Cu6OkchU3cOK+cAgrvnHdAWe0uSra9IPm65kchb4qDDNZbIwmy/QGHKQ3olasX6w5qe5OvhzdEmg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "15.0.1",
+ "@textlint/ast-node-types": "15.1.0",
"debug": "^4.4.1",
"mdast-util-gfm-autolink-literal": "^0.1.3",
"neotraverse": "^0.6.18",
@@ -418,18 +413,16 @@
}
},
"node_modules/@textlint/markdown-to-ast/node_modules/@textlint/ast-node-types": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.0.1.tgz",
- "integrity": "sha512-e93SMkYpyHsAy62UDfOm3P91M/6Lm4akVfYd7cGqsAW8VjvGeJTEuo1kDJxlddOrck3WWid8h8KwGPCBbHfRBg==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.1.0.tgz",
+ "integrity": "sha512-R7laalVk8drfbHDrbRNRHXibmqQLB+s3mVgb2lWliivNrylX1oviz+vB9TT5SRur6PIEJJ54L4WV3gBlJETB5Q==",
+ "dev": true
},
"node_modules/@textlint/markdown-to-ast/node_modules/bail": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
"integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -440,7 +433,6 @@
"resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
"integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"format": "^0.2.0"
},
@@ -468,7 +460,6 @@
"url": "https://feross.org/support"
}
],
- "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -478,7 +469,6 @@
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
"integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -488,7 +478,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
"integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-to-string": "^2.0.0",
@@ -506,7 +495,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz",
"integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"micromark-extension-frontmatter": "^0.2.0"
},
@@ -520,7 +508,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
"integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -541,7 +528,6 @@
"url": "https://opencollective.com/unified"
}
],
- "license": "MIT",
"dependencies": {
"debug": "^4.0.0",
"parse-entities": "^2.0.0"
@@ -552,7 +538,6 @@
"resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz",
"integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"fault": "^1.0.0"
},
@@ -566,7 +551,6 @@
"resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz",
"integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mdast-util-frontmatter": "^0.2.0",
"micromark-extension-frontmatter": "^0.2.0"
@@ -581,7 +565,6 @@
"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
"integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mdast-util-from-markdown": "^0.8.0"
},
@@ -595,7 +578,6 @@
"resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
"integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -606,7 +588,6 @@
"resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
"integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"bail": "^1.0.0",
"extend": "^3.0.0",
@@ -625,7 +606,6 @@
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
"integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.2"
},
@@ -639,7 +619,6 @@
"resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
"integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"is-buffer": "^2.0.0",
@@ -656,7 +635,6 @@
"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
"integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"unist-util-stringify-position": "^2.0.0"
@@ -667,92 +645,105 @@
}
},
"node_modules/@textlint/module-interop": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.0.1.tgz",
- "integrity": "sha512-4c+JjJB8+TrGwIiaf6JNPUIQXVGLfh6si9pEnb6pkgaJKM3bxFiUZrnAvUxrUeJYYyPAM/s+kMO0m2NIoKdYaA==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.1.0.tgz",
+ "integrity": "sha512-qdGmYW/IYEUhOvuQj+KoPM33l8oSp60ltUZTiAXm0Jy1dU1DxO/H8XuM/6PwrI1SZ7D5L6e4M0a/9oRDNjwHvA==",
+ "dev": true
+ },
+ "node_modules/@textlint/regexp-string-matcher": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@textlint/regexp-string-matcher/-/regexp-string-matcher-1.1.1.tgz",
+ "integrity": "sha512-rrNUCKGKYBrZALotSF8D5A8xD05VHX6kxv0BP805Ig2M73Ha6LK+de31+ZocGm4CO+sikVFYyMCPPJhp7bCXcw==",
"dev": true,
- "license": "MIT"
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0",
+ "execall": "^2.0.0",
+ "lodash.sortby": "^4.7.0",
+ "lodash.uniq": "^4.5.0",
+ "lodash.uniqwith": "^4.5.0",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "node_modules/@textlint/regexp-string-matcher/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
"node_modules/@textlint/resolver": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.0.0.tgz",
- "integrity": "sha512-Ju3JHL6zDexGQlFpgDePwz+wEakMrMf5S6zrrm/PkxLxa70XUiCD8XndX7tWnzVHjnbjwHzzB4IbVEFY2eT7gQ==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.1.0.tgz",
+ "integrity": "sha512-JRLC8QFNRVg/xyd8ckOB3ymkD837+5P8Aq2NWxWjlqdlTqKyMLxgNh6GkJzI/mOOr7dVkH8wzC6EsBgk7XRY8Q==",
+ "dev": true
},
"node_modules/@textlint/source-code-fixer": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-15.0.1.tgz",
- "integrity": "sha512-yHAo6fXzB90RWrnCBTSXRrcp+heV9+yVebRLsLlex4CtCmF0eZNL574z/SnY7oT78Dxp8rzvv1NASFOSKDvYBg==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-15.1.0.tgz",
+ "integrity": "sha512-UMuo2y7I96OOO1gxXcSvOfH81BuWUG7VN6BLdSfUCrW9960dbjREMdZwD5tq91VkobEZwfgFOcWGghhXOHunLw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/types": "15.0.1",
+ "@textlint/types": "15.1.0",
"debug": "^4.4.1"
}
},
"node_modules/@textlint/text-to-ast": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-15.0.1.tgz",
- "integrity": "sha512-ZPGpN9c6/5bvBf5DZifDrSjF2b51zwlLR4l9CtBTSisxLV7dMgm06zLlgrsk7ic44P8hvDRz0T31zD59CC0dYQ==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-15.1.0.tgz",
+ "integrity": "sha512-P0KW0f+7iZDN1bR2eYjvrhOIe85ksOwMn76hbgiE6ur8A7ApUOShmEFgABKUOpdzXQcYW8fU+2ocdC7np5oPEw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "15.0.1"
+ "@textlint/ast-node-types": "15.1.0"
}
},
"node_modules/@textlint/text-to-ast/node_modules/@textlint/ast-node-types": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.0.1.tgz",
- "integrity": "sha512-e93SMkYpyHsAy62UDfOm3P91M/6Lm4akVfYd7cGqsAW8VjvGeJTEuo1kDJxlddOrck3WWid8h8KwGPCBbHfRBg==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.1.0.tgz",
+ "integrity": "sha512-R7laalVk8drfbHDrbRNRHXibmqQLB+s3mVgb2lWliivNrylX1oviz+vB9TT5SRur6PIEJJ54L4WV3gBlJETB5Q==",
+ "dev": true
},
"node_modules/@textlint/textlint-plugin-markdown": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-15.0.1.tgz",
- "integrity": "sha512-otvlCqjd3PMaEryh1sP/zQ4Cawi8Zj9iKFUWJiJF/rgf2wuMNBABg36HfglLJpgFxGM7yDgX4mJzM6aYUEzcCQ==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-15.1.0.tgz",
+ "integrity": "sha512-n5oqSZNTSs6lTI7G2GGXWNqxI9y1RWv6WKa1llFUJQ+2AX0NK0ERjjRRfXxrgxhH7sHD6cn6CSP/+UUQPsTzFg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/markdown-to-ast": "15.0.1",
- "@textlint/types": "15.0.1"
+ "@textlint/markdown-to-ast": "15.1.0",
+ "@textlint/types": "15.1.0"
}
},
"node_modules/@textlint/textlint-plugin-text": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-15.0.1.tgz",
- "integrity": "sha512-ha+L6gx0Q8V8ZghT1EzVeqnrWxWY5NBcIfc0nfGF/m5XiFGpwbausyE1HefpfjOJC0BFJgSUZ/PGDYJeow+uWw==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-15.1.0.tgz",
+ "integrity": "sha512-dAwDUTREjIERhr+zw0WiEymcqlCVzSnKGhsXDDmaE+QIdjheOz5WqVP5A6PKh6lFRjU6rTv8GVDuFecrZXibkQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/text-to-ast": "15.0.1",
- "@textlint/types": "15.0.1"
+ "@textlint/text-to-ast": "15.1.0",
+ "@textlint/types": "15.1.0"
}
},
"node_modules/@textlint/types": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.0.1.tgz",
- "integrity": "sha512-ACekqqM0TCUw+PtTsiXkjigCSYWHut9ZKXpJ0t6IvTVBABgGDz+jLhTkUp1scrMFSJhYKNrWLVAxPV7ukoSVgw==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.1.0.tgz",
+ "integrity": "sha512-cRCGwb0DoCn4UPTDnmYJhAlRNKDKln3lOkwRNphNiDrV9ToD9IBTbkFz9maVK21xKo0HfsMkvoPk6bRGm7NQNQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "15.0.1"
+ "@textlint/ast-node-types": "15.1.0"
}
},
"node_modules/@textlint/types/node_modules/@textlint/ast-node-types": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.0.1.tgz",
- "integrity": "sha512-e93SMkYpyHsAy62UDfOm3P91M/6Lm4akVfYd7cGqsAW8VjvGeJTEuo1kDJxlddOrck3WWid8h8KwGPCBbHfRBg==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.1.0.tgz",
+ "integrity": "sha512-R7laalVk8drfbHDrbRNRHXibmqQLB+s3mVgb2lWliivNrylX1oviz+vB9TT5SRur6PIEJJ54L4WV3gBlJETB5Q==",
+ "dev": true
},
"node_modules/@textlint/utils": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-15.0.1.tgz",
- "integrity": "sha512-W1FreIILp3TZ9//7hULI+QiWwdQvK6/WVpdvniFU85JIg9yZUJ3oOSGAVl4hSvc64qqRiYWYc7Ng8xAXNFA7hQ==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-15.1.0.tgz",
+ "integrity": "sha512-gSmMshUh9y+M3w5IgndFQq8D1wWVkM6Id+lAnJCCcVXMTGEYGMMCTVsM9TVJ+usBET6s1EjJRl0JQjFTfwNPuw==",
+ "dev": true
},
"node_modules/@types/concat-stream": {
"version": "2.0.0",
@@ -807,7 +798,6 @@
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
"integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/unist": "^2"
}
@@ -937,17 +927,24 @@
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"sprintf-js": "~1.0.2"
}
},
+ "node_modules/assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -1125,7 +1122,6 @@
"resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
"integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -1136,7 +1132,6 @@
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -1173,7 +1168,6 @@
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
"integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -1184,7 +1178,6 @@
"resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
"integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -1241,6 +1234,18 @@
"node": ">=8"
}
},
+ "node_modules/clone-regexp": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
+ "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==",
+ "dev": true,
+ "dependencies": {
+ "is-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/collapse-white-space": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
@@ -1413,6 +1418,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -1450,7 +1468,6 @@
"resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
"integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
"dev": true,
- "license": "BSD-3-Clause",
"engines": {
"node": ">=0.3.1"
}
@@ -1553,7 +1570,6 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -1566,7 +1582,6 @@
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true,
- "license": "BSD-2-Clause",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
@@ -1608,6 +1623,18 @@
"node": ">=18.0.0"
}
},
+ "node_modules/execall": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz",
+ "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==",
+ "dev": true,
+ "dependencies": {
+ "clone-regexp": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/express": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
@@ -1673,6 +1700,19 @@
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
+ "node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+ "dev": true,
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -1684,8 +1724,7 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz",
"integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
@@ -1715,8 +1754,7 @@
"type": "opencollective",
"url": "https://opencollective.com/fastify"
}
- ],
- "license": "BSD-3-Clause"
+ ]
},
"node_modules/fault": {
"version": "2.0.1",
@@ -1941,7 +1979,6 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -2110,12 +2147,23 @@
"node": ">= 0.10"
}
},
+ "node_modules/is-accessor-descriptor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+ "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "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",
"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2126,7 +2174,6 @@
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
"integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"is-alphabetical": "^1.0.0",
"is-decimal": "^1.0.0"
@@ -2160,23 +2207,59 @@
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"dev": true
},
+ "node_modules/is-data-descriptor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+ "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/is-decimal": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
"integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/is-descriptor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
+ "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/is-empty": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz",
"integrity": "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==",
"dev": true
},
+ "node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -2212,7 +2295,6 @@
"resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
"integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2239,6 +2321,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-promise": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
@@ -2246,12 +2340,30 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/is-regexp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
+ "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/jackspeak": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.3.tgz",
@@ -2282,7 +2394,6 @@
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -2382,12 +2493,29 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+ "dev": true
+ },
"node_modules/lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
"integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true
+ },
+ "node_modules/lodash.uniqwith": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz",
+ "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==",
+ "dev": true
},
"node_modules/longest-streak": {
"version": "3.1.0",
@@ -2423,7 +2551,6 @@
"resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
"integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"repeat-string": "^1.0.0"
},
@@ -2481,7 +2608,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz",
"integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"escape-string-regexp": "^4.0.0",
"unist-util-is": "^4.0.0",
@@ -2497,7 +2623,6 @@
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
"integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -2508,7 +2633,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz",
"integrity": "sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mdast-util-to-markdown": "^0.6.0",
"micromark": "~2.11.0"
@@ -2523,7 +2647,6 @@
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
"integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2534,7 +2657,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
"integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"longest-streak": "^2.0.0",
@@ -2553,7 +2675,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
"integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -2574,7 +2695,6 @@
"url": "https://opencollective.com/unified"
}
],
- "license": "MIT",
"dependencies": {
"debug": "^4.0.0",
"parse-entities": "^2.0.0"
@@ -2585,7 +2705,6 @@
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
"integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2693,7 +2812,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz",
"integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mdast-util-gfm-autolink-literal": "^0.1.0",
"mdast-util-gfm-strikethrough": "^0.2.0",
@@ -2711,7 +2829,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz",
"integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ccount": "^1.0.0",
"mdast-util-find-and-replace": "^1.1.0",
@@ -2737,7 +2854,6 @@
"url": "https://opencollective.com/unified"
}
],
- "license": "MIT",
"dependencies": {
"debug": "^4.0.0",
"parse-entities": "^2.0.0"
@@ -2748,7 +2864,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz",
"integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mdast-util-to-markdown": "^0.6.0"
},
@@ -2762,7 +2877,6 @@
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
"integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2773,7 +2887,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
"integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"longest-streak": "^2.0.0",
@@ -2792,7 +2905,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
"integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -2803,7 +2915,6 @@
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
"integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2814,7 +2925,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz",
"integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"markdown-table": "^2.0.0",
"mdast-util-to-markdown": "~0.6.0"
@@ -2829,7 +2939,6 @@
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
"integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2840,7 +2949,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
"integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"longest-streak": "^2.0.0",
@@ -2859,7 +2967,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
"integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -2870,7 +2977,6 @@
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
"integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2881,7 +2987,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz",
"integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mdast-util-to-markdown": "~0.6.0"
},
@@ -2895,7 +3000,6 @@
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
"integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2906,7 +3010,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
"integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"longest-streak": "^2.0.0",
@@ -2925,7 +3028,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
"integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -2936,7 +3038,6 @@
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
"integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2947,7 +3048,6 @@
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
"integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -2958,7 +3058,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
"integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"longest-streak": "^2.0.0",
@@ -2977,7 +3076,6 @@
"resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
"integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -2988,7 +3086,6 @@
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
"integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -3466,7 +3563,6 @@
"resolved": "https://registry.npmjs.org/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz",
"integrity": "sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"micromark": "~2.11.0"
},
@@ -3490,7 +3586,6 @@
"url": "https://opencollective.com/unified"
}
],
- "license": "MIT",
"dependencies": {
"debug": "^4.0.0",
"parse-entities": "^2.0.0"
@@ -3517,7 +3612,6 @@
"resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz",
"integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"micromark": "~2.11.0",
"micromark-extension-gfm-autolink-literal": "~0.5.0",
@@ -3536,7 +3630,6 @@
"resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz",
"integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"micromark": "~2.11.3"
},
@@ -3560,7 +3653,6 @@
"url": "https://opencollective.com/unified"
}
],
- "license": "MIT",
"dependencies": {
"debug": "^4.0.0",
"parse-entities": "^2.0.0"
@@ -3571,7 +3663,6 @@
"resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz",
"integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"micromark": "~2.11.0"
},
@@ -3595,7 +3686,6 @@
"url": "https://opencollective.com/unified"
}
],
- "license": "MIT",
"dependencies": {
"debug": "^4.0.0",
"parse-entities": "^2.0.0"
@@ -3606,7 +3696,6 @@
"resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz",
"integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"micromark": "~2.11.0"
},
@@ -3630,7 +3719,6 @@
"url": "https://opencollective.com/unified"
}
],
- "license": "MIT",
"dependencies": {
"debug": "^4.0.0",
"parse-entities": "^2.0.0"
@@ -3641,7 +3729,6 @@
"resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz",
"integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -3652,7 +3739,6 @@
"resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz",
"integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"micromark": "~2.11.0"
},
@@ -3676,7 +3762,6 @@
"url": "https://opencollective.com/unified"
}
],
- "license": "MIT",
"dependencies": {
"debug": "^4.0.0",
"parse-entities": "^2.0.0"
@@ -3697,7 +3782,6 @@
"url": "https://opencollective.com/unified"
}
],
- "license": "MIT",
"dependencies": {
"debug": "^4.0.0",
"parse-entities": "^2.0.0"
@@ -4156,7 +4240,6 @@
"resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz",
"integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 10"
}
@@ -4284,7 +4367,6 @@
"resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
"integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"character-entities": "^1.0.0",
"character-entities-legacy": "^1.0.0",
@@ -4303,7 +4385,6 @@
"resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
"integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
"dev": true,
- "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -4424,8 +4505,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz",
"integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/prelude-ls": {
"version": "1.2.1",
@@ -4527,7 +4607,6 @@
"resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz",
"integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"debug": "^4.3.4",
"js-yaml": "^4.1.0",
@@ -4539,15 +4618,13 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
+ "dev": true
},
"node_modules/rc-config-loader/node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
@@ -4658,6 +4735,19 @@
"node": ">=8.10.0"
}
},
+ "node_modules/regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/remark": {
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz",
@@ -4698,7 +4788,6 @@
"resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz",
"integrity": "sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mdast-util-footnote": "^0.1.0",
"micromark-extension-footnote": "^0.3.0"
@@ -4805,7 +4894,6 @@
"resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz",
"integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mdast-util-gfm": "^0.1.0",
"micromark-extension-gfm": "^0.3.0"
@@ -6182,7 +6270,6 @@
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.10"
}
@@ -6192,11 +6279,19 @@
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
"node_modules/router": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
@@ -6234,6 +6329,15 @@
}
]
},
+ "node_modules/safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+ "dev": true,
+ "dependencies": {
+ "ret": "~0.1.10"
+ }
+ },
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -6414,7 +6518,6 @@
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"astral-regex": "^2.0.0",
@@ -6477,8 +6580,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true,
- "license": "BSD-3-Clause"
+ "dev": true
},
"node_modules/statuses": {
"version": "2.0.2",
@@ -6578,12 +6680,13 @@
}
},
"node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.2.tgz",
+ "integrity": "sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -6603,7 +6706,6 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -6616,7 +6718,6 @@
"resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
"integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
"ajv": "^8.0.1",
"lodash.truncate": "^4.4.2",
@@ -6633,7 +6734,6 @@
"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",
@@ -6649,8 +6749,7 @@
"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"
+ "dev": true
},
"node_modules/text-table": {
"version": "0.2.0",
@@ -6659,26 +6758,25 @@
"dev": true
},
"node_modules/textlint": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/textlint/-/textlint-15.0.1.tgz",
- "integrity": "sha512-blIt0neiiCwa0DI/iGUqP+2oNeWm5rVxzL27Pj/wxSmmupcRICXlQSwHWXXsZdke0C696qVF4lT/cqJ5n83llA==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/textlint/-/textlint-15.1.0.tgz",
+ "integrity": "sha512-dwWHX5FyqRkF9wt6sG7ACjFZWkBWyRie/u6qEMa8j2afu+SKfIX3Xiy/fE6WyBrT6S3HuRbfPpcLik/PTKDWQA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@modelcontextprotocol/sdk": "^1.12.3",
- "@textlint/ast-node-types": "15.0.1",
- "@textlint/ast-traverse": "15.0.1",
- "@textlint/config-loader": "15.0.1",
- "@textlint/feature-flag": "15.0.1",
- "@textlint/fixer-formatter": "15.0.1",
- "@textlint/kernel": "15.0.1",
- "@textlint/linter-formatter": "15.0.1",
- "@textlint/module-interop": "15.0.1",
- "@textlint/resolver": "15.0.0",
- "@textlint/textlint-plugin-markdown": "15.0.1",
- "@textlint/textlint-plugin-text": "15.0.1",
- "@textlint/types": "15.0.1",
- "@textlint/utils": "15.0.1",
+ "@modelcontextprotocol/sdk": "^1.13.0",
+ "@textlint/ast-node-types": "15.1.0",
+ "@textlint/ast-traverse": "15.1.0",
+ "@textlint/config-loader": "15.1.0",
+ "@textlint/feature-flag": "15.1.0",
+ "@textlint/fixer-formatter": "15.1.0",
+ "@textlint/kernel": "15.1.0",
+ "@textlint/linter-formatter": "15.1.0",
+ "@textlint/module-interop": "15.1.0",
+ "@textlint/resolver": "15.1.0",
+ "@textlint/textlint-plugin-markdown": "15.1.0",
+ "@textlint/textlint-plugin-text": "15.1.0",
+ "@textlint/types": "15.1.0",
+ "@textlint/utils": "15.1.0",
"debug": "^4.4.1",
"file-entry-cache": "^10.1.1",
"glob": "^10.4.5",
@@ -6690,7 +6788,7 @@
"read-package-up": "^11.0.0",
"structured-source": "^4.0.0",
"unique-concat": "^0.2.2",
- "zod": "^3.25.64"
+ "zod": "^3.25.67"
},
"bin": {
"textlint": "bin/textlint.js"
@@ -6699,6 +6797,45 @@
"node": ">=20.0.0"
}
},
+ "node_modules/textlint-filter-rule-allowlist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/textlint-filter-rule-allowlist/-/textlint-filter-rule-allowlist-4.0.0.tgz",
+ "integrity": "sha512-rOlWr12sff9ZS8mOtRACPB3l1yK0oW21Owz8XsTAgFWmRhOnBbCKw8tKMDm6EtQHO92SOfyJmT4nowxiJ85Qiw==",
+ "dev": true,
+ "dependencies": {
+ "@textlint/ast-node-types": "^12.0.0",
+ "@textlint/get-config-base-dir": "^2.0.0",
+ "@textlint/regexp-string-matcher": "^1.1.0",
+ "js-yaml": "^4.1.0"
+ },
+ "peerDependencies": {
+ "textlint": ">= 9.0.0"
+ }
+ },
+ "node_modules/textlint-filter-rule-allowlist/node_modules/@textlint/ast-node-types": {
+ "version": "12.6.1",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-12.6.1.tgz",
+ "integrity": "sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA==",
+ "dev": true
+ },
+ "node_modules/textlint-filter-rule-allowlist/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/textlint-filter-rule-allowlist/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
"node_modules/textlint-filter-rule-comments": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/textlint-filter-rule-comments/-/textlint-filter-rule-comments-1.2.2.tgz",
@@ -6752,61 +6889,37 @@
}
},
"node_modules/textlint-rule-terminology": {
- "version": "5.0.13",
- "resolved": "https://registry.npmjs.org/textlint-rule-terminology/-/textlint-rule-terminology-5.0.13.tgz",
- "integrity": "sha512-1LONlbrn0fRhz/eCWPrnrxc5nz07NDjLLa4yiPm/hMtn/4Gi11R0lHbVgl+Ux6l8NC/a/NS5f6zQkJqqWy5bMw==",
+ "version": "5.2.13",
+ "resolved": "https://registry.npmjs.org/textlint-rule-terminology/-/textlint-rule-terminology-5.2.13.tgz",
+ "integrity": "sha512-NHCjVue34iP8P+zko39hut0iJ/sc8QfsSSqSOvWHuRZWIt6jUoQrpkfGdRNTkzN++l2uv9qBIhtRPkYv25LY8w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "lodash": "^4.17.15",
- "strip-json-comments": "^3.0.1",
- "textlint-rule-helper": "^2.1.1"
+ "lodash": "^4.17.21",
+ "strip-json-comments": "^5.0.1",
+ "textlint-rule-helper": "^2.3.1"
},
"engines": {
"node": ">=20"
}
},
"node_modules/textlint-rule-terminology/node_modules/textlint-rule-helper": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.0.tgz",
- "integrity": "sha512-Ug78Saahb/qVImttL0NSFyT5/JJ5wXvOPepR2pYAjNi54BsQAAz/hAyyEgKuYeR0+yjFb0KPhby4f880X5vqHA==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz",
+ "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@textlint/ast-node-types": "^13.0.2",
+ "@textlint/ast-node-types": "^13.4.1",
"structured-source": "^4.0.0",
"unist-util-visit": "^2.0.3"
}
},
- "node_modules/textlint-rule-terminology/node_modules/unist-util-is": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
- "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/textlint-rule-terminology/node_modules/unist-util-visit": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
- "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
- "dev": true,
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
"node_modules/textlint/node_modules/@textlint/ast-node-types": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.0.1.tgz",
- "integrity": "sha512-e93SMkYpyHsAy62UDfOm3P91M/6Lm4akVfYd7cGqsAW8VjvGeJTEuo1kDJxlddOrck3WWid8h8KwGPCBbHfRBg==",
- "dev": true,
- "license": "MIT"
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.1.0.tgz",
+ "integrity": "sha512-R7laalVk8drfbHDrbRNRHXibmqQLB+s3mVgb2lWliivNrylX1oviz+vB9TT5SRur6PIEJJ54L4WV3gBlJETB5Q==",
+ "dev": true
},
"node_modules/textlint/node_modules/brace-expansion": {
"version": "2.0.1",
@@ -6867,6 +6980,21 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -7444,6 +7572,22 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/unist-util-visit": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
+ "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^4.0.0",
+ "unist-util-visit-parents": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/unist-util-visit-parents": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
@@ -7468,6 +7612,17 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/unist-util-visit/node_modules/unist-util-is": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
+ "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
diff --git a/package.json b/package.json
index b98e68f8dcb..33d7dd824bb 100644
--- a/package.json
+++ b/package.json
@@ -15,10 +15,11 @@
"remark-lint-prohibited-strings": "^4.0.0",
"remark-lint-unordered-list-marker-style": "^4.0.1",
"remark-stringify": "^11.0.0",
- "textlint": "^15.0.1",
+ "textlint": "^15.1.0",
+ "textlint-filter-rule-allowlist": "^4.0.0",
"textlint-filter-rule-comments": "^1.2.2",
"textlint-rule-common-misspellings": "^1.0.1",
- "textlint-rule-terminology": "^5.0.13"
+ "textlint-rule-terminology": "^5.2.13"
},
"resolutions": {
"minimist": ">=1.2.5"
diff --git a/source/_dashboards/light.markdown b/source/_dashboards/light.markdown
index 006bb3ccc82..55c78f601f8 100644
--- a/source/_dashboards/light.markdown
+++ b/source/_dashboards/light.markdown
@@ -2,7 +2,7 @@
type: card
title: "Light card"
sidebar_label: Light
-description: "The light card allows you to change the brightness of the light."
+description: "The light card allows you to change the brightness of a light."
related:
- docs: /dashboards/actions/
title: Card actions
@@ -12,7 +12,7 @@ related:
title: Dashboard cards
---
-The light card allows you to change the brightness of the light.
+The light card allows you to change the brightness of a light.
diff --git a/source/_dashboards/sensor.markdown b/source/_dashboards/sensor.markdown
index ae181701ce7..8536531bac8 100644
--- a/source/_dashboards/sensor.markdown
+++ b/source/_dashboards/sensor.markdown
@@ -2,7 +2,7 @@
type: card
title: "Sensor card"
sidebar_label: Sensor
-description: "The sensor card gives you a quick overview of your sensors state with an optional graph to visualize change over time."
+description: "The sensor card gives you a quick overview of a sensor's state with an optional graph to visualize change over time."
related:
- docs: /integrations/frontend/
title: Themes
@@ -10,7 +10,7 @@ related:
title: Dashboard cards
---
-The sensor card gives you a quick overview of your sensors state with an optional graph to visualize change over time.
+The sensor card gives you a quick overview of a sensor's state with an optional graph to visualize change over time.
diff --git a/source/_dashboards/tile.markdown b/source/_dashboards/tile.markdown
index f64909d7e11..7974ecaa559 100644
--- a/source/_dashboards/tile.markdown
+++ b/source/_dashboards/tile.markdown
@@ -2,7 +2,7 @@
type: card
title: "Tile card"
sidebar_label: Tile
-description: "The tile card gives you a quick overview of your entity. The card allows you to toggle the entity, show the more-info dialog, or custom actions."
+description: "The tile card gives you a quick overview of an entity. The card allows you to toggle the entity, show the more-info dialog, or custom actions."
related:
- docs: /dashboards/actions/
title: Card actions
@@ -12,7 +12,7 @@ related:
title: Dashboard cards
---
-The tile card gives you a quick overview of your {% term entity %}. The card allows you to add tap actions, and features to control the entity. You can also select the {% term entity %} to open the more info dialog. A badge is shown for some {% term entities %} like the [climate](/integrations/climate) or [person](/integrations/person) {% term entities %}.
+The tile card gives you a quick overview of an {% term entity %}. The card allows you to add tap actions, and features to control the entity. You can also select the {% term entity %} to open the more info dialog. A badge is shown for some {% term entities %} like the [climate](/integrations/climate) or [person](/integrations/person) {% term entities %}.
diff --git a/source/_dashboards/weather-forecast.markdown b/source/_dashboards/weather-forecast.markdown
index 1f9b40edb8e..3079773a75b 100644
--- a/source/_dashboards/weather-forecast.markdown
+++ b/source/_dashboards/weather-forecast.markdown
@@ -61,6 +61,11 @@ name:
description: Overwrites the friendly name.
type: string
default: Entity name
+show_current:
+ required: false
+ description: Show the current weather conditions above the forecast.
+ type: boolean
+ default: true
show_forecast:
required: false
description: Show next hours/days forecast.
@@ -70,7 +75,6 @@ forecast_type:
required: true
description: Type of forecast to display, one of `daily`, `hourly` or `twice_daily`.
type: string
- default: Automatically selects in order of `daily`, `hourly` and `twice_daily`.
secondary_info_attribute:
required: false
description: Which attribute to display under the temperature.
diff --git a/source/_docs/backend/database.markdown b/source/_docs/backend/database.markdown
index 99b2e064797..365be9fa6a9 100644
--- a/source/_docs/backend/database.markdown
+++ b/source/_docs/backend/database.markdown
@@ -74,7 +74,7 @@ CREATE TABLE statistics_meta (
unit_of_measurement VARCHAR(255),
has_mean BOOLEAN,
has_sum BOOLEAN,
- name VARCHAR(255),
+ name VARCHAR(255), mean_type INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (id)
)
@@ -87,14 +87,6 @@ CREATE TABLE recorder_runs (
PRIMARY KEY (run_id)
)
-CREATE TABLE migration_changes (
- migration_id VARCHAR(255) NOT NULL,
- version SMALLINT NOT NULL,
- PRIMARY KEY (migration_id)
-)
-
-
-
CREATE TABLE schema_changes (
change_id INTEGER NOT NULL,
schema_version INTEGER,
@@ -137,7 +129,6 @@ CREATE TABLE states (
event_id SMALLINT,
last_changed CHAR(0),
last_changed_ts FLOAT,
- last_reported_ts FLOAT,
last_updated CHAR(0),
last_updated_ts FLOAT,
old_state_id INTEGER,
@@ -149,7 +140,7 @@ CREATE TABLE states (
context_id_bin BLOB,
context_user_id_bin BLOB,
context_parent_id_bin BLOB,
- metadata_id INTEGER,
+ metadata_id INTEGER, last_reported_ts FLOAT,
PRIMARY KEY (state_id),
FOREIGN KEY(old_state_id) REFERENCES states (state_id),
FOREIGN KEY(attributes_id) REFERENCES state_attributes (attributes_id),
@@ -169,7 +160,7 @@ CREATE TABLE statistics (
last_reset CHAR(0),
last_reset_ts FLOAT,
state FLOAT,
- sum FLOAT,
+ sum FLOAT, mean_weight FLOAT,
PRIMARY KEY (id),
FOREIGN KEY(metadata_id) REFERENCES statistics_meta (id) ON DELETE CASCADE
)
@@ -187,7 +178,7 @@ CREATE TABLE statistics_short_term (
last_reset CHAR(0),
last_reset_ts FLOAT,
state FLOAT,
- sum FLOAT,
+ sum FLOAT, mean_weight FLOAT,
PRIMARY KEY (id),
FOREIGN KEY(metadata_id) REFERENCES statistics_meta (id) ON DELETE CASCADE
)
@@ -212,27 +203,33 @@ CREATE INDEX ix_events_data_id ON events (data_id)
CREATE INDEX ix_events_event_type_id_time_fired_ts ON events (event_type_id, time_fired_ts)
-CREATE INDEX ix_events_context_id_bin ON events (context_id_bin)
-
CREATE INDEX ix_events_time_fired_ts ON events (time_fired_ts)
+CREATE INDEX ix_events_context_id_bin ON events (context_id_bin)
+
+CREATE INDEX ix_states_context_id_bin ON states (context_id_bin)
+
CREATE INDEX ix_states_attributes_id ON states (attributes_id)
+CREATE INDEX ix_states_last_updated_ts ON states (last_updated_ts)
+
CREATE INDEX ix_states_metadata_id_last_updated_ts ON states (metadata_id, last_updated_ts)
CREATE INDEX ix_states_old_state_id ON states (old_state_id)
-CREATE INDEX ix_states_context_id_bin ON states (context_id_bin)
-
-CREATE INDEX ix_states_last_updated_ts ON states (last_updated_ts)
+CREATE INDEX ix_statistics_start_ts ON statistics (start_ts)
CREATE UNIQUE INDEX ix_statistics_statistic_id_start_ts ON statistics (metadata_id, start_ts)
-CREATE INDEX ix_statistics_start_ts ON statistics (start_ts)
+CREATE UNIQUE INDEX ix_statistics_short_term_statistic_id_start_ts ON statistics_short_term (metadata_id, start_ts)
CREATE INDEX ix_statistics_short_term_start_ts ON statistics_short_term (start_ts)
-CREATE UNIQUE INDEX ix_statistics_short_term_statistic_id_start_ts ON statistics_short_term (metadata_id, start_ts)
+CREATE TABLE migration_changes (
+ migration_id VARCHAR(255) NOT NULL,
+ version SMALLINT NOT NULL,
+ PRIMARY KEY (migration_id)
+)
```
To only show the details about the `states` table (since we are using that one in the next examples):
diff --git a/source/_integrations/adguard.markdown b/source/_integrations/adguard.markdown
index dbb2537c60b..b02b55667b6 100644
--- a/source/_integrations/adguard.markdown
+++ b/source/_integrations/adguard.markdown
@@ -9,7 +9,7 @@ ha_release: 0.95
ha_iot_class: Local Polling
ha_config_flow: true
ha_codeowners:
- - '@frenck'
+ - "@frenck"
ha_domain: adguard
ha_platforms:
- sensor
@@ -17,15 +17,38 @@ ha_platforms:
ha_integration_type: service
---
-AdGuard Home is a network-wide DNS server that supports ad, tracker,
-and adult content blocking. The **AdGuard** integration allows you to control and
-monitor your AdGuard Home instance in Home Assistant.
+The **AdGuard Home** {% term integration %} allows you to control and monitor your [AdGuard Home](https://adguard.com/adguard-home/overview.html) instance in Home Assistant.
+
+AdGuard Home is a network-wide software for blocking advertisements and tracking. It provides DNS-level protection, automatically covering all home devices without requiring client-side software. When you use AdGuard Home as your DNS server, it blocks advertisements, trackers, and malicious domains for all devices on your network.
+
+## Prerequisites
+
+Before setting up the AdGuard Home integration, ensure you have:
+
+1. AdGuard Home installed and running on your network
+2. The IP address or hostname of your AdGuard Home instance
+3. Admin access to AdGuard Home
{% include integrations/config_flow.md %}
-## Sensors
+{% configuration_basic %}
+Host:
+ description: "The IP address or hostname of your AdGuard Home instance. For example: `192.168.1.100` or `adguard.local`."
+Port:
+ description: "The port AdGuard Home is running on. Default is `3000` for the web interface."
+Username:
+ description: "Your AdGuard Home admin username."
+Password:
+ description: "Your AdGuard Home admin password."
+Verify SSL certificate:
+ description: "Enable SSL certificate verification when connecting via HTTPS."
+{% endconfiguration_basic %}
-This integration provides {% term sensors %} for the following information from AdGuard Home:
+## Supported functionality
+
+### Sensors
+
+This integration provides sensors for the following information from AdGuard Home:
- Number of DNS queries.
- Number of blocked DNS queries.
@@ -36,77 +59,193 @@ This integration provides {% term sensors %} for the following information from
- Total number of active filter rules loaded.
- Average response time of AdGuard's DNS server in milliseconds.
-## Switches
+### Switches
-The integration will create a number of switches:
+The integration provides switches to control AdGuard Home features:
-- AdGuard Protection (master switch).
-- Filtering.
-- Safe Browsing.
-- Parental Control.
-- Safe Search.
-- Query Log.
+- **AdGuard protection**: Master switch that controls all AdGuard features
+- **Filtering**: Enables DNS filtering using blocklists
+- **Safe browsing**: Blocks known phishing and malware sites
+- **Parental control**: Blocks adult content
+- **Safe search**: Enforces safe search on search engines
+- **Query log**: Records DNS queries for statistics
-These switches allow you to automate things easily. For example, one could
-write an automation to turn off Safe Search after the kids' bedtime.
+These switches enable powerful automations. For example, you could automatically enable parental controls during school hours or disable ad blocking for specific time periods.
-The "AdGuard Protection" switch is a master switch. It will turn off and
-bypass all AdGuard features, regardless of whether they are switched on or not.
+The **AdGuard protection** switch acts as a master control. When turned off, it bypasses all AdGuard features regardless of individual switch states.
{% important %}
-Turning off Query Log will result in all sensors not receiving updates anymore.
-AdGuard relies on Query Log to provide stats.
+Turning off **Query log** stops all sensor updates. AdGuard requires query logging to provide statistics.
{% endimportant %}
## Actions
-These {% term actions %} allow one to manage filter subscriptions in AdGuard Home.
-Using these actions in automations could be helpful to block certain
-sites/domains at certain times.
+The integration provides {% term actions %} to manage filter subscriptions in AdGuard Home. Use these actions in automations to dynamically control content filtering based on time, presence, or other conditions.
-For example, you could create a custom filter list that blocks social media sites
-during the day and releases them during the evening.
+For example, you could create automations that:
-### Action `add_url`
+- Block social media during work hours
+- Enable strict filtering when guests connect to your network
+- Temporarily disable filtering for specific downloads
-Add a new filter subscription to AdGuard Home.
+### Action `adguard.add_url`
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | ------------------------------------------------------------ |
-| `name` | No | The name of the filter subscription. |
-| `url` | No | The filter URL to subscribe to, containing the filter rules. |
+Adds a new filter subscription to AdGuard Home.
-### Action `remove_url`
+| Data attribute | Optional | Description |
+| -------------- | -------- | --------------------------------------------- |
+| `name` | No | The name of the filter subscription |
+| `url` | No | The filter list URL containing blocking rules |
+
+### Action `adguard.remove_url`
Removes a filter subscription from AdGuard Home.
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | -------------------------------------- |
-| `url` | No | The filter subscription URL to remove. |
+| Data attribute | Optional | Description |
+| -------------- | -------- | ------------------------------------- |
+| `url` | No | The filter subscription URL to remove |
-### Action `enable_url`
+### Action `adguard.enable_url`
-Enables a filter subscription in AdGuard Home.
+Enables a previously disabled filter subscription.
+
+| Data attribute | Optional | Description |
+| -------------- | -------- | ------------------------------------- |
+| `url` | No | The filter subscription URL to enable |
+
+### Action `adguard.disable_url`
+
+Temporarily disables a filter subscription without removing it.
| Data attribute | Optional | Description |
-| ---------------------- | -------- | -------------------------------------- |
-| `url` | No | The filter subscription URL to enable. |
+| -------------- | -------- | -------------------------------------- |
+| `url` | No | The filter subscription URL to disable |
-### Action `disable_url`
+### Action `adguard.refresh`
-Disables a filter subscription in AdGuard Home.
+Refreshes all filter subscriptions to get the latest blocking rules.
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | --------------------------------------- |
-| `url` | No | The filter subscription URL to disable. |
+| Data attribute | Optional | Description |
+| -------------- | -------- | ----------------------------------------------- |
+| `force` | Yes | Force update (bypasses AdGuard Home throttling) |
-### Action `refresh`
+By default, `force` is `false`. AdGuard Home normally throttles filter updates to reduce server load. Use forced updates sparingly.
-Refresh all filter subscriptions in AdGuard Home.
+## Examples
-| Data attribute | Optional | Description |
-| ---------------------- | -------- | ------------------------------------------------- |
-| `force` | Yes | Force update (bypasses AdGuard Home throttling). |
+### Block social media during work hours
-By default, `force` is set to `false`. Forcing an update bypasses AdGuard Home's
-throttling logic, so use with care.
+This automation blocks social media sites during business hours:
+
+```yaml
+automation:
+ - alias: "Block social media during work"
+ triggers:
+ - trigger: time
+ at: "09:00:00"
+ actions:
+ - action: adguard.add_url
+ data:
+ name: "Social media blocklist"
+ url: "https://raw.githubusercontent.com/example/social-media-blocklist/main/list.txt"
+ - action: adguard.refresh
+
+ - alias: "Unblock social media after work"
+ triggers:
+ - trigger: time
+ at: "17:00:00"
+ actions:
+ - action: adguard.remove_url
+ data:
+ url: "https://raw.githubusercontent.com/example/social-media-blocklist/main/list.txt"
+```
+
+### Enable strict filtering when guests arrive
+
+Automatically enable all protection features when guests connect to your network:
+
+```yaml
+automation:
+ - alias: "Enable strict filtering for guests"
+ triggers:
+ - trigger: state
+ entity_id: group.guest_devices
+ from: "not_home"
+ to: "home"
+ actions:
+ - action: switch.turn_on
+ target:
+ entity_id:
+ - switch.adguard_parental_control
+ - switch.adguard_safe_browsing
+ - switch.adguard_safe_search
+```
+
+### Monitor DNS performance
+
+Send a notification if DNS response time exceeds threshold:
+
+{% raw %}
+
+```yaml
+automation:
+ - alias: "Alert on slow DNS"
+ triggers:
+ - trigger: numeric_state
+ entity_id: sensor.adguard_average_processing_speed
+ above: 50
+ actions:
+ - action: notify.mobile_app
+ data:
+ title: "DNS Performance Alert"
+ message: "AdGuard DNS response time is {{ states('sensor.adguard_average_processing_speed') }}ms"
+```
+
+{% endraw %}
+
+
+## Data updates
+
+The AdGuard Home integration polls for updates every 10 seconds to provide near real-time statistics and ensure switch states remain synchronized.
+
+## Troubleshooting
+
+### Integration fails to connect
+
+#### Symptom: "Cannot connect to AdGuard Home"
+
+When setting up the integration, you receive a connection error.
+
+##### Resolution
+
+1. Verify AdGuard Home is running:
+
+ - Access the AdGuard Home web interface at `http://YOUR_IP:3000`.
+ - Check the service status on your server.
+
+2. Check network connectivity:
+
+ - Ensure Home Assistant can reach the AdGuard Home instance.
+ - Verify no firewall rules block port 3000.
+
+3. Confirm credentials:
+ - Test login via the AdGuard Home web interface.
+ - Ensure you're using admin credentials.
+
+### Sensors show unavailable
+
+If sensors display as unavailable:
+
+1. Check that **Query log** switch is enabled.
+2. Verify AdGuard Home is processing DNS queries.
+3. Ensure at least one device uses AdGuard Home as DNS server.
+
+### Actions fail with "Filter URL not found"
+
+This error occurs when trying to enable, disable, or remove a non-existent filter URL. Verify the exact URL using the AdGuard Home web interface under **Filters** > **DNS blocklists**.
+
+## Removing the integration
+
+This integration follows standard integration removal. After removal, your AdGuard Home instance continues running with its current configuration.
+
+{% include integrations/remove_device_service.md %}
diff --git a/source/_integrations/airthings.markdown b/source/_integrations/airthings.markdown
index 16e27c13b6b..efa56cfd300 100644
--- a/source/_integrations/airthings.markdown
+++ b/source/_integrations/airthings.markdown
@@ -46,3 +46,10 @@ Upon saving the settings, you will be presented with a generated id and secret.
The Airthings integration can now be activated using the generated id and secret that you have just created.
{% include integrations/config_flow.md %}
+
+## Troubleshooting
+
+
+### The radon sensor does not show up
+
+Initially, the radon sensor may not be published by the Airthings API (at device startup, the value is considered "unknown"), and so you may have to wait for the radon sensor to appear for a new device.
diff --git a/source/_integrations/alexa.intent.markdown b/source/_integrations/alexa.intent.markdown
index ed36cb24646..49ad4fe2817 100644
--- a/source/_integrations/alexa.intent.markdown
+++ b/source/_integrations/alexa.intent.markdown
@@ -65,7 +65,7 @@ Next you need to create a Lambda function.
- **US West (Oregon)** region for Japanese and English (AU) skills.
- Click `Functions` in the left navigation bar, display list of your Lambda functions.
- Click `Create function`, select `Author from scratch`, then input a `Function name`.
-- Select *Python 3.* as `Runtime` (Python 3.9 was available at this time).
+- Select `Python 3.x` as the `Runtime` (choose the latest available Python 3 version).
- Select *Use an existing role* as `Execution role`, then select the role you just created from the `Existing role` list.
- Click `Create function`, then you can configure the details of the Lambda function.
- Under the `Configuration` tab, expand `Designer`, then click on `+ Add trigger` in the left part of the panel and select `Alexa Skills Kit` from the dropdown list to add an Alexa Skills Kit trigger to your Lambda function.
diff --git a/source/_integrations/alexa.smart_home.markdown b/source/_integrations/alexa.smart_home.markdown
index 01be1469774..1579315f2ee 100644
--- a/source/_integrations/alexa.smart_home.markdown
+++ b/source/_integrations/alexa.smart_home.markdown
@@ -157,7 +157,7 @@ Next you need create a Lambda function.
- Click `Functions` in the left navigation bar, to display the list of your Lambda functions.
- Click `Create function`, select `Author from scratch`, then input a `Function name`.
-- Select *Python 3.9*, *Python 3.8* or *Python 3.7* as `Runtime`.
+- Select `Python 3.x` as the `Runtime` (choose the latest available Python 3 version).
- Expand the `Change default execution role` dropdown and make sure to select *Use an existing role* as `Execution role`, then select the role you just created from `Existing role` list.
- Click `Create function`, then you can configure the details of Lambda function.
- Expand the `Function overview` (if it isn't already expanded), then click `+ Add trigger` in the left part of the panel, then click `Alexa Smart Home` from the drop down list to add an Alexa Smart Home trigger to your Lambda function.
diff --git a/source/_integrations/alexa_devices.markdown b/source/_integrations/alexa_devices.markdown
index 6de20197979..c49c7b40a99 100644
--- a/source/_integrations/alexa_devices.markdown
+++ b/source/_integrations/alexa_devices.markdown
@@ -14,6 +14,7 @@ ha_codeowners:
ha_iot_class: Cloud Polling
ha_platforms:
- binary_sensor
+ - diagnostics
- notify
- sensor
- switch
@@ -84,29 +85,6 @@ automation:
entity_id: notify.echo_dot_livingroom_announce
```
-### Automation: Start Radio on all Echo dots
-
-```yaml
-automation:
-- alias: Start Radio B.B.C.
- id: "start_radio_bbc"
- trigger:
- - platform: sun
- event: sunset
- condition:
- conditions:
- - alias: "condition alias (home)"
- condition: state
- entity_id: group.person_family
- state: "home"
- action:
- - action: notify.send_message
- data:
- message: Play B.B.C. on Tunein
- target:
- entity_id: notify.everywhere_announce
-```
-
## Data updates
This integration {% term polling polls %} data from the device every 30 seconds by default.
diff --git a/source/_integrations/altruist.markdown b/source/_integrations/altruist.markdown
index bb427546b94..838aabd4f45 100644
--- a/source/_integrations/altruist.markdown
+++ b/source/_integrations/altruist.markdown
@@ -15,6 +15,7 @@ ha_platforms:
- sensor
ha_integration_type: device
ha_zeroconf: true
+ha_quality_scale: bronze
---
The **Altruist** {% term integration %} connects Home Assistant to [Air Quality Sensor “Altruist“](https://robonomics.network/devices/altruist/) — a device designed for decentralized environmental monitoring. It captures noise, dust, and temperature data from the sensor over HTTP, making it available as locally usable entities within Home Assistant.
diff --git a/source/_integrations/androidtv_remote.markdown b/source/_integrations/androidtv_remote.markdown
index f5be3626215..a1a0fe40951 100644
--- a/source/_integrations/androidtv_remote.markdown
+++ b/source/_integrations/androidtv_remote.markdown
@@ -156,7 +156,7 @@ media_player:
## Remote
-The remote allows you to send key commands to your Android TV device with the `remote.send_command` action.
+The remote allows you to send key commands and text as input to your Android TV device with the `remote.send_command` action.
The entity has the `current_activity` attribute that shows the current foreground app on the Android TV.
You can pass the application ID shown in this `current_activity` as `activity` in the `remote.turn_on` action to launch that app.
@@ -242,6 +242,8 @@ Other:
{% enddetails %}
+To send text as keyboard input use the `remote.send_command` and prefix the text to send with `text:`, e.g. `command: text:hello world` to type "hello world" in the selected input field.
+
If `activity` is specified in `remote.turn_on` it will open the specified URL or the application with the given package name. See [Launching apps section](#launching-apps).
Example actions:
@@ -265,6 +267,15 @@ target:
entity_id: remote.living_room_tv
```
+```yaml
+# Send "Never Gonna Give You Up" as keyboard input text to the selected input field
+action: remote.send_command
+data:
+ command: text:Never Gonna Give You Up
+target:
+ entity_id: remote.living_room_tv
+```
+
```yaml
# Launch YouTube
action: remote.turn_on
diff --git a/source/_integrations/assist_satellite.markdown b/source/_integrations/assist_satellite.markdown
index 16e20de302a..f9873249f7b 100644
--- a/source/_integrations/assist_satellite.markdown
+++ b/source/_integrations/assist_satellite.markdown
@@ -239,4 +239,3 @@ actions:
```
{% endraw %}
-
diff --git a/source/_integrations/balay.markdown b/source/_integrations/balay.markdown
index 4d28584e8f0..32fa2f77d20 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_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/bosch_alarm.markdown b/source/_integrations/bosch_alarm.markdown
index adf058edcf6..543f0fa3ee1 100644
--- a/source/_integrations/bosch_alarm.markdown
+++ b/source/_integrations/bosch_alarm.markdown
@@ -20,7 +20,7 @@ ha_platforms:
- sensor
- switch
ha_integration_type: device
-ha_quality_scale: bronze
+ha_quality_scale: platinum
ha_dhcp: true
---
diff --git a/source/_integrations/button.markdown b/source/_integrations/button.markdown
index ac62dcc0ccf..8b7b2544176 100644
--- a/source/_integrations/button.markdown
+++ b/source/_integrations/button.markdown
@@ -42,7 +42,10 @@ In addition, the entity can have the following states:
- **Unknown**: The state is not yet known.
Because the {% term state %} of a button entity in Home Assistant is a timestamp, it
-means we can use it in our automations. For example:
+changes every time the button is pressed. This means we can trigger automations on
+any state change of the button entity, which effectively captures when the button
+is pressed. We don't need to use the actual timestamp value; we only care that the
+state changed, indicating a button press:
```yaml
triggers:
diff --git a/source/_integrations/constructa.markdown b/source/_integrations/constructa.markdown
index 76db3aa534e..7e59f7a5786 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_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/derivative.markdown b/source/_integrations/derivative.markdown
index 503b8d443dd..909ba0029a6 100644
--- a/source/_integrations/derivative.markdown
+++ b/source/_integrations/derivative.markdown
@@ -11,6 +11,7 @@ ha_iot_class: Calculated
ha_qa_scale: internal
ha_codeowners:
- '@afaucogney'
+ - '@karwosts'
ha_domain: derivative
ha_config_flow: true
ha_platforms:
diff --git a/source/_integrations/eastron.markdown b/source/_integrations/eastron.markdown
index 826ea9fd210..87dbdc73a9f 100644
--- a/source/_integrations/eastron.markdown
+++ b/source/_integrations/eastron.markdown
@@ -15,6 +15,7 @@ ha_platforms:
- button
- diagnostics
- number
+ - select
- sensor
- switch
ha_iot_class: Local Polling
diff --git a/source/_integrations/gaggenau.markdown b/source/_integrations/gaggenau.markdown
index e8d8bcb86b5..dc25767dbcc 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_dhcp: true
ha_zeroconf: true
---
diff --git a/source/_integrations/google_gemini.markdown b/source/_integrations/google_gemini.markdown
index ec157943e21..3b1bd2ddcc5 100644
--- a/source/_integrations/google_gemini.markdown
+++ b/source/_integrations/google_gemini.markdown
@@ -2,6 +2,7 @@
title: Google Gemini
description: Instructions on how to integrate Google Gemini as a conversation agent
ha_category:
+ - Text-to-speech
- Voice
ha_release: 2023.6
ha_domain: google_gemini
@@ -15,6 +16,7 @@ ha_config_flow: true
ha_platforms:
- conversation
- diagnostics
+ - tts
ha_iot_class: Cloud Polling
---
diff --git a/source/_integrations/google_generative_ai_conversation.markdown b/source/_integrations/google_generative_ai_conversation.markdown
index 0a3982898c6..ec7f6e634b0 100644
--- a/source/_integrations/google_generative_ai_conversation.markdown
+++ b/source/_integrations/google_generative_ai_conversation.markdown
@@ -2,8 +2,8 @@
title: Google Generative AI
description: Instructions on how to integrate Google Generative AI as a conversation agent
ha_category:
- - Voice
- Text-to-speech
+ - Voice
ha_release: 2023.6
ha_iot_class: Cloud Polling
ha_config_flow: true
diff --git a/source/_integrations/html5.markdown b/source/_integrations/html5.markdown
index c5317a29df3..1dd12fb130c 100644
--- a/source/_integrations/html5.markdown
+++ b/source/_integrations/html5.markdown
@@ -30,7 +30,6 @@ The `html5` platform can only function if all of the following requirements are
- You are using Chrome and/or Firefox on any desktop platform, ChromeOS or Android. Or you added your Home Assistant instance to your home screen on iOS 16.4 or higher.
- Your Home Assistant instance is accessible from outside your network over HTTPS or can perform an alternative [Domain Name Verification Method](https://support.google.com/webmasters/answer/9008080#domain_name_verification) on the domain used by Home Assistant.
- If using a proxy, HTTP basic authentication must be disabled to register or deregister push notifications. It can be re-enabled afterwards.
-- If you don't run Hass.io: `pywebpush` must be installed. `libffi-dev`, `libpython-dev` and `libssl-dev` must be installed prior to `pywebpush` (i.e., `pywebpush` probably won't automatically install).
- You have configured SSL/TLS for your Home Assistant. It doesn't need to be configured in Home Assistant though, e.g., you can be running NGINX in front of Home Assistant and this will still work. The certificate must be trustworthy (i.e., not self-signed).
- You are willing to accept the notification permission in your browser.
diff --git a/source/_integrations/ipp.markdown b/source/_integrations/ipp.markdown
index a341df7efd8..2527976e38f 100644
--- a/source/_integrations/ipp.markdown
+++ b/source/_integrations/ipp.markdown
@@ -1,18 +1,23 @@
----
-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
+ha_platforms:
+ - diagnostics
+ - sensor
+ha_zeroconf: true
+ha_integration_type: device
+---
+
+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/ista_ecotrend.markdown b/source/_integrations/ista_ecotrend.markdown
index a356a2239b4..a6f57c88558 100644
--- a/source/_integrations/ista_ecotrend.markdown
+++ b/source/_integrations/ista_ecotrend.markdown
@@ -13,6 +13,7 @@ ha_platforms:
- sensor
ha_config_flow: true
ha_integration_type: integration
+ha_quality_scale: gold
---
The **ista EcoTrend** {% term integration %} for Home Assistant allows you to import your monthly meter readings from the [ista EcoTrend](https://ecotrend.ista.de) service.
diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown
index 386b2e5f3e2..6d2fe880fb7 100644
--- a/source/_integrations/knx.markdown
+++ b/source/_integrations/knx.markdown
@@ -48,6 +48,7 @@ ha_platforms:
- weather
ha_config_flow: true
ha_integration_type: hub
+ha_quality_scale: silver
---
The [KNX](https://www.knx.org) integration connects Home Assistant to your KNX installation, allowing you to control KNX devices, act on telegrams and forward state changes from other integrations entities to your KNX bus.
diff --git a/source/_integrations/lcn.markdown b/source/_integrations/lcn.markdown
index 4c27dc3cd5e..3850726630d 100644
--- a/source/_integrations/lcn.markdown
+++ b/source/_integrations/lcn.markdown
@@ -25,6 +25,7 @@ ha_platforms:
- switch
ha_config_flow: true
ha_integration_type: integration
+ha_quality_scale: bronze
---
The **LCN** {% term integration %} for Home Assistant allows you to connect to [LCN](https://www.lcn.eu/) hardware devices.
diff --git a/source/_integrations/lg_thinq.markdown b/source/_integrations/lg_thinq.markdown
index acdfe8b45e1..fb76e8a2eed 100644
--- a/source/_integrations/lg_thinq.markdown
+++ b/source/_integrations/lg_thinq.markdown
@@ -23,6 +23,7 @@ ha_platforms:
ha_integration_type: integration
ha_codeowners:
- '@LG-ThinQ-Integration'
+ha_dhcp: true
---
The **LG ThinQ** integration allows you to connect LG ThinQ devices to Home Assistant. The features of this integration include:
diff --git a/source/_integrations/linak.markdown b/source/_integrations/linak.markdown
index 516ca4beb38..bca1adff175 100644
--- a/source/_integrations/linak.markdown
+++ b/source/_integrations/linak.markdown
@@ -6,8 +6,9 @@ ha_category:
ha_domain: linak
ha_integration_type: virtual
ha_supporting_domain: idasen_desk
-ha_supporting_integration: IKEA Idåsen Desk
+ha_supporting_integration: IKEA Idasen Desk
ha_release: '2023.10'
+ha_bluetooth: true
ha_codeowners:
- '@abmantis'
ha_config_flow: true
@@ -16,7 +17,6 @@ ha_platforms:
- cover
- sensor
ha_iot_class: Local Push
-ha_bluetooth: true
---
{% include integrations/supported_brand.md %}
diff --git a/source/_integrations/linkplay.markdown b/source/_integrations/linkplay.markdown
index 59ec73e140b..203ad8a1f27 100644
--- a/source/_integrations/linkplay.markdown
+++ b/source/_integrations/linkplay.markdown
@@ -1,54 +1,55 @@
----
-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: hub
+ha_release: 2024.8
+ha_codeowners:
+ - '@Velleman'
+ha_config_flow: true
+ha_platforms:
+ - button
+ - diagnostics
+ - media_player
+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.markdown b/source/_integrations/locative.markdown
index fbbd1ad0b6d..15ea26dc512 100644
--- a/source/_integrations/locative.markdown
+++ b/source/_integrations/locative.markdown
@@ -1,23 +1,27 @@
----
-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: Local Push
+ha_domain: locative
+ha_platforms:
+ - device_tracker
+ha_config_flow: true
+ha_integration_type: integration
+---
+
+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/meater.markdown b/source/_integrations/meater.markdown
index 4c94f85c073..adfd60f114d 100644
--- a/source/_integrations/meater.markdown
+++ b/source/_integrations/meater.markdown
@@ -11,6 +11,7 @@ ha_codeowners:
- '@emontnemery'
ha_domain: meater
ha_platforms:
+ - diagnostics
- sensor
ha_integration_type: integration
---
diff --git a/source/_integrations/motionmount.markdown b/source/_integrations/motionmount.markdown
index 1478f0dff77..e8a8c915385 100644
--- a/source/_integrations/motionmount.markdown
+++ b/source/_integrations/motionmount.markdown
@@ -1,115 +1,116 @@
----
-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:
+ - Binary sensor
+ - Number
+ - Select
+ - Sensor
+ha_release: 2024.1
+ha_iot_class: Local Push
+ha_config_flow: true
+ha_platforms:
+ - binary_sensor
+ - number
+ - select
+ - sensor
+ha_codeowners:
+ - '@laiho-vogels'
+ha_domain: motionmount
+ha_zeroconf: true
+ha_quality_scale: bronze
+ha_integration_type: device
+---
+
+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 965021e3dc8..cbe562cff4c 100644
--- a/source/_integrations/mqtt.markdown
+++ b/source/_integrations/mqtt.markdown
@@ -370,7 +370,7 @@ Supported shared options are:
- `qos`
- `encoding`
-The component specific options are placed as mappings under the `components` key (abbreviated as `cmp`) like:
+The component specific options are placed as mappings under the `components` key (abbreviated as `cmps`) like:
```json
{
@@ -409,7 +409,7 @@ The component specific options are placed as mappings under the `components` key
}
```
-The components id's under the `components` (`cmp`) key, are used as part of the discovery identification. A `platform` (`p`) config option is required for each component config that is added to identify the component platform. Also required is a `unique_id` for entity-based components.
+The components id's under the `components` (`cmps`) key, are used as part of the discovery identification. A `platform` (`p`) config option is required for each component config that is added to identify the component platform. Also required is a `unique_id` for entity-based components.
To remove the components, publish an empty (retained) string payload to the discovery topic. This will remove the component and clear the published discovery payload. It will also remove the device entry if there are no further references to it.
@@ -569,7 +569,7 @@ Check the logs to ensure this step is executed correctly.
**Step 3: Publish the new device-based discovery configuration:**
Discovery topic device: `homeassistant/device/0AFFD2/config`
-Discovery id: `0AFFD2 bla` *(`0AFFD2`from discovery topic, `bla`: The key under `cmp` in the discovery payload)*
+Discovery id: `0AFFD2 bla` *(`0AFFD2`from discovery topic, `bla`: The key under `cmps` in the discovery payload)*
Discovery payload device:
```json
diff --git a/source/_integrations/music_assistant.markdown b/source/_integrations/music_assistant.markdown
index 333273cacca..0f6595d2bd4 100644
--- a/source/_integrations/music_assistant.markdown
+++ b/source/_integrations/music_assistant.markdown
@@ -10,6 +10,7 @@ ha_codeowners:
- '@music-assistant'
ha_domain: music_assistant
ha_platforms:
+ - button
- media_player
ha_zeroconf: true
ha_integration_type: integration
diff --git a/source/_integrations/nina.markdown b/source/_integrations/nina.markdown
index c16fca961d9..062a6095f1d 100644
--- a/source/_integrations/nina.markdown
+++ b/source/_integrations/nina.markdown
@@ -72,3 +72,9 @@ Areas: `gemeinde oberreichenbach, gemeinde neuweiler, stadt nagold`
| `sent` | *(time)* Transmission time and date (UTC) of the issued warning. |
| `start` | *(time)* Starting time and date (UTC) of the issued warning. Can be empty. |
| `expires` | *(time)* Expiration time and date (UTC) of the issued warning. Can be empty. |
+
+## Removing the integration
+
+This integration follows standard integration removal. No extra steps are required.
+
+{% include integrations/remove_device_service.md %}
diff --git a/source/_integrations/ntfy.markdown b/source/_integrations/ntfy.markdown
index e51a2a8e0e2..2f5ebcb4f9e 100644
--- a/source/_integrations/ntfy.markdown
+++ b/source/_integrations/ntfy.markdown
@@ -13,6 +13,7 @@ ha_integration_type: integration
ha_platforms:
- diagnostics
- notify
+ - sensor
ha_quality_scale: bronze
---
diff --git a/source/_integrations/opower.markdown b/source/_integrations/opower.markdown
index 88ad1f4c4c6..3f2a9779b7d 100644
--- a/source/_integrations/opower.markdown
+++ b/source/_integrations/opower.markdown
@@ -50,6 +50,7 @@ More than 175 utilities use Opower. Currently only the following utilities are s
- National Grid NY Metro
- National Grid NY Upstate
- Pacific Gas & Electric (PG&E)
+ > **Note:** Currently only works with PG&E accounts created **before June 2025** that do not require multi-factor authentication (MFA).
- Portland General Electric (PGE)
- Puget Sound Energy (PSE)
- Sacramento Municipal Utility District (SMUD)
diff --git a/source/_integrations/paperless_ngx.markdown b/source/_integrations/paperless_ngx.markdown
index 3258c6b22ed..ab10ea8274c 100644
--- a/source/_integrations/paperless_ngx.markdown
+++ b/source/_integrations/paperless_ngx.markdown
@@ -18,6 +18,7 @@ related:
ha_platforms:
- diagnostics
- sensor
+ - update
---
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/pi_hole.markdown b/source/_integrations/pi_hole.markdown
index 1c1df4dfbc3..9e2ca5ef152 100644
--- a/source/_integrations/pi_hole.markdown
+++ b/source/_integrations/pi_hole.markdown
@@ -22,7 +22,7 @@ ha_integration_type: integration
---
The Pi-hole integration allows you to retrieve statistics and interact with a
-[Pi-hole](https://pi-hole.net/) system.
+[Pi-hole](https://pi-hole.net/) system (version < 6.0).
{% include integrations/config_flow.md %}
diff --git a/source/_integrations/playstation_network.markdown b/source/_integrations/playstation_network.markdown
index 75c8f5ecb64..3b9c9559c0b 100644
--- a/source/_integrations/playstation_network.markdown
+++ b/source/_integrations/playstation_network.markdown
@@ -8,6 +8,7 @@ ha_release: 2025.7
ha_iot_class: Cloud Polling
ha_domain: playstation_network
ha_platforms:
+ - diagnostics
- media_player
- sensor
ha_codeowners:
@@ -15,10 +16,11 @@ ha_codeowners:
- '@tr4nt0r'
ha_config_flow: true
ha_quality_scale: bronze
-ha_integration_type: integration
+ha_integration_type: service
related:
- url: https://playstation.com/
title: Playstation
+ha_dhcp: true
---
The **PlayStation Network** {% term integration %} enables you to seamlessly integrate information from your currently playing game in Home Assistant.
diff --git a/source/_integrations/rehlko.markdown b/source/_integrations/rehlko.markdown
index c2b7023b98e..f9fe3e427e0 100644
--- a/source/_integrations/rehlko.markdown
+++ b/source/_integrations/rehlko.markdown
@@ -105,6 +105,7 @@ These are the generator models that have been tested:
- [20RESA](https://resources.kohler.com/power/kohler/residential/pdf/tp6804.pdf)
- [20RCA](https://www.kohlerhomeenergy.rehlko.com/products/home+generators/20rca)
- [14RESA](https://www.kohler.com/content/dam/kohler-com-NA/Lifestyle/PDF/PDF-tp6803.pdf)
+- [30RCL](https://www.kohlerhomeenergy.rehlko.com/products/home+generators/30rcla)
## Removing the integration
diff --git a/source/_integrations/remote_calendar.markdown b/source/_integrations/remote_calendar.markdown
index 038e2a4c2a5..00c7fa9308a 100644
--- a/source/_integrations/remote_calendar.markdown
+++ b/source/_integrations/remote_calendar.markdown
@@ -12,6 +12,7 @@ ha_platforms:
- diagnostics
ha_codeowners:
- '@Thomas55555'
+ - '@allenporter'
ha_integration_type: service
ha_quality_scale: silver
---
diff --git a/source/_integrations/samsungtv.markdown b/source/_integrations/samsungtv.markdown
index 4d6d794a9bc..ad0b54aa835 100644
--- a/source/_integrations/samsungtv.markdown
+++ b/source/_integrations/samsungtv.markdown
@@ -19,6 +19,7 @@ ha_platforms:
ha_zeroconf: true
ha_dhcp: true
ha_integration_type: device
+ha_quality_scale: bronze
---
The `samsungtv` platform allows you to control a [Samsung Smart TV](https://www.samsung.com/uk/tvs/all-tvs/).
diff --git a/source/_integrations/sensor.rest.markdown b/source/_integrations/sensor.rest.markdown
index 51b8b4fb04f..db1d6151b83 100644
--- a/source/_integrations/sensor.rest.markdown
+++ b/source/_integrations/sensor.rest.markdown
@@ -314,7 +314,7 @@ rest:
{% endraw %}
-[JSONPlaceholder](https://jsonplaceholder.typicode.com/) provides sample JSON data for testing. In the below example, JSONPath locates the attributes in the JSON document. [JSONPath Online Evaluator](https://jsonpath.com/) provides a tool to test your JSONPath. If the endpoint returns XML, it will be converted to JSON using `xmltodict` before searching for attributes. You may find the [XMLtoDict debug tool](https://xmltodict-debugger.glitch.me/) helpful for testing how your XML converts to JSON.
+[JSONPlaceholder](https://jsonplaceholder.typicode.com/) provides sample JSON data for testing. In the below example, JSONPath locates the attributes in the JSON document. [JSONPath Online Evaluator](https://jsonpath.com/) provides a tool to test your JSONPath. If the endpoint returns XML, it will be converted to JSON using `xmltodict` before searching for attributes. You may find this [XML to JSON Converter](https://www.freeformatter.com/xml-to-json-converter.html) helpful for testing how your XML converts to JSON.
{% raw %}
diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown
index 2aa67094c4b..7cae6b2e9bc 100644
--- a/source/_integrations/sonos.markdown
+++ b/source/_integrations/sonos.markdown
@@ -464,3 +464,9 @@ sonos:
media_player:
advertise_addr: 192.0.2.1
```
+
+## 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/spotify.markdown b/source/_integrations/spotify.markdown
index 179837fbc73..789b321c16e 100644
--- a/source/_integrations/spotify.markdown
+++ b/source/_integrations/spotify.markdown
@@ -10,7 +10,6 @@ ha_codeowners:
- '@frenck'
- '@joostlek'
ha_domain: spotify
-ha_zeroconf: true
ha_platforms:
- diagnostics
- media_player
diff --git a/source/_integrations/switchbot.markdown b/source/_integrations/switchbot.markdown
index dcd05d21817..c789159a057 100644
--- a/source/_integrations/switchbot.markdown
+++ b/source/_integrations/switchbot.markdown
@@ -21,6 +21,8 @@ ha_codeowners:
- '@dsypniewski'
- '@zerzhang'
ha_domain: switchbot
+works_with:
+ - bluetooth
ha_bluetooth: true
ha_platforms:
- binary_sensor
@@ -169,6 +171,27 @@ For instructions on how to obtain the encryption key, see README in [PySwitchbot
- [Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
- [Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+## Works with Home Assistant
+
+SwitchBot is committed to making sure their products are up-to-date and ready to use in Home Assistant.
+Devices are certified for both Bluetooth and Matter.
+
+The following devices are certified for Bluetooth:
+- [SwitchBot Lock Ultra](https://www.switch-bot.com/products/switchbot-lock-ultra)
+- [SwitchBot Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
+- [SwitchBot Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+- [SwitchBot Leak Detector](https://www.switch-bot.com/products/switchbot-water-leak-detector)
+- [SwitchBot Meter](https://www.switch-bot.com/products/switchbot-meter)
+- [SwitchBot Meter Pro](https://www.switch-bot.com/products/switchbot-meter-pro)
+- [SwitchBot Meter Pro CO2](https://www.switch-bot.com/products/switchbot-meter-pro-co2-monitor)
+- [SwitchBot Indoor/Outdoor Thermo-Hygrometer](https://www.switch-bot.com/products/switchbot-indoor-outdoor-thermo-hygrometer)
+- [SwitchBot Curtain 3](https://www.switch-bot.com/products/switchbot-curtain-3)
+- [SwitchBot Contact Sensor](https://www.switch-bot.com/products/contact-sensor)
+- [SwitchBot Roller Shade](https://www.switch-bot.com/products/switchbot-roller-shade)
+- [SwitchBot Lock Pro](https://www.switch-bot.com/products/switchbot-lock-pro)
+
+To see the list of SwitchBot Matter certified devices, visit the [SwitchBot Matter](switchbot_matter.markdown) page.
+
## Supported functionality
### Common
@@ -466,6 +489,12 @@ Features:
- calibration state
- get battery level
+Options:
+
+1. To enable nightlatch operation mode, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Under **Integration entries**, find the lock and select **Configure**.
+3. In the **Options** dialog, configure the nightlatch operation mode.
+
#### Lock Pro
This is an encrypted device.
@@ -478,6 +507,14 @@ Features:
- calibration state
- get battery level
+Options:
+
+1. To enable nightlatch operation mode, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Under **Integration entries**, find the lock and select **Configure**.
+3. In the **Options** dialog, configure the nightlatch operation mode.
+
+
+
#### Lock Ultra
This is an encrypted device.
@@ -490,6 +527,12 @@ Features:
- calibration state
- get battery level
+Options:
+
+1. To enable nightlatch operation mode, go to {% my integrations title="**Settings** > **Devices & services**" %}.
+2. Under **Integration entries**, find the lock and select **Configure**.
+3. In the **Options** dialog, configure the nightlatch operation mode.
+
#### Lock Lite
This is an encrypted device.
@@ -497,8 +540,6 @@ This is an encrypted device.
Features:
- Lock or unlock
-- open or closed state
-- auto-lock paused state
- calibration state
- get battery level
@@ -532,17 +573,17 @@ Features:
### Fans
-Fan entities are added for Circulator Fan, Air Purifier, and Air Purifier Table
+Fan entities are added for Battery Circulator Fan/Circulator Fan, Air Purifier, and Air Purifier Table
-#### Circulator Fan
+#### Battery Circulator Fan/Circulator Fan
Features:
-
- turn on
- turn off
- set speed
- set mode
- oscillate left and right
+- get battery level (Battery Circulator Fan only)
#### Air Purifier
@@ -569,7 +610,7 @@ Features:
Vacuum entities are added for K10+, K10+ Pro, K10+ Pro Combo, K20, S10.
Features:
-
+- get states, including `cleaning`, `docked`, `idle`, `paused`, `returning`, and `error`; refer to Known limitations for more details
- start
- return to base
- get battery
@@ -614,10 +655,25 @@ Move the device closer, or replace the Bluetooth adapter with a faster one. See
Device names configured in the SwitchBot app are not transferred into Home Assistant.
+### Battery level
+
+Due to firmware limitations, early models such as **Lock** and **Lock Lite** report the battery level in coarse ranges rather than an exact value:
+
+- < 10 % → 10
+- 10 % – 20 % → 20
+- 20 % – 60 % → 60
+- ≥ 60 % → 100
+
+Refer to the latest version of the [OpenAPI doc](https://github.com/OpenWonderLabs/SwitchBotAPI) for precise definitions.
+
### Lock state
The integration currently only uses the primary lock state; in dual lock mode, not all things might work properly.
+### Vacuum state
+
+For robot vacuum K10+ and K10+ Pro, due to firmware implementation, it only returns these states, `cleaning` and `docked`
+
## Troubleshooting
The SwitchBot integration will automatically discover devices once the [Bluetooth](/integrations/bluetooth) integration is enabled and functional.
@@ -630,8 +686,6 @@ Possible custom integration conflict, using a different version of PySwitchbot;
Make sure your devices are powered on and are in range.
{% enddetails %}
-
-
## Examples
### Automation ideas
diff --git a/source/_integrations/switchbot_cloud.markdown b/source/_integrations/switchbot_cloud.markdown
index 71115ac577a..d9bc172599c 100644
--- a/source/_integrations/switchbot_cloud.markdown
+++ b/source/_integrations/switchbot_cloud.markdown
@@ -40,25 +40,160 @@ Please note, device names configured in the SwitchBot app are transferred into H
{% include integrations/config_flow.md %}
+
## Supported devices
+### Plugs and switches
+
+- [Bot (WoHand)](https://switch-bot.com/pages/switchbot-bot)
+- [Relay Switch 1](https://www.switch-bot.com/products/switchbot-relay-switch-1)
+- [Relay Switch 1PM](https://www.switch-bot.com/products/switchbot-relay-switch-1pm)
+- [Plug Mini (WoPlug)](https://www.switch-bot.com/products/switchbot-plug-mini)
+- [Plug Mini (HomeKit Enabled)](https://www.switch-bot.com/products/switchbot-plug-mini-homekit-enabled)
- Plug (Wi-Fi only, only available in Japan)
-- Plug Mini, both the original and HomeKit-enabled
+
+### Locks
+
+- [Lock (WoLock)](https://switch-bot.com/pages/switchbot-lock)
+- [Lock Pro (WoLockPro)](https://www.switch-bot.com/pages/switchbot-lock-pro)
+
+### Sensors
+
+- [Meter](https://switch-bot.com/pages/switchbot-meter)
+- [Meter Plus](https://switch-bot.com/pages/switchbot-meter-plus)
+- [Indoor/Outdoor Meter (WoIOSensorTH)](https://switch-bot.com/pages/switchbot-indoor-outdoor-thermo-hygrometer)
+- [Meter Pro](https://www.switch-bot.com/products/switchbot-meter-pro)
+- [Meter Pro CO2 Monitor](https://www.switch-bot.com/products/switchbot-meter-pro-co2-monitor)
+
+### Hubs
+
+- [Hub 2 (WoHub2)](https://switch-bot.com/pages/switchbot-hub-2) (currently only supports retrieving sensor data, does not yet support device control)
- IR appliances exposed through the different hubs:
- - ON/OFF for all appliance types excepted "Others"
- - Air Conditioner
-- Lock
-- Lock Pro
-- Meter
-- MeterPlus
-- MeterPro
-- MeterPro (C02)
-- Outdoor Meter
-- Vacuum K10+, K10+ pro, S1, S1 Plus
-- Hub 2
-- Relay Switch 1
-- Relay Switch 1PM
-- Bot (as a Switch in `switchMode` and `customizeMode`, as a Button in `pressMode`)
+ - ON/OFF for all appliance types except for *Others*
+ - Change temperature and mode for *Air Conditioner*
+
+### Vacuums
+
+- [K10+](https://www.switch-bot.com/products/switchbot-mini-robot-vacuum-k10)
+- [K10+ Pro](https://www.switch-bot.com/products/switchbot-mini-robot-vacuum-k10-pro)
+- [S1](https://www.switchbot.jp/products/switchbot-robot-vacuum-cleaner?&variant=41850919420079)
+- [S1 Plus](https://www.switchbot.jp/products/switchbot-robot-vacuum-cleaner)
+
+## Supported functionality
+
+### Plugs and switches
+
+#### Bot
+
+Features:
+- acted as a Switch in `switchMode` and `customizeMode`, as a Button in `pressMode`
+- turn on or off
+- press
+- get battery level
+
+#### Plug Mini
+
+Features:
+- turn on or off
+- get power consumption readings
+
+#### Relay Switch 1
+
+Features:
+- turn on or off
+
+#### Relay Switch 1PM
+
+Features:
+- turn on or off
+- get power
+- get voltage
+- get current
+
+#### Plug
+
+Features:
+- turn on or off
+
+
+### Sensors
+
+#### Meter
+
+Features:
+- get temperature
+- get humidity
+- get battery level
+
+#### Meter Plus
+
+Features:
+- get temperature
+- get humidity
+- get battery level
+
+#### Indoor/Outdoor Meter
+
+Features:
+- get temperature
+- get humidity
+- get battery level
+
+#### Meter Pro
+
+Features:
+- get temperature
+- get humidity
+- get battery level
+
+#### Meter Pro CO2 Monitor
+
+Features:
+- get temperature
+- get humidity
+- get carbon dioxide
+- get battery level
+
+### Locks
+
+#### Lock
+
+Features:
+- Lock or unlock
+- open or closed state
+- calibration state
+- get battery level
+
+#### Lock Pro
+
+Features:
+- Lock or unlock
+- open or closed state
+- calibration state
+- get battery level
+
+### Hubs
+
+Some of the hubs can be served as a bridge while the sensor data can be retrieved. Hub 2 displays temperature and humidity through a sensor cable. Without a digital display, Hub Mini Matter Enabled can also read from a sensor cable.
+
+#### Hub 2
+
+Features:
+- get temperature
+- get humidity
+
+
+### Vacuums
+
+Vacuum entities are added for K10+, K10+ Pro, S1, S1 Plus.
+
+Features:
+- get states
+- start/clean
+- pause
+- set cleaning mode
+- return to base
+- get battery
## Important considerations
diff --git a/source/_integrations/switchbot_matter.markdown b/source/_integrations/switchbot_matter.markdown
new file mode 100644
index 00000000000..86219c6e1f5
--- /dev/null
+++ b/source/_integrations/switchbot_matter.markdown
@@ -0,0 +1,47 @@
+---
+title: SwitchBot Matter
+description: Connect and control your SwitchBot Matter devices using the Matter integration
+ha_release: '2025.6'
+ha_iot_class: Local Push
+ha_category:
+ - Cover
+ - Lock
+ - Sensor
+ - Switch
+ha_domain: switchbot
+ha_integration_type: brand
+works_with:
+ - matter
+ha_platforms:
+ - binary_sensor
+ - cover
+ - lock
+ - sensor
+ - switch
+ha_iot_standard: matter
+ha_brand: true
+---
+
+{% include integrations/wwha.md url="https://www.switchbot.com/" %}
+
+## Supported devices
+
+SwitchBot also has Matter devices that are certified for use via one of their Matter hubs: either the [SwitchBot Hub 2](https://www.switch-bot.com/products/switchbot-hub-2) or the [Hub 3](https://www.switch-bot.com/products/switchbot-hub-3). Some are also certified via Matter-over-WiFi as standalone devices.
+
+### Via a Matter Hub
+
+- [SwitchBot Lock Ultra](https://www.switch-bot.com/products/switchbot-lock_ultra)
+- [SwitchBot Meter](https://www.switch-bot.com/products/switchbot-meter)
+- [SwitchBot Meter Pro](https://www.switch-bot.com/products/switchbot-meter-pro)
+- [SwitchBot Meter Pro CO2](https://www.switch-bot.com/products/switchbot-meter-pro-co2-monitor)
+- [SwitchBot Indoor/Outdoor Thermo-Hygrometer](https://www.switch-bot.com/products/switchbot-indoor-outdoor-thermo-hygrometer)
+- [SwitchBot Curtain 3](https://www.switch-bot.com/products/switchbot-curtain-3)
+- [SwitchBot Contact Sensor](https://www.switch-bot.com/products/contact-sensor)
+- [SwitchBot Roller Shade](https://www.switch-bot.com/products/switchbot-roller-shade)
+- [SwitchBot Lock Pro](https://www.switch-bot.com/products/switchbot-lock-pro)
+
+### Matter-Over-WiFi (standalone, without requiring a hub)
+
+- [SwitchBot Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
+- [SwitchBot Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+- [SwitchBot Multitasking Robot K20 + Pro](https://www.switch-bot.com/products/switchbot-multitasking-household-robot-k20-pro)
diff --git a/source/_integrations/synology_dsm.markdown b/source/_integrations/synology_dsm.markdown
index ad8fa16a312..2cc531bb94d 100644
--- a/source/_integrations/synology_dsm.markdown
+++ b/source/_integrations/synology_dsm.markdown
@@ -173,6 +173,18 @@ To find the `` you need to go to the album in your photos instance, an
For performance reasons, a maximum of 1000 images will be shown in the Media Browser.
+## UPS support
+
+This integration does not directly support the UPS systems connected to the NAS, but it can be achieved with the [Network UPS Tools (NUT)](/integrations/nut) integration. You need to enable UPS support in your NAS settings, as described in the official Synology [UPS](https://kb.synology.com/en-me/DSM/help/DSM/AdminCenter/system_hardware_ups) documentation, and then integrate the NAS as a UPS server via the NUT integration. Here is a rough step-by-step guide:
+
+1. Activate **Enable UPS support** in the NAS settings under **Control Panel** > **Hardware & Power** > **UPS**.
+2. Activate **Enable network UPS server**.
+3. Select **Permitted Synology NAS Devices** and add the IP address of your Home Assistant instance.
+4. Set up the [Network UPS Tools (NUT)](/integrations/nut) integration.
+ - **Host**: the IP address or hostname of your NAS.
+ - **Port**: keep the default (_3493_).
+ - **Username** and **Password**: keep empty as the NAS doesn't support credentials for the NUT server.
+
## Troubleshooting
In any case, when reporting an issue, please enable [debug logging](/docs/configuration/troubleshooting/#debug-logs-and-diagnostics), restart the integration, and as soon as the issue re-occurs stop the debug logging again (_download of debug log file will start automatically_). Further _if still possible_, please also download the [diagnostics](/integrations/diagnostics) data. If you have collected the debug log and the diagnostics data, provide them with the issue report.
diff --git a/source/_integrations/tailscale.markdown b/source/_integrations/tailscale.markdown
index ce1babde93d..a7a8f6125f2 100644
--- a/source/_integrations/tailscale.markdown
+++ b/source/_integrations/tailscale.markdown
@@ -18,26 +18,134 @@ ha_platforms:
ha_integration_type: hub
---
-The Tailscale integration integrates the [Tailscale](https://www.tailscale.com) API
-with Home Assistant; giving you the possibility to monitor and automate on
-the state of the devices in your Tailscale VPN network (Tailnet).
+The **Tailscale** {% term integration %} connects to the [Tailscale](https://www.tailscale.com) API to monitor devices in your Tailscale network (Tailnet). Use this integration to create automations based on device connectivity, track usage patterns, or receive notifications when devices go online or offline.
+
+Tailscale is a VPN service that creates secure point-to-point connections between your devices using WireGuard technology. This integration monitors your Tailnet but doesn't provide VPN connectivity itself.
{% important %}
-This integration **DOES NOT** make your Home Assistant accessible via
-Tailscale VPN remotely!
+This integration monitors your Tailscale network but **does not provide VPN access** to Home Assistant.
-If you want to access your Home Assistant instance remotely, you will
-need to install Tailscale itself on your own. For instructions on how to do
-this, please consult the [Tailscale documentation](https://tailscale.com/kb/).
+To access Home Assistant remotely via Tailscale:
+1. Install Tailscale directly on your Home Assistant device
+2. Follow the [Tailscale installation guide](https://tailscale.com/kb/)
+3. Configure port forwarding or use Tailscale's subnet routes if needed
{% endimportant %}
## Prerequisites
-To use the Tailscale integration, you will need to obtain an API access token,
-you can create one in the [Tailscale Admin Panel](https://login.tailscale.com/admin/settings/keys).
+**Required information:**
-Additionally, you will need to know the Tailnet name of your Tailscale network.
-You can find it in the top left corner in the [Tailscale Admin Panel](https://login.tailscale.com/admin/settings/keys)
-(beside the Tailscale logo).
+1. **API Access Token**: Create one in the [Tailscale Admin Panel](https://login.tailscale.com/admin/settings/keys)
+ - Navigate to **Settings** > **Keys**
+ - Click **Generate auth key** or **Generate API key**
+ - Select appropriate expiration and permissions
+
+2. **Tailnet Name**: Found in the top-left corner of the [Admin Panel](https://login.tailscale.com/admin/machines)
+ - Usually in the format: `user@domain.com` or `organization-name`
+ - Also visible in the URL when browsing your admin panel
{% include integrations/config_flow.md %}
+
+{% configuration_basic %}
+API Key:
+ description: "Your Tailscale API access token from the Admin Panel."
+Tailnet:
+ description: "Your Tailnet name (organization name or email address)."
+{% endconfiguration_basic %}
+
+## Supported functionality
+
+### Sensors
+
+The integration provides sensors for monitoring your Tailscale network:
+
+#### Device information sensors
+
+- **Device count**: Total number of devices in your Tailnet
+- **Connected devices**: Number of currently online devices
+- **Disconnected devices**: Number of currently offline devices
+
+#### Per-device sensors
+
+For each device in your Tailnet:
+
+- **Connection status**: Whether the device is online or offline
+- **Last seen**: Timestamp when the device was last active
+- **Operating system**: Device OS (Windows, macOS, Linux, iOS, Android)
+- **Tailscale version**: Version of Tailscale client running
+- **IP addresses**: Both Tailscale IP and external IP
+- **Location**: Approximate geographic location (if available)
+
+### Binary sensors
+
+The integration creates binary sensors for:
+
+#### Network status
+
+- **Tailnet health**: Overall network connectivity status
+- **Device reachability**: Per-device online/offline status
+
+#### Security monitoring
+
+- **Key expiration warnings**: Alerts when auth keys are approaching expiration
+- **Unauthorized access**: Notifications for new device connections (if configured)
+
+## Examples
+
+### Automated backups based on device availability
+
+Start backups when specific devices are online:
+
+```yaml
+automation:
+ - alias: "Start backup when work laptop connects"
+ triggers:
+ - trigger: state
+ entity_id: binary_sensor.work_laptop_tailscale
+ from: "off"
+ to: "on"
+ conditions:
+ - condition: time
+ after: "18:00:00" # Only after work hours
+ before: "23:00:00"
+ actions:
+ - action: script.start_network_backup
+ - action: notify.admin
+ data:
+ message: "Starting automated backup - work laptop detected"
+```
+
+
+## Data updates
+
+The Tailscale integration polls the Tailscale API every minute to check device status and network information.
+
+## Troubleshooting
+
+### Integration fails to connect
+
+#### Symptom: "Unable to connect to Tailscale API" error
+
+**Solutions:**
+
+1. **Verify API key**:
+
+ - Ensure the key is copied correctly (no extra spaces)
+ - Check key hasn't expired in the Tailscale admin panel
+ - Verify key has appropriate permissions
+
+2. **Network connectivity**:
+ - Ensure Home Assistant can reach Tailscale's API servers
+ - Check firewall rules if running in restricted environments
+
+## Removing the integration
+
+This integration follows standard integration removal.
+
+{% include integrations/remove_device_service.md %}
+
+After removal:
+
+1. Your Tailscale API key remains active
+2. Consider revoking the key in the Tailscale admin panel if no longer needed
+3. Your Tailscale network and devices continue operating normally
diff --git a/source/_integrations/telegram_bot.markdown b/source/_integrations/telegram_bot.markdown
index 3c14f84104a..48d5b5accd4 100644
--- a/source/_integrations/telegram_bot.markdown
+++ b/source/_integrations/telegram_bot.markdown
@@ -8,7 +8,9 @@ ha_iot_class: Cloud Push
ha_config_flow: true
ha_domain: telegram_bot
ha_integration_type: integration
-ha_quality_scale: legacy
+ha_quality_scale: bronze
+ha_codeowners:
+ - '@hanwg'
---
Use Telegram on your mobile or desktop device to send and receive messages or commands to/from your Home Assistant.
diff --git a/source/_integrations/tilt_pi.markdown b/source/_integrations/tilt_pi.markdown
index 6352b5eee47..304b6c21d5a 100644
--- a/source/_integrations/tilt_pi.markdown
+++ b/source/_integrations/tilt_pi.markdown
@@ -5,16 +5,17 @@ ha_category:
- Sensor
ha_release: '2025.7'
ha_iot_class: Local Polling
-ha_quality_scale: Bronze
+ha_quality_scale: bronze
ha_config_flow: true
ha_codeowners:
- '@michaelheyman'
ha_domain: tilt_pi
ha_platforms:
- - sensor
+ - sensor
related:
- url: https://tilthydrometer.com/collections/tilt-pi
title: Tilt Pi product page
+ha_integration_type: integration
---
The **Tilt Pi** {% term integration %} allows you to connect a Tilt Pi to Home Assistant to
diff --git a/source/_integrations/tts.markdown b/source/_integrations/tts.markdown
index 06aff3f940d..6298268cf9f 100644
--- a/source/_integrations/tts.markdown
+++ b/source/_integrations/tts.markdown
@@ -198,4 +198,4 @@ The recommended way to overcome these obstacles is to not manually configure a l
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`.
+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/tuya.markdown b/source/_integrations/tuya.markdown
index a02185a9346..635a8276d1b 100644
--- a/source/_integrations/tuya.markdown
+++ b/source/_integrations/tuya.markdown
@@ -56,6 +56,10 @@ All Home Assistant platforms are supported by the Tuya integration, except the l
You need to have the Tuya Smart or Smart Life app installed, with an account created and
at least one device added to that account.
+During the setup process, you will need:
+- A second screen (such as a phone, tablet, or another computer) to display the QR code that appears during configuration
+- The Smart Life or Tuya Smart app installed on your mobile device to scan the QR code
+
### Obtaining User Code for sign-in
To sign-in, you will need to get your **User Code** from the Smart Life /
@@ -68,6 +72,21 @@ Tuya Smart app. You can find it by opening the app and:
{% include integrations/config_flow.md %}
+### Scanning the QR code
+
+To scan the QR code in the Smart Life app:
+1. Open the Smart Life app
+2. Tap the **+** button or **Add Device**
+3. Select **Scan** or look for the QR code scanner option
+4. Scan the QR code displayed on your Home Assistant screen
+
+After adding new devices to your Tuya account through the Smart Life or Tuya Smart app, you need to reload the Tuya integration in Home Assistant for the new devices to appear:
+
+1. Go to **{% my integrations title="Settings > Devices & Services" %}**
+2. Find the Tuya integration
+3. Click the three dots menu
+4. Select **Reload**
+
## Scenes
Tuya supports scenes in their app. These allow triggering some of the more complex modes of various devices such as light changing effects. Scenes created in the Tuya app will automatically appear in the Scenes list in Home Assistant the next time the integration updates.
diff --git a/source/_integrations/weather.markdown b/source/_integrations/weather.markdown
index b42df01bff5..aaa003e2711 100644
--- a/source/_integrations/weather.markdown
+++ b/source/_integrations/weather.markdown
@@ -115,7 +115,7 @@ The response data field is a mapping of called target entities, each containing
{% details "Example template sensor using get_forecasts" %}
-Example template sensor that contains the hourly forecast
+Example [template sensor](/integrations/template#yaml-configuration) that contains the hourly forecast
{% raw %}
diff --git a/source/_integrations/zerproc.markdown b/source/_integrations/zerproc.markdown
index 3282011277f..4bf6ca6bc4a 100644
--- a/source/_integrations/zerproc.markdown
+++ b/source/_integrations/zerproc.markdown
@@ -19,4 +19,3 @@ This {% term integration %} discovers nearby Zerproc lights and adds them to Hom
{% include integrations/config_flow.md %}
The {% term integration %} will scan for nearby devices, and is completed if any are found. No additional configuration is required. The integration will perform a BLE scan every 60 seconds to search for new devices.
-
diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown
index feb3a58f461..484bcf57d11 100644
--- a/source/_integrations/zwave_js.markdown
+++ b/source/_integrations/zwave_js.markdown
@@ -132,7 +132,8 @@ While your Z-Wave mesh is permanently stored on your dongle, the additional meta
### Adding a new device to the Z-Wave network
1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}.
-2. Select the Z-Wave integration. Then select **Configure**.
+2. Select the Z-Wave integration.
+ - Then, on the entry of the hub, select {% icon "ic:baseline-arrow-forward-ios" %} to open the device info page.
3. Select **Add device**.
- The Z-Wave controller is now in inclusion mode.
4. Check, if your device supports SmartStart:
@@ -161,8 +162,9 @@ While your Z-Wave mesh is permanently stored on your dongle, the additional meta
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**.
+2. Select the **Z-Wave** integration.
+ - Then, select the cogwheel {% icon "mdi:cog-outline" %}.
+3. Select **Remove a device**, then **Start exclusion**.
- The Z-Wave controller is now in exclusion mode.
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.
@@ -181,7 +183,8 @@ Do this if you have an existing Z-Wave network and want to use a new controller.
### 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**.
+2. Select the **Z-Wave** integration.
+ - Then, select the cogwheel {% icon "mdi:cog-outline" %}.
3. Under **Backup and restore**, select **Migrate controller**.
4. Select **Migrate to a new controller**.
- To confirm device reset, select **Submit**.
@@ -223,7 +226,8 @@ It's recommended to create a backup before making any major changes to your Z-Wa
### 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**.
+2. Select the **Z-Wave** integration.
+ - Then, select the cogwheel {% icon "mdi:cog-outline" %}.
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.
@@ -232,7 +236,7 @@ It's recommended to create a backup before making any major changes to your Z-Wa
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 %}
+{% note %}
**Risk of damage to the device due to firmware update**
A firmware update can damage your Z-Wave device.
@@ -241,7 +245,7 @@ A firmware update can damage your Z-Wave 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 %}
+{% endnote %}
### Prerequisites
@@ -251,10 +255,11 @@ The Home Assistant and Z-Wave JS teams do not take any responsibility for any da
### 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.
+2. Select the **Z-Wave** integration.
+ - Then, on the entry of the hub, select {% icon "ic:baseline-arrow-forward-ios" %} to open the device info page.
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**
+ - **Notice: 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.
@@ -267,12 +272,15 @@ 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.
+- If there are any devices still paired with the controller when it is reset, they will have to be removed from their old network before they can be re-paired.
- The device firmware will remain on the device.
### Prerequisites
- Administrator rights on Home Assistant
+- [Backup your Z-Wave network](#backing-up-your-z-wave-network)
+- [Remove all devices that are paired with your controller from the network](#removing-a-device-from-the-z-wave-network).
+ - Removing can be done by any controller, not just the one that originally managed the network. In theory, this could also be done later.
### To reset a Z-Wave controller
diff --git a/source/_posts/2025-06-25-voice-chapter-10.markdown b/source/_posts/2025-06-25-voice-chapter-10.markdown
new file mode 100644
index 00000000000..a5e0d4a9cba
--- /dev/null
+++ b/source/_posts/2025-06-25-voice-chapter-10.markdown
@@ -0,0 +1,167 @@
+---
+layout: post
+title: "Next iteration of our Voice Assistant is here - Voice chapter 10"
+description: "This new tool brings fast, local speech processing to low-end hardware, along with some useful new voice and AI features"
+date: 2025-06-25 00:00:01
+date_formatted: "June 25, 2025"
+author: Mike Hansen
+comments: true
+categories: Assist
+og_image: /images/blog/2025-06-voice-chapter-10/art.png
+---
+
+
+
+Welcome to Voice chapter 10 🎉, [a series](/blog/categories/assist/) where we share all the key developments in Open Voice. This chapter includes improvements across every element of Open Voice. Improvements that allow it to support more languages, be used on more hardware, make it easier to contribute to, all while making it faster and more reliable.
+
+## Help steer Open Voice
+
+Before we get going, we just want to say that Voice Chapter 10 isn't just a broadcast; **it's an invitation** ✉️. Our **public Voice project board** lives on GitHub, and it shows what we're fixing, currently building, and what we'll work on next. Every card is open for comments, so please feel free to have a look and participate in the discussion.
+
+👉 **Project board**: [https://github.com/orgs/OHF-Voice/projects/2](https://github.com/orgs/OHF-Voice/projects/2)
+
+## ESPHome gains a voice
+
+When we began designing and building the firmware for our open voice assistant hardware, the [Home Assistant Voice Preview Edition](/voice-pe/), we had several specific features in mind:
+
+1. Run wake words on the device.
+2. Use a fully open-sourced media player platform that can decode music from high-quality sources.
+3. Wake words can be enabled and disabled on the fly; for example, "stop" is only activated when a long-running announcement is playing or when a timer is ringing.
+4. Mix voice assistant announcements on top of reduced volume (a.k.a. "ducked") music.
+
+These features needed to run within ESPHome, the software that powers the device. In the beginning, ESPHome could only do 1 and 2, but not even at the same time!
+
+To include all these features, we initially built them as external components, allowing us to iterate fast (and of course break many things along the way). We always intended to bring these components into ESPHome, and the process of bringing them in is called *upstreaming*. This would allow anyone to easily build a voice assistant that includes all the features of Voice Preview Edition, and that's what we've been working on since its launch last December.
+
+
No device left behind!
+
+ESPHome version 2025.5.0 has all these components included! We didn't just spend this time copying the code over, but we also worked hard to improve it by making it more generalizable, easier to configure, and much faster.
+
+As an example of these speed improvements, the highest CPU load on the Voice Preview Edition happens when music is being mixed with a long announcement. In this situation, it is decoding two different FLAC audio streams while also running three microWakeWord models (a Voice Activity Detector, "Okay Nabu", and "Stop"). With the original December firmware, this used 72% of the CPU 😅. With the new optimizations, which are all now available in ESPHome, the current Voice Preview Edition firmware only uses 35%❗ These improvements even allow the extremely resource-constrained ATOM Echo to support many of these features, including media playback and continuing conversations.
+
+## Make your own Voice Preview Edition
+
+
I'll just pretend I understand all this
+
+Speaking of voice hardware becoming more like Voice Preview Edition, why not use that class-leading hardware as the basis for your own creations? We've now got the KiCad project files, which include the electrical schematic and circuit board layout, along with other helpful documents [available for download on GitHub](https://github.com/NabuCasa/home-assistant-voice-pe). Combined with our open source firmware files, this will allow anyone to build on the work we've done and make the open voice assistant of their dreams. Bigger speaker, built-in presence sensor, a display featuring a smiling Nabu mascot --- the options are nearly endless. Building Voice Preview Edition was always meant to bootstrap an entire ecosystem of voice hardware, and we're already seeing some amazing creations with this open technology.
+
+## Now you're speaking my language
+
+### Speech-to-Phrase gets more fluent
+
+[In case you missed it](/blog/2025/02/13/voice-chapter-9-speech-to-phrase/#voice-for-the-masses), we built our own locally run speech-to-text (STT) tool that can run fast even on hardware-constrained devices. [Speech-to-Phrase](https://github.com/OHF-Voice/speech-to-phrase) works slightly differently from other STT tools, as it only accepts specific predetermined phrases, hence the name. We have been making large strides in making this the best option for local and private voice control in the home.
+
+The sentence format for Speech-to-Phrase is getting an upgrade! Besides making it simpler for community members to contribute, it now allows for more thorough testing to ensure compatibility with existing Home Assistant commands.
+
+We have also begun experimenting with more precise sentence generation, restricting sentences like "set the {light} to red" only to lights that support setting color. Another improvement is making Speech-to-Phrase more careful about combining names and articles in certain languages. For instance, in French, a device or entity that starts with a vowel or an "h" will have an "l" apostrophe at its beginning, such as l'humidificateur or l'entrée. Allowing Speech-to-Phrase to understand this avoids it guessing pronunciations for nonsensical combinations.
+
+Speech-to-Phrase currently supports **six languages**, namely English, French, German, Dutch, Spanish, and Italian. We are now engaging with language leaders to add support for Russian, Czech, Catalan, Greek, Romanian, Portuguese, Polish, Hindi, Basque, Finnish, Mongolian, Slovenian, Swahili, Thai, and Turkish --- this takes our language support to **21 languages** 🥳!
+
+These new models were originally trained by community members from the [Coqui STT](https://github.com/coqui-ai/STT-models) project (which is now defunct, but luckily their work was open source --- *another example of FOSS saving the day*), and we are very grateful for the chance to use them! Performance and accuracy vary heavily by language, and we may need to train our own models based on feedback from our community.
+
+### Piper is growing in volume
+
+[Piper](https://github.com/OHF-Voice/piper1-gpl) is another tool we built for local and private voice in the home, and it quickly turns text into natural-sounding speech. Piper is becoming one of the most comprehensive open source text-to-speech options available and has really been building momentum. Recently, we have added support for new languages and provided additional voices for existing ones, including,
+
+- **Dutch** - Pim and Ronnie - *new voices*
+- **Portuguese (Brazilian)** - Cadu and Jeff - *new voices*
+- **Persian/Farsi** - Reza_ibrahim and Ganji - *new language*
+- **Welsh** - Bu_tts - *new voices*
+- **Swedish** - Lisa - *new voices*
+- **Malayalam** - Arjun and Meera - *new language*
+- **Nepali** - Chitwan - *new voices*
+- **Latvian** - aivar- *new voices*
+- **Slovenian** - artur - *new voices*
+- **Slovak** - lili - *new voices*
+- **English** - Sam (non-binary) and Reza_ibrahim - *new voices*
+
+This brings Piper's supported languages and dialects from 34 to now 39 🙌! This allows a nice majority of the world's population (give or take 3 billion people) the ability to generate speech in their native tongue 😎!
+
+### Scoring language support
+
+
This is the score sheet for just intents... it can get complicated
+
+Home Assistant users, when starting their voice journey, typically ask one question first: "Is my language supported?" Due to how flexible voice assistants in Home Assistant are, this seemingly simple question is quite complicated to answer! At a high level, a voice assistant needs to convert your spoken audio into text (speech-to-text), figure out what you want it to do (intent recognition), and then respond back to you (text-to-speech). Each part of this pipeline can be mixed and matched, and intent recognition can even be augmented with a fallback to a large language model (LLM), which is great at untangling misunderstood words or complex queries.
+
+Considering the whole pipeline, the question "Is my language supported?" becomes "How well does each part support my language?" For Home Assistant Cloud, which uses Microsoft Azure for voice services, we can be confident that all supported languages work well.
+
+Local options like [Whisper](https://github.com/openai/whisper) (speech-to-text) and, to a lesser extent, Piper (text-to-speech), may technically support a language but perform poorly in practice or within the limits of a user's hardware. Whisper, for example, has models with different sizes that require more powerful hardware to run as they get larger. A language like French may work well enough with the largest Whisper model (which requires a GPU), but is unusable on a Raspberry Pi or even an N100-class PC.
+
+Our own Speech-to-Phrase system supports French well and runs well on a Raspberry Pi 4 or [Home Assistant Green](/green/). The trade-off is that only a limited set of pre-defined voice commands are supported, so you can't use an LLM as a fallback (because unexpected commands can't be converted into text for the LLM to process).
+
+Finally, of course, not everyone wants to (or can) be reliant on the cloud, and they need a fully local voice assistant. This means that language support depends as much on the user's preferences as their hardware and the available voice services. For these reasons, we have split out language support into three categories based on specific combinations of services:
+
+- ***Cloud*** - Home Assistant Cloud
+- ***Focused Local*** - Speech-to-Phrase and Piper
+- ***Full Local*** - Whisper and Piper
+
+Each category is given a score from 0 to 3, with 0 meaning it is unsupported and 3 meaning it is fully supported. Users who choose Home Assistant Cloud can look at the Cloud score to determine the level of language support. For users wanting a local voice assistant, they will need to decide between Focused Local (limited commands for low-powered hardware) and Fully Local (open-ended commands for high-powered hardware). Importantly, these scores take into account the availability of voice commands translated by our language leaders. A language's score in every category will be lowered if it has minimal coverage of useful voice commands.
+
+With these language scores, we hope users will be able to make informed decisions when starting on their voice journeys in Home Assistant. They're currently featured in our voice setup wizard in Home Assistant, and on our [language support page](/voice_control/#supported-languages-and-sentences).
+
+## What's in a name
+
+Voice commands in Home Assistant trigger *intents*, which are flexible actions that use names instead of IDs. Intents handle things like turning devices on or off, or adjusting the color of lights. Until now, sentence translations focused on whether a language supported an intent (like turning devices on/off) but didn't clearly show whether the command supported device names, areas names, or both. This can change from language to language, which made gaps hard to spot. We're switching to a new format that highlights these combinations, making it easier for contributors to see what names are supported, which should make for simpler translations.
+
+## Continued conversation updates
+
+Since the last voice chapter, the voice team has worked on making Assist more conversational for LLM-based agents. We started with LLM-based agents because it was simpler to iterate on. If the LLM returns with a question, we will detect that and keep the conversation going, without the need for you to say "Ok Nabu" again.
+
+On top of that, you can now initiate a conversation with a new action called `start_conversation` directly from an automation, or a dashboard. This provides the full spectrum of conversation to LLM-based agents.
+
+Here is a quick demonstration of two features working hand-in-hand:
+
+
+
+## Media Search and Play intent
+
+What's great about Home Assistant and open source is that sometimes the best ideas come from other projects in the community. Early on, many people were interested in driving Music Assistant with voice, but central pieces were missing on Home Assistant, such as the ability to search a media library.
+
+We worked hard on bringing this functionality to the core experience of Home Assistant and created a new intent, the **Search and Play** intent. You can now speak to your voice assistant and ask it to play music in any room in your home.
+
+
+
+The intent can be used by an LLM-based conversation agent, but we also have sentences that work without any LLM magic. You can find the [English sentences here](https://github.com/OHF-Voice/intents/tree/main/sentences/en/HassMediaSearchAndPlay). As it's a new feature, support may vary based on your language, and please be patient while our amazing language leaders make these translations.
+
+## Future work - Assist will have something to say
+
+Talking to your home should feel as natural as chatting with a friend across the kitchen counter. Large-language models (LLMs) already prove how smooth that back-and-forth can be, now we want every Home Assistant installation to enjoy the same experience. We're therefore zeroing in on three key use-cases for the default conversation agent, which include critical confirmations, follow-ups, and custom conversations. Just note these are still at the early stages of development and it may be some time before you see some of these features.
+
+### Critical confirmations
+
+Some actions are too important to execute without a quick double-check. Unlocking the front door, closing shutters, or running a "leaving home" script. We want you to be able to mark those entities as **protected**. Whenever you speak a command that touches one of those entities, Assist will ask for verbal confirmation before acting:
+
+
+ Ok Nabu, unlock the front door
+ Are you sure?
+ Yes
+ Unlocked
+
+
+Because every household is different, we are thinking about managing these confirmations **per entity** and making them fully user-configurable.
+
+### Follow-up on missing parameters
+
+Sometimes Assist grasps what you want, but needs more detail to carry it out. Instead of failing, we want Assist to ask for the missing piece proactively. Here is an example to illustrate.
+
+
+ Ok Nabu, set a timer
+ For how long?
+ 15 minutes
+ Timer started
+
+
+For now, we are still assessing the relevant sentences for that use case. We're implementing follow-ups with timers, though finding more is not currently our top priority. We are, however, open to suggestions.
+
+### Custom conversations
+
+As with any other part of Home Assistant, we want the conversation aspect of Assist to be personalized. Simple voice transactions can already be created with our automation engine using the `conversation` trigger and the `set_conversation_response` action.
+
+We want to bring the same level of customization to conversations, allowing you to create fully local, predefined conversations to be triggered whenever you need them, such as when you enter a room, start your bedtime routine, etc.
+
+We are focusing first on making custom conversations possible, so that you can show us what you are building with this new powerful tool. We will then tackle the critical confirmations use case, and finally, the follow-ups when parameters are missing.
+
+## Let's keep moving Open Voice forward
+
+Only a couple of years ago, voice control was the domain of data-hungry corporations, and basically none of this open technology existed. Now, as a community, we've built all the parts needed to have a highly functional voice assistant, which is completely open and free for anyone to use (or even build on top of).\
+Every chapter, we make steady progress, which is only possible with your support. Whether from those who fund its development by supporting the Open Home Foundation (by subscribing to [Home Assistant Cloud](/cloud/), and buying [official Home Assistant hardware](/voice-pe/)) or those who contribute their time to improving it. As always, we want to support every language possible, and if you don't see your native tongue on our supported list, please consider [contributing to this project](/voice_control/contribute-voice).
diff --git a/source/_posts/2025-06-26-switchbot-joins-works-with-home-assistant.markdown b/source/_posts/2025-06-26-switchbot-joins-works-with-home-assistant.markdown
new file mode 100644
index 00000000000..e958869dd99
--- /dev/null
+++ b/source/_posts/2025-06-26-switchbot-joins-works-with-home-assistant.markdown
@@ -0,0 +1,85 @@
+---
+layout: post
+title: "SwitchBot joins Works with Home Assistant"
+description: "The first air purifiers and cleaning robots join the program, with options for Matter and Bluetooth connectivity."
+date: 2025-06-26 00:00:01
+date_formatted: "June 26, 2025"
+author: Miranda Bishop
+comments: true
+categories: Works-with-Home-Assistant
+og_image: /images/blog/2025-06-switchbot/art.jpg
+---
+
+
+
+Please welcome the latest addition to the [Works with Home Assistant](https://works-with.home-assistant.io/) program, [SwitchBot!](https://www.switch-bot.com/) This year has seen a lot of 'firsts' within the program, and this launch certainly keeps up this trend. Read on to see the first *Air Purifiers* and *Vacuums / Cleaning Robots*! What's more, SwitchBot is bringing this first set of devices into the program with multiple connectivity options. Pick from their [Bluetooth integration](/integrations/switchbot/), Matter via a hub, or standalone Matter devices as well. All this gives you even more choice in how you set up your smart home, while providing the best experience with Home Assistant.
+
+## Making the Switch...Bot
+
+SwitchBot quickly gained traction in the smart home industry with their original finger bots, which sit over non-smart switches and physically press them down on your behalf. Since then, they've expanded to include many other smart home devices like curtain robots, hubs, air purifiers, and cleaning robots. We were excited to see these new products in person at CES earlier this year and meet up with their team.
+
+SwitchBot even got involved with [Community Day](/blog/2025/06/24/community-day-2025-wrap-up/), hosting a meet-up in Shenzhen, China. We love that the 'Works with' partners show that they're passionate about engaging with our community, taking the partnership much further than just a label on a box.
+
+
+
"At SwitchBot, we're committed to empowering users with seamless and intelligent home automation. By collaborating with Home Assistant's passionate, tech-savvy community, we're able to push boundaries and deliver more integrated, intuitive experiences. Together, we aim to expand what's possible, offering users greater flexibility to connect, control, optimize their homes, and to make it simple."
+
- Richard Mou - Co-Founder, SwitchBot
+
+
+## Devices
+
+In case you didn't know, Works with Home Assistant differs from other certification programs as products are rigorously tested in-house to ensure they work seamlessly out of the box with Home Assistant. Any company joining also commits to providing long-term support and firmware updates while being a positive force in the Home Assistant community. Works with Home Assistant is operated by the [Open Home Foundation](https://www.openhomefoundation.org/), and the support of [Home Assistant Cloud](/cloud/) subscribers funds this work.
+
+The SwitchBot team have put special focus on integrating specifically for Home Assistant and have been working hard on their [Bluetooth integration](/integrations/switchbot/). Though the community played a central role in the development of the integration, and SwitchBot is very thankful for this work, they took a more active role in its development.
+
+One of the terms of the 'Works with' program is that Bluetooth devices must connect over an integration that is kept up to a certain code quality (we call this our ['Gold tier'](/docs/quality_scale/) on our quality scale). It also must be maintained by the manufacturers themselves, rather than overly relying on community members to do the hard work. This puts the responsibility on the shoulders of the manufacturers to make sure they're responding to bugs and keeping the integration up long term. If you’re interested in SwitchBot’s Bluetooth products but your Home Assistant system doesn’t have built-in Bluetooth, the easiest way to connect them is by using a [Bluetooth Proxy](/integrations/bluetooth/#remote-adapters-bluetooth-proxies).
+
+If you prefer Matter, SwitchBot also has devices that are certified for use with one of their Matter hubs: either the [SwitchBot Hub 2](https://www.switch-bot.com/products/switchbot-hub-2) or the [Hub 3](https://www.switch-bot.com/products/switchbot-hub-3). There are also some that can work via Matter-over-WiFi as standalone devices. We are currently testing even more of SwitchBot’s Matter devices for the program.
+
+**Bluetooth**
+- [SwitchBot Lock Ultra](https://www.switch-bot.com/products/switchbot-lock-ultra)
+- [SwitchBot Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
+- [SwitchBot Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+- [SwitchBot Leak Detector](https://www.switch-bot.com/products/switchbot-water-leak-detector) - also works using Matter via a hub
+- [SwitchBot Meter](https://www.switch-bot.com/products/switchbot-meter) - also works using Matter via a hub
+- [SwitchBot Meter Pro](https://www.switch-bot.com/products/switchbot-meter-pro) - also works using Matter via a hub
+- [SwitchBot Meter Pro CO2](https://www.switch-bot.com/products/switchbot-meter-pro-co2-monitor) - also works using Matter via a hub
+- [SwitchBot Indoor/Outdoor Thermo-Hygrometer](https://www.switch-bot.com/products/switchbot-indoor-outdoor-thermo-hygrometer) - also works using Matter via a hub
+- [SwitchBot Curtain 3](https://www.switch-bot.com/products/switchbot-curtain-3) - also works using Matter via a hub
+- [SwitchBot Contact Sensor](https://www.switch-bot.com/products/contact-sensor) - also works using Matter via a hub
+- [SwitchBot Roller Shade](https://www.switch-bot.com/products/switchbot-roller-shade) - also works using Matter via a hub
+- [SwitchBot Lock Pro](https://www.switch-bot.com/products/switchbot-lock-pro) - also works using Matter via a hub
+
+**Matter-Over-WiFi (standalone, without requiring a hub)**
+- [SwitchBot Air Purifier](https://www.switch-bot.com/products/switchbot-air-purifier)
+- [SwitchBot Air Purifier Table](https://www.switch-bot.com/products/switchbot-air-purifier-table)
+- [SwitchBot Multitasking Robot K20 + Pro](https://www.switch-bot.com/products/switchbot-multitasking-household-robot-k20-pro)
+
+***Note:*** *Home Assistant Container does not support Matter, and requires Home Assistant OS.*
+
+## A smart home is a clean home
+
+
Eat your heart out Wall-E
+
+SwitchBot's K20 is the first cleaning robot in the Works with Home Assistant program as well as the world's first multi-tasking household robot. This wacky robot can be paired with lots of other items in the range, including the certified air purifiers, to make some really cool Home Assistant use cases. Just imagine, you're making some delicious dinner, but oh no, you've left a pan alone for too long and it starts to smell and burn. You could summon the K20 with an air purifier on top using the Home Assistant Voice Preview Edition. A few moments later, it's found its way to you and gets started on clearing the air in your kitchen. Plus, as these can both work via Matter, there's no need for cloud involvement. Some of the items also come with a table top so this device has some great applications for anyone with limited mobility.
+
+## Bot to the future
+
+These devices are the first certified items, but SwitchBot is working to get many more tested and fully feature-rich with Home Assistant. We're excited to keep expanding this list over time, but if you can't wait (and this work is only possible with the support of our [Home Assistant Cloud](/cloud/) subscribers), you can see the list of the other devices they are working on [here](https://www.switch-bot.com/pages/home-assistant).
+
+## FAQs
+
+***Q: If I have a device that is not listed under 'Works with Home Assistant' does this mean it's not supported?***
+
+A: No! It just means that it hasn't gone through a testing schedule with our team or doesn't fit the requirements of the program. It might work fine and be added to our testing later down the road. Though it might only have limited functions that are being worked on, or use a connectivity type we don't currently test for in the program.
+
+***Q: Ok, so what's the point of the Works with program?***
+
+A: It highlights the devices we know work well with Home Assistant and the brands that make a long-term commitment to keeping support for these devices going. The certification agreement specifies that the devices must have full functionality within Home Assistant, operate locally without the need for cloud, and will continue to do so long-term.
+
+***Q: How were these devices tested?***
+
+A: The Bluetooth devices in this list were tested using a standard Home Assistant Green Hub, the SwitchBot Bluetooth Integration, a USB Bluetooth adapter, and an ESPHome Bluetooth Proxy. The Matter-over-WiFi devices were also tested with Home Assistant Green and our [certified Matter Integration](/integrations/matter/). If you have another hardware setup or integration, that is often not a problem, but we test against these as they are the most effective way for our team to certify within our ecosystem.
+
+***Q: Will you be adding more SwitchBot devices to the program?***
+
+A: Absolutely! SwitchBot has a quickly growing set of product lines that we're working to certify together, subject to the integrations fully covering all the functions.
diff --git a/source/_posts/2025-07-02-release-20257.markdown b/source/_posts/2025-07-02-release-20257.markdown
new file mode 100644
index 00000000000..ee9977a34c8
--- /dev/null
+++ b/source/_posts/2025-07-02-release-20257.markdown
@@ -0,0 +1,471 @@
+---
+layout: post
+title: "2025.7: That's the question"
+description: "Assist can now ask you questions! Enjoy the completely redesigned Area card with flexible layouts, the birth of integration sub-entries, full-screen code editors for better YAML and template editing, an overhauled integration page, and the improved Areas dashboard overview. Of course, tons of quality-of-life improvements!"
+date: 2025-07-02 00:00:00
+date_formatted: "July 2, 2025"
+author: Franck Nijhof
+author_twitter: frenck
+comments: true
+categories:
+ - Release-Notes
+ - Core
+og_image: /images/blog/2025-07/social.png
+---
+
+
+
+Home Assistant 2025.7! 🎉
+
+Whew! It's hot out there! 🌡️ While most of Europe is dealing with a heat wave right now, we're here to cool things down with an exciting July release that's packed with features I'm genuinely excited about.
+
+Before we dive in, if you missed it, we recently published [Voice Chapter 10](/blog/2025/06/25/voice-chapter-10/) where we explored moving beyond reactive voice assistants that only respond when you talk to them. Instead, we envisioned a future where your voice assistant can be conversational and initiate conversations. Speaking of that, this release delivers on that vision in a big way!
+
+I'm absolutely stoked about the new Ask Question action for Assist! 🗣️ This is something that sets Home Assistant apart from every other voice assistant out there. Finally, your voice assistant can take the initiative and ask *you* what your smart home should do. No more waiting for wake words, your assistant can start the conversation when it makes sense. It's the kind of feature that gets me really excited thinking about all the possibilities.
+
+The redesigned Area card is another winner! 🏠 I'll probably be replacing a few tile cards I've been using to navigate to my area dashboards with this new, more flexible version. It integrates beautifully with the Sections dashboard and gives you so many more options for controlling your spaces.
+
+And that's just the beginning! We've got integration sub-entries making integrations even more extensible, full-screen code editors for those lengthy YAML and template edits, and tons of quality-of-life improvements throughout.
+
+Stay cool, and enjoy the release!
+
+../Frenck
+
+
+
+- [Let Assist ask the questions!](#let-assist-ask-the-questions)
+- [Redesigned Area card](#redesigned-area-card)
+- [Improving the Areas dashboard overview](#improving-the-areas-dashboard-overview)
+- [Integration sub-entries](#integration-sub-entries)
+- [Integration page gets an overhaul](#integration-page-gets-an-overhaul)
+- [Integrations](#integrations)
+ - [New integrations](#new-integrations)
+ - [Noteworthy improvements to existing integrations](#noteworthy-improvements-to-existing-integrations)
+ - [Integration quality scale achievements](#integration-quality-scale-achievements)
+ - [Now available to set up from the UI](#now-available-to-set-up-from-the-ui)
+ - [Farewell to the following](#farewell-to-the-following)
+- [Other noteworthy changes](#other-noteworthy-changes)
+- [Full-screen code editors](#full-screen-code-editors)
+- [Improved dashboard creation experience](#improved-dashboard-creation-experience)
+- [Need help? Join the community!](#need-help-join-the-community)
+- [Backward-incompatible changes](#backward-incompatible-changes)
+- [All changes](#all-changes)
+
+## Let Assist ask the questions!
+
+In our latest [roadmap](/blog/2025/05/09/roadmap-2025h1/), we shared our goal to make Assist more conversational. Until now, Assist was mostly transactional, meaning when you would say something, you would get a response or it would perform an action, and that would be the end of it (unless some LLM magic jumped in). With this release, we're taking a big step forward: meet the new Ask Question action.
+
+This lets you build custom conversations from the comfort of our automation engine. Ask a question, handle the answer, and keep the interaction going.
+
+
+
+This action even allows you to define expected answers so that our extremely fast speech engine, Speech-to-Phrase, can train on them. Yes, fully local, custom conversations!
+
+To help you get started, we have provided a blueprint that covers the most common use case --- Asking a closed Yes/No question:
+
+{% my blueprint_import badge blueprint_url="https://www.home-assistant.io/blueprints/blog/2025-07/ask_yes_no_question.yaml" %}
+
+This blueprint allows you to focus on what you want to do if you answer positively or negatively to any question that your voice assistant will ask. The blueprint supports 50 different ways of saying “Yes” and “No” (including phrases like “Make it so” and “Let’s not”). Here it is in action!
+
+
+
+In case you want to dive deeper into conversation building, here is an example on how to ask a question and process the different answers:
+
+{% details "Example YAML automation actions" %}
+
+This example asks the user what kind of music they want to listen to, and then plays the selected genre or artist on a media player.
+
+{% raw %}
+
+```yaml
+actions:
+ - action: assist_satellite.ask_question
+ data:
+ entity_id: assist_satellite.living_room_voice_assistant
+ preannounce: true # optional
+ preannounce_media_id: media-source://... # optional
+ question: "What kind of music do you want to listen to?"
+ answers:
+ - id: genre
+ sentences:
+ - "genre {genre}"
+ - id: artist
+ sentences:
+ - "artist {artist}"
+ response_variable: answer
+ - choose:
+ - conditions: "{{ answer.id == 'genre' }}"
+ sequence:
+ - action: music_assistant.play_media
+ data:
+ media_id: "My {{ answer.slots.genre }} playlist"
+ media_type: playlist
+ target:
+ entity_id: media_player.living_room_speakers
+ - conditions: "{{ answer.id == 'artist' }}"
+ sequence:
+ - action: music_assistant.play_media
+ data:
+ media_id: "{{ answer.slots.artist }}"
+ media_type: artist
+ target:
+ entity_id: media_player.living_room_speakers
+```
+
+{% endraw %}
+
+{% enddetails %}
+
+## Redesigned Area card
+
+Originally introduced a few years ago, the [Area card](/dashboards/area/) offered a way to display an {% term area %} overview within the dashboard. However, it wasn't fully compatible with the [Sections](/dashboards/sections/) dashboard, which limited its practical use in that context.
+
+The card has now been completely redesigned with a look and feel similar to the [Tile card](/dashboards/tile/). It integrates seamlessly into the Sections dashboard thanks to its flexible layouts. You can choose between a compact version that shows only an icon and the area name, or a more detailed view featuring elements like your camera feed and buttons to toggle your lights or fans.
+
+
+
+The control section itself has also been revamped, allowing you to choose which controls to include and rearrange them as you want. As a result of these changes, if you’re currently using the area cards, you’ll need to reconfigure the controls on them.
+
+Additionally, the card now supports controlling [cover](/integrations/cover/) {% term entities %}.
+
+## Improving the Areas dashboard overview
+
+The April release introduced an experimental [Areas dashboard](/dashboards/dashboards/#areas-dashboard), designed to automatically generate a ready-to-use interface based on the configured areas within the home. However, the preview could become cluttered if you had a lot of devices in a room.
+
+This release introduces an all-new overview that leverages the redesigned Area card, making it easy to view and control your main devices by room with a single click. It also acts as a navigation hub, giving you quick access to detailed views of each area.
+
+
+
+## Integration sub-entries
+
+Ever wondered why you had to enter your API keys for every AI agent you created, even though they all used the same key? Or why you had to authenticate for every calendar you added, regardless of the fact that they all shared the same account? Or why you couldn’t add MQTT devices from the UI?
+
+This release solves that with the introduction of integration sub-entries. This allows you to add a sub-entry to an existing {% term integration %} entry. In practice, this means that your {% term integration %} entry has your credentials, and all the sub-entries use these credentials. In the sub-entry, you can then configure what should be done with these credentials, such as fetching a specific calendar, adding three AI agents with different prompts using the same OpenAI account, or in the case of MQTT, configuring devices that are connected to your MQTT broker.
+
+
+
+The following {% term integrations %} now support sub-entries as of this release: [Anthropic], [Google Generative AI], [MQTT], [Ollama], [OpenAI Conversation], and [Telegram Bot].
+
+[Anthropic]: /integrations/anthropic
+[Google Generative AI]: /integrations/google_generative_ai_conversation
+[MQTT]: /integrations/mqtt
+[Ollama]: /integrations/ollama
+[OpenAI Conversation]: /integrations/openai_conversation
+[Telegram Bot]: /integrations/telegram_bot
+
+## Integration page gets an overhaul
+
+The {% term integration %} page got a big overhaul! It now has support for sub-entries, allowing you to easily add a sub-entry to an {% term integration %} entry along with being able to see which devices and services belong to which sub-entry.
+
+But we took the opportunity to do more. Instead of just showing your {% term integration %} entries, it now also shows the devices and services provided by that configuration entry. This makes it much easier to manage your devices and see the relationship between your devices and their {% term integrations %} at a glance.
+
+
+
+## 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:
+
+- **[Altruist]**, added by [@LoSk-p]
+ Monitor air quality and environmental conditions with the Altruist sensor, providing local data for temperature, humidity, PM2.5/PM10, CO2, noise levels, and more.
+- **[PlayStation Network]**, added by [@JackJPowell]
+ Integrate with the PlayStation Network to track your currently playing games and display game information on your dashboard.
+- **[Tilt Pi]**, added by [@michaelheyman]
+ Monitor your Tilt Pi hydrometer for brewing temperature and specific gravity measurements during your brewing process.
+- **[VegeHub]**, added by [@Thulrus]
+ Monitor and control your garden with the Vegetronix VegeHub, gathering sensor data and controlling irrigation relays for automated plant care.
+
+[@JackJPowell]: https://github.com/JackJPowell
+[@LoSk-p]: https://github.com/LoSk-p
+[@michaelheyman]: https://github.com/michaelheyman
+[@Thulrus]: https://github.com/Thulrus
+[Altruist]: /integrations/altruist
+[PlayStation Network]: /integrations/playstation_network
+[Tilt Pi]: /integrations/tilt_pi
+[VegeHub]: /integrations/vegehub
+
+### 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:
+
+- Love that song? [@marcelveldt] added a button {% term entity %} to [Music Assistant] that lets you add the currently playing item to your favorites with a single click. It works with queues, external sources, and even radio stations!
+- [ESPHome] now supports sub-devices! Thanks to [@bdraco], you can now represent multiple logical devices with a single ESP device in Home Assistant. This is particularly useful for RF bridges, Modbus gateways, and other devices that can control multiple devices. This feature requires the soon-to-be-released ESPHome 2025.7. Awesome addition!
+- [Paperless-ngx] now includes an update {% term entity %} to keep your document management system up to date. Thanks, [@fvgarrel]!
+- Battery management control has been added to [HomeWizard] with [@DCSBL] implementing battery group mode, allowing you to modify the charging and discharging behavior of your HomeWizard batteries!
+- [Reolink] cameras received a ton of love (again) from [@starkillerOG]! New features include IR brightness control, baby cry sensitivity adjustment, privacy mask switches, and full support for both PoE and WiFi floodlights with multiple command ID pushes. Impressive!
+- [@mib1185] added an update {% term entity %} to the [Immich] {% term integration %}. Nice!
+- The [Homee] {% term integration %} expanded significantly! [@Taraman17] added a siren platform for security alerts and support for the HeatIt Thermostat TF056. Nice!
+- Energy monitoring got better in [Adax] with [@parholmdahl] adding energy sensors, so you can track your heating consumption!
+- [@ViViDboarder] made [Ollama] more flexible by adding a config option for controlling the think parameter. More control over your local AI!
+- Samsung refrigerator owners! [@mswilson] added ice bites control and water filter replacement/usage sensors to the [SmartThings] {% term integration %}.
+- [Russound RIO] got a major upgrade from [@noahhusby], adding sub-device support plus new number and switch {% term entities %} for enhanced zone control.
+- [@chemelli74] expanded [Alexa Devices] with sensor platforms and additional binary sensors. Now you can get more data from your Echo devices!
+- [Matter] keeps growing! [@lboue] added dishwasher alarm support and battery storage capabilities. Thanks!
+- YAML fans will appreciate [@frenck] adding unique ID support to [Trend] {% term integration %} configuration.
+- The [LaMetric] Time got an update {% term entity %} as well, thanks [@joostlek]!
+- [Google Generative AI] now defaults to the newer, faster Gemini 2.5 Flash model. A noteworthy performance boost by [@tronikos]!
+- [Google Generative AI] now supports text-to-speech (TTS) with 30 voices and 24 languages. It supports fine-grained control over style and sound, for example, "Say cheerfully: Have a wonderful day!". Thanks [@lanthaler]!
+- [Enphase Envoy] users get detailed DC voltage and current readings from their solar panels thanks to [@Bidski]. This is perfect for monitoring individual panel health and optimizing production!
+- [@zerzhang] brought evaporative humidifier support to [SwitchBot], expanding your climate control options.
+
+[@bdraco]: https://github.com/bdraco
+[@Bidski]: https://github.com/Bidski
+[@chemelli74]: https://github.com/chemelli74
+[@DCSBL]: https://github.com/DCSBL
+[@frenck]: https://github.com/frenck
+[@fvgarrel]: https://github.com/fvgarrel
+[@joostlek]: https://github.com/joostlek
+[@lanthaler]: https://github.com/lanthaler
+[@lboue]: https://github.com/lboue
+[@marcelveldt]: https://github.com/marcelveldt
+[@mib1185]: https://github.com/mib1185
+[@mswilson]: https://github.com/mswilson
+[@noahhusby]: https://github.com/noahhusby
+[@parholmdahl]: https://github.com/parholmdahl
+[@starkillerOG]: https://github.com/starkillerOG
+[@Taraman17]: https://github.com/Taraman17
+[@tronikos]: https://github.com/tronikos
+[@ViViDboarder]: https://github.com/ViViDboarder
+[@zerzhang]: https://github.com/zerzhang
+[Adax]: /integrations/adax
+[Alexa Devices]: /integrations/alexa_devices
+[Enphase Envoy]: /integrations/enphase_envoy
+[ESPHome]: /integrations/esphome
+[Google Generative AI]: /integrations/google_generative_ai_conversation
+[Homee]: /integrations/homee
+[HomeWizard]: /integrations/homewizard
+[Immich]: /integrations/immich
+[LaMetric]: /integrations/lametric
+[Matter]: /integrations/matter
+[Music Assistant]: /integrations/music_assistant
+[Ollama]: /integrations/ollama
+[Paperless-ngx]: /integrations/paperless_ngx
+[Reolink]: /integrations/reolink
+[Russound RIO]: /integrations/russound_rio
+[SmartThings]: /integrations/smartthings
+[SwitchBot]: /integrations/switchbot
+[Trend]: /integrations/trend
+
+### 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:
+
+- **2 integrations reached platinum** 🏆
+ - [Bosch Alarm], thanks to [@sanjay900]
+ - [Home Connect], thanks to [@Diegorro98]
+
+- **1 integration reached gold** 🥇
+ - [ista EcoTrend], thanks to [@tr4nt0r]
+
+- **1 integration reached silver** 🥈
+ - [KNX], thanks to [@farmio]
+
+- **2 integrations reached bronze** 🥉
+ - [Samsung TV], thanks to [@chemelli74]
+ - [Telegram Bot], thanks to [@hanwg]
+
+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/
+[@chemelli74]: https://github.com/chemelli74
+[@Diegorro98]: https://github.com/Diegorro98
+[@farmio]: https://github.com/farmio
+[@hanwg]: https://github.com/hanwg
+[@sanjay900]: https://github.com/sanjay900
+[@tr4nt0r]: https://github.com/tr4nt0r
+[Bosch Alarm]: /integrations/bosch_alarm
+[Home Connect]: /integrations/home_connect
+[ista EcoTrend]: /integrations/ista_ecotrend
+[KNX]: /integrations/knx
+[Samsung TV]: /integrations/samsungtv
+[Telegram Bot]: /integrations/telegram_bot
+
+### Now available to set up from the UI
+
+While most {% term integrations %} can be set up directly from the Home Assistant
+user interface, some were only available using YAML configuration. We keep moving
+more integrations to the UI, making them more accessible for everyone
+to set up and use.
+
+The following integration is now available via the Home Assistant UI:
+
+- **[Telegram Bot]**, done by [@hanwg]
+
+### Farewell to the following
+
+The following {% term integrations %} are also no longer available as
+of this release:
+
+- **JuiceNet** has been removed as they shut down their API services.
+
+## Other noteworthy changes
+
+There are many more improvements in this release; here are some of the other noteworthy changes:
+
+- [Shopping list] now has a complete intent function that allows you to check off or mark items on your shopping list as completed, making it easier to interact with your shopping lists using voice commands. Thanks, [@Lesekater]!
+- Device and {% term entity %} management got better! [@emontnemery] made it so Home Assistant now restores user customizations when you re-add deleted devices or {% term entities %}. No more losing your carefully crafted names and settings!
+- The [Template] {% term integration %} received a major boost from [@Petro31]! You can now use variables, icons, and pictures across all compatible template platforms, create trigger-based template alarm control panels, locks, vacuum {% term entities %}, and fans. Plus, there's a new `label_description` template method that allows you to dynamically fetch the description you've added to a label from your templates. This is a noteworthy enhancement for better template organization.
+- Camera snapshots just got better! [@edenhaus] added support for taking snapshots via [go2rtc]. There is nothing for you to do on this one, it works out of the box, but it is nice to know snapshots are now faster and take fewer resources from your system.
+- [Object selectors] now support fields and multiple selections, thanks to [@piitaya]. These additions are particularly interesting for {% term integration %} and blueprint developers, as they provide much more flexibility in your UI representations.
+- Wind direction sensors got a visual upgrade with [@edenhaus] adding range icons for the `wind_direction` sensor device class. Different icons are now shown depending on the state of wind direction sensors, which is indeed a nice visual upgrade!
+
+[@Lesekater]: https://github.com/Lesekater
+[@emontnemery]: https://github.com/emontnemery
+[@Petro31]: https://github.com/Petro31
+[@edenhaus]: https://github.com/edenhaus
+[@piitaya]: https://github.com/piitaya
+[Shopping list]: /integrations/shopping_list
+[Template]: /integrations/template
+[go2rtc]: /integrations/go2rtc
+[Object selectors]: /docs/blueprint/selectors/#object-selector
+
+## Full-screen code editors
+
+Working with snippets of YAML or templates in Home Assistant just got a BIG improvement! We've added a new full-screen mode for all code editors throughout the interface.
+
+
+
+Whether you're editing automations, scripts, templates, or any other YAML configuration, you can now expand the code editor to take up your entire screen. This is especially helpful when working with longer configurations or when you need more space to see your code clearly.
+
+Simply click the maximize button in the top-right corner of any code editor to enter full screen mode. Press the button again to return to the normal view.
+
+This makes building a more complex and advanced smart home more comfortable and productive, especially on smaller mobile or tablet screens where every pixel of editing space counts!
+
+## Improved dashboard creation experience
+
+The dialog for adding a new dashboard has been redesigned with a cleaner interface that matches recent redesigns we've seen to other dialogs. This improvement was designed by [@marcinbauer85] and implemented by [@quinnter]. Great teamwork!
+
+
+
+[@marcinbauer85]: https://github.com/marcinbauer85
+[@quinnter]: https://github.com/quinnter
+
+## 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,
+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 on more
+places you can go.
+
+Are you more into email? [Sign up for the Open Home Foundation Newsletter](/newsletter)
+to get the latest news about features, things happening in our community, and other projects that support the 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 "Google Calendar" %}
+
+The previously deprecated Google Calendar `add_event` {% term action %} has been removed and replaced by the `create_event` entity-based {% term action %}.
+
+If you use the `add_event` {% term action %} in your automations or scripts, you will need to update them to use the new `create_event` {% term action %} instead.
+
+([@epenet] - [#146432]) ([google docs])
+
+[@epenet]: https://github.com/epenet
+[#146432]: https://github.com/home-assistant/core/pull/146432
+[google docs]: /integrations/google
+
+{% enddetails %}
+
+{% details "Meater" %}
+
+The states of the Meater probe cook state have been changed to
+support translations and make them more consistent with other integrations.
+
+The following states have been changed:
+
+- `Not Started` -> `not_started`
+- `Configured` -> `configured`
+- `Started` -> `started`
+- `Ready For Resting` -> `ready_for_resting`
+- `Resting` -> `resting`
+- `Slightly Underdone` -> `slightly_underdone`
+- `Finished` -> `finished`
+- `Slightly Overdone` -> `slightly_overdone`
+- `OVERCOOK!` -> `overcooked`
+
+If you use these states in your automations or scripts, you will need to update them to use the new state values.
+
+([@joostlek] - [#146958]) ([meater docs])
+
+[@joostlek]: https://github.com/joostlek
+[#146958]: https://github.com/home-assistant/core/pull/146958
+[meater docs]: /integrations/meater
+
+{% enddetails %}
+
+{% details "Miele" %}
+
+The internal representation of states for hob plates has changed. This is a breaking change when these states are used in automations or templates.
+
+No user action is needed if these hob state sensors are used for visual display only.
+
+Please review and update applicable automations and templates according to the following state changes:
+
+- `0` -> `plate_step_0`
+- `1` -> `plate_step_1`
+- ...
+- `18` -> `plate_step_18`
+- `110` -> `plate_step_warm`
+- `117` -> `plate_step_boost`
+- `118` -> `plate_step_boost`
+- `217` -> `plate_step_boost`
+- `220` -> `plate_step_warm`
+
+If you use these states in your automations or scripts, you will need to update them to use the new state values.
+
+([@astrandb] - [#144992]) ([miele docs])
+
+[@astrandb]: https://github.com/astrandb
+[#144992]: https://github.com/home-assistant/core/pull/144992
+[miele docs]: /integrations/miele
+
+{% enddetails %}
+
+{% details "Plex Media Server" %}
+
+The previously deprecated `plex.scan_for_clients` {% term action %} has been removed in favor of the "Scan Clients" `button` {% term entity %}. If you use this {% term action %} in your automations or scripts, you will need to update them to use the new {% term entity %} instead.
+
+([@epenet] - [#146608]) ([plex docs])
+
+[@epenet]: https://github.com/epenet
+[#146608]: https://github.com/home-assistant/core/pull/146608
+[plex docs]: /integrations/plex
+
+{% 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].
+
+[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.7](/changelogs/core-2025.7)
diff --git a/source/blueprints/blog/2025-07/ask_yes_no_question.yaml b/source/blueprints/blog/2025-07/ask_yes_no_question.yaml
new file mode 100644
index 00000000000..b3ea73717be
--- /dev/null
+++ b/source/blueprints/blog/2025-07/ask_yes_no_question.yaml
@@ -0,0 +1,257 @@
+blueprint:
+ name: Ask a Yes/No question
+ description: |
+ Ask a simple Yes/No question. Supports 50 different ways of confirming or rejecting the question. Supports retries.
+ domain: script
+ author: JLo
+ homeassistant:
+ min_version: 2025.6.99
+ input:
+ question:
+ name: Question
+ description: The question that will be asked by the voice assistant.
+ selector:
+ text:
+
+ yes_section:
+ name: Confirmation ('Yes', 'Of course', ...)
+ description: Define what should happen if you reply positively to the question asked.
+ icon: mdi:play
+ input:
+ yes_actions:
+ name: Actions
+ description: Actions to perform if you reply positively to the question asked.
+ default: []
+ selector:
+ action:
+ yes_answer:
+ name: Answer
+ description: Answer of the voice assistant if you reply positively to the question asked.
+ default: "Done"
+ selector:
+ text:
+
+ no_section:
+ name: Rejection ('No', 'Negative', ...)
+ description: Define what should happen if you reply negatively to the question asked.
+ icon: mdi:stop
+ input:
+ no_actions:
+ name: Actions
+ description: Actions to perform if you reply negatively to the question asked.
+ default: []
+ selector:
+ action:
+ no_answer:
+ name: Answer
+ description: Answer of the voice assistant if you reply negatively to the question asked.
+ default: "Action cancelled"
+ selector:
+ text:
+
+ other_section:
+ name: Other responses
+ description: Define what should happen if the response is not understood.
+ icon: mdi:help
+ collapsed: true
+ input:
+ other_actions:
+ name: Actions
+ description: Actions to perform if the response is not understood.
+ default: []
+ selector:
+ action:
+ other_answer:
+ name: Answer
+ description: Answer of the voice assistant if the response is not understood.
+ default: "Sorry, I couldn't understand that"
+ selector:
+ text:
+
+ repeat_section:
+ name: Advanced parameters (Retries)
+ description: Define how many times the question should be asked if the answer is not understood.
+ icon: mdi:cog
+ collapsed: true
+ input:
+ number_of_retries:
+ name: Number of retries
+ description: Number of times the question should be re-asked if the answer is not understood.
+ default: 0
+ selector:
+ number:
+ min: 0
+ max: 10
+ mode: slider
+
+fields:
+ voice_assistant:
+ name: Voice assistant
+ description: The voice assistant that will be used for that conversation.
+ required: true
+ selector:
+ entity:
+ multiple: false
+ filter:
+ - domain: assist_satellite
+ preannounce:
+ name: Preannounce
+ description: Play a sound before the question is asked.
+ required: true
+ default: true
+ selector:
+ boolean:
+
+sequence:
+ - variables:
+ number_of_retries: !input number_of_retries
+ - repeat:
+ sequence:
+ - action: assist_satellite.ask_question
+ continue_on_error: true
+ data:
+ question: !input question
+ preannounce: "{{preannounce}}"
+ entity_id: "{{voice_assistant}}"
+ answers:
+ - id: "yes"
+ sentences:
+ - "Yes"
+ - Sure
+ - Absolutely
+ - Go ahead
+ - Please do
+ - Of course
+ - That's fine
+ - Do it
+ - Yep
+ - Yeah
+ - Ok
+ - Okay
+ - Affirmative
+ - I agree
+ - Sounds good
+ - You got it
+ - Definitely
+ - By all means
+ - Why not
+ - Indeed
+ - Confirmed
+ - Let's do it
+ - Certainly
+ - Right
+ - Fine
+ - All good
+ - Make it so
+ - I approve
+ - That's right
+ - I'm okay with that
+ - No problem
+ - Go for it
+ - Sounds fine
+ - I'm on board
+ - Proceed
+ - It's a yes
+ - I'm in
+ - Okay yes
+ - That's a yes
+ - Yeah go ahead
+ - I'm good with that
+ - Positive
+ - Do that
+ - It's okay
+ - Works for me
+ - I'm fine with that
+ - Yep do it
+ - Please go ahead
+ - That's what I want
+ - Exactly
+ - id: "no"
+ sentences:
+ - "No"
+ - Nope
+ - Don't
+ - Please don't
+ - No thank you
+ - I don't think so
+ - Not now
+ - That's a no
+ - I'd rather not
+ - No way
+ - Not really
+ - Cancel that
+ - Negative
+ - Stop
+ - Don't do it
+ - I said no
+ - No need
+ - Never mind
+ - Not necessary
+ - No that's not right
+ - I disagree
+ - Skip it
+ - Don't proceed
+ - I don't want that
+ - Don't go ahead
+ - Leave it
+ - That's incorrect
+ - I prefer not to
+ - No thanks
+ - I'm not okay with that
+ - I'm saying no
+ - Let's not
+ - Not this time
+ - I'm not in
+ - Please don't do that
+ - Don't take action
+ - I'd say no
+ - No action needed
+ - I'm against that
+ - I'd skip it
+ - Rather not
+ - Not today
+ - I'm not sure better not
+ - That's not what I want
+ - That won't be necessary
+ - I don't agree
+ - No that's wrong
+ - Let's skip that
+ - I'm not comfortable with that
+ response_variable: response
+ - choose:
+ - conditions:
+ - condition: template
+ value_template: "{{response.id == 'yes'}}"
+ sequence:
+ - sequence: !input yes_actions
+ - action: assist_satellite.announce
+ metadata: {}
+ data:
+ message: !input yes_answer
+ preannounce: false
+ target:
+ entity_id: "{{voice_assistant}}"
+ - conditions:
+ - condition: template
+ value_template: "{{response.id == 'no'}}"
+ sequence:
+ - sequence: !input no_actions
+ - action: assist_satellite.announce
+ metadata: {}
+ data:
+ message: !input no_answer
+ preannounce: false
+ target:
+ entity_id: "{{voice_assistant}}"
+ default:
+ - sequence: !input other_actions
+ - action: assist_satellite.announce
+ metadata: {}
+ data:
+ message: !input other_answer
+ preannounce: false
+ target:
+ entity_id: "{{voice_assistant}}"
+ until:
+ - condition: template
+ value_template: "{{ (response is defined and response.id in ['yes','no']) or repeat.index > number_of_retries}}"
diff --git a/source/changelogs/core-2025.7.markdown b/source/changelogs/core-2025.7.markdown
new file mode 100644
index 00000000000..ef2faabf63f
--- /dev/null
+++ b/source/changelogs/core-2025.7.markdown
@@ -0,0 +1,1195 @@
+---
+title: Full changelog for Home Assistant 2025.7
+description: Detailed changelog for the Home Assistant 2025.7 release
+replace_regex: \s\(\[?[a-z0-9\-\s_]+\]?\)$
+---
+
+These are all the changes included in the Home Assistant 2025.7 release.
+
+For a summary in a more readable format:
+[Release notes blog for this release](/blog/2025/07/02/release-20257/).
+
+## All changes
+
+- Add update platform to paperless integration ([@fvgarrel] - [#145638])
+- Improve error message for global timeout ([@arturpragacz] - [#141563])
+- Test that recorder is not promoted to earlier stage in bootstrap ([@arturpragacz] - [#142695])
+- Add read_only entity_id to Trend options flow ([@karwosts] - [#145657])
+- Add async-timeout to forbidden packages ([@epenet] - [#145679])
+- Add homee siren platform ([@Taraman17] - [#145675])
+- Replace "Invalid API key" with common string in `overseerr` ([@NoRi2909] - [#145689])
+- Add check for packages restricting Python version ([@epenet] - [#145690])
+- Bump version to 2025.7.0dev0 ([@frenck] - [#145647])
+- Simplify boolean check in onewire ([@epenet] - [#145700])
+- Change text of installing and starting Z-WaveJs add-on steps ([@MindFreeze] - [#145702])
+- Improve smarla base entity ([@rlint-explicatis] - [#145710])
+- Add check for transient packages restricting Python version ([@epenet] - [#145695])
+- MELCloud remove deprecated YAML import strings ([@erwindouna] - [#145731])
+- Remove niko_home_control YAML import ([@joostlek] - [#145732])
+- Add complete intent function for shopping list component ([@Lesekater] - [#128565])
+- Revert "squeezebox Better result for testing (#144622)" ([@jbouwh] - [#145739])
+- Add DHCP discovery to LG ThinQ ([@joostlek] - [#145746])
+- Bump docker/build-push-action from 6.17.0 to 6.18.0 (@dependabot - [#145764])
+- Modernize tests for smhi ([@gjohansson-ST] - [#139334])
+- Use async_load_json_(array/object)_fixture in async test functions ([@epenet] - [#145773])
+- Remove unnecessary DOMAIN alias in components ([@epenet] - [#145791])
+- Use Platform constant in hue tests ([@epenet] - [#145798])
+- Use Platform constant in tests ([@epenet] - [#145801])
+- Use async_load_fixture in async test functions (a) ([@epenet] - [#145718])
+- Update httpcore to 1.0.9 and h11 to 0.16.0 ([@cdce8p] - [#145789])
+- Update sqlalchemy to 2.0.41 ([@cdce8p] - [#145790])
+- Add hardwired chime toggle to Reolink Battery Doorbell ([@lennartnederstigt] - [#145779])
+- Remove unnecessary DOMAIN alias in tests (a-d) ([@epenet] - [#145817])
+- Remove unnecessary DOMAIN alias in tests (e-k) ([@epenet] - [#145818])
+- Move Airthings coordinator to separate module ([@LaStrada] - [#145827])
+- Remove decora-wifi from excluded requirements ([@edenhaus] - [#145832])
+- Remove default args to ESPHome test fixture calls ([@bdraco] - [#145840])
+- Ensure Reolink host device is setup first ([@starkillerOG] - [#145843])
+- Minor cleanup of Zimi Integration ([@markhannon] - [#144293])
+- Add sound pressure to Airthings ([@LaStrada] - [#145946])
+- Use async_load_fixture in async test functions (l-z) ([@epenet] - [#145717])
+- Use async_load_fixture in async test functions (b-i) ([@epenet] - [#145714])
+- Update mypy-dev to 1.17.0a2 ([@cdce8p] - [#146002])
+- Update pytest-asyncio to 1.0.0 ([@cdce8p] - [#145988])
+- Update types packages ([@cdce8p] - [#145993])
+- Update syrupy to 4.9.1 ([@cdce8p] - [#145992])
+- Update pytest-xdist to 3.7.0 ([@cdce8p] - [#145991])
+- Update pytest-timeout to 2.4.0 ([@cdce8p] - [#145990])
+- Update numpy to 2.2.6 ([@cdce8p] - [#145981])
+- Update pytest-cov to 6.1.1 ([@cdce8p] - [#145989])
+- Update coverage to 7.8.2 ([@cdce8p] - [#145983])
+- Update aiohttp-cors to 0.8.1 ([@cdce8p] - [#145976])
+- Update cryptography to 45.0.3 ([@cdce8p] - [#145979])
+- Update bcrypt to 4.3.0 ([@cdce8p] - [#145978])
+- Update attrs to 25.3.0 ([@cdce8p] - [#145977])
+- Update PyTurboJPEG to 1.8.0 ([@cdce8p] - [#145984])
+- Update pydantic to 2.11.5 ([@cdce8p] - [#145985])
+- Remove unnecessary DOMAIN alias in tests (s-z) ([@epenet] - [#146010])
+- Add config flow for telegram bot integration ([@hanwg] - [#144617])
+- Remove unnecessary DOMAIN alias in tests (l-r) ([@epenet] - [#146009])
+- Use async_load_fixture in netatmo tests ([@epenet] - [#146013])
+- Use async_load_fixture in moehlenhoff_alpha2 tests ([@epenet] - [#146012])
+- Bump dawidd6/action-download-artifact from 9 to 10 (@dependabot - [#146015])
+- Use async_load_fixture in twitch tests ([@epenet] - [#146016])
+- Update freezegun to 1.5.2 ([@cdce8p] - [#145982])
+- Update pre-commit to 4.2.0 ([@cdce8p] - [#145986])
+- Submit legacy integrations for analytics ([@ludeeus] - [#145787])
+- Make sun `solar_rising` a binary_sensor ([@karwosts] - [#140956])
+- Avoid constant alias for integration DOMAIN ([@epenet] - [#145788])
+- Bump pysmlight to 0.2.6 ([@tl-sl] - [#146039])
+- Remove NMBS YAML import ([@joostlek] - [#145733])
+- Add diagnostics tests for Sonos ([@PeteRager] - [#146040])
+- Small nmbs sensor attributes refactoring ([@silamon] - [#145956])
+- Update ruff to 0.11.12 ([@cdce8p] - [#146037])
+- Update pytest warnings filter ([@cdce8p] - [#146024])
+- Move async_setup_services to async_setup ([@chemelli74] - [#146048])
+- Update yamllint to 1.37.1 ([@cdce8p] - [#146038])
+- Add awesomeversion to dependency version checks ([@epenet] - [#146047])
+- Update pyoverkiz to 1.17.2 ([@cdce8p] - [#146056])
+- Update aiohomekit to 3.2.15 ([@cdce8p] - [#146059])
+- Rename mispelled services python files ([@chemelli74] - [#146049])
+- Avoid services unload for Isy994 ([@chemelli74] - [#146069])
+- Bump aiohttp to 3.12.7 ([@bdraco] - [#146028])
+- Bump ollama to 0.5.1 ([@ViViDboarder] - [#146063])
+- Update typing-extensions to 4.14.0 ([@cdce8p] - [#146054])
+- Update python-homewizard-energy to 8.3.3 ([@cdce8p] - [#146076])
+- Update pyatmo to 9.2.1 ([@cdce8p] - [#146077])
+- Move async_register_services to async_setup ([@epenet] - [#146092])
+- Bump aiokem to 1.0.1 ([@PeteRager] - [#146085])
+- Add energy sensor to adax ([@parholmdahl] - [#145995])
+- Move service registration to async_setup in icloud ([@epenet] - [#146095])
+- Move services to separate module in insteon ([@epenet] - [#146094])
+- Move services to separate module in nzbget ([@epenet] - [#146093])
+- Use async_load_fixture in skybell tests ([@epenet] - [#146017])
+- Use async_load_fixture in remaining tests ([@epenet] - [#146021])
+- Use async_load_fixture in tplink_omada tests ([@epenet] - [#146014])
+- Avoid services unload for Homematicip Cloud ([@chemelli74] - [#146050])
+- Use async_load_fixture in youtube tests ([@epenet] - [#146018])
+- Add exception translations for KNX services ([@farmio] - [#146104])
+- Smarla integration improve tests ([@rlint-explicatis] - [#145803])
+- Add `required_features` to WaterHeater entity service registrations ([@zxdavb] - [#141873])
+- Replace "numbers" with "digits" in `invalid_backbone_key` message of `knx` ([@NoRi2909] - [#146124])
+- Add config option for controlling Ollama think parameter ([@ViViDboarder] - [#146000])
+- Update pytest to 8.4.0 ([@cdce8p] - [#146114])
+- Bump github/codeql-action from 3.28.18 to 3.28.19 (@dependabot - [#146131])
+- Bump pyvera to 0.3.16 ([@maximvelichko] - [#146089])
+- Bump pymodbus to 3.9.2 ([@crug80] - [#145948])
+- Add homee reconfiguration flow ([@Taraman17] - [#146065])
+- Matter Extractor hood fixture ([@lboue] - [#146174])
+- Move matrix services to separate module ([@epenet] - [#146161])
+- Move zoneminder services to separate module ([@epenet] - [#146151])
+- Bump python-bsblan to version 2.0.1 ([@liudger] - [#146198])
+- Move ffmpeg services to separate module ([@epenet] - [#146149])
+- Update pandas to 2.3.0 ([@cdce8p] - [#146206])
+- Move amcrest services to separate module ([@epenet] - [#146144])
+- Move google_sheets services to separate module ([@epenet] - [#146160])
+- Bump switchbot-api to 2.5.0 ([@XiaoLing-git] - [#146205])
+- Matter add Service Area Cluster to vacuum_cleaner fixture ([@lboue] - [#145743])
+- Move services to separate module in opentherm_gw ([@epenet] - [#146098])
+- Bump pyswitchbot to 0.65.0 ([@zerzhang] - [#146133])
+- Move elkm1 services to separate module ([@epenet] - [#146147])
+- Bump aioairq to v0.4.6 ([@Sibgatulin] - [#146169])
+- Rename service registration method ([@epenet] - [#146236])
+- Tweak zwave_js service registration ([@epenet] - [#146244])
+- Move abode services to separate module ([@epenet] - [#146142])
+- Fix unit test for switchbot integration ([@zerzhang] - [#146247])
+- Smarla integration number platform ([@rlint-explicatis] - [#145747])
+- Handle error in setup_entry for Telegram Bot ([@hanwg] - [#146242])
+- Update python-bsblan requirement to version 2.1.0 ([@liudger] - [#146253])
+- Change default range sensors in Teslemetry ([@Bre77] - [#146268])
+- Add bronze quality scale for Telegram bot integration ([@hanwg] - [#146148])
+- Update airtouch5py to 0.3.0 ([@cdce8p] - [#146278])
+- Migrate Enphase envoy from httpx to aiohttp ([@catsmanac] - [#146283])
+- Update numpy to 2.3.0 ([@cdce8p] - [#146296])
+- Migrate onvif to use onvif-zeep-async 4.0.1 with aiohttp ([@bdraco] - [#146297])
+- Migrate rest to use aiohttp ([@bdraco] - [#146306])
+- Add additional package version range checks ([@cdce8p] - [#146299])
+- Fix typo in Utility Meter always_available ([@tronikos] - [#146320])
+- Add tests for sonos switch alarms on and off ([@PeteRager] - [#146314])
+- DNSIP: Add literal to querytype ([@mikey0000] - [#146367])
+- Add Homee diagnostics platform ([@Taraman17] - [#146340])
+- Test all device classes in Sensor device condition/trigger tests ([@abmantis] - [#146366])
+- Bug fix for Telegram bot integration: handle last message id ([@hanwg] - [#146378])
+- Basic entity class for Imeon inverter integration ([@Imeon-Energy] - [#145778])
+- Fix minor docstring typos in jellyfin component media_source.py ([@willschlitzer] - [#146398])
+- Move google assistant sdk services to separate module ([@epenet] - [#146434])
+- Migrate cloudflare to use runtime data ([@epenet] - [#146429])
+- Bump pyswitchbot to 0.66.0 ([@zerzhang] - [#146430])
+- Restore user customizations of deleted devices ([@emontnemery] - [#145191])
+- Restore entity ID and user customizations of deleted entities ([@emontnemery] - [#145278])
+- Use async_load_fixture in modern_forms tests ([@epenet] - [#146011])
+- Remove `__all__` from switch_as_x ([@joostlek] - [#146331])
+- Update aiomealie to 0.9.6 ([@cdce8p] - [#146447])
+- Add requests to hassfest requirements check ([@cdce8p] - [#146446])
+- Fix RuntimeWarning in rest tests ([@cdce8p] - [#146452])
+- Update awesomeversion to 25.5.0 ([@cdce8p] - [#146032])
+- Fix typo in overseerr component docstring ([@willschlitzer] - [#146457])
+- Bug fix for Telegram bot integration: fix async_unload_entry error for polling bot ([@hanwg] - [#146277])
+- Assist Pipeline: Intent progress event when we start streaming ([@balloob] - [#146388])
+- Fix Telegram bot leave_chat service action ([@hanwg] - [#146139])
+- Add tests for initial state of OpenUV sensors ([@wbyoung] - [#146464])
+- Add support for HeatIt Thermostat TF056 to homee ([@Taraman17] - [#145515])
+- Add Telegram bot webhooks tests ([@hanwg] - [#146436])
+- Improve support for trigger platforms with multiple triggers ([@emontnemery] - [#144827])
+- Fix typo in hassio ([@joostlek] - [#146474])
+- Drop deprecated add_event service in google ([@epenet] - [#146432])
+- Update pywizlight to 0.6.3 ([@arturpragacz] - [#146490])
+- Add service validation for send file for Telegram bot integration ([@hanwg] - [#146192])
+- Create a deprecation/repair for `sensor.sun_solar_rising` ([@karwosts] - [#146462])
+- Bump sensorpush-api to 2.1.3 ([@epenet] - [#146514])
+- Bump weheat to 2025.6.10 ([@epenet] - [#146515])
+- Bump pybotvac to 0.0.28 ([@epenet] - [#146513])
+- Correct misleading comment for const.ATTR_RESTORED ([@emontnemery] - [#146528])
+- Adjust urllib3 constraint ([@epenet] - [#145485])
+- Add duplicate issue detection using GitHub AI models ([@frenck] - [#146487])
+- Update pytest-unordered to 0.7.0 ([@cdce8p] - [#146545])
+- Update types packages ([@cdce8p] - [#146546])
+- Bug fix for Telegram bot integration: Handle plain text parse_mode ([@hanwg] - [#146535])
+- Simplify blink service actions ([@epenet] - [#146508])
+- Move available property to entity.py for Squeezebox ([@peteS-UK] - [#146531])
+- Simplify fully_kiosk service actions ([@epenet] - [#146509])
+- Remove previously deprecated StrEnum backport ([@gjohansson-ST] - [#146477])
+- Add non-English issue detection using GitHub AI models ([@frenck] - [#146547])
+- Remove unused attribute EntityInfo.custom_component ([@emontnemery] - [#146550])
+- Simplify google_mail service actions ([@epenet] - [#146511])
+- Remove previously deprecated cached_property ([@gjohansson-ST] - [#146478])
+- Add support for more cover devices in Fibaro ([@rappenze] - [#146486])
+- New helper for templating args in command_line ([@gjohansson-ST] - [#145899])
+- Simplify service registration in recorder ([@epenet] - [#146237])
+- Set suggested precision for Airthings sensors ([@LaStrada] - [#145966])
+- Bump hyperion-py to 0.7.6 and add switch for Audio Capture to Hyperion Integration ([@ToniCipriani] - [#145952])
+- Separate steps for openai_conversation options flow ([@Shulyaka] - [#141533])
+- Add 'AdvancedToggle' to list of supported Lutron button types ([@christopherboyd] - [#145676])
+- Support more dimmer devices in fibaro ([@rappenze] - [#145864])
+- Add strings for pick implementation ([@Thomas55555] - [#146557])
+- Not valid hvac modes now fails in Climate ([@gjohansson-ST] - [#145242])
+- Simplify synology_dsm service actions ([@epenet] - [#146612])
+- Remove deprecated service in plex ([@epenet] - [#146608])
+- Mark async_setup_services as callback ([@epenet] - [#146617])
+- Simplify overseerr service actions ([@epenet] - [#146607])
+- Simplify mealie service actions ([@epenet] - [#146601])
+- Improve type hints in xiaomi_miio fan ([@epenet] - [#146596])
+- Make duplicate issue detection more strict ([@frenck] - [#146633])
+- Simplify tado service actions ([@epenet] - [#146614])
+- Simplify seventeentrack service actions ([@epenet] - [#146610])
+- Simplify screenlogic service actions ([@epenet] - [#146609])
+- Simplify netgear_lte service actions ([@epenet] - [#146606])
+- Update Sonos to use SonosConfigEntry and runtime data ([@PeteRager] - [#145512])
+- Bump github/codeql-action from 3.28.19 to 3.29.0 (@dependabot - [#146595])
+- Bump actions/attest-build-provenance from 2.3.0 to 2.4.0 (@dependabot - [#146594])
+- Simplify swiss public transport service actions ([@epenet] - [#146611])
+- Add basic xiaomi_miio fan tests ([@epenet] - [#146593])
+- Reolink add diagnostics for baichuan ([@starkillerOG] - [#146667])
+- Tweak non-English issue detection ([@frenck] - [#146636])
+- Add model_id to Reolink IPC camera ([@starkillerOG] - [#146664])
+- Reolink check if camera and motion supported ([@starkillerOG] - [#146666])
+- Add missing mock value to Reolink test ([@abmantis] - [#146689])
+- Replace unnecessary pydantic import in matrix tests ([@cdce8p] - [#146693])
+- Remove unnecessary patch from panel_custom tests ([@cdce8p] - [#146695])
+- Add myself as a remote calendar code owner ([@allenporter] - [#146703])
+- Add Reolink IR brightness entity ([@starkillerOG] - [#146717])
+- Fix asuswrt test patch ([@cdce8p] - [#146692])
+- Remove unnecessary patch from toon tests ([@cdce8p] - [#146691])
+- Adjust core create_task tests with event_loop patch ([@cdce8p] - [#146699])
+- Add callback decorator to async_setup_services ([@epenet] - [#146729])
+- Fix androidtv isfile patcher in tests ([@cdce8p] - [#146696])
+- Clean up Ollama conversation entity ([@balloob] - [#146738])
+- Clean up Anthropic conversation entity ([@balloob] - [#146737])
+- Clean up Google conversation entity ([@balloob] - [#146736])
+- Simplify reolink service actions ([@epenet] - [#146751])
+- Use ConfigEntry.runtime_data to store runtime data in NINA ([@DeerMaximum] - [#146754])
+- Update pydantic to 2.11.6 ([@cdce8p] - [#146745])
+- Bumb python-homewizard-energy to 9.1.1 ([@DCSBL] - [#146723])
+- Remove unnecessary string formatting. ([@balloob] - [#146762])
+- Bump nextbus client to 2.3.0 ([@ViViDboarder] - [#146780])
+- Add Reolink baby cry sensitivity ([@starkillerOG] - [#146773])
+- Adjust scripts for compatibility with Python 3.14 ([@cdce8p] - [#146774])
+- Simplify google_photos service actions ([@epenet] - [#146744])
+- Drop user prompt from LLMContext ([@balloob] - [#146787])
+- Bump tesla-fleet-api to 1.1.3 ([@Bre77] - [#146793])
+- Add polling to LetPot coordinator ([@jpelgrom] - [#146823])
+- Improve code quality in async_setup_entry of switches in homematicip_cloud ([@hahn-th] - [#146816])
+- Update pydantic to 2.11.7 ([@cdce8p] - [#146835])
+- Extract Google LLM base entity class ([@balloob] - [#146817])
+- Add support for Gemini's new TTS capabilities ([@lanthaler] - [#145872])
+- Update eq3btsmart to 2.1.0 ([@cdce8p] - [#146335])
+- Fix telegram_bot RuntimeWarning in tests ([@cdce8p] - [#146781])
+- Homee add button_state to event entities ([@Taraman17] - [#146860])
+- Bump pylitterbot to 2024.2.0 ([@natekspencer] - [#146901])
+- Simplify ChatLog dependencies ([@balloob] - [#146351])
+- Move Google Gen AI fixture to allow reuse ([@balloob] - [#146921])
+- Add sensor categorizations for APCUPSD ([@yuxincs] - [#146863])
+- Bump tesla-fleet-api to match Protobuf compatibility ([@Bre77] - [#146918])
+- Bump python-rflink to 0.0.67 ([@mbo18] - [#146908])
+- Bump dawidd6/action-download-artifact from 10 to 11 (@dependabot - [#146928])
+- Bump nessclient to 1.2.0 ([@epenet] - [#146937])
+- Significantly improve Tesla Fleet config flow ([@Bre77] - [#146794])
+- Bump pymysensors to 0.25.0 ([@epenet] - [#146941])
+- Bump pyosoenergyapi to 1.1.5 ([@epenet] - [#146942])
+- Bump pysml to 0.1.5 ([@epenet] - [#146935])
+- Re-enable v2 API support for HomeWizard P1 Meter ([@DCSBL] - [#146927])
+- Change `PARALLEL_UPDATES` to `0` for read-only NextDNS platforms ([@bieniu] - [#146939])
+- Add verify ssl option to paperless-ngx integration ([@fvgarrel] - [#146802])
+- Set goalzero total run time sensor device class to duration ([@natekspencer] - [#146897])
+- Simplify habitica service actions ([@epenet] - [#146746])
+- Add Reolink privacy mask switch ([@starkillerOG] - [#146906])
+- Move Meater coordinator to module ([@joostlek] - [#146946])
+- Add duration device class in Here Travel Time sensors ([@etiennec78] - [#146804])
+- Add config flow data description for NextDNS ([@bieniu] - [#146938])
+- Improve Meater config flow tests ([@joostlek] - [#146951])
+- Add Telegram Bot message reactions ([@aviadlevy] - [#146354])
+- Add Meater sensor tests ([@joostlek] - [#146952])
+- Use entity base class for NextDNS entities ([@bieniu] - [#146934])
+- Use runtime data in Meater ([@joostlek] - [#146961])
+- Create entities directly on setup in Meater ([@joostlek] - [#146953])
+- Add switch for Samsung ice bites (and rename ice maker) ([@mswilson] - [#146925])
+- Make Meater cook state an enum ([@joostlek] - [#146958])
+- Add diagnostics support to Meater ([@joostlek] - [#146967])
+- Use non-autospec mock for Reolink's button tests ([@abmantis] - [#146969])
+- Record current IQS state for Home Connect ([@Diegorro98] - [#131703])
+- Fix translation key in NextDNS integration ([@bieniu] - [#146976])
+- Removed rounding of durations in Here Travel Time sensors ([@etiennec78] - [#146838])
+- Set Matter SolarPower tagList in fixture ([@lboue] - [#146837])
+- Rename Xiaomi Miio integration to Xiaomi Home ([@tr4nt0r] - [#146555])
+- Bump aioautomower to 2025.6.0 ([@Thomas55555] - [#146979])
+- Improve bootstrap file logging test ([@abmantis] - [#146670])
+- Remove deprecated support feature values in vacuum ([@gjohansson-ST] - [#146982])
+- Remove deprecated support feature values in media_player ([@gjohansson-ST] - [#146986])
+- Remove deprecated support feature values in cover ([@gjohansson-ST] - [#146987])
+- Address late review for NextDNS integration ([@bieniu] - [#146980])
+- Bump pysmarlaapi version to 0.9.0 ([@rlint-explicatis] - [#146629])
+- Bump nextcord to 3.1.0 ([@joostlek] - [#147020])
+- Bump aiorussound to 4.6.0 ([@noahhusby] - [#147023])
+- Add TTS response timeout for idle state ([@synesthesiam] - [#146984])
+- Fix flaky Reolink webhook test ([@abmantis] - [#147036])
+- Remove not used constant in climate ([@gjohansson-ST] - [#147041])
+- Add _attr_has_entity_name to devolo Home Network device tracker platform ([@Shutgun] - [#146978])
+- Set quality scale at Home Connect manifest ([@Diegorro98] - [#147050])
+- Capitalize "Ice Bites" and switch to "Cubed ice" (#147060) ([@mswilson] - [#147061])
+- Bump aiowebdav2 to 0.4.6 ([@jpbede] - [#147054])
+- If no Reolink HTTP api available, do not set configuration_url ([@starkillerOG] - [#146684])
+- Remove internals from Sonos test_init.py ([@PeteRager] - [#147063])
+- Use missed typed ConfigEntry in devolo Home Control ([@Shutgun] - [#147049])
+- Fix typo in state name references of `homee` ([@NoRi2909] - [#146905])
+- Cleanup devolo Home Control tests ([@Shutgun] - [#147051])
+- Bump hass-nabucasa from 0.101.0 to 0.102.0 ([@ludeeus] - [#147087])
+- Ensure mqtt sensor has a valid native unit of measurement ([@jbouwh] - [#146722])
+- Support variables, icon, and picture for all compatible template platforms ([@Petro31] - [#145893])
+- tts_output is optional in run-start ([@synesthesiam] - [#147092])
+- Use non-autospec mock for Reolink's init tests ([@abmantis] - [#146991])
+- Minor improvements of service helper ([@emontnemery] - [#147079])
+- Send intent progress events to ESPHome ([@synesthesiam] - [#146966])
+- Use non-autospec mock for Reolink's binary_sensor, camera and diag tests ([@abmantis] - [#147095])
+- Fix nightly build ([@silamon] - [#147110])
+- Bump ovoenergy to 2.0.1 ([@epenet] - [#147112])
+- update pyHomee to v1.2.9 ([@Taraman17] - [#147094])
+- Adjust feature request links in issue reporting ([@frenck] - [#147130])
+- Fix pylint plugin for vacuum entity ([@gjohansson-ST] - [#146467])
+- Re-raise annotated_yaml.YAMLException as HomeAssistantError ([@emontnemery] - [#147129])
+- Add comment in helpers.llm.ActionTool explaining limitations ([@emontnemery] - [#147116])
+- Update pytest warnings filter ([@cdce8p] - [#147132])
+- Deprecated hass.http.register_static_path now raises error ([@gjohansson-ST] - [#147039])
+- Add missing hyphen to "mains-powered" and "battery-powered" in `zha` ([@NoRi2909] - [#147128])
+- Expose statistics selector, use for `recorder.get_statistics` ([@karwosts] - [#147056])
+- Use PEP 695 TypeVar syntax for paperless_ngx ([@cdce8p] - [#147156])
+- Use PEP 695 TypeVar syntax for eheimdigital ([@cdce8p] - [#147154])
+- Use PEP 695 TypeVar syntax for nextdns ([@cdce8p] - [#147155])
+- Update ruff to 0.12.0 ([@cdce8p] - [#147106])
+- Add ask_question action to Assist satellite ([@synesthesiam] - [#145233])
+- Fix Z-Wave device class endpoint discovery ([@MartinHjelmare] - [#142171])
+- Migrate justnimbus to use runtime_data ([@epenet] - [#147170])
+- fix and improve cover tests for homee ([@Taraman17] - [#147164])
+- remove unwanted attribute in homee sensor tests ([@Taraman17] - [#147158])
+- Bump hass-nabucasa from 0.102.0 to 0.103.0 ([@klejejs] - [#147186])
+- Move kmtronic coordinator to separate module ([@epenet] - [#147182])
+- Simplify remove listener in kodi ([@epenet] - [#147183])
+- Migrate keymitt_ble to use runtime_data ([@epenet] - [#147179])
+- Migrate kostal_plenticore to use runtime_data ([@epenet] - [#147188])
+- Migrate kegtron to use runtime_data ([@epenet] - [#147177])
+- Simplify update_listener in kmtronic ([@epenet] - [#147184])
+- Simplify update_listener in keenetic_ndms2 ([@epenet] - [#147173])
+- Bump pypck to 0.8.9 ([@alengwenus] - [#147174])
+- Simplify update_listener in konnected ([@epenet] - [#147172])
+- Move juicenet coordinator to separate module ([@epenet] - [#147168])
+- Add support of taking a camera snapshot via go2rtc ([@edenhaus] - [#145205])
+- Migrate kodi to use runtime_data ([@epenet] - [#147191])
+- Use PEP 695 TypeVar syntax for ecovacs ([@cdce8p] - [#147153])
+- Migrate kmtronic to use runtime_data ([@epenet] - [#147193])
+- Migrate lacrosse_view to use runtime_data ([@epenet] - [#147202])
+- Migrate keenetic_ndms2 to use runtime_data ([@epenet] - [#147194])
+- Migrate kaleidescape to use runtime_data ([@epenet] - [#147171])
+- Migrate lutron to use runtime_data ([@epenet] - [#147198])
+- Improve test-coverage for homee locks ([@Taraman17] - [#147160])
+- Implement battery group mode in HomeWizard ([@DCSBL] - [#146770])
+- Bump here-routing to 1.2.0 ([@eifinger] - [#147204])
+- Add translations for devolo Home Control exceptions ([@Shutgun] - [#147099])
+- Add sub-device support to Russound RIO ([@noahhusby] - [#146763])
+- AI Task integration ([@balloob] - [#145128])
+- Bump zwave-js-server-python to 0.64.0 ([@MindFreeze] - [#147176])
+- Use entity name in homee ([@Taraman17] - [#147142])
+- Minor clean up missed in previous PR ([@synesthesiam] - [#147229])
+- Add reconfigure flow to ntfy integration ([@tr4nt0r] - [#143743])
+- Bump aiohomeconnect to 0.18.1 ([@Diegorro98] - [#147236])
+- Use string instead of boolean for voice event ([@synesthesiam] - [#147244])
+- Bump aiorussound to 4.6.1 ([@noahhusby] - [#147233])
+- Change async_supports_streaming_input to an instance method ([@synesthesiam] - [#147245])
+- Bump pyHomee to version 1.2.10 ([@Taraman17] - [#147248])
+- Fix Telegram bot parsing of inline keyboard ([@hanwg] - [#146376])
+- Bump pyseventeentrack to 1.1.1 ([@shaiu] - [#147253])
+- Battery voltage translation key ([@lboue] - [#147238])
+- Remove deprecated support feature values in camera ([@gjohansson-ST] - [#146988])
+- Bump aioimmich to 0.10.1 ([@mib1185] - [#147293])
+- Add update entity to immich integration ([@mib1185] - [#147273])
+- Fix regex patterns in foobot sensor tests ([@mib1185] - [#147306])
+- fix reconfig in case of no connection. ([@Taraman17] - [#147275])
+- Combine executor calls in devolo Home Control ([@Shutgun] - [#147216])
+- Add water filter replacement and usage sensors to SmartThings ([@mswilson] - [#147279])
+- Use has_entity_name in NINA ([@DeerMaximum] - [#146755])
+- Add sensor platform to Alexa Devices ([@chemelli74] - [#146469])
+- Add number entity to Russound RIO ([@noahhusby] - [#147228])
+- Use PEP 695 TypeVar syntax for unifi ([@cdce8p] - [#147157])
+- Migrate lastfm to use runtime_data ([@epenet] - [#147330])
+- Add switch entity to Russound RIO ([@noahhusby] - [#147323])
+- Migrate lg_netcast to use runtime_data ([@epenet] - [#147338])
+- Migrate led_ble to use runtime_data ([@epenet] - [#147337])
+- Migrate leaone to use runtime_data ([@epenet] - [#147336])
+- Migrate ld2410_ble to use runtime_data ([@epenet] - [#147335])
+- Matter dishwasher alarm ([@lboue] - [#146842])
+- Migrate laundrify to use runtime_data ([@epenet] - [#147331])
+- Fixed YoLink incorrect valve status ([@matrixd2] - [#147021])
+- Migrate landisgyr_heat_meter to use runtime_data ([@epenet] - [#147329])
+- Clean superfluous cloud deps from pyproject ([@arturpragacz] - [#147223])
+- Migrate lametric to use runtime_data ([@epenet] - [#147328])
+- Remove config flow unique_id migration from devolo Home Control ([@Shutgun] - [#147327])
+- Improve test of WS command get_services cache handling ([@emontnemery] - [#147134])
+- Migrate lcn to use runtime_data ([@epenet] - [#147333])
+- Bump IMGW-PIB backend library to version 1.1.0 ([@bieniu] - [#147341])
+- Lametric add configuration url ([@rrooggiieerr] - [#147118])
+- Add unique ID support to Trend integration YAML configuration ([@frenck] - [#147346])
+- Move lyric coordinator to separate module ([@epenet] - [#147357])
+- Bump demetriek to 1.3.0 ([@joostlek] - [#147350])
+- Matter battery storage ([@lboue] - [#147235])
+- Tilt Pi integration ([@michaelheyman] - [#139726])
+- Add trigger template alarm control panels ([@Petro31] - [#145461])
+- Add trigger based locks to template integration ([@Petro31] - [#145528])
+- Bump thinqconnect to 1.0.7 ([@LG-ThinQ-Integration] - [#147073])
+- Update bosch_alarm to platinum quality scale ([@sanjay900] - [#145027])
+- Add Altruist integration to Core ([@LoSk-p] - [#146158])
+- Address AI Task late comments ([@balloob] - [#147313])
+- Matter energy optimization opt-out attribute ([@lboue] - [#147096])
+- Bump aioesphomeapi to 3.1.1 ([@bdraco] - [#147345])
+- Replace foscam dependency ([@Foscam-wangzhengyu] - [#145766])
+- Add trigger vacuum entities to template integration ([@Petro31] - [#145534])
+- Add PARALLEL_UPDATES constant to binary_sensor and sensor for LCN ([@alengwenus] - [#147369])
+- Migrate linear_garage_door to use runtime_data ([@epenet] - [#147351])
+- Bump aiotedee to 0.2.25 ([@zweckj] - [#147349])
+- Migrate livisi to use runtime_data ([@epenet] - [#147352])
+- Add vacuum activity to pylint type hints check ([@gjohansson-ST] - [#147162])
+- Migrate lifx to use runtime_data and HassKey ([@epenet] - [#147348])
+- Add update platform to LaMetric ([@joostlek] - [#147354])
+- Default to gemini-2.5-flash ([@tronikos] - [#147334])
+- Add label_description to template engine ([@Petro31] - [#147138])
+- Add button entity to Music Assistant to add currently playing item to favorites ([@marcelveldt] - [#145626])
+- Set KNX to quality scale "silver" ([@farmio] - [#144879])
+- Add support for Reolink Floodlight PoE/WiFi ([@starkillerOG] - [#146778])
+- Add multiple cmd_id pushes for Reolink floodlight ([@starkillerOG] - [#146685])
+- Rename second Reolink lens from "autotrack" to "telephoto" ([@starkillerOG] - [#146898])
+- Add Reolink Telephoto main stream ([@starkillerOG] - [#146975])
+- Add sensors for detailed Enphase inverter readings ([@Bidski] - [#146916])
+- Add Bluetooth connection to LaMetric ([@joostlek] - [#147342])
+- Refactor DeviceAutomationConditionProtocol ([@emontnemery] - [#147377])
+- Add trigger based fan entities to template integration ([@Petro31] - [#145497])
+- Clean up start_subentry_reconfigure_flow API for tests ([@balloob] - [#147381])
+- Remove JuiceNet integration ([@epenet] - [#147206])
+- Add strict typing for Telegram bot integration ([@hanwg] - [#147262])
+- Refactor states and strings for Miele plate power steps ([@astrandb] - [#144992])
+- Optimize Enphase envoy translation strings. ([@catsmanac] - [#147389])
+- Add media class to media player search and play intent ([@balloob] - [#147097])
+- Add sensors to ntfy integration ([@tr4nt0r] - [#145262])
+- Add PlayStation Network Integration ([@JackJPowell] - [#133901])
+- Handle router initialization, connection errors, and missing interfaces in options flow ([@foxel] - [#143475])
+- Migrate Google Gen AI to use subentries ([@balloob] - [#147281])
+- Remove duplicated subentry device update in Google Gen AI + add merge test ([@balloob] - [#147396])
+- New core integration for VegeHub ([@Thulrus] - [#129598])
+- Fix unbound var and tests in PlayStation Network integration ([@tr4nt0r] - [#147398])
+- Add container arch to system info ([@agners] - [#147372])
+- Bump universal-silabs-flasher to 0.0.31 ([@puddly] - [#147393])
+- Bump intents to 2025.6.23 ([@synesthesiam] - [#147391])
+- Fix trigger config validation ([@emontnemery] - [#147408])
+- Add support for v2 API for HomeWizard kWh Meter ([@DCSBL] - [#147214])
+- Add full device snapshot tests for Shelly ([@bieniu] - [#145620])
+- Added auto-discovery configuration for SONOFF Dongle Max in zha. ([@CubeZ2mDeveloper] - [#140574])
+- Bump sigstore/cosign-installer from 3.8.2 to 3.9.0 (@dependabot - [#147072])
+- Add reauth flow to PlayStation Network integration ([@tr4nt0r] - [#147397])
+- AI task generate_text -> generate_data ([@balloob] - [#147370])
+- Add door state sensors to tedee ([@zweckj] - [#147386])
+- Add streaming support w/ audio to Android IP Webcam integration ([@regulad] - [#126009])
+- Add default to from_json ([@Petro31] - [#146211])
+- Add accept keyword to Media selector ([@balloob] - [#145527])
+- Add 'max_sub_interval' option to derivative sensor ([@karwosts] - [#125870])
+- Log LCN connection established with log level info ([@alengwenus] - [#147424])
+- Update ZwaveJS config flow strings ([@MindFreeze] - [#147421])
+- Convert Claude to use subentries ([@balloob] - [#147285])
+- Add fields and multiple support to object selector ([@piitaya] - [#147215])
+- Add range icons for wind_direction sensor device class ([@edenhaus] - [#147090])
+- Bump wyoming to 1.7.1 ([@synesthesiam] - [#147385])
+- Remove deprecated proxy params from Telegram bot integration ([@hanwg] - [#147288])
+- Update Shelly test snapshots ([@abmantis] - [#147429])
+- Add DHCP discovery to PlayStation Network integration ([@tr4nt0r] - [#147422])
+- Add device class to wind direction sensors for AEMET ([@luca-angemi] - [#147430])
+- Cleanup some duplicated code ([@karwosts] - [#147439])
+- Add total cycles sensor for Litter-Robot ([@natekspencer] - [#147435])
+- Use non-autospec mock for Reolink service tests ([@abmantis] - [#147440])
+- Add TTS streaming to Wyoming satellites ([@synesthesiam] - [#147438])
+- Support streaming TTS in wyoming ([@synesthesiam] - [#147392])
+- Use non-autospec mock for Reolink switch tests ([@abmantis] - [#147441])
+- Bump pylitterbot to 2024.2.1 ([@natekspencer] - [#147443])
+- Use newer mock in recent Reolink test ([@abmantis] - [#147448])
+- Add missing method mock to Reolink chime test ([@abmantis] - [#147447])
+- Fix nfandroidtv service notify disappears when restarting home assistant ([@sVnsation] - [#128958])
+- Migrate OpenAI to config subentries ([@balloob] - [#147282])
+- Define fields for assist ask_question action ([@piitaya] - [#147219])
+- Add type for wiz ([@balloob] - [#147454])
+- Custom sentence triggers should be marked as processed locally ([@HarvsG] - [#145704])
+- Set quality scale to 🥇 gold for ista EcoTrend integration ([@tr4nt0r] - [#143462])
+- Add quality scale bronze to SamsungTV ([@chemelli74] - [#142288])
+- Bump aioshelly to version 13.7.0 ([@bieniu] - [#147453])
+- Convert Ollama to subentries ([@balloob] - [#147286])
+- Flash ZBT-1 and Yellow firmwares from Core instead of using addons ([@puddly] - [#145019])
+- Only send ESPHome intent progress when necessary ([@synesthesiam] - [#147458])
+- Add missing config entry type for Husqvarna ([@balloob] - [#147455])
+- Fix media accept config type ([@balloob] - [#147445])
+- Move DevoloMultiLevelSwitchDeviceEntity in devolo Home Control ([@Shutgun] - [#147450])
+- Bump pyairnow to 1.3.1 ([@natepugh] - [#147388])
+- Fix errors in legacy platform in PlayStation Network integration ([@tr4nt0r] - [#147471])
+- Migrate lyric to use runtime_data ([@epenet] - [#147475])
+- Migrate lupusec to use runtime_data ([@epenet] - [#147476])
+- Move luftdaten coordinator to separate module ([@epenet] - [#147477])
+- Migrate loqed to use runtime_data ([@epenet] - [#147478])
+- Migrate luftdaten to use runtime_data ([@epenet] - [#147480])
+- Migrate local_calendar to use runtime_data ([@epenet] - [#147481])
+- Set has entity name to True in Meater ([@joostlek] - [#146954])
+- Migrate lookin to use runtime_data ([@epenet] - [#147479])
+- Refactor Meater availability ([@joostlek] - [#146956])
+- Add entity category option to entities set up via an MQTT subentry ([@jbouwh] - [#146776])
+- Add evaporative humidifier for switchbot integration ([@zerzhang] - [#146235])
+- Add more binary sensors to Alexa Devices ([@chemelli74] - [#146402])
+- Ezviz battery camera work mode ([@srescio] - [#130478])
+- Migrate Meater to use HassKey ([@joostlek] - [#147485])
+- Bump hass-nabucasa from 0.103.0 to 0.104.0 ([@ludeeus] - [#147488])
+- Add subdevices support to ESPHome ([@bdraco] - [#147343])
+- Add Home Connect DHCP information ([@Diegorro98] - [#147494])
+- Fix Google AI not using correct config options after subentries migration ([@tronikos] - [#147493])
+- Add tests for join and unjoin service calls in Sonos ([@PeteRager] - [#145602])
+- Improve Home Connect diagnostics exposing more data ([@Diegorro98] - [#147492])
+- Add quality scale for LCN ([@alengwenus] - [#147367])
+- Fix ESPHome entity_id generation if name contains unicode characters ([@g-kiss] - [#146796])
+- Bump ZHA to 0.0.61 ([@puddly] - [#147472])
+- Bump py-dormakaba-dkey to 1.0.6 ([@emontnemery] - [#147499])
+- Bump PySwitchbot to 0.67.0 ([@bdraco] - [#147503])
+- Split setup tests in devolo Home Network ([@Shutgun] - [#147498])
+- Add sensor platform to PlayStation Network ([@tr4nt0r] - [#147469])
+- Add missing reauth_confirm strings to devolo Home Control ([@Shutgun] - [#147496])
+- Fix sensor state class for fuel sensor in StarLine integration ([@Chupaka] - [#146769])
+- Add effect mode support for switchbot light ([@zerzhang] - [#147326])
+- Split models and helpers from coordinator module in AVM Fritz!Box tools ([@mib1185] - [#147412])
+- Fix operational state and vacuum state for matter vacuum ([@ocrease] - [#147466])
+- Add cover platform to Qbus integration ([@thomasddn] - [#147420])
+- Fix API POST endpoints json parsing error-handling ([@GrandMoff100] - [#134326])
+- Add floor lamp and strip light 3 for switchbot integration ([@zerzhang] - [#147517])
+- Remove mapping of entity_ids to speakers in Sonos ([@PeteRager] - [#147506])
+- Allow core integrations to describe their triggers ([@emontnemery] - [#147075])
+- Update codeowners of PlayStation Network integration ([@tr4nt0r] - [#147510])
+- Update frontend to 20250625.0 ([@bramkragten] - [#147521])
+- Fix typo's in MQTT translation strings ([@jbouwh] - [#147489])
+- Remove force latch mode for locklite in switchbot integration ([@zerzhang] - [#147474])
+- Bump aioamazondevices to 3.1.19 ([@chemelli74] - [#147462])
+- Bump plugwise to v1.7.6 ([@bouwew] - [#147508])
+- Add support for condition platforms to provide multiple conditions ([@emontnemery] - [#147376])
+
+[#125870]: https://github.com/home-assistant/core/pull/125870
+[#126009]: https://github.com/home-assistant/core/pull/126009
+[#128565]: https://github.com/home-assistant/core/pull/128565
+[#128958]: https://github.com/home-assistant/core/pull/128958
+[#129598]: https://github.com/home-assistant/core/pull/129598
+[#130478]: https://github.com/home-assistant/core/pull/130478
+[#131703]: https://github.com/home-assistant/core/pull/131703
+[#133901]: https://github.com/home-assistant/core/pull/133901
+[#134326]: https://github.com/home-assistant/core/pull/134326
+[#139334]: https://github.com/home-assistant/core/pull/139334
+[#139726]: https://github.com/home-assistant/core/pull/139726
+[#140574]: https://github.com/home-assistant/core/pull/140574
+[#140956]: https://github.com/home-assistant/core/pull/140956
+[#141533]: https://github.com/home-assistant/core/pull/141533
+[#141563]: https://github.com/home-assistant/core/pull/141563
+[#141873]: https://github.com/home-assistant/core/pull/141873
+[#142171]: https://github.com/home-assistant/core/pull/142171
+[#142288]: https://github.com/home-assistant/core/pull/142288
+[#142695]: https://github.com/home-assistant/core/pull/142695
+[#143462]: https://github.com/home-assistant/core/pull/143462
+[#143475]: https://github.com/home-assistant/core/pull/143475
+[#143743]: https://github.com/home-assistant/core/pull/143743
+[#144293]: https://github.com/home-assistant/core/pull/144293
+[#144617]: https://github.com/home-assistant/core/pull/144617
+[#144827]: https://github.com/home-assistant/core/pull/144827
+[#144879]: https://github.com/home-assistant/core/pull/144879
+[#144992]: https://github.com/home-assistant/core/pull/144992
+[#145019]: https://github.com/home-assistant/core/pull/145019
+[#145027]: https://github.com/home-assistant/core/pull/145027
+[#145128]: https://github.com/home-assistant/core/pull/145128
+[#145191]: https://github.com/home-assistant/core/pull/145191
+[#145205]: https://github.com/home-assistant/core/pull/145205
+[#145233]: https://github.com/home-assistant/core/pull/145233
+[#145242]: https://github.com/home-assistant/core/pull/145242
+[#145262]: https://github.com/home-assistant/core/pull/145262
+[#145278]: https://github.com/home-assistant/core/pull/145278
+[#145461]: https://github.com/home-assistant/core/pull/145461
+[#145485]: https://github.com/home-assistant/core/pull/145485
+[#145497]: https://github.com/home-assistant/core/pull/145497
+[#145512]: https://github.com/home-assistant/core/pull/145512
+[#145515]: https://github.com/home-assistant/core/pull/145515
+[#145527]: https://github.com/home-assistant/core/pull/145527
+[#145528]: https://github.com/home-assistant/core/pull/145528
+[#145534]: https://github.com/home-assistant/core/pull/145534
+[#145602]: https://github.com/home-assistant/core/pull/145602
+[#145620]: https://github.com/home-assistant/core/pull/145620
+[#145626]: https://github.com/home-assistant/core/pull/145626
+[#145638]: https://github.com/home-assistant/core/pull/145638
+[#145647]: https://github.com/home-assistant/core/pull/145647
+[#145657]: https://github.com/home-assistant/core/pull/145657
+[#145675]: https://github.com/home-assistant/core/pull/145675
+[#145676]: https://github.com/home-assistant/core/pull/145676
+[#145679]: https://github.com/home-assistant/core/pull/145679
+[#145689]: https://github.com/home-assistant/core/pull/145689
+[#145690]: https://github.com/home-assistant/core/pull/145690
+[#145695]: https://github.com/home-assistant/core/pull/145695
+[#145700]: https://github.com/home-assistant/core/pull/145700
+[#145702]: https://github.com/home-assistant/core/pull/145702
+[#145704]: https://github.com/home-assistant/core/pull/145704
+[#145710]: https://github.com/home-assistant/core/pull/145710
+[#145714]: https://github.com/home-assistant/core/pull/145714
+[#145717]: https://github.com/home-assistant/core/pull/145717
+[#145718]: https://github.com/home-assistant/core/pull/145718
+[#145731]: https://github.com/home-assistant/core/pull/145731
+[#145732]: https://github.com/home-assistant/core/pull/145732
+[#145733]: https://github.com/home-assistant/core/pull/145733
+[#145739]: https://github.com/home-assistant/core/pull/145739
+[#145743]: https://github.com/home-assistant/core/pull/145743
+[#145746]: https://github.com/home-assistant/core/pull/145746
+[#145747]: https://github.com/home-assistant/core/pull/145747
+[#145764]: https://github.com/home-assistant/core/pull/145764
+[#145766]: https://github.com/home-assistant/core/pull/145766
+[#145773]: https://github.com/home-assistant/core/pull/145773
+[#145778]: https://github.com/home-assistant/core/pull/145778
+[#145779]: https://github.com/home-assistant/core/pull/145779
+[#145787]: https://github.com/home-assistant/core/pull/145787
+[#145788]: https://github.com/home-assistant/core/pull/145788
+[#145789]: https://github.com/home-assistant/core/pull/145789
+[#145790]: https://github.com/home-assistant/core/pull/145790
+[#145791]: https://github.com/home-assistant/core/pull/145791
+[#145798]: https://github.com/home-assistant/core/pull/145798
+[#145801]: https://github.com/home-assistant/core/pull/145801
+[#145803]: https://github.com/home-assistant/core/pull/145803
+[#145817]: https://github.com/home-assistant/core/pull/145817
+[#145818]: https://github.com/home-assistant/core/pull/145818
+[#145827]: https://github.com/home-assistant/core/pull/145827
+[#145832]: https://github.com/home-assistant/core/pull/145832
+[#145840]: https://github.com/home-assistant/core/pull/145840
+[#145843]: https://github.com/home-assistant/core/pull/145843
+[#145864]: https://github.com/home-assistant/core/pull/145864
+[#145872]: https://github.com/home-assistant/core/pull/145872
+[#145893]: https://github.com/home-assistant/core/pull/145893
+[#145899]: https://github.com/home-assistant/core/pull/145899
+[#145946]: https://github.com/home-assistant/core/pull/145946
+[#145948]: https://github.com/home-assistant/core/pull/145948
+[#145952]: https://github.com/home-assistant/core/pull/145952
+[#145956]: https://github.com/home-assistant/core/pull/145956
+[#145966]: https://github.com/home-assistant/core/pull/145966
+[#145976]: https://github.com/home-assistant/core/pull/145976
+[#145977]: https://github.com/home-assistant/core/pull/145977
+[#145978]: https://github.com/home-assistant/core/pull/145978
+[#145979]: https://github.com/home-assistant/core/pull/145979
+[#145981]: https://github.com/home-assistant/core/pull/145981
+[#145982]: https://github.com/home-assistant/core/pull/145982
+[#145983]: https://github.com/home-assistant/core/pull/145983
+[#145984]: https://github.com/home-assistant/core/pull/145984
+[#145985]: https://github.com/home-assistant/core/pull/145985
+[#145986]: https://github.com/home-assistant/core/pull/145986
+[#145988]: https://github.com/home-assistant/core/pull/145988
+[#145989]: https://github.com/home-assistant/core/pull/145989
+[#145990]: https://github.com/home-assistant/core/pull/145990
+[#145991]: https://github.com/home-assistant/core/pull/145991
+[#145992]: https://github.com/home-assistant/core/pull/145992
+[#145993]: https://github.com/home-assistant/core/pull/145993
+[#145995]: https://github.com/home-assistant/core/pull/145995
+[#146000]: https://github.com/home-assistant/core/pull/146000
+[#146002]: https://github.com/home-assistant/core/pull/146002
+[#146009]: https://github.com/home-assistant/core/pull/146009
+[#146010]: https://github.com/home-assistant/core/pull/146010
+[#146011]: https://github.com/home-assistant/core/pull/146011
+[#146012]: https://github.com/home-assistant/core/pull/146012
+[#146013]: https://github.com/home-assistant/core/pull/146013
+[#146014]: https://github.com/home-assistant/core/pull/146014
+[#146015]: https://github.com/home-assistant/core/pull/146015
+[#146016]: https://github.com/home-assistant/core/pull/146016
+[#146017]: https://github.com/home-assistant/core/pull/146017
+[#146018]: https://github.com/home-assistant/core/pull/146018
+[#146021]: https://github.com/home-assistant/core/pull/146021
+[#146024]: https://github.com/home-assistant/core/pull/146024
+[#146028]: https://github.com/home-assistant/core/pull/146028
+[#146032]: https://github.com/home-assistant/core/pull/146032
+[#146037]: https://github.com/home-assistant/core/pull/146037
+[#146038]: https://github.com/home-assistant/core/pull/146038
+[#146039]: https://github.com/home-assistant/core/pull/146039
+[#146040]: https://github.com/home-assistant/core/pull/146040
+[#146047]: https://github.com/home-assistant/core/pull/146047
+[#146048]: https://github.com/home-assistant/core/pull/146048
+[#146049]: https://github.com/home-assistant/core/pull/146049
+[#146050]: https://github.com/home-assistant/core/pull/146050
+[#146054]: https://github.com/home-assistant/core/pull/146054
+[#146056]: https://github.com/home-assistant/core/pull/146056
+[#146059]: https://github.com/home-assistant/core/pull/146059
+[#146063]: https://github.com/home-assistant/core/pull/146063
+[#146065]: https://github.com/home-assistant/core/pull/146065
+[#146069]: https://github.com/home-assistant/core/pull/146069
+[#146076]: https://github.com/home-assistant/core/pull/146076
+[#146077]: https://github.com/home-assistant/core/pull/146077
+[#146085]: https://github.com/home-assistant/core/pull/146085
+[#146089]: https://github.com/home-assistant/core/pull/146089
+[#146092]: https://github.com/home-assistant/core/pull/146092
+[#146093]: https://github.com/home-assistant/core/pull/146093
+[#146094]: https://github.com/home-assistant/core/pull/146094
+[#146095]: https://github.com/home-assistant/core/pull/146095
+[#146098]: https://github.com/home-assistant/core/pull/146098
+[#146104]: https://github.com/home-assistant/core/pull/146104
+[#146114]: https://github.com/home-assistant/core/pull/146114
+[#146124]: https://github.com/home-assistant/core/pull/146124
+[#146131]: https://github.com/home-assistant/core/pull/146131
+[#146133]: https://github.com/home-assistant/core/pull/146133
+[#146139]: https://github.com/home-assistant/core/pull/146139
+[#146142]: https://github.com/home-assistant/core/pull/146142
+[#146144]: https://github.com/home-assistant/core/pull/146144
+[#146147]: https://github.com/home-assistant/core/pull/146147
+[#146148]: https://github.com/home-assistant/core/pull/146148
+[#146149]: https://github.com/home-assistant/core/pull/146149
+[#146151]: https://github.com/home-assistant/core/pull/146151
+[#146158]: https://github.com/home-assistant/core/pull/146158
+[#146160]: https://github.com/home-assistant/core/pull/146160
+[#146161]: https://github.com/home-assistant/core/pull/146161
+[#146169]: https://github.com/home-assistant/core/pull/146169
+[#146174]: https://github.com/home-assistant/core/pull/146174
+[#146192]: https://github.com/home-assistant/core/pull/146192
+[#146198]: https://github.com/home-assistant/core/pull/146198
+[#146205]: https://github.com/home-assistant/core/pull/146205
+[#146206]: https://github.com/home-assistant/core/pull/146206
+[#146211]: https://github.com/home-assistant/core/pull/146211
+[#146235]: https://github.com/home-assistant/core/pull/146235
+[#146236]: https://github.com/home-assistant/core/pull/146236
+[#146237]: https://github.com/home-assistant/core/pull/146237
+[#146242]: https://github.com/home-assistant/core/pull/146242
+[#146244]: https://github.com/home-assistant/core/pull/146244
+[#146247]: https://github.com/home-assistant/core/pull/146247
+[#146253]: https://github.com/home-assistant/core/pull/146253
+[#146268]: https://github.com/home-assistant/core/pull/146268
+[#146277]: https://github.com/home-assistant/core/pull/146277
+[#146278]: https://github.com/home-assistant/core/pull/146278
+[#146283]: https://github.com/home-assistant/core/pull/146283
+[#146296]: https://github.com/home-assistant/core/pull/146296
+[#146297]: https://github.com/home-assistant/core/pull/146297
+[#146299]: https://github.com/home-assistant/core/pull/146299
+[#146306]: https://github.com/home-assistant/core/pull/146306
+[#146314]: https://github.com/home-assistant/core/pull/146314
+[#146320]: https://github.com/home-assistant/core/pull/146320
+[#146331]: https://github.com/home-assistant/core/pull/146331
+[#146335]: https://github.com/home-assistant/core/pull/146335
+[#146340]: https://github.com/home-assistant/core/pull/146340
+[#146351]: https://github.com/home-assistant/core/pull/146351
+[#146354]: https://github.com/home-assistant/core/pull/146354
+[#146366]: https://github.com/home-assistant/core/pull/146366
+[#146367]: https://github.com/home-assistant/core/pull/146367
+[#146376]: https://github.com/home-assistant/core/pull/146376
+[#146378]: https://github.com/home-assistant/core/pull/146378
+[#146388]: https://github.com/home-assistant/core/pull/146388
+[#146398]: https://github.com/home-assistant/core/pull/146398
+[#146402]: https://github.com/home-assistant/core/pull/146402
+[#146429]: https://github.com/home-assistant/core/pull/146429
+[#146430]: https://github.com/home-assistant/core/pull/146430
+[#146432]: https://github.com/home-assistant/core/pull/146432
+[#146434]: https://github.com/home-assistant/core/pull/146434
+[#146436]: https://github.com/home-assistant/core/pull/146436
+[#146446]: https://github.com/home-assistant/core/pull/146446
+[#146447]: https://github.com/home-assistant/core/pull/146447
+[#146452]: https://github.com/home-assistant/core/pull/146452
+[#146457]: https://github.com/home-assistant/core/pull/146457
+[#146462]: https://github.com/home-assistant/core/pull/146462
+[#146464]: https://github.com/home-assistant/core/pull/146464
+[#146467]: https://github.com/home-assistant/core/pull/146467
+[#146469]: https://github.com/home-assistant/core/pull/146469
+[#146474]: https://github.com/home-assistant/core/pull/146474
+[#146477]: https://github.com/home-assistant/core/pull/146477
+[#146478]: https://github.com/home-assistant/core/pull/146478
+[#146486]: https://github.com/home-assistant/core/pull/146486
+[#146487]: https://github.com/home-assistant/core/pull/146487
+[#146490]: https://github.com/home-assistant/core/pull/146490
+[#146508]: https://github.com/home-assistant/core/pull/146508
+[#146509]: https://github.com/home-assistant/core/pull/146509
+[#146511]: https://github.com/home-assistant/core/pull/146511
+[#146513]: https://github.com/home-assistant/core/pull/146513
+[#146514]: https://github.com/home-assistant/core/pull/146514
+[#146515]: https://github.com/home-assistant/core/pull/146515
+[#146528]: https://github.com/home-assistant/core/pull/146528
+[#146531]: https://github.com/home-assistant/core/pull/146531
+[#146535]: https://github.com/home-assistant/core/pull/146535
+[#146545]: https://github.com/home-assistant/core/pull/146545
+[#146546]: https://github.com/home-assistant/core/pull/146546
+[#146547]: https://github.com/home-assistant/core/pull/146547
+[#146550]: https://github.com/home-assistant/core/pull/146550
+[#146555]: https://github.com/home-assistant/core/pull/146555
+[#146557]: https://github.com/home-assistant/core/pull/146557
+[#146593]: https://github.com/home-assistant/core/pull/146593
+[#146594]: https://github.com/home-assistant/core/pull/146594
+[#146595]: https://github.com/home-assistant/core/pull/146595
+[#146596]: https://github.com/home-assistant/core/pull/146596
+[#146601]: https://github.com/home-assistant/core/pull/146601
+[#146606]: https://github.com/home-assistant/core/pull/146606
+[#146607]: https://github.com/home-assistant/core/pull/146607
+[#146608]: https://github.com/home-assistant/core/pull/146608
+[#146609]: https://github.com/home-assistant/core/pull/146609
+[#146610]: https://github.com/home-assistant/core/pull/146610
+[#146611]: https://github.com/home-assistant/core/pull/146611
+[#146612]: https://github.com/home-assistant/core/pull/146612
+[#146614]: https://github.com/home-assistant/core/pull/146614
+[#146617]: https://github.com/home-assistant/core/pull/146617
+[#146629]: https://github.com/home-assistant/core/pull/146629
+[#146633]: https://github.com/home-assistant/core/pull/146633
+[#146636]: https://github.com/home-assistant/core/pull/146636
+[#146664]: https://github.com/home-assistant/core/pull/146664
+[#146666]: https://github.com/home-assistant/core/pull/146666
+[#146667]: https://github.com/home-assistant/core/pull/146667
+[#146670]: https://github.com/home-assistant/core/pull/146670
+[#146684]: https://github.com/home-assistant/core/pull/146684
+[#146685]: https://github.com/home-assistant/core/pull/146685
+[#146689]: https://github.com/home-assistant/core/pull/146689
+[#146691]: https://github.com/home-assistant/core/pull/146691
+[#146692]: https://github.com/home-assistant/core/pull/146692
+[#146693]: https://github.com/home-assistant/core/pull/146693
+[#146695]: https://github.com/home-assistant/core/pull/146695
+[#146696]: https://github.com/home-assistant/core/pull/146696
+[#146699]: https://github.com/home-assistant/core/pull/146699
+[#146703]: https://github.com/home-assistant/core/pull/146703
+[#146717]: https://github.com/home-assistant/core/pull/146717
+[#146722]: https://github.com/home-assistant/core/pull/146722
+[#146723]: https://github.com/home-assistant/core/pull/146723
+[#146729]: https://github.com/home-assistant/core/pull/146729
+[#146736]: https://github.com/home-assistant/core/pull/146736
+[#146737]: https://github.com/home-assistant/core/pull/146737
+[#146738]: https://github.com/home-assistant/core/pull/146738
+[#146744]: https://github.com/home-assistant/core/pull/146744
+[#146745]: https://github.com/home-assistant/core/pull/146745
+[#146746]: https://github.com/home-assistant/core/pull/146746
+[#146751]: https://github.com/home-assistant/core/pull/146751
+[#146754]: https://github.com/home-assistant/core/pull/146754
+[#146755]: https://github.com/home-assistant/core/pull/146755
+[#146762]: https://github.com/home-assistant/core/pull/146762
+[#146763]: https://github.com/home-assistant/core/pull/146763
+[#146769]: https://github.com/home-assistant/core/pull/146769
+[#146770]: https://github.com/home-assistant/core/pull/146770
+[#146773]: https://github.com/home-assistant/core/pull/146773
+[#146774]: https://github.com/home-assistant/core/pull/146774
+[#146776]: https://github.com/home-assistant/core/pull/146776
+[#146778]: https://github.com/home-assistant/core/pull/146778
+[#146780]: https://github.com/home-assistant/core/pull/146780
+[#146781]: https://github.com/home-assistant/core/pull/146781
+[#146787]: https://github.com/home-assistant/core/pull/146787
+[#146793]: https://github.com/home-assistant/core/pull/146793
+[#146794]: https://github.com/home-assistant/core/pull/146794
+[#146796]: https://github.com/home-assistant/core/pull/146796
+[#146802]: https://github.com/home-assistant/core/pull/146802
+[#146804]: https://github.com/home-assistant/core/pull/146804
+[#146816]: https://github.com/home-assistant/core/pull/146816
+[#146817]: https://github.com/home-assistant/core/pull/146817
+[#146823]: https://github.com/home-assistant/core/pull/146823
+[#146835]: https://github.com/home-assistant/core/pull/146835
+[#146837]: https://github.com/home-assistant/core/pull/146837
+[#146838]: https://github.com/home-assistant/core/pull/146838
+[#146842]: https://github.com/home-assistant/core/pull/146842
+[#146860]: https://github.com/home-assistant/core/pull/146860
+[#146863]: https://github.com/home-assistant/core/pull/146863
+[#146897]: https://github.com/home-assistant/core/pull/146897
+[#146898]: https://github.com/home-assistant/core/pull/146898
+[#146901]: https://github.com/home-assistant/core/pull/146901
+[#146905]: https://github.com/home-assistant/core/pull/146905
+[#146906]: https://github.com/home-assistant/core/pull/146906
+[#146908]: https://github.com/home-assistant/core/pull/146908
+[#146916]: https://github.com/home-assistant/core/pull/146916
+[#146918]: https://github.com/home-assistant/core/pull/146918
+[#146921]: https://github.com/home-assistant/core/pull/146921
+[#146925]: https://github.com/home-assistant/core/pull/146925
+[#146927]: https://github.com/home-assistant/core/pull/146927
+[#146928]: https://github.com/home-assistant/core/pull/146928
+[#146934]: https://github.com/home-assistant/core/pull/146934
+[#146935]: https://github.com/home-assistant/core/pull/146935
+[#146937]: https://github.com/home-assistant/core/pull/146937
+[#146938]: https://github.com/home-assistant/core/pull/146938
+[#146939]: https://github.com/home-assistant/core/pull/146939
+[#146941]: https://github.com/home-assistant/core/pull/146941
+[#146942]: https://github.com/home-assistant/core/pull/146942
+[#146946]: https://github.com/home-assistant/core/pull/146946
+[#146951]: https://github.com/home-assistant/core/pull/146951
+[#146952]: https://github.com/home-assistant/core/pull/146952
+[#146953]: https://github.com/home-assistant/core/pull/146953
+[#146954]: https://github.com/home-assistant/core/pull/146954
+[#146956]: https://github.com/home-assistant/core/pull/146956
+[#146958]: https://github.com/home-assistant/core/pull/146958
+[#146961]: https://github.com/home-assistant/core/pull/146961
+[#146966]: https://github.com/home-assistant/core/pull/146966
+[#146967]: https://github.com/home-assistant/core/pull/146967
+[#146969]: https://github.com/home-assistant/core/pull/146969
+[#146975]: https://github.com/home-assistant/core/pull/146975
+[#146976]: https://github.com/home-assistant/core/pull/146976
+[#146978]: https://github.com/home-assistant/core/pull/146978
+[#146979]: https://github.com/home-assistant/core/pull/146979
+[#146980]: https://github.com/home-assistant/core/pull/146980
+[#146982]: https://github.com/home-assistant/core/pull/146982
+[#146984]: https://github.com/home-assistant/core/pull/146984
+[#146986]: https://github.com/home-assistant/core/pull/146986
+[#146987]: https://github.com/home-assistant/core/pull/146987
+[#146988]: https://github.com/home-assistant/core/pull/146988
+[#146991]: https://github.com/home-assistant/core/pull/146991
+[#147020]: https://github.com/home-assistant/core/pull/147020
+[#147021]: https://github.com/home-assistant/core/pull/147021
+[#147023]: https://github.com/home-assistant/core/pull/147023
+[#147036]: https://github.com/home-assistant/core/pull/147036
+[#147039]: https://github.com/home-assistant/core/pull/147039
+[#147041]: https://github.com/home-assistant/core/pull/147041
+[#147049]: https://github.com/home-assistant/core/pull/147049
+[#147050]: https://github.com/home-assistant/core/pull/147050
+[#147051]: https://github.com/home-assistant/core/pull/147051
+[#147054]: https://github.com/home-assistant/core/pull/147054
+[#147056]: https://github.com/home-assistant/core/pull/147056
+[#147061]: https://github.com/home-assistant/core/pull/147061
+[#147063]: https://github.com/home-assistant/core/pull/147063
+[#147072]: https://github.com/home-assistant/core/pull/147072
+[#147073]: https://github.com/home-assistant/core/pull/147073
+[#147075]: https://github.com/home-assistant/core/pull/147075
+[#147079]: https://github.com/home-assistant/core/pull/147079
+[#147087]: https://github.com/home-assistant/core/pull/147087
+[#147090]: https://github.com/home-assistant/core/pull/147090
+[#147092]: https://github.com/home-assistant/core/pull/147092
+[#147094]: https://github.com/home-assistant/core/pull/147094
+[#147095]: https://github.com/home-assistant/core/pull/147095
+[#147096]: https://github.com/home-assistant/core/pull/147096
+[#147097]: https://github.com/home-assistant/core/pull/147097
+[#147099]: https://github.com/home-assistant/core/pull/147099
+[#147106]: https://github.com/home-assistant/core/pull/147106
+[#147110]: https://github.com/home-assistant/core/pull/147110
+[#147112]: https://github.com/home-assistant/core/pull/147112
+[#147116]: https://github.com/home-assistant/core/pull/147116
+[#147118]: https://github.com/home-assistant/core/pull/147118
+[#147128]: https://github.com/home-assistant/core/pull/147128
+[#147129]: https://github.com/home-assistant/core/pull/147129
+[#147130]: https://github.com/home-assistant/core/pull/147130
+[#147132]: https://github.com/home-assistant/core/pull/147132
+[#147134]: https://github.com/home-assistant/core/pull/147134
+[#147138]: https://github.com/home-assistant/core/pull/147138
+[#147142]: https://github.com/home-assistant/core/pull/147142
+[#147153]: https://github.com/home-assistant/core/pull/147153
+[#147154]: https://github.com/home-assistant/core/pull/147154
+[#147155]: https://github.com/home-assistant/core/pull/147155
+[#147156]: https://github.com/home-assistant/core/pull/147156
+[#147157]: https://github.com/home-assistant/core/pull/147157
+[#147158]: https://github.com/home-assistant/core/pull/147158
+[#147160]: https://github.com/home-assistant/core/pull/147160
+[#147162]: https://github.com/home-assistant/core/pull/147162
+[#147164]: https://github.com/home-assistant/core/pull/147164
+[#147168]: https://github.com/home-assistant/core/pull/147168
+[#147170]: https://github.com/home-assistant/core/pull/147170
+[#147171]: https://github.com/home-assistant/core/pull/147171
+[#147172]: https://github.com/home-assistant/core/pull/147172
+[#147173]: https://github.com/home-assistant/core/pull/147173
+[#147174]: https://github.com/home-assistant/core/pull/147174
+[#147176]: https://github.com/home-assistant/core/pull/147176
+[#147177]: https://github.com/home-assistant/core/pull/147177
+[#147179]: https://github.com/home-assistant/core/pull/147179
+[#147182]: https://github.com/home-assistant/core/pull/147182
+[#147183]: https://github.com/home-assistant/core/pull/147183
+[#147184]: https://github.com/home-assistant/core/pull/147184
+[#147186]: https://github.com/home-assistant/core/pull/147186
+[#147188]: https://github.com/home-assistant/core/pull/147188
+[#147191]: https://github.com/home-assistant/core/pull/147191
+[#147193]: https://github.com/home-assistant/core/pull/147193
+[#147194]: https://github.com/home-assistant/core/pull/147194
+[#147198]: https://github.com/home-assistant/core/pull/147198
+[#147202]: https://github.com/home-assistant/core/pull/147202
+[#147204]: https://github.com/home-assistant/core/pull/147204
+[#147206]: https://github.com/home-assistant/core/pull/147206
+[#147214]: https://github.com/home-assistant/core/pull/147214
+[#147215]: https://github.com/home-assistant/core/pull/147215
+[#147216]: https://github.com/home-assistant/core/pull/147216
+[#147219]: https://github.com/home-assistant/core/pull/147219
+[#147223]: https://github.com/home-assistant/core/pull/147223
+[#147228]: https://github.com/home-assistant/core/pull/147228
+[#147229]: https://github.com/home-assistant/core/pull/147229
+[#147233]: https://github.com/home-assistant/core/pull/147233
+[#147235]: https://github.com/home-assistant/core/pull/147235
+[#147236]: https://github.com/home-assistant/core/pull/147236
+[#147238]: https://github.com/home-assistant/core/pull/147238
+[#147244]: https://github.com/home-assistant/core/pull/147244
+[#147245]: https://github.com/home-assistant/core/pull/147245
+[#147248]: https://github.com/home-assistant/core/pull/147248
+[#147253]: https://github.com/home-assistant/core/pull/147253
+[#147262]: https://github.com/home-assistant/core/pull/147262
+[#147273]: https://github.com/home-assistant/core/pull/147273
+[#147275]: https://github.com/home-assistant/core/pull/147275
+[#147279]: https://github.com/home-assistant/core/pull/147279
+[#147281]: https://github.com/home-assistant/core/pull/147281
+[#147282]: https://github.com/home-assistant/core/pull/147282
+[#147285]: https://github.com/home-assistant/core/pull/147285
+[#147286]: https://github.com/home-assistant/core/pull/147286
+[#147288]: https://github.com/home-assistant/core/pull/147288
+[#147293]: https://github.com/home-assistant/core/pull/147293
+[#147306]: https://github.com/home-assistant/core/pull/147306
+[#147313]: https://github.com/home-assistant/core/pull/147313
+[#147323]: https://github.com/home-assistant/core/pull/147323
+[#147326]: https://github.com/home-assistant/core/pull/147326
+[#147327]: https://github.com/home-assistant/core/pull/147327
+[#147328]: https://github.com/home-assistant/core/pull/147328
+[#147329]: https://github.com/home-assistant/core/pull/147329
+[#147330]: https://github.com/home-assistant/core/pull/147330
+[#147331]: https://github.com/home-assistant/core/pull/147331
+[#147333]: https://github.com/home-assistant/core/pull/147333
+[#147334]: https://github.com/home-assistant/core/pull/147334
+[#147335]: https://github.com/home-assistant/core/pull/147335
+[#147336]: https://github.com/home-assistant/core/pull/147336
+[#147337]: https://github.com/home-assistant/core/pull/147337
+[#147338]: https://github.com/home-assistant/core/pull/147338
+[#147341]: https://github.com/home-assistant/core/pull/147341
+[#147342]: https://github.com/home-assistant/core/pull/147342
+[#147343]: https://github.com/home-assistant/core/pull/147343
+[#147345]: https://github.com/home-assistant/core/pull/147345
+[#147346]: https://github.com/home-assistant/core/pull/147346
+[#147348]: https://github.com/home-assistant/core/pull/147348
+[#147349]: https://github.com/home-assistant/core/pull/147349
+[#147350]: https://github.com/home-assistant/core/pull/147350
+[#147351]: https://github.com/home-assistant/core/pull/147351
+[#147352]: https://github.com/home-assistant/core/pull/147352
+[#147354]: https://github.com/home-assistant/core/pull/147354
+[#147357]: https://github.com/home-assistant/core/pull/147357
+[#147367]: https://github.com/home-assistant/core/pull/147367
+[#147369]: https://github.com/home-assistant/core/pull/147369
+[#147370]: https://github.com/home-assistant/core/pull/147370
+[#147372]: https://github.com/home-assistant/core/pull/147372
+[#147376]: https://github.com/home-assistant/core/pull/147376
+[#147377]: https://github.com/home-assistant/core/pull/147377
+[#147381]: https://github.com/home-assistant/core/pull/147381
+[#147385]: https://github.com/home-assistant/core/pull/147385
+[#147386]: https://github.com/home-assistant/core/pull/147386
+[#147388]: https://github.com/home-assistant/core/pull/147388
+[#147389]: https://github.com/home-assistant/core/pull/147389
+[#147391]: https://github.com/home-assistant/core/pull/147391
+[#147392]: https://github.com/home-assistant/core/pull/147392
+[#147393]: https://github.com/home-assistant/core/pull/147393
+[#147396]: https://github.com/home-assistant/core/pull/147396
+[#147397]: https://github.com/home-assistant/core/pull/147397
+[#147398]: https://github.com/home-assistant/core/pull/147398
+[#147408]: https://github.com/home-assistant/core/pull/147408
+[#147412]: https://github.com/home-assistant/core/pull/147412
+[#147420]: https://github.com/home-assistant/core/pull/147420
+[#147421]: https://github.com/home-assistant/core/pull/147421
+[#147422]: https://github.com/home-assistant/core/pull/147422
+[#147424]: https://github.com/home-assistant/core/pull/147424
+[#147429]: https://github.com/home-assistant/core/pull/147429
+[#147430]: https://github.com/home-assistant/core/pull/147430
+[#147435]: https://github.com/home-assistant/core/pull/147435
+[#147438]: https://github.com/home-assistant/core/pull/147438
+[#147439]: https://github.com/home-assistant/core/pull/147439
+[#147440]: https://github.com/home-assistant/core/pull/147440
+[#147441]: https://github.com/home-assistant/core/pull/147441
+[#147443]: https://github.com/home-assistant/core/pull/147443
+[#147445]: https://github.com/home-assistant/core/pull/147445
+[#147447]: https://github.com/home-assistant/core/pull/147447
+[#147448]: https://github.com/home-assistant/core/pull/147448
+[#147450]: https://github.com/home-assistant/core/pull/147450
+[#147453]: https://github.com/home-assistant/core/pull/147453
+[#147454]: https://github.com/home-assistant/core/pull/147454
+[#147455]: https://github.com/home-assistant/core/pull/147455
+[#147458]: https://github.com/home-assistant/core/pull/147458
+[#147462]: https://github.com/home-assistant/core/pull/147462
+[#147466]: https://github.com/home-assistant/core/pull/147466
+[#147469]: https://github.com/home-assistant/core/pull/147469
+[#147471]: https://github.com/home-assistant/core/pull/147471
+[#147472]: https://github.com/home-assistant/core/pull/147472
+[#147474]: https://github.com/home-assistant/core/pull/147474
+[#147475]: https://github.com/home-assistant/core/pull/147475
+[#147476]: https://github.com/home-assistant/core/pull/147476
+[#147477]: https://github.com/home-assistant/core/pull/147477
+[#147478]: https://github.com/home-assistant/core/pull/147478
+[#147479]: https://github.com/home-assistant/core/pull/147479
+[#147480]: https://github.com/home-assistant/core/pull/147480
+[#147481]: https://github.com/home-assistant/core/pull/147481
+[#147485]: https://github.com/home-assistant/core/pull/147485
+[#147488]: https://github.com/home-assistant/core/pull/147488
+[#147489]: https://github.com/home-assistant/core/pull/147489
+[#147492]: https://github.com/home-assistant/core/pull/147492
+[#147493]: https://github.com/home-assistant/core/pull/147493
+[#147494]: https://github.com/home-assistant/core/pull/147494
+[#147496]: https://github.com/home-assistant/core/pull/147496
+[#147498]: https://github.com/home-assistant/core/pull/147498
+[#147499]: https://github.com/home-assistant/core/pull/147499
+[#147503]: https://github.com/home-assistant/core/pull/147503
+[#147506]: https://github.com/home-assistant/core/pull/147506
+[#147508]: https://github.com/home-assistant/core/pull/147508
+[#147510]: https://github.com/home-assistant/core/pull/147510
+[#147517]: https://github.com/home-assistant/core/pull/147517
+[#147521]: https://github.com/home-assistant/core/pull/147521
+[@Bidski]: https://github.com/Bidski
+[@Bre77]: https://github.com/Bre77
+[@Chupaka]: https://github.com/Chupaka
+[@CubeZ2mDeveloper]: https://github.com/CubeZ2mDeveloper
+[@DCSBL]: https://github.com/DCSBL
+[@DeerMaximum]: https://github.com/DeerMaximum
+[@Diegorro98]: https://github.com/Diegorro98
+[@Foscam-wangzhengyu]: https://github.com/Foscam-wangzhengyu
+[@GrandMoff100]: https://github.com/GrandMoff100
+[@HarvsG]: https://github.com/HarvsG
+[@Imeon-Energy]: https://github.com/Imeon-Energy
+[@JackJPowell]: https://github.com/JackJPowell
+[@LG-ThinQ-Integration]: https://github.com/LG-ThinQ-Integration
+[@LaStrada]: https://github.com/LaStrada
+[@Lesekater]: https://github.com/Lesekater
+[@LoSk-p]: https://github.com/LoSk-p
+[@MartinHjelmare]: https://github.com/MartinHjelmare
+[@MindFreeze]: https://github.com/MindFreeze
+[@NoRi2909]: https://github.com/NoRi2909
+[@PeteRager]: https://github.com/PeteRager
+[@Petro31]: https://github.com/Petro31
+[@Shulyaka]: https://github.com/Shulyaka
+[@Shutgun]: https://github.com/Shutgun
+[@Sibgatulin]: https://github.com/Sibgatulin
+[@Taraman17]: https://github.com/Taraman17
+[@Thomas55555]: https://github.com/Thomas55555
+[@Thulrus]: https://github.com/Thulrus
+[@ToniCipriani]: https://github.com/ToniCipriani
+[@ViViDboarder]: https://github.com/ViViDboarder
+[@XiaoLing-git]: https://github.com/XiaoLing-git
+[@abmantis]: https://github.com/abmantis
+[@agners]: https://github.com/agners
+[@alengwenus]: https://github.com/alengwenus
+[@allenporter]: https://github.com/allenporter
+[@arturpragacz]: https://github.com/arturpragacz
+[@astrandb]: https://github.com/astrandb
+[@aviadlevy]: https://github.com/aviadlevy
+[@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
+[@catsmanac]: https://github.com/catsmanac
+[@cdce8p]: https://github.com/cdce8p
+[@chemelli74]: https://github.com/chemelli74
+[@christopherboyd]: https://github.com/christopherboyd
+[@crug80]: https://github.com/crug80
+[@edenhaus]: https://github.com/edenhaus
+[@eifinger]: https://github.com/eifinger
+[@emontnemery]: https://github.com/emontnemery
+[@epenet]: https://github.com/epenet
+[@erwindouna]: https://github.com/erwindouna
+[@etiennec78]: https://github.com/etiennec78
+[@farmio]: https://github.com/farmio
+[@foxel]: https://github.com/foxel
+[@frenck]: https://github.com/frenck
+[@fvgarrel]: https://github.com/fvgarrel
+[@g-kiss]: https://github.com/g-kiss
+[@gjohansson-ST]: https://github.com/gjohansson-ST
+[@hahn-th]: https://github.com/hahn-th
+[@hanwg]: https://github.com/hanwg
+[@jbouwh]: https://github.com/jbouwh
+[@joostlek]: https://github.com/joostlek
+[@jpbede]: https://github.com/jpbede
+[@jpelgrom]: https://github.com/jpelgrom
+[@karwosts]: https://github.com/karwosts
+[@klejejs]: https://github.com/klejejs
+[@lanthaler]: https://github.com/lanthaler
+[@lboue]: https://github.com/lboue
+[@lennartnederstigt]: https://github.com/lennartnederstigt
+[@liudger]: https://github.com/liudger
+[@luca-angemi]: https://github.com/luca-angemi
+[@ludeeus]: https://github.com/ludeeus
+[@marcelveldt]: https://github.com/marcelveldt
+[@markhannon]: https://github.com/markhannon
+[@matrixd2]: https://github.com/matrixd2
+[@maximvelichko]: https://github.com/maximvelichko
+[@mbo18]: https://github.com/mbo18
+[@mib1185]: https://github.com/mib1185
+[@michaelheyman]: https://github.com/michaelheyman
+[@mikey0000]: https://github.com/mikey0000
+[@mswilson]: https://github.com/mswilson
+[@natekspencer]: https://github.com/natekspencer
+[@natepugh]: https://github.com/natepugh
+[@noahhusby]: https://github.com/noahhusby
+[@ocrease]: https://github.com/ocrease
+[@parholmdahl]: https://github.com/parholmdahl
+[@peteS-UK]: https://github.com/peteS-UK
+[@piitaya]: https://github.com/piitaya
+[@puddly]: https://github.com/puddly
+[@rappenze]: https://github.com/rappenze
+[@regulad]: https://github.com/regulad
+[@rlint-explicatis]: https://github.com/rlint-explicatis
+[@rrooggiieerr]: https://github.com/rrooggiieerr
+[@sVnsation]: https://github.com/sVnsation
+[@sanjay900]: https://github.com/sanjay900
+[@shaiu]: https://github.com/shaiu
+[@silamon]: https://github.com/silamon
+[@srescio]: https://github.com/srescio
+[@starkillerOG]: https://github.com/starkillerOG
+[@synesthesiam]: https://github.com/synesthesiam
+[@thomasddn]: https://github.com/thomasddn
+[@tl-sl]: https://github.com/tl-sl
+[@tr4nt0r]: https://github.com/tr4nt0r
+[@tronikos]: https://github.com/tronikos
+[@wbyoung]: https://github.com/wbyoung
+[@willschlitzer]: https://github.com/willschlitzer
+[@yuxincs]: https://github.com/yuxincs
+[@zerzhang]: https://github.com/zerzhang
+[@zweckj]: https://github.com/zweckj
+[@zxdavb]: https://github.com/zxdavb
diff --git a/source/images/blog/2025-06-switchbot/art.jpg b/source/images/blog/2025-06-switchbot/art.jpg
new file mode 100644
index 00000000000..0b481293ff1
Binary files /dev/null and b/source/images/blog/2025-06-switchbot/art.jpg differ
diff --git a/source/images/blog/2025-06-switchbot/vacuum.jpg b/source/images/blog/2025-06-switchbot/vacuum.jpg
new file mode 100644
index 00000000000..96bdaaa0d14
Binary files /dev/null and b/source/images/blog/2025-06-switchbot/vacuum.jpg differ
diff --git a/source/images/blog/2025-06-voice-chapter-10/art.png b/source/images/blog/2025-06-voice-chapter-10/art.png
new file mode 100644
index 00000000000..468c14af0f1
Binary files /dev/null and b/source/images/blog/2025-06-voice-chapter-10/art.png differ
diff --git a/source/images/blog/2025-06-voice-chapter-10/circuits.png b/source/images/blog/2025-06-voice-chapter-10/circuits.png
new file mode 100644
index 00000000000..5ada1e3bf53
Binary files /dev/null and b/source/images/blog/2025-06-voice-chapter-10/circuits.png differ
diff --git a/source/images/blog/2025-06-voice-chapter-10/devices.jpg b/source/images/blog/2025-06-voice-chapter-10/devices.jpg
new file mode 100644
index 00000000000..0f0cbd11ee9
Binary files /dev/null and b/source/images/blog/2025-06-voice-chapter-10/devices.jpg differ
diff --git a/source/images/blog/2025-06-voice-chapter-10/intents.png b/source/images/blog/2025-06-voice-chapter-10/intents.png
new file mode 100644
index 00000000000..f689fa7aa6b
Binary files /dev/null and b/source/images/blog/2025-06-voice-chapter-10/intents.png differ
diff --git a/source/images/blog/2025-07/add-mqtt-device-using-sub-entry.png b/source/images/blog/2025-07/add-mqtt-device-using-sub-entry.png
new file mode 100644
index 00000000000..52d5bd57e87
Binary files /dev/null and b/source/images/blog/2025-07/add-mqtt-device-using-sub-entry.png differ
diff --git a/source/images/blog/2025-07/area-card.png b/source/images/blog/2025-07/area-card.png
new file mode 100644
index 00000000000..3d1d4a5b33e
Binary files /dev/null and b/source/images/blog/2025-07/area-card.png differ
diff --git a/source/images/blog/2025-07/areas-dashboard.png b/source/images/blog/2025-07/areas-dashboard.png
new file mode 100644
index 00000000000..52285281040
Binary files /dev/null and b/source/images/blog/2025-07/areas-dashboard.png differ
diff --git a/source/images/blog/2025-07/ask_question.png b/source/images/blog/2025-07/ask_question.png
new file mode 100644
index 00000000000..f2a27641202
Binary files /dev/null and b/source/images/blog/2025-07/ask_question.png differ
diff --git a/source/images/blog/2025-07/improved-add-dashboard-dialog.png b/source/images/blog/2025-07/improved-add-dashboard-dialog.png
new file mode 100644
index 00000000000..e99c5dbcb5f
Binary files /dev/null and b/source/images/blog/2025-07/improved-add-dashboard-dialog.png differ
diff --git a/source/images/blog/2025-07/new-integrations-page.png b/source/images/blog/2025-07/new-integrations-page.png
new file mode 100644
index 00000000000..eb89c08c3e9
Binary files /dev/null and b/source/images/blog/2025-07/new-integrations-page.png differ
diff --git a/source/images/blog/2025-07/social.png b/source/images/blog/2025-07/social.png
new file mode 100644
index 00000000000..150a2267a84
Binary files /dev/null and b/source/images/blog/2025-07/social.png differ
diff --git a/source/installation/index.html b/source/installation/index.html
index f3aada16274..e57baa69b8e 100644
--- a/source/installation/index.html
+++ b/source/installation/index.html
@@ -13,7 +13,80 @@ toc: true
kinds of skill levels.
+ About installation methods
+
+ Home Assistant offers two different installation methods. Home Assistant Operating System is the recommended installation method.
+
+
+ - Home Assistant Operating System: An embedded,
+ minimalistic operating system designed to run the Home Assistant ecosystem
+ on single board computers (like the Home Assistant Green or a Raspberry Pi) or Virtual Machines. It
+ is the most convenient option in terms of installation and maintenance and it supports
+ {% term "add-ons" %}. Home Assistant Operating System is
+ the recommended installation method for most users.
+ -
+ Home Assistant Container: Container-based installation of Home Assistant. You need to bring your own system (such as Linux) with container orchestration (like Docker), and manually handle updates. Home Assistant Container installations don’t have access to {% term "add-ons" %}.
+
+
+
+
+
+
+
+ |
+ HA OS1 |
+ Container1 |
+
+
+
+
+ Automations |
+ {% icon "openmoji:check-mark" %} |
+ {% icon "openmoji:check-mark" %} |
+
+
+ Dashboards |
+ {% icon "openmoji:check-mark" %} |
+ {% icon "openmoji:check-mark" %} |
+
+
+ Integrations |
+ {% icon "openmoji:check-mark" %} |
+ {% icon "openmoji:check-mark" %} |
+
+
+ Add-ons |
+ {% icon "openmoji:check-mark" %} |
+ {% icon "openmoji:cross-mark" %} |
+
+
+ Blueprints |
+ {% icon "openmoji:check-mark" %} |
+ {% icon "openmoji:check-mark" %} |
+
+
+
+ One-click updates
+ |
+ {% icon "openmoji:check-mark" %} |
+ {% icon "openmoji:cross-mark" %} |
+
+
+ Backups |
+ {% icon "openmoji:check-mark" %} |
+ {% icon "openmoji:check-mark" %} |
+
+
+
+ 1: Names are abbreviated. The full names of the installation methods are:
+
+ - Home Assistant Operating System
+ - Home Assistant Container
+
+
Easiest
@@ -254,90 +327,6 @@ toc: true
Expert
-
About installation methods
-
- Home Assistant offers two different installation methods:
-
-
- - Home Assistant Operating System: An embedded,
- minimalistic operating system designed to run the Home Assistant ecosystem
- on single board computers (like the Home Assistant Green or a Raspberry Pi) or Virtual Machines. It
- is the most convenient option in terms of installation and maintenance and it supports
- {% term "add-ons" %}. Home Assistant Operating System is
- the recommended installation method for most users.
- -
- Home Assistant Container:Container-based installation of Home Assistant. You need to bring your own system (such as Linux) with container orchestration (like Docker), and manually handle updates. Home Assistant Container installations don’t have access to {% term "add-ons" %}.
-
-
-
-
-
- |
- HA OS1 |
- Container1 |
-
- Automations |
- {% icon "openmoji:check-mark" %} |
- {% icon "openmoji:check-mark" %} |
-
-
- Dashboards |
- {% icon "openmoji:check-mark" %} |
- {% icon "openmoji:check-mark" %} |
-
-
- Integrations |
- {% icon "openmoji:check-mark" %} |
- {% icon "openmoji:check-mark" %} |
-
-
- Add-ons |
- {% icon "openmoji:check-mark" %} |
- {% icon "openmoji:cross-mark" %} |
-
-
- Blueprints |
- {% icon "openmoji:check-mark" %} |
- {% icon "openmoji:check-mark" %} |
-
-
-
- One-click updates
- |
- {% icon "openmoji:check-mark" %} |
- {% icon "openmoji:cross-mark" %} |
-
-
- Backups |
- {% icon "openmoji:check-mark" %} |
- {% icon "openmoji:check-mark" %} |
-
-
-
-
-
1: Names are abbreviated. The full names of the installation methods are:
-
- - Home Assistant Operating System
- - Home Assistant Container
-
-
-
-
Deprecated installation methods
-
- Home Assistant used to offer two additional installation methods for advanced users: {% term "Home Assistant Core" %} and {% term "Home Assistant Supervised" %}. These two methods are now deprecated and no longer recommended for new users.
-
-
- -
- Home Assistant Supervised: Manual installation of the Supervisor.
-
- -
- Home Assistant Core: Manual installation using Python virtual
- environment.
-
-
-
@@ -521,3 +510,18 @@ toc: true
+
+
Deprecated installation methods
+
+ Home Assistant used to offer two additional installation methods for advanced users: {% term "Home Assistant Core" %} and {% term "Home Assistant Supervised" %}. These two methods are now deprecated and no longer recommended for new users.
+
+
+ -
+ Home Assistant Supervised: Manual installation of the Supervisor.
+
+ -
+ Home Assistant Core: Manual installation using Python virtual
+ environment.
+
+
+
\ No newline at end of file