diff --git a/Gemfile.lock b/Gemfile.lock index 637b77e97a2..cf2ae70065c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -87,7 +87,7 @@ GEM rb-inotify (0.10.1) ffi (~> 1.0) rexml (3.2.5) - rouge (3.29.0) + rouge (3.30.0) ruby2_keywords (0.0.5) safe_yaml (1.0.5) sass (3.4.25) diff --git a/sass/custom/_paulus.scss b/sass/custom/_paulus.scss index 26be359bce4..7ac6c619d7d 100644 --- a/sass/custom/_paulus.scss +++ b/sass/custom/_paulus.scss @@ -41,15 +41,37 @@ $primary-color: #049cdb; } } -.integration-alert { +.integration-alert-container { margin: -1em 0; - background-color: wheat; - padding: 4px; +} - a { - text-decoration: none !important; +a.integration-alert { + margin: 1em 0; + background-color: wheat; + padding: 8px; + text-decoration: none !important; + display: flex; + align-items: center; + color: black; + + svg { + width: 24px; + margin-right: 8px; } + .content { + flex: 1; + } + + .learn-more { + padding: 4px 6px; + border-radius: 2px; + font-size: .8em; + + &:hover { + background-color: rgba(0, 0, 0, .12); + } + } } @media only screen and (max-width: $menu-collapse) { @@ -136,6 +158,7 @@ $primary-color: #049cdb; box-shadow: none; border: 1px solid rgba(0, 0, 0, .12); border-radius: 4px; + h4 { margin: 0 0 8px !important; @@ -144,6 +167,7 @@ $primary-color: #049cdb; color: #000; } } + .links a { font-weight: 400; text-transform: none; @@ -186,12 +210,13 @@ $primary-color: #049cdb; background-color: lighten(#038fc7, 10%); } } + .events { padding: 16px; - + h3 { margin-top: 8px; - } + } .event { display: flex; @@ -199,28 +224,28 @@ $primary-color: #049cdb; align-items: center; text-decoration: none; color: inherit; - + .caption { padding: 0 12px; max-width: 450px; } - + .title { font-size: 20px; font-weight: 400; } - + .secondary { color: rgba(0, 0, 0, 0.54); font-size: 14px; font-weight: 500; } - + .subtitle { font-size: 12px; font-weight: initial; } - + img { width: 200px; height: 100%; @@ -282,9 +307,9 @@ $primary-color: #049cdb; } .sponsors-and-press { - margin-top:24px; + margin-top: 24px; } - + .sponsored-by { img { border: 0; @@ -293,10 +318,10 @@ $primary-color: #049cdb; margin: 15px; max-width: 40%; max-height: 80px; - } + } } - + .seen-press { img { @@ -324,10 +349,10 @@ $primary-color: #049cdb; } img { - width: 100%; - } + width: 100%; + } } - } +} // https://fortawesome.github.io/Font-Awesome/3.2.1/icons/ @@ -365,7 +390,7 @@ dt:hover a.title-link { margin-right: 10px; } - a > * { + a>* { vertical-align: middle; } } @@ -408,8 +433,8 @@ article.listing { box-shadow: none; } - & > table, - & > .entry-content > table { + &>table, + &>.entry-content>table { background-color: #f3fcf5; } @@ -431,7 +456,7 @@ article.listing { li { margin-bottom: 10px; - & > p:last-child { + &>p:last-child { margin-bottom: 0; } @@ -448,8 +473,7 @@ article.listing { } } - h1 { - } + h1 {} h2 { font-size: 1.5em; @@ -562,17 +586,19 @@ div.note { li.toc-entry { list-style-type: none; + li { list-style-type: circle; margin-left: 1em; } + ul { margin-left: 1em; } } } - } + } .brand-logo-container { text-align: center; @@ -594,7 +620,7 @@ lite-youtube { position: relative; display: block; padding-bottom: calc(100% / (16 / 9)); - background-color: rgba(0,0,0,.1); + background-color: rgba(0, 0, 0, .1); } lite-youtube::before { @@ -610,7 +636,8 @@ lite-youtube::before { // https://css-tricks.com/NetMag/FluidWidthVideo/Article-FluidWidthVideo.php .videoWrapper { position: relative; - padding-bottom: 56.25%; /* 16:9 */ + padding-bottom: 56.25%; + /* 16:9 */ height: 0; margin-bottom: 25px; background: #000; @@ -773,10 +800,8 @@ code { hyphens: none; background-color: #fdfdfd; - background-image: linear-gradient( - transparent 50%, - rgba(69, 142, 209, 0.04) 50% - ); + background-image: linear-gradient(transparent 50%, + rgba(69, 142, 209, 0.04) 50%); background-size: 3em 3em; background-origin: content-box; background-attachment: local; @@ -812,6 +837,7 @@ code { } } } + footer { position: absolute; bottom: 0; @@ -829,6 +855,6 @@ a.my { :target { display: block; position: relative; - top: -100px; + top: -100px; visibility: hidden; -} \ No newline at end of file +} diff --git a/source/_docs/blueprint/selectors.markdown b/source/_docs/blueprint/selectors.markdown index 41a4614269b..25147d1f704 100644 --- a/source/_docs/blueprint/selectors.markdown +++ b/source/_docs/blueprint/selectors.markdown @@ -641,10 +641,10 @@ the select value. ![Screenshot of a number selector](/images/blueprints/selector-number.png) On the user interface, the input can either be in a slider or number mode. -Both modes limit the user input by a minimal and maximum value, and can +Both modes limit the user input by a minimum and maximum value, and can have a unit of measurement to go with it. -In its most basic form, this selector requires a minimal and maximum value: +In its most basic form, this selector requires a minimum and maximum value: ```yaml number: @@ -654,7 +654,7 @@ number: {% configuration number %} min: - description: The minimal user-settable number value. + description: The minimum user-settable number value. type: [integer, float] required: true max: diff --git a/source/_headers b/source/_headers index d33567d39d7..b1d6e467a2a 100644 --- a/source/_headers +++ b/source/_headers @@ -1,5 +1,5 @@ /* - Cache-Control: public, max-age: 0, s-maxage=3600, must-revalidate + Cache-Control: public, max-age=0, s-maxage=3600, must-revalidate Content-Security-Policy: form-action https: Feature-Policy: geolocation 'none'; midi 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; payment 'none' Permissions-Policy: geolocation=(), midi=(), microphone=(), camera=(), magnetometer=(), gyroscope=(), payment=() @@ -7,14 +7,14 @@ X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block /*.css - Cache-Control: public, max-age: 604800, s-maxage=604800 + Cache-Control: public, max-age=604800, s-maxage=604800 /*.js - Cache-Control: public, max-age: 604800, s-maxage=604800 + Cache-Control: public, max-age=604800, s-maxage=604800 /assets/* - Cache-Control: public, max-age: 0, s-maxage=604800, must-revalidate + Cache-Control: public, max-age=0, s-maxage=604800, must-revalidate /fonts/* - Cache-Control: public, max-age: 1800, s-maxage=604800, must-revalidate + Cache-Control: public, max-age=1800, s-maxage=604800, must-revalidate /images/* - Cache-Control: public, max-age: 1800, s-maxage=604800, must-revalidate + Cache-Control: public, max-age=1800, s-maxage=604800, must-revalidate /static/* - Cache-Control: public, max-age: 1800, s-maxage=604800, must-revalidate + Cache-Control: public, max-age=1800, s-maxage=604800, must-revalidate diff --git a/source/_includes/common-tasks/backups.md b/source/_includes/common-tasks/backups.md index f69a43845af..c64dac9f99d 100644 --- a/source/_includes/common-tasks/backups.md +++ b/source/_includes/common-tasks/backups.md @@ -15,10 +15,11 @@ A partial backup consists of any number of the above default directories and ins ### Making a Backup from the UI 1. Go to {% my supervisor_backups title="Settings > System > Backups" %} in the UI. -2. Provide a name for the backup. -3. Choose full or partial. -4. Choose to password protect or not. Password-protected backups cannot easily be browsed outside of Home Assistant OS. -5. Click "Create" to begin the backup. +2. Click the **Create backup** button in the lower right. +3. Provide a name for the backup. +4. Choose full or partial. +5. Choose to password protect or not. Password-protected backups cannot easily be browsed outside of Home Assistant OS. +6. Click "Create" to begin the backup. ### Restoring a Backup on a new install diff --git a/source/_integrations/device_tracker.mqtt.markdown b/source/_integrations/device_tracker.mqtt.markdown index 6c794a89e87..80305d04f8e 100644 --- a/source/_integrations/device_tracker.mqtt.markdown +++ b/source/_integrations/device_tracker.mqtt.markdown @@ -78,6 +78,7 @@ source_type: description: Attribute of a device tracker that affects state when being used to track a [person](/integrations/person/). Valid options are `gps`, `router`, `bluetooth`, or `bluetooth_le`. required: false type: string + default: gps {% endconfiguration %} {% enddetails %} diff --git a/source/_integrations/logger.markdown b/source/_integrations/logger.markdown index 43710bc8776..7c353245c07 100644 --- a/source/_integrations/logger.markdown +++ b/source/_integrations/logger.markdown @@ -170,6 +170,8 @@ data: aiohttp: error ``` +## Viewing logs + The log information are stored in the [configuration directory](/docs/configuration/) as `home-assistant.log` and you can read it with the command-line tool `cat` or follow it dynamically diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index 04e685e5e34..ac12be83ece 100644 --- a/source/_integrations/nest.markdown +++ b/source/_integrations/nest.markdown @@ -26,6 +26,15 @@ ha_platforms: ha_integration_type: integration --- + + +
Existing users: Nest authentication is changing.
+
LEARN MORE
+
+ + The `nest` integration allows you to integrate your [Google Nest](https://store.google.com/us/category/connected_home?) devices in Home Assistant. This integration uses the [Smart Device Management](https://developers.google.com/nest/device-access/api) API and Google's Cloud Pubsub to efficiently listen for changes in device state or other events. See [Supported Devices](https://developers.google.com/nest/device-access/supported-devices) for all devices supported by the SDM API. There is currently support for the following device types within Home Assistant: @@ -425,7 +434,7 @@ To improve security and reduce phishing risk Google has [deprecated](https://dev 1. Make sure to upgrade to the latest version of Home Assistant. 1. In the sidebar click on _**{% my config icon %}**_. 1. From the configuration menu select: _**{% my integrations %}**_. -1. The *Nest* integration should appear with alert. +1. The *Nest* integration should appear with alert. ![Screenshot of success](/images/integrations/nest/attention.png) diff --git a/source/_integrations/openuv.markdown b/source/_integrations/openuv.markdown index 9a0cfda2bb7..9be0fd3e4bd 100644 --- a/source/_integrations/openuv.markdown +++ b/source/_integrations/openuv.markdown @@ -98,26 +98,40 @@ Perform an on-demand update of OpenUV `uv_protection_window` data, but not the s ## Examples of Updating Data -One method to retrieve data every 30 minutes and still leave plenty of API key -usage is to only retrieve data during the daytime: +To perform an optimal amount of API calls you need to know the hours of daylight on the longest day of the year. If for example this is 17 hours, you can perform 2 calls around every 45 minutes without running into the 50 API call limit per day: + +{% raw %} ```yaml automation: - - alias: "Update OpenUV every 30 minutes during the daytime" + - alias: "Update OpenUV" trigger: - platform: time_pattern - minutes: "/30" + # Time pattern of /45 will not work as expected, it will trigger on the whole hour and on the whole hour + 45 minutes. + # Using more frequent time pattern and a condition to get the intended behavior. + - platform: time_pattern + minutes: "/15" condition: - condition: and - conditions: - - condition: sun - after: sunrise - - condition: sun - before: sunset + - condition: sun + after: sunrise + before: sunset + # The last call will most likely fall before the sunset, thus leaving an UV index value not at 0 for the remaining night. + # To fix this, we allow one more service call after the sun has set. + before_offset: "+00:45:00" + # We check if the last trigger has been 40 minutes or more ago so we don't run into timing issues. + # By checking for 40 minutes or greater we ensure this is only true at the 45 minute mark. + - condition: template + value_template: >- + {{ + state_attr('automation.openuv_update', 'last_triggered') == None or + (now() - state_attr('automation.openuv_update', 'last_triggered')) >= timedelta(hours = 0, minutes = 40) + }} action: - service: openuv.update_data + - service: openuv.update_data + ``` +{% endraw %} + Update the UV index data every 20 minutes while the sun is at least 10 degrees above the horizon: {% raw %} @@ -157,7 +171,7 @@ etc.) might be to simply query the API less often: ```yaml automation: - - alias: "Update OpenUV every hour (24 of 50 calls per day)" + - alias: "Update OpenUV every hour (48 of 50 calls per day)" trigger: platform: time_pattern hours: "*" diff --git a/source/_integrations/tts.markdown b/source/_integrations/tts.markdown index 8f906485167..a6d7e659734 100644 --- a/source/_integrations/tts.markdown +++ b/source/_integrations/tts.markdown @@ -66,7 +66,6 @@ tts: cache: true cache_dir: /tmp/tts time_memory: 300 - base_url: http://192.168.0.10:8123 service_name: google_say ``` @@ -87,7 +86,7 @@ The Google cast devices (Google Home, Chromecast, etc.) present the following pr * They do not work with URLs that contain hostnames established by local naming means. Let's say your Home Assistant instance is running on a machine made known locally as `ha`. All your machines on your local network are able to access it as `ha`. However, try as you may, your cast device won't download the media files from your `ha` machine. That's because your cast device ignores your local naming setup. In this example, the `say` service creates a URL like `http://ha/path/to/media.mp3` (or `https://...` if you are using SSL). If you are _not_ using SSL then setting an internal URL that contains the IP address of your server works around this issue. By using an IP address, the cast device does not have to resolve the hostname. -* If you are using an SSL (e.g., `https://yourhost.example.org/...`) then you _must_ use the hostname in the certificate (e.g., `base_url: https://yourhost.example.org`). You cannot use an IP address since the certificate won't be valid for the IP address, and the cast device will refuse the connection. +* If you are using an SSL (e.g., `https://yourhost.example.org/...`) then you _must_ use the hostname in the certificate (e.g., `external_url: https://yourhost.example.org`). You cannot use an IP address since the certificate won't be valid for the IP address, and the cast device will refuse the connection. ## Service say diff --git a/source/_layouts/page.html b/source/_layouts/page.html index 7381c7161c2..7d320b83a06 100644 --- a/source/_layouts/page.html +++ b/source/_layouts/page.html @@ -20,8 +20,14 @@ layout: default {% endfor %} {% endfor %} {% if active_alert != "" %} -
- ⚠️ There is an active alert for this integration! +
+ + +
There is an active alert for this integration!
+
LEARN MORE
+
{% endif %} {% endif %} @@ -30,4 +36,4 @@ layout: default {{ content }} {% include feedback.html %} - \ No newline at end of file + diff --git a/source/_posts/2022-07-27-leviton-partner.markdown b/source/_posts/2022-07-27-leviton-partner.markdown index f8580909961..18f3c83f3e4 100644 --- a/source/_posts/2022-07-27-leviton-partner.markdown +++ b/source/_posts/2022-07-27-leviton-partner.markdown @@ -31,4 +31,4 @@ Leviton Decora Smart Z-Wave Devices include their DZ6HD dimmer, DZ15S switch, ZW If you would like to learn more about the Leviton products and integration check out their [integration page](/integrations/leviton)! Leviton will also show up in the integrations list in Home Assistant version 2022.8! -If you missed the announcement of the Works with Home Assistant partner program, make sure to check out the [blog post](/partner-program). +If you missed the announcement of the Works with Home Assistant partner program, make sure to check out the [blog post](/blog/2022/07/12/partner-program/). diff --git a/source/more-info/nest-auth-deprecation.markdown b/source/more-info/nest-auth-deprecation.markdown new file mode 100644 index 00000000000..22fdf0bad63 --- /dev/null +++ b/source/more-info/nest-auth-deprecation.markdown @@ -0,0 +1,31 @@ +--- +title: "Nest Desktop Auth Deprecation" +description: "The primary authentication method recommended by the Nest Home Assistant integration called Desktop, Installed App or OOB auth was deprecated for new uses on February 28th, 2022 and will be disabled for all users on October 3, 2022." +--- + +The primary authentication method recommended by the Nest Home Assistant integration called *Desktop*, *Installed App* or *OOB* auth was deprecated for new uses on February 28th, 2022 and will be disabled for all users on October 3, 2022. See the [Google Developer blog](https://developers.googleblog.com/2022/02/making-oauth-flows-safer.html#disallowed-oob) +for announcement details. + +**Existing must upgrade to *Web Auth* credentials by October 3, 2022.** + +## New Users + +New users may sign up using *Web Auth* without issue. Follow the [documentation](https://www.home-assistant.io/integrations/nest/) which has been updated to use *Web Auth* and a *My Home Assistant* redirect URL using Home Assistant `2022.6` or newer. + +## Existing Users: App Auth + +If you previously successfully configured Nest and Home Assistant with *App Auth* then follow the instructions for [Deprecated App Auth Credentials](https://www.home-assistant.io/integrations/nest/#deprecated-app-auth-credentials). + +Nest is now configured entirely from the UI using [Application Credentials](https://www.home-assistant.io/integrations/application_credentials/) and the configuration flow will walk you through the steps of creating new credentails the right way. + +You will need to upgrade to *Web Auth* before October to avoid interruption. + +## Existing Users: Web Auth + +Users who signed up using *Web Auth* are not affected by the App Auth deprecation. However, as of `2022.6` the *My Home Assistant* URL is now the default redirect URL and may need to be updated in the Google Cloud Console to avoid a `redirect_uri_mismatch` ([more info](https://www.home-assistant.io/integrations/nest/#troubleshooting)). + +# Background + +The OAuth out-of-band flow was designed to support native applications that cannot support a redirect URI like a Web application, which was convenient for Home Assistant since it is difficult for end Home Assistant users to set up SSL certificates and DNS needed for a secure Web endpoint. However, Google has deprecated the OOB flow as it introduces a phishing risk. New users are no longer allowed to create new Desktop auth credentials and existing users will no longer work starting October 3, 2022. + +As of `2022.6` the *Web Auth* OAuth2 flow uses the *My Home Assistant* redirect URL which handles SSL. This is what allows new signups for *Web Auth* as the new recommended approach.