diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c0402933ed6..1ad7ce489d0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,7 @@ jobs: - name: Check out files from GitHub uses: actions/checkout@v4.1.7 - name: Setting up Node.js - uses: actions/setup-node@v4.0.2 + uses: actions/setup-node@v4.0.3 with: node-version: 20 cache: "npm" @@ -27,7 +27,7 @@ jobs: - name: Check out files from GitHub uses: actions/checkout@v4.1.7 - name: Setting up Node.js - uses: actions/setup-node@v4.0.2 + uses: actions/setup-node@v4.0.3 with: node-version: 20 cache: "npm" diff --git a/Gemfile b/Gemfile index fd9f6665697..bffd2277f7a 100644 --- a/Gemfile +++ b/Gemfile @@ -10,8 +10,8 @@ group :development do gem 'stringex', '2.8.6' # > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189 gem 'sassc', '2.1.0' - gem 'rubocop', '1.64.1' - gem 'ruby-lsp', '0.17.4' + gem 'rubocop', '1.65.0' + gem 'ruby-lsp', '0.17.7' gem 'rackup', '2.1.0' end diff --git a/Gemfile.lock b/Gemfile.lock index b8c402b3013..2ff07298f70 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -80,7 +80,7 @@ GEM nokogiri (1.16.6-x86_64-linux) racc (~> 1.4) parallel (1.25.1) - parser (3.3.3.0) + parser (3.3.4.0) ast (~> 2.4.1) racc pathutil (0.16.2) @@ -88,7 +88,7 @@ GEM prism (0.30.0) public_suffix (6.0.0) racc (1.8.0) - rack (3.1.6) + rack (3.1.7) rack-protection (4.0.0) base64 (>= 0.1.0) rack (>= 3.0.0, < 4) @@ -102,26 +102,26 @@ GEM rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rbs (3.5.1) + rbs (3.5.2) logger regexp_parser (2.9.2) - rexml (3.3.1) + rexml (3.3.2) strscan rouge (4.3.0) - rubocop (1.64.1) + rubocop (1.65.0) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) + regexp_parser (>= 2.4, < 3.0) rexml (>= 3.2.5, < 4.0) rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) rubocop-ast (1.31.3) parser (>= 3.3.1.0) - ruby-lsp (0.17.4) + ruby-lsp (0.17.7) language_server-protocol (~> 3.17.0) prism (>= 0.29.0, < 0.31) rbs (>= 3, < 4) @@ -130,8 +130,8 @@ GEM ruby2_keywords (0.0.5) safe_yaml (1.0.5) sass (3.4.25) - sass-embedded (1.77.5-x86_64-linux-gnu) - google-protobuf (>= 3.25, < 5.0) + sass-embedded (1.77.8-x86_64-linux-gnu) + google-protobuf (~> 4.26) sass-globbing (1.1.5) sass (>= 3.1) sassc (2.1.0-x86_64-linux) @@ -142,7 +142,7 @@ GEM rack-protection (= 4.0.0) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11471) + sorbet-runtime (0.5.11481) stringex (2.8.6) strscan (3.1.0) terminal-table (3.0.2) @@ -168,8 +168,8 @@ DEPENDENCIES nokogiri (= 1.16.6) rackup (= 2.1.0) rake (= 13.2.1) - rubocop (= 1.64.1) - ruby-lsp (= 0.17.4) + rubocop (= 1.65.0) + ruby-lsp (= 0.17.7) sass-globbing (= 1.1.5) sassc (= 2.1.0) sinatra (= 4.0.0) diff --git a/_config.yml b/_config.yml index deb6e67b8f7..73a7bf69085 100644 --- a/_config.yml +++ b/_config.yml @@ -108,8 +108,8 @@ social: # Home Assistant release details current_major_version: 2024 current_minor_version: 7 -current_patch_version: 0 -date_released: 2024-07-03 +current_patch_version: 2 +date_released: 2024-07-10 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. @@ -139,26 +139,48 @@ defaults: footer: true sharing: true sidebar: true + toc: true # Enable table of contents for integrations and installations # # To set toc as a default value, we need to set the scope with an empty path # and the collection as type # https://github.com/toshimaru/jekyll-toc/issues/116#issuecomment-644205770 # + - scope: + path: "" + type: dashboards + values: + toc: true - scope: path: "" type: integrations values: toc: true + - scope: + path: "" + type: docs + values: + toc: true - scope: path: "installation/*" values: toc: true - no_toc: true - scope: path: "common-tasks/*" values: toc: true + - scope: + path: "getting-started/*" + values: + toc: true + - scope: + path: "more-info/*" + values: + toc: true + - scope: + path: "voice_control/*" + values: + toc: true - scope: path: "hassio/*" values: diff --git a/sass/homeassistant/_overrides.scss b/sass/homeassistant/_overrides.scss index efa5eefd6e7..70e83439ab6 100644 --- a/sass/homeassistant/_overrides.scss +++ b/sass/homeassistant/_overrides.scss @@ -1,7 +1,7 @@ @charset "UTF-8"; -.page h1.title.indent { - font-size: 3.125em; +h1.title.indent { + font-size: 3.5rem; } .title.delta, .title.epsilon { border-bottom: none; @@ -19,15 +19,192 @@ } @media only screen and (max-width: $menu-collapse) { html { - font-size: .95em; + font-size: .95rem; } - .page h1.title.indent { - font-size: 2.875em; + h1.title.indent { + font-size: 3rem; overflow-wrap: break-word; hyphens: auto; } } + +// Wider page width +.grid-wrapper { + padding: 0 24px; + + @media only screen and (min-width: $desk-start) { + padding: 0 48px; + } +} + +@media only screen and (min-width: $desk-wide-start) { + .integration-page, .documentation-page, .blog-post { + .grid-wrapper>.grid.grid-center { + display: flex; + flex-direction: row-reverse; + justify-content: flex-end; + } + } + + #sidebar { + .vertical-nav, .recent-categories, .recent-posts, .categories { + background: none; + padding: 0 16px 0 0; + } + } + + .documentation-page, .blog-post { + #sidebar #toc-module { + display: none; + } + } +} + + +// Documentation index + +.docs-index { + margin: 0; + + &>li { + list-style-type: none; + font-size: 1.5rem; + font-weight: 600; + + &>iconify-icon { + margin: 2px 8px 0 0; + transform-origin: left; + transform: scale(1) translateY(10px); + background: #007fa8; + color: white; + padding: 10px; + border-radius: 32px; + } + + &>a { + text-decoration: none !important; + + &::after { + content: 'β–Έ'; + } + } + + &>ul { + font-family: $sans-serif; + font-size: 1rem; + font-weight: 500; + text-transform: none; + + display: grid; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + column-gap: 24px; + margin: 0 0 0 28px; + + margin: 16px 0 48px !important; + padding: 20px 24px; + background: rgba(0, 0, 0, .01); + border-radius: 16px; + border: 1px solid rgba(0, 0, 0, .1); + + a { + text-decoration: none !important; + } + + &>li { + list-style-type: none; + + &>ul { + margin-left: 20px; + font-size: .85rem; + font-weight: normal; + + &>li { + margin: 4px 0; + + &:first-child { + margin-top: 8px; + } + + &:nth-child(1n+7) { + display: none; + } + + &:nth-child(6) { + &::before { + content: 'More...'; + } + &>a { + display: none; + } + } + + &:last-child { + margin-bottom: 16px; + } + } + } + } + } + } +} + + +// Vertical Nav + +.vertical-nav { + .divided.sidebar-menu { + &>li { + iconify-icon { + margin-right: 8px; + } + + ul { + list-style-type: none; + margin: 16px 0 16px 28px; + + li { + margin: 8px 0; + } + } + + &>ul { + margin: 16px 0 8px 28px; + } + } + } +} + + +// Table of Contents + +#toc-bar { + display: none; + position: sticky; + top: 80px; + padding-left: 32px; + + .aside-module { + background: none; + padding: 0; + } +} + +@media only screen and (min-width: $desk-wide-start) { + .documentation-page #toc-bar, .integration-page #toc-bar, .blog-post #toc-bar { + display: inline-block; + } + #integration-sidebar #toc-module { + display: none; + } + .documentation-page #sidebar #toc-module { + background: none; + padding: 0; + } +} + + + // Rounded background for numbered lists article> { ol { @@ -109,6 +286,10 @@ ul, ol, dd { margin-bottom: 27px; } +.menu > li > a.active { + font-weight: bold; +} + .dark .menu > li > a:hover, .dark .menu > li > a:focus { box-shadow: inset 0px -5px rgba($white, .5); @@ -316,7 +497,65 @@ a.material-card:hover { } +// Blog archive material cards + +#archive-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 24px; + + h2 { + grid-column: 1/-1; + margin: 16px 0 0; + } + + a { + text-decoration: none; + } + + .material-card { + .img { + background-color: $grayLighter; + width: calc(100%-8px); + aspect-ratio: 120/63; + background-size: cover; + background-position: center; + border-radius: 8px; + margin: 4px; + } + + .caption { + padding: 8px 16px 12px; + + display: flex; + justify-content: space-between; + align-items: center; + + font-size: 1rem; + + .title { + font-weight: 500; + margin-bottom: 4px; + } + + .subtitle{ + font-size: .85em; + color: $gray; + } + } + + svg { + min-width: 24px; + height: 24px; + } + } + +} + + + .feedback { + margin-top: 64px; h4 { margin: 0 0 8px !important; @@ -544,9 +783,8 @@ a.material-card:hover { .seen-press { display: grid; - grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); - column-gap: 24px; - row-gap: 24px; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 24px; margin: 48px 0; h2 { @@ -582,6 +820,16 @@ a.material-card:hover { .round { border-radius: 50%; } + + @media only screen and (max-width: $lap-end) { + grid-template-columns: repeat(auto-fill, minmax(144px, 1fr)); + gap: 16px; + + img { + max-height: 96px; + } + } + } .sponsored-by { @@ -597,7 +845,7 @@ a.material-card:hover { } } -@media screen and (max-width: 700px) { +@media screen and (max-width: $lap-end) { .frontpage .events .event { .caption { padding-top: 4px; @@ -672,7 +920,25 @@ article.listing { &>table, &>.entry-content>table { - background-color: #f3fcf5; + background-color: #fff; + table-layout: auto; + + &>thead { + background-color: rgba(0, 0, 0, .025); + // border: 1px solid rgba(0, 0, 0, .1); + border-radius: 16px 16px 0 0; + font-size: .85em; + } + + &>tbody { + tr { + border-bottom: 1px solid rgba(0, 0, 0, .1); + + &:last-of-type { + border-bottom: 0; + } + } + } } p.img { @@ -725,6 +991,7 @@ article.listing { h2 { margin-top: 1.75em; + line-height: 1.4; } h3 { @@ -858,6 +1125,9 @@ ul.sidebar-menu { a.active { color: #000; font-weight: bold; + border-left: 4px solid $primary-color; + padding: 0 8px; + display: inline-block; } ul { @@ -992,7 +1262,7 @@ div.config-vars { code { font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.8em; - color: $primary-color; + color: $link-color; word-spacing: normal; word-break: normal; word-wrap: normal; diff --git a/sass/homeassistant/_variables.scss b/sass/homeassistant/_variables.scss index 6cf7d601c65..251a148340a 100644 --- a/sass/homeassistant/_variables.scss +++ b/sass/homeassistant/_variables.scss @@ -1,5 +1,5 @@ $use-grids: true; -$site-width: 1100px; +$site-width: 1560px; $responsive: true; $use-gridfix: true; @@ -28,7 +28,7 @@ $white: #fff !default; // Accent colors // ------------------------- $blue: #1abcf2 !default; -$blueDark: #0064cd !default; +$blueDark: #007fa8 !default; $green: #46a546 !default; $red: #9d261d !default; $yellow: #ffc40d !default; diff --git a/sass/homeassistant/base/_global.scss b/sass/homeassistant/base/_global.scss index 2e08a90a454..7e65b7d48aa 100644 --- a/sass/homeassistant/base/_global.scss +++ b/sass/homeassistant/base/_global.scss @@ -16,6 +16,10 @@ body, html { margin-top: 0; padding-top: 88px; width: 100%; + + &>.grid-wrapper:last-of-type { + min-height: calc(100vh - 714px); + } } h1, h2, h3, h4, h5, h6 { diff --git a/sass/homeassistant/base/_navigation.scss b/sass/homeassistant/base/_navigation.scss index d1494a3e7d0..e179f2a21d7 100644 --- a/sass/homeassistant/base/_navigation.scss +++ b/sass/homeassistant/base/_navigation.scss @@ -107,7 +107,7 @@ ul.menu li { &:hover, &:focus { - background: $grayLighter; + background: rgba($primary-color, .1); } } } @@ -169,7 +169,7 @@ header .grid { .menu li a:hover, .menu li a:focus { - background: $grayLighter; + background: rgba($primary-color, .1); box-shadow: inset 5px 0px $primary-color; padding: 15px 15px 15px 25px; } diff --git a/sass/homeassistant/base/_sidebar.scss b/sass/homeassistant/base/_sidebar.scss index f0ad38166e1..0b376e2620f 100644 --- a/sass/homeassistant/base/_sidebar.scss +++ b/sass/homeassistant/base/_sidebar.scss @@ -20,7 +20,7 @@ } } -#sidebar { +#sidebar, #left-sidebar, #toc-bar, #integration-sidebar { position: sticky; top: 88px; max-height: calc(100vh - 104px); @@ -43,7 +43,7 @@ } @media only screen and (max-width: $lap-end) { - #sidebar { + #sidebar, #left-sidebar, #toc-bar, #integration-sidebar { max-height: fit-content; .grid { diff --git a/sass/homeassistant/homepage/_hero_unit.scss b/sass/homeassistant/homepage/_hero_unit.scss index 400531e805d..758a3622f8e 100644 --- a/sass/homeassistant/homepage/_hero_unit.scss +++ b/sass/homeassistant/homepage/_hero_unit.scss @@ -76,6 +76,7 @@ #HAdemo { width: 100%; + max-width: 400px; height: 800px; border-radius: 48px; border: 12px double white; diff --git a/sass/homeassistant/pages/_component_page.scss b/sass/homeassistant/pages/_component_page.scss index a72c316feb4..610f8420522 100644 --- a/sass/homeassistant/pages/_component_page.scss +++ b/sass/homeassistant/pages/_component_page.scss @@ -6,7 +6,6 @@ letter-spacing: .005em; color: $gray; text-transform: uppercase; - padding-top: 8px; } } .component-search { @@ -38,9 +37,8 @@ // styles for the cards .hass-option-cards { display: grid; - grid-template-columns: repeat(auto-fill, minmax(192px, 1fr)); - - margin: -10px; // grid trick, has to match option-card's margin + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 24px; div.alert, p.alert-content { width: 100%; @@ -48,11 +46,9 @@ .option-card { flex: 0 0 auto; - min-width: 192px; - height: 192px; + aspect-ratio: 1; display: inline-block; background-color: #f8f8f8; - margin: 10px; border-radius: 8px; border: 1px solid rgba(0, 0, 0, .12); padding: 8px; @@ -61,7 +57,6 @@ align-content: center; transition: box-shadow .33s; - .img-container { height: 64px; margin: 12px 16px; @@ -128,20 +123,23 @@ a.option-card:hover { @for $i from 1 through 40 { .option-card:nth-child(#{$i}) { - animation-delay: #{$i * 0.04}s !important; + animation-delay: #{$i * 0.025}s !important; + @media only screen and (max-width: $palm-end) { + animation-delay: #{$i * 0.05}s !important; + } } } - @media only screen and (max-width: $palm-end) { .hass-option-cards { + grid-template-columns: 1fr; + .option-card { - width: calc(100% - 24px) !important; + width: 100% !important; flex-direction: row; display: flex; align-items: center; height: 80px; - margin: 8px; .img-container { margin: 8px; @@ -160,9 +158,8 @@ a.option-card:hover { } #components-page { .hass-option-cards { - grid-template-columns: 1fr; .option-card { - width: calc(50% - 24px); + } } .category_select { @@ -181,6 +178,7 @@ a.option-card:hover { flex-wrap: wrap; margin-bottom: 16px; align-items: flex-end; + gap: 8px; &>div { margin-right: 8px; @@ -231,12 +229,13 @@ a.option-card:hover { } .btn { + font-size: 1rem; display: block; background: 0; color: black; box-shadow: none; text-shadow: none; - padding: 2px; + padding: 4px 0; border-radius: 0; &.current { diff --git a/sass/inuitcss/_defaults.scss b/sass/inuitcss/_defaults.scss index 37b47eca3d4..611bb0b307d 100644 --- a/sass/inuitcss/_defaults.scss +++ b/sass/inuitcss/_defaults.scss @@ -72,7 +72,7 @@ $responsive: true!default; * Responsiveness for widescreen/high resolution desktop monitors and beyond? * Note: `$responsive` variable above must be set to true before enabling this. */ -$responsive-extra: false!default; +$responsive-extra: true!default; /** * Responsive push and pull produce a LOT of code, only turn them on if you @@ -103,7 +103,7 @@ $desk-pull: false!default; */ $lap-start: 481px!default; $desk-start: 1024px!default; -$desk-wide-start: 1200px!default; +$desk-wide-start: 1280px!default; diff --git a/source/_docs/automation/editor.markdown b/source/_docs/automation/editor.markdown index 9acc28299d3..3b2b41acf89 100644 --- a/source/_docs/automation/editor.markdown +++ b/source/_docs/automation/editor.markdown @@ -1,43 +1,58 @@ --- title: "Automation editor" description: "Instructions on how to use the automation editor." +related: + - docs: /getting-started/automation/ + title: Automating Home Assistant --- The automation editor is an easy way of creating and editing automations from the UI. -This page uses the [Random sensor](/integrations/random#sensor) as an example, though any other sensor with a numeric value can be used as well. +This tutorial uses the [Random sensor](/integrations/random#sensor) because it generates data (by default, values between 0 and 20). This enables us to walk through the example, even if you do not have any actual sensors connected yet. You could use any other sensor that outputs a numeric value. -From the UI, choose **{% my config %}** which is located in the sidebar, then click on **{% my automations %}** to go to the automation editor. Press the **Create Automation** button in the lower right corner to get started. You can create an automation based on a [blueprint](/docs/automation/using_blueprints/) or start from scratch. Select **Create new automation**. +1. Go to {% my automations title="**Settings** > **Automations & scenes**" %} and in the lower right corner, select the **Create Automation** button. +2. Select **Create new automation**. -![Create automation dialogue box](/images/docs/automation-editor/create-automation.png) + ![Create automation dialogue box](/images/docs/automation-editor/create-automation.png) -Click on the **Add Trigger** button and select **Numeric state**. +3. Select **Add Trigger**, and in the **Search trigger** field, type "num". + - Select **Numeric state**. -![Add trigger](/images/docs/automation-editor/add-trigger-to-automation.png) + ![Add trigger](/images/docs/automation-editor/add-trigger-to-automation.png) -If the value of the sensor is greater than 10, then the automation should trigger. +4. Enter the trigger conditions: + - Define the sensor: Under **Entity**, enter "sensor.random_sensor". + - If the sensor value is above 10, we want the automation to trigger. + - In the **Above**, field, enter "10". -![Automation trigger](/images/docs/automation-editor/new-trigger.png) + ![Automation trigger](/images/docs/automation-editor/new-trigger.png) -Click on the **Add Action** button and select **Call service**. +5. Define the action that should happen: + - In the **Then do** section, select **Add Action**. -![Add trigger](/images/docs/automation-editor/new-action.png) + ![Add action](/images/docs/automation-editor/add_action.png) -The action for this automation creates a [persistent notification](/integrations/persistent_notification/). +6. Select **Call service**. -![Automation action](/images/docs/automation-editor/send-notification.png) + ![Add trigger](/images/docs/automation-editor/new-action.png) -As the message we want a simple text that is shown as part of the notification. +7. We want to create a [persistent notification](/integrations/persistent_notification/). + - Enter "Persist" and select **Persistent notification: Create**. -```yaml -message: Sensor value greater than 10 -``` + ![Automation action](/images/docs/automation-editor/send-notification.png) - Press the **Save** button, and the save dialogue will appear. Give your automation a meaningful name and press the **Save** button again. +8. As the message, we want a simple text that is shown as part of the notification. -![New automation editor](/images/docs/automation-editor/new-automation.png) + ```yaml + message: Sensor value greater than 10 + ``` -Automations created or edited via the user interface are activated immediately after saving the automation. Read the documentation for [Automating Home Assistant](/getting-started/automation/) to learn more about automations. +9. Select **Save**, give your automation a meaningful name, and **Save** again. + + ![New automation editor](/images/docs/automation-editor/new-automation.png) + + - **Result**: Automations created or edited via the user interface are activated immediately after saving the automation. + - To learn more about automations, read the documentation for [Automating Home Assistant](/getting-started/automation/). ## Troubleshooting missing automations diff --git a/source/_docs/automation/using_blueprints.markdown b/source/_docs/automation/using_blueprints.markdown index 3dd95e1ed79..5b8452bcece 100644 --- a/source/_docs/automation/using_blueprints.markdown +++ b/source/_docs/automation/using_blueprints.markdown @@ -49,13 +49,14 @@ To edit an imported blueprint, follow these steps: 1. Go to **{% my blueprints title="Settings > Automations & Scenes > Blueprints" %}**. 2. Select the blueprint from the list. -3. Select the three dots menu and select **Take control**. +3. Select the {% icon "mdi:dots-vertical" %} and select **Take control**. +4. A preview of the automation is shown. + - **Info**: By taking control, the blueprint is converted into an automation. You won't be able to convert this back into a blueprint. + - To convert it into an automation and take control, select **Yes**. + - If you change your mind and want to keep the blueprint, select **No**. ![Screencast showing how to take control of a blueprint](/images/blueprints/blueprint_take_control.webp) -4. Under **Take control of automation?**, select **OK** - - **Info**: By taking control, the blueprint is converted into an automation. You won't be able to convert this back into a blueprint. - ## Re-importing a blueprint Blueprints created by the community may go through multiple revisions. Sometimes a user creates a blueprint, diff --git a/source/_docs/scripts.markdown b/source/_docs/scripts.markdown index 12a0879aafa..8045bad1182 100644 --- a/source/_docs/scripts.markdown +++ b/source/_docs/scripts.markdown @@ -2,7 +2,6 @@ title: "Script Syntax" description: "Documentation for the Home Assistant Script Syntax." toc: true -no_toc: true --- Scripts are a sequence of {% term actions %} that Home Assistant will execute. Scripts are available as an entity through the standalone [Script integration] but can also be embedded in {% term automations %} and [Alexa/Amazon Echo] configurations. diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index 6d66417043e..34c89afb1d2 100644 --- a/source/_docs/scripts/conditions.markdown +++ b/source/_docs/scripts/conditions.markdown @@ -2,7 +2,6 @@ title: "Conditions" description: "Documentation about all available conditions." toc: true -no_toc: true --- Conditions can be used within a {% term script %} or {% term automation %} to prevent further execution. When a condition evaluates true, the script or automation will be executed. If any other value is returned, the script or automation stops executing. A condition will look at the system at that moment. For example, a condition can test if a switch is currently turned on or off. diff --git a/source/_docs/z-wave/controllers.markdown b/source/_docs/z-wave/controllers.markdown index feada8af062..62aee08978c 100644 --- a/source/_docs/z-wave/controllers.markdown +++ b/source/_docs/z-wave/controllers.markdown @@ -72,7 +72,7 @@ Z-Wave JS does not support Z-Wave Long Range yet. ### Aeotec Z-Stick {% note %} -There are [known compatibility issues](https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=245031#p1502030) with older hardware versions of the Aeotec stick not working on the Raspberry Pi 4. Aeotec has released a 2020 hardware revision ZW090-A/B/C Gen5+ with Pi 4 compatibility. Both hardware revisions are still being sold, make informed purchasing decisions if using paired with a Pi 4. +There are [known compatibility issues](https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=245031#p1502030) with older hardware versions of the Aeotec stick not connecting when plugged directly on the Raspberry Pi 4, and requiring a USB Hub to work. Aeotec has released a 2020 hardware revision ZW090-A/B/C Gen5+ with Pi 4 compatibility. Both hardware revisions are still being sold, make informed purchasing decisions if using one paired with a Pi 4. {% endnote %} It's totally normal for your Z-Wave stick to cycle through its LEDs (Yellow, Blue and Red) while plugged into your system. diff --git a/source/_includes/asides/categories.html b/source/_includes/asides/categories.html index fd4c789636f..94ff7d2fdc8 100644 --- a/source/_includes/asides/categories.html +++ b/source/_includes/asides/categories.html @@ -1,11 +1,11 @@ -
+

{% icon "mdi:category" %} Categories

diff --git a/source/_includes/asides/component_navigation.html b/source/_includes/asides/component_navigation.html index 24294a75006..d48887881fb 100644 --- a/source/_includes/asides/component_navigation.html +++ b/source/_includes/asides/component_navigation.html @@ -42,22 +42,30 @@ {{ percentage | remove: ".0" }}% of the active installations. {% endif %} {% endif %} - - {%- if page.ha_iot_class %} - Its IoT class is {{ page.ha_iot_class }} - {%- endif -%} - - {%- if page.ha_quality_scale %} - {% if page.ha_iot_class %} - and it - {% else %} - It - {% endif %} - scores {{page.ha_quality_scale}} on our quality scale - {%- endif -%}{%- if page.ha_quality_scale or page.ha_iot_class %}.{%- endif -%} {% endif %} + {%- if page.ha_iot_class %} +
+ {% if page.ha_iot_class == "Assumed State" %}{%- endif -%} + {% if page.ha_iot_class == "Cloud Polling" %}{%- endif -%} + {% if page.ha_iot_class == "Cloud Push" %}{%- endif -%} + {% if page.ha_iot_class == "Local Polling" %}{%- endif -%} + {% if page.ha_iot_class == "Local Push" %}{%- endif -%} +  Its IoT class is {{ page.ha_iot_class }}. +
+ {%- endif -%} + + {%- if page.ha_quality_scale %} +
+ {% if page.ha_quality_scale == "silver" %}πŸ₯ˆ This is a great integration!
{%- endif -%} + {% if page.ha_quality_scale == "gold" %}πŸ₯‡ This is a solid integration!
{%- endif -%} + {% if page.ha_quality_scale == "platinum" %}πŸ† Best of the best!
{%- endif -%} + {% if page.ha_quality_scale == "internal" %}🏠 Under core!
{%- endif -%} + It scores {{page.ha_quality_scale}} on our quality scale +
+ {%- endif -%} + {% if page.works_with %} {%- for type in page.works_with -%}
diff --git a/source/_includes/asides/dashboards_navigation.html b/source/_includes/asides/dashboards_navigation.html index 5fe1de05479..6e4340a4e7e 100644 --- a/source/_includes/asides/dashboards_navigation.html +++ b/source/_includes/asides/dashboards_navigation.html @@ -1,22 +1,14 @@ -
+
{% assign elements = site.dashboards | sort_natural: 'title' %}

Dashboards

@@ -48,14 +40,12 @@
  • {% active_link /dashboards/features/ Features %}
  • {% active_link /dashboards/header-footer/ Headers & footers %}
  • {% active_link /dashboards/actions/ Actions %}
  • -
  • - Developing custom cards {% icon "tabler:external-link" %} - -
  • +
    diff --git a/source/_includes/asides/docs_navigation.html b/source/_includes/asides/docs_navigation.html index 81dcd8d61be..8dd89f3522f 100644 --- a/source/_includes/asides/docs_navigation.html +++ b/source/_includes/asides/docs_navigation.html @@ -1,190 +1,16 @@ -
    +
    -

    Topics

    +

    {% icon "mdi:bookshelf" %} Documentation

    \ No newline at end of file diff --git a/source/_includes/asides/docs_sitemap.html b/source/_includes/asides/docs_sitemap.html new file mode 100644 index 00000000000..4711a2941dc --- /dev/null +++ b/source/_includes/asides/docs_sitemap.html @@ -0,0 +1,277 @@ +
  • + {% active_link /docs/automation/ Automations %} + {% if doc == 'automation' or doc == 'blueprint' or doc == 'scripts' or doc == 'scene' or include.docs_index %} +
      +
    • + {% icon "mdi:robot-happy" %} {% active_link /docs/automation/basics/ Basic automations %} + {% if doc == 'automation' or include.docs_index %} +
        +
      • {% active_link /docs/automation/using_blueprints/ Using automation blueprints %}
      • +
      • {% active_link /docs/automation/editor/ Editor %}
      • +
      • {% active_link /docs/automation/trigger/ Triggers %}
      • +
      • {% active_link /docs/automation/condition/ Conditions %}
      • +
      • {% active_link /docs/automation/action/ Actions %}
      • +
      • {% active_link /docs/automation/modes/ Run modes %}
      • +
      • {% active_link /docs/automation/services/ Services %}
      • +
      • {% active_link /docs/automation/templating/ Templates %}
      • +
      • {% active_link /docs/automation/yaml/ YAML %}
      • +
      • {% active_link /docs/automation/troubleshooting/ Troubleshooting automation %}
      • +
      + {% endif %} +
    • +
    • + {% icon "mdi:palette" %} {% active_link /docs/scene/ Scenes %} + {% if doc == 'scene' or include.docs_index %} +
        +
      • {% active_link /docs/scene/editor/ Editor %}
      • +
      + {% endif %} +
    • +
    • + {% icon "mdi:palette-swatch" %} {% active_link /docs/blueprint/ Blueprints %} + {% if doc == 'blueprint' or include.docs_index %} +
        +
      • {% active_link /docs/blueprint/tutorial/ Tutorial %}
      • +
      • {% active_link /docs/blueprint/schema/ Blueprint schema %}
      • +
      • {% active_link /docs/blueprint/selectors/ Selectors %}
      • +
      + {% endif %} +
    • +
    • + {% icon "mdi:script-text" %} {% active_link /docs/scripts/ Scripts %} + {% if doc == 'scripts' or include.docs_index %} +
        +
      • {% active_link /docs/scripts/service-calls/ Service calls %}
      • +
      • {% active_link /docs/scripts/conditions/ Conditions %}
      • +
      + {% endif %} +
    • +
    + {% endif %} +
  • + +
  • + {% icon "mdi:gauge" %} {% active_link /dashboards Dashboards %} + {% if root == 'dashboards' or include.docs_index %} +
      + {% assign elements = site.dashboards | sort_natural: 'title' %} + +
    • + Dashboard basics +
        +
      • {% active_link /dashboards/ Introduction %}
      • +
      • {% active_link /dashboards/dashboards/ Multiple dashboards %}
      • +
      • {% active_link /dashboards/views/ Views %}
      • +
      • {% active_link /dashboards/cards/ Cards %}
      • +
      • {% active_link /dashboards/badges/ Badges %}
      • +
      +
    • + +
    • + View types +
        + {% for element in elements %} + {% if element.type == "view" %} +
      • {% active_link {{element.url}} {{element.sidebar_label}} %}
      • + {% endif %} + {% endfor %} +
      +
    • + +
    • + {% icon "mdi:card-multiple" %} Card types +
        + {% for element in elements %} + {% if element.type == "card" %} +
      • {% active_link {{element.url}} {{element.sidebar_label}} %}
      • + {% endif %} + {% endfor %} +
      +
    • + +
    • + {% icon "mdi:cog" %} Advanced + +
    • + +
    + {% endif %} +
  • + +
  • + {% icon "mdi:microphone" %} {% active_link /voice_control/ Voice assistants %} + {% if root == 'voice_control' or include.docs_index %} +
      +
    • Devices +
        +
      • {% active_link /voice_control/android/ Assist for Android %}
      • +
      • {% active_link /voice_control/apple/ Assist for Apple %}
      • +
      • {% active_link /voice_control/start_assist_from_dashboard/ Starting Assist from your dashboard %}
      • +
      +
    • +
    • {% icon "mdi:comment-processing-outline" %} {% active_link /voice_control/ Voice assistants %} +
        +
      • {% active_link /voice_control/voice_remote_local_assistant/ Configuring a local assistant %}
      • +
      • {% active_link /voice_control/voice_remote_cloud_assistant/ Configuring a cloud assistant %}
      • +
      • {% active_link /voice_control/voice_remote_expose_devices/ Exposing devices to voice assistant %}
      • +
      • {% active_link /voice_control/install_wake_word_add_on/ Enabling a wake word %}
      • +
      • {% active_link /voice_control/about_wake_word/ About wake words %}
      • +
      • {% active_link /voice_control/builtin_sentences/ Built-in sentences %}
      • +
      • {% active_link /voice_control/custom_sentences/ Custom sentences %}
      • +
      • {% active_link /voice_control/aliases/ Using aliases %}
      • +
      • {% active_link /voice_control/using_tts_in_automation/ Using Piper TTS in automations %}
      • +
      • {% active_link /voice_control/assist_create_open_ai_personality/ Creating a personality with AI %}
      • +
      +
    • +
    • {% icon "mdi:checkbox-marked" %} Projects +
        +
      • {% active_link /voice_control/s3_box_voice_assistant/ Tutorial: ESP32-S3-BOX voice assistant %}
      • +
      • {% active_link /voice_control/s3-box-customize/ Tutorial: Customize the S3-BOX %}
      • +
      • {% active_link /voice_control/thirteen-usd-voice-remote/ Tutorial: $13 voice assistant %}
      • +
      • {% active_link /voice_control/worlds-most-private-voice-assistant/ Tutorial: World's most private voice assistant %}
      • +
      • {% active_link /voice_control/create_wake_word/ Tutorial: Create your own wake word %}
      • +
      • {% active_link /voice_control/assist_daily_summary/ Tutorial: Your daily summary by Assist %}
      • +
      +
    • +
    • {% icon "mdi:account-help" %} Troubleshooting +
        +
      • {% active_link /voice_control/troubleshooting/ Troubleshooting Assist %}
      • +
      • {% active_link /voice_control/troubleshooting_the_s3_box/ Troubleshooting the ESP32-S3-BOX %}
      • +
      +
    • +
    + {% endif %} +
  • + +
  • + {% icon "mdi:category" %} {% active_link /docs/organizing/ Organization %} + {% if doc == 'organizing' or include.docs_index %} +
      +
    • {% active_link /docs/organizing/ Grouping your assets %}
    • +
    • {% active_link /docs/organizing/tables Working with tables %}
    • +
    • {% active_link /docs/organizing/areas/ Areas %}
    • +
    • {% active_link /docs/organizing/floors/ Floors %}
    • +
    • {% active_link /docs/organizing/labels/ Labels %}
    • +
    • {% active_link /docs/organizing/categories/ Categories %}
    • +
    • {% active_link /docs/frontend/icons/ Icons %}
    • +
    + {% endif %} +
  • + +
  • + {% icon "mdi:solar-power-variant" %} {% active_link /docs/energy/ Home energy management %} + {% if doc == 'energy' or include.docs_index %} +
      +
    • {% active_link /docs/energy/electricity-grid/ Electricity grid %}
    • +
    • {% active_link /docs/energy/solar-panels/ Solar panels %}
    • +
    • {% active_link /docs/energy/individual-devices/ Individual devices %}
    • +
    • {% active_link /docs/energy/faq/ FAQ %}
    • +
    + {% endif %} +
  • + +
  • + {% icon "mdi:update" %} {% active_link /common-tasks/os/ Common tasks %} + {% if root == 'common-tasks' or include.docs_index %} +
      +
    • {% active_link /common-tasks/os/ Home Assistant Operating System %}
    • +
    • {% active_link /common-tasks/container/ Home Assistant Container %}
    • +
    • {% active_link /common-tasks/core/ Home Assistant Core %}
    • +
    • {% active_link /common-tasks/supervised/ Home Assistant Supervised %}
    • +
    • {% active_link /common-tasks/general/ Installation independent %}
    • +
    • {% active_link /docs/troubleshooting_general/ General troubleshooting %}
    • +
    + {% endif %} +
  • + +
  • + {% icon "mdi:cogs" %} {% active_link /docs/configuration/ Advanced configuration %} + {% if doc == 'configuration' or include.docs_index %} +
      +
    • {% active_link /docs/configuration/yaml/ YAML syntax %}
    • +
    • {% active_link /docs/configuration/basic/ Basic information %}
    • +
    • {% active_link /docs/configuration/customizing-devices/ Customizing entities %}
    • +
    • {% active_link /docs/configuration/troubleshooting/ Troubleshooting configuration %}
    • +
    • {% active_link /docs/configuration/securing/ Security check points %}
    • +
    • {% active_link /docs/configuration/remote/ Remote access %}
    • +
    • {% active_link /docs/configuration/splitting_configuration/ Splitting up the configuration %}
    • +
    • {% active_link /docs/configuration/packages/ Packages %}
    • +
    • {% active_link /docs/configuration/secrets/ Storing secrets %}
    • +
    • {% active_link /docs/configuration/events/ Events %}
    • +
    • {% active_link /docs/configuration/state_object/ State objects %}
    • +
    • {% active_link /docs/configuration/templating/ Templating %}
    • +
    • {% active_link /docs/configuration/platform_options/ Entity component platform options %}
    • +
    + {% endif %} +
  • + +
  • + {% icon "mdi:account-security" %} {% active_link /docs/authentication/ Authentication %} + {% if doc == 'authentication' or include.docs_index %} +
      +
    • {% active_link /docs/authentication/providers/ Auth providers %}
    • +
    • {% active_link /docs/authentication/multi-factor-auth/ Multi-factor authentication %}
    • +
    • {% active_link /docs/locked_out/ I'm locked out %}
    • +
    + {% endif %} +
  • + +
  • + {% icon "mdi:database" %} {% active_link /docs/backend/ Backend %} + {% if doc == 'backend' or include.docs_index %} +
      +
    • {% active_link /docs/frontend/ User interface %}
    • +
    • {% active_link /docs/backend/database/ Database %}
    • +
    + {% endif %} +
  • + +
  • + {% icon "mdi:palette" %} {% active_link /docs/tools/ Tools and helpers %} + {% if doc == 'tools' or include.docs_index %} +
      +
    • {% active_link /docs/tools/dev-tools/ Developer tools %}
    • +
    • {% active_link /docs/tools/quick-bar/ Quick bar %}
    • +
    • {% active_link /docs/tools/hass/ hass %}
    • +
    • {% active_link /docs/tools/check_config/ check_config %}
    • +
    + {% endif %} +
  • + +
  • + {% icon "mdi:cellphone" %} iOS and Android apps {% icon "tabler:external-link" %} +
  • + +
  • + {% icon "simple-icons:mqtt" %} {% active_link /integrations/mqtt MQTT %} + {% if doc == 'mqtt' or include.docs_index %} +
      +
    • {% active_link /integrations/mqtt/#broker-configuration Broker %}
    • +
    • {% active_link /integrations/mqtt/#advanced-broker-configuration Certificate %}
    • +
    • {% active_link /integrations/mqtt/#mqtt-discovery Discovery %}
    • +
    • {% active_link /integrations/mqtt/#publish--dump-services Publish service %}
    • +
    • {% active_link /integrations/mqtt/#birth-and-last-will-messages Birth and last will messages %}
    • +
    • {% active_link /integrations/mqtt/#testing-your-setup Testing your setup %}
    • +
    • {% active_link /integrations/mqtt/#logging Logging %}
    • +
    + {% endif %} +
  • + +
  • + {% icon "bitcoin-icons:node-hardware-filled" %} Official hardware + +
  • diff --git a/source/_includes/asides/getting_started_navigation.html b/source/_includes/asides/getting_started_navigation.html index f7b18da8835..412959ce887 100644 --- a/source/_includes/asides/getting_started_navigation.html +++ b/source/_includes/asides/getting_started_navigation.html @@ -1,24 +1,34 @@ -
    +{% assign url_parts = page.url | split: '/' %} +{% assign root = url_parts[1] %} +{% assign doc = url_parts[2] %} + +

    {% icon "mdi:rocket-launch-outline" %} Getting started

    diff --git a/source/_includes/asides/organizing_navigation.html b/source/_includes/asides/organizing_navigation.html index 5297fad2faf..9cebcfcae7c 100644 --- a/source/_includes/asides/organizing_navigation.html +++ b/source/_includes/asides/organizing_navigation.html @@ -5,17 +5,9 @@ diff --git a/source/_includes/asides/recent_categories.html b/source/_includes/asides/recent_categories.html new file mode 100644 index 00000000000..644228190f7 --- /dev/null +++ b/source/_includes/asides/recent_categories.html @@ -0,0 +1,14 @@ +{% capture recent_categories %}{% for post in site.posts limit: 20 %}{{ post.categories | join: ", " }}, {% endfor %}{% endcapture %} +{% assign recent_categories = recent_categories | split: ", " | uniq | compact %} + +
    +

    {% icon "mdi:category" %} Recent categories

    + +
    diff --git a/source/_includes/asides/recent_posts.html b/source/_includes/asides/recent_posts.html index 447879aead4..587f98ea3c5 100644 --- a/source/_includes/asides/recent_posts.html +++ b/source/_includes/asides/recent_posts.html @@ -1,7 +1,9 @@ -
    +{% assign posts_to_show = include.posts | default: 5 %} + +

    {% icon "mdi:newspaper-variant-multiple" %} Recent Posts

      - {% for post in site.posts limit: site.recent_posts %} + {% for post in site.posts limit: posts_to_show %} {% if post.url != page.url %}
    • {{ post.title }} diff --git a/source/_includes/asides/voice_navigation.html b/source/_includes/asides/voice_navigation.html index 56a328ecbd0..9c7f7c35914 100644 --- a/source/_includes/asides/voice_navigation.html +++ b/source/_includes/asides/voice_navigation.html @@ -1,6 +1,4 @@
      - {% assign elements = site.dashboards | sort_natural: 'title' %} -

      Devices