diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 438e7c5b0acd..9c8011b44f4b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -21,7 +21,6 @@ "editorconfig.editorconfig", "GitHub.vscode-pull-request-github", "mrmlnc.vscode-scss", - "Shopify.ruby-lsp", "streetsidesoftware.code-spell-checker", "taichi.vscode-textlint", "yzhang.markdown-all-in-one" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c0402933ed64..1ad7ce489d0c 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/CODEOWNERS b/CODEOWNERS index 6bfca80443bb..d81f9d01928f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -33,11 +33,12 @@ source/_integrations/airvisual.markdown @bachya source/_integrations/airvisual_pro.markdown @bachya source/_integrations/airzone.markdown @Noltari source/_integrations/airzone_cloud.markdown @Noltari -source/_integrations/aladdin_connect.markdown @mkmer +source/_integrations/aladdin_connect.markdown @swcloudgenie source/_integrations/alarm_control_panel.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_polly.markdown @jschlyter source/_integrations/amberelectric.markdown @madpilot source/_integrations/ambient_network.markdown @thomaskistler source/_integrations/ambient_station.markdown @bachya @@ -62,6 +63,7 @@ source/_integrations/apprise.markdown @caronc source/_integrations/aprilaire.markdown @chamberlain2007 source/_integrations/aprs.markdown @PhilRW source/_integrations/apsystems.markdown @mawoka-myblock @SonnenladenGmbH +source/_integrations/aquacell.markdown @Jordi1990 source/_integrations/aranet.markdown @aschmitz @thecode @anrijs source/_integrations/arcam_fmj.markdown @elupus source/_integrations/arris_tg2492lg.markdown @vanbalken @@ -83,6 +85,7 @@ source/_integrations/automation.markdown @home-assistant/core source/_integrations/avea.markdown @pattyland source/_integrations/awair.markdown @ahayworth @danielsjf source/_integrations/axis.markdown @Kane610 +source/_integrations/azure_data_explorer.markdown @kaareseras source/_integrations/azure_devops.markdown @timmo001 source/_integrations/azure_event_hub.markdown @eavanvalkenburg source/_integrations/azure_service_bus.markdown @hfurubotten @@ -95,7 +98,7 @@ source/_integrations/beewi_smartclim.markdown @alemuro source/_integrations/bge.markdown @tronikos source/_integrations/binary_sensor.markdown @home-assistant/core source/_integrations/bizkaibus.markdown @UgaitzEtxebarria -source/_integrations/blebox.markdown @bbx-a @riokuu @swistakm +source/_integrations/blebox.markdown @bbx-a @swistakm source/_integrations/blink.markdown @fronzbot @mkmer source/_integrations/bliss_automation.markdown @starkillerOG source/_integrations/bloc_blinds.markdown @starkillerOG @@ -216,7 +219,7 @@ source/_integrations/elmax.markdown @albertogeniola source/_integrations/elv.markdown @majuss source/_integrations/elvia.markdown @ludeeus source/_integrations/emby.markdown @mezz64 -source/_integrations/emoncms.markdown @borpin +source/_integrations/emoncms.markdown @borpin @alexandrecuer source/_integrations/emonitor.markdown @bdraco source/_integrations/emulated_hue.markdown @bdraco @Tho85 source/_integrations/emulated_kasa.markdown @kbickar @@ -359,7 +362,7 @@ source/_integrations/hurrican_shutters_wholesale.markdown @starkillerOG source/_integrations/husqvarna_automower.markdown @Thomas55555 source/_integrations/huum.markdown @frwickst source/_integrations/hvv_departures.markdown @vigonotion -source/_integrations/hydrawise.markdown @dknowles2 @ptcryan +source/_integrations/hydrawise.markdown @dknowles2 @thomaskistler @ptcryan source/_integrations/hyperion.markdown @dermotduffy source/_integrations/ialarm.markdown @RyuzakiKK source/_integrations/iammeter.markdown @lewei50 @@ -374,7 +377,7 @@ source/_integrations/image_upload.markdown @home-assistant/core source/_integrations/imap.markdown @jbouwh source/_integrations/imgw_pib.markdown @bieniu source/_integrations/improv_ble.markdown @emontnemery -source/_integrations/incomfort.markdown @zxdavb +source/_integrations/incomfort.markdown @jbouwh source/_integrations/indianamichiganpower.markdown @tronikos source/_integrations/influxdb.markdown @mdegat01 source/_integrations/inkbird.markdown @bdraco @@ -399,6 +402,7 @@ source/_integrations/isal.markdown @bdraco source/_integrations/islamic_prayer_times.markdown @engrbm87 @cpfair source/_integrations/ismartwindow.markdown @starkillerOG source/_integrations/iss.markdown @DurgNomis-drol +source/_integrations/ista_ecotrend.markdown @tr4nt0r source/_integrations/isy994.markdown @bdraco @shbatm source/_integrations/izone.markdown @Swamp-Ig source/_integrations/jellyfin.markdown @j-stienstra @ctalkington @@ -417,6 +421,7 @@ source/_integrations/keyboard_remote.markdown @bendavid @lanrat source/_integrations/keymitt_ble.markdown @spycle source/_integrations/kitchen_sink.markdown @home-assistant/core source/_integrations/kmtronic.markdown @dgomes +source/_integrations/knocki.markdown @joostlek @jgatto1 source/_integrations/knx.markdown @Julius2342 @farmio @marvin-w source/_integrations/kodi.markdown @OnFreund source/_integrations/konnected.markdown @heythisisnate @@ -468,12 +473,14 @@ source/_integrations/martec.markdown @starkillerOG source/_integrations/mastodon.markdown @fabaff source/_integrations/matrix.markdown @PaarthShah source/_integrations/matter.markdown @home-assistant/matter +source/_integrations/mealie.markdown @joostlek @andrew-codechimp source/_integrations/meater.markdown @Sotolotl @emontnemery source/_integrations/medcom_ble.markdown @elafargue source/_integrations/media_extractor.markdown @joostlek source/_integrations/media_player.markdown @home-assistant/core source/_integrations/media_source.markdown @hunterjm source/_integrations/mediaroom.markdown @dgomes +source/_integrations/melcloud.markdown @erwindouna source/_integrations/melissa.markdown @kennedyshead source/_integrations/melnor.markdown @vanstinator source/_integrations/met.markdown @danielhiversen @@ -512,7 +519,7 @@ source/_integrations/mysensors.markdown @MartinHjelmare @functionpointer source/_integrations/mystrom.markdown @fabaff source/_integrations/myuplink.markdown @pajzo @astrandb source/_integrations/nam.markdown @bieniu -source/_integrations/nanoleaf.markdown @milanmeu +source/_integrations/nanoleaf.markdown @milanmeu @joostlek source/_integrations/neato.markdown @Santobert source/_integrations/nederlandse_spoorwegen.markdown @YarmoM source/_integrations/ness_alarm.markdown @nickw444 @@ -559,6 +566,7 @@ source/_integrations/onboarding.markdown @home-assistant/core source/_integrations/oncue.markdown @bdraco @peterager source/_integrations/ondilo_ico.markdown @JeromeHXP source/_integrations/onewire.markdown @garbled1 @epenet +source/_integrations/onkyo.markdown @arturpragacz source/_integrations/onvif.markdown @hunterjm source/_integrations/open_meteo.markdown @frenck source/_integrations/openai_conversation.markdown @balloob @@ -622,6 +630,7 @@ source/_integrations/pushbullet.markdown @engrbm87 source/_integrations/pushover.markdown @engrbm87 source/_integrations/pvoutput.markdown @frenck source/_integrations/pvpc_hourly_pricing.markdown @azogue +source/_integrations/pyload.markdown @tr4nt0r source/_integrations/qbittorrent.markdown @geoffreylagaisse @finder39 source/_integrations/qingping.markdown @bdraco source/_integrations/qld_bushfire.markdown @exxamalte @@ -665,7 +674,7 @@ source/_integrations/ring.markdown @sdb9696 source/_integrations/risco.markdown @OnFreund source/_integrations/rituals_perfume_genie.markdown @milanmeu @frenck source/_integrations/rmvtransport.markdown @cgtobi -source/_integrations/roborock.markdown @humbertogontijo @Lash-L +source/_integrations/roborock.markdown @Lash-L source/_integrations/roku.markdown @ctalkington source/_integrations/romy.markdown @xeniter source/_integrations/roomba.markdown @pschmitt @cyr-ius @shenxn @Xitee1 @Orhideous @@ -743,7 +752,7 @@ source/_integrations/snmp.markdown @nmaggioni source/_integrations/snooz.markdown @AustinBrunkhorst source/_integrations/solaredge.markdown @frenck @bdraco source/_integrations/solaredge_local.markdown @drobtravels @scheric -source/_integrations/solarlog.markdown @Ernst79 +source/_integrations/solarlog.markdown @Ernst79 @dontinelli source/_integrations/solax.markdown @squishykid source/_integrations/soma.markdown @ratsept @sebfortier2288 source/_integrations/somfy.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @@ -826,9 +835,9 @@ source/_integrations/todoist.markdown @boralyl source/_integrations/tolo.markdown @MatthiasLohr source/_integrations/tomorrowio.markdown @raman325 @lymanepp source/_integrations/totalconnect.markdown @austinmroczek -source/_integrations/tplink.markdown @rytilahti @thegardenmonkey @bdraco @sdb9696 +source/_integrations/tplink.markdown @rytilahti @bdraco @sdb9696 source/_integrations/tplink_omada.markdown @MarkGodwin -source/_integrations/tplink_tapo.markdown @rytilahti @thegardenmonkey @bdraco @sdb9696 +source/_integrations/tplink_tapo.markdown @rytilahti @bdraco @sdb9696 source/_integrations/traccar.markdown @ludeeus source/_integrations/traccar_server.markdown @ludeeus source/_integrations/tractive.markdown @Danielhiversen @zhulik @bieniu @@ -848,7 +857,6 @@ source/_integrations/ukraine_alarm.markdown @PaulAnnekov source/_integrations/unifi.markdown @Kane610 source/_integrations/unifi_direct.markdown @tofuSCHNITZEL source/_integrations/unifiled.markdown @florisvdk -source/_integrations/unifiprotect.markdown @bdraco source/_integrations/upb.markdown @gwww source/_integrations/upc_connect.markdown @pvizeli @fabaff source/_integrations/upcloud.markdown @scop diff --git a/Gemfile b/Gemfile index 909738d85e88..bffd2277f7a1 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.3' + 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 cd20ad0bdbe8..2ff07298f70d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) ast (2.4.2) base64 (0.2.0) bigdecimal (3.1.8) @@ -28,7 +28,7 @@ GEM eventmachine (1.2.7) ffi (1.17.0-x86_64-linux-gnu) forwardable-extended (2.6.0) - google-protobuf (4.27.1-x86_64-linux) + google-protobuf (4.27.2-x86_64-linux) bigdecimal rake (>= 13) http_parser.rb (0.8.0) @@ -80,15 +80,15 @@ 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) forwardable-extended (~> 2.6) prism (0.30.0) - public_suffix (5.1.0) + public_suffix (6.0.0) racc (1.8.0) - rack (3.1.3) + 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.0) + 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.3) + 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,12 +142,12 @@ GEM rack-protection (= 4.0.0) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11435) + sorbet-runtime (0.5.11481) stringex (2.8.6) strscan (3.1.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - tilt (2.3.0) + tilt (2.4.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) tzinfo-data (1.2024.1) @@ -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.3) + 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 83377b6fbee1..73a7bf69085a 100644 --- a/_config.yml +++ b/_config.yml @@ -107,9 +107,9 @@ social: # Home Assistant release details current_major_version: 2024 -current_minor_version: 6 -current_patch_version: 3 -date_released: 2024-06-15 +current_minor_version: 7 +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: @@ -177,6 +199,12 @@ defaults: values: sitemap: false + - scope: + path: "blueprints/**/*.yaml" + values: + render_with_liquid: false + layout: none + # Support for files Jekyll will normally exclude include: - "_headers" diff --git a/plugins/alerts.rb b/plugins/alerts.rb new file mode 100644 index 000000000000..6178526e5779 --- /dev/null +++ b/plugins/alerts.rb @@ -0,0 +1,83 @@ +module Jekyll + module HomeAssistant + class AlertBlock < Liquid::Block + def initialize(tag_name, args, tokens) + super + raise SyntaxError, <<~MSG unless args.strip =~ SYNTAX + Syntax error in alert block while parsing the following options: + + #{args} + + Valid syntax: + {% [title="Extra title"] [icon="mdi:alert"] %} + MSG + + @type = tag_name + @options = Regexp.last_match(1) + end + + def render(context) + # We parse on render, as we now have context + options = parse_options(@options, context) + contents = super(context) + + title = @type.capitalize + if options.include? :title + title += ": #{options[:title]}" + end + + if options.include? :icon + icon = options[:icon] + elsif @type == 'tip' + icon = "mdi:lightbulb-outline" + elsif @type == 'important' + icon = "mdi:message-alert-outline" + elsif @type == 'warning' + icon = "mdi:alert-outline" + elsif @type == 'caution' + icon = "mdi:alert-circle-outline" + else + icon = "mdi:information-outline" + end + + <<~MARKUP +
+

#{title}

+

+ #{contents} +

+
+ MARKUP + end + + private + + SYNTAX = /^((\s+\w+(=([\w.]+?|".+?"))?)*)$/ + OPTIONS_REGEX = /(?:\w="[^"]*"|\w=[\w.]+|\w)+/ + + def parse_options(input, context) + options = {} + return options if input.empty? + + # Split along 3 possible forms: key="value", key=value, or just key + input.scan(OPTIONS_REGEX) do |opt| + key, value = opt.split('=') + unless value.nil? + if value&.include?('"') + value.delete!('"') + else + value = context[value] + end + end + options[key.to_sym] = value || true + end + options + end + end + end +end +Liquid::Template.register_tag('note', Jekyll::HomeAssistant::AlertBlock) +Liquid::Template.register_tag('tip', Jekyll::HomeAssistant::AlertBlock) +Liquid::Template.register_tag('important', Jekyll::HomeAssistant::AlertBlock) +Liquid::Template.register_tag('warning', Jekyll::HomeAssistant::AlertBlock) +Liquid::Template.register_tag('caution', Jekyll::HomeAssistant::AlertBlock) diff --git a/plugins/configuration.rb b/plugins/configuration.rb index dcf2158cee32..aee7ff5016fe 100644 --- a/plugins/configuration.rb +++ b/plugins/configuration.rb @@ -64,7 +64,7 @@ def render_config_vars(vars:, component:, platform:, converter:, classes: nil, p result << vars.map do |key, attr| markup = Array.new # There are spaces around the "{key}", to improve double-click selection in Chrome. - markup << "
#{key} " + markup << "
#{key} " if attr.key? 'type' @@ -121,7 +121,7 @@ def render_config_vars(vars:, component:, platform:, converter:, classes: nil, p markup << "#{startSymbol}#{required_value(attr['required'])}#{shortDefaultValue}#{endSymbol}" end - markup << "
" + markup << "
" if attr.key? 'description' markup << "#{converter.convert(attr['description'].to_s)}" @@ -168,9 +168,9 @@ def render(context) <<~MARKUP
-

- Configuration Variables -

+

+ Configuration Variables +

diff --git a/plugins/configuration_basic.rb b/plugins/configuration_basic.rb index 816270a5d4ae..df3829444b25 100644 --- a/plugins/configuration_basic.rb +++ b/plugins/configuration_basic.rb @@ -15,7 +15,7 @@ def render_config_vars(vars:, component:, platform:, converter:, classes: nil, p result << vars.map do |key, attr| markup = Array.new - markup << "
#{key}
" + markup << "
#{key}
" if attr.key? 'description' markup << "#{converter.convert(attr['description'].to_s)}" diff --git a/plugins/details.rb b/plugins/details.rb index d1d5daa96bcc..8eb237987248 100644 --- a/plugins/details.rb +++ b/plugins/details.rb @@ -1,27 +1,44 @@ module Jekyll class DetailsBlock < Liquid::Block - def initialize(tag_name, title, tokens) + def initialize(tag_name, args, tokens) super - @title = title @details_idx = 1 + + raise SyntaxError, <<~MSG unless args.strip =~ SYNTAX + Syntax error in tag 'details' while parsing the following options: + + #{args} + + Valid syntax: + {% details [icon="iconify icon identifier"] %} + MSG + + @title = Regexp.last_match(1) + @options = Regexp.last_match(2) end def render(context) + # We parse on render, as we now have context + options = parse_options(@options, context) + contents = super(context) - if @title.nil? || @title.empty? then - title = "More info" + title = if @title.nil? || @title.empty? then + "More information" else - title = @title + @title end title = title.to_s.delete("\"") idx = context["details_idx"] - if idx.nil? then - idx = 0 - end + idx = 0 if idx.nil? context["details_idx"] = idx + 1 + icon = "" + if options.include? :icon + icon = "<iconify-icon inline icon='#{options[:icon]}'></iconify-icon> " + end + <<~MARKUP <script> function showDetails(el) { @@ -38,7 +55,7 @@ def render(context) <div class="details-block"> <div class='details-block-item'> <button class='details-block-title' onclick='showDetails(this)' aria-controls="content_#{idx}" aria-expanded="false"> - #{title} + <span>#{icon}#{title}</span> <div class='details-block-arrow'> <svg id="down" style="display: block;" width="24" height="24" viewBox="0 0 24 24"><path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" /></svg> <svg id="up" style="display: none;" width="24" height="24" viewBox="0 0 24 24"><path d="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" /></svg> @@ -49,6 +66,30 @@ def render(context) </div> MARKUP end + + private + + SYNTAX = /^(".+?")((\s+\w+(=([\w\.]+?|".+?"))?)*)$/ + OPTIONS_REGEX = /(?:\w="[^"]*"|\w=[\w\.]+|\w)+/ + + def parse_options(input, context) + options = {} + return options if input.empty? + + # Split along 3 possible forms: key="value", key=value, or just key + input.scan(OPTIONS_REGEX) do |opt| + key, value = opt.split("=") + unless value.nil? + if value&.include?('"') + value.delete!('"') + else + value = context[value] + end + end + options[key.to_sym] = value || true + end + options + end end end diff --git a/plugins/icon.rb b/plugins/icon.rb new file mode 100644 index 000000000000..268bd6a73545 --- /dev/null +++ b/plugins/icon.rb @@ -0,0 +1,32 @@ +module Jekyll + module HomeAssistant + class Icon < Liquid::Tag + + def initialize(tag_name, args, tokens) + super + if args.strip =~ SYNTAX + @icon = Regexp.last_match(1).downcase + else + raise SyntaxError, <<~MSG + Syntax error in tag 'icon' while parsing the following options: + + #{args} + + Valid syntax: + {% icon "<icon-set>:<icon-name>" %} + MSG + end + end + + def render(_context) + "<iconify-icon inline icon='#{@icon}'></iconify-icon>" + end + + private + + SYNTAX = %r!^"([a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*)"$!.freeze + end + end +end + +Liquid::Template.register_tag('icon', Jekyll::HomeAssistant::Icon) diff --git a/plugins/my.rb b/plugins/my.rb index 0a2ab949c07b..2480eb6f59c4 100644 --- a/plugins/my.rb +++ b/plugins/my.rb @@ -53,8 +53,8 @@ def render(context) # Custom title title = options[:title] elsif @redirect == "developer_call_service" - # Developer service call - title = "Call Service" + # Developer actions + title = "Perform action" title = "`#{options[:service]}`" if options.include? :service elsif DEFAULT_TITLES.include?(@redirect) # Lookup defaults @@ -65,10 +65,10 @@ def render(context) raise ArgumentError, "No default icon for redirect #{@redirect}" \ if !!options[:icon] == options[:icon] and ! DEFAULT_ICONS.include?(@redirect) icon = !!options[:icon] == options[:icon] ? DEFAULT_ICONS[@redirect] : @options[:icon] - icon = "<i class='#{icon}' /> " + icon = "<iconify-icon inline icon='#{icon}'></iconify-icon> " end - "#{icon}<a href='#{uri}' class='my' target='_blank'>#{title}</a>" + "<a href='#{uri}' class='my' target='_blank'>#{icon}#{title}</a>" end end @@ -79,8 +79,9 @@ def render(context) # Default icons when used in in-line text DEFAULT_ICONS = { - "config_flow_start" => "icon-plus-sign", - "config" => "icon-cog", + "config_flow_start" => "mdi:plus", + "config" => "mdi:cog", + "integrations" => "mdi:devices", } # Default title used for in-line text @@ -95,7 +96,7 @@ def render(context) "config_zwave_js" => "Z-Wave JS Configuration", "config" => "Settings", "developer_events" => "Events", - "developer_services" => "Services", + "developer_services" => "Actions", "developer_states" => "States", "developer_template" => "Templates", "energy" => "Energy", @@ -103,7 +104,7 @@ def render(context) "info" => "Information", "supervisor_info" => "Supervisor Information", "supervisor_backups" => "Backups", - "integrations" => "Devices & Services", + "integrations" => "Devices & services", } def parse_options(input, context) diff --git a/plugins/output_modder.rb b/plugins/output_modder.rb index a515f9629f63..a4ca095d7960 100644 --- a/plugins/output_modder.rb +++ b/plugins/output_modder.rb @@ -21,8 +21,18 @@ def output_modder(content) # All external links start with 'http', skip when this one does not next unless link.get_attribute('href') =~ /\Ahttp/i - # Play nice with our own links + # Append an external link icon, if there isn't an icon already next if link.get_attribute('href') =~ /\Ahttps?:\/\/\w*.?home-assistant.io/i + next if link.css('iconify-icon').any? + + icon = Nokogiri::XML::Node.new('iconify-icon', dom) + icon['inline'] = true + icon['icon'] = 'tabler:external-link' + icon['class'] = 'external-link' + link.add_child(icon) + + # Play nice with our own links + next if link.get_attribute('href') =~ /\Ahttps?:\/\/(?:\w+\.)?(?:home-assistant\.io|esphome\.io|nabucasa\.com|openhomefoundation\.org)/i # Play nice with links that already have a rel attribute set rel.unshift(link.get_attribute('rel')) @@ -39,7 +49,7 @@ def output_modder(content) title = header.content slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '') - header.children = "<a class='title-link' name='#{slug}' href='\##{slug}'></a> #{title}" + header.children = "#{title} <a class='title-link' name='#{slug}' href='\##{slug}'></a>" end dom.to_s diff --git a/plugins/terminology_tooltip.rb b/plugins/terminology_tooltip.rb index 41d50355607c..aeae162e8a38 100644 --- a/plugins/terminology_tooltip.rb +++ b/plugins/terminology_tooltip.rb @@ -34,7 +34,7 @@ def render(context) if glossary.key?("link") rendered_link = Liquid::Template.parse(glossary["link"]).render(context).strip - link = "<small><a class='terminology-link' href='#{rendered_link}' target='_blank'>[Learn more]</a></small>" + link = "<small><a class='terminology-link' href='#{rendered_link}'>[Learn more]</a></small>" end tooltip = "<span class='terminology-tooltip'>#{definition}#{link || ""}</span>" diff --git a/sass/_base.scss b/sass/_base.scss deleted file mode 100644 index 05fdd005cbee..000000000000 --- a/sass/_base.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import "base/utilities"; -@import "base/solarized"; -@import "base/theme"; -@import "base/typography"; -@import "base/layout"; diff --git a/sass/_partials.scss b/sass/_partials.scss deleted file mode 100644 index 4336c71cdba1..000000000000 --- a/sass/_partials.scss +++ /dev/null @@ -1,8 +0,0 @@ -@import "partials/header"; -@import "partials/navigation"; -@import "partials/blog"; -@import "partials/sharing"; -// @import "partials/syntax"; -@import "partials/archive"; -@import "partials/sidebar"; -@import "partials/footer"; diff --git a/sass/base/_layout.scss b/sass/base/_layout.scss deleted file mode 100644 index 81903428f5cd..000000000000 --- a/sass/base/_layout.scss +++ /dev/null @@ -1,192 +0,0 @@ -$max-width: 1200px !default; - -// Padding used for layout margins -$pad-min: 18px !default; -$pad-narrow: 25px !default; -$pad-medium: 35px !default; -$pad-wide: 55px !default; - -// Sidebar widths used in media queries -$sidebar-width-medium: 240px !default; -$sidebar-pad-medium: 15px !default; -$sidebar-pad-wide: 20px !default; -$sidebar-width-wide: 300px !default; - -$indented-lists: false !default; - -$header-font-size: 1em !default; -$header-padding-top: 1.5em !default; -$header-padding-bottom: 1.5em !default; - -.group { @include pie-clearfix; } - -@mixin collapse-sidebar { - float: none; - width: auto; - clear: left; - margin: 0; - padding: 0 $pad-medium 1px; - background-color: lighten($sidebar-bg, 2); - border-top: 1px solid lighten($sidebar-border, 4); - section { - &.odd, &.even { float: left; width: 48%; } - &.odd { margin-left: 0; } - &.even { margin-left: 4%; } - } - &.thirds section { - width: 30%; - margin-left: 5%; - &.first { - margin-left: 0; - clear: both; - } - } -} - -body { - -webkit-text-size-adjust: none; - max-width: $max-width; - position: relative; - margin: 0 auto; - > header, > nav, > footer, #content > article, #content > div > article, #content > div > section { - @extend .group; - padding-left: $pad-min; - padding-right: $pad-min; - @media only screen and (min-width: 480px) { - padding-left: $pad-narrow; - padding-right: $pad-narrow; - } - @media only screen and (min-width: 768px) { - padding-left: $pad-medium; - padding-right: $pad-medium; - } - @media only screen and (min-width: 992px) { - padding-left: $pad-wide; - padding-right: $pad-wide; - } - } - div.pagination { - @extend .group; - margin-left: $pad-min; - margin-right: $pad-min; - @media only screen and (min-width: 480px) { - margin-left: $pad-narrow; - margin-right: $pad-narrow; - } - @media only screen and (min-width: 768px) { - margin-left: $pad-medium; - margin-right: $pad-medium; - } - @media only screen and (min-width: 992px) { - margin-left: $pad-wide; - margin-right: $pad-wide; - } - } - > header { - font-size: $header-font-size; - padding-top: $header-padding-top; - padding-bottom: $header-padding-bottom; - } -} - -#content { - overflow: hidden; - > div, > article { width: 100%; } -} - -aside.sidebar { - float: none; - padding: 0 $pad-min 1px; - background-color: lighten($sidebar-bg, 2); - border-top: 1px solid $sidebar-border; - @extend .group; -} - -.flex-content { max-width: 100%; height: auto; } - -.basic-alignment { - &.left { float: left; margin-right: 1.5em; } - &.right { float: right; margin-left: 1.5em; } - &.center { display:block; margin: 0 auto 1.5em; } - &.left, &.right { margin-bottom: .8em; } -} - -.toggle-sidebar { &, .no-sidebar & { display: none; }} - -body.sidebar-footer { - @media only screen and (min-width: 750px) { - aside.sidebar{ @include collapse-sidebar; } - } - #content { margin-right: 0px; } - .toggle-sidebar { display: none; } -} - -@media only screen and (min-width: 550px) { - body > header { font-size: $header-font-size; } -} -@media only screen and (min-width: 750px) { - aside.sidebar { @include collapse-sidebar; } -} -#main, #content, .sidebar { - @extend .group; -} -@media only screen and (min-width: 768px) { - body { -webkit-text-size-adjust: auto; } - body > header { font-size: $header-font-size * 1.2; } - #main { - padding: 0; - margin: 0 auto; - } - #content { - overflow: visible; - margin-right: $sidebar-width-medium; - position: relative; - .no-sidebar & { margin-right: 0; border-right: 0; } - .collapse-sidebar & { margin-right: 20px; } - > div, > article { - padding-top: $pad-medium/2; - padding-bottom: $pad-medium/2; - float: left; - } - } - aside.sidebar { - width: $sidebar-width-medium - $sidebar-pad-medium*2; - padding: 0 $sidebar-pad-medium $sidebar-pad-medium; - background: none; - clear: none; - float: left; - margin: 0 -100% 0 0; - section { - width: auto; margin-left: 0; - &.odd, &.even { float: none; width: auto; margin-left: 0; } - } - .collapse-sidebar & { - @include collapse-sidebar; - } - } -} - -@media only screen and (min-width: 992px) { - body > header { font-size: $header-font-size * 1.3; } - #content { margin-right: $sidebar-width-wide; } - #content { - > div, > article { - padding-top: $pad-wide/2; - padding-bottom: $pad-wide/2; - } - } - aside.sidebar { - width: $sidebar-width-wide - $sidebar-pad-wide*2; - padding: 1.2em $sidebar-pad-wide $sidebar-pad-wide; - .collapse-sidebar & { - padding: { left: $pad-wide; right: $pad-wide; } - } - } -} - -@if $indented-lists == false { - @media only screen and (min-width: 768px) { - ul, ol { margin-left: 0; } - } -} - diff --git a/sass/base/_solarized.scss b/sass/base/_solarized.scss deleted file mode 100644 index 45d8fc5eff31..000000000000 --- a/sass/base/_solarized.scss +++ /dev/null @@ -1,46 +0,0 @@ -$base03: #002b36 !default; //darkest blue -$base02: #073642 !default; //dark blue -$base01: #586e75 !default; //darkest gray -$base00: #657b83 !default; //dark gray -$base0: #839496 !default; //medium gray -$base1: #93a1a1 !default; //medium light gray -$base2: #eee8d5 !default; //cream -$base3: #fdf6e3 !default; //white -$solar-yellow: #b58900 !default; -$solar-orange: #cb4b16 !default; -$solar-red: #dc322f !default; -$solar-magenta: #d33682 !default; -$solar-violet: #6c71c4 !default; -$solar-blue: #268bd2 !default; -$solar-cyan: #2aa198 !default; -$solar-green: #859900 !default; - -$solarized: dark !default; - -@if $solarized == light { - - $_base03: $base03; - $_base02: $base02; - $_base01: $base01; - $_base00: $base00; - $_base0: $base0; - $_base1: $base1; - $_base2: $base2; - $_base3: $base3; - - $base03: $_base3; - $base02: $_base2; - $base01: $_base1; - $base00: $_base0; - $base0: $_base00; - $base1: $_base01; - $base2: $_base02; - $base3: $_base03; -} - -/* non highlighted code colors */ -$pre-bg: $base03 !default; -$pre-border: darken($base02, 5) !default; -$pre-color: $base1 !default; - - diff --git a/sass/base/_theme.scss b/sass/base/_theme.scss deleted file mode 100644 index 60303ec9e3f6..000000000000 --- a/sass/base/_theme.scss +++ /dev/null @@ -1,85 +0,0 @@ -$noise-bg: image-url('noise.png') top left !default; -$img-border: inline-image('dotted-border.png') !default; - -// Main Link Colors -$link-color: #1abcf2 !default; -$link-color-hover: adjust-color($link-color, $lightness: 10, $saturation: 25) !default; -$link-color-visited: adjust-color($link-color, $hue: 80, $lightness: -4) !default; -$link-color-active: adjust-color($link-color-hover, $lightness: -15) !default; - -// Main Section Colors -$main-bg: #f8f8f8 !default; -$page-bg: #252525 !default; -$article-border: #eeeeee !default; - -$header-bg: #333 !default; -$header-border: lighten($header-bg, 15) !default; -$title-color: #f2f2f2 !default; -$subtitle-color: #aaa !default; - -$text-color: #222 !default; -$text-color-light: #aaa !default; -$type-border: #ddd !default; - -/* Navigation */ -$nav-bg: #ccc !default; -$nav-bg-front: image-url('noise.png') !default; -$nav-bg-back: linear-gradient(lighten($nav-bg, 8), $nav-bg, darken($nav-bg, 11)) !default; -$nav-color: darken($nav-bg, 38) !default; -$nav-color-hover: darken($nav-color, 25) !default; -$nav-placeholder: desaturate(darken($nav-bg, 10), 15) !default; -$nav-border: darken($nav-bg, 10) !default; -$nav-border-top: lighten($nav-bg, 15) !default; -$nav-border-bottom: darken($nav-bg, 25) !default; -$nav-border-left: darken($nav-bg, 11) !default; -$nav-border-right: lighten($nav-bg, 7) !default; - -/* Sidebar colors */ -$sidebar-bg: #f2f2f2 !default; -$sidebar-link-color: $text-color !default; -$sidebar-link-color-hover: $link-color-hover !default; -$sidebar-link-color-active: $link-color-active !default; -$sidebar-color: change-color(mix($text-color, $sidebar-bg, 80), $hue: hue($sidebar-bg), $saturation: saturation($sidebar-bg)/2) !default; -$sidebar-border: desaturate(darken($sidebar-bg, 7), 10) !default; -$sidebar-border-hover: darken($sidebar-bg, 7) !default; -$sidebar-link-color-subdued: lighten($sidebar-color, 20) !default; -$sidebar-link-color-subdued-hover: $sidebar-link-color-hover !default; - -$footer-color: #888 !default; -$footer-bg: #ccc !default; -$footer-bg-front: image-url('noise.png') !default; -$footer-bg-back: linear-gradient(lighten($footer-bg, 8), $footer-bg, darken($footer-bg, 11)) !default; -$footer-color: darken($footer-bg, 38) !default; -$footer-color-hover: darken($footer-color, 10) !default; -$footer-border-top: lighten($footer-bg, 15) !default; -$footer-border-bottom: darken($footer-bg, 15) !default; -$footer-link-color: darken($footer-bg, 38) !default; -$footer-link-color-hover: darken($footer-color, 25) !default; -$page-border-bottom: darken($footer-bg, 5) !default; - - -/* Core theme application */ - -a { - @include link-colors($link-color, $hover: $link-color-hover, $focus: $link-color-hover, $visited: $link-color-visited, $active: $link-color-active); -} -aside.sidebar a { - @include link-colors($sidebar-link-color, $hover: $sidebar-link-color-hover, $focus: $sidebar-link-color-hover, $active: $sidebar-link-color-active); -} -a { - @include transition(color .3s); -} - -html { - background: $page-bg image-url('line-tile.png') top left; -} -body { - > div { - background: $sidebar-bg $noise-bg; - border-bottom: 1px solid $page-border-bottom; - > div { - background: $main-bg $noise-bg; - border-right: 1px solid $sidebar-border; - } - } -} diff --git a/sass/base/_typography.scss b/sass/base/_typography.scss deleted file mode 100644 index ded090889b72..000000000000 --- a/sass/base/_typography.scss +++ /dev/null @@ -1,276 +0,0 @@ -$blockquote: $type-border !default; -$sans: "PT Sans", "Helvetica Neue", Arial, sans-serif !default; -$serif: "PT Serif", Georgia, Times, "Times New Roman", serif !default; -$mono: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace !default; -$heading-font-family: "PT Serif", "Georgia", "Helvetica Neue", Arial, sans-serif !default; -$header-title-font-family: $heading-font-family !default; -$header-subtitle-font-family: $heading-font-family !default; - -// Fonts -.heading { - font-family: $heading-font-family; -} -.sans { - font-family: $sans; -} -.serif { - font-family: $serif; -} -.mono { - font-family: $mono; -} - -body > header h1 { - font-size: 2.2em; - @extend .heading; - font-family: $header-title-font-family; - font-weight: normal; - line-height: 1.2em; - margin-bottom: 0.6667em; -} -body > header h2 { - font-family: $header-subtitle-font-family; -} - -body { - line-height: 1.5em; - color: $text-color; - @extend .serif; -} -h1 { - font-size: 2.2em; - line-height: 1.2em; -} - -@media only screen and (min-width: 992px) { - body { - font-size: 1.15em; - } - h1 { - font-size: 2.6em; - line-height: 1.2em; - } -} - -#{headings()} { - @extend .heading; - text-rendering: optimizelegibility; - margin-bottom: 1em; - font-weight: bold; -} -h2, -section h1 { - font-size: 1.5em; -} -h3, -section h2, -section section h1 { - font-size: 1.3em; -} -h4, -section h3, -section section h2, -section section section h1 { - font-size: 1em; -} -h5, -section h4, -section section h3 { - font-size: 0.9em; -} -h6, -section h5, -section section h4, -section section section h3 { - font-size: 0.8em; -} - -p, -article blockquote, -ul, -ol { - margin-bottom: 1.5em; -} - -ul { - list-style-type: disc; - ul { - list-style-type: circle; - margin-bottom: 0px; - ul { - list-style-type: square; - margin-bottom: 0px; - } - } -} - -ol { - list-style-type: decimal; - ol { - list-style-type: lower-alpha; - margin-bottom: 0px; - ol { - list-style-type: lower-roman; - margin-bottom: 0px; - } - } -} - -ul, -ol { - &, - ul, - ol { - margin-left: 1.3em; - } -} -ul, -ol { - ul, - ol { - margin-bottom: 0em; - } -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -sup, -sub { - font-size: 0.75em; - position: relative; - display: inline-block; - padding: 0 0.2em; - line-height: 0.8em; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.5em; -} - -a[rev="footnote"] { - font-size: 0.75em; - padding: 0 0.3em; - line-height: 1; -} - -q { - font-style: italic; - &:before { - content: '"'; - } - &:after { - content: '"'; - } -} - -em, -dfn { - font-style: italic; -} - -strong, -dfn { - font-weight: bold; -} - -del, -s { - text-decoration: line-through; -} - -abbr, -acronym { - border-bottom: 1px dotted; - cursor: help; -} - -pre, -code, -tt { - @extend .mono; -} - -hr { - margin-bottom: 0.2em; -} - -small { - font-size: 0.8em; -} - -big { - font-size: 1.2em; -} - -article blockquote { - $bq-margin: 1.2em; - font-style: italic; - position: relative; - font-size: 1.2em; - line-height: 1.5em; - padding-left: 1em; - border-left: 4px solid rgba($text-color-light, 0.5); - cite { - font-style: italic; - a { - color: $text-color-light !important; - word-wrap: break-word; - } - &:before { - content: "\2014"; - padding: { - right: 0.3em; - left: 0.3em; - } - color: $text-color-light; - } - } - @media only screen and (min-width: 992px) { - padding-left: 1.5em; - border-left-width: 4px; - } -} - -.pullquote-right:before, -.pullquote-left:before { - /* Reset metrics. */ - padding: 0; - border: none; - - /* Content */ - content: attr(data-pullquote); - - /* Pull out to the right, modular scale based margins. */ - float: right; - width: 45%; - margin: 0.5em 0 1em 1.5em; - - /* Baseline correction */ - position: relative; - top: 7px; - font-size: 1.4em; - line-height: 1.45em; -} - -.pullquote-left:before { - /* Make left pullquotes align properly. */ - float: left; - margin: 0.5em 1.5em 1em 0; -} - -/* @extend this to force long lines of continuous text to wrap */ -.force-wrap { - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - white-space: pre-wrap; - word-wrap: break-word; -} diff --git a/sass/base/_utilities.scss b/sass/base/_utilities.scss deleted file mode 100644 index 2d49e659e744..000000000000 --- a/sass/base/_utilities.scss +++ /dev/null @@ -1,28 +0,0 @@ -@mixin mask-image($img, $repeat: no-repeat){ - @include experimental(mask-image, image-url($img), -webkit, -moz, -o, -ms); - @include experimental(mask-repeat, $repeat, -webkit, -moz, -o, -ms); - width: image-width($img); - height: image-height($img); -} - -@mixin shadow-box($border: #fff .5em solid, $shadow: rgba(#000, .15) 0 1px 4px, $border-radius: .3em) { - @include border-radius($border-radius); - @include box-shadow($shadow); - @include box-sizing(border-box); - border: $border; -} - -@mixin selection($bg, $color: inherit, $text-shadow: none){ - * { - &::-moz-selection { background: $bg; color: $color; text-shadow: $text-shadow; } - &::-webkit-selection { background: $bg; color: $color; text-shadow: $text-shadow; } - &::selection { background: $bg; color: $color; text-shadow: $text-shadow; } - } -} - -@function text-color($color, $dark: dark, $light: light){ - $text-color: ( (red($color)*299) + (green($color)*587) + (blue($color)*114) ) / 1000; - $text-color: if($text-color >= 150, $dark, $light); - @return $text-color; -} - diff --git a/sass/custom/_colors.scss b/sass/custom/_colors.scss deleted file mode 100644 index fa13aa63fac2..000000000000 --- a/sass/custom/_colors.scss +++ /dev/null @@ -1,49 +0,0 @@ -// Here you can easily change your sites's color scheme. -// To give it a try, uncomment some of the lines below rebuild your blog, and see how it works. -// If you need a handy color picker try http://hslpicker.com - -$header-bg: #fff; -//$subtitle-color: lighten($header-bg, 58); -$nav-bg: #fff; -$nav-bg-front: none; -$nav-bg-back: #fff; -//$sidebar-bg: desaturate(#eceff5, 8); -//$sidebar-link-color: saturate(#526f9a, 10); -//$sidebar-link-color-hover: darken(#7ab662, 9); -$footer-bg: #fff; -$footer-bg-front: #fff; -$footer-bg-back: #fff; - -/* To use the light Solarized highlighting theme uncomment the following line */ -//$solarized: light; - -/* If you want to tweak the Solarized colors you can do that here */ -//$base03: #002b36; //darkest blue -//$base02: #073642; //dark blue -//$base01: #586e75; //darkest gray -//$base00: #657b83; //dark gray -//$base0: #839496; //medium gray -//$base1: #93a1a1; //medium light gray -//$base2: #eee8d5; //cream -//$base3: #fdf6e3; //white -//$solar-yellow: #b58900; -//$solar-orange: #cb4b16; -//$solar-red: #dc322f; -//$solar-magenta: #d33682; -//$solar-violet: #6c71c4; -//$solar-blue: #268bd2; -//$solar-cyan: #2aa198; -//$solar-green: #859900; - - -/* Non highlighted code colors */ -//$pre-bg: $base03; -//$pre-border: darken($base02, 5); -//$pre-color: $base1; - -$main-bg: #fff; -$page-bg: #fff; -$link-color: #1abcf2; -$nav-color: $link-color; -$link-color-visited:darken($nav-color, 25); -$title-color: $link-color; diff --git a/sass/custom/_fonts.scss b/sass/custom/_fonts.scss deleted file mode 100644 index 0d51f6843a5f..000000000000 --- a/sass/custom/_fonts.scss +++ /dev/null @@ -1,10 +0,0 @@ -// Here you can easily change font faces which are used in your site. -// To give it a try, uncomment some of the lines below rebuild your blog, and see how it works. your sites's. -// If you love to use Web Fonts, you also need to add some lines to source/_includes/custom/head.html - -$sans: "Open Sans", sans-serif; -$serif: "Noto Serif", serif; -//$mono: "Courier", monospace; -$heading-font-family: $sans; -//$header-title-font-family: "Futura", sans-serif; -//$header-subtitle-font-family: "Futura", sans-serif; diff --git a/sass/custom/_layout.scss b/sass/custom/_layout.scss deleted file mode 100644 index e51aa942dabe..000000000000 --- a/sass/custom/_layout.scss +++ /dev/null @@ -1,83 +0,0 @@ -// Here you can easily change your sites's layout. -// To give it a try, uncomment some of the lines below, make changes, rebuild your blog, and see how it works. - -//$header-font-size: 1em; -//$header-padding-top: 1.5em; -//$header-padding-bottom: 1.5em; - -//$max-width: 1350px; -//$indented-lists: true; - -// Padding used for layout margins -//$pad-min: 18px; -//$pad-narrow: 25px; -//$pad-medium: 35px; -//$pad-wide: 55px; - -// Sidebar widths used in media queries -//$sidebar-width-medium: 240px; -//$sidebar-pad-medium: 15px; -//$sidebar-pad-wide: 20px; -//$sidebar-width-wide: 300px; - -html { - overflow-y: hidden; -} - -.page-content { - display: inline-block; - height: calc(100% - 68px);; - margin-top: 68px; - overflow-y: scroll; - padding-top: 32px; - width: 100%; -} - -#sidebar { - .grid { - position: fixed; - width: 350px; - .brand-logo-container { - margin-top: 0; - } - } -} - -.site-header { - position: fixed; - width: 100%; - z-index: 999; -} - -table { - table-layout: fixed; - width: 100%; - - th,td { - word-wrap: break-word; - } -} - - -@media only screen and (max-width: $lap-end) { - #sidebar { - .grid { - position: initial; - width: 100%; - } - } - .site-header { - .pull-right { - position: fixed; - } - } - .hero { - > .grid-wrapper { - z-index: 0; - } - - img { - margin-bottom: 8px; - } - } - } \ No newline at end of file diff --git a/sass/custom/_paulus.scss b/sass/custom/_paulus.scss deleted file mode 100644 index 37cc00450fa2..000000000000 --- a/sass/custom/_paulus.scss +++ /dev/null @@ -1,944 +0,0 @@ -@charset "UTF-8"; - -$primary-color: #1abcf2; - -.site-header { - position: relative; - - .site-title { - display: flex; - align-items: center; - font-weight: normal; - } -} - -.docsearch { - .DocSearch-Button { - padding: 0px; - margin-top: 16px; - margin-left: 0px; - margin-right: 0px; - background: none; - &:hover { - box-shadow: none; - } - } - .DocSearch-Button-Placeholder { - display: none; - } - .DocSearch-Button-Keys { - display: none; - } - .DocSearch-Search-Icon { - margin-right: 8px; - color: $primary-color; - } -} - -.DocSearch-Container { - z-index: 1000; -} - -.integration-alert-container { - margin: -1em 0; -} - -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) { - .feedback { - margin-bottom: 32px; - } -} - -.hero { - background-color: #038fc7; - padding-bottom: 0; - - .lead { - margin-bottom: 16px; - } - - .hero-buttons a { - color: white; - text-transform: uppercase; - white-space: nowrap; - display: inline-block; - font-weight: 500; - } - - img { - display: block; - } -} - -.material-card { - background-color: #fefefe; - border-radius: 8px; - border: 1px solid rgba(0, 0, 0, .12); - box-shadow: rgba(0,0,0,0.06) 0 0 10px; - - h1 { - font-family: Roboto, Noto, sans-serif; - -webkit-font-smoothing: antialiased; - font-size: 24px; - font-weight: 400; - letter-spacing: -0.012em; - line-height: 40px; - color: #212121; - padding: 20px 16px 12px; - text-transform: capitalize; - margin: 0; - } - - &.text { - padding: 16px; - - h1 { - padding: 4px 0px 12px; - } - } - - .links { - margin-top: 8px; - margin-left: -8px; - - a { - text-decoration: none; - font-weight: 500; - text-transform: uppercase; - display: inline-block; - margin: 0 8px; - } - } - - @media screen and (max-width: 480px) { - .links { - margin-left: 0; - } - } -} - -.feedback { - h4 { - margin: 0 0 8px !important; - - a { - text-decoration: none !important; - color: #000; - } - } - - .links a { - font-weight: 400; - text-transform: none; - } -} - -.installation-survey { - padding-bottom: 64px; - - h4 { - margin: 0 0 8px !important; - - a { - text-decoration: none !important; - color: #000; - } - } - - p { - margin-bottom: 8px; - } -} - - -.button { - position: relative; - cursor: pointer; - font-size: 14px; - font-weight: bold; - padding: 8px 28px; - color: #fff; - background-color: #03a9f4; - border: none; - text-decoration: none !important; - border-radius: 4px; - box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2); - - &::before { - content: " "; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - opacity: 0.2; - border-radius: 4px; - } - &:hover { - box-shadow: 0 4px 8px 0 rgba(0,0,0,.14), 0 1px 7px 0 rgba(0,0,0,.12), 0 3px 1px -1px rgba(0,0,0,.2); - } - &:hover::before { - background-color: rgba(255,255,255,.8); - } - &:focus { - outline: none; - } - &:focus::before { - background-color: white; - } - &:active::before { - background-color: grey; - } - :host([active]) & { - color: rgba(0, 0, 0, 0.38); - background-color: rgba(0, 0, 0, 0.12); - box-shadow: none; - cursor: unset; - pointer-events: none; - } - &.hidden { - display: none; - } -} - -.frontpage { - .material-card { - margin-bottom: 24px; - } - - .current-version { - .release-date { - white-space: nowrap; - } - } - - .recent-posts { - .blog-date { - white-space: nowrap; - } - } - - .highlight-blog-post { - font-size: 2rem; - line-height: 1.15; - padding: 15px; - display: block; - text-decoration: none; - color: white; - transition: background-color 0.5s; - background-color: #038fc7; - - &.large { - font-size: 2.25rem; - line-height: 1.33333; - } - - &:hover { - background-color: lighten(#038fc7, 10%); - } - } - - .events { - padding: 16px; - - h3 { - margin-top: 8px; - } - - .event { - display: flex; - flex-wrap: wrap-reverse; - 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%; - } - } - } - - .picture-promo { - display: block; - padding-top: 30%; - background-size: cover; - background-position: center; - text-decoration: none; - border: none; - - .caption { - padding: 16px 12px 12px; - background-color: rgba(0, 0, 0, 0.54); - color: white; - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - display: flex; - justify-content: space-between; - align-items: center; - - .title { - font-size: 20px; - font-weight: 400; - } - - .subtitle { - font-size: 12px; - font-weight: initial; - } - - svg { - fill: white; - width: 32px; - height: 32px; - min-width: 32px; - } - } - } - - .supported-brands { - text-align: center; - - a { - text-decoration: none; - } - - img { - border: none !important; - box-shadow: none !important; - max-height: 50px; - max-width: 140px; - margin: 10px; - vertical-align: middle; - } - } - - .sponsors-and-press { - margin-top: 24px; - } - - .sponsored-by { - img { - border: 0; - border-radius: 0; - box-shadow: none; - margin: 15px; - max-width: 40%; - max-height: 80px; - } - - } - - .seen-press { - - img { - border: 0; - box-shadow: none; - margin: 15px; - max-width: 40%; - max-height: 70px; - } - - .square { - width: initial; - } - - .round { - border-radius: 50%; - } - } -} - -@media screen and (max-width: 700px) { - .frontpage .events .event { - .caption { - padding-top: 4px; - } - - img { - width: 100%; - } - } -} - - -// https://fortawesome.github.io/Font-Awesome/3.2.1/icons/ - -h1:hover a.title-link, -h2:hover a.title-link, -h3:hover a.title-link, -h4:hover a.title-link, -h5:hover a.title-link, -h6:hover a.title-link, -dt:hover a.title-link { - position: relative; - - &::before { - position: absolute; - top: 5px; - left: -25px; - padding-right: 10px; - padding-left: 5px; - font-family: "FontAwesome"; - font-size: 15px; - color: #999; - content: "\f0c1"; - } -} - -.ha-title { - display: inline-flex; - height: 100%; - white-space: nowrap; - - img { - border-radius: 3px; - height: 36px; - margin-right: 10px; - } - - a>* { - vertical-align: middle; - } -} - -.usp { - ul { - text-align: left; - margin-left: 27px; - margin-top: -18px; - } - - .icon i { - border: none !important; - } -} - -.hero-buttons a { - margin: 0 30px 10px 0; - - &:last-child { - margin: 0; - } -} - -article.post, -article.page, -article.listing { - font-size: 1.125em; - line-height: 1.6; - - img, - table { - border-radius: 3px; - box-shadow: rgba(0, 0, 0, 0.06) 0 0 10px; - vertical-align: middle; - } - - img.no-shadow { - border: 0; - box-shadow: none; - } - - video { - max-width: 100%; - } - - &>table, - &>.entry-content>table { - background-color: #f3fcf5; - } - - p.img { - background-color: #fff; - border-radius: 5px; - text-align: center; - padding-bottom: 3px; - font-size: 0.9rem; - box-shadow: rgba(0, 0, 0, 0.06) 0 0 10px; - - img { - display: block; - box-shadow: none; - margin: 0 auto; - } - } - - li { - margin-bottom: 10px; - - &>p:last-child { - margin-bottom: 0; - } - - &:last-child { - margin-bottom: 0; - } - } - - a { - text-decoration: underline; - - &.btn { - text-decoration: none; - } - } - - h1 {} - - h2 { - font-size: 1.5em; - margin-top: 2em; - - // Future re-design - // margin: 1.5em 0 1rem; - // - // border: 0; - // border-top: 1px solid $primary-color; - // padding-top: 1.4rem; - } - - h3 { - text-transform: uppercase; - letter-spacing: 0.125rem; - font-size: 1.2rem; - margin-top: 2em; - - // Future re-design - // margin: 2em 0 1rem; - } - - h4 { - font-size: 1.1rem; - margin-top: 2em; - - // Future re-design - // margin: 1.5em 0 1rem; - } - - details { - padding-bottom: 1em; - } -} - -p.note, -div.note { - position: relative; - - background: #e7f2fa; - - padding: 40px 12px 6px 12px; - margin-bottom: 24px; - box-shadow: rgba(0, 0, 0, 0.06) 0 0 10px; - - p { - margin-bottom: 0px; - } - - &::before { - font-family: "FontAwesome", sans-serif; - content: "\f05a"" Note " attr(data-title); - background-color: #6ab0de; - color: white; - font-weight: bold; - - border-top-left-radius: 3px; - border-top-right-radius: 3px; - padding: 6px 14px; - - line-height: 1.5em; - - position: absolute; - top: 0; - left: 0; - right: 0; - } - - &.warning { - background-color: #f7f9e1; - - &::before { - background-color: rgb(187, 185, 13); - content: "\f071"" Warning " attr(data-title); - } - } -} - -.copyright { - text-align: left; - - .company { - .title { - font-size: 1.5em; - } - - img { - vertical-align: middle; - height: 120px; - } - - i { - font-size: 2em; - padding: 0 5px; - } - - .icons { - display: flex; - align-items: center; - - svg { - height: 48px; - padding: 10px 4px; - fill: currentColor; - } - } - } - - ul { - margin: 0; - list-style: none; - } -} - -.aside-module { - .section { - margin-bottom: 10px; - - ul.section-nav { - margin-left: 0px; - - 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; - margin-top: 50px; - display: grid; - justify-items: center; - - img { - max-height: 67px; - } - - a.my img { - margin-top: 20px; - } - } -} - -lite-youtube { - position: relative; - display: block; - padding-bottom: calc(100% / (16 / 9)); - background-color: rgba(0, 0, 0, .1); -} - -lite-youtube::before { - content: attr(videotitle) " video placeholder"; - color: rgba(0, 0, 0, 0.82); - text-align: center; - width: 100%; - position: absolute; - padding-top: calc(45% / (16 / 9)); -} - -// Responsive YouTube embeds. -// https://css-tricks.com/NetMag/FluidWidthVideo/Article-FluidWidthVideo.php -.videoWrapper { - position: relative; - padding-bottom: 56.25%; - /* 16:9 */ - height: 0; - margin-bottom: 25px; - background: #000; - - iframe { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } -} - -.edit-github { - float: right; - margin-left: 8px; - margin-bottom: 8px; - font-size: 0.8em; -} - -ul.sidebar-menu { - a.active { - color: #000; - font-weight: bold; - } - - ul { - margin-left: 30px; - } -} - -a code { - color: $primary-color; -} - -twitter-widget, -.twitter-tweet-rendered { - margin-left: auto; - margin-right: auto; -} - -.text-center { - text-align: center; -} - -.aside-module { - max-width: 100%; - overflow: hidden; -} - -// Configuration variables -div.config-vars { - padding-bottom: 16px; - - h3 { - margin-bottom: 0; - } - - .configuration-link { - font-size: 13px; - - a { - color: #8792a2; - text-decoration: none; - border-bottom: #8792a2 dotted 0.5px; - } - } - - .config-vars-item { - border-bottom: 1px solid #d9dbde; - padding-top: 16px; - padding-bottom: 16px; - } - - .nested .config-vars-item:last-child { - border: none; - } - - .config-vars-label { - padding-bottom: 4px; - position: relative; - - &:hover a.title-link::before { - position: absolute; - top: 5px; - left: -25px; - padding-right: 40px; - font-family: "FontAwesome"; - font-size: 15px; - color: #999; - content: ""; - } - } - - .config-vars-label-name { - font-weight: bold; - font-size: 16px; - color: #222222bd; - } - - .config-vars-type { - color: #8792a2; - font-size: 13px; - } - - .config-vars-required { - color: #8792a2; - font-size: 13px; - text-transform: lowercase; - - .true { - color: #e56f4a; - text-transform: uppercase; - font-size: 11px; - } - - .default { - text-transform: None; - } - } - - .config-vars-description-and-children { - font-size: 14px; - color: #4f566b; - } - - .config-vars-description p { - margin: 0; - } - - .config-vars-default { - padding-top: 8px; - - p { - margin: 0; - display: inline; - } - } - - .nested { - margin-left: 48px; - } -} - -code { - font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; - font-size: 0.8em; - color: #1990b8; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; - - background-color: #fdfdfd; - background-image: linear-gradient(transparent 50%, - rgba(69, 142, 209, 0.04) 50%); - background-size: 3em 3em; - background-origin: content-box; - background-attachment: local; - - border: 1px solid #ddd; - border-radius: 0.4em; - padding: 0.1em 0.4em; -} - -@media only screen and (max-width: $menu-collapse) { - - #not_found { - .page { - text-align: center; - - .search404-container { - margin-bottom: 32px; - display: grid; - - #search404 { - display: flex; - justify-self: center; - } - } - } - } -} - -@media only screen and (min-width: $menu-collapse) { - #not_found { - .page { - text-align: center; - margin-bottom: 300px; - - .search404-container { - margin-bottom: 32px; - display: grid; - - #search404 { - display: flex; - justify-self: center; - } - } - } - - footer { - position: absolute; - bottom: 0; - width: 100%; - } - } -} - -a.my { - img { - border: 0px; - border-radius: 0; - box-shadow: none; - } -} - -:target { - display: block; - position: relative; - top: -100px; - visibility: hidden; -} diff --git a/sass/custom/_styles.scss b/sass/custom/_styles.scss deleted file mode 100644 index d35472805bfb..000000000000 --- a/sass/custom/_styles.scss +++ /dev/null @@ -1,142 +0,0 @@ -// This File is imported last, and will override other styles in the cascade -// Add styles here to make changes without digging in too much -html { - background:$page-bg; -} -body { - line-height: 1.8em; - font-size:1.1em; - max-width:1320px; - > div { - background: #fff !important; - border-bottom:2px solid #f2f2f2; - > div { - border-right:2px solid #f2f2f2; - background: #fff !important; - } - } - > nav { - border-bottom:2px solid #f2f2f2; - li+li { - border-left:2px solid #f2f2f2; - } - a { - font-family: $serif; - } - } - >header { - h1 a { - font-weight: bold; - } - } - - #content .blog-index article { - table { - font-size: 90%; - margin-bottom: 1.5em; - thead tr { - border-bottom: 1px solid $sidebar-border; - } - th { - font-weight: bold; - padding-right: 20px; - } - td { - padding: 0 20px 10px 0; - vertical-align: top; - } - } - - header { - h1 { - margin: 0; - a { text-decoration: none; - &:hover { - text-decoration: none; - color:$link-color; - } - } - } - } - } - #blog-archives { - h1 { - a { text-decoration: none; - &:hover { text-decoration:none; } } - } - } - aside.sidebar { - background:#fff; - border-left:2px solid #f2f2f2; - height:100%; - form .search { - padding: .3em .5em 0; - font-size: .85em; - font-family: $serif; - line-height: 1.1em; - width: 95%; - background-color: #fff; - border: 2px solid #f2f2f2; - color: #000; - } - input[type=text]:focus, textarea:focus { - box-shadow: 0 0 0 rgba(255,255,255,1); - } - } - - .toggle-sidebar { - display:none; - } -} -@media only screen and (max-width: 749px) { - aside.sidebar { - padding-top:15px; - padding-bottom:15px; - } -} -@media only screen and (min-width: 750px) { - aside.sidebar { - border-top:0px solid black; - } -} -@media only screen and (min-width:992px) { - body { - font-size: 1.3em; - } - .collapse-sidebar aside.sidebar { - background: #fff; - } -} -.meta { - font-family: $serif; -} -.sticky { - position: fixed; - width:100%; - left: 0; - top: 0; - z-index: 100; -} -::-webkit-input-placeholder { - color: $link-color; -} -:-moz-placeholder { /* Firefox 18- */ - color: $link-color; -} -::-moz-placeholder { /* Firefox 19+ */ - color: $link-color; -} -:-ms-input-placeholder { - color: $link-color; -} - -.highlight, html .gist .gist-file .gist-syntax .gist-highlight { - table { - margin: 0; - td { - padding: 0; - &.code { width: 100%; } - } - } - border: 1px solid $pre-border !important; -} diff --git a/sass/fontawesome/_core.scss b/sass/fontawesome/_core.scss deleted file mode 100644 index 0189c73dfb6a..000000000000 --- a/sass/fontawesome/_core.scss +++ /dev/null @@ -1,129 +0,0 @@ -/* FONT AWESOME CORE - * -------------------------- */ - -[class^="icon-"], -[class*=" icon-"] { - @include icon-FontAwesome(); -} - -[class^="icon-"]:before, -[class*=" icon-"]:before { - text-decoration: inherit; - display: inline-block; - speak: none; -} - -/* makes the font 33% larger relative to the icon container */ -.icon-large:before { - vertical-align: -10%; - font-size: (4em/3); -} - -/* makes sure icons active on rollover in links */ -a { - [class^="icon-"], - [class*=" icon-"] { - display: inline; - } -} - -/* increased font size for icon-large */ -[class^="icon-"], -[class*=" icon-"] { - &.icon-fixed-width { - display: inline-block; - width: (16em/14); - text-align: right; - padding-right: (4em/14); - &.icon-large { - width: (20em/14); - } - } -} - -.icons-ul { - margin-left: $icons-li-width; - list-style-type: none; - - > li { position: relative; } - - .icon-li { - position: absolute; - left: -$icons-li-width; - width: $icons-li-width; - text-align: center; - line-height: inherit; - } -} - -// allows usage of the hide class directly on font awesome icons -[class^="icon-"], -[class*=" icon-"] { - &.hide { - display: none; - } -} - -.icon-muted { color: $iconMuted; } -.icon-light { color: $iconLight; } -.icon-dark { color: $iconDark; } - -// Icon Borders -// ------------------------- - -.icon-border { - border: solid 1px $borderColor; - padding: .2em .25em .15em; - @include border-radius(3px); -} - -// Icon Sizes -// ------------------------- - -.icon-2x { - font-size: 2em; - &.icon-border { - border-width: 2px; - @include border-radius(4px); - } -} -.icon-3x { - font-size: 3em; - &.icon-border { - border-width: 3px; - @include border-radius(5px); - } -} -.icon-4x { - font-size: 4em; - &.icon-border { - border-width: 4px; - @include border-radius(6px); - } -} - -.icon-5x { - font-size: 5em; - &.icon-border { - border-width: 5px; - @include border-radius(7px); - } -} - - -// Floats & Margins -// ------------------------- - -// Quick floats -.pull-right { float: right; } -.pull-left { float: left; } - -[class^="icon-"], -[class*=" icon-"] { - &.pull-left { - margin-right: .3em; - } - &.pull-right { - margin-left: .3em; - } -} diff --git a/sass/fontawesome/_extras.scss b/sass/fontawesome/_extras.scss deleted file mode 100644 index 9a25845d8def..000000000000 --- a/sass/fontawesome/_extras.scss +++ /dev/null @@ -1,93 +0,0 @@ -/* EXTRAS - * -------------------------- */ - -/* Stacked and layered icon */ -@include icon-stack(); - -/* Animated rotating icon */ -.icon-spin { - display: inline-block; - -moz-animation: spin 2s infinite linear; - -o-animation: spin 2s infinite linear; - -webkit-animation: spin 2s infinite linear; - animation: spin 2s infinite linear; -} - -/* Prevent stack and spinners from being taken inline when inside a link */ -a .icon-stack, -a .icon-spin { - display: inline-block; - text-decoration: none; -} - -@-moz-keyframes spin { - 0% { -moz-transform: rotate(0deg); } - 100% { -moz-transform: rotate(359deg); } -} -@-webkit-keyframes spin { - 0% { -webkit-transform: rotate(0deg); } - 100% { -webkit-transform: rotate(359deg); } -} -@-o-keyframes spin { - 0% { -o-transform: rotate(0deg); } - 100% { -o-transform: rotate(359deg); } -} -@-ms-keyframes spin { - 0% { -ms-transform: rotate(0deg); } - 100% { -ms-transform: rotate(359deg); } -} -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(359deg); } -} - -/* Icon rotations and mirroring */ -.icon-rotate-90:before { - -webkit-transform: rotate(90deg); - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -o-transform: rotate(90deg); - transform: rotate(90deg); - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -} - -.icon-rotate-180:before { - -webkit-transform: rotate(180deg); - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -o-transform: rotate(180deg); - transform: rotate(180deg); - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -} - -.icon-rotate-270:before { - -webkit-transform: rotate(270deg); - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -o-transform: rotate(270deg); - transform: rotate(270deg); - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -} - -.icon-flip-horizontal:before { - -webkit-transform: scale(-1, 1); - -moz-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - -o-transform: scale(-1, 1); - transform: scale(-1, 1); -} - -.icon-flip-vertical:before { - -webkit-transform: scale(1, -1); - -moz-transform: scale(1, -1); - -ms-transform: scale(1, -1); - -o-transform: scale(1, -1); - transform: scale(1, -1); -} - -/* ensure rotation occurs inside anchor tags */ -a { - .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical { - &:before { display: inline-block; } - } -} diff --git a/sass/fontawesome/_font-awesome.scss b/sass/fontawesome/_font-awesome.scss deleted file mode 100644 index 379dfd00f06c..000000000000 --- a/sass/fontawesome/_font-awesome.scss +++ /dev/null @@ -1,32 +0,0 @@ -/*! - * Font Awesome 3.2.1 - * the iconic font designed for Bootstrap - * ------------------------------------------------------------------------------ - * The full suite of pictographic icons, examples, and documentation can be - * found at http://fontawesome.io. Stay up to date on Twitter at - * http://twitter.com/fontawesome. - * - * License - * ------------------------------------------------------------------------------ - * - The Font Awesome font is licensed under SIL OFL 1.1 - - * http://scripts.sil.org/OFL - * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - - * http://opensource.org/licenses/mit-license.html - * - Font Awesome documentation licensed under CC BY 3.0 - - * http://creativecommons.org/licenses/by/3.0/ - * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: - * "Font Awesome by Dave Gandy - http://fontawesome.io" - * - * Author - Dave Gandy - * ------------------------------------------------------------------------------ - * Email: dave@fontawesome.io - * Twitter: http://twitter.com/davegandy - * Work: Lead Product Designer @ Kyruus - http://kyruus.com - */ - -@import "variables"; -@import "mixins"; -@import "path"; -@import "core"; -@import "extras"; -@import "icons"; diff --git a/sass/fontawesome/_icons.scss b/sass/fontawesome/_icons.scss deleted file mode 100644 index eefda0c9efe0..000000000000 --- a/sass/fontawesome/_icons.scss +++ /dev/null @@ -1,381 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - * readers do not read off random characters that represent icons */ - -.icon-glass:before { content: $glass; } -.icon-music:before { content: $music; } -.icon-search:before { content: $search; } -.icon-envelope-alt:before { content: $envelope-alt; } -.icon-heart:before { content: $heart; } -.icon-star:before { content: $star; } -.icon-star-empty:before { content: $star-empty; } -.icon-user:before { content: $user; } -.icon-film:before { content: $film; } -.icon-th-large:before { content: $th-large; } -.icon-th:before { content: $th; } -.icon-th-list:before { content: $th-list; } -.icon-ok:before { content: $ok; } -.icon-remove:before { content: $remove; } -.icon-zoom-in:before { content: $zoom-in; } -.icon-zoom-out:before { content: $zoom-out; } -.icon-power-off:before, -.icon-off:before { content: $off; } -.icon-signal:before { content: $signal; } -.icon-gear:before, -.icon-cog:before { content: $cog; } -.icon-trash:before { content: $trash; } -.icon-home:before { content: $home; } -.icon-file-alt:before { content: $file-alt; } -.icon-time:before { content: $time; } -.icon-road:before { content: $road; } -.icon-download-alt:before { content: $download-alt; } -.icon-download:before { content: $download; } -.icon-upload:before { content: $upload; } -.icon-inbox:before { content: $inbox; } -.icon-play-circle:before { content: $play-circle; } -.icon-rotate-right:before, -.icon-repeat:before { content: $repeat; } -.icon-refresh:before { content: $refresh; } -.icon-list-alt:before { content: $list-alt; } -.icon-lock:before { content: $lock; } -.icon-flag:before { content: $flag; } -.icon-headphones:before { content: $headphones; } -.icon-volume-off:before { content: $volume-off; } -.icon-volume-down:before { content: $volume-down; } -.icon-volume-up:before { content: $volume-up; } -.icon-qrcode:before { content: $qrcode; } -.icon-barcode:before { content: $barcode; } -.icon-tag:before { content: $tag; } -.icon-tags:before { content: $tags; } -.icon-book:before { content: $book; } -.icon-bookmark:before { content: $bookmark; } -.icon-print:before { content: $print; } -.icon-camera:before { content: $camera; } -.icon-font:before { content: $font; } -.icon-bold:before { content: $bold; } -.icon-italic:before { content: $italic; } -.icon-text-height:before { content: $text-height; } -.icon-text-width:before { content: $text-width; } -.icon-align-left:before { content: $align-left; } -.icon-align-center:before { content: $align-center; } -.icon-align-right:before { content: $align-right; } -.icon-align-justify:before { content: $align-justify; } -.icon-list:before { content: $list; } -.icon-indent-left:before { content: $indent-left; } -.icon-indent-right:before { content: $indent-right; } -.icon-facetime-video:before { content: $facetime-video; } -.icon-picture:before { content: $picture; } -.icon-pencil:before { content: $pencil; } -.icon-map-marker:before { content: $map-marker; } -.icon-adjust:before { content: $adjust; } -.icon-tint:before { content: $tint; } -.icon-edit:before { content: $edit; } -.icon-share:before { content: $share; } -.icon-check:before { content: $check; } -.icon-move:before { content: $move; } -.icon-step-backward:before { content: $step-backward; } -.icon-fast-backward:before { content: $fast-backward; } -.icon-backward:before { content: $backward; } -.icon-play:before { content: $play; } -.icon-pause:before { content: $pause; } -.icon-stop:before { content: $stop; } -.icon-forward:before { content: $forward; } -.icon-fast-forward:before { content: $fast-forward; } -.icon-step-forward:before { content: $step-forward; } -.icon-eject:before { content: $eject; } -.icon-chevron-left:before { content: $chevron-left; } -.icon-chevron-right:before { content: $chevron-right; } -.icon-plus-sign:before { content: $plus-sign; } -.icon-minus-sign:before { content: $minus-sign; } -.icon-remove-sign:before { content: $remove-sign; } -.icon-ok-sign:before { content: $ok-sign; } -.icon-question-sign:before { content: $question-sign; } -.icon-info-sign:before { content: $info-sign; } -.icon-screenshot:before { content: $screenshot; } -.icon-remove-circle:before { content: $remove-circle; } -.icon-ok-circle:before { content: $ok-circle; } -.icon-ban-circle:before { content: $ban-circle; } -.icon-arrow-left:before { content: $arrow-left; } -.icon-arrow-right:before { content: $arrow-right; } -.icon-arrow-up:before { content: $arrow-up; } -.icon-arrow-down:before { content: $arrow-down; } -.icon-mail-forward:before, -.icon-share-alt:before { content: $share-alt; } -.icon-resize-full:before { content: $resize-full; } -.icon-resize-small:before { content: $resize-small; } -.icon-plus:before { content: $plus; } -.icon-minus:before { content: $minus; } -.icon-asterisk:before { content: $asterisk; } -.icon-exclamation-sign:before { content: $exclamation-sign; } -.icon-gift:before { content: $gift; } -.icon-leaf:before { content: $leaf; } -.icon-fire:before { content: $fire; } -.icon-eye-open:before { content: $eye-open; } -.icon-eye-close:before { content: $eye-close; } -.icon-warning-sign:before { content: $warning-sign; } -.icon-plane:before { content: $plane; } -.icon-calendar:before { content: $calendar; } -.icon-random:before { content: $random; } -.icon-comment:before { content: $comment; } -.icon-magnet:before { content: $magnet; } -.icon-chevron-up:before { content: $chevron-up; } -.icon-chevron-down:before { content: $chevron-down; } -.icon-retweet:before { content: $retweet; } -.icon-shopping-cart:before { content: $shopping-cart; } -.icon-folder-close:before { content: $folder-close; } -.icon-folder-open:before { content: $folder-open; } -.icon-resize-vertical:before { content: $resize-vertical; } -.icon-resize-horizontal:before { content: $resize-horizontal; } -.icon-bar-chart:before { content: $bar-chart; } -.icon-twitter-sign:before { content: $twitter-sign; } -.icon-facebook-sign:before { content: $facebook-sign; } -.icon-camera-retro:before { content: $camera-retro; } -.icon-key:before { content: $key; } -.icon-gears:before, -.icon-cogs:before { content: $cogs; } -.icon-comments:before { content: $comments; } -.icon-thumbs-up-alt:before { content: $thumbs-up-alt; } -.icon-thumbs-down-alt:before { content: $thumbs-down-alt; } -.icon-star-half:before { content: $star-half; } -.icon-heart-empty:before { content: $heart-empty; } -.icon-signout:before { content: $signout; } -.icon-linkedin-sign:before { content: $linkedin-sign; } -.icon-pushpin:before { content: $pushpin; } -.icon-external-link:before { content: $external-link; } -.icon-signin:before { content: $signin; } -.icon-trophy:before { content: $trophy; } -.icon-github-sign:before { content: $github-sign; } -.icon-upload-alt:before { content: $upload-alt; } -.icon-lemon:before { content: $lemon; } -.icon-phone:before { content: $phone; } -.icon-unchecked:before, -.icon-check-empty:before { content: $check-empty; } -.icon-bookmark-empty:before { content: $bookmark-empty; } -.icon-phone-sign:before { content: $phone-sign; } -.icon-twitter:before { content: $twitter; } -.icon-facebook:before { content: $facebook; } -.icon-github:before { content: $github; } -.icon-unlock:before { content: $unlock; } -.icon-credit-card:before { content: $credit-card; } -.icon-rss:before { content: $rss; } -.icon-hdd:before { content: $hdd; } -.icon-bullhorn:before { content: $bullhorn; } -.icon-bell:before { content: $bell; } -.icon-certificate:before { content: $certificate; } -.icon-hand-right:before { content: $hand-right; } -.icon-hand-left:before { content: $hand-left; } -.icon-hand-up:before { content: $hand-up; } -.icon-hand-down:before { content: $hand-down; } -.icon-circle-arrow-left:before { content: $circle-arrow-left; } -.icon-circle-arrow-right:before { content: $circle-arrow-right; } -.icon-circle-arrow-up:before { content: $circle-arrow-up; } -.icon-circle-arrow-down:before { content: $circle-arrow-down; } -.icon-globe:before { content: $globe; } -.icon-wrench:before { content: $wrench; } -.icon-tasks:before { content: $tasks; } -.icon-filter:before { content: $filter; } -.icon-briefcase:before { content: $briefcase; } -.icon-fullscreen:before { content: $fullscreen; } -.icon-group:before { content: $group; } -.icon-link:before { content: $link; } -.icon-cloud:before { content: $cloud; } -.icon-beaker:before { content: $beaker; } -.icon-cut:before { content: $cut; } -.icon-copy:before { content: $copy; } -.icon-paperclip:before, -.icon-paper-clip:before { content: $paper-clip; } -.icon-save:before { content: $save; } -.icon-sign-blank:before { content: $sign-blank; } -.icon-reorder:before { content: $reorder; } -.icon-list-ul:before { content: $list-ul; } -.icon-list-ol:before { content: $list-ol; } -.icon-strikethrough:before { content: $strikethrough; } -.icon-underline:before { content: $underline; } -.icon-table:before { content: $table; } -.icon-magic:before { content: $magic; } -.icon-truck:before { content: $truck; } -.icon-pinterest:before { content: $pinterest; } -.icon-pinterest-sign:before { content: $pinterest-sign; } -.icon-google-plus-sign:before { content: $google-plus-sign; } -.icon-google-plus:before { content: $google-plus; } -.icon-money:before { content: $money; } -.icon-caret-down:before { content: $caret-down; } -.icon-caret-up:before { content: $caret-up; } -.icon-caret-left:before { content: $caret-left; } -.icon-caret-right:before { content: $caret-right; } -.icon-columns:before { content: $columns; } -.icon-sort:before { content: $sort; } -.icon-sort-down:before { content: $sort-down; } -.icon-sort-up:before { content: $sort-up; } -.icon-envelope:before { content: $envelope; } -.icon-linkedin:before { content: $linkedin; } -.icon-rotate-left:before, -.icon-undo:before { content: $undo; } -.icon-legal:before { content: $legal; } -.icon-dashboard:before { content: $dashboard; } -.icon-comment-alt:before { content: $comment-alt; } -.icon-comments-alt:before { content: $comments-alt; } -.icon-bolt:before { content: $bolt; } -.icon-sitemap:before { content: $sitemap; } -.icon-umbrella:before { content: $umbrella; } -.icon-paste:before { content: $paste; } -.icon-lightbulb:before { content: $lightbulb; } -.icon-exchange:before { content: $exchange; } -.icon-cloud-download:before { content: $cloud-download; } -.icon-cloud-upload:before { content: $cloud-upload; } -.icon-user-md:before { content: $user-md; } -.icon-stethoscope:before { content: $stethoscope; } -.icon-suitcase:before { content: $suitcase; } -.icon-bell-alt:before { content: $bell-alt; } -.icon-coffee:before { content: $coffee; } -.icon-food:before { content: $food; } -.icon-file-text-alt:before { content: $file-text-alt; } -.icon-building:before { content: $building; } -.icon-hospital:before { content: $hospital; } -.icon-ambulance:before { content: $ambulance; } -.icon-medkit:before { content: $medkit; } -.icon-fighter-jet:before { content: $fighter-jet; } -.icon-beer:before { content: $beer; } -.icon-h-sign:before { content: $h-sign; } -.icon-plus-sign-alt:before { content: $plus-sign-alt; } -.icon-double-angle-left:before { content: $double-angle-left; } -.icon-double-angle-right:before { content: $double-angle-right; } -.icon-double-angle-up:before { content: $double-angle-up; } -.icon-double-angle-down:before { content: $double-angle-down; } -.icon-angle-left:before { content: $angle-left; } -.icon-angle-right:before { content: $angle-right; } -.icon-angle-up:before { content: $angle-up; } -.icon-angle-down:before { content: $angle-down; } -.icon-desktop:before { content: $desktop; } -.icon-laptop:before { content: $laptop; } -.icon-tablet:before { content: $tablet; } -.icon-mobile-phone:before { content: $mobile-phone; } -.icon-circle-blank:before { content: $circle-blank; } -.icon-quote-left:before { content: $quote-left; } -.icon-quote-right:before { content: $quote-right; } -.icon-spinner:before { content: $spinner; } -.icon-circle:before { content: $circle; } -.icon-mail-reply:before, -.icon-reply:before { content: $reply; } -.icon-github-alt:before { content: $github-alt; } -.icon-folder-close-alt:before { content: $folder-close-alt; } -.icon-folder-open-alt:before { content: $folder-open-alt; } -.icon-expand-alt:before { content: $expand-alt; } -.icon-collapse-alt:before { content: $collapse-alt; } -.icon-smile:before { content: $smile; } -.icon-frown:before { content: $frown; } -.icon-meh:before { content: $meh; } -.icon-gamepad:before { content: $gamepad; } -.icon-keyboard:before { content: $keyboard; } -.icon-flag-alt:before { content: $flag-alt; } -.icon-flag-checkered:before { content: $flag-checkered; } -.icon-terminal:before { content: $terminal; } -.icon-code:before { content: $code; } -.icon-reply-all:before { content: $reply-all; } -.icon-mail-reply-all:before { content: $mail-reply-all; } -.icon-star-half-full:before, -.icon-star-half-empty:before { content: $star-half-empty; } -.icon-location-arrow:before { content: $location-arrow; } -.icon-crop:before { content: $crop; } -.icon-code-fork:before { content: $code-fork; } -.icon-unlink:before { content: $unlink; } -.icon-question:before { content: $question; } -.icon-info:before { content: $info; } -.icon-exclamation:before { content: $exclamation; } -.icon-superscript:before { content: $superscript; } -.icon-subscript:before { content: $subscript; } -.icon-eraser:before { content: $eraser; } -.icon-puzzle-piece:before { content: $puzzle-piece; } -.icon-microphone:before { content: $microphone; } -.icon-microphone-off:before { content: $microphone-off; } -.icon-shield:before { content: $shield; } -.icon-calendar-empty:before { content: $calendar-empty; } -.icon-fire-extinguisher:before { content: $fire-extinguisher; } -.icon-rocket:before { content: $rocket; } -.icon-maxcdn:before { content: $maxcdn; } -.icon-chevron-sign-left:before { content: $chevron-sign-left; } -.icon-chevron-sign-right:before { content: $chevron-sign-right; } -.icon-chevron-sign-up:before { content: $chevron-sign-up; } -.icon-chevron-sign-down:before { content: $chevron-sign-down; } -.icon-html5:before { content: $html5; } -.icon-css3:before { content: $css3; } -.icon-anchor:before { content: $anchor; } -.icon-unlock-alt:before { content: $unlock-alt; } -.icon-bullseye:before { content: $bullseye; } -.icon-ellipsis-horizontal:before { content: $ellipsis-horizontal; } -.icon-ellipsis-vertical:before { content: $ellipsis-vertical; } -.icon-rss-sign:before { content: $rss-sign; } -.icon-play-sign:before { content: $play-sign; } -.icon-ticket:before { content: $ticket; } -.icon-minus-sign-alt:before { content: $minus-sign-alt; } -.icon-check-minus:before { content: $check-minus; } -.icon-level-up:before { content: $level-up; } -.icon-level-down:before { content: $level-down; } -.icon-check-sign:before { content: $check-sign; } -.icon-edit-sign:before { content: $edit-sign; } -.icon-external-link-sign:before { content: $external-link-sign; } -.icon-share-sign:before { content: $share-sign; } -.icon-compass:before { content: $compass; } -.icon-collapse:before { content: $collapse; } -.icon-collapse-top:before { content: $collapse-top; } -.icon-expand:before { content: $expand; } -.icon-euro:before, -.icon-eur:before { content: $eur; } -.icon-gbp:before { content: $gbp; } -.icon-dollar:before, -.icon-usd:before { content: $usd; } -.icon-rupee:before, -.icon-inr:before { content: $inr; } -.icon-yen:before, -.icon-jpy:before { content: $jpy; } -.icon-renminbi:before, -.icon-cny:before { content: $cny; } -.icon-won:before, -.icon-krw:before { content: $krw; } -.icon-bitcoin:before, -.icon-btc:before { content: $btc; } -.icon-file:before { content: $file; } -.icon-file-text:before { content: $file-text; } -.icon-sort-by-alphabet:before { content: $sort-by-alphabet; } -.icon-sort-by-alphabet-alt:before { content: $sort-by-alphabet-alt; } -.icon-sort-by-attributes:before { content: $sort-by-attributes; } -.icon-sort-by-attributes-alt:before { content: $sort-by-attributes-alt; } -.icon-sort-by-order:before { content: $sort-by-order; } -.icon-sort-by-order-alt:before { content: $sort-by-order-alt; } -.icon-thumbs-up:before { content: $thumbs-up; } -.icon-thumbs-down:before { content: $thumbs-down; } -.icon-youtube-sign:before { content: $youtube-sign; } -.icon-youtube:before { content: $youtube; } -.icon-xing:before { content: $xing; } -.icon-xing-sign:before { content: $xing-sign; } -.icon-youtube-play:before { content: $youtube-play; } -.icon-dropbox:before { content: $dropbox; } -.icon-stackexchange:before { content: $stackexchange; } -.icon-instagram:before { content: $instagram; } -.icon-flickr:before { content: $flickr; } -.icon-adn:before { content: $adn; } -.icon-bitbucket:before { content: $bitbucket; } -.icon-bitbucket-sign:before { content: $bitbucket-sign; } -.icon-tumblr:before { content: $tumblr; } -.icon-tumblr-sign:before { content: $tumblr-sign; } -.icon-long-arrow-down:before { content: $long-arrow-down; } -.icon-long-arrow-up:before { content: $long-arrow-up; } -.icon-long-arrow-left:before { content: $long-arrow-left; } -.icon-long-arrow-right:before { content: $long-arrow-right; } -.icon-apple:before { content: $apple; } -.icon-windows:before { content: $windows; } -.icon-android:before { content: $android; } -.icon-linux:before { content: $linux; } -.icon-dribbble:before { content: $dribbble; } -.icon-skype:before { content: $skype; } -.icon-foursquare:before { content: $foursquare; } -.icon-trello:before { content: $trello; } -.icon-female:before { content: $female; } -.icon-male:before { content: $male; } -.icon-gittip:before { content: $gittip; } -.icon-sun:before { content: $sun; } -.icon-moon:before { content: $moon; } -.icon-archive:before { content: $archive; } -.icon-bug:before { content: $bug; } -.icon-vk:before { content: $vk; } -.icon-weibo:before { content: $weibo; } -.icon-renren:before { content: $renren; } diff --git a/sass/fontawesome/_mixins.scss b/sass/fontawesome/_mixins.scss deleted file mode 100644 index ca9c5931b3e0..000000000000 --- a/sass/fontawesome/_mixins.scss +++ /dev/null @@ -1,48 +0,0 @@ -// Mixins -// -------------------------- - -@mixin icon($icon) { - @include icon-FontAwesome(); - content: $icon; -} - -@mixin icon-FontAwesome() { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - text-decoration: inherit; - -webkit-font-smoothing: antialiased; - *margin-right: .3em; // fixes ie7 issues -} - -@mixin border-radius($radius) { - -webkit-border-radius: $radius; - -moz-border-radius: $radius; - border-radius: $radius; -} - -@mixin icon-stack($width: 2em, $height: 2em, $top-font-size: 1em, $base-font-size: 2em) { - .icon-stack { - position: relative; - display: inline-block; - width: $width; - height: $height; - line-height: $width; - vertical-align: -35%; - [class^="icon-"], - [class*=" icon-"] { - display: block; - text-align: center; - position: absolute; - width: 100%; - height: 100%; - font-size: $top-font-size; - line-height: inherit; - *line-height: $height; - } - .icon-stack-base { - font-size: $base-font-size; - *line-height: #{$height / $base-font-size}em; - } - } -} diff --git a/sass/fontawesome/_path.scss b/sass/fontawesome/_path.scss deleted file mode 100644 index c8deb15543b8..000000000000 --- a/sass/fontawesome/_path.scss +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?v=#{$FontAwesomeVersion}'); - src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=#{$FontAwesomeVersion}') format('embedded-opentype'), - url('#{$FontAwesomePath}/fontawesome-webfont.woff?v=#{$FontAwesomeVersion}') format('woff'), - url('#{$FontAwesomePath}/fontawesome-webfont.ttf?v=#{$FontAwesomeVersion}') format('truetype'), - url('#{$FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=#{$FontAwesomeVersion}') format('svg'); -// src: url('#{$FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; - font-display: swap; -} diff --git a/sass/fontawesome/_variables.scss b/sass/fontawesome/_variables.scss deleted file mode 100644 index 7d6bbc5b1d6f..000000000000 --- a/sass/fontawesome/_variables.scss +++ /dev/null @@ -1,734 +0,0 @@ -// Variables -// -------------------------- - -$FontAwesomePath: "../font" !default; -$FontAwesomeVersion: "3.2.1" !default; -$borderColor: #eeeeee !default; -$iconMuted: #eeeeee !default; -$iconLight: white !default; -$iconDark: #333333 !default; -$icons-li-width: (30em/14); - - -$glass: "\f000"; - -$music: "\f001"; - -$search: "\f002"; - -$envelope-alt: "\f003"; - -$heart: "\f004"; - -$star: "\f005"; - -$star-empty: "\f006"; - -$user: "\f007"; - -$film: "\f008"; - -$th-large: "\f009"; - -$th: "\f00a"; - -$th-list: "\f00b"; - -$ok: "\f00c"; - -$remove: "\f00d"; - -$zoom-in: "\f00e"; - -$zoom-out: "\f010"; - -$off: "\f011"; - -$signal: "\f012"; - -$cog: "\f013"; - -$trash: "\f014"; - -$home: "\f015"; - -$file-alt: "\f016"; - -$time: "\f017"; - -$road: "\f018"; - -$download-alt: "\f019"; - -$download: "\f01a"; - -$upload: "\f01b"; - -$inbox: "\f01c"; - -$play-circle: "\f01d"; - -$repeat: "\f01e"; - -$refresh: "\f021"; - -$list-alt: "\f022"; - -$lock: "\f023"; - -$flag: "\f024"; - -$headphones: "\f025"; - -$volume-off: "\f026"; - -$volume-down: "\f027"; - -$volume-up: "\f028"; - -$qrcode: "\f029"; - -$barcode: "\f02a"; - -$tag: "\f02b"; - -$tags: "\f02c"; - -$book: "\f02d"; - -$bookmark: "\f02e"; - -$print: "\f02f"; - -$camera: "\f030"; - -$font: "\f031"; - -$bold: "\f032"; - -$italic: "\f033"; - -$text-height: "\f034"; - -$text-width: "\f035"; - -$align-left: "\f036"; - -$align-center: "\f037"; - -$align-right: "\f038"; - -$align-justify: "\f039"; - -$list: "\f03a"; - -$indent-left: "\f03b"; - -$indent-right: "\f03c"; - -$facetime-video: "\f03d"; - -$picture: "\f03e"; - -$pencil: "\f040"; - -$map-marker: "\f041"; - -$adjust: "\f042"; - -$tint: "\f043"; - -$edit: "\f044"; - -$share: "\f045"; - -$check: "\f046"; - -$move: "\f047"; - -$step-backward: "\f048"; - -$fast-backward: "\f049"; - -$backward: "\f04a"; - -$play: "\f04b"; - -$pause: "\f04c"; - -$stop: "\f04d"; - -$forward: "\f04e"; - -$fast-forward: "\f050"; - -$step-forward: "\f051"; - -$eject: "\f052"; - -$chevron-left: "\f053"; - -$chevron-right: "\f054"; - -$plus-sign: "\f055"; - -$minus-sign: "\f056"; - -$remove-sign: "\f057"; - -$ok-sign: "\f058"; - -$question-sign: "\f059"; - -$info-sign: "\f05a"; - -$screenshot: "\f05b"; - -$remove-circle: "\f05c"; - -$ok-circle: "\f05d"; - -$ban-circle: "\f05e"; - -$arrow-left: "\f060"; - -$arrow-right: "\f061"; - -$arrow-up: "\f062"; - -$arrow-down: "\f063"; - -$share-alt: "\f064"; - -$resize-full: "\f065"; - -$resize-small: "\f066"; - -$plus: "\f067"; - -$minus: "\f068"; - -$asterisk: "\f069"; - -$exclamation-sign: "\f06a"; - -$gift: "\f06b"; - -$leaf: "\f06c"; - -$fire: "\f06d"; - -$eye-open: "\f06e"; - -$eye-close: "\f070"; - -$warning-sign: "\f071"; - -$plane: "\f072"; - -$calendar: "\f073"; - -$random: "\f074"; - -$comment: "\f075"; - -$magnet: "\f076"; - -$chevron-up: "\f077"; - -$chevron-down: "\f078"; - -$retweet: "\f079"; - -$shopping-cart: "\f07a"; - -$folder-close: "\f07b"; - -$folder-open: "\f07c"; - -$resize-vertical: "\f07d"; - -$resize-horizontal: "\f07e"; - -$bar-chart: "\f080"; - -$twitter-sign: "\f081"; - -$facebook-sign: "\f082"; - -$camera-retro: "\f083"; - -$key: "\f084"; - -$cogs: "\f085"; - -$comments: "\f086"; - -$thumbs-up-alt: "\f087"; - -$thumbs-down-alt: "\f088"; - -$star-half: "\f089"; - -$heart-empty: "\f08a"; - -$signout: "\f08b"; - -$linkedin-sign: "\f08c"; - -$pushpin: "\f08d"; - -$external-link: "\f08e"; - -$signin: "\f090"; - -$trophy: "\f091"; - -$github-sign: "\f092"; - -$upload-alt: "\f093"; - -$lemon: "\f094"; - -$phone: "\f095"; - -$check-empty: "\f096"; - -$bookmark-empty: "\f097"; - -$phone-sign: "\f098"; - -$twitter: "\f099"; - -$facebook: "\f09a"; - -$github: "\f09b"; - -$unlock: "\f09c"; - -$credit-card: "\f09d"; - -$rss: "\f09e"; - -$hdd: "\f0a0"; - -$bullhorn: "\f0a1"; - -$bell: "\f0a2"; - -$certificate: "\f0a3"; - -$hand-right: "\f0a4"; - -$hand-left: "\f0a5"; - -$hand-up: "\f0a6"; - -$hand-down: "\f0a7"; - -$circle-arrow-left: "\f0a8"; - -$circle-arrow-right: "\f0a9"; - -$circle-arrow-up: "\f0aa"; - -$circle-arrow-down: "\f0ab"; - -$globe: "\f0ac"; - -$wrench: "\f0ad"; - -$tasks: "\f0ae"; - -$filter: "\f0b0"; - -$briefcase: "\f0b1"; - -$fullscreen: "\f0b2"; - -$group: "\f0c0"; - -$link: "\f0c1"; - -$cloud: "\f0c2"; - -$beaker: "\f0c3"; - -$cut: "\f0c4"; - -$copy: "\f0c5"; - -$paper-clip: "\f0c6"; - -$save: "\f0c7"; - -$sign-blank: "\f0c8"; - -$reorder: "\f0c9"; - -$list-ul: "\f0ca"; - -$list-ol: "\f0cb"; - -$strikethrough: "\f0cc"; - -$underline: "\f0cd"; - -$table: "\f0ce"; - -$magic: "\f0d0"; - -$truck: "\f0d1"; - -$pinterest: "\f0d2"; - -$pinterest-sign: "\f0d3"; - -$google-plus-sign: "\f0d4"; - -$google-plus: "\f0d5"; - -$money: "\f0d6"; - -$caret-down: "\f0d7"; - -$caret-up: "\f0d8"; - -$caret-left: "\f0d9"; - -$caret-right: "\f0da"; - -$columns: "\f0db"; - -$sort: "\f0dc"; - -$sort-down: "\f0dd"; - -$sort-up: "\f0de"; - -$envelope: "\f0e0"; - -$linkedin: "\f0e1"; - -$undo: "\f0e2"; - -$legal: "\f0e3"; - -$dashboard: "\f0e4"; - -$comment-alt: "\f0e5"; - -$comments-alt: "\f0e6"; - -$bolt: "\f0e7"; - -$sitemap: "\f0e8"; - -$umbrella: "\f0e9"; - -$paste: "\f0ea"; - -$lightbulb: "\f0eb"; - -$exchange: "\f0ec"; - -$cloud-download: "\f0ed"; - -$cloud-upload: "\f0ee"; - -$user-md: "\f0f0"; - -$stethoscope: "\f0f1"; - -$suitcase: "\f0f2"; - -$bell-alt: "\f0f3"; - -$coffee: "\f0f4"; - -$food: "\f0f5"; - -$file-text-alt: "\f0f6"; - -$building: "\f0f7"; - -$hospital: "\f0f8"; - -$ambulance: "\f0f9"; - -$medkit: "\f0fa"; - -$fighter-jet: "\f0fb"; - -$beer: "\f0fc"; - -$h-sign: "\f0fd"; - -$plus-sign-alt: "\f0fe"; - -$double-angle-left: "\f100"; - -$double-angle-right: "\f101"; - -$double-angle-up: "\f102"; - -$double-angle-down: "\f103"; - -$angle-left: "\f104"; - -$angle-right: "\f105"; - -$angle-up: "\f106"; - -$angle-down: "\f107"; - -$desktop: "\f108"; - -$laptop: "\f109"; - -$tablet: "\f10a"; - -$mobile-phone: "\f10b"; - -$circle-blank: "\f10c"; - -$quote-left: "\f10d"; - -$quote-right: "\f10e"; - -$spinner: "\f110"; - -$circle: "\f111"; - -$reply: "\f112"; - -$github-alt: "\f113"; - -$folder-close-alt: "\f114"; - -$folder-open-alt: "\f115"; - -$expand-alt: "\f116"; - -$collapse-alt: "\f117"; - -$smile: "\f118"; - -$frown: "\f119"; - -$meh: "\f11a"; - -$gamepad: "\f11b"; - -$keyboard: "\f11c"; - -$flag-alt: "\f11d"; - -$flag-checkered: "\f11e"; - -$terminal: "\f120"; - -$code: "\f121"; - -$reply-all: "\f122"; - -$mail-reply-all: "\f122"; - -$star-half-empty: "\f123"; - -$location-arrow: "\f124"; - -$crop: "\f125"; - -$code-fork: "\f126"; - -$unlink: "\f127"; - -$question: "\f128"; - -$info: "\f129"; - -$exclamation: "\f12a"; - -$superscript: "\f12b"; - -$subscript: "\f12c"; - -$eraser: "\f12d"; - -$puzzle-piece: "\f12e"; - -$microphone: "\f130"; - -$microphone-off: "\f131"; - -$shield: "\f132"; - -$calendar-empty: "\f133"; - -$fire-extinguisher: "\f134"; - -$rocket: "\f135"; - -$maxcdn: "\f136"; - -$chevron-sign-left: "\f137"; - -$chevron-sign-right: "\f138"; - -$chevron-sign-up: "\f139"; - -$chevron-sign-down: "\f13a"; - -$html5: "\f13b"; - -$css3: "\f13c"; - -$anchor: "\f13d"; - -$unlock-alt: "\f13e"; - -$bullseye: "\f140"; - -$ellipsis-horizontal: "\f141"; - -$ellipsis-vertical: "\f142"; - -$rss-sign: "\f143"; - -$play-sign: "\f144"; - -$ticket: "\f145"; - -$minus-sign-alt: "\f146"; - -$check-minus: "\f147"; - -$level-up: "\f148"; - -$level-down: "\f149"; - -$check-sign: "\f14a"; - -$edit-sign: "\f14b"; - -$external-link-sign: "\f14c"; - -$share-sign: "\f14d"; - -$compass: "\f14e"; - -$collapse: "\f150"; - -$collapse-top: "\f151"; - -$expand: "\f152"; - -$eur: "\f153"; - -$gbp: "\f154"; - -$usd: "\f155"; - -$inr: "\f156"; - -$jpy: "\f157"; - -$cny: "\f158"; - -$krw: "\f159"; - -$btc: "\f15a"; - -$file: "\f15b"; - -$file-text: "\f15c"; - -$sort-by-alphabet: "\f15d"; - -$sort-by-alphabet-alt: "\f15e"; - -$sort-by-attributes: "\f160"; - -$sort-by-attributes-alt: "\f161"; - -$sort-by-order: "\f162"; - -$sort-by-order-alt: "\f163"; - -$thumbs-up: "\f164"; - -$thumbs-down: "\f165"; - -$youtube-sign: "\f166"; - -$youtube: "\f167"; - -$xing: "\f168"; - -$xing-sign: "\f169"; - -$youtube-play: "\f16a"; - -$dropbox: "\f16b"; - -$stackexchange: "\f16c"; - -$instagram: "\f16d"; - -$flickr: "\f16e"; - -$adn: "\f170"; - -$bitbucket: "\f171"; - -$bitbucket-sign: "\f172"; - -$tumblr: "\f173"; - -$tumblr-sign: "\f174"; - -$long-arrow-down: "\f175"; - -$long-arrow-up: "\f176"; - -$long-arrow-left: "\f177"; - -$long-arrow-right: "\f178"; - -$apple: "\f179"; - -$windows: "\f17a"; - -$android: "\f17b"; - -$linux: "\f17c"; - -$dribbble: "\f17d"; - -$skype: "\f17e"; - -$foursquare: "\f180"; - -$trello: "\f181"; - -$female: "\f182"; - -$male: "\f183"; - -$gittip: "\f184"; - -$sun: "\f185"; - -$moon: "\f186"; - -$archive: "\f187"; - -$bug: "\f188"; - -$vk: "\f189"; - -$weibo: "\f18a"; - -$renren: "\f18b"; - diff --git a/sass/homeassistant/_homeassistant.scss b/sass/homeassistant/_homeassistant.scss new file mode 100644 index 000000000000..c57729fa2e2f --- /dev/null +++ b/sass/homeassistant/_homeassistant.scss @@ -0,0 +1,44 @@ +@import "variables"; +@import "mixins"; + +@import "../inuitcss/_inuit"; + +@import "base/global"; +@import "base/grid"; +@import "base/header"; +@import "base/navigation"; +@import "base/footer"; +@import "base/syntax"; +@import "base/post"; +@import "base/archive_list"; +@import "base/print"; + +@import "plugins/alert"; +@import "plugins/details"; +@import "plugins/tabbed_block"; +@import "plugins/terminology_tooltip"; +@import "plugins/integration_alert"; + +@import "base/sidebar"; +@import "aside/recent_posts"; +@import "aside/github"; +@import "aside/pinboard"; +@import "aside/social"; + +@import "homepage/home"; +@import "homepage/hero_unit"; +@import "homepage/features"; + +@import "pages/landingpage"; +@import "pages/component_page"; +@import "pages/getting_started"; + +@import "helpers/classes"; +@import "helpers/grid-fix"; + +@import "external/search"; + +// This file overrides all kinds of stuff, it is the old "paulus.scss" file +// Most of what is in here should be moved to the correct file and remoted +// from here. +@import "overrides"; diff --git a/sass/oscailte/_mixins.scss b/sass/homeassistant/_mixins.scss similarity index 100% rename from sass/oscailte/_mixins.scss rename to sass/homeassistant/_mixins.scss diff --git a/sass/homeassistant/_overrides.scss b/sass/homeassistant/_overrides.scss new file mode 100644 index 000000000000..70e83439ab6e --- /dev/null +++ b/sass/homeassistant/_overrides.scss @@ -0,0 +1,1358 @@ +@charset "UTF-8"; + +h1.title.indent { + font-size: 3.5rem; +} +.title.delta, .title.epsilon { + border-bottom: none; + margin-bottom: .75rem; + text-transform: uppercase; + letter-spacing: .05em; + color: $gray; +} + +.title.indent { + &::before { + content: ""; + color: $primary-color; + } +} +@media only screen and (max-width: $menu-collapse) { + html { + font-size: .95rem; + } + 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 { + counter-reset: my-awesome-counter; + list-style: none; + margin-left: 3rem; + } + ol>li { + margin-left: -0.25rem; + counter-increment: my-awesome-counter; + position: relative; + } + ol>li::before { + content: counter(my-awesome-counter); + color: white; + font-size: 1.25rem; + font-weight: 600; + position: absolute; + left: -2.75rem; + top: -.1rem; + line-height: 2rem; + width: 2rem; + height: 2rem; + background: $grayLight; + border-radius: 50%; + text-align: center; + transition: background 1s; + } + ol:hover>li::before { + background: $link-color; + } + ol:hover>li:hover::before { + background: $primary-color; + } +} +ul, ol, dd { + margin-left: 2rem; +} + + +// Better looking menu + +.menu li { + a { + @include box-sizing(border-box); + display: block; + padding: 29px 0px 12px; + margin: 0 14px 27px; + text-decoration: none; + font-size: 14px; + line-height: 1; + } + + iconify-icon { + height: 14px; + margin-top: -2px; + } + + ul { + iconify-icon { + height: 16px; + padding-top: 2px; + padding-right: 8px; + } + } +} + +.menu > li > a { + font-weight: 500; + transition: box-shadow .33s; +} + +.menu > li > a:hover, +.menu > li > a:focus { + background: none; + box-shadow: inset 0px -5px $primary-color; + color: $navigation-color; + padding-bottom: 12px; + 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); +} + +.site-header { + position: relative; + + .site-title { + display: flex; + align-items: center; + font-weight: normal; + } + +} + + +// Page breadcrumbs + +header .breadcrumbs { + color: $grayLight; + font-size: .9rem; + padding-bottom: 24px; + + a { + color: $grayLight; + text-decoration: none !important; + font-weight: 600; + } +} + + +// Integrations page filter + +@media only screen and (min-width: $desk-start) { + #components-page { + .filter-button-group { + max-height: calc(100vh - 200px); + overflow: auto; + } + } +} + +.count { + font-size: .8rem; + background: $grayLighter; + color: $gray; + padding: 1px 4px; + border-radius: 8px; +} + + +// Footer +.page-content>footer { + margin-top: 194px !important; + + .skyline.grid{ + position: relative; + + .grid__item { + background-image: url(/images/footer-skyline.svg); + background-repeat: no-repeat; + background-size: 740px auto; + background-position-x: 24px; + position: absolute; + top: -130px; + height: 130px; + width: calc(100% + 24px); + } + } + + .footer-nav { + padding: 40px 0; + margin: 0 -24px; + text-align: left; + + h4 { + text-transform: uppercase; + font-size: .9rem; + letter-spacing: 0.005em; + margin-bottom: 8px; + } + ul { + padding-bottom: 24px; + } + + .company { + padding-bottom: 24px; + .title { + font-size: 1.5em; + padding-bottom: 24px; + } + + img { + vertical-align: middle; + height: 72px; + } + } + + .socials { + .icons { + margin: -16px 0 16px 0; + iconify-icon { + font-size: 2em; + margin-top: 12px; + padding-right: 8px; + } + } + + @media only screen and (min-width: $desk-start) { + .web-notice { + text-align: right; + + p { + color: $gray; + font-size: .8rem; + line-height: 1.25; + margin-bottom: 16px; + } + } + } + } + + ul { + margin: 0; + list-style: none; + + li { + padding-bottom: 4px; + } + } + } +} + + +@media only screen and (max-width: $menu-collapse) { + .feedback { + margin-bottom: 32px; + } +} + + +// Material Card + +.material-card { + position: relative; + background-color: $white; + border-radius: 16px; + border: 1px solid rgba(0, 0, 0, .12); + transition: box-shadow .5s; + + h1 { + font-family: $heading-font; + -webkit-font-smoothing: antialiased; + font-size: 1.33rem; + font-weight: 600; + letter-spacing: -0.012em; + line-height: 40px; + color: #212121; + margin: -8px 0 0; + } + + &.text { + padding: 24px; + + h1 { + padding: 0px 0px 12px; + } + &>svg { + margin-top: -8px; + margin-right: -8px; + } + } + + .links { + margin-top: 12px; + margin-right: -8px; + margin-bottom: -8px; + font-size: .9rem; + text-align: right; + + a { + background: #e8edf0; + font-family: $heading-font; + text-decoration: none; + font-weight: 650; + text-transform: uppercase; + display: inline-block; + margin: 4px; + padding: 6px 16px; + border-radius: 16px; + } + } + + @media screen and (max-width: 480px) { + .links { + margin-left: 0; + } + } +} + +a.material-card:hover { + z-index: 2; + box-shadow: 0 0 1px rgba(0,0,0,.5), 0 -4px 8px hsla(180, 100%, 50%, .10), 0 32px 64px hsla(207, 100%, 10%, 0.5); +} + + +// 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; + + a { + text-decoration: none !important; + color: #000; + } + } + + .links a { + font-weight: 400; + text-transform: none; + } +} + +.installation-survey { + padding-bottom: 64px; + + h4 { + margin: 0 0 8px !important; + + a { + text-decoration: none !important; + color: #000; + } + } + + p { + margin-bottom: 8px; + } +} + + +.button { + position: relative; + cursor: pointer; + font-family: $heading-font; + font-size: 1.1rem; + font-weight: 650; + padding: 12px 24px; + color: $link-color; + background-color: #e8edf0; + border: none; + text-decoration: none !important; + border-radius: 24px; + margin: 8px 0; + transition: box-shadow .33s; + + &::before { + content: " "; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + opacity: 0.2; + border-radius: 4px; + } + &:hover { + box-shadow: 0 0 1px rgba(0,0,0,.5), 0 -1px 2px hsla(180, 100%, 50%, .05), 0 12px 24px hsla(207, 100%, 10%, 0.20); + } + &:hover::before { + background-color: rgba(255,255,255,.8); + } + &:focus { + outline: none; + } + &:focus::before { + background-color: white; + } + &:active::before { + background-color: grey; + } + :host([active]) & { + color: rgba(0, 0, 0, 0.38); + background-color: rgba(0, 0, 0, 0.12); + box-shadow: none; + cursor: unset; + pointer-events: none; + } + &.hidden { + display: none; + } +} + +/* not contained inside frontpage class */ +.hero { + display: flex; +} + +.frontpage { + + .material-card { + margin-bottom: 24px; + } + + .recent-posts { + .blog-date { + white-space: nowrap; + } + } + + .highlight-blog-post { + font-size: 2rem; + line-height: 1.15; + padding: 15px; + display: block; + text-decoration: none; + color: white; + transition: background-color 0.5s; + background-color: #038fc7; + + &.large { + font-size: 2.25rem; + line-height: 1.33333; + } + + &:hover { + background-color: lighten(#038fc7, 10%); + } + } + + .events { + padding: 16px; + + h3 { + margin-top: 8px; + } + + .event { + display: flex; + flex-wrap: wrap-reverse; + 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%; + } + } + } + + .picture-promo { + display: block; + padding-top: 30%; + background-size: cover; + background-position: center; + text-decoration: none; + border: none; + + .caption { + padding: 8px 12px 12px; + background-color: rgba(0, 0, 0, 0.54); + color: white; + border-bottom-left-radius: 16px; + border-bottom-right-radius: 16px; + display: flex; + justify-content: space-between; + align-items: center; + + .title { + font-size: 20px; + font-weight: 400; + line-height: 1.2em; + } + + .subtitle { + margin-top: 4px; + line-height: 1.4em; + font-size: 12px; + font-weight: initial; + } + + svg { + fill: white; + width: 32px; + height: 32px; + min-width: 32px; + } + } + } + + .supported-brands { + text-align: center; + + a { + text-decoration: none; + } + + img { + border: none !important; + box-shadow: none !important; + max-height: 50px; + max-width: 140px; + margin: 10px; + vertical-align: middle; + } + } + + .sponsors-and-press { + margin-top: 24px; + } + + .seen-press { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 24px; + margin: 48px 0; + + h2 { + grid-column: 1/-1; + margin: 0; + text-align: center; + } + + a { + aspect-ratio: 1; + } + + img { + border: 0; + box-shadow: none; + margin: 24px; + width: calc(100% - 48px); + max-height: 128px; + border-radius: 0; + } + + .material-card { + height: 100%; + align-content: center; + text-align: center; + margin: 0; + } + + .square { + width: initial; + } + + .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 { + text-align: center; + + img { + border: 0; + border-radius: 0; + box-shadow: none; + margin: 24px; + max-height: 160px; + } + } +} + +@media screen and (max-width: $lap-end) { + .frontpage .events .event { + .caption { + padding-top: 4px; + } + + img { + width: 100%; + } + } +} + + +h1:hover a.title-link, +h2:hover a.title-link, +h3:hover a.title-link, +h4:hover a.title-link, +h5:hover a.title-link, +h6:hover a.title-link, +dt:hover a.title-link { + text-decoration: none; + &::before { + margin-left: 4px; + color: #999; + content: "\00B6"; /* pilcrow */ + } +} + +.usp { + ul { + text-align: left; + margin-left: 27px; + margin-top: -18px; + } + + .icon i { + border: none !important; + } +} + +.hero-buttons a { + margin: 0 30px 10px 0; + + &:last-child { + margin: 0; + } +} + + +// Article formatting + +article.post, +article.page, +article.listing { + font-size: 1.125em; + line-height: 1.6; + + img, + table { + border-radius: 8px; + box-shadow: rgba(0, 0, 0, 0.5) 0 0 1px; + vertical-align: middle; + } + + img.no-shadow { + border: 0; + box-shadow: none; + } + + video { + max-width: 100%; + } + + &>table, + &>.entry-content>table { + 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 { + background-color: #fff; + border-radius: 8px; + border-width: 8px; + text-align: center; + padding-bottom: 3px; + font-size: 0.9rem; + box-shadow: rgba(0, 0, 0, 0.5) 0 0 1px; + border: 0; + + img { + display: block; + box-shadow: none; + margin: 0 auto; + } + } + + li { + margin-top: 4px; + margin-bottom: 8px; + + &>p:last-child { + margin-bottom: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + &>ol>li { + margin-bottom: 16px; + } + + a { + text-decoration: underline; + overflow-wrap: break-word; + + &.btn { + font-size: 1.1em; + text-decoration: none; + transition: box-shadow .33; + + &:hover { + box-shadow: 0 0 1px rgba(0,0,0,.5), 0 -4px 8px hsla(180, 100%, 50%, .10), 0 32px 64px hsla(207, 100%, 10%, 0.5); + } + } + } + + h2 { + margin-top: 1.75em; + line-height: 1.4; + } + + h3 { + text-transform: uppercase; + letter-spacing: 0.05rem; + font-size: 1.375rem; + margin-top: 2em; + } + + h4 { + text-transform: uppercase; + letter-spacing: 0.05rem; + font-size: 1.1875rem; + margin-top: 2em; + color: $gray; + } + + details { + padding-bottom: 1em; + } +} + +.aside-module { + background: white; + border-radius: 16px; + margin: 0 0 24px 0px; + padding: 4px 24px 8px; + + .section { + margin-bottom: 10px; + + &>ul { + margin-left: 0px; + + &>li.toc-entry:first-child{ + padding-top: 0; + } + + &>li.toc-entry { + list-style-type: none; + } + + li.toc-entry, li.faq-entry { + padding: 3px 0; + font-size: .85rem; + + li { + list-style-type: disc; + margin-left: .5em; + } + + ul { + margin: 3px 0 -3px 1em; + } + } + } + } + + .brand-logo-container { + text-align: center; + margin-top: 50px; + display: grid; + justify-items: center; + padding: 12px 16px; + + img { + max-height: 64px; + } + + a.my img { + margin-top: 20px; + } + } +} + + +.codeowner-avatar { + position: relative; + width: 48px; + height: 48px; + border-radius: 24px; + vertical-align: middle; + margin: 4px 8px 4px 0; + border: 2px solid rgba(0,0,0,.1); +} + + +lite-youtube { + position: relative; + display: block; + padding-bottom: calc(100% / (16 / 9)); + background-color: rgba(0, 0, 0, .1); +} + +lite-youtube::before { + content: attr(videotitle) " video placeholder"; + color: rgba(0, 0, 0, 0.82); + text-align: center; + width: 100%; + position: absolute; + padding-top: calc(45% / (16 / 9)); +} + +// Responsive YouTube embeds. +// https://css-tricks.com/NetMag/FluidWidthVideo/Article-FluidWidthVideo.php +.videoWrapper { + position: relative; + padding-bottom: 56.25%; + /* 16:9 */ + height: 0; + margin-bottom: 25px; + background: #000; + + iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } +} + +.edit-github { + float: right; + margin-left: 8px; + margin-bottom: 8px; + font-size: 0.8em; +} + +ul.sidebar-menu { + a.active { + color: #000; + font-weight: bold; + border-left: 4px solid $primary-color; + padding: 0 8px; + display: inline-block; + } + + ul { + margin-left: 30px; + } +} + +a code { + color: $primary-color; +} + +twitter-widget, +.twitter-tweet-rendered { + margin-left: auto; + margin-right: auto; +} + +.text-center { + text-align: center; +} + +.aside-module { + max-width: 100%; + overflow: hidden; +} + +// Configuration variables +div.config-vars { + background: $white; + border: 1px solid rgba(0, 0, 0, 0.12); + padding: 24px; + border-radius: 16px; + + h3, h4 { + margin: 0; + } + + .configuration-link { + font-size: 13px; + margin-bottom: 24px; + + a { + color: #8792a2; + text-decoration: none; + border-bottom: #8792a2 dotted 0.5px; + } + } + + .config-vars-item { + border-bottom: 1px solid #d9dbde; + padding-top: 16px; + padding-bottom: 16px; + + &:first-child { + padding-top: 0; + } + + &:last-child { + border: none; + padding-bottom: 0; + } + } + + .nested .config-vars-item:last-child { + border: none; + } + + .config-vars-label { + padding-bottom: 4px; + position: relative; + + a.title-link { + text-decoration: none; + } + &:hover a.title-link::before { + margin-left: 4px; + color: #999; + content: "\00B6"; /* pilcrow */ + } + } + + .config-vars-label-name { + font-weight: bold; + font-size: 16px; + color: #222222bd; + } + + .config-vars-type { + color: #8792a2; + font-size: 13px; + } + + .config-vars-required { + color: #8792a2; + font-size: 13px; + text-transform: lowercase; + + .true { + color: #e56f4a; + text-transform: uppercase; + font-size: 11px; + } + + .default { + text-transform: None; + } + } + + .config-vars-description-and-children { + font-size: 14px; + color: #4f566b; + } + + .config-vars-description p { + margin: 0; + } + + .config-vars-default { + padding-top: 8px; + + p { + margin: 0; + display: inline; + } + } + + .nested { + margin-left: 48px; + } +} + +code { + font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; + font-size: 0.8em; + color: $link-color; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + overflow-wrap: break-word; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + + background-color: #fdfdfd; + background-image: linear-gradient(transparent 50%, + rgba(69, 142, 209, 0.04) 50%); + background-size: 3em 3em; + background-origin: content-box; + background-attachment: local; + + border: 1px solid #ddd; + border-radius: 16px; + padding: 0.1em 0.4em; +} +pre[class*="language-"]:before, pre[class*="language-"]:after { + box-shadow: none; +} + +@media only screen and (max-width: $menu-collapse) { + + #not_found { + .page { + text-align: center; + + .search404-container { + margin-bottom: 32px; + display: grid; + + #search404 { + display: flex; + justify-self: center; + } + } + } + } +} + +@media only screen and (min-width: $menu-collapse) { + #not_found { + .page { + text-align: center; + margin-bottom: 300px; + + .search404-container { + margin-bottom: 32px; + display: grid; + + #search404 { + display: flex; + justify-self: center; + } + } + } + + footer { + position: absolute; + bottom: 0; + width: 100%; + } + } +} + +a.my { + img { + border: 0px; + border-radius: 0; + box-shadow: none; + } +} + +:target { + display: block; + position: relative; + top: -100px; + visibility: hidden; +} + +.site-header { + position: fixed; + width: 100%; + z-index: 999; +} diff --git a/sass/oscailte/_variables.scss b/sass/homeassistant/_variables.scss similarity index 71% rename from sass/oscailte/_variables.scss rename to sass/homeassistant/_variables.scss index a0ecf4d54b35..251a148340a4 100644 --- a/sass/oscailte/_variables.scss +++ b/sass/homeassistant/_variables.scss @@ -1,11 +1,19 @@ $use-grids: true; -$site-width: 1100px; +$site-width: 1560px; $responsive: true; $use-gridfix: true; // Fonts & Font Families $serif: Georgia, 'Times New Roman', Times, serif !default; -$sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default; +$sans-serif: "Instrument Sans", "Helvetica Neue", Helvetica, Arial, sans-serif !default; +$heading-font: "Figtree", "Helvetica Neue", Arial, sans-serif !default; + +$h1-size: 40px; +$h2-size: 28px; +$h3-size: 22px; +$h4-size: 19px; +$h5-size: 16px; +$h6-size: 14px; // Grays // ------------------------- @@ -20,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; @@ -53,12 +61,16 @@ $footer-height: 100px; $primary-color: $blue; $secondary-color: $green; // ------------------------- -$site-background: #F5F5F5; -$header-background: $white; -$footer-background: $header-background; +$site-background: #FBFBFB; +$header-background: rgba(251,251,251,.8); +$footer-background: #f2f4f9; $text-color: $grayDarker; $title-color: $primary-color; -$link-color: $primary-color; +$link-color: #007fa8; $button-color: $primary-color; $button-text: $white; $navigation-color: $link-color; + +$brand-round: 16px; +$brand-face: $heading-font; +$brand-color: $primary-color; diff --git a/sass/oscailte/aside/_github.scss b/sass/homeassistant/aside/_github.scss similarity index 100% rename from sass/oscailte/aside/_github.scss rename to sass/homeassistant/aside/_github.scss diff --git a/sass/oscailte/aside/_pinboard.scss b/sass/homeassistant/aside/_pinboard.scss similarity index 100% rename from sass/oscailte/aside/_pinboard.scss rename to sass/homeassistant/aside/_pinboard.scss diff --git a/sass/oscailte/aside/_recent_posts.scss b/sass/homeassistant/aside/_recent_posts.scss similarity index 100% rename from sass/oscailte/aside/_recent_posts.scss rename to sass/homeassistant/aside/_recent_posts.scss diff --git a/sass/oscailte/aside/_social.scss b/sass/homeassistant/aside/_social.scss similarity index 100% rename from sass/oscailte/aside/_social.scss rename to sass/homeassistant/aside/_social.scss diff --git a/sass/oscailte/base/_archive_list.scss b/sass/homeassistant/base/_archive_list.scss similarity index 100% rename from sass/oscailte/base/_archive_list.scss rename to sass/homeassistant/base/_archive_list.scss diff --git a/sass/oscailte/base/_footer.scss b/sass/homeassistant/base/_footer.scss similarity index 79% rename from sass/oscailte/base/_footer.scss rename to sass/homeassistant/base/_footer.scss index 56ded1213108..e2f610367e50 100644 --- a/sass/oscailte/base/_footer.scss +++ b/sass/homeassistant/base/_footer.scss @@ -9,9 +9,7 @@ } body > footer, .page-content > footer { - @include box-shadow(0 0 3px rgba(0, 0, 0, 0.25)); background-color: $footer-background; - // height: $footer-height; margin-top: 3em; } diff --git a/sass/oscailte/base/_global.scss b/sass/homeassistant/base/_global.scss similarity index 52% rename from sass/oscailte/base/_global.scss rename to sass/homeassistant/base/_global.scss index 250abb31aa02..7e65b7d48aac 100644 --- a/sass/oscailte/base/_global.scss +++ b/sass/homeassistant/base/_global.scss @@ -1,3 +1,8 @@ +html { + overflow-y: auto; + scroll-snap-type: y proximity; +} + body, html { background-color: $site-background; color: $text-color; @@ -5,6 +10,36 @@ body, html { height: 100%; } +.page-content { + display: inline-block; + height: 100%; + margin-top: 0; + padding-top: 88px; + width: 100%; + + &>.grid-wrapper:last-of-type { + min-height: calc(100vh - 714px); + } +} + +h1, h2, h3, h4, h5, h6 { + font-family: $heading-font; + font-weight: 650; + letter-spacing: -.005em; +} + +h1 {font-weight: 800;} +h3, h4 {font-weight: 700;} + +p, li { + letter-spacing: .005em; +} + +article.page header+p, p.lead { + line-height: 1.6; + font-size: 1.4rem; +} + a { color: $link-color; text-decoration: none; @@ -13,6 +48,22 @@ a { } } +a.external-link iconify-icon, +iconify-icon.external-link { + font-size: 1.0rem; + vertical-align: middle; + padding: 0 0 2px 3px; +} + +table { + table-layout: fixed; + width: 100%; + + th,td { + word-wrap: break-word; + } +} + .gist { font-size: 0.75em; } diff --git a/sass/oscailte/base/_grid.scss b/sass/homeassistant/base/_grid.scss similarity index 100% rename from sass/oscailte/base/_grid.scss rename to sass/homeassistant/base/_grid.scss diff --git a/sass/homeassistant/base/_header.scss b/sass/homeassistant/base/_header.scss new file mode 100644 index 000000000000..ab9e08a79bec --- /dev/null +++ b/sass/homeassistant/base/_header.scss @@ -0,0 +1,63 @@ +body > header { + background-color: $header-background; + margin-bottom: 2em; + backdrop-filter: blur(24px); + + .site-title { + color: rgba(229, 229, 229, 0.8); + font-size: 1.7em; + font-weight: bold; + line-height: 2.5em; + } + + .release-date { + font-size: 10px; + margin: 29.5px 0 0; + padding: 0 4px 0 4px; + background: #e8edf0; + height: fit-content; + color: $link-color; + font-weight: 500; + border-radius: 4px; + letter-spacing: .025rem; + } + + &.dark { + background-color: rgba(255,255,255,0); + backdrop-filter: none; + // transition: background-color 1s; + + @media only screen and (min-width: $desk-start) { + .menu>li>a, .docsearch .DocSearch-Search-Icon { + color: $white; + } + } + + .ha-title { + .logo { + background-image: url('/images/home-assistant-logo-white.svg'); + } + } + } +} + + +.ha-title { + display: inline-flex; + height: 100%; + white-space: nowrap; + + .logo { + border-radius: 0; + width: 226px; + height: 32px; + margin-right: 10px; + background-image: url('/images/home-assistant-logo.svg'); + background-repeat: no-repeat; + background-size: contain; + } + + a>* { + vertical-align: middle; + } +} diff --git a/sass/oscailte/base/_navigation.scss b/sass/homeassistant/base/_navigation.scss similarity index 78% rename from sass/oscailte/base/_navigation.scss rename to sass/homeassistant/base/_navigation.scss index 166e413ba1ca..e179f2a21d72 100644 --- a/sass/oscailte/base/_navigation.scss +++ b/sass/homeassistant/base/_navigation.scss @@ -76,6 +76,7 @@ $menu-collapse: 1024px; /* support for submenus */ ul.menu li { position: relative; + margin: 0; &:hover ul { display: block; @@ -90,6 +91,8 @@ ul.menu li { margin-left: 0; background-color: white; + border-radius: 16px; + box-shadow: 0 0 1px rgba(0,0,0,.5), 0 32px 64px rgba(0,0,0,.1); li { white-space: nowrap; @@ -97,12 +100,14 @@ ul.menu li { a { display: block; - padding: 20px 10px; + padding: 16px 16px; min-width: 150px; + margin: 8px; + border-radius: 8px; &:hover, &:focus { - background: $grayLighter; + background: rgba($primary-color, .1); } } } @@ -134,7 +139,7 @@ header .grid { .menu > li > a:hover, .menu > li > a:focus { background: $site-background; - box-shadow: inset 0px 5px $navigation-color; + box-shadow: inset 0px 5px $primary-color; color: $navigation-color; padding-bottom: 32px; } @@ -146,8 +151,9 @@ header .grid { @media only screen and (max-width: $menu-collapse) { .menu { background: $white; - border-top: 1px solid $navigation-color; - border-bottom: 4px solid $navigation-color; + box-shadow: 0px 64px 32px rgba(0,0,0,.1); + max-height: 100vh; + overflow-y: auto; } .menu, @@ -157,40 +163,42 @@ header .grid { } .menu li a { - padding: 15px 15px !important; + margin: 0 !important; + padding: 20px 24px !important; } .menu li a:hover, .menu li a:focus { - background: $grayLighter; - box-shadow: inset 5px 0px $navigation-color; + background: rgba($primary-color, .1); + box-shadow: inset 5px 0px $primary-color; padding: 15px 15px 15px 25px; } .toggle { position: absolute; - top: 15px; - right: 10px; + top: 17px; + right: 17px; } .toggle::after { - @include border-radius(2px); @include box-sizing(border-box); @include transition(all 0.5s linear); - font-family: "FontAwesome"; - content: "\f0c9"; + content: "☰"; display: inline-block; - width: 100%; - padding: 10px 15px; - background: $navigation-color; + width: 32px; + height: 32px; + padding: 4px 9px; + background: $primary-color; text-align: center; - font-size: 12px; + font-family: $sans-serif; + font-size: 16px; color: $white; white-space: nowrap; + border-radius: 24px; } .toggle:hover::after { - background: darken($navigation-color, 7%); + background: darken($primary-color, 25%); } #toggle:checked + .toggle::after { @@ -202,5 +210,7 @@ header .grid { display: block; position: relative; top: 0; + box-shadow: none; + margin-left: 24px; } } diff --git a/sass/oscailte/base/_post.scss b/sass/homeassistant/base/_post.scss similarity index 89% rename from sass/oscailte/base/_post.scss rename to sass/homeassistant/base/_post.scss index a93338fe6daa..e590ade65170 100644 --- a/sass/oscailte/base/_post.scss +++ b/sass/homeassistant/base/_post.scss @@ -5,7 +5,7 @@ article { @extend .clearfix; border-left: 2px solid $primary-color; color: lighten($text-color, 15%); - font-family: $serif; + font-family: $sans-serif; font-size: 1.25em; font-style: italic; padding-left: 15px; @@ -35,7 +35,7 @@ article { color: $primary-color; content: "\201C"attr(data-pullquote) "\201D"; float: right; - font-family: $serif; + font-family: $sans-serif; font-size: 1.4em; font-style: italic; line-height: 1.45em; @@ -81,8 +81,7 @@ article { } .comments::before { - content: "\f075"; - font-family: "FontAwesome"; + content: "💬"; padding-right: 3px; } } @@ -91,14 +90,14 @@ article { &.listing { margin-bottom: 20px; h1 { - margin-bottom: 0; + margin-bottom: .5em; a { color: $title-color; text-decoration: none; } } .entry-content { - margin: 10px 0; + margin: 1em 0; } + hr { border: none; @@ -114,11 +113,10 @@ article { } } h1 { - margin-bottom: 0; + margin-bottom: 0.5em; } .meta { - border-bottom: 1px solid $primary-color; - margin-bottom: 20px; + margin-bottom: 3em; } } } diff --git a/sass/custom/_print.scss b/sass/homeassistant/base/_print.scss similarity index 100% rename from sass/custom/_print.scss rename to sass/homeassistant/base/_print.scss diff --git a/sass/homeassistant/base/_sidebar.scss b/sass/homeassistant/base/_sidebar.scss new file mode 100644 index 000000000000..0b376e2620fa --- /dev/null +++ b/sass/homeassistant/base/_sidebar.scss @@ -0,0 +1,68 @@ +.aside-module { + .title { + border-bottom: 1px solid $blue; + color: $grayDark; + margin: 1em 0 0.5em; + padding-bottom: 5px; + + .btn { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + padding: 5px 10px; + text-decoration: none; + } + } + + .loading { + display: block; + font-size: 2em; + text-align: center; + } +} + +#sidebar, #left-sidebar, #toc-bar, #integration-sidebar { + position: sticky; + top: 88px; + max-height: calc(100vh - 104px); + overflow-y: auto; + scrollbar-width: none; + border-radius: 16px; + + .aside-module:last-child { + margin-bottom: 0; + } + + .grid { + position: fixed; + width: 350px; + display: contents; + .brand-logo-container { + margin-top: 16px; + } + } +} + +@media only screen and (max-width: $lap-end) { + #sidebar, #left-sidebar, #toc-bar, #integration-sidebar { + max-height: fit-content; + + .grid { + position: initial; + width: 100%; + } + } + .site-header { + .pull-right { + position: fixed; + } + } + .hero { + > .grid-wrapper { + z-index: 0; + } + + img { + margin-bottom: 8px; + } + } +} diff --git a/sass/custom/_syntax.scss b/sass/homeassistant/base/_syntax.scss similarity index 100% rename from sass/custom/_syntax.scss rename to sass/homeassistant/base/_syntax.scss diff --git a/sass/homeassistant/external/_search.scss b/sass/homeassistant/external/_search.scss new file mode 100644 index 000000000000..9c26280b86a0 --- /dev/null +++ b/sass/homeassistant/external/_search.scss @@ -0,0 +1,35 @@ +.docsearch { + .DocSearch-Button { + @media only screen and (max-width: $lap-end) { + padding: 0px; + margin: 8px 24px; + } + + @media only screen and (min-width: $desk-start) { + padding: 0px; + margin-top: 16px; + margin-left: 8px; + margin-right: 0px; + } + + background: none; + + &:hover { + box-shadow: none; + } + } + .DocSearch-Button-Placeholder { + display: none; + } + .DocSearch-Button-Keys { + display: none; + } + .DocSearch-Search-Icon { + margin-right: 8px; + color: $link-color; + } +} + +.DocSearch-Container { + z-index: 1000; +} diff --git a/sass/oscailte/helpers/_classes.scss b/sass/homeassistant/helpers/_classes.scss similarity index 93% rename from sass/oscailte/helpers/_classes.scss rename to sass/homeassistant/helpers/_classes.scss index f0fb0cb35862..fd306cb455c2 100644 --- a/sass/oscailte/helpers/_classes.scss +++ b/sass/homeassistant/helpers/_classes.scss @@ -54,12 +54,11 @@ ol { .btn { @include gradient-vertical; @include box-shadow(0 0 3px rgba(0, 0, 0, 0.25)); - border-radius: 3px; + border-radius: 24px; color: $button-text; display: inline-block; - padding: 7px 15px; + padding: 6px 20px 8px; text-decoration: none; - text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.25); &:hover { text-decoration: underline; } diff --git a/sass/oscailte/helpers/_grid-fix.scss b/sass/homeassistant/helpers/_grid-fix.scss similarity index 100% rename from sass/oscailte/helpers/_grid-fix.scss rename to sass/homeassistant/helpers/_grid-fix.scss diff --git a/sass/custom/_features.scss b/sass/homeassistant/homepage/_features.scss similarity index 84% rename from sass/custom/_features.scss rename to sass/homeassistant/homepage/_features.scss index f350f7245e3f..bc8e51dfbcc2 100644 --- a/sass/custom/_features.scss +++ b/sass/homeassistant/homepage/_features.scss @@ -19,20 +19,18 @@ padding-bottom: 8px; height: 62px; - i { - height: 62px; - min-width: 62px; - text-align: center; - font-size: 39px; + iconify-icon { + font-size: 2.5rem; + margin-right: 8px; } } .card-content { - padding-left: 24px; + padding-bottom: 24px; p:last-of-type, ul { - margin-bottom: 12px; + margin-bottom: 32px; } } } diff --git a/sass/homeassistant/homepage/_hero_unit.scss b/sass/homeassistant/homepage/_hero_unit.scss new file mode 100644 index 000000000000..758a3622f8e8 --- /dev/null +++ b/sass/homeassistant/homepage/_hero_unit.scss @@ -0,0 +1,142 @@ + +// Front page hero section + +.hero { + position: relative; + background: rgb(24,188,242); + background: linear-gradient(0deg, hsl(195, 89%, 52%) 0%, hsla(195, 89%, 52%, 0.8) 100%); + padding-bottom: 0; + margin-top: -88px; + margin-bottom: 24px; + padding-top: 88px; + overflow: hidden; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + max-height: 1080px; + height: 100vh; + align-content: center; + min-height: 720px; + // scroll-snap-align: start; + color: $white; + + > .grid-wrapper { + position: relative; + z-index: 7; + } + + h1 { + font-size: 6em; + line-height: .8; + background: linear-gradient(135deg, rgba(255, 255, 255, 1) 0%, hsl(174.86, 100%, 75%) 100%); + background-clip: text; + color: transparent; + + .line2 { + line-height: 1.25; + } + } + + p { + small { + color: $grayLighter; + font-size: .65em; + } + .lead { + font-size: 1.25rem; + margin-bottom: 24px; + } + } + + .hero-buttons a { + font-family: $heading-font; + font-size: 1.1rem; + color: white; + text-transform: uppercase; + white-space: nowrap; + display: inline-block; + font-weight: 600; + padding: 8px 24px 8px 0; + margin: 0 4px 0 0; + border-radius: 32px; + + &.primary { + background-color: $link-color; + font-size: 2rem; + font-weight: 700; + padding: 8px 20px 8px 28px; + margin-bottom: 16px; + } + } + + #HAdemoScreenshot { + display: none; + img { + display: block; + } + } + + #HAdemo { + width: 100%; + max-width: 400px; + height: 800px; + border-radius: 48px; + border: 12px double white; + box-shadow: 24px 64px 64px hsla(220, 100%, 25%, .5); + // animation-name: box-shadow-color; + // animation-duration: 3s; + // animation-iteration-count: infinite; + // animation-direction: alternate; + + @media only screen and (max-height: 720px) { + border-bottom: 0; + margin-bottom: -8px; + border-radius: 48px 48px 0 0; + height: 640px; + + } + + } +} + +@keyframes box-shadow-color { + from { + box-shadow: 24px 64px 64px hsla(240, 100%, 25%, .5); + } + to { + box-shadow: 24px 64px 64px hsla(200, 100%, 25%, .5); + } +} + +@media only screen and (max-width: $lap-end) { + .hero { + h1 { + font-size: 4rem; + } + + .lead { + font-size: 1.15rem; + } + + .hero-buttons a { + &.primary { + font-size: 1.25rem; + } + } + } +} + +@media only screen and (max-width: 760px) { + .hero { + .flex { + flex-direction: column; + } + + #HAdemo { + display: none; + } + + #HAdemoScreenshot { + display: block; + } + + } +} diff --git a/sass/oscailte/homepage/_home.scss b/sass/homeassistant/homepage/_home.scss similarity index 95% rename from sass/oscailte/homepage/_home.scss rename to sass/homeassistant/homepage/_home.scss index 2b8228fd74ea..9f6bad65d7cc 100644 --- a/sass/oscailte/homepage/_home.scss +++ b/sass/homeassistant/homepage/_home.scss @@ -25,7 +25,6 @@ line-height: 3em; margin: 0; text-align: center; - text-transform: capitalize; + hr { margin: 0; diff --git a/sass/custom/_component_page.scss b/sass/homeassistant/pages/_component_page.scss similarity index 63% rename from sass/custom/_component_page.scss rename to sass/homeassistant/pages/_component_page.scss index 72c606c2c9b8..610f8420522a 100644 --- a/sass/custom/_component_page.scss +++ b/sass/homeassistant/pages/_component_page.scss @@ -1,4 +1,13 @@ #components-page { + .filter-button-group { + label { + font-size: .75rem; + font-weight: 500; + letter-spacing: .005em; + color: $gray; + text-transform: uppercase; + } + } .component-search { margin-bottom: 24px; @@ -7,113 +16,52 @@ padding: 10px; background-color: #fefefe; - border-radius: 2px; + border-radius: 8px; border: 1px solid; border-color: #7c7c7c #c3c3c3 #ddd; } } -} - -@media only screen and (max-width: $palm-end) { - #components-page { - .hass-option-cards { - .option-card { - width: 100%; - } - } + select { + font-family: $sans-serif; + border: 0; + background-color: $grayLighter; + border-radius: 16px; + padding: 4px 16px; } -} - -@media only screen and (max-width: $lap-end) { - #components-page { - .filter-button-group { - margin-bottom: 16px; - - .btn { - display: inline-block; - margin-right: 8px; - margin-bottom: 8px; - - &.current { - background-color: #3a5561; - background-image: linear-gradient(to bottom, #3a5561, #3f6b7d); - } - } - } + .category_select { + display: none; } } -@media only screen and (min-width: $desk-start) { - #components-page { - .filter-button-group { - .active { - font-weight: bold; - } - - .featured { - margin: 12px 0; - } - - .version_select { - margin: 12px 0 12px 0; - } - - .version_select > select { - width: 100%; - } - - .btn { - display: block; - background: 0; - color: black; - box-shadow: none; - text-shadow: none; - padding: 2px; - - &.current { - font-weight: bold; - } - } - } - } -} // styles for the cards .hass-option-cards { - display: -ms-flexbox; - display: -webkit-box; - display: -webkit-flexbox; - display: -webkit-flex; - display: flex; - - flex-direction: row; - flex-wrap: wrap; - justify-content: flex-start; - align-items: flex-start; - margin: -4px; // grid trick, has to match option-card's margin - - p.note { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 24px; + + div.alert, p.alert-content { width: 100%; } .option-card { flex: 0 0 auto; - width: 210px; - height: 142px; + aspect-ratio: 1; display: inline-block; - background-color: #fefefe; - margin: 4px; + background-color: #f8f8f8; border-radius: 8px; border: 1px solid rgba(0, 0, 0, .12); - box-shadow: rgba(0,0,0,0.06) 0 0 10px; padding: 8px; text-align: center; text-decoration: none; + align-content: center; + transition: box-shadow .33s; .img-container { - height: 50px; - margin: 12px 0; + height: 64px; + margin: 12px 16px; font: 0/0 a; + border-radius: 0; &:before { /* create a full-height inline block pseudo=element */ @@ -125,9 +73,10 @@ img { max-width: 100%; - max-height: 50px; + max-height: 64px; box-shadow: none; border: none; + border-radius: 0; vertical-align: middle; } } @@ -139,11 +88,12 @@ overflow: hidden; text-decoration: none; - font-size: 18px; + font-size: 16px; color: #000; - line-height: 1.3em; - height: 2.6em; + line-height: 1.25em; + height: 40px; margin-top: 20px; + padding: 0 8px; } } @@ -166,14 +116,140 @@ } } +a.option-card:hover { + z-index: 2; + box-shadow: 0 -2px 4px hsla(180, 100%, 50%, .05), 0 12px 24px hsla(207, 100%, 10%, 0.25); +} + +@for $i from 1 through 40 { + .option-card:nth-child(#{$i}) { + 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: 100% !important; + flex-direction: row; + display: flex; + align-items: center; + height: 80px; + + .img-container { + margin: 8px; + + img { + max-width: 48px; + max-height: 48px; + } + } + + .title { + height: auto; + margin: 8px; + } + } + } + #components-page { + .hass-option-cards { + .option-card { + + } + } + .category_select { + display: block; + } + .category_list { + display: none; + } + } +} + +@media only screen and (max-width: $lap-end) { + #components-page { + .filter-button-group { + display: flex; + flex-wrap: wrap; + margin-bottom: 16px; + align-items: flex-end; + gap: 8px; + + &>div { + margin-right: 8px; + } + + .btn { + display: inline-block; + margin-right: 4px; + margin-bottom: 0; + padding: 4px 16px; + font-size: 1rem; + background: $grayLighter; + box-shadow: none; + color: $link-color; + + &.active { + font-weight: bold; + } + } + } + .category_select { + display: block; + } + .category_list { + display: none; + } + } +} + +@media only screen and (min-width: $desk-start) { + #components-page { + + .filter-button-group { + .active { + font-weight: bold; + } + + .featured { + margin: 12px 0; + } + + .version_select { + margin: 12px 0 12px 0; + } + + .version_select > select { + width: 100%; + } + + .btn { + font-size: 1rem; + display: block; + background: 0; + color: black; + box-shadow: none; + text-shadow: none; + padding: 4px 0; + border-radius: 0; + + &.current { + font-weight: bold; + } + } + } + } +} + // animations for fade-in and fade-out effects of option-cards @keyframes new-item-animation { from { opacity: 0; - -webkit-transform: scale(0); - -ms-transform: scale(0); - -o-transform: scale(0); - transform: scale(0); } to { opacity: 1; @@ -186,8 +262,6 @@ @-webkit-keyframes new-item-animation { from { opacity: 0; - -webkit-transform: scale(0); - transform: scale(0); } to { opacity: 1; @@ -198,8 +272,6 @@ @-o-keyframes new-item-animation { from { opacity: 0; - -o-transform: scale(0); - transform: scale(0); } to { opacity: 1; @@ -236,10 +308,6 @@ transform: scale(1); } to { - -webkit-transform: scale(0); - -ms-transform: scale(0); - -o-transform: scale(0); - transform: scale(0); opacity: 0; } } @@ -250,8 +318,6 @@ transform: scale(1); } to { - -webkit-transform: scale(0); - transform: scale(0); opacity: 0; } } @@ -262,8 +328,6 @@ transform: scale(1); } to { - -o-transform: scale(0); - transform: scale(0); opacity: 0; } } diff --git a/sass/custom/_getting_started.scss b/sass/homeassistant/pages/_getting_started.scss similarity index 93% rename from sass/custom/_getting_started.scss rename to sass/homeassistant/pages/_getting_started.scss index 85a35ec3c51b..3428bc245244 100644 --- a/sass/custom/_getting_started.scss +++ b/sass/homeassistant/pages/_getting_started.scss @@ -1,8 +1,4 @@ #getting_started { - .intro { - padding-bottom: 16px; - font-size: 24px; - } .installations { .label { @@ -130,19 +126,32 @@ .button { display: flex; + align-items: center; padding-right: 20px; + border-radius: 32px; + &:not(:first-child) { margin-top: 12px; } - &.accent { - background-color: #34b155; + iconify-icon.external-link { + padding-top: 4px; } + svg { - fill: white; + fill: $link-color; height: 24px; min-width: 24px; } + + &.accent { + background-color: #34b155; + color: white; + + svg { + fill: white; + } + } } } } diff --git a/sass/custom/_landingpage.scss b/sass/homeassistant/pages/_landingpage.scss similarity index 99% rename from sass/custom/_landingpage.scss rename to sass/homeassistant/pages/_landingpage.scss index 387a933e3192..645bfbeaf60f 100644 --- a/sass/custom/_landingpage.scss +++ b/sass/homeassistant/pages/_landingpage.scss @@ -4,8 +4,6 @@ $ha__primary_color: #03a9f4; #landingpage { $landingpage__hero_height: 670px; - font-family: Roboto, "Helvetica Neue", Helvetica, Arial, sans-serif; - .site-header { .grid-wrapper { max-width: 1100px !important; @@ -13,6 +11,13 @@ $ha__primary_color: #03a9f4; } } + footer { + .grid-wrapper { + max-width: 1100px !important; + padding: 0 25px !important; + } + } + .grid-wrapper { max-width: 1500px; padding: 0; diff --git a/sass/homeassistant/plugins/_alert.scss b/sass/homeassistant/plugins/_alert.scss new file mode 100644 index 000000000000..39e6e115088c --- /dev/null +++ b/sass/homeassistant/plugins/_alert.scss @@ -0,0 +1,55 @@ +div.alert { + position: relative; + + background: #e7f2fa; + + padding: 20px 24px 20px 24px; + margin-bottom: 24px; + border-radius: 16px; + + p { + margin-bottom: 0px; + &.alert-title { + font-weight: bold; + line-height: 1.5em; + } + &.alert-content { + padding: 6px; + } + } + + &.alert-note { + p.alert-title { + color: #6ab0de; + } + background-color: #e7f2fa; + } + + &.alert-tip { + p.alert-title { + color: #4caf50; + } + background-color: #e6f4ea; + } + + &.alert-important { + p.alert-title { + color: #7e57c2; + } + background-color: #ede7f6; + } + + &.alert-warning { + p.alert-title { + color: rgb(187, 185, 13); + } + background-color: #f7f9e1; + } + + &.alert-caution { + p.alert-title { + color: #d32f2f; + } + background-color: #fdecea; + } +} diff --git a/sass/custom/_details.scss b/sass/homeassistant/plugins/_details.scss similarity index 69% rename from sass/custom/_details.scss rename to sass/homeassistant/plugins/_details.scss index a6117b1246c5..6d46cf2f6f58 100644 --- a/sass/custom/_details.scss +++ b/sass/homeassistant/plugins/_details.scss @@ -4,12 +4,11 @@ div.details-block { margin: 0 0 1.5em 0; .details-block-item { - background-color: white; - padding: 4px 16px; - margin: 8px; + background-color: #f8f8f8; + padding: 4px 24px; + margin: 8px 0; border: 1px solid rgba(0, 0, 0, .12); - box-shadow: rgba(0,0,0,0.06) 0 0 10px; - border-radius: 8px; + border-radius: 16px; .details-block-title { font-weight: bold; @@ -20,12 +19,13 @@ div.details-block { justify-content: space-between; display: flex; align-items: center; - background-color: white; + background-color: #f8f8f8; border: 0px; width: 100%; + padding: 0; } .details-block-content { - margin: 4px 32px 12px 0; + margin: 4px 0 12px 0; } } } diff --git a/sass/homeassistant/plugins/_integration_alert.scss b/sass/homeassistant/plugins/_integration_alert.scss new file mode 100644 index 000000000000..ce15b1892107 --- /dev/null +++ b/sass/homeassistant/plugins/_integration_alert.scss @@ -0,0 +1,34 @@ +.integration-alert-container { + margin: 0; +} + +a.integration-alert { + margin: 1em 0; + background-color: wheat; + padding: 16px 24px; + text-decoration: none !important; + display: flex; + align-items: center; + color: black; + border-radius: 16px; + + svg { + width: 24px; + margin-right: 8px; + } + + .content { + flex: 1; + } + + .learn-more { + font-weight: 600; + padding: 4px 12px; + border-radius: 16px; + font-size: 0.8em; + + &:hover { + background-color: rgba(0, 0, 0, 0.12); + } + } + } diff --git a/sass/custom/_tabbed_block.scss b/sass/homeassistant/plugins/_tabbed_block.scss similarity index 100% rename from sass/custom/_tabbed_block.scss rename to sass/homeassistant/plugins/_tabbed_block.scss diff --git a/sass/custom/_terminology_tooltip.scss b/sass/homeassistant/plugins/_terminology_tooltip.scss similarity index 100% rename from sass/custom/_terminology_tooltip.scss rename to sass/homeassistant/plugins/_terminology_tooltip.scss diff --git a/sass/inuitcss/_defaults.scss b/sass/inuitcss/_defaults.scss index 37b47eca3d4c..611bb0b307dd 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/sass/oscailte/_oscailte.scss b/sass/oscailte/_oscailte.scss deleted file mode 100644 index 29a22ffcda7b..000000000000 --- a/sass/oscailte/_oscailte.scss +++ /dev/null @@ -1,26 +0,0 @@ -@import "variables"; -@import "mixins"; - -@import "../inuitcss/_inuit"; -@import "../fontawesome/font-awesome"; - -@import "base/global"; -@import "base/grid"; -@import "base/header"; -@import "base/navigation"; -@import "base/footer"; -@import "base/post"; -@import "base/archive_list"; -@import "base/solarized"; - -@import "base/sidebar"; -@import "aside/recent_posts"; -@import "aside/github"; -@import "aside/pinboard"; -@import "aside/social"; - -@import "homepage/home"; -@import "homepage/hero_unit"; - -@import "helpers/classes"; -@import "helpers/grid-fix"; \ No newline at end of file diff --git a/sass/oscailte/base/_header.scss b/sass/oscailte/base/_header.scss deleted file mode 100644 index 08043bdac6ae..000000000000 --- a/sass/oscailte/base/_header.scss +++ /dev/null @@ -1,12 +0,0 @@ -body > header { - @include box-shadow(0 0 3px rgba(0, 0, 0, 0.25)); - background-color: $header-background; - margin-bottom: 2em; - - .site-title { - color: $grayDarker; - font-size: 1.7em; - font-weight: bold; - line-height: 2.5em; - } -} \ No newline at end of file diff --git a/sass/oscailte/base/_sidebar.scss b/sass/oscailte/base/_sidebar.scss deleted file mode 100644 index ea35944aef51..000000000000 --- a/sass/oscailte/base/_sidebar.scss +++ /dev/null @@ -1,46 +0,0 @@ -// #sidebar { -// .title { -// border-bottom: 1px solid $blue; -// color: $grayDark; -// margin: 1em 0 0.5em; -// padding-bottom: 5px; -// } -// .social { -// ul { -// @include content-columns(2, 10px); -// } -// } - -// @media only screen and (min-width: $desk-start){ -// section:first-child { -// h3 {margin-top: 0;} -// } -// } -// } - -.aside-module { - @media only screen and (min-width: $desk-start){ - &:first-child { - .title {margin-top: 0;} - } - } - .title { - border-bottom: 1px solid $blue; - color: $grayDark; - margin: 1em 0 0.5em; - padding-bottom: 5px; - - .btn { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - padding: 5px 10px; - text-decoration: none; - } - } - - .loading { - display: block; - font-size: 2em; - text-align: center; - } -} \ No newline at end of file diff --git a/sass/oscailte/base/_solarized.scss b/sass/oscailte/base/_solarized.scss deleted file mode 100644 index 7924d26cb7e0..000000000000 --- a/sass/oscailte/base/_solarized.scss +++ /dev/null @@ -1,333 +0,0 @@ -// // This file is just a butchered version of the one included in the default Octopress theme. -// // It could most definitely do with some cleaning up in the future. - -// @mixin selection($bg, $color: inherit, $text-shadow: none){ -// * { -// &::-moz-selection { background: $bg; color: $color; text-shadow: $text-shadow; } -// &::-webkit-selection { background: $bg; color: $color; text-shadow: $text-shadow; } -// &::selection { background: $bg; color: $color; text-shadow: $text-shadow; } -// } -// } - -// $base03: #002b36 !default; //darkest blue -// $base02: #073642 !default; //dark blue -// $base01: #586e75 !default; //darkest gray -// $base00: #657b83 !default; //dark gray -// $base0: #839496 !default; //medium gray -// $base1: #93a1a1 !default; //medium light gray -// $base2: #eee8d5 !default; //cream -// $base3: #fdf6e3 !default; //white -// $solar-yellow: #b58900 !default; -// $solar-orange: #cb4b16 !default; -// $solar-red: #dc322f !default; -// $solar-magenta: #d33682 !default; -// $solar-violet: #6c71c4 !default; -// $solar-blue: #268bd2 !default; -// $solar-cyan: #2aa198 !default; -// $solar-green: #859900 !default; - -// $solarized: dark !default; - -// @if $solarized == light { - -// $_base03: $base03; -// $_base02: $base02; -// $_base01: $base01; -// $_base00: $base00; -// $_base0: $base0; -// $_base1: $base1; -// $_base2: $base2; -// $_base3: $base3; - -// $base03: $_base3; -// $base02: $_base2; -// $base01: $_base1; -// $base00: $_base0; -// $base0: $_base00; -// $base1: $_base01; -// $base2: $_base02; -// $base3: $_base03; -// } - -// /* non highlighted code colors */ -// $pre-bg: $base03 !default; -// $pre-border: darken($base02, 5) !default; -// $pre-color: $base1 !default; - -// $noise-bg: image-url('noise.png') top left !default; -// $sans: "Helvetica Neue", Arial, sans-serif !default; -// $mono: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace !default; -// .sans { font-family: $sans; } -// .mono { font-family: $mono; } - -// .highlight { -// table {margin-bottom: 0;} -// .gutter, .code { -// padding: 0; -// } -// .gutter { -// .line-number { -// display: block; -// } -// } -// } - -// .highlight, html .gist .gist-file .gist-syntax .gist-highlight { -// table td.code { width: 100%; } -// border: 1px solid $pre-border !important; -// } -// .highlight .line-numbers, html .gist .gist-file .gist-syntax .highlight .line_numbers { -// text-align: right; -// font-size: 13px; -// line-height: 1.45em; -// @if $solarized == light { -// background: lighten($base03, 1) $noise-bg !important; -// border-right: 1px solid darken($base02, 2) !important; -// @include box-shadow(lighten($base03, 2) -1px 0 inset); -// text-shadow: lighten($base02, 2) 0 -1px; -// } @else { -// background: $base02 $noise-bg !important; -// border-right: 1px solid darken($base03, 2) !important; -// @include box-shadow(lighten($base02, 2) -1px 0 inset); -// text-shadow: darken($base02, 10) 0 -1px; -// } -// span { color: $base01 !important; } -// padding: .8em !important; -// @include border-radius(0); -// } - -// figure.code, .gist-file, pre { -// @include box-shadow(rgba(#000, .06) 0 0 10px); -// .highlight pre { @include box-shadow(none); } -// } - -// .gist .highlight, figure.code .highlight { -// @include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px); -// } -// html .gist .gist-file { -// margin-bottom: 1.8em; -// position: relative; -// border: none; -// padding-top: image-height("code_bg.png") !important; -// .highlight { -// margin-bottom: 0; -// } -// .gist-syntax { -// border-bottom: 0 !important; -// background: none !important; -// .gist-highlight { -// background: $base03 !important; -// } -// .highlight pre { -// @extend .pre-code; -// padding: 0; -// } -// } -// .gist-meta { -// padding: .6em 0.8em; -// border: 1px solid lighten($base02, 2) !important; -// color: $base01; -// font-size: .7em !important; -// @if $solarized == light { -// background: lighten($base03, 2) $noise-bg; -// border: 1px solid $pre-border !important; -// border-top: 1px solid lighten($base03, 2) !important; -// } @else { -// background: $base02 $noise-bg; -// } -// @extend .sans; -// line-height: 1.5em; -// a { -// color: mix($base1, $base01) !important; -// &:hover { color: $base1 !important; } -// } -// a[href*='#file'] { -// position: absolute; top: 0; left:0; right:-10px; -// color: #474747 !important; -// @extend .code-title; -// &:hover { color: $link-color !important; } -// } -// a[href*=raw]{ -// @extend .download-source; -// top: .4em; -// } -// } -// } -// pre { -// background: $pre-bg $noise-bg; -// @include border-radius(.4em); -// @extend .mono; -// border: 1px solid $pre-border; -// line-height: 1.45em; -// font-size: 13px; -// margin-bottom: 2.1em; -// padding: .8em 1em; -// color: $pre-color; -// overflow: auto; -// } -// h3.filename { -// @extend .code-title; -// + pre { @include border-radius(0px); } -// } - -// p, li { -// code { -// @extend .mono; -// display: inline-block; -// white-space: no-wrap; -// background: #fff; -// font-size: .8em; -// line-height: 1.5em; -// color: #555; -// border: 1px solid #ddd; -// @include border-radius(.4em); -// padding: 0 .3em; -// margin: -1px 0; -// } -// pre code { font-size: 1em !important; background: none; border: none; } -// } - -// .pre-code { -// font-family: $mono !important; -// overflow: scroll; -// overflow-y: hidden; -// display: block; -// padding: .8em; -// overflow-x: auto; -// line-height: 1.45em; -// background: $base03 $noise-bg !important; -// color: $base1 !important; -// span { color: $base1 !important; } -// span { font-style: normal !important; font-weight: normal !important; } - -// .c { color: $base01 !important; font-style: italic !important; } /* Comment */ -// .cm { color: $base01 !important; font-style: italic !important; } /* Comment.Multiline */ -// .cp { color: $base01 !important; font-style: italic !important; } /* Comment.Preproc */ -// .c1 { color: $base01 !important; font-style: italic !important; } /* Comment.Single */ -// .cs { color: $base01 !important; font-weight: bold !important; font-style: italic !important; } /* Comment.Special */ -// .err { color: $solar-red !important; background: none !important; } /* Error */ -// .k { color: $solar-orange !important; } /* Keyword */ -// .o { color: $base1 !important; font-weight: bold !important; } /* Operator */ -// .p { color: $base1 !important; } /* Operator */ -// .ow { color: $solar-cyan !important; font-weight: bold !important; } /* Operator.Word */ -// .gd { color: $base1 !important; background-color: mix($solar-red, $base03, 25%) !important; display: inline-block; } /* Generic.Deleted */ -// .gd .x { color: $base1 !important; background-color: mix($solar-red, $base03, 35%) !important; display: inline-block; } /* Generic.Deleted.Specific */ -// .ge { color: $base1 !important; font-style: italic !important; } /* Generic.Emph */ -// //.gr { color: #aa0000 } /* Generic.Error */ -// .gh { color: $base01 !important; } /* Generic.Heading */ -// .gi { color: $base1 !important; background-color: mix($solar-green, $base03, 20%) !important; display: inline-block; } /* Generic.Inserted */ -// .gi .x { color: $base1 !important; background-color: mix($solar-green, $base03, 40%) !important; display: inline-block; } /* Generic.Inserted.Specific */ -// //.go { color: #888888 } /* Generic.Output */ -// //.gp { color: #555555 } /* Generic.Prompt */ -// .gs { color: $base1 !important; font-weight: bold !important; } /* Generic.Strong */ -// .gu { color: $solar-violet !important; } /* Generic.Subheading */ -// //.gt { color: #aa0000 } /* Generic.Traceback */ -// .kc { color: $solar-green !important; font-weight: bold !important; } /* Keyword.Constant */ -// .kd { color: $solar-blue !important; } /* Keyword.Declaration */ -// .kp { color: $solar-orange !important; font-weight: bold !important; } /* Keyword.Pseudo */ -// .kr { color: $solar-magenta !important; font-weight: bold !important; } /* Keyword.Reserved */ -// .kt { color: $solar-cyan !important; } /* Keyword.Type */ -// .n { color: $solar-blue !important; } -// .na { color: $solar-blue !important; } /* Name.Attribute */ -// .nb { color: $solar-green !important; } /* Name.Builtin */ -// .nc { color: $solar-magenta !important;} /* Name.Class */ -// .no { color: $solar-yellow !important; } /* Name.Constant */ -// //.ni { color: #800080 } /* Name.Entity */ -// .nl { color: $solar-green !important; } -// .ne { color: $solar-blue !important; font-weight: bold !important; } /* Name.Exception */ -// .nf { color: $solar-blue !important; font-weight: bold !important; } /* Name.Function */ -// .nn { color: $solar-yellow !important; } /* Name.Namespace */ -// .nt { color: $solar-blue !important; font-weight: bold !important; } /* Name.Tag */ -// .nx { color: $solar-yellow !Important; } -// //.bp { color: #999999 } /* Name.Builtin.Pseudo */ -// //.vc { color: #008080 } /* Name.Variable.Class */ -// .vg { color: $solar-blue !important; } /* Name.Variable.Global */ -// .vi { color: $solar-blue !important; } /* Name.Variable.Instance */ -// .nv { color: $solar-blue !important; } /* Name.Variable */ -// //.w { color: #bbbbbb } /* Text.Whitespace */ -// .mf { color: $solar-cyan !important; } /* Literal.Number.Float */ -// .m { color: $solar-cyan !important; } /* Literal.Number */ -// .mh { color: $solar-cyan !important; } /* Literal.Number.Hex */ -// .mi { color: $solar-cyan !important; } /* Literal.Number.Integer */ -// //.mo { color: #009999 } /* Literal.Number.Oct */ -// .s { color: $solar-cyan !important; } /* Literal.String */ -// //.sb { color: #d14 } /* Literal.String.Backtick */ -// //.sc { color: #d14 } /* Literal.String.Char */ -// .sd { color: $solar-cyan !important; } /* Literal.String.Doc */ -// .s2 { color: $solar-cyan !important; } /* Literal.String.Double */ -// .se { color: $solar-red !important; } /* Literal.String.Escape */ -// //.sh { color: #d14 } /* Literal.String.Heredoc */ -// .si { color: $solar-blue !important; } /* Literal.String.Interpol */ -// //.sx { color: #d14 } /* Literal.String.Other */ -// .sr { color: $solar-cyan !important; } /* Literal.String.Regex */ -// .s1 { color: $solar-cyan !important; } /* Literal.String.Single */ -// //.ss { color: #990073 } /* Literal.String.Symbol */ -// //.il { color: #009999 } /* Literal.Number.Integer.Long */ -// div { .gd, .gd .x, .gi, .gi .x { display: inline-block; width: 100%; }} -// } - -// .highlight, .gist-highlight { -// pre { background: none; @include border-radius(0px); border: none; padding: 0; margin-bottom: 0; } -// margin-bottom: 1.8em; -// background: $base03; -// overflow-y: hidden; -// overflow-x: auto; -// } - -// $solar-scroll-bg: rgba(#fff, .15); -// $solar-scroll-thumb: rgba(#fff, .2); -// @if $solarized == light { -// $solar-scroll-bg: rgba(#000, .15); -// $solar-scroll-thumb: rgba(#000, .15); -// } - -// pre, .highlight, .gist-highlight { -// &::-webkit-scrollbar { height: .5em; background: $solar-scroll-bg; } -// &::-webkit-scrollbar-thumb:horizontal { background: $solar-scroll-thumb; -webkit-border-radius: 4px; border-radius: 4px } -// } - -// .highlight code { -// @extend .pre-code; background: #000; -// } -// figure.code { -// background: none; -// padding: 0; -// border: 0; -// margin-bottom: 1.5em; -// pre { margin-bottom: 0; } -// figcaption { -// position: relative; -// @extend .code-title; -// a { @extend .download-source; } -// } -// .highlight { -// margin-bottom: 0; -// } -// } - -// .code-title { -// text-align: center; -// font-size: 13px; -// line-height: 2em; -// text-shadow: #cbcccc 0 1px 0; -// color: #474747; -// font-weight: normal; -// margin-bottom: 0; -// @include border-radius(5px 5px 0 0); -// font-family: "Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif; -// background: #aaaaaa image-url("code_bg.png") top repeat-x; -// border: 1px solid #565656; -// border-top-color: #cbcbcb; -// border-left-color: #a5a5a5; -// border-right-color: #a5a5a5; -// border-bottom: 0; -// } - -// .download-source { -// position: absolute; right: .8em; -// color: #666 !important; -// z-index: 1; -// font-size: 13px; -// text-shadow: #cbcccc 0 1px 0; -// padding-left: 3em; -// } diff --git a/sass/oscailte/homepage/_hero_unit.scss b/sass/oscailte/homepage/_hero_unit.scss deleted file mode 100644 index ca41c37a5888..000000000000 --- a/sass/oscailte/homepage/_hero_unit.scss +++ /dev/null @@ -1,75 +0,0 @@ -.hero { - background-color: rgb(11, 107, 148); - background-position: 0 50%; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; - border-bottom: 1px solid $white; - color: $white; - margin-top: -2em; - margin-bottom: 1.5em; - padding: 50px 0; - position: relative; - - // &::before { - // background: url("../images/matrix.png") 0 0 rgba(0, 0, 0, 0.35); - // box-shadow: inset 0 0 5px $black; - // content: ""; - // display: block; - // position: absolute; - // top: 0; right: 0; bottom: 0; left: 0; - // z-index: 5; - // } - - > .grid-wrapper { - position: relative; - z-index: 7; - } - - .credit { - font-size: 0.75em; - font-style: italic; - position: absolute; - bottom: 0; right: 10px; - z-index: 7; - a { - border-bottom: 1px solid; - color: $white; - text-decoration: none; - } - .licence { - border: none; - } - } - - .avatar { - @media only screen and (max-width: $lap-end){ - margin-bottom: 30px; - } - text-align: center; - img { - @include border-radius(100%); - border: 10px solid $primary-color; - } - } - - h1 { - font-size: 3.5em; - line-height: 1em; - text-shadow: 2px 2px 0 rgba(0, 0, 0, 0.75); - } - - hr { - @extend .divider; - box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.75); - } - - p { - text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.75); - small { - color: $grayLighter; - font-size: .65em; - } - } -} \ No newline at end of file diff --git a/sass/partials/_archive.scss b/sass/partials/_archive.scss deleted file mode 100644 index 9ef1e8244929..000000000000 --- a/sass/partials/_archive.scss +++ /dev/null @@ -1,72 +0,0 @@ -#archive { - #content > div { &, > article { padding-top: 0; } } -} -#blog-archives { - article { - padding: 1em 0 1em; - position: relative; - background: $img-border bottom left repeat-x; - &:last-child { - background: none; - } - footer { padding: 0; margin: 0;} - } - h1 { color: $text-color; margin-bottom: .3em; } - h2 { display: none; } - h1 { - font-size: 1.5em; - a { - @include hover-link; - color: inherit; - &:hover { color: $link-color-hover; } - font-weight: normal; - display: inline-block; - } - } - a.category, time { - @extend .sans; - color: $text-color-light; - } - color: $text-color-light; - .entry-content { display: none; } - time { - font-size: .9em; - line-height: 1.2em; - .month, .day { display: inline-block; } - .month { text-transform: uppercase; } - } - p { margin-bottom: 1em; } - &, .entry-content { a { @include link-colors(inherit, $link-color-hover); }} - a:hover { color: $link-color-hover; } - @media only screen and (min-width: 550px) { - article { margin-left: 5em; } - h2 { - margin-bottom: .3em; - font-weight: normal; - display: inline-block; - position: relative; top: -1px; - float: left; - &:first-child { padding-top: .75em; } - } - time { - position: absolute; - text-align: right; - left: 0em; - top: 1.8em; - } - .year { display: none; } - article { - padding:{left: 4.5em; bottom: .7em;} - } - a.category { - line-height: 1.1em; - } - } -} -#content > .category { - article { - margin-left: 0; - padding-left: 6.8em; - } - .year { display: inline; } -} diff --git a/sass/partials/_blog.scss b/sass/partials/_blog.scss deleted file mode 100644 index 57fe7a8aec1e..000000000000 --- a/sass/partials/_blog.scss +++ /dev/null @@ -1,141 +0,0 @@ -article { - padding-top: 1em; - a { @extend .force-wrap; } - header { - position: relative; - padding-top: 2em; - padding-bottom: 1em; - margin-bottom: 1em; - background: $img-border bottom left repeat-x; - h1 { - margin: 0; - a { text-decoration: none; - &:hover { text-decoration: underline; } } - } - p { - font-size: .9em; - color: $text-color-light; - margin: 0; - &.meta { - @extend .sans; - text-transform: uppercase; - position: absolute; top: 0; - } - } - @media only screen and (min-width: 768px) { - margin-bottom: 1.5em; - padding-bottom: 1em; - background: $img-border bottom left repeat-x; - } - } - h2 { - padding-top: 0.8em; - background: $img-border top left repeat-x; - } - .entry-content & h2:first-child, header + h2 { padding-top: 0; } - h2:first-child, header + h2 { background: none; } - .feature { - padding-top: .5em; - margin-bottom: 1em; - padding-bottom: 1em; - background: $img-border bottom left repeat-x; - font-size: 2.0em; font-style: italic; - line-height: 1.3em; - } - img, video, .flash-video { - @extend .flex-content; - @extend .basic-alignment; - @include shadow-box; - } - video, .flash-video { margin: 0 auto 1.5em; } - video { display: block; width: 100%; } - .flash-video { - > div { - position: relative; - display: block; - padding-bottom: 56.25%; - padding-top: 1px; - height: 0; - overflow: hidden; - iframe, object, embed { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } - } - } - > footer { - padding-bottom: 2.5em; - margin-top: 2em; - @extend .sans; - p.meta { - margin-bottom: .8em; - font-size: .85em; - clear: both; - overflow: hidden; - } - .byline + time:before, time +time:before, .comments:before, .byline ~ .categories:before { - @extend .separator; - } - } - -} -article + article { - .blog-index & { - background: $img-border top left repeat-x; - } -} -#content .blog-index { - padding: { top: 0; bottom: 0; } - article { padding-top: 2em; } - article header { background: none; padding-bottom: 0; } - article h1 { - font-size: 2.2em; - a { color: inherit; &:hover { color: $link-color-hover; } } - } - a[rel=full-article] { - background: darken($main-bg, 5); - display: inline-block; - padding: .4em .8em; - margin-right: .5em; - text-decoration: none; - color: mix($text-color, $text-color-light); - @extend .serif; - @include transition(background-color .5s); - &:hover { - background: $link-color-hover; - text-shadow: none; - color: $main-bg; - } - } - footer { - @extend .sans; - margin-top: 1em; - } -} - -.separator { - content: "\2022 "; - padding: 0 .4em 0 .2em; - display: inline-block; -} - -#content div.pagination { - text-align: center; - font-size: .95em; - position: relative; - background: $img-border top left repeat-x; - padding: {top: 1.5em; bottom: 1.5em;} - a { - text-decoration: none; - color: $text-color-light; - &.prev { position: absolute; left: 0; } - &.next { position: absolute; right: 0; } - &:hover { color: $link-color-hover; } - &[href*=archive] { - &:before, &:after { content: '\2014'; padding: 0 .3em; } - } - } -} diff --git a/sass/partials/_footer.scss b/sass/partials/_footer.scss deleted file mode 100644 index 37411225120d..000000000000 --- a/sass/partials/_footer.scss +++ /dev/null @@ -1,19 +0,0 @@ -body > footer { - @extend .sans; - font-size: .8em; - color: $footer-color; - text-shadow: lighten($footer-bg, 5) 0 1px; - background-color: $footer-bg; - @include background($footer-bg-front, $footer-bg-back); - border-top: 1px solid $footer-border-top; - position: relative; - padding-top: 1em; - padding-bottom: 1em; - margin-bottom: 3em; - @include border-bottom-radius(.4em); - z-index: 1; - a { - @include link-colors($footer-link-color, $footer-link-color-hover, $visited: $footer-link-color); - } - p:last-child { margin-bottom: 0; } -} diff --git a/sass/partials/_header.scss b/sass/partials/_header.scss deleted file mode 100644 index 860e4c7bcecd..000000000000 --- a/sass/partials/_header.scss +++ /dev/null @@ -1,18 +0,0 @@ -body > header { - background: $header-bg; - h1 { - display: inline-block; - margin: 0; - a, a:hover { - color: $title_color; - text-decoration: none; - } - } - h2 { - margin: .2em 0 0; - @extend .sans; - font-size: 1em; - color: $subtitle-color; - font-weight: normal; - } -} diff --git a/sass/partials/_navigation.scss b/sass/partials/_navigation.scss deleted file mode 100644 index 30fa011d18c5..000000000000 --- a/sass/partials/_navigation.scss +++ /dev/null @@ -1,137 +0,0 @@ -body > nav { - position: relative; - background-color: $nav-bg; - @include background($nav-bg-front, $nav-bg-back); - border: { - top: 1px solid $nav-border-top; - bottom: 1px solid $nav-border-bottom; } - padding-top: .35em; - padding-bottom: .35em; - form { - @include background-clip(padding-box); - margin: 0; padding: 0; - .search { - padding: .3em .5em 0; - font-size: .85em; - font-family: $sans; - line-height: 1.1em; - width: 95%; - @include border-radius(.5em); - @include background-clip(padding-box); - @include box-shadow(lighten($nav-bg, 2) 0 1px); - background-color: lighten($nav-bg, 15); - border: 1px solid $nav-border; - color: #888; - &:focus { - color: #444; - border-color: #80b1df; - @include box-shadow(#80b1df 0 0 4px, #80b1df 0 0 3px inset); - background-color: #fff; - outline: none; - } - } - } - fieldset[role=search]{ float: right; width: 48%; } - fieldset.mobile-nav{ float: left; width: 48%; - select{ width: 100%; font-size: .8em; border: 1px solid #888;} - } - ul { display: none; } - @media only screen and (min-width: 550px) { - font-size: .9em; - ul { - @include horizontal-list(0); - float: left; - display: block; - padding-top: .15em; - } - ul.subscription { - margin-left: .8em; - float: right; - li:last-child a { padding-right: 0; } - } - ul li { - margin: 0; - } - a { - @include link-colors($nav-color, $nav-color-hover, $visited: $nav-color); - font-family: $sans; - text-shadow: lighten($nav-bg, 12) 0 1px; - float: left; - text-decoration: none; - font-size: 1.1em; - padding: .1em 0; - line-height: 1.5em; - } - li + li { - border-left: 1px solid $nav-border-left; - margin-left: .8em; - a { - padding-left: .8em; - border-left: 1px solid $nav-border-right; - } - } - form { - float: right; - text-align: left; - padding-left: .8em; - width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium + 20px; - .search { - width: 93%; - font-size: .95em; - line-height: 1.2em; - } - } - ul[data-subscription$=email] + form { - width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 58px; - .search { width: 91%; } - } - fieldset.mobile-nav { display: none; } - fieldset[role=search]{ width: 99%; } - } - @media only screen and (min-width: 992px) { - form { - width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 + 10px; - } - ul[data-subscription$=email] + form { - width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 58px; - } - } -} -.no-placeholder { - body > nav .search { - background: lighten($nav-bg, 15) image-url('search.png') .3em .25em no-repeat; - text-indent: 1.3em; - } -} -@mixin mask-subscription-nav($feed: 'rss.png'){ - position: relative; top: 0px; - text-indent: -999999em; - background-color: $nav-border-right; - border: 0; - padding: 0; - &,&:after { @include mask-image($feed); } - &:after { - content: ""; - position: absolute; top: -1px; left: 0; - background-color: lighten($nav-color, 25); - } - &:hover:after { background-color: lighten($nav-color, 20); } -} -.maskImage { - body > nav { - @media only screen and (min-width: 550px) { - ul[data-subscription$=email] + form { - width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 32px; - } - } - @media only screen and (min-width: 992px) { - ul[data-subscription$=email] + form { - width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 32px; - } - } - } - ul.subscription { position: relative; top: .2em; li, a { border: 0; padding: 0; }} - a[rel=subscribe-rss]{ @include mask-subscription-nav('rss.png'); } - a[rel=subscribe-email]{ @include mask-subscription-nav('email.png'); } -} - diff --git a/sass/partials/_sharing.scss b/sass/partials/_sharing.scss deleted file mode 100644 index 1fa9775026fc..000000000000 --- a/sass/partials/_sharing.scss +++ /dev/null @@ -1,6 +0,0 @@ -.sharing { - p.meta + & { - padding: { top: 1em; left: 0; } - background: $img-border top left repeat-x; - } -} diff --git a/sass/partials/_sidebar.scss b/sass/partials/_sidebar.scss deleted file mode 100644 index fa15d759709d..000000000000 --- a/sass/partials/_sidebar.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import "sidebar/base"; -@import "sidebar/pinboard"; -@import "sidebar/delicious"; diff --git a/sass/partials/_syntax.scss b/sass/partials/_syntax.scss deleted file mode 100644 index 416de7fb6780..000000000000 --- a/sass/partials/_syntax.scss +++ /dev/null @@ -1,261 +0,0 @@ -.highlight, html .gist .gist-file .gist-syntax .gist-highlight { - table td.code { width: 100%; } - border: 1px solid $pre-border !important; -} -.highlight .line-numbers, html .gist .gist-file .gist-syntax .highlight .line_numbers { - text-align: right; - font-size: 13px; - line-height: 1.45em; - @if $solarized == light { - background: lighten($base03, 1) $noise-bg !important; - border-right: 1px solid darken($base02, 2) !important; - @include box-shadow(lighten($base03, 2) -1px 0 inset); - text-shadow: lighten($base02, 2) 0 -1px; - } @else { - background: $base02 $noise-bg !important; - border-right: 1px solid darken($base03, 2) !important; - @include box-shadow(lighten($base02, 2) -1px 0 inset); - text-shadow: darken($base02, 10) 0 -1px; - } - span { color: $base01 !important; } - padding: .8em !important; - @include border-radius(0); -} - -figure.code, .gist-file, pre { - @include box-shadow(rgba(#000, .06) 0 0 10px); - .highlight pre { @include box-shadow(none); } -} - -.gist .highlight, figure.code .highlight { - @include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px); -} -html .gist .gist-file { - margin-bottom: 1.8em; - position: relative; - border: none; - padding-top: image-height("code_bg.png") !important; - .highlight { - margin-bottom: 0; - } - .gist-syntax { - border-bottom: 0 !important; - background: none !important; - .gist-highlight { - background: $base03 !important; - } - .highlight pre { - @extend .pre-code; - padding: 0; - } - } - .gist-meta { - padding: .6em 0.8em; - border: 1px solid lighten($base02, 2) !important; - color: $base01; - font-size: .7em !important; - @if $solarized == light { - background: lighten($base03, 2) $noise-bg; - border: 1px solid $pre-border !important; - border-top: 1px solid lighten($base03, 2) !important; - } @else { - background: $base02 $noise-bg; - } - @extend .sans; - line-height: 1.5em; - a { - color: mix($base1, $base01) !important; - @include hover-link; - &:hover { color: $base1 !important; } - } - a[href*='#file'] { - position: absolute; top: 0; left:0; right:-10px; - color: #474747 !important; - @extend .code-title; - &:hover { color: $link-color !important; } - } - a[href*=raw]{ - @extend .download-source; - top: .4em; - } - } -} -pre { - background: $pre-bg $noise-bg; - @include border-radius(.4em); - @extend .mono; - border: 1px solid $pre-border; - line-height: 1.45em; - font-size: 13px; - margin-bottom: 2.1em; - padding: .8em 1em; - color: $pre-color; - overflow: auto; -} -h3.filename { - @extend .code-title; - + pre { @include border-top-radius(0px); } -} - -p, li { - code { - @extend .mono; - display: inline-block; - white-space: no-wrap; - background: #fff; - font-size: .8em; - line-height: 1.5em; - color: #555; - border: 1px solid #ddd; - @include border-radius(.4em); - padding: 0 .3em; - margin: -1px 0; - } - pre code { font-size: 1em !important; background: none; border: none; } -} - -.pre-code { - font-family: $mono !important; - overflow: scroll; - overflow-y: hidden; - display: block; - padding: .8em; - overflow-x: auto; - line-height: 1.45em; - background: $base03 $noise-bg !important; - color: $base1 !important; - span { color: $base1 !important; } - span { font-style: normal !important; font-weight: normal !important; } - - .c { color: $base01 !important; font-style: italic !important; } /* Comment */ - .cm { color: $base01 !important; font-style: italic !important; } /* Comment.Multiline */ - .cp { color: $base01 !important; font-style: italic !important; } /* Comment.Preproc */ - .c1 { color: $base01 !important; font-style: italic !important; } /* Comment.Single */ - .cs { color: $base01 !important; font-weight: bold !important; font-style: italic !important; } /* Comment.Special */ - .err { color: $solar-red !important; background: none !important; } /* Error */ - .k { color: $solar-orange !important; } /* Keyword */ - .o { color: $base1 !important; font-weight: bold !important; } /* Operator */ - .p { color: $base1 !important; } /* Operator */ - .ow { color: $solar-cyan !important; font-weight: bold !important; } /* Operator.Word */ - .gd { color: $base1 !important; background-color: mix($solar-red, $base03, 25%) !important; display: inline-block; } /* Generic.Deleted */ - .gd .x { color: $base1 !important; background-color: mix($solar-red, $base03, 35%) !important; display: inline-block; } /* Generic.Deleted.Specific */ - .ge { color: $base1 !important; font-style: italic !important; } /* Generic.Emph */ - //.gr { color: #aa0000 } /* Generic.Error */ - .gh { color: $base01 !important; } /* Generic.Heading */ - .gi { color: $base1 !important; background-color: mix($solar-green, $base03, 20%) !important; display: inline-block; } /* Generic.Inserted */ - .gi .x { color: $base1 !important; background-color: mix($solar-green, $base03, 40%) !important; display: inline-block; } /* Generic.Inserted.Specific */ - //.go { color: #888888 } /* Generic.Output */ - //.gp { color: #555555 } /* Generic.Prompt */ - .gs { color: $base1 !important; font-weight: bold !important; } /* Generic.Strong */ - .gu { color: $solar-violet !important; } /* Generic.Subheading */ - //.gt { color: #aa0000 } /* Generic.Traceback */ - .kc { color: $solar-green !important; font-weight: bold !important; } /* Keyword.Constant */ - .kd { color: $solar-blue !important; } /* Keyword.Declaration */ - .kp { color: $solar-orange !important; font-weight: bold !important; } /* Keyword.Pseudo */ - .kr { color: $solar-magenta !important; font-weight: bold !important; } /* Keyword.Reserved */ - .kt { color: $solar-cyan !important; } /* Keyword.Type */ - .n { color: $solar-blue !important; } - .na { color: $solar-blue !important; } /* Name.Attribute */ - .nb { color: $solar-green !important; } /* Name.Builtin */ - .nc { color: $solar-magenta !important;} /* Name.Class */ - .no { color: $solar-yellow !important; } /* Name.Constant */ - //.ni { color: #800080 } /* Name.Entity */ - .nl { color: $solar-green !important; } - .ne { color: $solar-blue !important; font-weight: bold !important; } /* Name.Exception */ - .nf { color: $solar-blue !important; font-weight: bold !important; } /* Name.Function */ - .nn { color: $solar-yellow !important; } /* Name.Namespace */ - .nt { color: $solar-blue !important; font-weight: bold !important; } /* Name.Tag */ - .nx { color: $solar-yellow !Important; } - //.bp { color: #999999 } /* Name.Builtin.Pseudo */ - //.vc { color: #008080 } /* Name.Variable.Class */ - .vg { color: $solar-blue !important; } /* Name.Variable.Global */ - .vi { color: $solar-blue !important; } /* Name.Variable.Instance */ - .nv { color: $solar-blue !important; } /* Name.Variable */ - //.w { color: #bbbbbb } /* Text.Whitespace */ - .mf { color: $solar-cyan !important; } /* Literal.Number.Float */ - .m { color: $solar-cyan !important; } /* Literal.Number */ - .mh { color: $solar-cyan !important; } /* Literal.Number.Hex */ - .mi { color: $solar-cyan !important; } /* Literal.Number.Integer */ - //.mo { color: #009999 } /* Literal.Number.Oct */ - .s { color: $solar-cyan !important; } /* Literal.String */ - //.sb { color: #d14 } /* Literal.String.Backtick */ - //.sc { color: #d14 } /* Literal.String.Char */ - .sd { color: $solar-cyan !important; } /* Literal.String.Doc */ - .s2 { color: $solar-cyan !important; } /* Literal.String.Double */ - .se { color: $solar-red !important; } /* Literal.String.Escape */ - //.sh { color: #d14 } /* Literal.String.Heredoc */ - .si { color: $solar-blue !important; } /* Literal.String.Interpol */ - //.sx { color: #d14 } /* Literal.String.Other */ - .sr { color: $solar-cyan !important; } /* Literal.String.Regex */ - .s1 { color: $solar-cyan !important; } /* Literal.String.Single */ - //.ss { color: #990073 } /* Literal.String.Symbol */ - //.il { color: #009999 } /* Literal.Number.Integer.Long */ - div { .gd, .gd .x, .gi, .gi .x { display: inline-block; width: 100%; }} -} - -.highlight, .gist-highlight { - pre { background: none; @include border-radius(0px); border: none; padding: 0; margin-bottom: 0; } - margin-bottom: 1.8em; - background: $base03; - overflow-y: hidden; - overflow-x: auto; -} - -$solar-scroll-bg: rgba(#fff, .15); -$solar-scroll-thumb: rgba(#fff, .2); -@if $solarized == light { - $solar-scroll-bg: rgba(#000, .15); - $solar-scroll-thumb: rgba(#000, .15); -} - -pre, .highlight, .gist-highlight { - &::-webkit-scrollbar { height: .5em; background: $solar-scroll-bg; } - &::-webkit-scrollbar-thumb:horizontal { background: $solar-scroll-thumb; -webkit-border-radius: 4px; border-radius: 4px } -} - -.highlight code { - @extend .pre-code; background: #000; -} -figure.code { - background: none; - padding: 0; - border: 0; - margin-bottom: 1.5em; - pre { margin-bottom: 0; } - figcaption { - position: relative; - @extend .code-title; - a { @extend .download-source; } - } - .highlight { - margin-bottom: 0; - } -} - -.code-title { - text-align: center; - font-size: 13px; - line-height: 2em; - text-shadow: #cbcccc 0 1px 0; - color: #474747; - font-weight: normal; - margin-bottom: 0; - @include border-top-radius(5px); - font-family: "Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif; - background: #aaaaaa image-url("code_bg.png") top repeat-x; - border: 1px solid #565656; - border-top-color: #cbcbcb; - border-left-color: #a5a5a5; - border-right-color: #a5a5a5; - border-bottom: 0; -} - -.download-source { - position: absolute; right: .8em; - @include hover-link; - color: #666 !important; - z-index: 1; - font-size: 13px; - text-shadow: #cbcccc 0 1px 0; - padding-left: 3em; -} diff --git a/sass/partials/sidebar/_base.scss b/sass/partials/sidebar/_base.scss deleted file mode 100644 index 5441304e2797..000000000000 --- a/sass/partials/sidebar/_base.scss +++ /dev/null @@ -1,106 +0,0 @@ -.side-shadow-border { - @include box-shadow(lighten($sidebar-bg, 5) 0 1px); -} -aside.sidebar { - overflow: hidden; - color: $sidebar-color; - text-shadow: lighten($sidebar-bg, 8) 0 1px; - a { @extend .force-wrap; } - section { - @extend .sans; - font-size: .8em; - line-height: 1.4em; - margin-bottom: 1.5em; - h1 { - margin: 1.5em 0 0; - padding-bottom: .2em; - border-bottom: 1px solid $sidebar-border; - @extend .side-shadow-border; - + p { - padding-top: .4em; - } - } - } - img { - @extend .flex-content; - @extend .basic-alignment; - @include shadow-box($border: #fff .3em solid); - } - ul { - margin-bottom: 0.5em; - margin-left: 0; - } - li { - list-style: none; - padding: .5em 0; - margin: 0; - border-bottom: 1px solid $sidebar-border; - @extend .side-shadow-border; - p:last-child { - margin-bottom: 0; - } - } - a { - color: inherit; - @include transition(color .5s); - } - &:hover a { - color: $sidebar-link-color; - &:hover { color: $sidebar-link-color-hover; } - } -} -.aside-alt-link { - color: $sidebar-link-color-subdued; - &:hover { - color: $sidebar-link-color-subdued-hover; - } -} - -@media only screen and (min-width: 768px) { - .toggle-sidebar { - outline: none; - position: absolute; right: -10px; top: 0; bottom: 0; - display: inline-block; - text-decoration: none; - color: mix($text-color-light, $sidebar-bg); - width: 9px; - cursor: pointer; - &:hover { - background: mix($sidebar-border, $sidebar-bg); - @include background(linear-gradient(left, rgba($sidebar-border, .5), rgba($sidebar-border, 0))); - } - &:after { - position: absolute; right: -11px; top: 0; - width: 20px; - font-size: 1.2em; - line-height: 1.1em; - padding-bottom: .15em; - @include border-bottom-right-radius(.3em); - text-align: center; - background: $main-bg $noise-bg; - border-bottom: 1px solid $sidebar-border; - border-right: 1px solid $sidebar-border; - content: "\00BB"; - text-indent: -1px; - } - .collapse-sidebar & { - text-indent: 0px; - right: -20px; - width: 19px; - &:hover { - background: mix($sidebar-border, $sidebar-bg); - } - &:after { - border-left: 1px solid $sidebar-border; - text-shadow: #fff 0 1px; - content: "\00AB"; - left: 0px; right: 0; - text-align: center; - text-indent: 0; - border: 0; - border-right-width: 0; - background: none; - } - } - } -} diff --git a/sass/partials/sidebar/_delicious.scss b/sass/partials/sidebar/_delicious.scss deleted file mode 100644 index e962702e5fa6..000000000000 --- a/sass/partials/sidebar/_delicious.scss +++ /dev/null @@ -1,4 +0,0 @@ -.delicious-posts { - a.delicious-link { margin-bottom: .5em; display: block; } - p { font-size: 1em; } -} diff --git a/sass/partials/sidebar/_pinboard.scss b/sass/partials/sidebar/_pinboard.scss deleted file mode 100644 index 9f9ab46114d9..000000000000 --- a/sass/partials/sidebar/_pinboard.scss +++ /dev/null @@ -1,12 +0,0 @@ -#pinboard_linkroll { - .pin-title, .pin-description { - display: block; - margin-bottom: .5em; - } - .pin-tag { - @include hover-link; - @extend .aside-alt-link; - &:after { content: ','; } - &:last-child:after { content: ''; } - } -} diff --git a/sass/plugins/_plugins.scss b/sass/plugins/_plugins.scss deleted file mode 100644 index 25af026ba029..000000000000 --- a/sass/plugins/_plugins.scss +++ /dev/null @@ -1,6 +0,0 @@ -/* - Add plugin stylesheets to this directory and they will be automatically - Imported. Load order is alphabetical and styles can be overridden in - custom/_style.scss which is loaded after all plugin stylesheets. -*/ - diff --git a/sass/screen.scss b/sass/screen.scss index 5c4f3818c275..ff2a26ad172d 100644 --- a/sass/screen.scss +++ b/sass/screen.scss @@ -1,12 +1 @@ -@import 'oscailte/oscailte'; -@import 'custom/paulus'; -@import 'custom/landingpage'; -@import 'custom/features'; -@import 'custom/component_page'; -@import 'custom/syntax'; -@import 'custom/details'; -@import 'custom/print'; -@import 'custom/layout'; -@import 'custom/getting_started'; -@import 'custom/tabbed_block'; -@import 'custom/terminology_tooltip'; +@import 'homeassistant/homeassistant'; diff --git a/source/_dashboards/button.markdown b/source/_dashboards/button.markdown index 251836135627..7e84aca94b56 100644 --- a/source/_dashboards/button.markdown +++ b/source/_dashboards/button.markdown @@ -131,8 +131,8 @@ entity: light.living_room Button card with a button name and a [script](/docs/scripts/) that runs when card is tapped: <p class='img'> -<img src='/images/dashboards/entity_button_complex_card.png' alt='Screenshot of the Button card with script service'> -Screenshot of the button card with script service. +<img src='/images/dashboards/entity_button_complex_card.png' alt='Screenshot of the Button card with script action'> +Screenshot of the button card with script action. </p> ```yaml diff --git a/source/_dashboards/conditional.markdown b/source/_dashboards/conditional.markdown index 276bad013628..7f6e891ffbb3 100644 --- a/source/_dashboards/conditional.markdown +++ b/source/_dashboards/conditional.markdown @@ -6,7 +6,7 @@ description: The Conditional card displays another card based on conditions. related: - docs: /dashboards/cards/ title: Dashboard cards - - docs: /dashboards/cards/#show-or-hide-a-card-conditionally + - docs: /dashboards/cards/#showing-or-hiding-a-card-conditionally title: Conditional settings on the card's visibility tab --- @@ -17,7 +17,7 @@ The conditional card displays another card based on conditions. {% include dashboard/edit_dashboard.md %} Note that while editing the dashboard, the card will always be shown, so be sure to exit editing mode to test the conditions. -The conditional card can still be used. However, it is now possible to define a setting to show or hide a card conditionally directly on each card type, on its [Visibility](/dashboards/cards/#show-or-hide-a-card-conditionally) tab. +The conditional card can still be used. However, it is now possible to define a setting to show or hide a card conditionally directly on each card type, on its [Visibility](/dashboards/cards/#showing-or-hiding-a-card-conditionally) tab. Most options for this card can be configured via the user interface. diff --git a/source/_dashboards/iframe.markdown b/source/_dashboards/iframe.markdown index b3d4df4d99d0..089db8e9bb2c 100644 --- a/source/_dashboards/iframe.markdown +++ b/source/_dashboards/iframe.markdown @@ -24,9 +24,10 @@ The webpage card is used on the [Webpage dashboard](/dashboards/dashboards/#webp All options for this card can be configured via the user interface. Note that not every webpage can be embedded due to security restrictions that some sites have in place. These restrictions are enforced by your browser and prevent embedding them into a Home Assistant dashboard. -<div class='note warning'> + +{% important %} You can't embed sites using HTTP if you are using HTTPS for your Home Assistant. -</div> +{% endimportant %} ## YAML configuration diff --git a/source/_dashboards/map.markdown b/source/_dashboards/map.markdown index 921b720db6ae..005f1ab39cf3 100644 --- a/source/_dashboards/map.markdown +++ b/source/_dashboards/map.markdown @@ -75,17 +75,15 @@ hours_to_show: default: 0 {% endconfiguration %} -<div class='note'> - Only entities that have latitude and longitude attributes will be displayed on the map. -</div> - -<div class="note"> - - The `default_zoom` value will be ignored if it is set higher than the current zoom level - after fitting all visible entity markers in the map window. In other words, this can only - be used to zoom the map _out_ by default. - -</div> +{% important %} +Only entities that have latitude and longitude attributes will be displayed on the map. +{% endimportant %} + +{% note %} +The `default_zoom` value will be ignored if it is set higher than the current zoom level +after fitting all visible entity markers in the map window. In other words, this can only +be used to zoom the map _out_ by default. +{% endnote %} ## Options for entities diff --git a/source/_dashboards/picture-elements.markdown b/source/_dashboards/picture-elements.markdown index cdfacbf3b588..95e27f1d8b50 100644 --- a/source/_dashboards/picture-elements.markdown +++ b/source/_dashboards/picture-elements.markdown @@ -80,7 +80,7 @@ There are several different element types that can be added to a Picture Element - [State badge](#state-badge) - [State Icon](#state-icon) - [State Label](#state-label) -- [Service Call Button](#service-call-button) +- [Perform action button](#perform-action-button) - [Icon](#icon-element) - [Image](#image-element) - [Conditional](#conditional-element) @@ -215,9 +215,9 @@ style: default: "position: absolute, transform: translate(-50%, -50%)" {% endconfiguration %} -### Service call button +### Perform action button -This entity creates a button (with arbitrary text) that can be used to call a service. +This entity creates a button (with arbitrary text) that can be used to perform a service. {% configuration %} type: @@ -234,7 +234,7 @@ service: type: string service_data: required: false - description: The service data to use. + description: The data to use. type: map style: required: true @@ -540,7 +540,7 @@ elements: width: 10% border: 2px solid red border-radius: 10% - # Single image, state_filter - call-service on click + # Single image, state_filter - perform action on click - type: image entity: media_player.living_room tap_action: diff --git a/source/_dashboards/picture-glance.markdown b/source/_dashboards/picture-glance.markdown index 5afbb59fb3a0..2589acb08c5a 100644 --- a/source/_dashboards/picture-glance.markdown +++ b/source/_dashboards/picture-glance.markdown @@ -183,7 +183,7 @@ If your camera supports <abbr title="pan, tilt, and zoom">PTZ</abbr> (can be mov 4. Select **Show code editor**. 5. For each of the entities, specify an icon, as indicated in the YAML example. 6. For the buttons to react on press (instead of bringing up the dialog): - - For each of the entities, under `tap_action`, call a `button.press` service. + - For each of the entities, under `tap_action`, use a `button.press` action. ```yaml camera_view: live diff --git a/source/_dashboards/picture.markdown b/source/_dashboards/picture.markdown index 7fade859a728..097d527e6f76 100644 --- a/source/_dashboards/picture.markdown +++ b/source/_dashboards/picture.markdown @@ -2,7 +2,7 @@ type: card title: "Picture card" sidebar_label: Picture -description: "The picture card allows you to set an image to use for navigation to various paths in your interface or to call a service." +description: "The picture card allows you to set an image to use for navigation to various paths in your interface or to perform an action." related: - docs: /dashboards/actions/ title: Card actions @@ -12,7 +12,7 @@ related: title: Dashboard cards --- -The picture card allows you to set an image to use for navigation to various paths in your interface or to call a service. +The picture card allows you to set an image to use for navigation to various paths in your interface or to perform an action. <p class='img'> <img src='/images/dashboards/picture.png' alt='Screenshot of the picture card'> @@ -70,7 +70,7 @@ tap_action: Check the [views](/dashboards/views/) setup on how to setup custom IDs. -Toggle entity using a service: +Toggle entity using an action: ```yaml type: picture diff --git a/source/_dashboards/sections.markdown b/source/_dashboards/sections.markdown index c3ce04b8d170..640949a9e66b 100644 --- a/source/_dashboards/sections.markdown +++ b/source/_dashboards/sections.markdown @@ -27,9 +27,10 @@ You can group cards without using horizontal or vertical stack cards. A fully populated dashboard in Sections view layout </p> -<div class='note notice'> - <p>The sections view was released beginning of March 2024 and is experimental! Do not build your daily dashboard on top of it yet! We are still collecting feedback.</p><br><p>It is not possible to migrate dashboards into sections view.</p> -</div> +{% note %} +The sections view was released beginning of March 2024 and is experimental! Do not build your daily dashboard on top of it yet! We are still collecting feedback.<br> +It is not possible to migrate dashboards into sections view. +{% endnote %} ## Creating a sections view diff --git a/source/_dashboards/tile.markdown b/source/_dashboards/tile.markdown index d950c0df9aec..ef962f719695 100644 --- a/source/_dashboards/tile.markdown +++ b/source/_dashboards/tile.markdown @@ -61,7 +61,7 @@ hide_state: state_content: required: false description: > - Content to display for the state. Can be `state`, `last-changed`, or any attribute of the entity. Can be either a string with a single item, or a list of string items. Default depends on the entity domain. + Content to display for the state. Can be `state`, `last_changed`, `last_updated`, or any attribute of the entity. Can be either a string with a single item, or a list of string items. Default depends on the entity domain. type: [string, list] tap_action: required: false diff --git a/source/_dashboards/weather-forecast.markdown b/source/_dashboards/weather-forecast.markdown index 2ef074996505..1f9b40edb8ee 100644 --- a/source/_dashboards/weather-forecast.markdown +++ b/source/_dashboards/weather-forecast.markdown @@ -36,11 +36,10 @@ Theme: description: Name of any loaded theme to be used for this card. For more information about themes, see the [frontend documentation](/integrations/frontend/). {% endconfiguration_basic %} -<div class="note"> - - This card works only with platforms that define a `weather` entity. - - E.g., it works with [OpenWeatherMap](https://www.home-assistant.io/integrations/openweathermap/#weather) but not [OpenWeatherMap Sensor](https://www.home-assistant.io/integrations/openweathermap/#sensor) +{% important %} +This card works only with platforms that define a `weather` entity. +E.g., it works with [OpenWeatherMap](/integrations/openweathermap/#weather) but not [OpenWeatherMap Sensor](/integrations/openweathermap/#sensor) +{% endimportant %} </div> diff --git a/source/_data/glossary.yml b/source/_data/glossary.yml index 6993e422c478..fc0c9dd54ab8 100644 --- a/source/_data/glossary.yml +++ b/source/_data/glossary.yml @@ -12,14 +12,17 @@ definition: |- Actions are used in several places in Home Assistant. As part of a script or automation, actions define what is going to happen once a trigger is - activated. In scripts, an action is called *sequence*. Actions use service - calls and/or scenes to interact with entities and cause these entities to do + activated. In scripts, an action is called *sequence*. An action is a **software + function that interacts with targets to make something happen**. Actions can use other actions + and/or scenes to interact with entities and cause these entities to do something. Actions can also include conditions and a delay. An action can - call multiple services at the same time. For example, if your presence is - detected in a room, an action may call one service to turn on a light and - call another service to start playing music after a delay. Actions are also + perform multiple actions at the same time. For example, if your presence is + detected in a room, an action may perform one action to turn on a light and + perform another action to start playing music after a delay. Actions are also used on the dashboard, for example as tap or hold action on a UI element. - When triggered, the action calls a service. + When triggered, the action performs another action. Home Assistant provides a series of predefined actions, + such as `homeassistant.turn_on`, `homeassistant.toggle`, or + `homeassistant.reload`. aliases: - actions link: /docs/automation/action/ @@ -41,7 +44,7 @@ An area in Home Assistant is a logical grouping of devices and entities that are meant to match areas (or rooms) in the physical world: your home. For example, the `living room` area groups devices and entities in your living - room. Areas allow you to target service calls at an entire group of devices. + room. Areas allow you to target actions at an entire group of devices. For example, turning off all the lights in the living room. Locations within your home such as living room, dance floor, etc. Areas can be assigned to floors. Areas can also be used for automatically generated cards, such as @@ -185,12 +188,12 @@ - term: Domain definition: >- Each integration in Home Assistant has a unique identifier: a domain. All of - the entities and services available in Home Assistant are provided by + the entities and actions available in Home Assistant are provided by integrations and thus belong to such a domain. The first part of the entity - or service, before the `.` shows the domain they belong to. For example + or action, before the `.` shows the domain they belong to. For example `light.kitchen` is an entity in the `light` domain from the [light integration](/integrations/light), while `hue.activate_scene` is the - `activate_scene` service for the `hue` domain which belongs to the [Hue + `activate_scene` action for the `hue` domain which belongs to the [Hue integration](/integrations/hue). excerpt: > Each integration in Home Assistant has a unique identifier: The domain. It @@ -370,7 +373,7 @@ Labels in Home Assistant allow grouping elements irrespective of their physical location or type. Labels can be assigned to areas, devices, entities, automations, scenes, scripts, and helpers. Labels can be used in - automations and scripts as a target for actions and services. Labels can + automations and scripts as a target for actions. Labels can also be used to filter data. For example, you can filter the list of devices to show only devices with the label `heavy energy usage` or turn these devices off when there is not a lot of solar energy available. @@ -378,7 +381,7 @@ Labels in Home Assistant allow grouping elements irrespective of their physical location or type. Labels can be assigned to areas, devices, entities, automations, scenes, scripts, and helpers. Labels can be used in - automations and scripts as a target for actions and services. Labels can + automations and scripts as a target for actions. Labels can also be used to filter data. aliases: - labels @@ -481,26 +484,11 @@ - selectors - term: Service definition: |- - The term service has 2 meanings in Home Assistant: **The information - service** For example, the municipal waste management service that provides + The term "service" in Home Assistant is used in the sense of an **information + service**. For example, the municipal waste management service that provides entities for organic, paper, and packaging waste. In terms of functionality, the information service is like a device. It is called *service* to avoid - confusion, as it does not come with a piece of hardware. **The software - function that interacts with targets to make something happen** A service - carries out one specific task, for example: turning on the light in the - living room or sending a notification to a mobile phone. A service has - targets and data. Service targets are: areas, devices, and entities. Service - data carries the information required to define the desired state change in - the target. For example, the target, together with brightness 150 and RGB - color `[255,0,0]`, or the message “Your coffee is ready”. Services can be - used in, for example, automation, scripts, dashboards, or voice commands to - control your home. Home Assistant provides a series of predefined services, - such as `homeassistant.turn_on`, `homeassistant.toggle`, or - `homeassistant.reload`. - excerpt: > - A service carries out one specific task, for example: turn on the light in - the living room. A service has targets and data and can be called by - actions, a dashboard, or via voice command. + confusion, as it does not come with a piece of hardware. link: /docs/scripts/service-calls/ aliases: - services @@ -532,7 +520,7 @@ - term: Template definition: >- A template is an automation definition that can include variables for the - service or data from the trigger values. This allows automations to generate + action or data from the trigger values. This allows automations to generate dynamic actions. link: /docs/automation/templating/ aliases: diff --git a/source/_docs/asterisk_mbox.markdown b/source/_docs/asterisk_mbox.markdown index b5ed08059c59..e91f229f9611 100644 --- a/source/_docs/asterisk_mbox.markdown +++ b/source/_docs/asterisk_mbox.markdown @@ -14,9 +14,9 @@ Both parts are necessary for Asterisk voicemail integration. The server installation is documented below. The client is [integrated inside Home Assistant](/integrations/asterisk_mbox) -<div class='note'> +{% note %} Currently this module can only monitor a single Asterisk PBX mailbox. -</div> +{% endnote %} ### Prerequisites @@ -99,8 +99,6 @@ Before beginning make sure that you have the following: WantedBy=multi-user.target ``` -<div class='note'> - +{% note %} This assumes that your Asterisk PBX server is using `systemd` for init handling. If not, you will need to create the appropriate configuration files yourself. - -</div> +{% endnote %} diff --git a/source/_docs/authentication.markdown b/source/_docs/authentication.markdown index de84130966b5..871cef34bc06 100644 --- a/source/_docs/authentication.markdown +++ b/source/_docs/authentication.markdown @@ -18,13 +18,13 @@ When you start Home Assistant for the first time, the _owner_ user account is cr - Create and manage other user accounts. - Configure integrations and other settings (coming soon). -<div class='note'> +{% warning %} For the moment, other user accounts will have the same access as the owner account. In the future, non-owner accounts will be able to have restrictions applied. -</div> +{% endwarning %} -<div class="note"> +{% note %} If you want to manage users and you're an owner but you do not see "Users" in your main configuration menu, make sure that **Advanced Mode** is enabled for your user in your profile. -</div> +{% endnote %} ### Your account profile @@ -41,11 +41,9 @@ You can: - Define language and other locale settings. - Log out of Home Assistant. -<div class="note"> - +{% note %} Unused refresh tokens will be automatically removed. A refresh token is considered unused if it has not been used for a login within 90 days. If you need a permanent token, then we recommend using [Long Lived Access Tokens](https://developers.home-assistant.io/docs/auth_api/#long-lived-access-token). - -</div> +{% endnote %} ### Securing your login @@ -53,6 +51,10 @@ _Make sure to choose a secure password!_ At some time in the future, you will pr As an extra level of security, you can turn on [multi-factor authentication](/docs/authentication/multi-factor-auth/). +## Changing display or user name + +To learn how to change a display or user name, refer to [setting up basic information](/docs/configuration/basic/). + ## Other authentication techniques Home Assistant provides several ways to authenticate. See the [Auth providers](/docs/authentication/providers/) section. diff --git a/source/_docs/authentication/multi-factor-auth.markdown b/source/_docs/authentication/multi-factor-auth.markdown index 5aa16847ce94..2db92d805bf8 100644 --- a/source/_docs/authentication/multi-factor-auth.markdown +++ b/source/_docs/authentication/multi-factor-auth.markdown @@ -42,9 +42,9 @@ Click _Enable_ and a new secret key will be generated. Go to your phone app and <img src='/images/docs/authentication/mfa.png' alt='Screenshot of setting up multi-factor authentication' style='border: 0;box-shadow: none;'> -<div class='note warning'> +{% caution %} Please treat the secret key like a password - never expose it to others. -</div> +{% endcaution %} Your phone app will now start generating a different six-digit code every thirty seconds or so. Enter one of these into Home Assistant under the QR code where it asks for a _Code_. Home Assistant and your phone app are now in sync and you can now use the code displayed in the app to log in. @@ -52,15 +52,13 @@ Your phone app will now start generating a different six-digit code every thirty Once TOTP is enabled, Home Assistant requires the latest code from your phone app before you can log in. -<div class='note'> - +{% note %} TOTP is _time based_ so it relies on your Home Assistant clock being accurate. If the verification keeps failing, make sure the clock on Home Assistant is correct. - -</div> +{% endnote %} ### Notify multi-factor authentication module -The Notify MFA module uses the [notify integration](/integrations/notify/) to send you an [HMAC-based One-Time Password](https://en.wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm). It is typically sent to your phone, but can be sent to any destination supported by a `notify` service. You use this password to log in. +The Notify MFA module uses the [notify integration](/integrations/notify/) to send you an [HMAC-based One-Time Password](https://en.wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm). It is typically sent to your phone, but can be sent to any destination supported by a `notify` action. You use this password to log in. #### Setting up MFA notify @@ -76,11 +74,11 @@ homeassistant: {% configuration %} exclude: - description: The list of notifying service entities you want to exclude. + description: The list of notifying entities you want to exclude. required: false type: list include: - description: The list of notifying service entities you want to include. + description: The list of notifying entities you want to include. required: false type: list message: @@ -101,14 +99,12 @@ homeassistant: After restarting Home Assistant, go to your {% my profile %} and there should be a "Multi-factor Authentication Modules" section. Click _Enable_ on the _Notify One-Time Password_ option. -Try logging out, then logging in again. You will be asked for the six-digit one-time password that was sent to your notify service. Enter the password to log in. +Try logging out, then logging in again. You will be asked for the six-digit one-time password that was sent to your notify entity. Enter the password to log in. If the validation failed, a new one-time password will be sent again. -<div class='note'> - +{% note %} The Notify MFA module can't tell if the one-time password was delivered successfully. If you don't get the notification, you won't be able to log in. You can disable the Notify MFA module by editing or removing the file `[your_config_dir]/.storage/auth_module.notify`. - -</div> +{% endnote %} diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown index 8f42cdc12245..872f488cc53c 100644 --- a/source/_docs/authentication/providers.markdown +++ b/source/_docs/authentication/providers.markdown @@ -6,21 +6,21 @@ related: title: configuration.yaml file --- -<div class='note warning'> +{% caution %} This is an advanced feature. -</div> +{% endcaution %} When you log in, an _auth provider_ checks your credentials to make sure you are an authorized user. ## Configuring auth providers -<div class='note warning'> +{% warning %} Home Assistant automatically configures the standard auth providers so you don't need to specify `auth_providers` in your {% term "`configuration.yaml`" %} file unless you are configuring more than one. Specifying `auth_providers` will disable all auth providers that are not listed, so you could reduce your security or create difficulties logging in if it is not configured correctly. If you decide to use `trusted_networks` as your `auth_provider` there won't be a way to authenticate for a device outside of your listed trusted network. To overcome this ensure you add the default `auth_provider` with `type: homeassistant` back in manually. This will then present you with the default auth login screen when trusted network authentication fails as expected from outside your LAN. -</div> +{% endwarning %} Authentication providers are configured in your {% term "`configuration.yaml`" %} file under the `homeassistant:` block. If you are moving configuration to packages, this particular configuration must stay within 'configuration.yaml'. See Issue 16441 in the warning block at the bottom of this page. @@ -63,17 +63,13 @@ The trusted networks auth provider defines a range of IP addresses for which no When you log in from one of these networks, you will be asked which user account to use and won't need to enter a password. -<div class='note info'> - +{% note %} The [multi-factor authentication module](/docs/authentication/multi-factor-auth/) will not participate in the login process if you are using this auth provider. +{% endnote %} -</div> - -<div class='note info'> - +{% important %} You cannot trust a network that you are using in any [trusted_proxies](/integrations/http/#reverse-proxies). The `trusted_networks` authentication will fail with the message: Your computer is not allowed - -</div> +{% endimportant %} Here is an example in {% term "`configuration.yaml`" %} to set up Trusted Networks: @@ -191,10 +187,10 @@ Leading and trailing whitespace, as well as lines starting with `#` are ignored. Stderr is not read at all and just passed through to that of the Home Assistant process, hence you can use it for status messages or suchlike. -<div class='note'> +{% note %} Any leading and trailing whitespace is stripped from usernames before they're passed to the configured command. For instance, " hello " will be rewritten to just "hello". -</div> +{% endnote %} -<div class='note'> +{% note %} For now, meta variables are only respected the first time a particular user is authenticated. Upon subsequent authentications of the same user, the previously created user object with the old values is reused. -</div> +{% endnote %} diff --git a/source/_docs/automation/action.markdown b/source/_docs/automation/action.markdown index 70086ecb2ea1..ab37fb548375 100644 --- a/source/_docs/automation/action.markdown +++ b/source/_docs/automation/action.markdown @@ -3,9 +3,11 @@ title: "Automation actions" description: "Automations result in action." --- -The action of an automation rule is what is being executed when a rule fires. The action part follows the [script syntax](/docs/scripts/) which can be used to interact with anything via services or events. For {% term services %}, you can specify the entity_id that it should apply to and optional service parameters (to specify for example the brightness). +The action of an automation rule is what is being executed when a rule fires. The action part follows the [script syntax](/docs/scripts/) which can be used to interact with anything via other actions or events. -You can also call the {% term service %} to activate [a scene](/integrations/scene/) which will allow you to define how you want your devices to be and have Home Assistant call the right services. +For actions, you can specify the `entity_id` that it should apply to and optional parameters (to specify for example the brightness). + +You can also perform the action to activate [a scene](/integrations/scene/) which will allow you to define how you want your devices to be and have Home Assistant perform the right action. {% raw %} @@ -32,10 +34,10 @@ automation 2: event: sunset offset: -00:30 variables: - notification_service: notify.paulus_iphone + notification_action: notify.paulus_iphone action: # Actions are scripts so can also be a list of actions - - service: "{{ notification_service }}" + - service: "{{ notification_action }}" data: message: "Beautiful sunset!" - delay: 0:35 @@ -46,7 +48,7 @@ automation 2: {% endraw %} -Conditions can also be part of an action. You can combine multiple service calls and conditions in a single action, and they will be processed in the order you put them in. If the result of a condition is false, the action will stop there so any service calls after that condition will not be executed. +Conditions can also be part of an action. You can combine multiple actions and conditions in a single action, and they will be processed in the order you put them in. If the result of a condition is false, the action will stop there so any action after that condition will not be executed. ```yaml automation: diff --git a/source/_docs/automation/basics.markdown b/source/_docs/automation/basics.markdown index 2815c6340e76..53fdb31f4fcf 100644 --- a/source/_docs/automation/basics.markdown +++ b/source/_docs/automation/basics.markdown @@ -21,9 +21,9 @@ The second part is the [condition](/docs/automation/condition/). Conditions are The third part is the [action](/docs/automation/action/), which will be performed when a rule is triggered and all conditions are met. For example, it can turn a light on, set the temperature on your thermostat or activate a scene. -<div class='note'> +{% note %} The difference between a condition and a trigger can be confusing as they are very similar. Triggers look at the actions, while conditions look at the current state: turning a light on versus a light being on. -</div> +{% endnote %} ## Exploring the internal state @@ -37,7 +37,7 @@ Automation rules interact directly with the internal state of Home Assistant, so State changes can be used as the source of triggers and the current state can be used in conditions. -Actions are all about calling *services*. To explore the available *services* open the **{% my developer_services title="Developer Tools > Services" %}**. *Services* allow changing anything. For example turn on a light, run a script or enable a scene. Each *service* has a domain and a name. For example the *service* {% my developer_call_service service="light.turn_on" %} is capable of turning on any light in your system. Parameters can be passed to a *service* to indicate, for example, which device to activate or which color to use. +To explore the available *actions* open the {% my developer_services title="**Developer tools** > **Actions**" %}. *Actions* allow changing anything. For example, turn on a light, run a script, or enable a scene. Each *action* has a domain and a name. For example, the *action* {% my developer_call_service service="light.turn_on" %} is capable of turning on any light in your system. Parameters can be passed to an *action* to indicate, for example, which device to activate or which color to use. ## Creating automations diff --git a/source/_docs/automation/condition.markdown b/source/_docs/automation/condition.markdown index 1ecb61056d97..52080461cff4 100644 --- a/source/_docs/automation/condition.markdown +++ b/source/_docs/automation/condition.markdown @@ -3,7 +3,9 @@ title: "Automation conditions" description: "Automations can test conditions when invoked." --- -Conditions are an optional part of an automation rule. They can be used to prevent the automation's actions from being run. After a {% term trigger %} occurred, all conditions will be checked. If any of them do not return true, the automation will stop executing. Conditions look very similar to triggers, but they are very different — a trigger will look at events happening in the system, while a condition only looks at how the system looks right now. A trigger can observe that a switch is being turned on. A condition can only see if a switch is currently on or off. +Conditions are an optional part of an automation rule. They can be used to prevent the automation's actions from being run. After a {% term trigger %} occurred, all conditions will be checked. If any of them do not return true, the automation will stop executing. + +Conditions look very similar to triggers, but they are very different — a trigger will look at events happening in the system, while a condition only looks at how the system looks right now. A trigger can observe that a switch is being turned on. A condition can only see if a switch is currently on or off. The available conditions for an automation are the same as for the script syntax so see that page for a [full list of available conditions](/docs/scripts/conditions/). diff --git a/source/_docs/automation/editor.markdown b/source/_docs/automation/editor.markdown index 86335c28166a..3b2b41acf894 100644 --- a/source/_docs/automation/editor.markdown +++ b/source/_docs/automation/editor.markdown @@ -1,41 +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. +The automation editor is an easy way of creating and editing automations from the UI. -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**. +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. -![Create automation dialogue box](/images/docs/automation-editor/create-automation.png) +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**. -Click on the **Add Trigger** button and select **Numeric state**. + ![Create automation dialogue box](/images/docs/automation-editor/create-automation.png) -![Add trigger](/images/docs/automation-editor/add-trigger-to-automation.png) +3. Select **Add Trigger**, and in the **Search trigger** field, type "num". + - Select **Numeric state**. -If the value of the sensor is greater than 10, then the automation should trigger. + ![Add trigger](/images/docs/automation-editor/add-trigger-to-automation.png) -![Automation trigger](/images/docs/automation-editor/new-trigger.png) +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". -Click on the **Add Action** button and select **Call service**. + ![Automation trigger](/images/docs/automation-editor/new-trigger.png) -![Add trigger](/images/docs/automation-editor/new-action.png) +5. Define the action that should happen: + - In the **Then do** section, select **Add Action**. -The action for this automation creates a [persistent notification](/integrations/persistent_notification/). + ![Add action](/images/docs/automation-editor/add_action.png) -![Automation action](/images/docs/automation-editor/send-notification.png) +6. Select **Call service**. -As the message we want a simple text that is shown as part of the notification. + ![Add trigger](/images/docs/automation-editor/new-action.png) -```yaml -message: Sensor value greater than 10 -``` +7. We want to create a [persistent notification](/integrations/persistent_notification/). + - Enter "Persist" and select **Persistent notification: Create**. - Press the **Save** button, and the save dialogue will appear. Give your automation a meaningful name and press the **Save** button again. + ![Automation action](/images/docs/automation-editor/send-notification.png) -![New automation editor](/images/docs/automation-editor/new-automation.png) +8. As the message, we want a simple text that is shown as part of the notification. -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. + ```yaml + message: Sensor value greater than 10 + ``` + +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/services.markdown b/source/_docs/automation/services.markdown index d19403fb49af..ce4e9c03d0eb 100644 --- a/source/_docs/automation/services.markdown +++ b/source/_docs/automation/services.markdown @@ -1,46 +1,46 @@ --- -title: "Automation services" -description: "How to use the various automation services." +title: "Automation actions" +description: "How to use the various automation actions." --- -The automation integration has services to control automations, like turning automations on and off. This can be useful if you want to disable an automation from another automation. +The automation integration has actions to control automations, like turning automations on and off. This can be useful if you want to disable an automation from another automation. -## Service {% my developer_call_service service="automation.turn_on" %} +## Action {% my developer_call_service service="automation.turn_on" %} -This service enables the automation's {% term triggers %}. +This action enables the automation's {% term triggers %}. -Service data attribute | Optional | Description +Data attribute | Optional | Description -|-|- `entity_id` | no | Entity ID of automation to turn on. Can be a list. `none` or `all` are also accepted. -## Service {% my developer_call_service service="automation.turn_off" %} +## Action {% my developer_call_service service="automation.turn_off" %} -This service disables the automation's {% term triggers %}, and optionally stops any currently active {% term actions %}. +This action disables the automation's {% term triggers %}, and optionally stops any currently active {% term actions %}. -Service data attribute | Optional | Description +Data attribute | Optional | Description -|-|- `entity_id` | no | Entity ID of automation to turn off. Can be a list. `none` or `all` are also accepted. `stop_actions` | yes | Stop any currently active actions (defaults to true). -## Service {% my developer_call_service service="automation.toggle" %} +## Action {% my developer_call_service service="automation.toggle" %} -This service enables the automation's triggers if they were disabled, or disables the automation's triggers, and stops any currently active actions, if the triggers were enabled. +This action enables the automation's triggers if they were disabled, or disables the automation's triggers, and stops any currently active actions, if the triggers were enabled. -Service data attribute | Optional | Description +Data attribute | Optional | Description -|-|- `entity_id` | no | Entity ID of automation to turn on. Can be a list. `none` or `all` are also accepted. -## Service {% my developer_call_service service="automation.trigger" %} +## Action {% my developer_call_service service="automation.trigger" %} -This service will trigger the {% term action %} of an {% term automation %}. By default it bypasses any conditions, though that can be changed via the `skip_condition` attribute. +This action will trigger the {% term action %} of an {% term automation %}. By default it bypasses any conditions, though that can be changed via the `skip_condition` attribute. -Service data attribute | Optional | Description +Data attribute | Optional | Description -|-|- `entity_id` | no | Entity ID of automation to trigger. Can be a list. `none` or `all` are also accepted. `skip_condition` | yes | Whether or not the condition will be skipped (defaults to true). -## Service {% my developer_call_service service="automation.reload" %} +## Action {% my developer_call_service service="automation.reload" %} -_This service is only required if you create/edit automations in YAML. Automations via the UI do this automatically._ +_This action is only required if you create/edit automations in YAML. Automations via the UI do this automatically._ -This service reloads all automations, stopping all currently active automation actions. +This action reloads all automations, stopping all currently active automation actions. diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown index 9625c7eaa55a..a1e246c74975 100644 --- a/source/_docs/automation/trigger.markdown +++ b/source/_docs/automation/trigger.markdown @@ -118,11 +118,9 @@ automation: It's also possible to use [limited templates](/docs/configuration/templating/#limited-templates) in the `event_type`, `event_data` and `context` options. -<div class='note'> - +{% important %} The `event_type`, `event_data` and `context` templates are only evaluated when setting up the trigger, they will not be reevaluated for every event. - -</div> +{% endimportant %} {% raw %} @@ -151,11 +149,9 @@ automation: event: start ``` -<div class='note'> - +{% note %} Automations triggered by the `shutdown` event have 20 seconds to run, after which they are stopped to continue with the shutdown. - -</div> +{% endnote %} ## MQTT trigger @@ -189,11 +185,9 @@ automation: It's also possible to use [limited templates](/docs/configuration/templating/#limited-templates) in the `topic` and `payload` options. -<div class='note'> - +{% note %} The `topic` and `payload` templates are only evaluated when setting up the trigger, they will not be re-evaluated for every incoming MQTT message. - -</div> +{% endnote %} {% raw %} @@ -217,10 +211,10 @@ automation: Fires when the numeric value of an entity's state (or attribute's value if using the `attribute` property, or the calculated value if using the `value_template` property) **crosses** a given threshold (equal excluded). On state change of a specified entity, attempts to parse the state as a number and fires if the value is changing from above to below or from below to above the given threshold (equal excluded). -<div class='note'> +{% note %} Crossing the threshold means that the trigger only fires if the state wasn't previously within the threshold. If the current state of your entity is `50` and you set the threshold to `below: 75`, the trigger would not fire if the state changed to e.g. `49` or `72` because the threshold was never crossed. The state would first have to change to e.g. `76` and then to e.g. `74` for the trigger to fire. -</div> +{% endnote %} {% raw %} @@ -292,10 +286,10 @@ automation: {% endraw %} -<div class='note'> +{% note %} Listing above and below together means the numeric_state has to be between the two values. In the example above, the trigger would fire a single time if a numeric_state goes into the 17.1-24.9 range (above 17 and below 25). It will only fire again, once it has left the defined range and enters it again. -</div> +{% endnote %} Number helpers (`input_number` entities), `number`, `sensor`, and `zone` entities that contain a numeric value, can be used in the `above` and `below` thresholds, @@ -355,24 +349,20 @@ automation: The `for` template(s) will be evaluated when an entity changes as specified. -<div class='note warning'> - +{% important %} Use of the `for` option will not survive Home Assistant restart or the reload of automations. During restart or reload, automations that were awaiting `for` the trigger to pass, are reset. If for your use case this is undesired, you could consider using the automation to set an [`input_datetime`](/integrations/input_datetime) to the desired time and then use that [`input_datetime`](/integrations/input_datetime) as an automation trigger to perform the desired actions at the set time. - -</div> +{% endimportant %} ## State trigger Fires when the state of any of given entities changes. If only `entity_id` is given, the trigger will fire for all state changes, even if only state attributes change. If at least one of `from`, `to`, `not_from`, or `not_to` are given, the trigger will fire on any matching state change, but not if only attributes change. To trigger on all state changes, but not on changed attributes, set at least one of `from`, `to`, `not_from`, or `not_to` to `null`. -<div class='note'> - +{% note %} The values you see in your overview will often not be the same as the actual state of the entity. For instance, the overview may show `Connected` when the underlying entity is actually `on`. You should check the state of the entity by looking in the _States_ menu under _Developer tools_. - -</div> +{% endnote %} ```yaml automation: @@ -534,19 +524,15 @@ automation: The `for` template(s) will be evaluated when an entity changes as specified. -<div class='note warning'> - +{% tip %} Use quotes around your values for `from` and `to` to avoid the YAML parser from interpreting values as booleans. +{% endtip %} -</div> - -<div class='note warning'> - +{% important %} Use of the `for` option will not survive Home Assistant restart or the reload of automations. During restart or reload, automations that were awaiting `for` the trigger to pass, are reset. If for your use case this is undesired, you could consider using the automation to set an [`input_datetime`](/integrations/input_datetime) to the desired time and then use that [`input_datetime`](/integrations/input_datetime) as an automation trigger to perform the desired actions at the set time. - -</div> +{% endimportant %} ## Sun trigger @@ -556,11 +542,9 @@ Fires when the sun is setting or rising, i.e., when the sun elevation reaches 0 An optional time offset can be given to have it fire a set time before or after the sun event (e.g., 45 minutes before sunset). A negative value makes it fire before sunrise or sunset, a positive value afterwards. The offset needs to be specified in number of seconds, or in a hh:mm:ss format. -<div class='note'> - +{% tip %} Since the duration of twilight is different throughout the year, it is recommended to use [sun elevation triggers][sun_elevation_trigger] instead of `sunset` or `sunrise` with a time offset to trigger automations during dusk or dawn. - -</div> +{% endtip %} [sun_elevation_trigger]: /docs/automation/trigger/#sun-elevation-trigger @@ -688,13 +672,11 @@ The `for` template(s) will be evaluated when the `value_template` becomes 'true' Templates that do not contain an entity will be rendered once per minute. -<div class='note warning'> - +{% important %} Use of the `for` option will not survive Home Assistant restart or the reload of automations. During restart or reload, automations that were awaiting `for` the trigger to pass, are reset. If for your use case this is undesired, you could consider using the automation to set an [`input_datetime`](/integrations/input_datetime) to the desired time and then use that [`input_datetime`](/integrations/input_datetime) as an automation trigger to perform the desired actions at the set time. - -</div> +{% endimportant %} ## Time trigger @@ -805,11 +787,9 @@ automation 3: minutes: "/5" ``` -<div class='note warning'> - +{% note %} Do not prefix numbers with a zero - using `'01'` instead of `'1'` for example will result in errors. - -</div> +{% endnote %} ## Persistent notification trigger @@ -894,11 +874,9 @@ automation: Geolocation trigger fires when an entity is appearing in or disappearing from a zone. Entities that are created by a [Geolocation](/integrations/geo_location/) platform support reporting GPS coordinates. Because entities are generated and removed by these platforms automatically, the entity ID normally cannot be predicted. Instead, this trigger requires the definition of a `source`, which is directly linked to one of the Geolocation platforms. -<div class='note'> - +{% tip %} This isn't for use with `device_tracker` entities. For those look above at the `zone` trigger. - -</div> +{% endtip %} ```yaml automation: diff --git a/source/_docs/automation/troubleshooting.markdown b/source/_docs/automation/troubleshooting.markdown index 458a88dc5b2a..455fbf68abe5 100644 --- a/source/_docs/automation/troubleshooting.markdown +++ b/source/_docs/automation/troubleshooting.markdown @@ -13,19 +13,19 @@ Many automations can be tested directly in the automation editor UI. In the three dots menu in the automation list or automation editor UI, select the **Run** button. This will execute all of the {% term actions %}, while skipping all {% term triggers %} and {% term conditions %}. This lets you test the full sequence of actions, as if the automation was triggered and all conditions were true. Note that any [trigger ID](/docs/automation/trigger/#trigger-id) used in your triggers will not be active when you test this way. The Trigger ID or any data passed by in the `trigger` data in conditions or actions can't be tested directly this way. -You can also trigger an automation manually. This can test the conditions as if the automation was triggered by an event. Navigate to {% my developer_services title="**Developer tools** > **Services**" %}. In the service selection drop-down, select **Automation: Trigger**, then **Choose entity** to select the automation you are testing. Toggle whether to skip the conditions, then **Call service**. If needed, additional `trigger` or other data can be added in the YAML view for testing. The [trigger](/docs/automation/trigger/) page has more information about data within the trigger. +You can also trigger an automation manually. This can test the conditions as if the automation was triggered by an event. Navigate to {% my developer_services title="**Developer tools** > **Actions**" %}. In the **Action** drop-down, select **Automation: Trigger**, then **Choose entity** to select the automation you are testing. Toggle whether to skip the conditions, then **Perform action**. If needed, additional `trigger` or other data can be added in the YAML view for testing. The [trigger](/docs/automation/trigger/) page has more information about data within the trigger. Testing with complex triggers, conditions, and variables can be difficult. Note that using the **Run** button will skip all triggers and conditions, while **Developer Tools** can be used with or without checking conditions. ### Running individual actions or conditions -In the automation editor UI, each {% term condition %} and {% term action %} can be tested individually. Select the three dots menu, then the **Test** button. +In the automation editor UI, each {% term condition %} and {% term action %} can be tested individually. Select the three dots {% icon "mdi:dots-vertical" %} menu, then the **Test** button. - Testing a condition will highlight it to show whether the condition passed at the moment it was tested. If all conditions pass, then the automation will run when triggered. Testing building blocks like an **and** condition will report whether the whole block registers as true or false, or you can test individual conditions within the building block. - Testing an action block will run that block immediately. -Note that complex automations that depend on previous blocks, such as trigger IDs, variables in templates, or service calls that return data to use in subsequent blocks, cannot be tested this way. +Note that complex automations that depend on previous blocks, such as trigger IDs, variables in templates, or action calls that return data to use in subsequent blocks, cannot be tested this way. If you are writing automations in YAML, it is also useful to go to {% my server_controls title="**Developer tools** > **YAML**" %}** and in the Configuration validation section, select the **Check configuration** button. This is to make sure there are no syntax errors before restarting Home Assistant. In order for **Check configuration** to be visible, you must enable **Advanced Mode** on {% my profile title="your user profile" %}. diff --git a/source/_docs/automation/using_blueprints.markdown b/source/_docs/automation/using_blueprints.markdown index 70f6af83cc3d..5b8452bcece5 100644 --- a/source/_docs/automation/using_blueprints.markdown +++ b/source/_docs/automation/using_blueprints.markdown @@ -41,22 +41,46 @@ Home Assistant can import blueprints from the Home Assistant forums, GitHub, and The blueprint can now be used for creating automations. +## Editing an imported blueprint + +You can tweak an imported blueprint by "taking control" of this blueprint. Home Assistant then converts the blueprint automation into a regular automation, allowing you to make any tweak without having to fully re-invent the wheel. + +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 {% 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) + ## Re-importing a blueprint Blueprints created by the community may go through multiple revisions. Sometimes a user creates a blueprint, -the community provides feedback, and new functionality is added. +the community provides feedback, new functionality is added. -The quickest way to get these changes is by re-importing the blueprint. This will overwrite the blueprint you currently have. +The quickest way to get these changes, is by re-importing the blueprint. This will overwrite the blueprint you currently have. -1. **Before you do this**: If the re-imported blueprint is not compatible, it can break your automations. - - In this case, you will need to manually adjust your automations. -2. Go to **{% my blueprints title="Settings > Automations & Scenes > Blueprints" %}**. -3. On the blueprint that you want to re-import, select the three-dot menu, and select **Re-import blueprint**. +{% caution %} + +**Before you do this**: If the re-imported blueprint is not compatible, it can break your automations. + +- In this case, you will need to manually adjust your automations. + +{% endcaution%} + +### To re-import a blueprint + +1. Go to **{% my blueprints title="Settings > Automations & Scenes > Blueprints" %}**. +2. On the blueprint that you want to re-import, select the three-dot menu, and select **Re-import blueprint**. -## Updating an imported blueprint manually +## Updating an imported blueprint in YAML Blueprints created by the community may go through multiple revisions. Sometimes a user creates a blueprint, -the community provides feedback, and new functionality is added. +the community provides feedback, new functionality is added. If you do not want to [re-import the blueprint](/docs/automation/using_blueprints/#re-importing-a-blueprint) for some reason, you can manually edit its YAML content to keep it up to date: diff --git a/source/_docs/automation/yaml.markdown b/source/_docs/automation/yaml.markdown index 48c6233ead7c..11f4e3511472 100644 --- a/source/_docs/automation/yaml.markdown +++ b/source/_docs/automation/yaml.markdown @@ -114,12 +114,12 @@ action: ### Automation modes -Mode | Description --|- -`single` | Do not start a new run. Issue a warning. -`restart` | Start a new run after first stopping previous run. -`queued` | Start a new run after all previous runs complete. Runs are guaranteed to execute in the order they were queued. -`parallel` | Start a new, independent run in parallel with previous runs. +| Mode | Description | +| ---------- | --------------------------------------------------------------------------------------------------------------- | +| `single` | Do not start a new run. Issue a warning. | +| `restart` | Start a new run after first stopping previous run. | +| `queued` | Start a new run after all previous runs complete. Runs are guaranteed to execute in the order they were queued. | +| `parallel` | Start a new, independent run in parallel with previous runs. | <p class='img'> <img src='/images/integrations/script/script_modes.jpg'> @@ -157,7 +157,7 @@ automation my_lights: after: "16:00:00" before: "23:00:00" action: - # With a single service call, we don't need a '-' before service - though you can if you want to + # With a single service entry, we don't need a '-' before service - though you can if you want to - service: homeassistant.turn_on target: entity_id: group.living_room @@ -265,6 +265,6 @@ If you want to migrate your manual automations to use the editor, you'll have to When automations remain visible in the Home Assistant dashboard, even after having deleted in the YAML file, you have to delete them in the UI. -To delete them completely, go to UI **{% my entities title="Settings -> Devices & Services -> Entities" %}** and find the automation in the search field or by scrolling down. +To delete them completely, go to UI {% my entities title="**Settings** > **Devices & services** > **Entities**" %} and find the automation in the search field or by scrolling down. Check the square box aside of the automation you wish to delete and from the top-right of your screen, select 'REMOVE SELECTED'. diff --git a/source/_docs/backend/database.markdown b/source/_docs/backend/database.markdown index f16cf2a2553a..3f5965cb7fde 100644 --- a/source/_docs/backend/database.markdown +++ b/source/_docs/backend/database.markdown @@ -3,7 +3,9 @@ title: "Database" description: "Details about the database used by Home Assistant." --- -Home Assistant uses databases to store {% term events %} and parameters for history and tracking. The default database used is [SQLite](https://www.sqlite.org/) and the database file is stored in your [configuration directory](/getting-started/configuration/) (e.g., `<path to config dir>/home-assistant_v2.db`); however, other databases can be used. If you prefer to run a database server (e.g., PostgreSQL), use the [`recorder`](/integrations/recorder/) integration. +Home Assistant uses databases to store {% term events %} and parameters for history and tracking. The default database used is [SQLite](https://www.sqlite.org/). + +The database file is stored in your [configuration directory](/docs/configuration/#to-find-the-configuration-directory) (e.g., `<path to config dir>/home-assistant_v2.db`); however, other databases can be used. If you prefer to run a database server (e.g., PostgreSQL), use the [`recorder`](/integrations/recorder/) integration. To work with SQLite database manually from the command-line, you will need an [installation](https://www.sqlitetutorial.net/download-install-sqlite/) of `sqlite3`. Alternatively [DB Browser for SQLite](https://sqlitebrowser.org/) provides a viewer for exploring the database data and an editor for executing SQL commands. First load your database with `sqlite3`: @@ -125,6 +127,6 @@ group.all_switches 8018 ### Delete -If you don't want to keep certain entities, you can delete them permanently by using the [services provided by the recorder](/integrations/recorder/#service-purge_entities). +If you don't want to keep certain entities, you can delete them permanently by using the [actions provided by the recorder](/integrations/recorder/#action-purge_entities). For a more interactive way of working with the database, check the [Data Science Portal](https://data.home-assistant.io/). diff --git a/source/_docs/blueprint/schema.markdown b/source/_docs/blueprint/schema.markdown index 42c35e1a0a79..93d404a14e22 100644 --- a/source/_docs/blueprint/schema.markdown +++ b/source/_docs/blueprint/schema.markdown @@ -153,9 +153,9 @@ allows an optional description, and optionally allows for collapsing those input A section is differentiated from an input by the presence of an additional `input` key within that section. -<div class='note warning'> +{% caution %} Input sections are a new feature in version 2024.6. Set the `min_version` for the blueprint to at least this version if using input sections. Otherwise, the blueprint will generate errors on older versions. -</div> +{% endcaution %} The full configuration for a section is below: diff --git a/source/_docs/blueprint/selectors.markdown b/source/_docs/blueprint/selectors.markdown index fb7419dc58e0..2282adf51de0 100644 --- a/source/_docs/blueprint/selectors.markdown +++ b/source/_docs/blueprint/selectors.markdown @@ -1107,7 +1107,7 @@ number: ## Object selector -The object selector can be used to input arbitrary data in YAML form. This is useful for e.g. lists and dictionaries like service data. The value of the input will contain the provided data. +The object selector can be used to input arbitrary data in YAML form. This is useful for e.g. lists and dictionaries containing data for actions. The value of the input will contain the provided data. ![Screenshot of an object selector](/images/blueprints/selector-object.png) @@ -1290,9 +1290,9 @@ For example: `heat_cool`. ## Target selector The target selector is a rather special selector, allowing the user to select -targeted entities, devices or areas for service calls. The value of +targeted entities, devices, or areas for actions. The value of the input will contain a special target format, that is accepted by -service calls. +actions. The selectable targets can be filtered, based on entity or device properties. Areas are only selectable as a target, if some entities or devices match @@ -1365,9 +1365,9 @@ entity: required: false {% endconfiguration %} -<div class='note'> +{% important %} -Targets are meant to be used with the `target` property of a service call in +Targets are meant to be used with the `target` property of an action in a script sequence. For example: ```yaml @@ -1376,7 +1376,7 @@ action: target: !input lights ``` -</div> +{% endimportant %} ### Example target selectors <!-- omit from toc --> diff --git a/source/_docs/blueprint/tutorial.markdown b/source/_docs/blueprint/tutorial.markdown index 6f988e5465cf..7b1fba184ce6 100644 --- a/source/_docs/blueprint/tutorial.markdown +++ b/source/_docs/blueprint/tutorial.markdown @@ -19,11 +19,9 @@ related: title: Using automation blueprints --- -<div class='note'> - +{% tip %} While the tutorial only shows how to create an automation blueprint, {% term scripts %} also support blueprints in the same way. - -</div> +{% endtip %} ## Creating an automation blueprint @@ -65,7 +63,7 @@ action: The options that can be used with the `trigger` object are listed under [automation trigger variables](/docs/automation/templating/#available-trigger-data). In this example, a [state trigger](/docs/automation/templating/#state) is used. -`turn_on` and `turn_off` are [`homeassistant` services](/docs/scripts/service-calls/#homeassistant-services). They are not tied to a specific domain. You can use them on lights, switches, and other domains. +`turn_on` and `turn_off` are [`homeassistant` actions](/docs/scripts/service-calls/#homeassistant-actions). They are not tied to a specific domain. You can use them on lights, switches, and other domains. ### Creating the blueprint file @@ -98,7 +96,7 @@ trigger: entity_id: !input motion_sensor ``` -For the light, we can offer some more flexibility. We want to allow the user to be able to define any device or area as the target. The `target` property in the service action can contain references to areas, devices and/or entities, so that's what we will use. +For the light, we can offer some more flexibility. We want to allow the user to be able to define any device or area as the target. The `target` property in the action can contain references to areas, devices, and/or entities, so that's what we will use. Inputs are not limited to strings. They can contain complex objects too. So in this case, we're going to mark the whole `target` as input: @@ -256,9 +254,9 @@ action: 1. To configure your blueprint via the UI, go to {% my blueprints title="**Settings** > **Automations & Scenes** > **Blueprints**" %}. 2. Find the **Motion Light Tutorial** blueprint and select **Create Automation**. -<div class='note'> +{% important %} Don't forget to reload automations after you make changes to your blueprint to have the UI and the automation integration pick up the latest blueprint changes. -</div> +{% endimportant %} ![Screenshot of the blueprint UI](/images/blueprints/tutorial-ui.png) diff --git a/source/_docs/configuration.markdown b/source/_docs/configuration.markdown index dbee90a3ba98..b73bfb1378fc 100644 --- a/source/_docs/configuration.markdown +++ b/source/_docs/configuration.markdown @@ -20,7 +20,9 @@ related: title: Troubleshooting the configuration --- -While you can configure most of Home Assistant from the user interface, for some integrations, you need to edit the `configuration.yaml` file. This file contains {% term integrations %} to be loaded along with their configurations. Throughout the documentation, you will find snippets that you can add to your configuration file to enable specific functionality. +While you can configure most of Home Assistant from the user interface, for some integrations, you need to edit the `configuration.yaml` file. + +This file contains {% term integrations %} to be loaded along with their configurations. Throughout the documentation, you will find snippets that you can add to your configuration file to enable specific functionality. <p class='img'> <img src='/images/docs/configuration/config-yaml_via-file-editor.png' alt='Screenshot of an example of a configuration.yaml file, accessed using the File editor add-on on a Home Assistant Operating System installation.'> @@ -29,36 +31,50 @@ Example of a configuration.yaml file, accessed using the File editor add-on on a ## Editing `configuration.yaml` -How you edit your `configuration.yaml` file depends on your editor preferences and the [installation method](/installation/#advanced-installation-methods) you used to set up Home Assistant. +How you edit your `configuration.yaml` file depends on your editor preferences and the [installation method](/installation/#advanced-installation-methods) you used to set up Home Assistant. Follow these steps: + +1. [Set up file access](#to-set-up-access-to-the-files-and-prepare-an-editor). +2. [Locate the config directory](#to-find-the-configuration-directory). +3. Edit your `configuration.yaml` file. +4. Save your changes and [reload the configuration](#reloading-the-configuration-to-apply-changes) to apply the changes. ### To set up access to the files and prepare an editor Before you can edit a file, you need to know how to access files in Home Assistant and setup an editor. File access depends on your [installation method](/installation/#advanced-installation-methods). If you use {% term "Home Assistant Operating System" %} or {% term "Home Assistant Supervised" %}, you can use editor add-ons, for example, but not if you use {% term "Home Assistant Core" %} or {% term "Home Assistant Container" %}. -1. To set up file access, follow the steps for your [installation method](/installation/#advanced-installation-methods): +To set up file access, follow the steps for your [installation method](/installation/#advanced-installation-methods): + +- [Configure file access on the Operating System](/common-tasks/os/#configuring-access-to-files): + - If you are unsure which option to choose, install the [file editor add-on](/common-tasks/os/#installing-and-using-the-file-editor-add-on). + - Alternatively, use the [Studio Code Server add-on](/common-tasks/os/#installing-and-using-the-visual-studio-code-vsc-add-on). This editor offers live syntax checking and auto-fill of various Home Assistant entities. But it looks more complex than the file editor. + - If you prefer to use a file editor on your computer, use the [Samba add-on](/common-tasks/os/#installing-and-using-the-samba-add-on). +- [Configure file access on Supervised](/common-tasks/supervised/#configuring-access-to-files): + - Using the [File editor add-on](/common-tasks/supervised/#installing-and-using-the-file-editor-add-on). + - Using the [Studio Code Server add-on](/common-tasks/supervised/#installing-and-using-the-visual-studio-code-vsc-add-on). + - Using the [Samba add-on](/common-tasks/supervised/#installing-and-using-the-samba-add-on). - - [Configure file access on the Operating System](/common-tasks/os/#configuring-access-to-files): - - If you are unsure which option to choose, install the [file editor add-on](/common-tasks/os/#installing-and-using-the-file-editor-add-on). - - Alternatively, use the [Studio Code Server add-on](/common-tasks/os/#installing-and-using-the-visual-studio-code-vsc-add-on). This editor offers live syntax checking and auto-fill of various Home Assistant entities. But it looks more complex than the file editor. - - If you prefer to use a file editor on your computer, use the [Samba add-on](/common-tasks/os/#installing-and-using-the-samba-add-on). - - [Configure file access on Supervised](/common-tasks/supervised/#configuring-access-to-files): - - Using the [File editor add-on](/common-tasks/supervised/#installing-and-using-the-file-editor-add-on). - - Using the [Studio Code Server add-on](/common-tasks/supervised/#installing-and-using-the-visual-studio-code-vsc-add-on). - - Using the [Samba add-on](/common-tasks/supervised/#installing-and-using-the-samba-add-on). +### To find the configuration directory -2. To look up the path to your configuration directory, go to {% my system_health title="**Settings** > **System** > **Repairs**" %}. +1. To look up the path to your configuration directory, go to {% my system_health title="**Settings** > **System** > **Repairs**" %}. - Select the three dots menu and select **System information**. ![Show system information option](/images/screenshots/System_information_menu.png) -3. Find out the location of the **Configuration directory**. +2. Find out the location of the **Configuration directory**. ![Screenshot showing the top of the system information panel](/images/screenshots/system_information.png) - Unless you changed the file structure, the default is as follows: - - {% term "Home Assistant Operating System" %}: the `configuration.yaml` is in the `/config` folder of the installation. - {% term "Home Assistant Container" %}: the `configuration.yaml` is in the config folder that you mounted in your container. - {% term "Home Assistant Core" %}: the `configuration.yaml` is in the config folder passed to the `hass` command (default is `~/.homeassistant`). +3. Once you located the config folder, you can edit your `configuration.yaml` file. + +{% note %} + +If you have watched any videos about setting up Home Assistant using `configuration.yaml` (particularly ones that are old), you might notice your default configuration file is much smaller than what the videos show. Don't be concerned, you haven't done anything wrong. Many items in the default configuration files shown in those old videos are now included in the `default_config:` line that you see in your configuration file. Refer to the [default config integration](/integrations/default_config/) for more information on what's included in that line. + +{% endnote %} ## Validating the configuration @@ -75,7 +91,7 @@ The method for running a configuration check depends on your [installation type] For configuration changes to become effective, the configuration must be reloaded. Most integrations in Home Assistant (that do not interact with {% term devices %} or {% term services %}) can reload changes made to their configuration in `configuration.yaml` without needing to restart Home Assistant. -1. Under **Settings**, select the three dots menu (top right), select **Restart Home Assistant** > **Quick reload**. +1. Under **Settings**, select the three dots menu (top right) {% icon "mdi:dots-vertical" %}, select **Restart Home Assistant** > **Quick reload**. ![Settings, three dot menu, restart Home Assistant](/images/docs/configuration/settings_restart_ha.png) diff --git a/source/_docs/configuration/basic.markdown b/source/_docs/configuration/basic.markdown index 179d1a93475c..016a622a5d1b 100644 --- a/source/_docs/configuration/basic.markdown +++ b/source/_docs/configuration/basic.markdown @@ -13,13 +13,19 @@ As part of the default onboarding process, Home Assistant can detect your locati Screenshot showing the General settings page. </p> -The general settings described here are managed by the [Home Assistant Core integration](/integrations/homeassistant/). If you are interested in the services offered by this integration, check out the integration documentation. +The general settings described here are managed by the [Home Assistant Core integration](/integrations/homeassistant/). If you are interested in the actions offered by this integration, check out the integration documentation. ## Editing the general settings To change the general settings that were defined during onboarding, follow these steps: -1. Go to {% my general title="**Settings** > **System** > **General**" %} and make your changes. +1. Go to {% my general title="**Settings** > **System** > **General**" %}. + - Make your changes. + - To change location or radius, under **Edit location**, select edit. + - Then, adjust location and radius. + <img class="no-shadow" src='/images/docs/configuration/change_location_radius.webp' alt='Screencast showing how to zoom and pan to change location and radius on the Edit home page'> + - To add a new zone, select **Add zone**. + - To save your changes, select **Update**. 2. To change network-related configuration, such as the network name, go to {% my network title="**Settings** > **System** > **Network**" %}. 3. If some of the settings are not visible, you may need to enable **Advanced mode**. - In the bottom left, select your username to go to your {% my profile title="**User profile**" %}, and enable **Advanced mode**. @@ -30,3 +36,38 @@ To change the general settings that were defined during onboarding, follow these ![Setting fields are grayed out because the configuration settings stored in configuration.yaml file](/images/docs/configuration/general-settings-stored-in-config-yaml.png) 5. To apply the changes, follow the steps on [reloading the configuration](/docs/configuration/#reloading-configuration-changes). + +## Changing a person's display name + +The display name is the name that is shown in Home Assistant. It can differ from the user name, which is the name used to log in. + +### Prerequisites + +- You need administrator rights to change a display name. + +## To change a display name + +1. To edit the display name of a person using Home Assistant, go to {% my people title="**Settings** > **People**" %} and select the person for which you want to change the display name. +2. Change the display name and select **Update** to save the change. + +## Changing a user name + +The user name is the name that is used to log in. It can differ from the display name. + +### Prerequisites + +- You need owner rights to change a user name. + +### To change a username + +1. To edit the username of a person using Home Assistant, go to {% my people title="**Settings** > **People**" %} and select the person for which you want to change the display name. +2. Change the username and select **Update** to save the change. + - The log in is case-sensitive. + +## Changing authentication settings + +To learn how to edit authentication settings such as password or multi-factor authentication, refer to the following topics: + +- [Authentication](/docs/authentication/) +- [multi-factor authentication](/docs/authentication/multi-factor-auth/) +- [Help, I'm locked out](/docs/locked_out/) diff --git a/source/_docs/configuration/events.markdown b/source/_docs/configuration/events.markdown index 3d4eb05f3df3..627114b8c2b5 100644 --- a/source/_docs/configuration/events.markdown +++ b/source/_docs/configuration/events.markdown @@ -3,7 +3,9 @@ title: "Events" description: "Describes all there is to know about events in Home Assistant." --- -The core of Home Assistant is the event bus. The event bus allows any integration to fire or listen for events. It is the core of everything. For example, any state change will be announced on the event bus as a `state_changed` event containing the previous and the new state of an entity. +The core of Home Assistant is the event bus. The event bus allows any integration to fire or listen for events. It is the core of everything. + +For example, any state change will be announced on the event bus as a `state_changed` event containing the previous and the new state of an entity. Home Assistant contains a few built-in events that are used to coordinate between various integrations. @@ -24,13 +26,13 @@ In addition, all events contain a `data` dictionary with event-specific informat ### `call_service` -This event is fired when a service is called. +This event is fired when an service action is performed | Field | Description | | ----------------- | ------------------------------------------------------------------------------ | -| `domain` | Domain of the service. Example: `light`. | -| `service` | The service to call. Example: `turn_on` | -| `service_data` | Dictionary with the service call parameters. Example: `{ 'brightness': 120 }`. | +| `domain` | Domain of the action. Example: `light`. | +| `service` | The service action that is performed. Example: `turn_on` | +| `service_data` | Dictionary with the call parameters. Example: `{ 'brightness': 120 }`. | | `service_call_id` | String with a unique call id. Example: `23123-4`. | ### `component_loaded` @@ -94,21 +96,21 @@ If you want to trigger automation on a Home Assistant stop event, we recommend u ### `service_registered` -This event is fired when a new service has been registered within Home Assistant. +This event is fired when a new service action has been registered within Home Assistant. | Field | Description | | --------- | ----------------------------------------------------------------------- | -| `domain` | The domain of the integration that offers this service. Example: `light`. | -| `service` | The name of the service. Example: `turn_on` | +| `domain` | The domain of the integration that offers this action. Example: `light`. | +| `service` | The name of the service action. Example: `turn_on` | ### `service_removed` -This event is fired when a service has been removed from Home Assistant. +This event is fired when a service action has been removed from Home Assistant. | Field | Description | | --------- | ----------------------------------------------------------------------- | -| `domain` | The domain of the integration that offers this service. Example: `light`. | -| `service` | The name of the service. Example: `turn_on` | +| `domain` | The domain of the integration that offers this action. Example: `light`. | +| `service` | The name of the service action. Example: `turn_on` | ### `state_changed` diff --git a/source/_docs/configuration/packages.markdown b/source/_docs/configuration/packages.markdown index b5b2126b6bf7..5465ddc9968c 100644 --- a/source/_docs/configuration/packages.markdown +++ b/source/_docs/configuration/packages.markdown @@ -68,9 +68,9 @@ There are some rules for packages that will be merged: 3. Any integration that is not a platform [1], or dictionaries with Entity ID keys [2] can only be merged if its keys, except those for lists, are solely defined once. -<div class='note tip'> +{% tip %} Integrations inside packages can only specify platform entries using configuration style 1, where all the platforms are grouped under the integration name. -</div> +{% endtip %} ## Create a packages folder @@ -114,10 +114,8 @@ homeassistant: ``` -<div class='note warning'> - +{% important %} If you are moving configuration to packages, `auth_providers` must stay within ‘configuration.yaml’. See the general documentation for [Authentication Providers](/docs/authentication/providers/#configuring-auth-providers). This is because Home Assistant processes the authentication provided early in the start-up process, even before packages are processed. - -</div> +{% endimportant %} diff --git a/source/_docs/configuration/platform_options.markdown b/source/_docs/configuration/platform_options.markdown index 0f0c443d67d9..d7b7e3a39f87 100644 --- a/source/_docs/configuration/platform_options.markdown +++ b/source/_docs/configuration/platform_options.markdown @@ -3,9 +3,9 @@ title: "Entity integration platform options" description: "Shows how to customize polling interval for any integration via configuration.yaml." --- -<div class='note info'> +{% important %} These options are being phased out and are only available for single platform integrations. -</div> +{% endimportant %} Some integrations or platforms (those that are based on the [entity](https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/helpers/entity.py) class) allow various extra options to be set. diff --git a/source/_docs/configuration/remote.markdown b/source/_docs/configuration/remote.markdown index c00987c0f93e..e2f3616f15c4 100644 --- a/source/_docs/configuration/remote.markdown +++ b/source/_docs/configuration/remote.markdown @@ -10,11 +10,9 @@ related: If you're interested in logging in to Home Assistant while away, you'll have to make your instance remotely accessible. Below are a few options to do this. -<div class='note warning'> - +{% tip %} Remember to follow the [securing checklist](/docs/configuration/securing/) before doing this. - -</div> +{% endtip %} ## Home Assistant Cloud @@ -36,11 +34,9 @@ A problem with making a port accessible is that some Internet Service Providers If you cannot access your Home Assistant installation remotely, remember to check if your ISP provides you with a dedicated IP, instead of one shared with other users via a [CG-NAT](https://en.wikipedia.org/wiki/Carrier-grade_NAT). This is becoming fairly common nowadays due to the shortage of IPv4 addresses. Some, if not most ISPs will require you to pay an extra fee to be assigned a dedicated IPv4 address. -<div class='note'> - +{% caution %} Just putting a port up is not secure. You should definitely consider encrypting your traffic if you are accessing your Home Assistant installation remotely. For details, please check the [set up encryption using Let's Encrypt](/blog/2017/09/27/effortless-encryption-with-lets-encrypt-and-duckdns/) blog post or this [detailed guide](https://community.home-assistant.io/t/certificate-authority-and-self-signed-certificate-for-ssl-tls/196970) to using Let's Encrypt with Home Assistant. - -</div> +{% endcaution %} ## Adding a remote URL to Home Assistant diff --git a/source/_docs/configuration/secrets.markdown b/source/_docs/configuration/secrets.markdown index e06de57973d8..010db2271ac6 100644 --- a/source/_docs/configuration/secrets.markdown +++ b/source/_docs/configuration/secrets.markdown @@ -10,7 +10,9 @@ related: title: Securing your instance --- -The {% term "`configuration.yaml`" %} file is a plain-text file, thus it is readable by anyone who has access to the file. The file contains passwords and API tokens which need to be redacted if you want to share your configuration. By using `!secret` you can remove any private information from your configuration files. This separation can also help you to keep easier track of your passwords and API keys, as they are all stored at one place and no longer spread across the {% term "`configuration.yaml`" %} file or even multiple YAML files if you [split up your configuration](/docs/configuration/splitting_configuration/). +The {% term "`configuration.yaml`" %} file is a plain-text file, thus it is readable by anyone who has access to the file. The file contains passwords and API tokens which need to be redacted if you want to share your configuration. + +By using `!secret` you can remove any private information from your configuration files. This separation can also help you to keep easier track of your passwords and API keys, as they are all stored at one place and no longer spread across the {% term "`configuration.yaml`" %} file or even multiple YAML files if you [split up your configuration](/docs/configuration/splitting_configuration/). ## Using `secrets.yaml` diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index 9a7789809631..6b78a5372549 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -70,7 +70,7 @@ extensions: You can write reusable Jinja templates by adding them to a `custom_templates` folder under your configuration directory. All template files must have the `.jinja` extension and be less than 5MiB. Templates in this folder will be loaded at startup. To reload the templates without -restarting Home Assistant, invoke the {% my developer_call_service service="homeassistant.reload_custom_templates" %} service. +restarting Home Assistant, invoke the {% my developer_call_service service="homeassistant.reload_custom_templates" %} action. Once the templates are loaded, Jinja [includes](https://jinja.palletsprojects.com/en/3.0.x/templates/#include) and [imports](https://jinja.palletsprojects.com/en/3.0.x/templates/#import) will work using `config/custom_templates` as the base directory. @@ -121,11 +121,9 @@ Not supported in [limited templates](#limited-templates). - `is_state_attr('device_tracker.paulus', 'battery', 40)` will test if the given entity attribute is the specified state (in this case, a numeric value). Note that the attribute can be `None` and you want to check if it is `None`, you need to use `state_attr('sensor.my_sensor', 'attr') is none` or `state_attr('sensor.my_sensor', 'attr') == None` (note the difference in the capitalization of none in both versions). - `has_value('sensor.my_sensor')` will test if the given entity is not unknown or unavailable. Can be used as a filter or a test. -<div class='note warning'> - +{% warning %} Avoid using `states.sensor.temperature.state`, instead use `states('sensor.temperature')`. It is strongly advised to use the `states()`, `is_state()`, `state_attr()` and `is_state_attr()` as much as possible, to avoid errors and error message when the entity isn't ready yet (e.g., during Home Assistant startup). - -</div> +{% endwarning %} #### States examples @@ -447,6 +445,7 @@ The same thing can also be expressed as a test: ### Config entries - `config_entry_id(entity_id)` returns the config entry ID for a given entity ID. Can also be used as a filter. +- `config_entry_attr(config_entry_id, attr)` returns the value of `attr` for the config entry of the given entity ID. Can also be used as a filter. The following attributes are allowed: `domain`, `title`, `state`, `source`, `disabled_by`. Not supported in [limited templates](#limited-templates). #### Config entries examples @@ -456,6 +455,12 @@ The same thing can also be expressed as a test: {{ config_entry_id('sensor.sony') }} # deadbeefdeadbeefdeadbeefdeadbeef ``` +```text +{{ config_entry_attr(config_entry_id('sensor.sony'), 'title') }} # Sony Bravia TV +``` + + + {% endraw %} ### Floors @@ -558,7 +563,7 @@ The same thing can also be expressed as a test: - `integration_entities(integration)` returns a list of entities that are associated with a given integration, such as `hue` or `zwave_js`. - `integration_entities(config_entry_title)` if you have multiple entries set-up for an integration, you can also use the title you've set for the integration in case you only want to target a specific entry. -If there is more than one entry with the same title, the entities for all the matching entries will be returned, even if the entries are for different integrations. It's not possible to search for entities of an untitled integration. +If there is more than one entry with the same title, the entities for all the matching entries will be returned, even if the entries are for different integrations. It's not possible to search for entities of an untitled integration. #### Integrations examples @@ -699,15 +704,13 @@ Examples using `iif`: {{ (states('light.kitchen') == 'on') | iif('Yes', 'No') }} ``` -<div class='note warning'> +{% endraw %} +{% warning %} The immediate if filter does not short-circuit like you might expect with a typical conditional statement. The `if_true`, `if_false` and `if_none` expressions will all be evaluated and the filter will simply return one of the resulting values. This means you cannot use this filter to prevent executing an expression which would result in an error. For example, if you wanted to select a field from `trigger` in an automation based on the platform you might go to make this template: `trigger.platform == 'event' | iif(trigger.event.data.message, trigger.to_state.state)`. This won't work because both expressions will be evaluated and one will fail since the field doesn't exist. Instead you have to do this `trigger.event.data.message if trigger.platform == 'event' else trigger.to_state.state`. This form of the expression short-circuits so if the platform is `event` the expression `trigger.to_state.state` will never be evaluated and won't cause an error. - -</div> - -{% endraw %} +{% endwarning%} ### Time @@ -768,14 +771,11 @@ A precision of 0 returns all available units, default is 1. - Filter `timestamp_utc(default)` converts a UNIX timestamp to the ISO format string representation representation as date/time in UTC timezone. If that fails, returns the `default` value, or if omitted raises an error. If a custom string format is needed in the string, use `timestamp_custom` instead. - Filter `timestamp_custom(format_string, local=True, default)` converts an UNIX timestamp to its string representation based on a custom format, the use of a local timezone is the default. If that fails, returns the `default` value, or if omitted raises an error. Supports the standard [Python time formatting options](https://docs.python.org/3/library/time.html#time.strftime). -<div class='note'> - +{% tip %} [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time) is the number of seconds that have elapsed since 00:00:00 UTC on 1 January 1970. Therefore, if used as a function's argument, it can be substituted with a numeric value (`int` or `float`). +{% endtip %} -</div> - -<div class='note warning'> - +{% important %} If your template is returning a timestamp that should be displayed in the frontend (e.g., as a sensor entity with `device_class: timestamp`), you have to ensure that it is the ISO 8601 format (meaning it has the "T" separator between the date and time portion). Otherwise, frontend rendering on macOS and iOS devices will show an error. The following value template would result in such an error: {% raw %} @@ -792,7 +792,7 @@ To fix it, enforce the ISO conversion via `isoformat()`: {% endraw %} -</div> +{% endimportant %} {% raw %} @@ -1009,7 +1009,7 @@ Some examples: {% set to_remove = extra_ambiance | map(attribute='name') | reject('in', to_add) | list %} {{ (state_attr('input_select.light_theme', 'options') + to_add ) | unique | reject('in', to_remove) | list }} ``` - This more complex example uses the `contains` filter to match the current month with a list. In this case, it's used to generate a list of light theme to give to the `Input select: Set options` service. + This more complex example uses the `contains` filter to match the current month with a list. In this case, it's used to generate a list of light theme to give to the `Input select: Set options` action. {% endraw %} @@ -1017,7 +1017,7 @@ Some examples: Some of these functions can also be used in a [filter](https://jinja.palletsprojects.com/en/latest/templates/#id11). This means they can act as a normal function like this `sqrt(2)`, or as part of a filter like this `2|sqrt`. -<div class='note'> +{% note %} The numeric functions and filters raise an error if the input is not a valid number, optionally a default value can be specified which will be returned instead. The `is_number` function and filter can be used to check if a value is a valid number. Errors can be caught by the `default` filter. @@ -1030,7 +1030,7 @@ The numeric functions and filters raise an error if the input is not a valid num {% endraw %} -</div> +{% endnote %} - `float(value, default)` function will attempt to convert the input to a `float`. If that fails, returns the `default` value, or if omitted raises an error. - `float(default)` filter will attempt to convert the input to a `float`. If that fails, returns the `default` value, or if omitted raises an error. @@ -1102,7 +1102,7 @@ See: [Python struct library documentation](https://docs.python.org/3/library/str - Filter `value | unpack(format_string, offset=0)` will try to convert a `bytes` object into a native Python object. The `offset` parameter defines the offset position in bytes from the start of the input `bytes` based buffer. This will call function `struct.unpack_from(format_string, value, offset=offset)`. Returns `None` if an error occurs or when `format_string` is invalid. Note that the filter `unpack` will only return the first `bytes` object, despite the function `struct.unpack_from` supporting to return multiple objects (e.g. with `format_string` being `">hh"`. - Function `unpack(value, format_string, offset=0)` will try to convert a `bytes` object into a native Python object. The `offset` parameter defines the offset position in bytes from the start of the input `bytes` based buffer. This will call function `struct.unpack_from(format_string, value, offset=offset)`. Returns `None` if an error occurs or when `format_string` is invalid. Note that the function `unpack` will only return the first `bytes` object, despite the function `struct.unpack_from` supporting to return multiple objects (e.g. with `format_string` being `">hh"`. -<div class='note'> +{% note %} Some examples: {% raw %} @@ -1114,7 +1114,7 @@ Some examples: {% endraw %} -</div> +{% endnote %} ### String filters @@ -1255,14 +1255,14 @@ To evaluate a response, go to **{% my developer_template title="Developer Tools ### Using templates with the MQTT integration -The [MQTT integration](/integrations/mqtt/) relies heavily on templates. Templates are used to transform incoming payloads (value templates) to status updates or incoming service calls (command templates) to payloads that configure the MQTT device. +The [MQTT integration](/integrations/mqtt/) relies heavily on templates. Templates are used to transform incoming payloads (value templates) to status updates or incoming actions (command templates) to payloads that configure the MQTT device. #### Using value templates with MQTT For incoming data a value template translates incoming JSON or raw data to a valid payload. Incoming payloads are rendered with possible JSON values, so when rendering the `value_json` can be used access the attributes in a JSON based payload. -<div class='note'> +{% note %} Example value template: @@ -1276,13 +1276,13 @@ Template {% raw %}`{{ value_json.temperature | round(1) }}`{% endraw %} renders Additional the MQTT entity attributes `entity_id`, `name` and `this` can be used as variables in the template. The `this` attribute refers to the [entity state](/docs/configuration/state_object) of the MQTT item. - </div> +{% endnote %} #### Using command templates with MQTT -For service calls command templates are defined to format the outgoing MQTT payload to the device. When a service call is executed `value` can be used to generate the correct payload to the device. +For actions, command templates are defined to format the outgoing MQTT payload to the device. When an action is executed, `value` can be used to generate the correct payload to the device. -<div class='note'> +{% note %} Example command template: @@ -1296,7 +1296,7 @@ With given value `21.9` template {% raw %}`{"temperature": {{ value }} }`{% endr Additional the MQTT entity attributes `entity_id`, `name` and `this` can be used as variables in the template. The `this` attribute refers to the [entity state](/docs/configuration/state_object) of the MQTT item. -</div> +{% endnote %} ## Some more things to keep in mind diff --git a/source/_docs/configuration/troubleshooting.markdown b/source/_docs/configuration/troubleshooting.markdown index 3390d996933e..33725aba440f 100644 --- a/source/_docs/configuration/troubleshooting.markdown +++ b/source/_docs/configuration/troubleshooting.markdown @@ -88,9 +88,9 @@ Contents of `sensors.yaml`: ... ``` -<div class='note'> +{% note %} Whenever you report an issue, be aware that we are volunteers who do not have access to every single device in the world nor unlimited time to fix every problem out there. -</div> +{% endnote %} ### Entity names diff --git a/source/_docs/frontend.markdown b/source/_docs/frontend.markdown index 2b3cbcc678a8..a0f5b80e7d5f 100644 --- a/source/_docs/frontend.markdown +++ b/source/_docs/frontend.markdown @@ -3,19 +3,52 @@ title: "Frontend of Home Assistant" description: "Frontend of Home Assistant." --- -The Home Assistant frontend allows users to browse and control the state of their house, manage their automations and configure integrations. -The frontend is built with [Polymer](https://www.polymer-project.org/). +The Home Assistant [frontend integration](/integrations/frontend/) provides the graphical user interface that allows you to browse and control the state of your house, manage automations, and configure integrations. <p class='img'> <img src='/images/frontend/ui2022.png' /> </p> -<div class='note info'> +Home Assistant comes with a [default dashboard](/dashboards/dashboards/#home-assistant-default-dashboards). But you can also create and customize your own dashboards. - If you're looking to contribute to the frontend, please refer to the [Frontend Development documentation](/developers/frontend/). +## Creating and styling your own dashboards -</div> +To learn how to create and style your own dashboards, refer to the following topics: -## Icons +- [Dashboard introduction](/dashboards/) +- [Types of dashboards](/dashboards/dashboards/) +- [Views](/dashboards/views/) +- [Dashboard cards](/dashboards/cards/) +- [Badges](/dashboards/badges/) +- [Themes](/integrations/frontend/) +- [Icons](/docs/frontend/icons/) -Home Assistant utilizes the community-driven [Material Design Icons](https://pictogrammers.com/library/mdi/) project for icons in the frontend. The [Icons section](/docs/frontend/icons/) has more information on how to use icons and suggest new ones. +## Organizing and filtering data + +To learn how to organize and filter your data on an existing dashboard, refer to the following topics: + +- [Grouping](/docs/organizing/) into [areas](/docs/organizing/areas/), [floors](/docs/organizing/floors/), [labels](/docs/organizing/labels/), and [categories](/docs/organizing/categories/) +- [Filtering](/docs/organizing/tables) + +## User- or browser-dependent settings, general settings + +### User- or browser-dependent settings + +Some of the frontend settings depend on the user. Other settings can be set by client. This allows you for example to have different languages per user, and a different theme depending on the device that is used to display Home Assistant. + +To change these settings, in the bottom left, select your username to open your {% my profile title="**User profile**" %}. + +- To change general settings such as language, number and time format, go to the **User settings**. +- To change browser dependent settings such as the theme, default dashboard, or whether or not to show the sidebar, change the **Browser settings**. + +### Themes + +Themes can be set per browser. In the {% my profile title="**User profile**" %}, you can define some theme settings, such as whether you want a light or dark theme. However, more detailed theme settings require YAML configuration. Refer to the documentation of the [frontend integration](/integrations/frontend/). + +### General settings + +Some of the settings, such as location and currency, were defined during the onboarding process. They can be changed under {% my general title="**Settings** > **System** > **General**" %}. Refer to the documentation on [setup basic information](/docs/configuration/basic/). + +## Apps for Android and iOS + +If you are looking for information on Home Assistant for Android or iOS, refer to the [documentation for the Companion Apps](https://companion.home-assistant.io/). diff --git a/source/_docs/frontend/icons.markdown b/source/_docs/frontend/icons.markdown index 7499aa6dc750..3a50a1823678 100644 --- a/source/_docs/frontend/icons.markdown +++ b/source/_docs/frontend/icons.markdown @@ -1,6 +1,15 @@ --- title: "Icons" description: "Material Design Icons in the Home Assistant frontend" +related: + - docs: /docs/frontend/ + title: Frontend + - docs: /dashboards/cards/ + title: Dashboard cards + - docs: /docs/configuration/customizing-devices/ + title: Customizing entities + - docs: https://pictogrammers.com/library/mdi/ + title: Material Design Icons --- <p class='img'> @@ -11,23 +20,23 @@ Home Assistant utilizes the community-driven [Material Design Icons](https://pic ## Default icons -Every entity in Home Assistant has a default icon assigned to it. There are way too many to list out here, but you'll see them in your dashboard. You can [customize any of your entities](/docs/configuration/customizing-devices/#icon) to change the icons displayed to you. +Every entity in Home Assistant has a default icon assigned to it. There are way too many to list out here, but you'll see them in your dashboard. You can [customize any of your entities](/docs/configuration/customizing-devices/) to change the icons displayed to you. ## Finding icons ### Icon picker -The most common way you can find icons is by using the icon picker built right into Home Assistant. Select the "Icon" field when customizing an entity and start typing. The list will filter to icons that match your search criteria. You can also scroll through all available icons when the field is empty. +The most common way you can find icons is by using the icon picker built right into Home Assistant. Select the **Icon** field when customizing an entity and start typing. The list will filter to icons that match your search criteria. You can also scroll through all available icons when the field is empty. <p class='img'> <img src='/images/screenshots/icon-picker.png' alt='Icon Picker in Home Assistant' /> </p> -<div class='note info'> +{% tip %} +The icon picker will filter by icon name and by aliases applied to the icon by the MDI project. For example, typing "user" will show you most "account"-named icons. +{% endtip %} - The icon picker will filter by icon name and by aliases applied to the icon by the MDI project. For example, typing "user" will show you most "account"-named icons. - -</div> +For more detailed steps on customizing entities, including their icon, refer to [customizing entities](/docs/configuration/customizing-devices/). ### Material design icons picker browser extension @@ -37,31 +46,25 @@ The easiest way to browse and find icons outside of Home Assistant is with the o <img src='/images/screenshots/mdi-picker.png' alt='Material Design Icons Picker' /> </p> -<div class='note info'> - - Not all icons that appear in the MDI Picker Browser Extension may be available in Home Assistant (yet!). While the browser extension is updated as MDI releases new packages, Home Assistant may lag behind until its next release. - -</div> +{% note %} +Not all icons that appear in the MDI Picker Browser Extension may be available in Home Assistant (yet!). While the browser extension is updated as MDI releases new packages, Home Assistant may lag behind until its next release. +{% endnote %} ### Material design icons on the Pictogrammers website The last way to browse through available icons is by viewing the library on the Pictogrammers website, [https://pictogrammers.com/library/mdi/](https://pictogrammers.com/library/mdi/). Select an icon you'd like to use, then click "Home Assistant" to see an example of its usage. -<div class='note info'> - - The Pictogrammers website will always show the latest release of the material design icons library. However, you may find icons that may not yet be available in Home Assistant (yet!). Watch the Home Assistant release notes for announcements on upgrades of the Material Design Icons library. - -</div> +{% note %} +The Pictogrammers website will always show the latest release of the material design icons library. However, you may find icons that may not yet be available in Home Assistant (yet!). Watch the Home Assistant release notes for announcements on upgrades of the Material Design Icons library. +{% endnote %} ## Suggesting or contributing new icons Being open-source like Home Assistant, the material design icons library is always accepting suggestions and contributions to expand the library. -<div class='note info'> - - Before suggesting or creating a new icon, it is very important that you [search the current library](https://pictogrammers.com/library/mdi/) and [search all issues](https://github.com/Templarian/MaterialDesign/issues?q=is%3Aissue), open and closed, on their GitHub. Try searching with different terms that might mean the same thing. (e.g. "user", "person", "account") - -</div> +{% note %} +Before suggesting or creating a new icon, it is very important that you [search the current library](https://pictogrammers.com/library/mdi/) and [search all issues](https://github.com/Templarian/MaterialDesign/issues?q=is%3Aissue), open and closed, on their GitHub. Try searching with different terms that might mean the same thing. (e.g. "user", "person", "account") +{% endnote %} ### Suggesting a new icon @@ -71,7 +74,7 @@ If you have an idea for an icon that isn't currently in the library, but are not If you want to contribute a new icon to the library, familiarize yourself with the [System icons guidelines](https://material.io/design/iconography/system-icons.html#design-principles) in the Material Design system. Then create your icon and [submit it to the Pictogrammers team for review](https://github.com/Templarian/MaterialDesign/issues/new?assignees=&labels=Icon+Request%2CContribution&template=2_contribution.yml). -#### Tips for Creating New Icons +#### Tips for creating new icons - Really pay attention to [Material Design guidelines](https://material.io/design/iconography/system-icons.html#design-principles). - Keep in mind that icons are meant to be contextual, not literal. @@ -79,6 +82,6 @@ If you want to contribute a new icon to the library, familiarize yourself with t - If you're unsure, open an issue on their GitHub. They're more than happy to help you! - Not all icons make it into the library and that is okay! -### Suggesting an Icon Alias +### Suggesting an icon alias Sometimes an icon exists, but you aren't able to find it with the terms you were searching for. If this has ever happened to you, please [open an issue with the Pictogrammers team to suggest new aliases](https://github.com/Templarian/MaterialDesign/issues/new?assignees=&labels=Alias&template=4_alias.yml) that can be added to existing icons. diff --git a/source/_docs/organizing.markdown b/source/_docs/organizing.markdown index 5091baaac10a..52d39eb40029 100644 --- a/source/_docs/organizing.markdown +++ b/source/_docs/organizing.markdown @@ -12,7 +12,9 @@ related: title: Categories --- -Once you have more devices, you may want to target entire groups of devices in automations. It also becomes more challenging to find items in lists. There are a few tools to group your assets: [Areas](#areas), [floors](#floors), [labels](#labels), and [categories](#categories). +Once you have more devices, you may want to target entire groups of devices in automations. It also becomes more challenging to find items in lists. + +There are a few tools to group your assets: [Areas](#areas), [floors](#floors), [labels](#labels), and [categories](#categories). | Taxonomy | Automation target | Entity can have multiple | | -------- | ----------------- | ------------------------ | @@ -26,7 +28,7 @@ Once you have more devices, you may want to target entire groups of devices in a - Groups {% term devices %} and {% term entities %}. - Can be assigned to one floor. - Reflects a physical area (or room) in your home. -- Can be used in automations: Allows targeting an entire group of devices with a service call. For example, turning off all the lights in the living room. +- Can be used in automations: Allows targeting an entire group of devices with an action. For example, turning off all the lights in the living room. - Areas can also be used to automatically generate cards, such as the [Area card](/dashboards/area/). @@ -42,7 +44,7 @@ Once you have more devices, you may want to target entire groups of devices in a ## Labels - Can be assigned to areas, devices, entities, automations, scenes, scripts, and helpers. -- Can be used in automations and scripts as a target for actions and services. +- Can be used in automations and scripts as a target for actions. - Labels can also be used to filter data in tables. For example, you can filter the list of devices to show only devices with the label `heavy energy usage` or turn these devices off when there is not a lot of solar energy available. <img class="no-shadow" src='/images/organizing/labels.png' alt='Screenshots showing the new labels assigned to automations.'> diff --git a/source/_docs/organizing/areas.markdown b/source/_docs/organizing/areas.markdown index 6af4f1434ba7..6b6a0f2f3e1f 100644 --- a/source/_docs/organizing/areas.markdown +++ b/source/_docs/organizing/areas.markdown @@ -13,7 +13,9 @@ related: title: Using areas in template --- -An area in Home Assistant is a logical grouping of {% term devices %} and {% term entities %} that are meant to match areas (or rooms) in the physical world of your home. For example, the "Living room" area groups devices and entities in your living room. Areas allow you to target an entire group of devices with a service call. For example, turning off all the lights in the living room. +An area in Home Assistant is a logical grouping of {% term devices %} and {% term entities %} that are meant to match areas (or rooms) in the physical world of your home. + +For example, the "Living room" area groups devices and entities in your living room. Areas allow you to target an entire group of devices with an action. For example, turning off all the lights in the living room. Areas can be assigned to floors. Areas can also be used to automatically generate cards, such as the [Area card](/dashboards/area/). ## Creating an area @@ -52,7 +54,7 @@ You can assign an area to multiple items at once in the automation, scene, scrip 1. Depending on what you want to assign, go to one of the following pages: - For automations, scripts, or scenes {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. - For devices, go to {% my devices title="**Settings** > **Devices & services** > **Devices**" %}. -2. In the list, [select all the items](/docs/organizing/filtering#selecting-multiple-items-in-a-table) you want to assign to an area. +2. In the list, [select all the items](/docs/organizing/tables#selecting-multiple-items-in-a-table) you want to assign to an area. ![Screenshot showing how to assign multiple devices to an area](/images/organizing/area_assign_devices.png) diff --git a/source/_docs/organizing/categories.markdown b/source/_docs/organizing/categories.markdown index 261332fbc02c..2afe900b6428 100644 --- a/source/_docs/organizing/categories.markdown +++ b/source/_docs/organizing/categories.markdown @@ -10,7 +10,9 @@ related: title: Labels --- -Categories let you group and filter items in a table. Like labels, categories allow grouping irrespective of the items physical location. For example, on the automations page, you can create the categories “Notifications” or “NFC tags” to view your automations grouped or filtered. These categories group automations on the automation page, but have no effect anywhere else. Categories are unique for each table. The automations page can have different categories than the scene, scripts, or helpers settings page. +Categories let you group and filter items in a table. Like labels, categories allow grouping irrespective of the items physical location. + +For example, on the automations page, you can create the categories “Notifications” or “NFC tags” to view your automations grouped or filtered. These categories group automations on the automation page, but have no effect anywhere else. Categories are unique for each table. The automations page can have different categories than the scene, scripts, or helpers settings page. ## Creating a category @@ -29,7 +31,7 @@ Follow these steps to create a new category. 1. Go to {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. 2. To assign a category to a single item: - - Find the item in the list and select the three dots menu. + - Find the item in the list and select the three dots {% icon "mdi:dots-vertical" %} menu. - Select **Assign category** and select the category from the list. - If the category is not in the list, select **Add new category** and make a new one. 3. To assign a category to multiple items: diff --git a/source/_docs/organizing/floors.markdown b/source/_docs/organizing/floors.markdown index 3a39c03ec91e..bb62473b88b8 100644 --- a/source/_docs/organizing/floors.markdown +++ b/source/_docs/organizing/floors.markdown @@ -13,8 +13,9 @@ related: title: Using floor alias for voice assistants --- -A floor in Home Assistant is a logical grouping of areas meant to match your home's physical floors. Devices and entities -cannot be assigned to floors directly but to areas. Floors can be used in automations and scripts as a target for actions. For example, to turn off all the lights on the downstairs floor when you go to bed. +A floor in Home Assistant is a logical grouping of areas meant to match your home's physical floors. + +Devices and entities cannot be assigned to floors directly but to areas. Floors can be used in automations and scripts as a target for actions. For example, to turn off all the lights on the downstairs floor when you go to bed. ## Creating a floor @@ -43,7 +44,7 @@ Follow these steps to create a new floor. Follow these steps to delete a floor. Areas that are assigned to a floor will become unassigned. Automations and scripts or voice assistants that used a floor as a target will no longer work as they no longer have a target. 1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %}. -2. Next to the floor, select the three dots menu and select **Delete floor**. +2. Next to the floor, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Delete floor**. ![Screenshot showing the dialog to delete a floor](/images/organizing/floor_delete.png) diff --git a/source/_docs/organizing/labels.markdown b/source/_docs/organizing/labels.markdown index 0e95e8dc515b..49a8ad6eb57f 100644 --- a/source/_docs/organizing/labels.markdown +++ b/source/_docs/organizing/labels.markdown @@ -12,7 +12,9 @@ related: title: Using labels in templates --- -Labels in Home Assistant allow grouping elements irrespective of their physical location or type. Labels can be assigned to areas, devices, entities, automations, scenes, scripts, and helpers. Labels can be used in automations and scripts as a target for actions and services. Labels can also be used to filter data. For example, you can filter the list of devices to show only devices with the label `heavy energy usage` or turn these devices off when there is not a lot of solar energy available. +Labels in Home Assistant allow grouping elements irrespective of their physical location or type. Labels can be assigned to areas, devices, entities, automations, scenes, scripts, and helpers. Labels can be used in automations and scripts as a target for actions. Labels can also be used to filter data. + +For example, you can filter the list of devices to show only devices with the label `heavy energy usage` or turn these devices off when there is not a lot of solar energy available. ## Creating a label @@ -39,17 +41,17 @@ Follow these steps to apply a label - On the area card, select the pencil icon. - Select one or more labels or select **Add new label** to create a new one. 2. To apply a label to a device, entity, or helper: - - Go to **{% my integrations title="Settings > Devices & Services" %}** and open the respective tab. + - Go to **{% my integrations title="Settings > Devices & services" %}** and open the respective tab. - Select the <img height="28px" src="/images/organizing/multiselect_icon.png" alt="Multiselect icon"/> button. - From the list, select all the list entries to which you want to apply a label. - In the top right corner, select **Add label**. Then, select the labels from the list. ![Apply label](/images/organizing/labels_add_05.png) 3. To apply a label to an automation, scene, or script: - - Go to {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. + - Go to {% my automations title="**Settings** > **Automations & scenes**" %} and open the respective tab. - Select the <img height="28px" src="/images/organizing/multiselect_icon.png" alt="Multiselect icon"/> button. - From the list, select all the list entries to which you want to apply a label. - - In the top right corner, select the three dots menu, then select **Add label**. Then, select the labels from the list. + - In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Add label**. Then, select the labels from the list. ## Deleting a label @@ -57,17 +59,16 @@ Follow these steps to delete a label. It will be removed from all the list entri If you used this label in automations or script as targets, you need to adjust those. 1. Go to {% my labels title="**Settings** > **Areas, labels & zones**" %} and on top, select the **Labels** tab. -2. In the list of labels, find the label you want to delete and select the three dots menu. +2. In the list of labels, find the label you want to delete and select the three dots {% icon "mdi:dots-vertical" %} menu. 3. Select **Delete**. 4. If you used this label in automations or script as targets, you need to adjust those. ## Removing labels 1. Go to the data table that contains the element from which you want to remove the label: - - Go to **{% my integrations title="Settings > Devices & Services" %}** and open the respective tab. - - Or, go to {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. + - Go to **{% my integrations title="Settings > Devices & services" %}** and open the respective tab. + - Or, go to {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. 2. Select the <img height="28px" src="/images/organizing/multiselect_icon.png" alt="Multiselect icon"/> button. - From the list, select all the items from which you want to remove a label. - - In the top right corner, select the three dots menu, then select **Add label**. + - In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Add label**. - Then, deselect the checkbox for the label you want to remove. - diff --git a/source/_docs/organizing/filtering.markdown b/source/_docs/organizing/tables.markdown similarity index 80% rename from source/_docs/organizing/filtering.markdown rename to source/_docs/organizing/tables.markdown index d8fa65532d75..3a82b8bdca4b 100644 --- a/source/_docs/organizing/filtering.markdown +++ b/source/_docs/organizing/tables.markdown @@ -1,5 +1,5 @@ --- -title: "Filtering your assets" +title: "Working with tables" description: "Filter for items in tables." related: - docs: /docs/organizing/floors/ @@ -34,6 +34,8 @@ When working with tables, you can select multiple items to apply an action. If y You can filter a table so that only items matching certain criteria are shown. +To filter items in a table, follow these steps: + 1. In the top left corner above the table, select the **Filters** button. ![Select the filter button](/images/organizing/filters_01.png) @@ -48,6 +50,8 @@ You can filter a table so that only items matching certain criteria are shown. You can group items in a table according to certain criteria. The number of shown items stays the same. No items will be hidden. +To group items in a table, follow these steps: + 1. In the top right above the table, select the **Group by** button. 2. The items will be grouped according to the criteria you chose. - The list of available criteria depends on the type of table. @@ -59,4 +63,16 @@ You can group items in a table according to certain criteria. The number of show 3. To sort the items, select the **Sort by** button. 4. To get a better overview, you can collapse groups in the list. - ![Collapse groups](/images/organizing/table_group_collapse.png) \ No newline at end of file + ![Collapse groups](/images/organizing/table_group_collapse.png) + +## Customizing columns + +You can show or hide columns and change the order. Your customized columns are stored in your browser, so you only have to set it up once, and it will be remembered for the next time you visit the page. + +To customize columns, follow these steps: + +1. In the top right corner of the table, select the cog wheel. +2. To hide a column, deselect it. +3. To rearrange the order, grab the column and move it to its new position. + + ![Screencast showing how to show, hide, and rearrange columns](/images/organizing/customize_columns.webp) \ No newline at end of file diff --git a/source/_docs/scene.markdown b/source/_docs/scene.markdown index 058778c517bb..2e6a219b4f32 100644 --- a/source/_docs/scene.markdown +++ b/source/_docs/scene.markdown @@ -52,7 +52,7 @@ As you can see, there are two ways to define the states of each `entity_id`: - Define the `state` directly with the entity. Be aware, that `state` needs to be defined. - Define a complex state with its attributes. You can see all attributes available for a particular entity under `developer-tools -> state`. -Scenes can be activated using the service `scene.turn_on` (there is no 'scene.turn_off' service). +Scenes can be activated using the action `scene.turn_on` (there is no 'scene.turn_off' action). ```yaml # Example automation @@ -70,7 +70,7 @@ automation: ## Applying a scene without defining it -With the `scene.apply` service you are able to apply a scene without first defining it via configuration. Instead, you pass the states as part of the service data. The format of the data is the same as the `entities` field in a configuration. +With the `scene.apply` action you are able to apply a scene without first defining it via configuration. Instead, you pass the states as part of the data. The format of the data is the same as the `entities` field in a configuration. ```yaml # Example automation @@ -95,7 +95,7 @@ automation: ## Using scene transitions -Both the `scene.apply` and `scene.turn_on` services support setting a transition, +Both the `scene.apply` and `scene.turn_on` actions support setting a transition, which enables you to smoothen the transition to the scene. This is an example of an automation that sets a romantic scene, in which the @@ -123,4 +123,4 @@ only lights to have a transition set. ## Reloading scenes -Whenever you make a change to your scene configuration, you can call the `scene.reload` service to reload the scenes. +Whenever you make a change to your scene configuration, you can call the `scene.reload` action to reload the scenes. diff --git a/source/_docs/scene/editor.markdown b/source/_docs/scene/editor.markdown index cf9ff0fc4f4b..42c31d0d836a 100644 --- a/source/_docs/scene/editor.markdown +++ b/source/_docs/scene/editor.markdown @@ -16,7 +16,7 @@ On the moment you save the scene, all the states of your devices are stored in t When you leave the editor the states of the devices are restored to the state from before you started editing. The menu on the top-right has options to **Duplicate scene** and **Delete scene**. -A scene can be called in {% term automation %} action and {% term scripts %} using a turn on scene {% term service %}: +A scene can be called in {% term automation %} action and {% term scripts %} using a turn on scene {% term action %}: ```yaml service: scene.turn_on @@ -77,6 +77,6 @@ For example: brightness: 200 ``` -<div class='note'> +{% note %} Any comments in the YAML file will be lost and templates will be reformatted when you update a scene via the editor. -</div> +{% endnote %} diff --git a/source/_docs/scripts.markdown b/source/_docs/scripts.markdown index 432a8d02b0bf..8045bad1182a 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. @@ -33,9 +32,9 @@ script: {{ page.content | markdownify | toc_only }} -## Call a service +## Perform an action -The most important one is the action to call a {% term service %}. This can be done in various ways. For all the different possibilities, have a look at the [service calls page]. +Performing an action can be done in various ways. For all the different possibilities, have a look at the [actions page]. ```yaml - alias: "Bedroom lights on" @@ -48,7 +47,7 @@ The most important one is the action to call a {% term service %}. This can be d ### Activate a scene -Scripts may also use a shortcut syntax for activating {% term scenes %} instead of calling the `scene.turn_on` service. +Scripts may also use a shortcut syntax for activating {% term scenes %} instead of calling the `scene.turn_on` action. ```yaml - scene: scene.morning_living_room @@ -131,11 +130,9 @@ sequence: While executing a script you can add a condition in the main sequence to stop further execution. When a condition does not return `true`, the script will stop executing. For documentation on the many different conditions refer to the [conditions page]. -<div class='note'> - +{% note %} The `condition` {% term action %} only stops executing the current sequence block. When it is used inside a [repeat](#repeat-a-group-of-actions) action, only the current iteration of the `repeat` loop will stop. When it is used inside a [choose](#choose-a-group-of-actions) action, only the {% term actions %} within that `choose` will stop. - -</div> +{% endnote %} ```yaml # If paulus is home, continue to execute the script below these lines @@ -282,11 +279,11 @@ Without `continue_on_timeout: false` the script will always continue since the d After each time a wait completes, either because the condition was met, the event happened, or the timeout expired, the variable `wait` will be created/updated to indicate the result. -Variable | Description --|- -`wait.completed` | Exists only after `wait_template`. `true` if the condition was met, `false` otherwise -`wait.trigger` | Exists only after `wait_for_trigger`. Contains information about which trigger fired. (See [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data).) Will be `none` if no trigger happened before timeout expired -`wait.remaining` | Timeout remaining, or `none` if a timeout was not specified +| Variable | Description | +| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `wait.completed` | Exists only after `wait_template`. `true` if the condition was met, `false` otherwise | +| `wait.trigger` | Exists only after `wait_for_trigger`. Contains information about which trigger fired. (See [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data).) Will be `none` if no trigger happened before timeout expired | +| `wait.remaining` | Timeout remaining, or `none` if a timeout was not specified | This can be used to take different actions based on whether or not the condition was met, or to use more than one wait sequentially while implementing a single timeout overall. @@ -572,11 +569,11 @@ For example: A variable named `repeat` is defined within the repeat {% term action %} (i.e., it is available inside `sequence`, `while` & `until`.) It contains the following fields: -field | description --|- -`first` | True during the first iteration of the repeat sequence -`index` | The iteration number of the loop: 1, 2, 3, ... -`last` | True during the last iteration of the repeat sequence, which is only valid for counted loops +| field | description | +| ------- | -------------------------------------------------------------------------------------------- | +| `first` | True during the first iteration of the repeat sequence | +| `index` | The iteration number of the loop: 1, 2, 3, ... | +| `last` | True during the last iteration of the repeat sequence, which is only valid for counted loops | ## If-then @@ -845,8 +842,7 @@ script: message: "I am sent immediately and do not await the above action!" ``` -<div class='note'> - +{% warning %} Running {% term actions %} in parallel can be helpful in many cases, but use it with caution and only if you need it. @@ -854,8 +850,7 @@ There are some caveats (see below) when using parallel actions. While it sounds attractive to parallelize, most of the time, just the regular sequential {% term actions %} will work just fine. - -</div> +{% endwarning %} Some of the caveats of running {% term actions %} in parallel: @@ -906,8 +901,8 @@ By default, a sequence of {% term actions %} will be halted when one of the {% t that sequence encounters an error. The {% term automation %} or script will be halted, an error is logged, and the {% term automation %} or script run is marked as errored. -Sometimes these errors are expected, for example, because you know the service -you call can be problematic at times, and it doesn't matter if it fails. +Sometimes these errors are expected, for example, because you know the action +you perform can be problematic at times, and it doesn't matter if it fails. You can set `continue_on_error` for those cases on such an {% term action %}. The `continue_on_error` is available on all {% term actions %} and is set to @@ -1011,7 +1006,7 @@ will not be used by anything. [Script integration]: /integrations/script/ [automations]: /docs/automation/action/ [Alexa/Amazon Echo]: /integrations/alexa/ -[service calls page]: /docs/scripts/service-calls/ +[actions page]: /docs/scripts/service-calls/ [conditions page]: /docs/scripts/conditions/ [shorthand-template]: /docs/scripts/conditions/#template-condition-shorthand-notation [script variables]: /integrations/script/#configuration-variables diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index 21f7c96694eb..34c89afb1d26 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. @@ -400,9 +399,9 @@ Note that if only `before` key is used, the condition will be true _from midnigh [sun_trigger]: /docs/automation/trigger/#sun-trigger -<div class='note warning'> +{% tip %} The sunset/sunrise conditions do not work in locations inside the polar circles, and also not in locations with a highly skewed local time zone. In those cases it is advised to use conditions evaluating the solar elevation instead of the before/after sunset/sunrise conditions. -</div> +{% endtip %} This is an example of 1 hour offset before sunset: ```yaml @@ -557,11 +556,9 @@ Note that if only `before` key is used, the condition will be `true` *from midni If only `after` key is used, the condition will be `true` from the specified time *until midnight*. Time condition windows can span across the midnight threshold if **both** `after` and `before` keys are used. In the example above, the condition window is from 3pm to 2am. -<div class='note tip'> - +{% tip %} A better weekday condition could be by using the [Workday Binary Sensor](/integrations/workday/). - -</div> +{% endtip %} For the `after` and `before` options a time helper (`input_datetime` entity) or another `sensor` entity containing a timestamp with the "timestamp" device @@ -578,13 +575,11 @@ condition: after: sensor.groceries_delivery_time ``` -<div class='note warning'> - -Please note that the time condition only takes the time into account. If +{% note %} +Note that the time condition only takes the time into account. If a referenced sensor or helper entity contains a timestamp with a date, the date part is fully ignored. - -</div> +{% endnote %} ## Trigger condition diff --git a/source/_docs/scripts/service-calls.markdown b/source/_docs/scripts/service-calls.markdown index ccd734c536cf..ab9676ae4117 100644 --- a/source/_docs/scripts/service-calls.markdown +++ b/source/_docs/scripts/service-calls.markdown @@ -1,21 +1,21 @@ --- -title: "Service calls" -description: "Instructions on how to call services in Home Assistant." +title: "Performing actions" +description: "Instructions on how to perform actions in Home Assistant." --- -Various integrations allow calling {% term services %} when a certain event occurs. The most common one is calling a service when an automation {% term trigger %} happens. But a service can also be called from a {% term script %}, a dashboard or via voice command devices such as Amazon Echo. +Various integrations allow performing {% term actions %} when a certain event occurs. The most common one is performing an action when an automation {% term trigger %} happens. But an action can also be called from a {% term script %}, a dashboard, or via voice command devices such as Amazon Echo. The configuration options to call a configuration are the same between all integrations and are described on this page. Examples on this page will be given as part of an automation integration configuration but different approaches can be used for other integrations too. -<div class='note'> -Use the "Services" tab under Developer Tools to discover available services. -</div> +{% tip %} +Use the "Actions" tab under **Developer tools** to discover available actions. +{% endtip %} ### The basics -Call the service `homeassistant.turn_on` on the {% term entity %} `group.living_room`. This will turn all members of `group.living_room` on. You can also use `entity_id: all` and it will turn on all possible entities. +Perform the action `homeassistant.turn_on` on the {% term entity %} `group.living_room`. This will turn all members of `group.living_room` on. You can also use `entity_id: all` and it will turn on all possible entities. ```yaml service: homeassistant.turn_on @@ -30,7 +30,7 @@ This is done with the `target` key. A `target` is a map that contains at least one of the following: `area_id`, `device_id`, `entity_id`. Each of these can be a list. The values should be lower-cased. -The following example uses a single service call to turn on the lights in the +The following example uses a single action to turn on the lights in the living room area, 2 additional light devices and 2 additional light entities: ```yaml @@ -45,9 +45,9 @@ target: - light.landing ``` -### Passing data to the service call +### Passing data to the action -You can also specify other parameters beside the entity to target. For example, the `light.turn_on` service allows specifying the brightness. +You can also specify other parameters beside the entity to target. For example, the `light.turn_on` action allows specifying the brightness. ```yaml service: light.turn_on @@ -57,11 +57,11 @@ data: rgb_color: [255, 0, 0] ``` -A full list of the parameters for a service can be found on the documentation page of each integration, in the same way as it's done for the `light.turn_on` [service](/integrations/light/#service-lightturn_on). +A full list of the parameters for an action can be found on the documentation page of each integration, in the same way as it's done for the `light.turn_on` [action](/integrations/light/#action-lightturn_on). -### Use templates to decide which service to call +### Use templates to decide which action to perform -You can use [templating] support to dynamically choose which service to call. For example, you can call a certain service based on if a light is on. +You can use [templating] support to dynamically choose which action to perform. For example, you can perform a certain action based on if a light is on. {% raw %} @@ -77,9 +77,9 @@ entity_id: switch.ac {% endraw %} -### Using the Services Developer Tool +### Using the Actions developer tool -You can use the Services Developer Tool to test data to pass in a service call. +You can use the **Actions** developer tool to test data to pass in an action. For example, you may test turning on or off a 'group' (See [groups](/integrations/group/) for more info) To turn a group on or off, pass the following info: @@ -90,7 +90,7 @@ To turn a group on or off, pass the following info: ### Use templates to determine the attributes -Templates can also be used for the data that you pass to the service call. +Templates can also be used for the data that you pass to the action. {% raw %} @@ -127,13 +127,13 @@ data: > ### Use templates to handle response data -Some services may respond with data that can be used in automation. This data is called _service response data_. Service response data +Some actions may respond with data that can be used in automation. This data is called _action response data_. Action response data is typically used for data that is dynamic or large and which may not be suited for use in entity state. -Examples of service response data are upcoming calendar events for the next week or detailed driving directions. +Examples of action response data are upcoming calendar events for the next week or detailed driving directions. -Templates can also be used for handling response data. The service call can specify +Templates can also be used for handling response data. The action can specify a `response_variable`. This is the [variable](/docs/scripts/#variables) -that contains the response data. You can define any name for your `response_variable`. This example calls a service and stores the response in the variable called `agenda`. +that contains the response data. You can define any name for your `response_variable`. This example performs an action and stores the response in the variable called `agenda`. {% raw %} @@ -153,9 +153,9 @@ You may then use the response data in the variable `agenda` in another action in the same script. The example below sends a notification using the response data. -<div class='note'> -Which data fields can be used in a service call depends on the type of notification service that is used. -</div> +{% important %} +Which data fields can be used in an action depends on the type of notification that is used. +{% endimportant %} {% raw %} @@ -175,19 +175,19 @@ data: {% endraw %} -### `homeassistant` services +### `homeassistant` actions -There are four `homeassistant` services that aren't tied to any single domain, these are: +There are four `homeassistant` actions that aren't tied to any single domain, these are: - `homeassistant.turn_on` - Turns on an entity (that supports being turned on), for example an `automation`, `switch`, etc. - `homeassistant.turn_off` - Turns off an entity (that supports being turned off), for example an `automation`, `switch`, etc. - `homeassistant.toggle` - Turns off an entity that is on, or turns on an entity that is off (that supports being turned on and off) - `homeassistant.update_entity` - Request the update of an entity, rather than waiting for the next scheduled update, for example [Google travel time] sensor, a [template sensor], or a [light] -Complete service details and examples can be found on the [Home Assistant integration][homeassistant-integration-services] page. +Complete action details and examples can be found on the [Home Assistant integration][homeassistant-integration-actions] page. [templating]: /docs/configuration/templating/ [google travel time]: /integrations/google_travel_time/ [template sensor]: /integrations/template/ [light]: /integrations/light/ -[homeassistant-integration-services]: /integrations/homeassistant#services +[homeassistant-integration-actions]: /integrations/homeassistant#actions diff --git a/source/_docs/tools/dev-tools.markdown b/source/_docs/tools/dev-tools.markdown index bbece8757f52..d6504dda3bad 100644 --- a/source/_docs/tools/dev-tools.markdown +++ b/source/_docs/tools/dev-tools.markdown @@ -14,7 +14,7 @@ Screenshot of Home Assistant's developer tools. | ---------- | ------------------------------------------------------------------- | | YAML | Lets you validate the configuration and trigger a reload or restart | | States | Sets the representation of an entity | -| Services | Calls services from integrations | +| Actions | Performs actions from integrations | | Template | Renders templates | | Events | Fires events | | Statistics | Shows a list of long-term statistic entities | @@ -22,7 +22,7 @@ Screenshot of Home Assistant's developer tools. ## What can I do with Developer Tools? -The Developer Tools is meant for **all** (not just for the developers) to quickly try out things - like calling services, updating states, raising events, and publishing messages in MQTT). It is also a necessary tool for those who write custom automations and scripts by hand. The following describes each of the sections in detail. +The Developer Tools is meant for **all** (not just for the developers) to quickly try out things - like performing actions, updating states, raising events, and publishing messages in MQTT). It is also a necessary tool for those who write custom automations and scripts by hand. The following describes each of the sections in detail. ## YAML tab @@ -48,30 +48,30 @@ For configuration changes to become effective, the configuration must be reloade This section shows all the available entities, their corresponding state and the attribute values. The state and the attribute information is what Home Assistant sees at run time. To update the entity with a new state, or a new attribute value, click on the entity, scroll to the top, and modify the values, and click on “SET STATE” button. -Note that this is the state representation of a device within Home Assistant. That means, it is what Home Assistant sees, and it does not communicate with the actual device in any manner. The updated information can still be used to trigger events, and state changes. To communicate with the actual device, it is recommended to call services in the services section above, instead of updating state. +Note that this is the state representation of a device within Home Assistant. That means, it is what Home Assistant sees, and it does not communicate with the actual device in any manner. The updated information can still be used to trigger events, and state changes. To communicate with the actual device, it is recommended to perform actions in the **Actions** section above, instead of updating state. -For example, changing the `light.bedroom` state from `off` to `on` does not turn on the light. If there is an automation that triggers on the `state` change of the `light.bedroom`, it will be triggered – even though the actual bulb has not turned on. Also, when the bulb state changes – the state information will be overridden (the refresh icon can be used to retrieve the latest information that Home Assistant has). In other words, the changes that are made through the “States” section are temporary, and is recommended to use for testing purposes only. +For example, changing the `light.bedroom` state from `off` to `on` does not turn on the light. If there is an automation that triggers on the `state` change of the `light.bedroom`, it will be triggered – even though the actual bulb has not turned on. Also, when the bulb state changes – the state information will be overridden (the refresh icon can be used to retrieve the latest information that Home Assistant has). In other words, the changes that are made through the “States” section are temporary, and are recommended to use for testing purposes only. The table containing all entities can be filtered for each column. The used search is a wildcard search meaning that if you input "office" in the entity column filter, every entity whose ID matches "\*office\*" will be shown. You can also add your own wildcards in the search input (e.g., "office\*light"). The attribute filter supports separate filters for attribute names and values, separated by a colon ":". So the filter "location:3" will result in the table showing all entities that have an attribute name that contains "location" and whose attribute value contains "3". -## Services tab +## Actions tab -This section is used to call Services that are available in the ServiceRegistry. +This section is used to perform actions that are available in Home Assistant. -The list of services in the “Service” dropdown are automatically populated based on the integrations that are found in the configuration, automation and script files. If a desired service does not exist, it means either the integration is not configured properly or not defined in the configuration, automation or script files. +The list of actions in the **Actions** dropdown are automatically populated based on the integrations that are found in the configuration, automation and script files. If a desired action does not exist, it means either the integration is not configured properly or not defined in the configuration, automation or script files. -When a Service is selected, and if that service requires an `entity_id` to be passed, the “Entity” dropdown will automatically be populated with corresponding entities. +When an action is selected, and if that action requires an `entity_id` to be passed, the **Entity** dropdown will automatically be populated with corresponding entities. -A Service may also require additional input to be passed. It is commonly referred to as “service data”. The service data is accepted in YAML format, and it may be optional depending on the service. +An action may also require additional input to be passed. It is commonly referred to as “action data”. The action data is accepted in YAML format, and it may be optional depending on the action. -When an entity is selected from the Entity dropdown, it automatically populates service data with the corresponding `entity_id`. The service data YAML can then be modified to pass additional \[optional\] parameters. The following is an illustration on how to call a `light.turn_on` service. +When an entity is selected from the Entity dropdown, it automatically populates action data with the corresponding `entity_id`. The action data YAML can then be modified to pass additional \[optional\] parameters. The following is an illustration on how to perform a `light.turn_on` action. To turn on a light bulb, use the following steps: -1. Select `light.turn_on` from the Service dropdown +1. Select `light.turn_on` from the **Action** dropdown. 2. Select the entity (typically the light bulb) from the Entity dropdown (if no entity_id is selected, it turns on ALL lights) -3. If an entity is selected, the service data is populated with basic YAML that will be passed to the service. Additional data can also be passed by updating the YAML as below. +3. If an entity is selected, the action data is populated with basic YAML that will be passed to the action. Additional data can also be passed by updating the YAML as below. ```yaml entity_id: light.bedroom diff --git a/source/_docs/tools/quick-bar.markdown b/source/_docs/tools/quick-bar.markdown index ba73ba75a75e..df86c08417da 100644 --- a/source/_docs/tools/quick-bar.markdown +++ b/source/_docs/tools/quick-bar.markdown @@ -22,9 +22,9 @@ Type these from anywhere in the application to launch the dialog. | Command Palette | `c` | Remove `>` from start of input to switch to entity filter. | Create [`my`](/integrations/my) link | `m` | Open a new tab to create a my link to the page you are on. -<div class='note'> - The application must have focus for the hotkey to register. If the dialog doesn't launch, try clicking into an empty part of the main content area of Home Assistant and type it again. -</div> +{% important %} +The application must have focus for the hotkey to register. If the dialog doesn't launch, try clicking into an empty part of the main content area of Home Assistant and type it again. +{% endimportant %} ## Entity filter @@ -57,7 +57,7 @@ Run various commands from anywhere without having to navigate to another view. Type | Available | | ------------- | ------------- | | Navigate | All entries in the sidebar and settings | -| Reload | All currently-supported "Reload {domain}" services.<br />*(E.g., "Reload Scripts")* | +| Reload | All currently-supported "Reload {domain}" actions.<br />*(E.g., "Reload Scripts")* | | Server | Restart/Stop | ## My links diff --git a/source/_docs/troubleshooting_general.markdown b/source/_docs/troubleshooting_general.markdown index 46fb8379d41b..07139cc1a304 100644 --- a/source/_docs/troubleshooting_general.markdown +++ b/source/_docs/troubleshooting_general.markdown @@ -47,3 +47,13 @@ If your Home Assistant is acting up and you cannot identify a root cause, you ca - If you cannot reach the UI, you can enable **Safe mode** from the [command line](/common-tasks/os/#home-assistant-via-the-command-line): - ```ha core restart --safe-mode``` +## I don't see any updates + +Typically, updates are shown at the top of the **Settings** page. If you don't see them there, the **Visibility** option might be disabled. + +### Resolution + +1. On the **System** page, in the top-right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Check for updates**. +2. Go to {% my updates title="**System** > **Updates**" %}. + - Select the update notification. + - Select the cogwheel {% icon "mdi:cog-outline" %}, then set **Visible** to active. diff --git a/source/_docs/z-wave/controllers.markdown b/source/_docs/z-wave/controllers.markdown index 0028c9083388..62aee08978c1 100644 --- a/source/_docs/z-wave/controllers.markdown +++ b/source/_docs/z-wave/controllers.markdown @@ -7,7 +7,7 @@ description: "Extended instructions how to setup Z-Wave." You need to have a compatible Z-Wave stick or module installed. The following devices have been confirmed to work with Z-Wave JS: -<div class='note warning'> +{% warning %} Until recently, 700 series Z-Wave Controllers had a bug that could cause the mesh to be flooded on some networks and the controller to become unresponsive. At present, all 700 series controllers share the same firmware and are subject to this bug. It appears that this bug is largely, if not completely, resolved as of firmware version 7.17.2. @@ -18,7 +18,7 @@ Users should upgrade the firmware on all 700 series controllers to version 7.17. - [Upgrade instructions using Windows (Zooz)](https://www.support.getzooz.com/kb/article/931-how-to-perform-an-ota-firmware-update-on-your-zst10-700-z-wave-stick/) - [Upgrade instructions using Windows/Linux (Z-Wave.Me)](https://z-wave.me/support/uzbrazberry-firmwares/) -</div> +{% endwarning %} - 800 series controllers (with some caveats, see notes) - Zooz 800 Series Z-Wave Long Range S2 Stick (ZST39 LR) @@ -50,9 +50,9 @@ Users should upgrade the firmware on all 700 series controllers to version 7.17. If you are just starting out, we recommend that you purchase a 700 series controller or a Raspberry Pi module. The 700 series controllers are the more recent version (when compared to the 500 series). The 700 series controllers support SmartStart, which allows you to add a device by scanning a QR code. -<div class='note'> - If you're using Home Assistant OS, Supervised, or Container, it's recommended to use a USB stick, not a module. Passing a module through Docker is more complicated than passing a USB stick through. -</div> +{% tip %} +If you're using Home Assistant OS, Supervised, or Container, it's recommended to use a USB stick, not a module. Passing a module through Docker is more complicated than passing a USB stick through. +{% endtip %} ## Stick alternatives @@ -71,11 +71,9 @@ Z-Wave JS does not support Z-Wave Long Range yet. ### Aeotec Z-Stick -<div class='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. - -</div> +{% 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 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. @@ -127,23 +125,17 @@ sudo systemctl disable hciuart You should also check the README for details on the overlays. You might find it in `/boot/overlays/README` on your SD-card. If it is not there you can find [the official version here](https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README). -<div class='note'> - - It is possible to keep a limited Bluetooth functionality while using Razberry Z-Wave. Check `boot/overlays/README` on `miniuart-bt`. - -</div> - -<div class='note'> - - `disable-bt` was previously known as `pi3-disable-bt`. If your OS is old, you might need to use this instead. - -</div> - -<div class='note'> +{% note %} +It is possible to keep a limited Bluetooth functionality while using Razberry Z-Wave. Check `boot/overlays/README` on `miniuart-bt`. +{% endnote %} - If you've installed the Z-Wave.Me Z-Way software. In order to use Z-Wave JS instead of Z-Way, you'll need to ensure you disable it before you install Home Assistant, or you won't be able to access the board. Do this with `sudo /etc/init.d/z-way-server stop; sudo update-rc.d z-way-server disable`. Alternatively, you could use the [Z-Wave.Me](/integrations/zwave_me) integration. +{% note %} +`disable-bt` was previously known as `pi3-disable-bt`. If your OS is old, you might need to use this instead. +{% endnote %} -</div> +{% note %} +If you've installed the Z-Wave.Me Z-Way software. In order to use Z-Wave JS instead of Z-Way, you'll need to ensure you disable it before you install Home Assistant, or you won't be able to access the board. Do this with `sudo /etc/init.d/z-way-server stop; sudo update-rc.d z-way-server disable`. Alternatively, you could use the [Z-Wave.Me](/integrations/zwave_me) integration. +{% endnote %} #### Setting up a Raspberry Pi Z-Wave module on Home Assistant Yellow diff --git a/source/_faq/python.markdown b/source/_faq/python.markdown deleted file mode 100644 index d46767dd7747..000000000000 --- a/source/_faq/python.markdown +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Python 2" -description: "Support for Python 2" -ha_category: Common ---- - - -There will be no support for Python 2.x. Python 2 will be EOL in [2020](https://www.python.org/dev/peps/pep-0373/#id2) and it doesn't make any sense to support a release which was planned to be retired in 2015. diff --git a/source/_includes/asides/about.html b/source/_includes/asides/about.html index daf0a0ff121a..094a972b38a9 100644 --- a/source/_includes/asides/about.html +++ b/source/_includes/asides/about.html @@ -1,14 +1,13 @@ <section class="aside-module grid__item one-whole lap-one-half"> - <h1 class="title delta">About Home Assistant</h1> + <h1 class="title epsilon">{% icon "mdi:about-circle-outline" %} About Home Assistant</h1> <ul class="divided"> <li> {{ site.description }} </li> <li><a href='/getting-started/'>Get started with Home Assistant</a></li> - <li><a href='https://demo.home-assistant.io'>Try the online demo</a></li> - <li><a href='https://building.open-home.io/#/portal'>Join our newsletter</a></li> - <li><a href="https://twitter.com/Home_Assistant">Follow Home Assistant on X</a></li> - <li><a href="https://www.openhomefoundation.org/">Home Assistant is part of the Open Home Foundation</a></li> + <li><a class="external-link" href='https://demo.home-assistant.io'>Try the online demo {% icon "tabler:external-link" %}</a></li> + <li><a class="external-link" href='https://building.open-home.io/#/portal'>Sign up for our newsletter {% icon "tabler:external-link" %}</a></li> + <li><a class="external-link" href="https://twitter.com/Home_Assistant">Follow Home Assistant on X {% icon "tabler:external-link" %}</a></li> {% comment %} <li> Subscribe to the Home Assistant Newsletter @@ -19,4 +18,7 @@ <h1 class="title delta">About Home Assistant</h1> </li> {% endcomment %} </ul> + <p> + Home Assistant is part of the <a class="external-link" href="https://www.openhomefoundation.org/">Open Home Foundation {% icon "tabler:external-link" %}</a>. + </p> </section> diff --git a/source/_includes/asides/categories.html b/source/_includes/asides/categories.html index 639ce3fc038d..94ff7d2fdc81 100644 --- a/source/_includes/asides/categories.html +++ b/source/_includes/asides/categories.html @@ -1,11 +1,11 @@ -<section class="aside-module grid__item one-whole lap-one-half"> - <h1 class="title delta">Categories</h1> +<section class="categories aside-module grid__item one-whole lap-one-half"> + <h1 class="title epsilon">{% icon "mdi:category" %} Categories</h1> <ul class="divided"> {% assign categories = site.categories | sort %} {% for category in categories %} {% assign category_name = category | first | downcase %} {% if category_name != "core"%} - <li><a href="/blog/categories/{{ category_name }}/">{{ category | first | replace: '-', ' '}}</a></li> + <li><a href="/blog/categories/{{ category_name }}/">{{ category | first | replace: '-', ' '}} <span class="count">{{ category[1] | size }}</span></a></li> {% endif %} {% endfor %} </ul> diff --git a/source/_includes/asides/cloud_navigation.html b/source/_includes/asides/cloud_navigation.html index b4d936c0579e..c89e978be9cd 100644 --- a/source/_includes/asides/cloud_navigation.html +++ b/source/_includes/asides/cloud_navigation.html @@ -1,6 +1,6 @@ <section class="aside-module grid__item one-whole lap-one-half"> <div class="section"> - <h1 class="title delta">About Home Assistant</h1> + <h1 class="title epsilon">About Home Assistant</h1> <ul class="divided sidebar-menu"> <li> The Home Assistant Cloud is a cloud-based service provided to supporters of the Home Assistant project. diff --git a/source/_includes/asides/common_tasks_navigation.html b/source/_includes/asides/common_tasks_navigation.html index c3f5fd67dd0c..bc1550bdc02e 100644 --- a/source/_includes/asides/common_tasks_navigation.html +++ b/source/_includes/asides/common_tasks_navigation.html @@ -1,6 +1,6 @@ <section class="aside-module grid__item one-whole lap-one-half"> <div class='section'> - <h1 class="title delta">Common tasks</h1> + <h1 class="title epsilon">Common tasks</h1> <ul class='divided sidebar-menu'> <li>{% active_link /common-tasks/os/ Home Assistant Operating System %}</li> <li>{% active_link /common-tasks/container/ Home Assistant Container %}</li> diff --git a/source/_includes/asides/component_navigation.html b/source/_includes/asides/component_navigation.html index 0d714b0628e9..d48887881fb4 100644 --- a/source/_includes/asides/component_navigation.html +++ b/source/_includes/asides/component_navigation.html @@ -42,22 +42,30 @@ {{ percentage | remove: ".0" }}%</a> of the active installations. {% endif %} {% endif %} - - {%- if page.ha_iot_class %} - Its IoT class is <a href='/blog/2016/02/12/classifying-the-internet-of-things/#classifiers'>{{ page.ha_iot_class }}</a> - {%- endif -%} - - {%- if page.ha_quality_scale %} - {% if page.ha_iot_class %} - and it - {% else %} - It - {% endif %} - scores {{page.ha_quality_scale}} on our <a href='/docs/quality_scale/'>quality scale</a> - {%- endif -%}{%- if page.ha_quality_scale or page.ha_iot_class %}.{%- endif -%} {% endif %} </div> + {%- if page.ha_iot_class %} + <div class='section'> + {% if page.ha_iot_class == "Assumed State" %}<iconify-icon icon='mdi:circle-half-full'></iconify-icon>{%- endif -%} + {% if page.ha_iot_class == "Cloud Polling" %}<iconify-icon icon='mdi:cloud-upload'></iconify-icon>{%- endif -%} + {% if page.ha_iot_class == "Cloud Push" %}<iconify-icon icon='mdi:cloud-download'></iconify-icon>{%- endif -%} + {% if page.ha_iot_class == "Local Polling" %}<iconify-icon icon='mdi:download-network-outline'></iconify-icon>{%- endif -%} + {% if page.ha_iot_class == "Local Push" %}<iconify-icon icon='mdi:upload-network-outline'></iconify-icon>{%- endif -%} +  Its IoT class is <a href='/blog/2016/02/12/classifying-the-internet-of-things/#classifiers'>{{ page.ha_iot_class }}.</a> + </div> + {%- endif -%} + + {%- if page.ha_quality_scale %} + <div class='section'> + {% if page.ha_quality_scale == "silver" %}🥈 This is a great integration!<br />{%- endif -%} + {% if page.ha_quality_scale == "gold" %}🥇 This is a solid integration!<br />{%- endif -%} + {% if page.ha_quality_scale == "platinum" %}🏆 Best of the best!<br />{%- endif -%} + {% if page.ha_quality_scale == "internal" %}🏠 Under core!<br />{%- endif -%} + It scores {{page.ha_quality_scale}} on our <a href='/docs/quality_scale/'>quality scale</a> + </div> + {%- endif -%} + {% if page.works_with %} {%- for type in page.works_with -%} <div class="section"> @@ -70,15 +78,15 @@ {% if page.ha_domain %} <div class='section'> - <a href="https://github.com/home-assistant/core/tree/dev/homeassistant/components/{{ domain }}" target="_blank"><i class="icon-github"></i> View source on GitHub</a><br /> - <a href="https://github.com/home-assistant/core/issues?q=is%3Aissue+is%3Aopen+label%3A%22integration%3A+{{ domain }}%22" target="_blank"><i class="icon-bug"></i> View known issues</a> + <a href="https://github.com/home-assistant/core/tree/dev/homeassistant/components/{{ domain }}" target="_blank">{% icon "simple-icons:github" %} View source on GitHub</a><br /> + <a href="https://github.com/home-assistant/core/issues?q=is%3Aissue+is%3Aopen+label%3A%22integration%3A+{{ domain }}%22" target="_blank">{% icon "mdi:bug" %} View known issues</a> </div> {%- endif -%} </section> <section class="aside-module grid__item one-whole lap-one-half"> <div class='section'> - <h1 class="title delta">Code owners</h1> + <h1 class="title epsilon">{% icon "mdi:person-heart" %} Integration owners</h1> {% if page.ha_codeowners %} {% assign ha_project = false %} {% for codeowner in page.ha_codeowners %} @@ -98,7 +106,7 @@ <h1 class="title delta">Code owners</h1> <div class="section"> {%- for codeowner in page.ha_codeowners -%} {%- assign clean_codeowner = codeowner | replace: "@", "" -%} - <a href="https://github.com/{{ clean_codeowner }}" target="_blank"><i class="icon-github"></i> {{ codeowner }}</a><br /> + <a href="https://github.com/{{ clean_codeowner }}" target="_blank"><img class="codeowner-avatar" src="https://avatars.githubusercontent.com/{{ codeowner | replace: "@", "" }}?size=96" alt="{{ codeowner }}"/> {{ codeowner }}</a><br /> {%- endfor -%} </div> {% endif %} diff --git a/source/_includes/asides/conference_navigation.html b/source/_includes/asides/conference_navigation.html index d55f3681f543..e51b1318da8c 100644 --- a/source/_includes/asides/conference_navigation.html +++ b/source/_includes/asides/conference_navigation.html @@ -1,6 +1,6 @@ <section class="aside-module grid__item one-whole lap-one-half"> <div class="section"> - <h1 class="title delta">Details</h1> + <h1 class="title epsilon">Details</h1> <ul class="divided sidebar-menu"> <li> <b>When</b>: Sunday, December 13, 2020<br> @@ -14,7 +14,7 @@ <h1 class="title delta">Details</h1> </div> <div class="section"> - <h1 class="title delta">Contact</h1> + <h1 class="title epsilon">Contact</h1> <ul class="divided sidebar-menu"> <li> If you want to collaborate with us, contact us at @@ -26,7 +26,7 @@ <h1 class="title delta">Contact</h1> </div> <div class="section"> - <h1 class="title delta">Sponsors</h1> + <h1 class="title epsilon">Sponsors</h1> <ul class="divided sidebar-menu"> <li> <a href="https://www.nabucasa.com"> diff --git a/source/_includes/asides/dashboards_navigation.html b/source/_includes/asides/dashboards_navigation.html index e438544380c2..6e4340a4e7ec 100644 --- a/source/_includes/asides/dashboards_navigation.html +++ b/source/_includes/asides/dashboards_navigation.html @@ -1,27 +1,19 @@ -<section class="aside-module grid__item one-whole lap-one-half"> +<section class="vertical-nav aside-module grid__item one-whole lap-one-half"> {% assign elements = site.dashboards | sort_natural: 'title' %} <div class="section"> - <h1 class="title delta">Dashboards</h1> + <h1 class="title epsilon"><iconify-icon icon="mdi:view-dashboard"></iconify-icon> Dashboards</h1> <ul class="divided sidebar-menu"> <li>{% active_link /dashboards/ Introduction %}</li> - <li> - {% active_link /dashboards/dashboards/ Multiple dashboards %} - </li> - <li> - {% active_link /dashboards/views/ Views %} - </li> - <li> - {% active_link /dashboards/cards/ Cards %} - </li> - <li> - {% active_link /dashboards/badges/ Badges %} - </li> + <li>{% active_link /dashboards/dashboards/ Multiple dashboards %}</li> + <li>{% active_link /dashboards/views/ Views %}</li> + <li>{% active_link /dashboards/cards/ Cards %}</li> + <li>{% active_link /dashboards/badges/ Badges %}</li> </ul> </div> <div class="section"> - <h1 class="title delta">View types</h1> + <h1 class="title epsilon"><iconify-icon icon="mdi:about-circle-outline"></iconify-icon> View types</h1> <ul class="divided sidebar-menu"> {% for element in elements %} {% if element.type == "view" %} @@ -32,7 +24,7 @@ <h1 class="title delta">View types</h1> </div> <div class="section"> - <h1 class="title delta">Card types</h1> + <h1 class="title epsilon">{% icon "mdi:card-multiple-outline" %} Card types</h1> <ul class="divided sidebar-menu"> {% for element in elements %} {% if element.type == "card" %} @@ -43,18 +35,17 @@ <h1 class="title delta">Card types</h1> </div> <div class="section"> - <h1 class="title delta">Advanced</h1> + <h1 class="title epsilon">{% icon "mdi:cog" %} Advanced</h1> <ul class="divided sidebar-menu"> <li>{% active_link /dashboards/features/ Features %}</li> <li>{% active_link /dashboards/header-footer/ Headers & footers %}</li> <li>{% active_link /dashboards/actions/ Actions %}</li> - <li> - <a + <li><a + class="external-link" href="https://developers.home-assistant.io/docs/frontend/custom-ui/custom-card/" >Developing custom cards - <i class="icon-external-link"></i> - </a> - </li> + {% icon "tabler:external-link" %} + </a></li> </ul> </div> </section> diff --git a/source/_includes/asides/docs_navigation.html b/source/_includes/asides/docs_navigation.html index c44c70668a47..8dd89f3522f4 100644 --- a/source/_includes/asides/docs_navigation.html +++ b/source/_includes/asides/docs_navigation.html @@ -1,190 +1,16 @@ -<section class="aside-module grid__item one-whole lap-one-half"> +<section class="vertical-nav aside-module grid__item one-whole lap-one-half"> <div class="section"> - <h1 class="title delta">Topics</h1> + <h1 class="title epsilon">{% icon "mdi:bookshelf" %} Documentation</h1> <ul class="divided sidebar-menu"> <li> - <b>{% active_link /faq/ FAQ %}</b> + {% active_link /docs/ Overview %} | - <b>{% active_link /docs/glossary/ Glossary %}</b> - </li> - <li> - <b>Getting started</b> - <ul> - <li>{% active_link /installation Installation %}</li> - <li>{% active_link /getting-started Getting started & onboarding %}</li> - <li>{% active_link /common-tasks/os/ Common tasks %}</li> - <li> - {% active_link /docs/troubleshooting/ Troubleshooting installation - %} - </li> - <li> - {% active_link /docs/troubleshooting_general/ General troubleshooting %} - </li> - </ul> - </li> - <li> - <b>{% active_link /docs/frontend/ Frontend %}</b> - <ul> - <li>{% active_link /dashboards Dashboards & views %}</li> - <li>{% active_link /docs/organizing/ Organizing: areas, floors, labels, categories, ... %}</li> - <li>{% active_link /docs/frontend/icons/ Icons%}</li> - </ul> - </li> - <li> - <b>Configuration</b> - <ul> - <li>{% active_link /docs/configuration/ Configuration.yaml %}</li> - <li>{% active_link /docs/configuration/yaml/ YAML syntax%}</li> - <li> - {% active_link /docs/configuration/basic/ Basic information %} - </li> - <li> - {% active_link /docs/configuration/customizing-devices/ Customizing - entities %} - </li> - <li> - {% active_link /docs/configuration/troubleshooting/ Troubleshooting configuration %} - </li> - <li> - {% active_link /docs/configuration/securing/ Security check points - %} - </li> - </ul> - </li> - <li> - <b>{% active_link /docs/energy/ Home Energy Management %}</b> - <ul> - <li>{% active_link /docs/energy/electricity-grid/ Electricity grid %}</li> - <li>{% active_link /docs/energy/solar-panels/ Solar panels %}</li> - <li>{% active_link /docs/energy/individual-devices/ Individual devices %}</li> - <li>{% active_link /docs/energy/faq/ FAQ %}</li> - </ul> - </li> - <li> - Advanced configuration - <ul> - <li>{% active_link /docs/configuration/remote/ Remote access %}</li> - <li> - {% active_link /docs/configuration/splitting_configuration/ - Splitting up the configuration %} - </li> - <li>{% active_link /docs/configuration/packages/ Packages %}</li> - <li> - {% active_link /docs/configuration/secrets/ Storing secrets %} - </li> - <li>{% active_link /docs/configuration/templating/ Templating %}</li> - <li> - {% active_link /docs/configuration/platform_options/ Entity - component platform options %} - </li> - </ul> - </li> - <li> - <b>{% active_link /docs/authentication/ Authentication %}</b> - <ul> - <li> - {% active_link /docs/authentication/providers/ Auth providers %} - </li> - <li> - {% active_link /docs/authentication/multi-factor-auth/ Multi factor - auth %} - </li> - <li> - {% active_link /docs/locked_out/ I'm locked out %} - </li> - </ul> - </li> - <li> - Core objects - <ul> - <li>{% active_link /docs/configuration/events/ Events %}</li> - <li> - {% active_link /docs/configuration/state_object/ State objects %} - </li> - </ul> - </li> - <li> - <b>{% active_link /docs/automation/ Automation %}</b> - <ul> - <li>{% active_link /docs/automation/using_blueprints/ Using automation blueprints %}</li> - <li>{% active_link /docs/automation/basics/ Automation basics %}</li> - <li>{% active_link /docs/automation/editor/ Editor %}</li> - <li>{% active_link /docs/automation/trigger/ Triggers %}</li> - <li>{% active_link /docs/automation/condition/ Conditions %}</li> - <li>{% active_link /docs/automation/action/ Actions %}</li> - <li>{% active_link /docs/automation/modes/ Run modes %}</li> - <li>{% active_link /docs/automation/services/ Services %}</li> - <li>{% active_link /docs/automation/templating/ Templates %}</li> - <li>{% active_link /docs/automation/yaml/ YAML %}</li> - <li> - {% active_link /docs/automation/troubleshooting/ Troubleshooting automation %} - </li> - </ul> - </li> - <li> - <b>{% active_link /docs/blueprint/ Blueprints %}</b> - <ul> - <li>{% active_link /docs/blueprint/tutorial/ Tutorial %}</li> - <li>{% active_link /docs/blueprint/schema/ Blueprint schema %}</li> - <li>{% active_link /docs/blueprint/selectors/ Selectors %}</li> - </ul> - </li> - <li> - <b>{% active_link /docs/backend/ Backend %}</b> - <ul> - <li>{% active_link /docs/backend/database/ Database %}</li> - </ul> - </li> - <li> - <b>{% active_link /docs/scripts/ Scripts %}</b> - <ul> - <li>{% active_link /docs/scripts/service-calls/ Service calls %}</li> - <li>{% active_link /docs/scripts/conditions/ Conditions %}</li> - </ul> - </li> - <li> - <b>{% active_link /docs/scene/ Scenes %}</b> - <ul> - <li>{% active_link /docs/scene/editor/ Editor %}</li> - </ul> - </li> - <li> - <b>{% active_link /docs/tools/ Tools and helpers %}</b> - <ul> - <li>{% active_link /docs/tools/dev-tools/ Developer tools %}</li> - <li>{% active_link /docs/tools/quick-bar/ Quick bar %}</li> - <li>{% active_link /docs/tools/hass/ hass %}</li> - <li>{% active_link /docs/tools/check_config/ check_config %}</li> - </ul> - </li> - <li> - <b>{% active_link /integrations/mqtt MQTT %}</b> - <ul> - <li>{% active_link /integrations/mqtt/#broker-configuration Broker %}</li> - <li>{% active_link /integrations/mqtt/#advanced-broker-configuration Certificate %}</li> - <li>{% active_link /integrations/mqtt/#mqtt-discovery Discovery %}</li> - <li>{% active_link /integrations/mqtt/#publish--dump-services Publish service %}</li> - <li> - {% active_link /integrations/mqtt/#birth-and-last-will-messages Birth and last will messages %} - </li> - <li>{% active_link /integrations/mqtt/#testing-your-setup Testing your setup %}</li> - <li>{% active_link /integrations/mqtt/#logging Logging %}</li> - </ul> - </li> - <li> - <b>Hardware</b> - <ul> - <li> - <a href="https://green.home-assistant.io/">Home Assistant Green</a> - </li> - <li> - <a href="https://yellow.home-assistant.io/">Home Assistant Yellow</a> - </li> - <li> - <a href="https://connectzbt1.home-assistant.io/">Home Assistant Connect ZBT-1</a> - </li> - </ul> + {% active_link /faq/ FAQ %} + | + {% active_link /docs/glossary/ Glossary %} </li> + + {% include asides/docs_sitemap.html %} </ul> </div> </section> \ 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 000000000000..0fead46b2cbc --- /dev/null +++ b/source/_includes/asides/docs_sitemap.html @@ -0,0 +1,277 @@ +<li> + <iconify-icon icon="mdi:robot-happy"></iconify-icon> {% active_link /docs/automation/ Automations %} + {% if doc == 'automation' or doc == 'blueprint' or doc == 'scripts' or doc == 'scene' or include.docs_index %} + <ul> + <li> + {% icon "mdi:robot-happy" %} {% active_link /docs/automation/basics/ Basic automations %} + {% if doc == 'automation' or include.docs_index %} + <ul> + <li>{% active_link /docs/automation/using_blueprints/ Using automation blueprints %}</li> + <li>{% active_link /docs/automation/editor/ Editor %}</li> + <li>{% active_link /docs/automation/trigger/ Triggers %}</li> + <li>{% active_link /docs/automation/condition/ Conditions %}</li> + <li>{% active_link /docs/automation/action/ Actions %}</li> + <li>{% active_link /docs/automation/modes/ Run modes %}</li> + <li>{% active_link /docs/automation/services/ Automation actions %}</li> + <li>{% active_link /docs/automation/templating/ Templates %}</li> + <li>{% active_link /docs/automation/yaml/ YAML %}</li> + <li>{% active_link /docs/automation/troubleshooting/ Troubleshooting automation %}</li> + </ul> + {% endif %} + </li> + <li> + {% icon "mdi:palette" %} {% active_link /docs/scene/ Scenes %} + {% if doc == 'scene' or include.docs_index %} + <ul> + <li>{% active_link /docs/scene/editor/ Editor %}</li> + </ul> + {% endif %} + </li> + <li> + {% icon "mdi:palette-swatch" %} {% active_link /docs/blueprint/ Blueprints %} + {% if doc == 'blueprint' or include.docs_index %} + <ul> + <li>{% active_link /docs/blueprint/tutorial/ Tutorial %}</li> + <li>{% active_link /docs/blueprint/schema/ Blueprint schema %}</li> + <li>{% active_link /docs/blueprint/selectors/ Selectors %}</li> + </ul> + {% endif %} + </li> + <li> + {% icon "mdi:script-text" %} {% active_link /docs/scripts/ Scripts %} + {% if doc == 'scripts' or include.docs_index %} + <ul> + <li>{% active_link /docs/scripts/service-calls/ Actions %}</li> + <li>{% active_link /docs/scripts/conditions/ Conditions %}</li> + </ul> + {% endif %} + </li> + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:gauge" %} {% active_link /dashboards Dashboards %} + {% if root == 'dashboards' or include.docs_index %} + <ul> + {% assign elements = site.dashboards | sort_natural: 'title' %} + + <li> + <iconify-icon icon="mdi:about-circle"></iconify-icon> Dashboard basics + <ul> + <li>{% active_link /dashboards/ Introduction %}</li> + <li>{% active_link /dashboards/dashboards/ Multiple dashboards %}</li> + <li>{% active_link /dashboards/views/ Views %}</li> + <li>{% active_link /dashboards/cards/ Cards %}</li> + <li>{% active_link /dashboards/badges/ Badges %}</li> + </ul> + </li> + + <li> + <iconify-icon icon="mdi:view-dashboard"></iconify-icon> View types + <ul> + {% for element in elements %} + {% if element.type == "view" %} + <li>{% active_link {{element.url}} {{element.sidebar_label}} %}</li> + {% endif %} + {% endfor %} + </ul> + </li> + + <li> + {% icon "mdi:card-multiple" %} Card types + <ul> + {% for element in elements %} + {% if element.type == "card" %} + <li>{% active_link {{element.url}} {{element.sidebar_label}} %}</li> + {% endif %} + {% endfor %} + </ul> + </li> + + <li> + {% icon "mdi:cog" %} Advanced + <ul> + <li>{% active_link /dashboards/features/ Features %}</li> + <li>{% active_link /dashboards/header-footer/ Headers & footers %}</li> + <li>{% active_link /dashboards/actions/ Actions %}</li> + <li><a + class="external-link" + href="https://developers.home-assistant.io/docs/frontend/custom-ui/custom-card/" + >Developing custom cards + {% icon "tabler:external-link" %} + </a></li> + </ul> + </li> + + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:microphone" %} {% active_link /voice_control/ Voice assistants %} + {% if root == 'voice_control' or include.docs_index %} + <ul> + <li><iconify-icon icon="mdi:devices"></iconify-icon> Devices + <ul> + <li>{% active_link /voice_control/android/ Assist for Android %}</li> + <li>{% active_link /voice_control/apple/ Assist for Apple %}</li> + <li>{% active_link /voice_control/start_assist_from_dashboard/ Starting Assist from your dashboard %}</li> + </ul> + </li> + <li>{% icon "mdi:comment-processing-outline" %} {% active_link /voice_control/ Voice assistants %} + <ul> + <li>{% active_link /voice_control/voice_remote_local_assistant/ Configuring a local assistant %}</li> + <li>{% active_link /voice_control/voice_remote_cloud_assistant/ Configuring a cloud assistant %}</li> + <li>{% active_link /voice_control/voice_remote_expose_devices/ Exposing devices to voice assistant %}</li> + <li>{% active_link /voice_control/install_wake_word_add_on/ Enabling a wake word %}</li> + <li>{% active_link /voice_control/about_wake_word/ About wake words %}</li> + <li>{% active_link /voice_control/builtin_sentences/ Built-in sentences %}</li> + <li>{% active_link /voice_control/custom_sentences/ Custom sentences %}</li> + <li>{% active_link /voice_control/aliases/ Using aliases %}</li> + <li>{% active_link /voice_control/using_tts_in_automation/ Using Piper TTS in automations %}</li> + <li>{% active_link /voice_control/assist_create_open_ai_personality/ Creating a personality with AI %}</li> + </ul> + </li> + <li>{% icon "mdi:checkbox-marked" %} Projects + <ul> + <li>{% active_link /voice_control/s3_box_voice_assistant/ Tutorial: ESP32-S3-BOX voice assistant %}</li> + <li>{% active_link /voice_control/s3-box-customize/ Tutorial: Customize the S3-BOX %}</li> + <li>{% active_link /voice_control/thirteen-usd-voice-remote/ Tutorial: $13 voice assistant %}</li> + <li>{% active_link /voice_control/worlds-most-private-voice-assistant/ Tutorial: World's most private voice assistant %}</li> + <li>{% active_link /voice_control/create_wake_word/ Tutorial: Create your own wake word %}</li> + <li>{% active_link /voice_control/assist_daily_summary/ Tutorial: Your daily summary by Assist %}</li> + </ul> + </li> + <li>{% icon "mdi:account-help" %} Troubleshooting + <ul> + <li>{% active_link /voice_control/troubleshooting/ Troubleshooting Assist %}</li> + <li>{% active_link /voice_control/troubleshooting_the_s3_box/ Troubleshooting the ESP32-S3-BOX %}</li> + </ul> + </li> + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:category" %} {% active_link /docs/organizing/ Organization %} + {% if doc == 'organizing' or include.docs_index %} + <ul> + <li>{% active_link /docs/organizing/ Grouping your assets %}</li> + <li>{% active_link /docs/organizing/tables Working with tables %}</li> + <li>{% active_link /docs/organizing/areas/ Areas %}</li> + <li>{% active_link /docs/organizing/floors/ Floors %}</li> + <li>{% active_link /docs/organizing/labels/ Labels %}</li> + <li>{% active_link /docs/organizing/categories/ Categories %}</li> + <li>{% active_link /docs/frontend/icons/ Icons %}</li> + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:solar-power-variant" %} {% active_link /docs/energy/ Home energy management %} + {% if doc == 'energy' or include.docs_index %} + <ul> + <li>{% active_link /docs/energy/electricity-grid/ Electricity grid %}</li> + <li>{% active_link /docs/energy/solar-panels/ Solar panels %}</li> + <li>{% active_link /docs/energy/individual-devices/ Individual devices %}</li> + <li>{% active_link /docs/energy/faq/ FAQ %}</li> + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:update" %} {% active_link /common-tasks/os/ Common tasks %} + {% if root == 'common-tasks' or include.docs_index %} + <ul> + <li>{% active_link /common-tasks/os/ Home Assistant Operating System %}</li> + <li>{% active_link /common-tasks/container/ Home Assistant Container %}</li> + <li>{% active_link /common-tasks/core/ Home Assistant Core %}</li> + <li>{% active_link /common-tasks/supervised/ Home Assistant Supervised %}</li> + <li>{% active_link /common-tasks/general/ Installation independent %}</li> + <li>{% active_link /docs/troubleshooting_general/ General troubleshooting %}</li> + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:cogs" %} {% active_link /docs/configuration/ Advanced configuration %} + {% if doc == 'configuration' or include.docs_index %} + <ul> + <li>{% active_link /docs/configuration/yaml/ YAML syntax %}</li> + <li>{% active_link /docs/configuration/basic/ Basic information %}</li> + <li>{% active_link /docs/configuration/customizing-devices/ Customizing entities %}</li> + <li>{% active_link /docs/configuration/troubleshooting/ Troubleshooting configuration %}</li> + <li>{% active_link /docs/configuration/securing/ Security check points %}</li> + <li>{% active_link /docs/configuration/remote/ Remote access %}</li> + <li>{% active_link /docs/configuration/splitting_configuration/ Splitting up the configuration %}</li> + <li>{% active_link /docs/configuration/packages/ Packages %}</li> + <li>{% active_link /docs/configuration/secrets/ Storing secrets %}</li> + <li>{% active_link /docs/configuration/events/ Events %}</li> + <li>{% active_link /docs/configuration/state_object/ State objects %}</li> + <li>{% active_link /docs/configuration/templating/ Templating %}</li> + <li>{% active_link /docs/configuration/platform_options/ Entity component platform options %}</li> + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:account-security" %} {% active_link /docs/authentication/ Authentication %} + {% if doc == 'authentication' or include.docs_index %} + <ul> + <li>{% active_link /docs/authentication/providers/ Auth providers %}</li> + <li>{% active_link /docs/authentication/multi-factor-auth/ Multi-factor authentication %}</li> + <li>{% active_link /docs/locked_out/ I'm locked out %}</li> + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:database" %} {% active_link /docs/backend/ Backend %} + {% if doc == 'backend' or include.docs_index %} + <ul> + <li>{% active_link /docs/frontend/ User interface %}</li> + <li>{% active_link /docs/backend/database/ Database %}</li> + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:palette" %} {% active_link /docs/tools/ Tools and helpers %} + {% if doc == 'tools' or include.docs_index %} + <ul> + <li>{% active_link /docs/tools/dev-tools/ Developer tools %}</li> + <li>{% active_link /docs/tools/quick-bar/ Quick bar %}</li> + <li>{% active_link /docs/tools/hass/ hass %}</li> + <li>{% active_link /docs/tools/check_config/ check_config %}</li> + </ul> + {% endif %} +</li> + +<li> + {% icon "mdi:cellphone" %} <a href="https://companion.home-assistant.io/docs">iOS and Android apps {% icon "tabler:external-link" %}</a> +</li> + +<li> + {% icon "simple-icons:mqtt" %} {% active_link /integrations/mqtt MQTT %} + {% if doc == 'mqtt' or include.docs_index %} + <ul> + <li>{% active_link /integrations/mqtt/#broker-configuration Broker %}</li> + <li>{% active_link /integrations/mqtt/#advanced-broker-configuration Certificate %}</li> + <li>{% active_link /integrations/mqtt/#mqtt-discovery Discovery %}</li> + <li>{% active_link /integrations/mqtt/#publish--dump-actions Publish action %}</li> + <li>{% active_link /integrations/mqtt/#birth-and-last-will-messages Birth and last will messages %}</li> + <li>{% active_link /integrations/mqtt/#testing-your-setup Testing your setup %}</li> + <li>{% active_link /integrations/mqtt/#logging Logging %}</li> + </ul> + {% endif %} +</li> + +<li> + {% icon "bitcoin-icons:node-hardware-filled" %} Official hardware + <ul> + <li><a href="https://green.home-assistant.io/">Home Assistant Green {% icon "tabler:external-link" %}</a></li> + <li><a href="https://yellow.home-assistant.io/">Home Assistant Yellow {% icon "tabler:external-link" %}</a></li> + <li><a href="https://connectzbt1.home-assistant.io/">Home Assistant Connect ZBT-1 {% icon "tabler:external-link" %}</a></li> + </ul> +</li> diff --git a/source/_includes/asides/faq_navigation.html b/source/_includes/asides/faq_navigation.html index 65221d5ee22f..0b234db9db01 100644 --- a/source/_includes/asides/faq_navigation.html +++ b/source/_includes/asides/faq_navigation.html @@ -1,6 +1,6 @@ <section class="aside-module grid__item one-whole lap-one-half"> <div class='section'> - <h1 class="title delta">Entries</h1> + <h1 class="title epsilon">Entries</h1> <ul class='divided sidebar-menu'> {% assign faq = site.faq | sort_natural: 'title' %} {% assign categories = faq | map: 'ha_category' | uniq | sort_natural %} @@ -11,7 +11,7 @@ <h1 class="title delta">Entries</h1> <ul> {% for entry in faq %} {% if entry.ha_category == category %} -<li><a href='/faq#{{ entry.title | slugify }}'>{{ entry.title}}</a></li> +<li class="faq-entry"><a href='/faq#{{ entry.title | slugify }}'>{{ entry.title}}</a></li> {% endif %} {% endfor %} </ul> diff --git a/source/_includes/asides/getting_started_navigation.html b/source/_includes/asides/getting_started_navigation.html index 5af49d203de9..412959ce8872 100644 --- a/source/_includes/asides/getting_started_navigation.html +++ b/source/_includes/asides/getting_started_navigation.html @@ -1,24 +1,34 @@ -<section class="aside-module grid__item one-whole lap-one-half"> +{% assign url_parts = page.url | split: '/' %} +{% assign root = url_parts[1] %} +{% assign doc = url_parts[2] %} + +<section class="vertical-nav aside-module grid__item one-whole lap-one-half"> <div class="section"> - <h1 class="title delta">Getting started</h1> + <h1 class="title epsilon">{% icon "mdi:rocket-launch-outline" %} Getting started</h1> <ul class="divided sidebar-menu"> - <li>{% active_link /installation/ Installation %}</li> + <li>{% active_link /installation/ Installation %} + {% if root == 'installation' %} + <ul> + <li><a href="https://green.home-assistant.io/">Home Assistant Green {% icon "tabler:external-link" %}</a></li> + <li><a href="https://yellow.home-assistant.io/">Home Assistant Yellow {% icon "tabler:external-link" %}</a></li> + <li>{% active_link /installation/raspberrypi Raspberry Pi %}</li> + <li>{% active_link /installation/odroid ODROID %}</li> + <li>{% active_link /installation/generic-x86-64 Generic x86-64 %}</li> + <li>{% active_link /installation/linux Linux %}</li> + <li>{% active_link /installation/macos macOS %}</li> + <li>{% active_link /installation/windows Windows %}</li> + <li>{% active_link /installation/alternative Other systems %}</li> + </ul> + {% endif %} + </li> <li>{% active_link /getting-started/onboarding/ Onboarding %}</li> <li>{% active_link /getting-started/concepts-terminology/ Concepts and terminology %}</li> - <li>{% active_link /getting-started/onboarding_dashboard/ Edit the dashboard %}</li> - <li>{% active_link /getting-started/integration/ Integration %}</li> - <li>{% active_link /getting-started/automation/ Automation %}</li> - <li> - {% active_link /getting-started/presence-detection/ Presence detection - %} - </li> - <li> - {% active_link /getting-started/join-the-community/ Join the community - %} - </li> - <li> - {% active_link /getting-started/configuration/ Advanced configuration %} - </li> + <li>{% active_link /getting-started/onboarding_dashboard/ Editing the dashboard %}</li> + <li>{% active_link /getting-started/integration/ Adding integrations %}</li> + <li>{% active_link /getting-started/automation/ Automating devices %}</li> + <li>{% active_link /getting-started/presence-detection/ Presence detection %}</li> + <li>{% active_link /getting-started/join-the-community/ Join the community %}</li> + <li>{% active_link /getting-started/configuration/ Next steps %}</li> </ul> </div> </section> diff --git a/source/_includes/asides/hassio_navigation.html b/source/_includes/asides/hassio_navigation.html index 7661f7763b4c..01994fafe97c 100644 --- a/source/_includes/asides/hassio_navigation.html +++ b/source/_includes/asides/hassio_navigation.html @@ -1,6 +1,6 @@ <section class="aside-module grid__item one-whole lap-one-half"> <div class="section"> - <h1 class="title delta">Topics</h1> + <h1 class="title epsilon">Topics</h1> <ul class="divided sidebar-menu"> <li> {% active_link /hassio/ Home Assistant %} diff --git a/source/_includes/asides/help_navigation.html b/source/_includes/asides/help_navigation.html index 532719243d0b..da16646999d3 100644 --- a/source/_includes/asides/help_navigation.html +++ b/source/_includes/asides/help_navigation.html @@ -1,14 +1,17 @@ <section class="aside-module grid__item one-whole lap-one-half"> <div class="section"> - <h1 class="title delta"> </h1> + <h1 class="title epsilon">Topics</h1> <ul class="divided sidebar-menu"> <li>{% active_link /help/ Help %}</li> <li> - <a href="https://developers.home-assistant.io" + <a class="external-link" href="https://developers.home-assistant.io" >Developer documentation - <i class="icon-external-link"></i> + {% icon "tabler:external-link" %} </a> </li> + <li> + {% active_link /help/reporting_issues/ Reporting issues %} + </li> <li> Governance <ul> diff --git a/source/_includes/asides/installation_navigation.html b/source/_includes/asides/installation_navigation.html index 5b9a435daf0d..4d69dfacac6f 100644 --- a/source/_includes/asides/installation_navigation.html +++ b/source/_includes/asides/installation_navigation.html @@ -1,6 +1,6 @@ <section class="aside-module grid__item one-whole lap-one-half"> <div class="section"> - <h1 class="title delta">Installation</h1> + <h1 class="title epsilon">Installation</h1> {{ content | toc_only }} </div> </section> diff --git a/source/_includes/asides/organizing_navigation.html b/source/_includes/asides/organizing_navigation.html index 1b6b2225de3b..9cebcfcae7c0 100644 --- a/source/_includes/asides/organizing_navigation.html +++ b/source/_includes/asides/organizing_navigation.html @@ -1,21 +1,13 @@ <section class="aside-module grid__item one-whole lap-one-half"> <div class="section"> - <h1 class="title delta">Organizing</h1> + <h1 class="title epsilon">Organizing</h1> <ul class="divided sidebar-menu"> <li>{% active_link /docs/organizing/ Grouping your assets %}</li> - <li>{% active_link /docs/organizing/filtering Filtering your assets %}</li> - <li> - {% active_link /docs/organizing/areas/ Areas %} - </li> - <li> - {% active_link /docs/organizing/floors/ Floors %} - </li> - <li> - {% active_link /docs/organizing/labels/ Labels %} - </li> - <li> - {% active_link /docs/organizing/categories/ Categories %} - </li> + <li>{% active_link /docs/organizing/tables Working with tables %}</li> + <li>{% active_link /docs/organizing/areas/ Areas %}</li> + <li>{% active_link /docs/organizing/floors/ Floors %}</li> + <li>{% active_link /docs/organizing/labels/ Labels %}</li> + <li>{% active_link /docs/organizing/categories/ Categories %}</li> </ul> </div> diff --git a/source/_includes/asides/recent_categories.html b/source/_includes/asides/recent_categories.html new file mode 100644 index 000000000000..644228190f74 --- /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 %} + +<section class="recent-categories aside-module grid__item one-whole lap-one-half"> + <h1 class="title epsilon">{% icon "mdi:category" %} Recent categories</h1> + <ul class="divided"> + {% for category in recent_categories limit: 10 %} + {% assign category_link = category | downcase %} + {{ category_name }} + <li><a href="/blog/categories/{{ category_link }}/">{{ category | replace: '-', ' '}} <span class="count">{{ site.categories[category] | size }}</span></a></li> + {% endfor %} + <li><a href="/blog/categories/announcements/">View all categories</a></li> + </ul> +</section> diff --git a/source/_includes/asides/recent_posts.html b/source/_includes/asides/recent_posts.html index 946a8e52bfe9..587f98ea3c56 100644 --- a/source/_includes/asides/recent_posts.html +++ b/source/_includes/asides/recent_posts.html @@ -1,7 +1,9 @@ -<section id="recent-posts" class="aside-module grid__item one-whole lap-one-half"> - <h1 class="title delta">Recent Posts</h1> +{% assign posts_to_show = include.posts | default: 5 %} + +<section class="recent-posts aside-module grid__item one-whole lap-one-half"> + <h1 class="title epsilon">{% icon "mdi:newspaper-variant-multiple" %} Recent Posts</h1> <ul class="divided"> - {% for post in site.posts limit: site.recent_posts %} + {% for post in site.posts limit: posts_to_show %} {% if post.url != page.url %} <li class="post"> <a href="{{ post.url }}">{{ post.title }}</a> diff --git a/source/_includes/asides/voice_navigation.html b/source/_includes/asides/voice_navigation.html index 55d613f5eb2a..9c7f7c359140 100644 --- a/source/_includes/asides/voice_navigation.html +++ b/source/_includes/asides/voice_navigation.html @@ -1,8 +1,6 @@ <section class="aside-module grid__item one-whole lap-one-half"> - {% assign elements = site.dashboards | sort_natural: 'title' %} - <div class="section"> - <h1 class="title delta">Devices</h1> + <h1 class="title epsilon"><iconify-icon icon="mdi:devices"></iconify-icon> Devices</h1> <ul class="divided sidebar-menu"> <li>{% active_link /voice_control/android/ Assist for Android %}</li> <li>{% active_link /voice_control/apple/ Assist for Apple %}</li> @@ -11,7 +9,7 @@ <h1 class="title delta">Devices</h1> </div> <div class="section"> - <h1 class="title delta">{% active_link /voice_control/ Voice assistants %}</h1> + <h1 class="title epsilon">{% icon "mdi:comment-processing-outline" %} {% active_link /voice_control/ Voice assistants %}</h1> <ul class="divided sidebar-menu"> <li>{% active_link /voice_control/voice_remote_local_assistant/ Configuring a local assistant %}</li> <li>{% active_link /voice_control/voice_remote_cloud_assistant/ Configuring a cloud assistant %}</li> @@ -27,7 +25,7 @@ <h1 class="title delta">{% active_link /voice_control/ Voice assistants %}</h1> </div> <div class="section"> - <h1 class="title delta">Projects</h1> + <h1 class="title epsilon">{% icon "mdi:checkbox-marked" %} Projects</h1> <ul class="divided sidebar-menu"> <li>{% active_link /voice_control/s3_box_voice_assistant/ Tutorial: ESP32-S3-BOX voice assistant %}</li> <li>{% active_link /voice_control/s3-box-customize/ Tutorial: Customize the S3-BOX %}</li> @@ -38,7 +36,7 @@ <h1 class="title delta">Projects</h1> </ul> </div> <div class="section"> - <h1 class="title delta">Troubleshooting</h1> + <h1 class="title epsilon">{% icon "mdi:account-help" %} Troubleshooting</h1> <ul class="divided sidebar-menu"> <li>{% active_link /voice_control/troubleshooting/ Troubleshooting Assist %}</li> <li>{% active_link /voice_control/troubleshooting_the_s3_box/ Troubleshooting the ESP32-S3-BOX %}</li> diff --git a/source/_includes/blog/archive_post.html b/source/_includes/blog/archive_post.html index d0f36753b641..0a230421ebd2 100644 --- a/source/_includes/blog/archive_post.html +++ b/source/_includes/blog/archive_post.html @@ -1,20 +1,21 @@ -{% capture category %}{{ post.categories | size }}{% endcapture %} - -<div class="grid"> - - <div class="grid__item one-fifth palm-one-whole"> - <time datetime="{{ post.date | datetime | date_to_xmlschema }}" pubdate> - {{ post.date | date: "<span class='month'>%b</span> <span class='day'>%d</span>"}} - </time> - </div> - <div class="grid__item four-fifths palm-one-whole"> - <h1 class="gamma"><a href="{{ post.url }}">{{post.title}}</a></h1> - {% if category != '0' %} - <footer class="meta"> - {% include blog/post/tags.html %} - </footer> - {% endif %} - <hr class="divider"> +<a href="{{ post.url }}"> + <div class="material-card"> + <div class="img" style="background-image: url({{ post.og_image }})"></div> + <div class="caption"> + <div> + <div class="title"> + {{ post.title }} + </div> + <div class="subtitle"> + <time datetime="{{ post.date | datetime | date_to_xmlschema }}" pubdate> + {{ post.date | date: "<span class='month'>%b</span> <span class='day'>%d</span>"}} + </time> + </div> + </div> + <svg viewBox="0 0 24 24"> + <path d="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"/> + </svg> + </div> </div> +</a> -</div> \ No newline at end of file diff --git a/source/_includes/blog/post/article.html b/source/_includes/blog/post/article.html index e43448aed033..19d0537c7d85 100644 --- a/source/_includes/blog/post/article.html +++ b/source/_includes/blog/post/article.html @@ -1,10 +1,10 @@ <header> {% if index %} - <h1 class="beta"> + <h1> <a href="{{ post.url }}">{{ post.title }}</a> </h1> {% else %} - <h1 class="title indent">{{ page.title }}</h1> + <h1>{{ page.title }}</h1> {% endif %} {% unless post.meta == false %} diff --git a/source/_includes/blog/post/date.html b/source/_includes/blog/post/date.html index 247baa7526a4..7a48d0fa1561 100644 --- a/source/_includes/blog/post/date.html +++ b/source/_includes/blog/post/date.html @@ -7,7 +7,7 @@ {% capture was_updated %}{{ updated | size }}{% endcapture %} {% if has_date != '0' %} - {% capture time %}<time datetime="{{ date | datetime | date_to_xmlschema }}" pubdate{% if updated %} data-updated="true"{% endif %}><i class="icon-calendar"></i> {{ date_formatted }}</time>{% endcapture %} + {% capture time %}<time datetime="{{ date | datetime | date_to_xmlschema }}" pubdate{% if updated %} data-updated="true"{% endif %}>{% icon "mdi:calendar" %} {{ date_formatted }}</time>{% endcapture %} {% endif %} {% if was_updated != '0' %} diff --git a/source/_includes/common-tasks/backups.md b/source/_includes/common-tasks/backups.md index 27d37fe2b9f7..b30858e475de 100644 --- a/source/_includes/common-tasks/backups.md +++ b/source/_includes/common-tasks/backups.md @@ -2,7 +2,7 @@ Backup of your Home Assistant, add-on data, and configuration. Backups are used to [restore](#restoring-a-backup) a system or parts of it if a rollback is needed or to migrate your Home Assistant to new hardware. It is good practice to create a backup before updating. -Backups are made from the backups panel under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}. There is also a [service](/integrations/hassio/#service-hassiobackup_full) available that allows you to trigger the creation of a backup from an automation. Backups are stored in a compressed archive file (.tar) and by default, stored locally in the `/backup` directory. +Backups are made from the backups panel under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}. There is also an [action](/integrations/hassio/#action-hassiobackup_full) available that allows you to trigger the creation of a backup from an automation. Backups are stored in a compressed archive file (.tar) and by default, stored locally in the `/backup` directory. A full backup includes the following directories: @@ -50,7 +50,7 @@ There are multiple ways to store the backup on another device: - **Option 1**: Under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}, on the list, single-click or tap the backup of interest. - **Result**: The backup dialog opens. - - In the dialog, select the three dots menu and select **Download backup**. + - In the dialog, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Download backup**. - **Result**: The selected backup is stored in the **Downloads** folder of your computer. - **Option 2**: If you haven't already done so, [configure access to files on Home Assistant](/common-tasks/{{page.installation}}/#configuring-access-to-files), using one of the methods listed there. - For example, [use the samba add-on](/common-tasks/{{page.installation}}/#installing-and-using-the-samba-add-on). @@ -59,7 +59,7 @@ There are multiple ways to store the backup on another device: - [Add a network storage location](/common-tasks/{{page.installation}}/#network-storage) for backups. - [Change the default location](/common-tasks/{{page.installation}}/#change-default-backup-location) for backups. -- **Option 4**: Or even better, create an automation to handle that, using one of the [backup services](/integrations/hassio/#service-hassiobackup_full). +- **Option 4**: Or even better, create an automation to handle that, using one of the [backup actions](/integrations/hassio/#action-hassiobackup_full). - **Option 5**: Make use of a third-party add-on: - [Google Drive Backup](https://github.com/sabeechen/hassio-google-drive-backup) - [Dropbox Sync](https://github.com/danielwelch/hassio-dropbox-sync) diff --git a/source/_includes/common-tasks/beta_version.md b/source/_includes/common-tasks/beta_version.md index 94ecdbff7648..f1dbf69adb2a 100644 --- a/source/_includes/common-tasks/beta_version.md +++ b/source/_includes/common-tasks/beta_version.md @@ -14,6 +14,11 @@ If you would like to test next release before anyone else, you can install the b 3. Select **Join beta**. 4. Go to the {% my configuration title="**Configuration**" %} panel. 5. Install the update that is presented to you. + - **Troubleshooting**: If you do not see that notification: + - In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Check for updates**. + - Go to {% my updates title="**System** > **Updates**" %}. + - Select the update notification. + - Select the cogwheel {% icon "mdi:cog-outline" %}, then set **Visible** to active. - title: From the CLI content: | diff --git a/source/_includes/common-tasks/data_disk.md b/source/_includes/common-tasks/data_disk.md index 3202dfa86a28..b815b0d02058 100644 --- a/source/_includes/common-tasks/data_disk.md +++ b/source/_includes/common-tasks/data_disk.md @@ -1,28 +1,22 @@ ## Using external data disk -{% term "Home Assistant Operating System" %} supports storing most data on an external storage medium, such as an USB attached SSD or HDD. This data disk contains not only user data but also most of the Home Assistant software as well (Core, Supervisor, etc.). This means a fast data disk will make the system overall much faster. +{% term "Home Assistant Operating System" %} supports storing data on a secondary storage medium. For example, this can be a second internal SSD or HDD or a USB attached SSD or HDD. This data disk contains not only user data but also most of the Home Assistant software as well (Core, Supervisor, etc.). This means a fast data disk will make the system overall much faster. ![Graphics showing the architecture of the data disk feature](/images/haos/usb-data-disk.png) The data disk feature can be used on an existing installation without losing data: The system will move existing data to the external data disk automatically. However, it is recommended to create and download a full <a href="#backups">Backup</a> before proceeding! -<div class='note warning'> +{% caution %} +All data on the target disk will be overwritten! +{% endcaution %} - All data on the target disk will be overwritten! +{% important %} +The storage ca pacity of the external data disk must be larger than the storage capacity of the existing (boot) disk. +{% endimportant %} -</div> - -<div class='note'> - - The storage capacity of the external data disk must be larger than the storage capacity of the existing (boot) disk. - -</div> - -<div class='note'> - - If you have been using a data disk previously with {% term "Home Assistant Operating System" %}, you need to use your host computer to delete all partitions *before* using it as a data disk again. - -</div> +{% important %} +If you have been using a data disk previously with {% term "Home Assistant Operating System" %}, you need to use your host computer to delete all partitions *before* using it as a data disk again. +{% endimportant %} ### Using UI to move the data partition @@ -59,11 +53,9 @@ ha os datadisk move /dev/sdx The system will prepare the data disk and immediately reboot. The reboot will take 10 minutes or more depending on the speed of the new data disk; please be patient! -<div class='note'> - +{% warning %} Using an USB attached SSD can draw quite some power. For instance on Raspberry Pi 3 the official Raspberry Pi power supply (PSU) only provides 2.5A which can be too tight. Use a more powerful power supply if you experience issues. Alternatively use a powered USB hub. Connect the Hub to one of the USB slots of your Raspberry Pi, and connect the SSD to the Hub. In this setup the power supply of the Hub will power the attached device(s). - -</div> +{% endwarning %} ### Migrating an external data disk to another system @@ -89,7 +81,7 @@ To migrate an external data disk from one system to another, follow these steps: 2. Shut down system 1 and remove the data disk. 3. Make sure system 2 has Home Assistant OS installed, and Home Assistant is up and running. Home Assistant is using the data disk (partition) on the boot drive (e.g. SD card) at this point. 4. Make sure system 2 has completed the basic [onboarding](/getting-started/onboarding/) steps, including the last steps where devices are discovered automatically. -5. Plug the external disk into system 2 and go to the **Settings** > **System**. Select the three dots menu, and **Restart Home Assistant** > **Reboot system**. +5. Plug the external disk into system 2 and go to the **Settings** > **System**. Select the three dots {% icon "mdi:dots-vertical" %} menu, and **Restart Home Assistant** > **Reboot system**. **Result**: A repair issue is displayed **Multiple data disks detected**. - The repair issue comes up because system 2 now sees two file systems with an identical name. During a reboot, there is a name conflict with the existing data disk as it is undefined which file system should be used. This can lead to a random selection of the system you end up with. Hence you must make a decision. 6. Open the repair issue and choose one of the options: diff --git a/source/_includes/common-tasks/define_custom_polling.md b/source/_includes/common-tasks/define_custom_polling.md index 13b3e15f2d6f..4ebe15c53011 100644 --- a/source/_includes/common-tasks/define_custom_polling.md +++ b/source/_includes/common-tasks/define_custom_polling.md @@ -4,13 +4,14 @@ If you want to define a specific interval at which your device is being polled f To add the automation: -1. Go to {% my integrations title="**Settings** > **Devices & Services**" %}, and select your integration. -2. On the integration entry, select the three dots. +1. Go to {% my integrations title="**Settings** > **Devices & services**" %}, and select your integration. +2. On the integration entry, select the {% icon "mdi:dots-vertical" %}. - Then, select **System options** and toggle the button to disable polling. ![Disable polling for updates](/images/screenshots/custom_polling_01.png) 3. To define your custom polling interval, create an automation. - - Go to {% my automations title="**Settings** > **Automations & Scenes**" %} and create a new automation. + - Go to {% my automations title="**Settings** > **Automations & scenes**" %} and create a new automation. - Define any trigger and condition you like. - - Under action, select **Call service** and use the [`homeassistant.update_entity` service](/integrations/homeassistant/#service-homeassistantupdate_entity). + - Select **Add action**, then, select **Other actions**. + - Select **Perform action**, and from the list, select the [`homeassistant.update_entity` action](/integrations/homeassistant/#action-homeassistantupdate_entity). ![Update entity](/images/screenshots/custom_polling_02.png) 4. Save your new automation to poll for data. diff --git a/source/_includes/common-tasks/development_version.md b/source/_includes/common-tasks/development_version.md index 712bfef200ba..d2e2cbccb9fa 100644 --- a/source/_includes/common-tasks/development_version.md +++ b/source/_includes/common-tasks/development_version.md @@ -2,11 +2,9 @@ If you want to stay on the bleeding-edge Home Assistant Core development branch, you can upgrade to `dev`. -<div class='note warning'> - - The `dev` branch is likely to be unstable. Potential consequences include loss of data and instance corruption. - -</div> +{% caution %} +The `dev` branch is likely to be unstable. Potential consequences include loss of data and instance corruption. +{% endcaution %} {% if page.installation == "os" or page.installation == "supervised" %} diff --git a/source/_includes/common-tasks/enable_entities.md b/source/_includes/common-tasks/enable_entities.md index 4b05c795dd79..e9ddcd612727 100644 --- a/source/_includes/common-tasks/enable_entities.md +++ b/source/_includes/common-tasks/enable_entities.md @@ -5,13 +5,12 @@ Some entities are disabled by default. To enable them, follow these steps: 1. In Home Assistant, open the table of interest. - To enable or disable entities, go to {% my entities title="**Settings** > **Devices & Services** > **Entities**" %}. - To enable or disable automations, go to {% my automations title="**Settings** > **Automations & Scenes**" %}. -2. [Enable multiselect](/docs/organizing/filtering) and select all the entities you want to enable or disable. -3. In the top right corner, select the three dots menu, then select **Enable** or **Disable**. +2. [Enable multiselect](/docs/organizing/tables) and select all the entities you want to enable or disable. +3. In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Enable** or **Disable**. ![Screenshot showing how to enable or disable multiple automations](/images/organizing/enable_disable.png) ## Related topics -- [Enable multiselect](/docs/organizing/filtering) - [Grouping your assets](/docs/organizing/) -- [Filtering your assets](/docs/organizing/filtering) +- [Working with tables](/docs/organizing/tables) diff --git a/source/_includes/common-tasks/flashing_n2_otg.md b/source/_includes/common-tasks/flashing_n2_otg.md index 8a53895d93ea..91d995bbd5d9 100644 --- a/source/_includes/common-tasks/flashing_n2_otg.md +++ b/source/_includes/common-tasks/flashing_n2_otg.md @@ -38,21 +38,19 @@ After The ODROID-N2+ is set to SPI boot mode and powered on, it boots into a ter ![Exit to shell](/images/hassio/screenshots/exit-shell.png) -<div class='note'> - +{% note %} When using the command line, it may return the following message: `can't access tty; job control turned off.` You can safely ignore this message and proceed with the installation +{% endnote %} -</div> - -2. Use the following command at the console to confirm the storage device node: +1. Use the following command at the console to confirm the storage device node: ```bash ls /dev/mmc* ``` -3. Set the storage device on the ODROID-N2+ as a mass storage device using the `ums` command (USB Mass storage mode). +2. Set the storage device on the ODROID-N2+ as a mass storage device using the `ums` command (USB Mass storage mode). This will configure the ODROID-N2+ and OTG to act as a memory card reader: ```bash diff --git a/source/_includes/common-tasks/network_storage.md b/source/_includes/common-tasks/network_storage.md index 540e8baa891c..90e12654a3d1 100644 --- a/source/_includes/common-tasks/network_storage.md +++ b/source/_includes/common-tasks/network_storage.md @@ -5,17 +5,17 @@ To list all your currently connected network storages, go to **{% my storage tit {% if page.installation == "os" %} -<div class='note'> - You need to update to Home Assistant Operating System 10.2 before you can use this feature. -</div> +{% important %} +You need to update to Home Assistant Operating System 10.2 before you can use this feature. +{% endimportant %} {% else %} -<div class='note'> +{% important %} - You need to make sure you run a supported {% term "Home Assistant Supervised" %} installation with the latest version of the [os-agent](https://github.com/home-assistant/os-agent). Make sure that your supervisor uses [slave bind propagation](https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation) for the data volume. +You need to make sure you run a supported {% term "Home Assistant Supervised" %} installation with the latest version of the [os-agent](https://github.com/home-assistant/os-agent). Make sure that your supervisor uses [slave bind propagation](https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation) for the data volume. -</div> +{% endimportant %} {% endif %} diff --git a/source/_includes/common-tasks/specific_version.md b/source/_includes/common-tasks/specific_version.md index 7af2f2a10522..fe9c4ab215e8 100644 --- a/source/_includes/common-tasks/specific_version.md +++ b/source/_includes/common-tasks/specific_version.md @@ -4,6 +4,8 @@ {% if page.installation != "os" and page.installation != "supervised" %} +To see which version your system is running, go to {% my info title="**Settings** > **About**" %}. + In the event that a Home Assistant Core version doesn't play well with your hardware setup, you can downgrade to a previous release. In this example `{{current_version}}` is used as the target version but you can choose the version you desire to run. {% endif %} diff --git a/source/_includes/common-tasks/third-party-addons.md b/source/_includes/common-tasks/third-party-addons.md index d2b6c3732033..827791fbfceb 100644 --- a/source/_includes/common-tasks/third-party-addons.md +++ b/source/_includes/common-tasks/third-party-addons.md @@ -6,9 +6,9 @@ Home Assistant allows anyone to create add-on repositories to share their add-on https://github.com/home-assistant/hassio-addons-example ``` -<div class='note warning'> +{% caution %} Home Assistant cannot guarantee the quality or security of third-party add-ons. Use at your own risk. -</div> +{% endcaution %} <p class='img'> <img src='/images/hassio/screenshots/dashboard.png' /> diff --git a/source/_includes/common-tasks/update.md b/source/_includes/common-tasks/update.md index 00498602479b..6d5c7087ade0 100644 --- a/source/_includes/common-tasks/update.md +++ b/source/_includes/common-tasks/update.md @@ -20,8 +20,11 @@ To update Home Assistant Core when you run Home Assistant {{ page.installation_n 1. Open your Home Assistant UI. 2. Navigate to the **Settings** panel. 3. On the top you will be presented with an update notification. - - _If you do not see that notification you can click the overflow menu in the top right and select "Check for updates"._ + - **Troubleshooting**: If you do not see that notification: + - In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Check for updates**. + - Go to {% my updates title="**System** > **Updates**" %}. + - Select the update notification. + - Select the cogwheel {% icon "mdi:cog-outline" %}, then set **Visible** to active. - title: Using the CLI content: | diff --git a/source/_includes/custom/features.html b/source/_includes/custom/features.html index 72e7cb12f865..5a89e8f991b4 100644 --- a/source/_includes/custom/features.html +++ b/source/_includes/custom/features.html @@ -1,119 +1,128 @@ -<div class="feature-cards"> - <div class="card"> - <div class="card-header"> - <i class="icon-lightbulb"></i> - Works with over 1000 brands - </div> - <div class="card-content"> - <p> - Home Assistant integrates with over a thousand different devices - and services. - </p> +<section class="grid features"> + <div class="grid__item one-whole"> + <h2 class="sub-title">Features</h2> - <p> - Once started, Home Assistant will automatically scan your network for - known devices and allow you to easily set them up. - </p> - <a class="button" href="/integrations">EXPLORE INTEGRATIONS</a> - </div> - </div> - <div class="card"> - <div class="card-header"> - <i class="icon-gears"></i> - Powerful automations - </div> - <div class="card-content"> - <p> - Once you have integrated all your devices at home, you can unleash Home - Assistant’s advanced automation engine to make your home work for you. - </p> + <div class="feature-cards"> + <div class="card"> + <div class="card-header"> + {% icon "mdi:lightbulb-variant-outline" %} + Works with over 1000 brands + </div> + <div class="card-content"> + <p> + Home Assistant integrates with over a thousand different devices + and services. + </p> - <ul> - <li>Turn on the light when the sun sets or when coming home</li> - <li>Alert you when you leave your garage door open.</li> - </ul> - <a class="button" href="/docs/automation">EXPLORE AUTOMATIONS</a> - </div> - </div> - <div class="card"> - <div class="card-header"> - <i class="icon-puzzle-piece"></i> - Extend your system with add-ons - </div> - <div class="card-content"> - <p> - Home Assistant is not just limited to Home Assistant. Easily install - other applications that will help you manage your home. - </p> + <p> + Once started, Home Assistant will automatically scan your network for + known devices and allow you to easily set them up. + </p> + <a class="button" href="/integrations">EXPLORE INTEGRATIONS</a> + </div> + </div> - <ul> - <li>Run AdGuard, a DNS-based ad blocker</li> - <li>Run third party automation engines like NodeRed</li> - <li>Turn Home Assistant into a Spotify Connect target</li> - </ul> - <a class="button" href="/addons">EXPLORE ADD-ONS</a> - </div> - </div> - <div class="card"> - <div class="card-header"> - <i class="icon-shield"></i> - All your smart home data stays local - </div> - <div class="card-content"> - <p>Home Assistant keeps your data local, no need for a cloud.</p> + <div class="card"> + <div class="card-header"> + {% icon "mdi:robot-happy-outline" %} + Powerful automations + </div> + <div class="card-content"> + <p> + Once you have integrated all your devices at home, you can unleash Home + Assistant’s advanced automation engine to make your home work for you. + </p> - <p> - Home Assistant communicates with your devices locally, and will fallback - to pulling in data from the cloud if there is no other option. No data - is stored in the cloud, and everything is processed locally. - </p> - </div> - </div> - <div class="card"> - <div class="card-header"> - <i class="icon-mobile-phone"></i> - Companion Mobile Apps - </div> - <div class="card-content"> - <p> - Use the official Home Assistant apps, a convenient companion to quickly - control your devices and be notified when things happen in your home, - even on your wrist using the Apple Watch. - </p> + <ul> + <li>Turn on the light when the sun sets or when coming home</li> + <li>Alert you when you leave your garage door open.</li> + </ul> + <a class="button" href="/docs/automation">EXPLORE AUTOMATIONS</a> + </div> + </div> + <div class="card"> + <div class="card-header"> + {% icon "mdi:puzzle" %} + Extend your system with add-ons + </div> + <div class="card-content"> + <p> + Home Assistant is not just limited to Home Assistant. Easily install + other applications that will help you manage your home. + </p> - <p> - The apps can also be used to send your location home to use presence - detection as part of your automations. Data is sent directly to your - home, no access by third-parties. - </p> - <a - class="button" - href="https://companion.home-assistant.io/" - target="_blank" - > - DOWNLOAD APPS - </a> - </div> - </div> - <div class="card"> - <div class="card-header"> - <i class="icon-sun"></i> - Home Energy Management - </div> - <div class="card-content"> - <p> - Home Assistant allows you to get on top of your energy use with its - home energy management feature. Gain new insights, - optimize your solar panel production, plan energy usage and save money. - </p> + <ul> + <li>Run AdGuard, a DNS-based ad blocker</li> + <li>Run third party automation engines like NodeRed</li> + <li>Turn Home Assistant into a Spotify Connect target</li> + </ul> + <a class="button" href="/addons">EXPLORE ADD-ONS</a> + </div> + </div> + <div class="card"> + <div class="card-header"> + {% icon "mdi:shield-home-outline" %} + All your smart home data stays local + </div> + <div class="card-content"> + <p>Home Assistant keeps your data local, no need for a cloud.</p> + + <p> + Home Assistant communicates with your devices locally, and will fallback + to pulling in data from the cloud if there is no other option. No data + is stored in the cloud, and everything is processed locally. + </p> + </div> + </div> + <div class="card"> + <div class="card-header"> + {% icon "mdi:cellphone" %} + Companion Mobile Apps + </div> + <div class="card-content"> + <p> + Use the official Home Assistant apps, a convenient companion to quickly + control your devices and be notified when things happen in your home, + even on your wrist using the Apple Watch. + </p> + + <p> + The apps can also be used to send your location home to use presence + detection as part of your automations. Data is sent directly to your + home, no access by third-parties. + </p> + <a + class="button" + href="https://companion.home-assistant.io/" + target="_blank" + > + DOWNLOAD APPS + </a> + </div> + </div> - <a - class="button" - href="/home-energy-management/" - aria-label="Learn more about Home Energy Management" - > - LEARN MORE - </a> + <div class="card"> + <div class="card-header"> + {% icon "mdi:solar-power-variant" %} + Home Energy Management + </div> + <div class="card-content"> + <p> + Home Assistant allows you to get on top of your energy use with its + home energy management feature. Gain new insights, + optimize your solar panel production, plan energy usage and save money. + </p> + + <a + class="button" + href="/home-energy-management/" + aria-label="Learn more about Home Energy Management" + > + LEARN MORE + </a> + </div> + </div> </div> + </div> -</div> +</section> \ No newline at end of file diff --git a/source/_includes/custom/welcome.html b/source/_includes/custom/welcome.html index 77d747068abf..10eacf5d8fb2 100644 --- a/source/_includes/custom/welcome.html +++ b/source/_includes/custom/welcome.html @@ -1,4 +1,4 @@ -<h1>Awaken your home</h1> +<h1>Awaken<br><span class="line2">your home</span></h1> <p class="lead"> {{ site.description }} </p> @@ -15,7 +15,7 @@ <h1>Awaken your home</h1> {%- endfor -%} <p class='hero-buttons'> - <a href='/getting-started/'>Get started</a> - <a href='https://demo.home-assistant.io' target='_blank'>View demo</a> + <a href='/getting-started/' class="primary">Get started <iconify-icon inline icon='mdi:arrow-right'></iconify-icon></a><br/> + <a href='https://demo.home-assistant.io' target='_blank'>View live demos</a> <a href='/integrations/'>Browse {{ tot | minus: 1 | divided_by: 100 | round | times: 100 }}+ integrations</a> </p> \ No newline at end of file diff --git a/source/_includes/dashboard/edit_dashboard.md b/source/_includes/dashboard/edit_dashboard.md index 0e5d9dd0bb1a..42da726cd252 100644 --- a/source/_includes/dashboard/edit_dashboard.md +++ b/source/_includes/dashboard/edit_dashboard.md @@ -8,5 +8,5 @@ To add the {{ title | downcase }} to your user interface: - If this is your first time editing a dashboard, the **Edit dashboard** dialog appears. - By editing the dashboard, you are taking over control of this dashboard. - This means that it is no longer automatically updated when new dashboard elements become available. - - To continue, in the dialog, select the three dots menu, then select **Take control**. + - To continue, in the dialog, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Take control**. 2. [Add a card](/dashboards/cards/#adding-cards-to-your-dashboard) to your dashboard. diff --git a/source/_includes/feedback.html b/source/_includes/feedback.html index 2801ad6bd01c..6014e030f85e 100644 --- a/source/_includes/feedback.html +++ b/source/_includes/feedback.html @@ -1,36 +1,36 @@ {% unless page.feedback == false or page.layout == "landingpage" %} <div class="material-card text feedback"> - <h4><a href="#feedback_section" class="title-link" name="feedback_section"></a><b> Help us to improve our documentation</b></h4> + <h4>{% icon "mdi:feedback" %} <b> Help us improve our documentation</b><a href="#feedback_section" class="title-link" name="feedback_section"></a></h4> Suggest an edit to this page, or provide/view feedback for this page. <div class="links"> <a href="{{ site.netlify.repository_url }}/tree/{{ site.netlify.head }}/source/{{ page.path }}" target="_blank" - ><i class="icon-edit" /> Edit</a + ><iconify-icon inline icon="mdi:edit" /> Edit</a > {% if page.ha_domain %} <a href="{{ site.netlify.repository_url }}/issues/new?template=feedback.yml&url={{ site.netlify.url | url_encode }}{{ page.url | url_encode }}&version={{ site.current_major_version }}.{{ site.current_minor_version }}.{{ site.current_patch_version }}&labels={{ site.netlify.branch }},integration%3A%20{{ page.ha_domain }}" target="_blank" - ><i class="icon-comment" /> Provide feedback</a + ><iconify-icon inline icon="mdi:comment-edit-outline" /> Provide feedback</a > <a href="{{ site.netlify.repository_url }}/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22integration%3A+{{ page.ha_domain }}%22" target="_blank" - ><i class="icon-comments" /> View pending feedback</a + ><iconify-icon inline icon="mdi:comment-text-multiple-outline" /> View pending feedback</a > {% else %} <a href="{{ site.netlify.repository_url }}/issues/new?template=feedback.yml&url={{ site.netlify.url | url_encode }}{{ page.url | url_encode }}&version={{ site.current_major_version }}.{{ site.current_minor_version }}.{{ site.current_patch_version }}&labels={{ site.netlify.branch }}" target="_blank" - ><i class="icon-comment" /> Provide feedback</a + ><iconify-icon inline icon="mdi:comment-edit-outline" /> Provide feedback</a > <a href="{{ site.netlify.repository_url }}/issues?utf8=%E2%9C%93&q=%22{{ page.url | url_encode }}%22&in=body" target="_blank" - ><i class="icon-comments" /> View given feedback</a + ><iconify-icon inline icon="mdi:comment-text-multiple-outline" /> View given feedback</a > {% endif %} </div> diff --git a/source/_includes/getting-started/next_step.html b/source/_includes/getting-started/next_step.html index ebd26ee7e8d9..5444f2c3f615 100644 --- a/source/_includes/getting-started/next_step.html +++ b/source/_includes/getting-started/next_step.html @@ -1,7 +1,7 @@ <a href="{{ include.link }}" class="link-card next-step"> <div class="material-card text"> - <p>{{ include.step }}</p> + <p><iconify-icon inline icon="{{ include.icon }}"></iconify-icon>  {{ include.step }}</p> {% include assets/chevron_right.html %} </div> </a> diff --git a/source/_includes/installation/container.md b/source/_includes/installation/container.md index 6dbf16734afd..104dc840318c 100644 --- a/source/_includes/installation/container.md +++ b/source/_includes/installation/container.md @@ -3,13 +3,18 @@ {% if page.installation_type != 'alternative' %} These below instructions are for an installation of {% term "Home Assistant Container" %} running in your own container environment, which you manage yourself. Any [OCI](https://opencontainers.org/) compatible runtime can be used, however this guide will focus on installing it with Docker. -<div class='note'> -<b>Prerequisites</b> +{% note %} +This installation method does not have access to add-ons. +{% endnote %} + +{% important %} +<b>Prerequisites</b> This guide assumes that you already have an operating system setup and a container runtime installed (like Docker). - + If you are using Docker then you need to be on at least version 19.03.9, ideally an even higher version, and `libseccomp` 2.4.2 or newer. -</div> + +{% endimportant %} ### Platform installation @@ -36,7 +41,7 @@ Once the Home Assistant Container is running Home Assistant should be accessible If you change the configuration, you have to restart the server. To do that you have 3 options. 1. In your Home Assistant UI, go to the **Settings** > **System** and click the **Restart** button. -2. You can go to the **Developer Tools** > **Services**, select the service `homeassistant.restart` and select **Call Service**. +2. You can go to the **Developer Tools** > **Actions**, select the service `homeassistant.restart` and select **Perform action**. 3. Restart it from a terminal. {% tabbed_block %} @@ -59,11 +64,9 @@ If you change the configuration, you have to restart the server. To do that you ### Docker compose -<div class="note tip"> - - `docker compose` should [already be installed](https://www.docker.com/blog/announcing-compose-v2-general-availability/) on your system. If not, you can [manually](https://docs.docker.com/compose/install/linux/) install it. - -</div> +{% tip %} +`docker compose` should [already be installed](https://www.docker.com/blog/announcing-compose-v2-general-availability/) on your system. If not, you can [manually](https://docs.docker.com/compose/install/linux/) install it. +{% endtip %} As the Docker command becomes more complex, switching to `docker compose` can be preferable and support automatically restarting on failure or system restart. Create a `compose.yml` file: @@ -96,7 +99,6 @@ In order to use Zigbee or other integrations that require access to devices, you content: | ```yaml - version: '3' services: homeassistant: ... @@ -125,7 +127,6 @@ As jemalloc can cause issues on certain hardware, it can be disabled by passing content: | ```yaml - version: '3' services: homeassistant: ... diff --git a/source/_includes/installation/container/alternative.md b/source/_includes/installation/container/alternative.md index a1bc4f712995..d2b1bb61d51e 100644 --- a/source/_includes/installation/container/alternative.md +++ b/source/_includes/installation/container/alternative.md @@ -1,6 +1,6 @@ ### Synology NAS -As Synology within DSM now supports Docker (with a neat UI), you can simply install Home Assistant using Docker without the need for command-line. For details about the package (including compatibility-information, if your NAS is supported), see <https://www.synology.com/en-us/dsm/packages/Docker> +Synology with DSM now supports Docker, allowing you to install Home Assistant using Docker without the need for command-line. For details about the package (including compatibility-information, if your NAS is supported), see <https://www.synology.com/en-us/dsm/packages/Docker> The steps would be: @@ -26,11 +26,9 @@ To use a Z-Wave USB stick for Z-Wave control, the HA Docker container needs extr <https://www.synology.com/en-global/knowledgebase/DSM/help/DSM/AdminCenter/system_terminal> -<div class='note'> - +{% tip %} [See this page for accessing the Terminal via SSH](https://www.synology.com/en-global/knowledgebase/DSM/tutorial/General_Setup/How_to_login_to_DSM_with_root_permission_via_SSH_Telnet) - -</div> +{% endtip %} Adjust the following Terminal command as follows : @@ -61,15 +59,15 @@ Remark: to restart your Home Assistant within Synology NAS, you just have to do - Go to the "Container Manager"-app and move to "Container"-section - Right-click on it and select "Action"->"Restart". -<div class='note'> +{% note %} If you want to use a USB Bluetooth adapter or Z-Wave USB Stick with Home Assistant on Synology Docker these instructions do not correctly configure the container to access the USB devices. To configure these devices on your Synology Docker Home Assistant you can follow the instructions provided [here](https://philhawthorne.com/installing-home-assistant-io-on-a-synology-diskstation-nas/) by Phil Hawthorne. -</div> +{% endnote %} ### QNAP NAS -As QNAP within QTS now supports Docker (with a neat UI), you can simply install Home Assistant using Docker without the need for command-line. For details about the package (including compatibility-information, if your NAS is supported), see <https://www.qnap.com/solution/container_station/en/index.php> +QNAP with QTS supports Docker, allowing you to install Home Assistant using Docker without the need for command-line. For details about the package (including compatibility-information, if your NAS is supported), see <https://www.qnap.com/solution/container_station/en/index.php> The steps would be: diff --git a/source/_includes/installation/container/compose.md b/source/_includes/installation/container/compose.md index c4d1391c3f69..ed1903ba70d2 100644 --- a/source/_includes/installation/container/compose.md +++ b/source/_includes/installation/container/compose.md @@ -1,5 +1,4 @@ ```yaml - version: '3' services: homeassistant: container_name: homeassistant diff --git a/source/_includes/installation/core.md b/source/_includes/installation/core.md index 7e06ce3b64c8..edfaa7368e12 100644 --- a/source/_includes/installation/core.md +++ b/source/_includes/installation/core.md @@ -8,18 +8,17 @@ To install {% term "Home Assistant Core" %} on Windows, you will need to use th As an alternative, Home Assistant OS can be installed in a Linux guest VM. Running {% term "Home Assistant Core" %} directly on Windows is not supported. {% endif %} -<div class='note warning'> - +{% caution %} This is an advanced installation process, and some steps might differ on your system. Considering the nature of this installation type, we assume you can handle subtle differences between this document and the system configuration you are using. When in doubt, please consider one of the [other installation methods](/installation/), as they might be a better fit instead. +{% endcaution %} -</div> +{% important %} -<div class='note'> <b>Prerequisites</b> This guide assumes that you already have an operating system setup and have installed Python {{site.installation.versions.python}} (including the package `python3-dev`) or newer. -</div> +{% endimportant %} ### Install dependencies @@ -97,8 +96,8 @@ You can now reach your installation via the web interface on `http://homeassista If this address doesn't work you may also try `http://localhost:8123` or `http://X.X.X.X:8123` (replace X.X.X.X with your machines’ IP address). -<div class='note'> +{% note %} When you run the `hass` command for the first time, it will download, install and cache the necessary libraries/dependencies. This procedure may take anywhere between 5 to 10 minutes. During that time, you may get a **site cannot be reached** error when accessing the web interface. This will only happen the first time. Subsequent restarts will be much faster. -</div> +{% endnote %} diff --git a/source/_includes/installation/operating_system.md b/source/_includes/installation/operating_system.md index 7adfa27b4384..b68ed5bfc272 100644 --- a/source/_includes/installation/operating_system.md +++ b/source/_includes/installation/operating_system.md @@ -43,7 +43,8 @@ Variants without pre-installed Home Assistant: {% if page.installation_type == 'generic-x86-64' %} -<div class='note'> +{% important %} + <b>Prerequisites</b> This guide assumes that you have a dedicated {{ site.installation.types[page.installation_type].board }} PC to exclusively run the {% term "Home Assistant Operating System" %}. @@ -57,7 +58,7 @@ This guide assumes that you have a dedicated {{ site.installation.types[page.ins 1. First, you will need to configure your {{ site.installation.types[page.installation_type].board }} PC to use UEFI boot mode. 2. Then, write the {% term "Home Assistant Operating System" %} disk image to your boot medium. -</div> +{% endimportant %} ## Configure the BIOS on your x86-64 hardware @@ -80,9 +81,9 @@ The BIOS configuration is now complete. Next, you need to write the Home Assistant Operating System image to the *boot medium*, which is the medium your x86-64 hardware will boot from when it is running Home Assistant. -<div class='note'> +{% note %} HAOS has no integrated installer that writes the image automatically. You will write it manually using either the <b>Disks</b> utility from Ubuntu or Balena Etcher. -</div> +{% endnote %} Typically, an internal medium like S-ATA hard disk, S-ATA SSD, M.2 SSD, or a non-removable eMMC is used for the x86-64 boot medium. Alternatively, an external medium can be used such as a USB SDD, though this is not recommended. @@ -119,7 +120,7 @@ To write the HAOS image to the boot medium on your x86-64 hardware, there are 2 6. In Ubuntu, in the bottom left corner, select **Show Applications**. 7. In the applications, search and open **Disks** and start restoring the HAOS image: 1. In **Disks**, on the left side, select the internal disk device you want to install HAOS onto. - 2. On top of the screen, select the three dots menu and select **Restore Disk Image...**. + 2. On top of the screen, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Restore Disk Image...**. ![Restore disk image: select three dots menu](/images/installation/ubuntu_restore_disk_image.png) 3. Select the image you just downloaded. ![Restore disk image: select image](/images/installation/select_haos.png) @@ -140,9 +141,9 @@ To write the HAOS image to the boot medium on your x86-64 hardware, there are 2 ### Method 2: Installing HAOS directly from a boot medium -<div class='note warning'> +{% note %} Use this method only if Method 1 does not work for you. -</div> +{% endnote %} #### Required material @@ -234,7 +235,7 @@ Use this method only if Method 1 does not work for you. - Note: Internet is required because the newly installed Home Assistant OS does not contain all Home Assistant components yet. It downloads the latest version of Home Assistant Core on first start. 2. Power the system on. If you have a screen connected to the {{site.installation.types[page.installation_type].board}} system, after a minute or so the Home Assistant welcome banner will appear in the console. -<div class="note"> +{% note %} If the machine complains about not being able to find a bootable medium, you might need to specify the EFI entry in your BIOS. This can be accomplished either by using a live operating system (e.g. Ubuntu) and running the following command (replace `<drivename>` with the appropriate drive name assigned by Linux, typically this will be `sda` or `nvme0n1` on NVMe SSDs): @@ -253,7 +254,7 @@ Or else, the BIOS might provide you with a tool to add boot options, there you c \EFI\BOOT\bootx64.efi ``` -</div> +{% endnote %} {% else %} @@ -265,9 +266,9 @@ Or else, the BIOS might provide you with a tool to add boot options, there you c 3. In the browser of your desktop system, within a few minutes you will be able to reach your new Home Assistant at <a href="http://homeassistant.local:8123" target="_blank">homeassistant.local:8123</a>. -<div class="note"> +{% note %} If you are running an older Windows version or have a stricter network configuration, you might need to access Home Assistant at <a href="http://homeassistant:8123" target="_blank">homeassistant:8123</a> or `http://X.X.X.X:8123` (replace X.X.X.X with your {{site.installation.types[page.installation_type].board}}’s IP address). -</div> +{% endnote %} {% else %} @@ -317,16 +318,15 @@ Minimum recommended assignments: 3. Under **Hardware**, select the amount of memory and number of CPUs. Then, select **Enable EFI**. - Make sure **EFI** is enabled. If EFI is not enabled, HAOS won't boot. 4. Under **Hard Disk**, select **Use an existing virtual hard disk file**, select the unzipped VDI file from above. - 5. Then go to **Network** > **Adapter 1**. Choose **Bridged Adapter** and choose your network adapter. - <div class="note warning"> - Please keep in mind that the bridged adapter only functions over a hardwired Ethernet connection. - Using Wi-Fi on your VirtualBox host is unsupported. - </div> + 5. Then go to **Network** > **Adapter 1**. Choose **Bridged Adapter** and choose your network adapter. + {% icon "mdi:alert-outline" %} Please keep in mind that the bridged + adapter only functions over a hardwired Ethernet connection. + Using Wi-Fi on your VirtualBox host is unsupported. 6. Then go to <b>Audio</b> and choose <b>Intel HD Audio</b> as audio controller. - <div class="note info"> - By default, VirtualBox does not free up unused disk space. To automatically shrink the vdi disk image - the `discard` option must be enabled using your host machine's terminal: + {% icon "mdi:alert-outline" %} By default, VirtualBox does not + free up unused disk space. To automatically shrink the vdi disk image the `discard` option must + be enabled using your host machine's terminal: ```bash VBoxManage storageattach <VM name> --storagectl "SATA" --port 0 --device 0 --nonrotational on --discard on @@ -334,8 +334,6 @@ Minimum recommended assignments: More details can be found about the command can be found [here](https://www.virtualbox.org/manual/ch08.html#vboxmanage-storageattach). - </div> - {% unless page.installation_type == 'macos' %} - title: Unraid @@ -376,9 +374,9 @@ Minimum recommended assignments: virt-install --name haos --description "Home Assistant OS" --os-variant=generic --ram=4096 --vcpus=2 --disk <PATH TO QCOW2 FILE>,bus=scsi --controller type=scsi,model=virtio-scsi --import --graphics none --boot uefi ``` - <div class="note info"> - If you have a USB dongle to attach, you need to add the option `--hostdev busID.deviceId`. You can discover these IDs via the `lsusb` command. - As example, if `lsusb` output is: + {% icon "mdi:alert-outline" %} If you have a USB + dongle to attach, you need to add the option `--hostdev busID.deviceId`. You can + discover these IDs via the `lsusb` command. As example, if `lsusb` output is: ```bash Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub @@ -399,7 +397,6 @@ Minimum recommended assignments: Note that this configuration (bus 003, device 003) is just an example, your dongle could be on another bus and/or with another device ID. Please check the correct IDs of your USB dongle with `lsusb`. - </div> {% endunless %} @@ -449,9 +446,7 @@ Minimum recommended assignments: {% if page.installation_type == 'windows' %} - title: Hyper-V content: | - <div class='note warning'> - Hyper-V does not have USB support - </div> + ⚠️ Hyper-V does not have USB support 1. Create a new virtual machine. 2. Select **Generation 2**. diff --git a/source/_includes/installation/supervised.md b/source/_includes/installation/supervised.md index c3806b199c7b..39bf52fb2738 100644 --- a/source/_includes/installation/supervised.md +++ b/source/_includes/installation/supervised.md @@ -1,12 +1,12 @@ ## Install Home Assistant Supervised -<div class='note warning'> +{% caution %} This way of running Home Assistant will require the most of you. It also has strict requirements you need to follow. Unless you really need this installation type, you should install Home Assistant OS (this can also be a [virtual machine](#install-home-assistant-operating-system)), or [Home Assistant Container](#install-home-assistant-container). -</div> +{% endcaution %} 1. First make sure you understand the <a href="https://github.com/home-assistant/architecture/blob/master/adr/0014-home-assistant-supervised.md" target="_blank">requirements</a>. 2. This installation method has very strict requirements, for example, it only diff --git a/source/_includes/integrations/building_block_integration.md b/source/_includes/integrations/building_block_integration.md index e7b4df2cd39f..93adb9e61d5e 100644 --- a/source/_includes/integrations/building_block_integration.md +++ b/source/_includes/integrations/building_block_integration.md @@ -1,7 +1,7 @@ {% capture name %}{{ include.name | default: page.title }}{% endcapture %} {% capture domain %}{{ include.domain | default: page.ha_domain }}{% endcapture %} -<div class='note info'> +{% note %} **Building block integration** @@ -11,5 +11,5 @@ A building block integration differs from the typical integration that connects If one of your integrations features this building block, this page documents the functionality the {{ name | downcase }} building block offers. -</div> +{% endnote %} diff --git a/source/_includes/integrations/config_flow.md b/source/_includes/integrations/config_flow.md index 4a9feb458fdf..5e62054f8db2 100644 --- a/source/_includes/integrations/config_flow.md +++ b/source/_includes/integrations/config_flow.md @@ -3,7 +3,7 @@ ## Configuration -To add the **{{ name }}** integration to your Home Assistant instance, use this My button: +To add the **{{ name }}** {% unless page.ha_integration_type == 'hardware' or page.ha_integration_type == 'virtual' %}{{ page.ha_integration_type | default: "integration" }}{% else %}integration{% endunless %} to your Home Assistant instance, use this My button: {% my config_flow_start badge domain=domain %} @@ -12,7 +12,7 @@ To add the **{{ name }}** integration to your Home Assistant instance, use this it will be shown as **Discovered**. You can then set it up right away. {% endif %} -{% details "Manual configuration steps" %} +{% details "Manual configuration steps" icon="mdi:cursor-hand" %} {% if include.discovery or page.ha_dhcp or page.ha_homekit or page.ha_ssdp or page.ha_zeroconf or page.ha_mqtt %} If it wasn't discovered automatically, don't worry! You can set up a manual integration entry: @@ -22,7 +22,7 @@ manually: {% endif %} - Browse to your Home Assistant instance. -- Go to **{% my integrations title="Settings > Devices & Services" %}**. +- Go to **{% my integrations icon title="Settings > Devices & Services" %}**. {% if page.ha_integration_type == 'helper' %} - At the top of the screen, select the tab: **{% my helpers %}**. - In the bottom right corner, select the diff --git a/source/_includes/javascripts/scripts.html b/source/_includes/javascripts/scripts.html index f2b630cf0a19..b3ce054edf14 100644 --- a/source/_includes/javascripts/scripts.html +++ b/source/_includes/javascripts/scripts.html @@ -16,3 +16,21 @@ document.location.assign("https://design.home-assistant.io/#brand/logo") }); </script> + + +{% if page.hero_unit %} +<script type="text/javascript"> + const changeNavColor = () => { + const scrollPosition = document.documentElement.scrollTop; + const nav = document.querySelector("header"); + if (scrollPosition <= 1) { + nav.classList.add("dark"); + } else { + nav.classList.remove("dark"); + } + } + + window.addEventListener("load", () => changeNavColor()); + window.addEventListener("scroll", () => changeNavColor()); +</script> +{% endif %} diff --git a/source/_includes/post/author.html b/source/_includes/post/author.html index 96a10c510ab1..31c737912887 100644 --- a/source/_includes/post/author.html +++ b/source/_includes/post/author.html @@ -5,4 +5,4 @@ {% else %} {% assign author = site.author %} {% endif %} -{% if author %}<span class="byline author vcard"><i class='icon-user'></i> {{ author }}</span>{% endif %} +{% if author %}<span class="byline author vcard">{% icon "mdi:person" %} {{ author }}</span>{% endif %} diff --git a/source/_includes/post/sharing.html b/source/_includes/post/sharing.html index 06ae068d7b46..c2564c6d2f11 100644 --- a/source/_includes/post/sharing.html +++ b/source/_includes/post/sharing.html @@ -1,5 +1,5 @@ <section class="sharing aside-module grid__item one-whole lap-one-half"> - <h1 class="title delta">Share this post</h1> + <h1 class="title epsilon">{% icon "mdi:ios-share" %} Share this post</h1> <ul class="divided"> {% if site.twitter_tweet_button %} <li> diff --git a/source/_includes/related.html b/source/_includes/related.html index 65ffe1513260..7003fe9191c6 100644 --- a/source/_includes/related.html +++ b/source/_includes/related.html @@ -9,7 +9,7 @@ {%- endfor -%} {% if related_topics and related_topics.size != 0 %} <div class="text related-topics"> - <h2><a class="title-link" href="#related-topics" name="related-topics"></a>Related topics</h2> + <h2>Related topics<a class="title-link" href="#related-topics" name="related-topics"></a></h2> <ul> {%- for related in related_topics -%} {% assign computed = related.docs | split: "#" %} @@ -30,7 +30,7 @@ <h2><a class="title-link" href="#related-topics" name="related-topics"></a>Relat {% endif %} {% if related_links and related_links.size != 0 %} <div class="text related-links"> - <h2><a class="title-link" href="#related-links" name="related-links"></a>Related links</h2> + <h2>Related links<a class="title-link" href="#related-links" name="related-links"></a></h2> <ul> {% for link in related_links %} <li><a href="{{ link.url }}" class="link" target="_blank">{{ link.title | default: link.url }}</a></li> diff --git a/source/_includes/site/footer.html b/source/_includes/site/footer.html index d8cac65a506b..b7371bcc62a8 100644 --- a/source/_includes/site/footer.html +++ b/source/_includes/site/footer.html @@ -1,95 +1,138 @@ <div class="grid-wrapper"> <div class="grid"> <div class="grid__item"> - <div class="copyright grid"> - <div class="company grid__item one-third lap-one-half palm-one-whole"> + <div class="skyline grid"> + <div class="skyline grid__item one-whole"> + <div class="footer-skyline"> + </div> + </div> + </div> + <div class="footer-nav grid"> + <div class="company grid__item one-quarter lap-one-half palm-one-whole"> <div class="title"> <img - src="/images/home-assistant-logo-vertical.svg" - height="120" + src="/images/footer-logo-text.svg" + height="72" alt="Home Assistant" /> </div> + <p> + Home Assistant is a project from the <a href="https://www.openhomefoundation.org/">Open Home Foundation</a>, sponsored by <a href="https://www.nabucasa.com/">Nabu Casa</a>. + </p> + </div> + + <div class="grid__item one-quarter lap-one-half palm-one-whole"> + <h4>Join us and contribute!</h4> + <ul> + <li><a class="external-link" href="https://github.com/home-assistant/">GitHub repo {% icon "tabler:external-link" %}</a></li> + <li><a class="external-link" href="https://developers.home-assistant.io">Developers Portal {% icon "tabler:external-link" %}</a></li> + <li><a class="external-link" href="https://design.home-assistant.io">Design Portal {% icon "tabler:external-link" %}</a></li> + <li><a class="external-link" href="https://data.home-assistant.io">Data Science Portal {% icon "tabler:external-link" %}</a></li> + <li><a class="external-link" href="https://community.home-assistant.io">Community Forum {% icon "tabler:external-link" %}</a></li> + <li><a href="/help/reporting_issues/">Reporting issues</a></li> + <li><a href="https://home-assistant-store.creator-spring.com/">Community Merch Store</a></li> + </ul> + <h4>System status</h4> + <ul> + <li> + <a class="external-link" href="https://alerts.home-assistant.io">Integration Alerts {% icon "tabler:external-link" %}</a> + </li> + <li><a href="/security/">Security Alerts</a></li> + <li> + <a class="external-link" href="https://status.home-assistant.io">System Status {% icon "tabler:external-link" %}</a> + </li> + </ul> + </div> + + <div class="grid__item one-quarter lap-one-half palm-one-whole"> + <h4>Companion apps</h4> + <ul> + <li><a class="external-link" href="https://apps.apple.com/us/app/home-assistant/id1099568401">iOS and Apple devices</a></li> + <li><a class="external-link" href="https://play.google.com/store/apps/details?id=io.homeassistant.companion.android">Android and Wear OS</a></li> + <li><a class="external-link" href="https://companion.home-assistant.io/">...and more!</a></li> + </ul> + <h4>Governance</h4> + <ul> + <li><a href="/privacy/">Privacy Notices</a></li> + <li><a href="/developers/cla/">Contributor License Agreement</a></li> + <li><a href="/tos/">Terms of Service</a></li> + <li><a href="/code_of_conduct/">Code of Conduct</a></li> + <li><a href="/developers/credits/">Credits</a></li> + <li><a href="/developers/license/">License</a></li> + </ul> + </div> + + <div class="socials grid__item one-quarter lap-one-half palm-one-whole"> + + <h4>Follow us</h4> + <p><a class="external-link" href='https://building.open-home.io/#/portal'>Sign up for our newsletter {% icon "tabler:external-link" %}</a></p> <div class="icons"> <a rel="me" - href="https://twitter.com/home_assistant" - title="Twitter" + href="https://youtube.com/@home_assistant" + title="YouTube" + target="_blank" + ><iconify-icon icon="simple-icons:youtube"></iconify-icon></a> + <a + rel="me" + href="https://reddit.com/r/homeassistant" + title="Reddit" + target="_blank" + ><iconify-icon icon="simple-icons:reddit"></iconify-icon></a> + <a + rel="me" + href="https://github.com/home-assistant/home-assistant" + title="GitHub" target="_blank" - ><i class="icon-twitter"></i - ></a> + ><iconify-icon icon="simple-icons:github"></iconify-icon></a> <a rel="me" href="https://fosstodon.org/@homeassistant" title="Mastodon" target="_blank" - ><svg - xmlns="http://www.w3.org/2000/svg" - viewBox="0 0 216.4144 232.00976" - alt="Mastodon" - > - <path - d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915" - /> - <path - fill="#fff" - d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675" - /> - </svg> - </a> + ><iconify-icon icon="simple-icons:mastodon"></iconify-icon></a> + <br /> + <a + rel="me" + href="https://x.com/home_assistant" + title="X" + target="_blank" + ><iconify-icon icon="simple-icons:x"></iconify-icon></a> <a rel="me" href="https://www.facebook.com/homeassistantio" title="Facebook" target="_blank" - ><i class="icon-facebook"></i - ></a> + ><iconify-icon icon="simple-icons:facebook"></iconify-icon></a> <a rel="me" - href="https://github.com/home-assistant/home-assistant" - title="GitHub" + href="https://www.instagram.com/homeassistant/" + title="Instagram" target="_blank" - ><i class="icon-github"></i - ></a> + ><iconify-icon icon="simple-icons:instagram"></iconify-icon></a> + <a + rel="me" + href="https://www.linkedin.com/company/home-assistant" + title="LinkedIn" + target="_blank" + ><iconify-icon icon="simple-icons:linkedin"></iconify-icon></a> </div> - </div> - <div class="grid__item one-third lap-one-half palm-one-whole"> - <ul> - <li> - <a href="https://alerts.home-assistant.io" - >Home Assistant Alerts</a - > - </li> - <li> - <a href="https://developers.home-assistant.io">Developers</a> - </li> - <li><a href="https://data.home-assistant.io">Data Science</a></li> - <li> - <a href="https://community.home-assistant.io">Community Forum</a> - </li> - <li> - <a href="mailto:hello@home-assistant.io">Contact</a> (no support!) - </li> - <li><a href="/security/">Security Vulnerabilities</a></li> - <li><a href="/privacy/">Privacy</a></li> - <li> - <a href="https://status.home-assistant.io">System Status</a> - </li> - <li><a href="https://www.openhomefoundation.org/">Home Assistant is part of the Open Home Foundation</a></li> - </ul> - </div> - - <div class="grid__item one-third lap-one-half palm-one-whole"> - Website powered by <a href="https://jekyllrb.com/">Jekyll</a> and the - <a href="https://github.com/coogie/oscailte">Oscailte theme</a>.<br /> - <br /> - <a href="https://www.netlify.com"> - <img - src="/images/frontpage/netlify.svg" - alt="Deploys by Netlify Badge" - /> - </a> + <div class="web-notice"> + <p> + Contact us <a href="mailto:hello@home-assistant.io">here</a> for media and partnership inquiries. (No technical support!) + </p> + <p> + Website powered by <a href="https://jekyllrb.com/">Jekyll</a><br /> + Originally based on the <a href="https://github.com/coogie/oscailte">Oscailte theme</a> + </p> + <a href="https://www.netlify.com"> + <img + src="/images/frontpage/netlify.svg" + alt="Deploys by Netlify Badge" + /> + </a> + </div> </div> </div> </div> diff --git a/source/_includes/site/head.html b/source/_includes/site/head.html index e29ee41bbb63..9294875a6579 100644 --- a/source/_includes/site/head.html +++ b/source/_includes/site/head.html @@ -35,4 +35,9 @@ <link href="{{ site.subscribe_rss }}" rel="alternate" title="{{ site.title }}" type="application/atom+xml"> <link rel='shortcut icon' href='/images/favicon.ico' /> <link rel='icon' type='image/png' href='/images/favicon-192x192.png' sizes='192x192' /> + + <link rel="preconnect" href="https://fonts.googleapis.com"> + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""> + <link href="https://fonts.googleapis.com/css2?family=Figtree:ital,wght@0,300..900;1,300..900&family=Instrument+Sans:ital,wdth,wght@0,99,400..700;1,99,400..700&" rel="stylesheet"> + <script src="https://code.iconify.design/iconify-icon/2.1.0/iconify-icon.min.js"></script> </head> diff --git a/source/_includes/site/header.html b/source/_includes/site/header.html index b318235c053c..3d78a7c494f1 100644 --- a/source/_includes/site/header.html +++ b/source/_includes/site/header.html @@ -1,12 +1,17 @@ +{% assign recent_release_post = site.categories['Core'].first %} +{% assign url_parts = page.url | split: '/' %} +{% assign root = url_parts[1] %} + <div class="grid-wrapper"> <div class="grid"> <div class="grid__item three-tenths lap-two-sixths palm-one-whole ha-title"> <a href="/" class="site-title"> - <img - src="/images/home-assistant-logo.svg" - height="36" - alt="Home Assistant" - /> + <div class="logo"></div> + </a> + <a class="release-date" href="{{ recent_release_post.url }}" title="Latest version {{ site.current_major_version }}.{{ + site.current_minor_version }}.{{ site.current_patch_version }} released {{ site.date_released | date: "%B %e, %Y" }}"> + {{ site.current_major_version }}.{{ + site.current_minor_version }}.{{ site.current_patch_version }} </a> </div> @@ -17,36 +22,25 @@ for="toggle" class="toggle" data-open="Main Menu" - data-close="Close Menu" + data-close="⨉" ></label> <ul class="menu pull-right"> - <li><a href="/getting-started/">Getting started</a></li> + <li><a {% if root == 'getting-started' or root == 'installation' %}class="active"{% endif %} href="/installation/">Getting started</a></li> <li> - <a href="/docs/" - >Documentation <i class="icon icon-caret-down"></i - ></a> + <a {% if root == 'docs' or root == 'dashboards' or root == 'voice_control' or root == 'common-tasks' %}class="active"{% endif %} href="/docs/">Documentation {% icon "mdi:chevron-down" %}</a> <ul> - <li><a href="/installation/">Installation</a></li> - <li> - <a href="/docs/configuration/">Configuration</a> - </li> - <li> - <a href="/docs/automation/">Automation</a> - </li> - <li> - <a href="/docs/scripts/">Scripting</a> - </li> - <li> - <a href="/dashboards/">Dashboards</a> - </li> - <li> - <a href="/voice_control/">Voice assistant</a> - </li> + <li><a href="/installation/">{% icon "simple-icons:homeassistant" %} Installation</a></li> + <li><a href="/docs/automation/">{% icon "mdi:robot-happy" %} Automations</a></li> + <li><a href="/dashboards/">{% icon "mdi:gauge" %} Dashboards</a></li> + <li><a href="/voice_control/">{% icon "mdi:comment-processing-outline" %} Voice assistants</a></li> + <li><a href="/docs/organizing/">{% icon "mdi:view-grid" %} Device organization</a></li> + <li><a href="/docs/energy/">{% icon "mdi:solar-power-variant" %} Energy management</a></li> + <li><a href="/docs/configuration/">{% icon "mdi:cog" %} Advanced configuration</a></li> </ul> </li> - <li><a href="/integrations/">Integrations</a></li> - <li><a href="/blog/">Blog</a></li> - <li><a href="/help/">Need help?</a></li> + <li><a {% if root == 'integrations' %}class="active"{% endif %} href="/integrations/">Integrations</a></li> + <li><a {% if root == 'blog' %}class="active"{% endif %} href="/blog/">Blog</a></li> + <li><a {% if root == 'help' %}class="active"{% endif %} href="/help/">Need help?</a></li> <li> <div class="docsearch" id="docsearch"></div> </li> diff --git a/source/_includes/site/hero_unit.html b/source/_includes/site/hero_unit.html index def95c031d77..02b3eea513ca 100644 --- a/source/_includes/site/hero_unit.html +++ b/source/_includes/site/hero_unit.html @@ -1,14 +1,18 @@ <div class="hero"> <div class="grid-wrapper"> <div class="grid flex"> - <div class="grid__item flex__item two-fifths palm-one-whole"> - <a href='https://demo.home-assistant.io/' target='_blank'> + <div class="grid__item flex__item three-fifths lap-one-whole palm-one-whole"> + {% include custom/welcome.html %} + </div> + <div class="grid__item flex__item two-fifths lap-one-whole palm-one-whole" style="text-align: center;"> + <iframe id="HAdemo" title="Home Assistant Demo" + src="https://demo.home-assistant.io/?frontpage"> + </iframe> + + <a id="HAdemoScreenshot" href='https://demo.home-assistant.io/' target='_blank'> <img src="/images/hero_screenshot.png" alt="Home Assistant screenshot"> </a> </div> - <div class="grid__item flex__item three-fifths palm-one-whole"> - {% include custom/welcome.html %} - </div> </div> </div> </div> diff --git a/source/_includes/site/left_sidebar.html b/source/_includes/site/left_sidebar.html new file mode 100644 index 000000000000..529dcd8d7d95 --- /dev/null +++ b/source/_includes/site/left_sidebar.html @@ -0,0 +1,3 @@ +<div class="grid"> + {% include site/vertical_nav.html side="left" %} +</div> diff --git a/source/_includes/site/sidebar.html b/source/_includes/site/sidebar.html index 410c1daad25c..dc6fe5a73117 100644 --- a/source/_includes/site/sidebar.html +++ b/source/_includes/site/sidebar.html @@ -1,49 +1,11 @@ <div class="grid"> - {% assign url_parts = page.url | split: '/' %} - {% assign root = url_parts[1] %} - {% if root == 'integrations' %} - {% include asides/component_navigation.html %} - {% elsif root == 'installation' %} - {% include asides/installation_navigation.html %} - {% elsif root == 'common-tasks' %} - {% include asides/common_tasks_navigation.html %} - {% elsif root == 'dashboards' %} - {% include asides/dashboards_navigation.html %} - {% elsif root == 'docs' and url_parts[2] == "organizing" %} - {% include asides/organizing_navigation.html %} - {% elsif root == 'developers' or root == 'help' %} - {% include asides/help_navigation.html %} - {% elsif root == 'getting-started' %} - {% include asides/getting_started_navigation.html %} - {% elsif root == 'docs' %} - {% include asides/docs_navigation.html %} - {% elsif root == 'projects' %} - {% include asides/docs_navigation.html %} - {% elsif root == 'faq' %} - {% include asides/faq_navigation.html %} - {% elsif root == 'voice_control' %} - {% include asides/voice_navigation.html %} - {% elsif root == 'hassio' or root == 'addons' %} - {% include asides/hassio_navigation.html %} - {% elsif root == 'cloud' %} - {% include asides/cloud_navigation.html %} - {% elsif root == 'conference' %} - {% include asides/conference_navigation.html %} - {% else %} - {% include asides/about.html %} + {% include site/vertical_nav.html %} - {% if page.blog_index %} - {% include asides/categories.html %} - {% else %} - {% include post/sharing.html %} - {% include asides/recent_posts.html %} - {% endif %} - {% endif %} {% if page.toc %} {%- unless page.no_toc -%} - <section class="aside-module grid__item one-whole lap-one-half"> + <section id="toc-module" class="aside-module grid__item one-whole lap-one-half"> <div class='section'> - <h1 class="title delta">On this page</h1> + <h1 class="title epsilon">{% icon "mdi:toc" %} On this page</h1> {{ content | toc_only }} </div> </section> @@ -51,9 +13,9 @@ <h1 class="title delta">On this page</h1> {% endif %} {%- if page.ha_category.first -%} - <section class="aside-module grid__item one-whole lap-one-half"> + <section id="category-module" class="aside-module grid__item one-whole lap-one-half"> <div class='section'> - <h1 class="title delta">Categories</h1> + <h1 class="title epsilon">{% icon "mdi:category" %} Categories</h1> <ul class='divided'> {%- for category in page.ha_category -%} <li> @@ -65,17 +27,3 @@ <h1 class="title delta">Categories</h1> </section> {%- endif -%} </div> -<script type="text/javascript"> - // Some sidebars are longer than the screen so they can't be locked. - document.addEventListener('DOMContentLoaded', function() { - const sidebar = document.querySelector("#sidebar").querySelector(".grid"); - const footer = document.querySelector("footer").querySelector(".grid") - if (sidebar) { - const content = document.querySelector(".page-content").querySelector(".grid-wrapper"); - const windowHeight = window.innerHeight - 82; - if (sidebar.clientHeight > content.clientHeight || sidebar.clientHeight > windowHeight - footer.clientHeight) { - sidebar.style.display = "contents" - } - } - }); -</script> diff --git a/source/_includes/site/vertical_nav.html b/source/_includes/site/vertical_nav.html new file mode 100644 index 000000000000..a96068b92dd6 --- /dev/null +++ b/source/_includes/site/vertical_nav.html @@ -0,0 +1,49 @@ +{% assign url_parts = page.url | split: '/' %} +{% assign root = url_parts[1] %} +{% assign doc = url_parts[2] %} + +{% if root == 'integrations' %} + {% include asides/component_navigation.html %} + +{% elsif root == 'getting-started' %} + {% include asides/getting_started_navigation.html %} +{% elsif root == 'installation' %} + {% include asides/getting_started_navigation.html %} + +{% elsif root == 'common-tasks' %} + {% include asides/docs_navigation.html %} +{% elsif root == 'dashboards' %} + {% include asides/docs_navigation.html %} +{% elsif root == 'voice_control' %} + {% include asides/docs_navigation.html %} +{% elsif root == 'docs' %} + {% include asides/docs_navigation.html %} +{% elsif root == 'projects' %} + {% include asides/docs_navigation.html %} + +{% elsif root == 'developers' or root == 'help' %} + {% include asides/help_navigation.html %} +{% elsif root == 'faq' %} + {% include asides/faq_navigation.html %} +{% elsif root == 'hassio' or root == 'addons' %} + {% include asides/hassio_navigation.html %} +{% elsif root == 'cloud' %} + {% include asides/cloud_navigation.html %} +{% elsif root == 'conference' %} + {% include asides/conference_navigation.html %} + +{% else %} + {% if page.blog_index %} + {% include asides/recent_categories.html %} + {% include asides/recent_posts.html posts='5' %} + {% else %} + {% if doc == 'categories' %} + {% include asides/categories.html %} + {% elsif root == 'blog' %} + {% include asides/recent_posts.html posts='10' %} + {% include post/sharing.html %} + {% else %} + {% include post/sharing.html %} + {% endif %} + {% endif %} +{% endif %} diff --git a/source/_integrations/abode.markdown b/source/_integrations/abode.markdown index c33bb3a3becb..4f9b2c7b053c 100644 --- a/source/_integrations/abode.markdown +++ b/source/_integrations/abode.markdown @@ -38,7 +38,7 @@ There is currently support for the following {% term device %} types within Home - **Alarm control panel**: Reports on the current alarm status and can be used to arm and disarm the system. - **Binary sensor**: Reports on `Quick Actions`, `Door Contacts`, `Connectivity` {% term sensors %} (remotes, keypads, and status indicators), `Moisture` sensors, and `Motion` or `Occupancy` sensors. -- **Camera**: Reports on `Camera` devices and will download and show the latest captured still image. Can be turned off and on using the [`camera.turn_off`](/integrations/camera/#service-turn_off) and [`camera.turn_on`](/integrations/camera/#service-turn_on) {% term services %}. +- **Camera**: Reports on `Camera` devices and will download and show the latest captured still image. Can be turned off and on using the [`camera.turn_off`](/integrations/camera/#action-turn_off) and [`camera.turn_on`](/integrations/camera/#action-turn_on) {% term actions %}. - **Cover**: Reports on `Secure Barriers` and can be used to open and close the cover. - **Lock**: Reports on `Door Locks` and can be used to lock and unlock the door. - **Light**: Reports on `Dimmer` lights and can be used to dim or turn the light on and off. @@ -86,33 +86,33 @@ There is a unique list of known event_codes are defined in and the inferred groups and their ranges of event codes are defined in [timeline.py](https://github.com/jaraco/jaraco.abode/blob/main/jaraco/abode/helpers/timeline.py). -## Services +## Actions -Available {% term services %}: `change_setting`, `capture_image`, `trigger_automation` +Available {% term actions %}: `change_setting`, `capture_image`, `trigger_automation` -### Service `change_setting` +### Action `change_setting` Change settings on your Abode system. For a full list of settings and valid values, consult the [`jaraco.abode` settings section](https://github.com/jaraco/jaraco.abode/blob/main/README.rst#settings). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `setting` | No | The setting you wish to change. | | `value` | No | The value you wish to change the setting to. | -### Service `capture_image` +### Action `capture_image` Request a new still image from your Abode camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | No | String or list of strings that point at `entity_id`s of Abode cameras. | -### Service `trigger_automation` +### Action `trigger_automation` Trigger an automation on your Abode system. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | No | String or list of strings that point at `entity_id`s of switches that represent your Abode automations. | diff --git a/source/_integrations/accuweather.markdown b/source/_integrations/accuweather.markdown index 84bc2fcfb128..130a7a0937ac 100644 --- a/source/_integrations/accuweather.markdown +++ b/source/_integrations/accuweather.markdown @@ -42,9 +42,7 @@ You can test your newly created API key [here](https://developer.accuweather.com {% include integrations/config_flow.md %} -<div class="note warning"> - +{% important %} Due to limitations of the terms of use of AccuWeather free API key, it is possible to configure only one integration instance. The Limited Trial account only allows 50 API calls per day. - -</div> +{% endimportant %} diff --git a/source/_integrations/actiontec.markdown b/source/_integrations/actiontec.markdown index d3f51fdbb420..a61d58fab6bd 100644 --- a/source/_integrations/actiontec.markdown +++ b/source/_integrations/actiontec.markdown @@ -20,9 +20,9 @@ Supported devices (tested): - MI424WR (Verizon FIOS) -<div class='note warning'> +{% important %} This device tracker needs telnet to be enabled on the router. -</div> +{% endimportant %} To use this device tracker in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/adguard.markdown b/source/_integrations/adguard.markdown index 6919048433fa..dbb2537c60bb 100644 --- a/source/_integrations/adguard.markdown +++ b/source/_integrations/adguard.markdown @@ -53,58 +53,58 @@ write an automation to turn off Safe Search after the kids' bedtime. 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. -<div class="note"> +{% important %} Turning off Query Log will result in all sensors not receiving updates anymore. AdGuard relies on Query Log to provide stats. -</div> +{% endimportant %} -## Services +## Actions -These {% term services %} allow one to manage filter subscriptions in AdGuard Home. -Using these services in automations could be helpful to block certain +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. For example, you could create a custom filter list that blocks social media sites during the day and releases them during the evening. -### Service `add_url` +### Action `add_url` Add a new filter subscription to AdGuard Home. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------ | | `name` | No | The name of the filter subscription. | | `url` | No | The filter URL to subscribe to, containing the filter rules. | -### Service `remove_url` +### Action `remove_url` Removes a filter subscription from AdGuard Home. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------- | | `url` | No | The filter subscription URL to remove. | -### Service `enable_url` +### Action `enable_url` Enables a filter subscription in AdGuard Home. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------- | | `url` | No | The filter subscription URL to enable. | -### Service `disable_url` +### Action `disable_url` Disables a filter subscription in AdGuard Home. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------- | | `url` | No | The filter subscription URL to disable. | -### Service `refresh` +### Action `refresh` Refresh all filter subscriptions in AdGuard Home. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------- | | `force` | Yes | Force update (bypasses AdGuard Home throttling). | diff --git a/source/_integrations/ads.markdown b/source/_integrations/ads.markdown index 772d7e614407..99cdeaf23e75 100644 --- a/source/_integrations/ads.markdown +++ b/source/_integrations/ads.markdown @@ -60,9 +60,9 @@ ip_address: type: string {% endconfiguration %} -## Service +## Action -The ADS integration will register the service `write_by_name` allowing you to write a value to a variable on your ADS device. +The ADS integration will register the `write_by_name` action allowing you to write a value to a variable on your ADS device. ```json { @@ -72,7 +72,7 @@ The ADS integration will register the service `write_by_name` allowing you to wr } ``` -Service parameters: +Action parameters: - **adsvar**: Name of the variable on the ADS device. To access global variables on *TwinCAT2* use a prepending dot `.myvariable`, for TwinCAT3 use `GBL.myvariable`. - **adstype**: Specify the type of the variable. Use one of the following: `int`, `byte`, `uint`, `bool` diff --git a/source/_integrations/advantage_air.markdown b/source/_integrations/advantage_air.markdown index 32c056c2bb2c..33079df8502e 100644 --- a/source/_integrations/advantage_air.markdown +++ b/source/_integrations/advantage_air.markdown @@ -59,7 +59,7 @@ With MyPlace, any blinds and/or garage doors will be created as cover entities. The integration will create sensor entities for a variety of aspects: - The air filter sensor shows if it needs to be replaced. -- Two sensor entities will be created for the 'time to on' and 'time to off' features. Use the `advantage_air.set_time_to` service to change these. +- Two sensor entities will be created for the 'time to on' and 'time to off' features. Use the `advantage_air.set_time_to` action to change these. - Each zone that is temperature-controlled will have a sensor to show the temperature (disabled by default), and how open the damper is. - Each zone with a wireless temperature or motion sensor will have a sensor that reports its wireless RSSI. @@ -85,13 +85,13 @@ The update platform shows if the controller app requires an update. With MyLights or MyPlace, light entities will be created for each light. -## Services +## Actions -### Service `advantage_air.set_time_to` +### Action `advantage_air.set_time_to` Set the On/Off Timer using the relevant sensor entity. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | `sensor.[name]_time_to_on` or `sensor.[name]_time_to_off` | `minutes` | no | Number of minutes between `0` and `720`. diff --git a/source/_integrations/aftership.markdown b/source/_integrations/aftership.markdown index ad71021b6b99..da78091aabbe 100644 --- a/source/_integrations/aftership.markdown +++ b/source/_integrations/aftership.markdown @@ -20,31 +20,31 @@ The sensor value shows the number of packages that are not in `Delivered` state. To use this sensor, you need an [AfterShip Account](https://accounts.aftership.com/register) and set up an API Key. To set up an API Key go to [AfterShip API](https://admin.aftership.com/settings/api-keys) page, and copy existing key or generate a new one. -<div class='note info'> +{% important %} AfterShip removed the Tracking API functionality from the Forever Free plan, and also no longer offers it in the Essentials plan. Using this integration now requires at least the [Pro](https://www.aftership.com/pricing/tracking) plan. -</div> +{% endimportant %} {% include integrations/config_flow.md %} -## Service `add_tracking` +## Action `add_tracking` - You can use the service `aftership.add_tracking` to add trackings to AfterShip. + You can use the `aftership.add_tracking` action to add trackings to AfterShip. -| Service data attribute | Required | Type | Description | +| Data attribute | Required | Type | Description | | ---------------------- | -------- | -------- | ----------- | | `tracking_number` | `True` | string | Tracking number | `slug` | `False` | string | Carrier e.g., `fedex` | `title` | `False` | string | Friendly name of package -## Service `remove_tracking` +## Action `remove_tracking` - You can use the service `aftership.remove_tracking` to remove trackings from AfterShip. + You can use the `aftership.remove_tracking` action to remove trackings from AfterShip. -| Service data attribute | Required | Type | Description | +| Data attribute | Required | Type | Description | | ---------------------- | -------- | -------- | ----------- | | `tracking_number` | `True` | string | Tracking number | `slug` | `True` | string | Carrier e.g., `fedex` -<div class='note info'> +{% note %} This integration retrieves data from AfterShip public REST API, but the integration is not affiliated with AfterShip. -</div> +{% endnote %} diff --git a/source/_integrations/agent_dvr.markdown b/source/_integrations/agent_dvr.markdown index 0604a98c4d26..4306cc0eccfb 100644 --- a/source/_integrations/agent_dvr.markdown +++ b/source/_integrations/agent_dvr.markdown @@ -22,44 +22,44 @@ You can add Agent DVR via integrations using the IP address and port of the serv {% include integrations/config_flow.md %} -<div class='note'> - Please ensure you are using Agent DVR v2.6.1.0 + -</div> +{% important %} +Please ensure you are using Agent DVR v2.6.1.0 + +{% endimportant %} ## Alarm control panel Reports on the current alarm status and can be used to arm and disarm the system. -## Services +## Actions -Once loaded, the `agent_dvr` integration will expose services that can be called to perform various actions. The `entity_id` service attribute can specify one or more specific cameras. +Once loaded, the `agent_dvr` integration will expose actions that can be used. The `entity_id` action attribute can specify one or more specific cameras. -Available services: +Available actions: `enable_alerts`, `disable_alerts`, `start_recording`, `stop_recording`, `turn_on`, `turn_off`, `toggle`, `enable_motion_detection`,`disable_motion_detection` -### Service `enable_alerts`/`disable_alerts` +### Action `enable_alerts`/`disable_alerts` -These services enable or disable the device's alert events within Agent DVR. +These actions enable or disable the device's alert events within Agent DVR. -Service data attribute | Optional | Description +Data attribute | Optional | Description -|-|- `entity_id` | no | Name(s) of entities, e.g., `camera.living_room_camera`. -### Service `start_recording`/`stop_recording` +### Action `start_recording`/`stop_recording` -These services start or stop the device recording. +These actions start or stop the device recording. -Service data attribute | Optional | Description +Data attribute | Optional | Description -|-|- `entity_id` | no | Name(s) of entities, e.g., `camera.living_room_camera`. -### Service `turn_on`/`turn_off`/`toggle` +### Action `turn_on`/`turn_off`/`toggle` -These services turn on, off or toggle the device enabled state within Agent DVR +These actions turn on, off or toggle the device enabled state within Agent DVR -Service data attribute | Optional | Description +Data attribute | Optional | Description -|-|- `entity_id` | no | Name(s) of entities, e.g., `camera.living_room_camera`. diff --git a/source/_integrations/airgradient.markdown b/source/_integrations/airgradient.markdown index ba8a2a122508..e843a783f00d 100644 --- a/source/_integrations/airgradient.markdown +++ b/source/_integrations/airgradient.markdown @@ -12,24 +12,20 @@ ha_codeowners: - '@joostlek' ha_domain: airgradient ha_platforms: + - button + - number + - select - sensor + - switch ha_integration_type: device ha_zeroconf: true --- The AirGradient integration will fetch data from your [AirGradient devices](https://www.airgradient.com/). -<div class='note'> - -In order for the device to be set up or discovered by Home Assistant, the firmware version should be at least 3.1.1. - -</div> - -<div class='note'> - +{% important %} In order for the device to be set up or discovered by Home Assistant, the firmware version should be at least 3.1.1. - -</div> +{% endimportant %} {% include integrations/config_flow.md %} @@ -53,7 +49,12 @@ The integration will fetch data from each device. The following sensors are supp ## Available configuration entities The integration provides a few configuration entities to customize the device experience. -The settings are only applied to the device when the configuration source is set to local. +The settings are only available when the configuration source is set to local. The following entities are supported: - Display temperature unit +- Display brightness +- LED bar brightness +- Requesting CO2 calibration +- Requesting LED bar test +- Toggling sharing metrics with AirGradient diff --git a/source/_integrations/airly.markdown b/source/_integrations/airly.markdown index 016e66c0b5fe..ec0aad26d7b9 100644 --- a/source/_integrations/airly.markdown +++ b/source/_integrations/airly.markdown @@ -24,8 +24,10 @@ To generate an Airly API key, go to [Airly for developers](https://developer.air {% include integrations/config_flow.md %} -<div class="note warning"> - -Airly allows 100 data updates per day. For this reason, the more Airly instances configured, the less frequent updates will be. For one configured Airly instance, data will be updated every 15 minutes, for two configured instances, data will be updated every 30 minutes, for three configured instances, data will be updated every 45 minutes, etc. - -</div> +{% note %} +Airly allows 100 data updates per day. For this reason, the more Airly instances +configured, the less frequent updates will be. For one configured Airly instance, +data will be updated every 15 minutes, for two configured instances, data will +be updated every 30 minutes, for three configured instances, data will be +updated every 45 minutes, etc. +{% endnote %} diff --git a/source/_integrations/airnow.markdown b/source/_integrations/airnow.markdown index 26eacd1770ab..2fc5f32d27dd 100644 --- a/source/_integrations/airnow.markdown +++ b/source/_integrations/airnow.markdown @@ -34,8 +34,6 @@ First, navigate to the [AirNow Current Observations By Lat/Lon](https://docs.air If the query returns a result other than `[]`, open a bug report and include the query result (you may sanitize the data to remove your latitude and longitude, but please do not remove any fields). This information will help a lot to figure out the source of the issue. -<div class="note"> - +{% note %} The AirNow API allows 500 data updates per hour, but since observations are only updated hourly, the default update rate is set to 2 per hour and should not trigger rate limiting. If you use this API key for other purposes, ensure the total request rate does not exceed 500 per hour. - -</div> +{% endnote %} diff --git a/source/_integrations/airvisual.markdown b/source/_integrations/airvisual.markdown index 66ee7f1d9154..1efd9e8281e9 100644 --- a/source/_integrations/airvisual.markdown +++ b/source/_integrations/airvisual.markdown @@ -23,7 +23,7 @@ AirVisual API keys can be obtained [here](https://www.iqair.com/dashboard/api). The Community API key is valid for 12 months after which it will expire. You must then go back to the AirVisual website, delete your old key, create a new one following the same steps and update your configuration with the new key. -<div class='note warning'> +{% note %} The "Community" API key is limited to 10,000 calls per month. In order to accommodate using the same API key for multiple geographies, the `airvisual` integration will automatically "re-level" the time between API calls so as to not overrun the call limit. @@ -33,7 +33,7 @@ For example: - Two instances of the integration: API calls every 10 minutes - etc. -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/airzone_cloud.markdown b/source/_integrations/airzone_cloud.markdown index 7cea8a724fe1..382fe8c5379e 100644 --- a/source/_integrations/airzone_cloud.markdown +++ b/source/_integrations/airzone_cloud.markdown @@ -37,7 +37,7 @@ These devices are Wi-Fi controllers that are normally connected to a single air These devices are connected to ducted air conditioners, motorized grilles, and individual thermostats for every room (zone). Therefore, with a single ducted air conditioning system, the user can turn on and off the air conditioner and set different desired temperatures in each room. -A typical Airzone HVAC system consists of a parent device (called *master zone* in Airzone terminology) and child devices (called *slave zones* in Airzone terminology). The [HVAC mode](https://www.home-assistant.io/integrations/climate/#service-climateset_hvac_mode) can only be changed on the parent device. On child devices, you can only enable or disable the HVAC and adjust the desired temperature for that specific device. +A typical Airzone HVAC system consists of a parent device (called *master zone* in Airzone terminology) and child devices (called *slave zones* in Airzone terminology). The [HVAC mode](https://www.home-assistant.io/integrations/climate/#action-climateset_hvac_mode) can only be changed on the parent device. On child devices, you can only enable or disable the HVAC and adjust the desired temperature for that specific device. Note that multiple HVAC systems can be connected to the same Airzone web server. In this case, there will be one *parent zone* per HVAC system and there may also be *child zones* for each HVAC system. diff --git a/source/_integrations/aladdin_connect.markdown b/source/_integrations/aladdin_connect.markdown deleted file mode 100644 index e557c2f6380d..000000000000 --- a/source/_integrations/aladdin_connect.markdown +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Aladdin Connect -description: Instructions how to integrate Genie Aladdin Connect garage door covers into Home Assistant. -ha_category: - - Cover -ha_release: 0.75 -ha_iot_class: Cloud Polling -ha_domain: aladdin_connect -ha_platforms: - - cover - - diagnostics - - sensor -ha_integration_type: integration -ha_codeowners: - - '@mkmer' -ha_config_flow: true -ha_quality_scale: platinum ---- - -The Aladdin Connect integration lets you control Genie Aladdin Connect garage doors through Home Assistant. - -<div class='note'> -Only doors that are owned by your Aladdin Connect account will be available. Doors that your account has been granted shared access to are not yet supported. -</div> - -{% include integrations/config_flow.md %} diff --git a/source/_integrations/alarm_control_panel.ifttt.markdown b/source/_integrations/alarm_control_panel.ifttt.markdown index 609a4358de42..6172286f5ce1 100644 --- a/source/_integrations/alarm_control_panel.ifttt.markdown +++ b/source/_integrations/alarm_control_panel.ifttt.markdown @@ -14,9 +14,9 @@ The `ifttt` {% term integration %} allows you to integrate security systems that This {% term integration %} depends on the [IFTTT](/integrations/ifttt/) Home Assistant integration. See the integrations documentation to set it up. -<div class='note'> +{% note %} It is important to note that this platform fully relies on IFTTT to receive updates when the security system's state changes. Therefore, this platform shows an assumed state. -</div> +{% endnote %} ## Configuration @@ -79,17 +79,17 @@ optimistic: default: false {% endconfiguration %} -<div class='note warning'> +{% warning %} -It is strongly discouraged to use this platform when you don't use encryption; otherwise, your API password will be send unprotected through the IFTTT Webhooks. It is advised to [setup encryption using Let's Encrypt](https://home-assistant.io/blog/2017/09/27/effortless-encryption-with-lets-encrypt-and-duckdns/). +It is strongly discouraged to use this platform when you don't use encryption; otherwise, your API password will be send unprotected through the IFTTT Webhooks. It is advised to [setup encryption using Let's Encrypt](/blog/2017/09/27/effortless-encryption-with-lets-encrypt-and-duckdns/). -</div> +{% endwarning %} ### Required IFTTT applets Next, you will need to set up the required IFTTT applets as listed below. -This platform supports the services `alarm_disarm`, `alarm_arm_away`, `alarm_arm_home` and `alarm_arm_night`. For each of these services, an IFTTT webhook will be triggered. +This platform supports the `alarm_disarm`, `alarm_arm_away`, `alarm_arm_home` and `alarm_arm_night` actions. For each of these actions, an IFTTT webhook will be triggered. For this system to operate correctly, the following IFTTT applets have to be setup. Obviously, if your alarm device does not support some states, no applets have to be provided for those. diff --git a/source/_integrations/alarm_control_panel.markdown b/source/_integrations/alarm_control_panel.markdown index 93c83687121f..ac002248f011 100644 --- a/source/_integrations/alarm_control_panel.markdown +++ b/source/_integrations/alarm_control_panel.markdown @@ -17,11 +17,11 @@ Please see [manual alarm](/integrations/manual) or [template alarm](/integration {% include integrations/building_block_integration.md %} -### Services +### Actions -Depending on features supported by a specific integration alarm may expose the following services: +Depending on features supported by a specific integration alarm may expose the following actions: -| Service | Data | Description | +| Action | Data | Description | | ------- | ---- | ----------- | | `alarm_arm_home` | `entity_id` <br> `code` (optional) | Arm the alarm in the home mode. | `alarm_arm_away` | `entity_id` <br> `code` (optional) | Arm the alarm in the away mode. diff --git a/source/_integrations/alarm_control_panel.mqtt.markdown b/source/_integrations/alarm_control_panel.mqtt.markdown index eaea1448d9c2..78847e993aaa 100644 --- a/source/_integrations/alarm_control_panel.mqtt.markdown +++ b/source/_integrations/alarm_control_panel.mqtt.markdown @@ -341,8 +341,7 @@ mqtt: {% endraw %} -<div class='note warning'> - +{% caution %} When your MQTT connection is not secured, this will send your secret code over the network unprotected! - -</div> +{% endcaution %} + \ No newline at end of file diff --git a/source/_integrations/alarm_control_panel.template.markdown b/source/_integrations/alarm_control_panel.template.markdown index c438d6204e6f..3f251c1bbf34 100644 --- a/source/_integrations/alarm_control_panel.template.markdown +++ b/source/_integrations/alarm_control_panel.template.markdown @@ -3,10 +3,16 @@ title: "Template Alarm control panel" description: "Instructions on how to integrate template alarm control panels into Home Assistant." ha_category: - Alarm + - Helper ha_release: 0.105 ha_iot_class: "Local Push" -ha_qa_scale: internal +ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' ha_domain: template +ha_platforms: + - alarm_control_panel +ha_integration_type: helper related: - docs: /docs/configuration/ title: Configuration file diff --git a/source/_integrations/alarmdecoder.markdown b/source/_integrations/alarmdecoder.markdown index 2faa1d6d50a1..e5eb3f903962 100644 --- a/source/_integrations/alarmdecoder.markdown +++ b/source/_integrations/alarmdecoder.markdown @@ -87,7 +87,7 @@ The settings for {% term zone %} are described below: There are several attributes available on the alarm panel to give you more information about your alarm. - `ac_power`: Set to `true` if your system has AC power supplying it. -- `alarm_event_occurred`: Set to `true` if your system was recently triggered. When `alarm_event_occurred` is `true`, it must be cleared by entering your code + 1 (or calling the `alarm_control_panel.alarm_disarm` service) before attempting to arm your alarm. +- `alarm_event_occurred`: Set to `true` if your system was recently triggered. When `alarm_event_occurred` is `true`, it must be cleared by entering your code + 1 (or calling the `alarm_control_panel.alarm_disarm` action) before attempting to arm your alarm. - `backlight_on`: Set to `true` if your keypad's backlight is on. - `battery_low`: Set to `true` if your system's back-up battery is low. - `check_zone`: Set to `true` if your system detects a problem with a zone. @@ -98,9 +98,9 @@ There are several attributes available on the alarm panel to give you more infor - `zone_bypassed`: Set to `true` if your system is currently bypassing a zone. - `code_arm_required`: Set to the value specified in your AlarmDecoder options. -## Services +## Actions -The **Alarm Decoder** {% term integration %} gives you access to several {% term services %} for you to control your alarm with. +The **Alarm Decoder** {% term integration %} gives you access to several {% term actions %} for you to control your alarm with. - `alarm_arm_away`: Arms the alarm in away mode; all faults will trigger the alarm. - `alarm_arm_home`: Arms the alarm in stay mode; faults to the doors or windows will trigger the alarm. @@ -109,15 +109,13 @@ The **Alarm Decoder** {% term integration %} gives you access to several {% term - `alarmdecoder.alarm_keypress`: Sends a string of characters to the alarm, as if you had touched those keys on a keypad. - `alarmdecoder.alarm_toggle_chime`: Toggles the alarm's chime state. -<div class='note'> - -`alarm_arm_custom_bypass` and `alarm_trigger`, while available in the services list in Home Assistant, are not currently implemented in the Alarm Decoder platform. - -</div> +{% note %} +`alarm_arm_custom_bypass` and `alarm_trigger`, while available in the actions list in Home Assistant, are not currently implemented in the Alarm Decoder platform. +{% endnote %} ### Examples -Using a combination of the available {% term services %} and attributes, you can create switch templates. +Using a combination of the available {% term actions %} and attributes, you can create switch templates. ### Chime status and control @@ -196,11 +194,11 @@ The tables below show the key press sequences used for arming for the different #### code_arm_required = false -<div class='note'> +{% note %} The `chr(4)` and `chr(5)` sequences below are equivalent to pressing the <em>Stay</em> and <em>Away</em> keypad keys respectively (as outlined in the <a href='https://www.alarmdecoder.com/wiki/index.php/Protocol#Special_Keys'>AlarmDecoder documentation</a>). -</div> +{% endnote %} | Mode | Key Sequence | | ------------------------------------------------------- | ------------------------------ | diff --git a/source/_integrations/alexa.intent.markdown b/source/_integrations/alexa.intent.markdown index 549be1331e61..3a6cd09ec7ca 100644 --- a/source/_integrations/alexa.intent.markdown +++ b/source/_integrations/alexa.intent.markdown @@ -12,7 +12,7 @@ related: ## I want to build custom commands to use with Echo -The built-in Alexa integration allows you to integrate Home Assistant into Alexa/Amazon Echo. This integration will allow you to query information and call services within Home Assistant by using your voice. Home Assistant offers no built-in sentences but offers a framework for you to define your own. +The built-in Alexa integration allows you to integrate Home Assistant into Alexa/Amazon Echo. This integration will allow you to query information and perform actions within Home Assistant by using your voice. Home Assistant offers no built-in sentences but offers a framework for you to define your own. <lite-youtube videoid="1Ke3mtWd_cQ" videotitle="Home Assistant integration for Amazon Echo" posterquality="maxresdefault"></lite-youtube> diff --git a/source/_integrations/alexa.smart_home.markdown b/source/_integrations/alexa.smart_home.markdown index ee92110be1d6..ef4282d93667 100644 --- a/source/_integrations/alexa.smart_home.markdown +++ b/source/_integrations/alexa.smart_home.markdown @@ -21,14 +21,14 @@ It takes considerable effort to configure. Your Home Assistant instance must be The [Emulated Hue integration][emulated-hue-integration] provides a simpler alternative to use utterances such as _"Alexa, turn on the kitchen light"_. However, it has some limitations since everything looks like a light bulb. -<div class='note'> +{% note %} With [Home Assistant Cloud](/cloud/), you can connect your Home Assistant instance in a few simple clicks to Amazon Alexa. With Home Assistant Cloud you don't have to deal with dynamic DNS, SSL certificates or opening ports on your router. Just log in via the user interface and a secure connection with the cloud will be established. Home Assistant Cloud requires a paid subscription after a 30-day free trial. <br/> <br/> For Home Assistant Cloud Users, documentation can be found [here](https://www.nabucasa.com/config/amazon_alexa/). -</div> +{% endnote %} Steps to Integrate an Amazon Alexa Smart Home Skill with Home Assistant: @@ -86,6 +86,7 @@ Steps to Integrate an Amazon Alexa Smart Home Skill with Home Assistant: - [Equalizer Mode](#equalizer-mode) - [Inputs](#inputs) - [Playback State](#playback-state) + - [Remote](#remote) - [Scene](#scene) - [Script](#script) - [Sensor](#sensor) @@ -244,9 +245,10 @@ Alexa needs to link your Amazon account to your Home Assistant account. Therefor Read [more from the Alexa developer documentation](https://developer.amazon.com/en-US/docs/alexa/account-linking/requirements-account-linking.html) about requirements for account linking. -<div class="note"> - Note: you must use a valid/trusted SSL certificate for account linking to work. Self signed certificates will not work, but you can use a free Let's Encrypt certificate. -</div> +{% important %} +You must use a valid/trusted SSL certificate for account linking to work. +Self signed certificates will not work, but you can use a free Let's Encrypt certificate. +{% endimportant %} - `Client ID`: - `https://pitangui.amazon.com/` if you are in US @@ -452,9 +454,9 @@ light.kitchen_light: display_categories: LIGHT,SWITCH ``` -<div class='note info'> +{% note %} Devices such as cameras, garage doors, and alarm control panels require specific display categories to provide all available features from Amazon Alexa. Overriding the default display category will limit features provided by Amazon Alexa. -</div> +{% endnote %} See [Alexa Display Categories][alexa-display-categories] for a complete list @@ -479,12 +481,10 @@ The alarm control panel state must be in the `disarmed` state before arming. Ale The alarm control panel state `armed_custom_bypass` isn't supported by Alexa and is treated as `armed_home`. -<div class="note"> - +{% note %} Alexa does not support arming with voice PIN at this time. Therefore if the alarm control panel requires a `code` for arming or the `code_arm_required` attribute is `true`, the entity will not be exposed during discovery. The alarm control panel may default the `code_arm_required` attribute to `true` even if the platform does not support or require it. Use the [entity customization tool](/docs/configuration/customizing-devices/#customization-using-the-ui) to override `code_arm_required` to `false` and expose the alarm control panel during discovery. - -</div> +{% endnote %} #### Disarming @@ -497,7 +497,7 @@ Users must opt-in to the disarm by voice feature in the Alexa App. Alexa will re To use the existing code configured for the alarm control panel the `code` must be 4 digits and the `code_format` attribute must be `number`. After discovery, the Alexa app will offer the ability to use the existing `code`, or create an additional 4 digit PIN to use with Alexa. -The existing code is never communicated to Alexa from Home Assistant. During disarming, Alexa will ask for a PIN. The PIN spoken to Alexa is relayed to Home Assistant and passed to the `alarm_control_panel.alarm_disarm` service. If the `alarm_control_panel.alarm_disarm` service fails for any reason, it is assumed the PIN was incorrect and reported to Alexa as an invalid PIN. +The existing code is never communicated to Alexa from Home Assistant. During disarming, Alexa will ask for a PIN. The PIN spoken to Alexa is relayed to Home Assistant and passed to the `alarm_control_panel.alarm_disarm` action. If the `alarm_control_panel.alarm_disarm` action fails for any reason, it is assumed the PIN was incorrect and reported to Alexa as an invalid PIN. ### Alert, Automation, Group @@ -594,11 +594,9 @@ alexa: Alexa will announce on all echo devices _"Person detected at [entity name]"_. -<div class="note"> - +{% important %} Each Echo device will need the communication and Announcements setting enabled, and the Do Not Disturb feature turned off. - -</div> +{% endimportant %} <p class='img'> <a href='/images/integrations/alexa/alexa_app_person_detection.png' target='_blank'> @@ -727,9 +725,9 @@ Requires [Proactive Events](#proactive-events) enabled. Home Assistant `event` entities can trigger a doorbell announcement in Alexa if the `device_class` of the `event` entity is set to `doorbell`. Alexa will announce on all echo devices _"Someone is at the [entity name]"_ when an `event` entity has received an updated. -<div class='note info'> +{% note %} Each Amazon Echo device will need the communication and announcements setting enabled and the Do Not Disturb feature turned off. -</div> +{% endnote %} <p class='img'> <a href='/images/integrations/alexa/alexa_app_doorbell_announcement.png' target='_blank'> @@ -810,11 +808,9 @@ Alexa will announce on all echo devices _"Person detected at [entity name]"_. <img height='460' src='/images/integrations/alexa/alexa_app_person_detection.png' alt='Screenshot: Alexa App Person Detection Notification'/></a> </p> -<div class='note'> - +{% note %} Display category will default to `CAMERA` to enable presence detected notification settings in the Alexa App. Each Echo device will need the communication and Announcements setting enabled, and the Do Not Disturbed feature turned off. - -</div> +{% endnote %} ### Input Number and Number @@ -943,9 +939,22 @@ Home Assistant will attempt to translate the `media_player` `source_list` into a Requires [Proactive Events](#proactive-events) enabled. -<div class='note info'> +{% note %} Intents to seek forwards (skip) or to rewind (go back) are not supported at the moment. -</div> +{% endnote %} + +### Remote + +Supports changing the Remote `activity` from the given `activity_list` + +- _"Alexa, change the TV to PlayStation."_ +- _"Alexa, change the input on the TV to PlayStation."_ + +{% note %} +Alexa does not allow the following words to be used as activity names: + +`alarm`, `alarms`, `all alarms`, `away mode`, `bass`, `camera`, `date`, `date today`, `day`, `do not disturb`, `drop in`, `music`, `night light`, `notification`, `playing`, `sleep sounds`, `time`, `timer`, `today in music`, `treble`, `volume`, `way f. m.` +{% endnote %} ### Scene @@ -1007,9 +1016,9 @@ Pause and Restart Timer entities in Home Assistant. - _"Alexa, hold the sous vide."_ - _"Alexa, restart the microwave."_ -<div class="note"> +{% important %} To avoid issues with Alexa's built-in timer functionality, the timer entity should not include the word "timer" in its friendly name. -</div> +{% endimportant %} ### Vacuum diff --git a/source/_integrations/amazon_polly.markdown b/source/_integrations/amazon_polly.markdown index 9d1a1e5e336b..1bf7d2274547 100644 --- a/source/_integrations/amazon_polly.markdown +++ b/source/_integrations/amazon_polly.markdown @@ -10,7 +10,7 @@ ha_platforms: - tts ha_integration_type: integration ha_codeowners: - - '@jschlyter' + - '@jschlyter' related: - docs: /docs/configuration/ title: Configuration file diff --git a/source/_integrations/amcrest.markdown b/source/_integrations/amcrest.markdown index f097ff73f5ed..3a729edae661 100644 --- a/source/_integrations/amcrest.markdown +++ b/source/_integrations/amcrest.markdown @@ -192,11 +192,11 @@ Once loaded, the Amcrest integration will generate (Home Assistant) {% term even The event code is sent by Amcrest or Dahua devices in the payload as a "Code" member. To ease event matching in automations, this code is replicated in a more top-level `event` member in `data`. -## Services +## Actions -Once loaded, the `amcrest` integration will expose {% term services %} that can be called to perform various actions. The `entity_id` service attribute can specify one or more specific cameras, or `all` can be used to specify all configured Amcrest cameras. +Once loaded, the `amcrest` integration will expose {% term actions %} that can be called to perform various actions. The `entity_id` action attribute can specify one or more specific cameras, or `all` can be used to specify all configured Amcrest cameras. -Available {% term services %}: +Available {% term actions %}: `enable_audio`, `disable_audio`, `enable_motion_recording`, `disable_motion_recording`, `enable_recording`, `disable_recording`, @@ -204,61 +204,61 @@ Available {% term services %}: `start_tour`, `stop_tour`, and `ptz_control` -### Service `enable_audio`/`disable_audio` +### Action `enable_audio`/`disable_audio` -These {% term services %} enable or disable the camera's audio stream. +These {% term actions %} enable or disable the camera's audio stream. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | The entity ID of the camera to control. May be a list of multiple entity IDs. To target all cameras, set entity ID to `all`. | -### Service `enable_motion_recording`/`disable_motion_recording` +### Action `enable_motion_recording`/`disable_motion_recording` -These {% term services %} enable or disable the camera to record a clip to its configured storage location when motion is detected. +These {% term actions %} enable or disable the camera to record a clip to its configured storage location when motion is detected. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | The entity ID of the camera to control. May be a list of multiple entity IDs. To target all cameras, set entity ID to `all`. | -### Service `enable_recording`/`disable_recording` +### Action `enable_recording`/`disable_recording` -These services enable or disable the camera to continuously record to its configured storage location. +These actions enable or disable the camera to continuously record to its configured storage location. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | The entity ID of the camera to control. May be a list of multiple entity IDs. To target all cameras, set entity ID to `all`. | -### Service `goto_preset` +### Action `goto_preset` -This service will cause the camera to move to one of the <abbr title="pan, tilt, and zoom">PTZ</abbr> locations configured within the camera. +This action will cause the camera to move to one of the <abbr title="pan, tilt, and zoom">PTZ</abbr> locations configured within the camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | The entity ID of the camera to control. May be a list of multiple entity IDs. To target all cameras, set entity ID to `all`. | | `preset` | no | Preset number, starting from 1. | -### Service `set_color_bw` +### Action `set_color_bw` -This service will set the color mode of the camera. +This action will set the color mode of the camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | The entity ID of the camera to control. May be a list of multiple entity IDs. To target all cameras, set entity ID to `all`. | | `color_bw` | no | One of `auto`, `bw` or `color`. | -### Service `start_tour`/`stop_tour` +### Action `start_tour`/`stop_tour` -These services start or stop the camera's <abbr title="pan, tilt, and zoom">PTZ</abbr> tour function. +These actions start or stop the camera's <abbr title="pan, tilt, and zoom">PTZ</abbr> tour function. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | The entity ID of the camera to control. May be a list of multiple entity IDs. To target all cameras, set entity ID to `all`. | -### Service `ptz_control` +### Action `ptz_control` If your Amcrest or Dahua camera supports <abbr title="pan, tilt, and zoom">PTZ</abbr>, you will be able to pan, tilt or zoom your camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | The entity ID of the camera to control. May be a list of multiple entity IDs. To target all cameras, set entity ID to `all`. | | `movement` | no | Direction of the movement. Allowed values: `zoom_in`, `zoom_out`, `up`, `down`, `left`, `right`, `right_up`, `right_down`, `left_up`, `left_down` | diff --git a/source/_integrations/analytics.markdown b/source/_integrations/analytics.markdown index 58e4a1fcc920..20d9ae3a15a4 100644 --- a/source/_integrations/analytics.markdown +++ b/source/_integrations/analytics.markdown @@ -46,7 +46,7 @@ If you are running Home Assistant Operating System, this will also contain: - The board type you are using - The version of the Operating System -{% details Example payload %} +{% details "Example payload" %} ```json { @@ -87,7 +87,7 @@ If your system includes the Supervisor, this will also contain: - If protection mode is enabled - If auto update is enabled -{% details Example payload %} +{% details "Example payload" %} ```json { @@ -140,7 +140,7 @@ If your system includes the Supervisor, this will also contain: - Number of installed add-ons -{% details Example payload %} +{% details "Example payload" %} ```json { diff --git a/source/_integrations/android_ip_webcam.markdown b/source/_integrations/android_ip_webcam.markdown index 9932dece87eb..18968efb6e41 100644 --- a/source/_integrations/android_ip_webcam.markdown +++ b/source/_integrations/android_ip_webcam.markdown @@ -38,8 +38,6 @@ Download [Android IP Webcam app](https://play.google.com/store/apps/details?id=c {% include integrations/config_flow.md %} -<div class='note'> - +{% note %} You need to enable logging in the Android app (`Data logging` > `Enable data logging`) if you wish to see the sensor states in Home Assistant. The {% term sensor %} {% term states %} stay as `unknown`, until this is enabled. - -</div> +{% endnote %} diff --git a/source/_integrations/androidtv.markdown b/source/_integrations/androidtv.markdown index 34a7a92e31c1..db4911e50eda 100644 --- a/source/_integrations/androidtv.markdown +++ b/source/_integrations/androidtv.markdown @@ -20,11 +20,9 @@ ha_integration_type: device The **Android Debug Bridge** {% term integration %} allows you to control an Android device or [Amazon Fire TV](https://www.amazon.com/b/?node=8521791011) device. -<div class='note'> - +{% important %} When setting up this {% term integration %}, it is recommended that you do NOT use an ADB server and instead use the built-in Python ADB implementation. This simplifies the setup and makes it easier to troubleshoot issues. If there are stability issues with this approach, then you may wish to try using an ADB server. See the [ADB Setup](#adb-setup) section for more information. - -</div> +{% endimportant %} ## Device preparation @@ -40,7 +38,7 @@ For Fire TV devices, the instructions are as follows: - From the main (Launcher) screen, select Settings. - Select My Fire TV > About > Network. -If Developer Options is missing from Settings then select My Fire TV and press the button seven times on About. +If Developer Options is missing from Settings, then select My Fire TV and press the button seven times on About. Note that on some Fire TV devices, such as the Insignia F30 series, it is not possible to enable Developer Options until you have signed in to an Amazon account on the device. {% include integrations/config_flow.md %} @@ -66,21 +64,17 @@ Configure State Detection Rules: This integration works by sending ADB commands to your Android / Fire TV device. There are two ways to accomplish this. -<div class='note'> - +{% important %} When connecting to your device for the first time, a dialog will appear on your Android / Fire TV asking you to approve the connection. Check the box that says "always allow connections from this device" and hit OK. - -</div> +{% endimportant %} ### 1. Python ADB Implementation The default approach is to connect to your device using the `adb-shell` Python package. As of Home Assistant 0.101, if a key is needed for authentication and it is not provided by the `ADB Key` setup option, then Home Assistant will generate a key for you. -<div class='note'> - +{% important %} To be able to provide `ADB Key` on integration setup, you need to enable [advanced mode](/blog/2019/07/17/release-96/#advanced-mode). - -</div> +{% endimportant %} Prior to Home Assistant 0.101, this approach did not work well for newer devices. Efforts have been made to resolve these issues, but if you experience problems then you should use the ADB server option. @@ -88,11 +82,9 @@ Prior to Home Assistant 0.101, this approach did not work well for newer devices The second option is to use an ADB server to connect to your Android and Fire TV devices. -<div class='note'> - +{% important %} To configure ADB server on integration setup, you need to enable [advanced mode](/blog/2019/07/17/release-96/#advanced-mode). - -</div> +{% endimportant %} Using this approach, Home Assistant will send the ADB commands to the server, which will then send them to the Android / Fire TV device and report back to Home Assistant. To use this option, add the `adb_server_ip` option to your configuration. If you are running the server on the same machine as Home Assistant, you can use `127.0.0.1` for this value. @@ -114,7 +106,11 @@ If the setup for your Android or Fire TV device fails, then there is probably an 7. If you are using the [Python ADB implementation](#1-python-adb-implementation) approach, as mentioned above, there may be some issues with newer devices. In this case, you should use the [ADB server](#2-adb-server) approach instead. -## Services +## Device Unavailable + +Some devices, such as the Insignia F30 series, disappear from the network when they are turned off. This can be seen as the device becoming unavailable in Home Assistant (logs show TCP timeout errors), disappearing from the network, and not responding to ping. Often, this is for approximately 50 minutes out of each hour when turned off. This can be fixed by opening the Settings app on the device and using "Display & Sounds" -> "Power Controls" -> "Voice Commands When TV Screen is Off". Change this value to "On" and accept the warning about increased power consumption. This will cause the device to always remain listening on the network so that it can be turned on via Home Assistant. Note that after being unplugged or losing power, the device will need to be manually turned on once before this setting takes effect again. + +## Actions ### `media_player.select_source` @@ -140,9 +136,9 @@ stop_netflix: ### `androidtv.adb_command` -The service `androidtv.adb_command` allows you to send either keys or ADB shell commands to your Android / Fire TV device. If there is any output, it will be stored in the `'adb_response'` attribute (i.e., `state_attr('media_player.android_tv_living_room', 'adb_response')` in a template) and logged at the INFO level. +The `androidtv.adb_command` action allows you to send either keys or ADB shell commands to your Android / Fire TV device. If there is any output, it will be stored in the `'adb_response'` attribute (i.e., `state_attr('media_player.android_tv_living_room', 'adb_response')` in a template) and logged at the INFO level. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name(s) of Android / Fire TV entities. | `command` | no | Either a key command or an ADB shell command. @@ -179,17 +175,17 @@ A list of various intents can be found [here](https://gist.github.com/mcfrojd/9e ### `androidtv.learn_sendevent` (for faster ADB commands) -When sending commands like UP, DOWN, HOME, etc. via ADB, the device can be slow to respond. The problem isn't ADB, but rather the Android command `input` that is used to perform those actions. A faster way to send these commands is using the Android `sendevent` command. The challenge is that these commands are device-specific. To assist users in learning commands for their device, the Android debug bridge integration provides the `androidtv.learn_sendevent` service. Its usage is as follows: +When sending commands like UP, DOWN, HOME, etc. via ADB, the device can be slow to respond. The problem isn't ADB, but rather the Android command `input` that is used to perform those actions. A faster way to send these commands is using the Android `sendevent` command. The challenge is that these commands are device-specific. To assist users in learning commands for their device, the Android debug bridge integration provides the `androidtv.learn_sendevent` action. Its usage is as follows: -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name(s) of Android / Fire TV entities. -1. Call the `androidtv.learn_sendevent` service. +1. Perform the `androidtv.learn_sendevent` action. 2. Within 8 seconds, hit a single button on your Android / Fire TV remote. -3. After 8 seconds, a persistent notification will appear that contains the equivalent command that can be sent via the `androidtv.adb_command` service. This command can also be found in the `adb_response` attribute of the media player in Home Assistant, and it will be logged at the INFO level. +3. After 8 seconds, a persistent notification will appear that contains the equivalent command that can be sent via the `androidtv.adb_command` action. This command can also be found in the `adb_response` attribute of the media player in Home Assistant, and it will be logged at the INFO level. -As an example, a service call in a [script](/docs/scripts) could be changed from this: +As an example, an action in a [script](/docs/scripts) could be changed from this: ```yaml # Send the "UP" command (slow) @@ -213,17 +209,17 @@ to this: ### `androidtv.download` and `androidtv.upload` -You can use the `androidtv.download` service to download a file from your Android / Fire TV device to your Home Assistant instance. +You can use the `androidtv.download` action to download a file from your Android / Fire TV device to your Home Assistant instance. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name of Android / Fire TV entity. | `device_path` | no | The filepath on the Android / Fire TV device. | `local_path` | no | The filepath on your Home Assistant instance. -Similarly, you can use the `androidtv.upload` service to upload a file from Home Assistant instance to Android / Fire TV devices. +Similarly, you can use the `androidtv.upload` action to upload a file from Home Assistant instance to Android / Fire TV devices. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name(s) of Android / Fire TV entities. | `device_path` | no | The filepath on the Android / Fire TV device. @@ -244,11 +240,11 @@ The solution to this problem is the `state_detection_rules` configuration parame - `'media_session_state'` = try to use the `media_session_state` property to determine the state - `'audio_state'` = try to use the `audio_state` property to determine the state -To determine what these rules should be, you can use the `androidtv.adb_command` service with the command `GET_PROPERTIES`, as described in the [androidtv.adb_command](#androidtvadb_command) section. +To determine what these rules should be, you can use the `androidtv.adb_command` action with the command `GET_PROPERTIES`, as described in the [androidtv.adb_command](#androidtvadb_command) section. ## Remote -The integration supports the `remote` platform. The remote allows you to send commands to your device with the `remote.send_command` service. You can send either keys or ADB shell commands to your Android / Fire TV device. The supported keys vary between Android models and version. +The integration supports the `remote` platform. The remote allows you to send commands to your device with the `remote.send_command` action. You can send either keys or ADB shell commands to your Android / Fire TV device. The supported keys vary between Android models and version. {% details "Full keycodes list" %} diff --git a/source/_integrations/androidtv_remote.markdown b/source/_integrations/androidtv_remote.markdown index 3c8e69fb7a28..ae917e974d2f 100644 --- a/source/_integrations/androidtv_remote.markdown +++ b/source/_integrations/androidtv_remote.markdown @@ -28,46 +28,67 @@ For a quick introduction on how to get started with Android TV Remote, check out {% include integrations/config_flow.md %} +{% include integrations/option_flow.md %} +{% configuration_basic %} +Configure Applications List: + description: Here you can define applications where the keys are app IDs and the values are app names and icons that will be displayed in the UI. +{% endconfiguration_basic %} + ## Media player This {% term integration %} adds a `media_player` with basic playback and volume controls. The media player provides volume information and display name of current active app on the Android TV. Due to API limitations, the integration will not display the playback status. It is recommended to use this integration together with [Google Cast integration](/integrations/cast/). Two media players can be combined into one using the [Universal Media Player](/integrations/universal/) integration. See [Using with Google Cast](#using-with-google-cast) section for more details. -Using the `media_player.play_media` service, you can launch applications and switch channels. Only `url` and `channel` media types are supported. +Using the `media_player.play_media` {% term action %}, you can launch applications, switch channels, and start activities via `Deep Links`. Only `app`, `url` and `channel` media types are supported. ### Launching apps -If the Android TV device has the Google Play Store, you can directly launch any app by its application ID/package name. +If the Android TV device has the Google Play Store, you can directly launch any app by its application ID (package name). The app doesn't need to exist in the Google Play Store. If it exists, you can find the application ID in the URL of the app's Google Play Store listing. For example, if the URL of an app page is `play.google.com/store/apps/details?id=com.example.app123`, the application ID is `com.example.app123`. The application ID is also displayed in the media player card when you launch the application on the device. -Alternatively, if the device doesn't have the Google Play Store or if you want to open an app in a specific section, you can pass deep links supported by some applications. - -Examples of application IDs and deep links for popular applications: +Examples of application IDs for popular applications: -| App | App ID | Deep link | -| --- | --- | --- | -| YouTube | `com.google.android.youtube.tv` | `https://www.youtube.com` or `vnd.youtube://` or `vnd.youtube.launch://` -| Netflix | `com.netflix.ninja` | `https://www.netflix.com/title` or `netflix://` -| Prime Video | `com.amazon.amazonvideo.livingroom` | `https://app.primevideo.com` -| Disney+ | `com.disney.disneyplus` | `https://www.disneyplus.com` -| Plex | `com.plexapp.android` | `plex://` -| Kodi | `org.xbmc.kodi` | N/A -| Twitch | `tv.twitch.android.app` | `twitch://home` `[home,stream,game,video,clip,search,browse,channel,user]` +| App | App ID | +| --- | --- | +| YouTube | `com.google.android.youtube.tv` +| Netflix | `com.netflix.ninja` +| Prime Video | `com.amazon.amazonvideo.livingroom` +| Disney+ | `com.disney.disneyplus` +| Plex | `com.plexapp.android` +| Kodi | `org.xbmc.kodi` +| Twitch | `tv.twitch.android.app` -Examples: +Example: ```yaml -# Launch the Netflix app +# Launch the YouTube app service: media_player.play_media data: - media_content_type: url - media_content_id: com.netflix.ninja + media_content_type: app + media_content_id: com.google.android.youtube.tv target: entity_id: media_player.living_room_tv ``` +### Launching activities + +Alternatively, if the device doesn't have the Google Play Store or if you want to open specific activity in the app, you can pass deep links supported by some applications. + +Examples of deep links for popular applications: + +| App | Deep link | +| --- | --- | +| YouTube | `https://www.youtube.com` or `vnd.youtube://` or `vnd.youtube.launch://` +| Netflix | `https://www.netflix.com/title` or `netflix://` +| Prime Video | `https://app.primevideo.com` +| Disney+ | `https://www.disneyplus.com` +| Plex | `plex://` +| Twitch | `twitch://home` `[home, stream, game, video, clip, search, browse, channel, user]` + +Example: + ```yaml # Open a specific YouTube video: service: media_player.play_media @@ -136,9 +157,9 @@ media_player: ## Remote -The remote allows you to send key commands to your Android TV device with the `remote.send_command` service. +The remote allows you to send key commands 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` service to launch that app. +You can pass the application ID shown in this `current_activity` as `activity` in the `remote.turn_on` action to launch that app. {% details "List of the most common commands" %} @@ -224,7 +245,7 @@ Other: 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). -Examples of service calls: +Example actions: ```yaml # Open the currently selected item on the Android TV @@ -549,9 +570,3 @@ cards: - Some devices experience disconnects every 15 seconds. This is typically resolved by rebooting the Android TV device after the initial setup of the integration. - If you are not able to connect to the Android TV device, or are asked to pair it again and again, try force-stopping the Android TV Remote Service and clearing its storage. On the Android TV device, go to **Settings** > **Apps** > **Show system apps**. Then, select **Android TV Remote Service** > **Storage** > **Clear storage**. You will have to pair again. - Some onscreen keyboards enabled by TV manufacturers do not support concurrent virtual and onscreen keyboard use. This presents whenever a text field is selected, such as "search" where a constant **use the keyboard on your mobile device** will show, preventing you from opening the onscreen keyboard to type. This can be overcome by either disabling your 3rd party keyboard and using the default Gboard keyboard or by deselecting **Enable IME** in the **Configure** page of the integration. -- In some instances, Zeroconf will assign an incorrect IP address to a device. As a workaround, the below can be added to `configuration.yaml` to prevent Zeroconf from assigning IPs for the integration. IPs will need to be manually entered during setup, as described [above](/integrations/androidtv_remote/#configuration). -```yaml -zeroconf: - ignore: - - androidtv_remote -``` diff --git a/source/_integrations/anel_pwrctrl.markdown b/source/_integrations/anel_pwrctrl.markdown index 80993033f5fe..88ec26582842 100644 --- a/source/_integrations/anel_pwrctrl.markdown +++ b/source/_integrations/anel_pwrctrl.markdown @@ -59,8 +59,6 @@ password: type: string {% endconfiguration %} -<div class="note"> - +{% note %} If no **host** is given the platform will try to auto-discover all devices on the network, that are listening on the given **port_recv**. - -</div> +{% endnote %} diff --git a/source/_integrations/anthemav.markdown b/source/_integrations/anthemav.markdown index 59b40e31f26a..905f0030f7f7 100644 --- a/source/_integrations/anthemav.markdown +++ b/source/_integrations/anthemav.markdown @@ -54,10 +54,10 @@ port: - The tuner is currently unsupported as are the `media_player` play, pause, prev, and next controls. - Enabling this platform will set and enforce **Standby IP Control On** within your Anthem device. You almost certainly want this. If you disable it on the device, it will just get re-enabled by Home Assistant. -<div class='note warning'> +{% warning %} The {% term integration %} will maintain a persistent connection to the network control port which will prevent any other application from communicating with the receiver. This includes the Anthem iOS and Android remote control apps as well as the ARC-2 Anthem Room Calibration software. If you want to use another application that makes use of the network control port, disable this {% term integration %} and restart Home Assistant. <br /><br /> *The underlying Python module has hooks for halting and resuming the network connection but those functions are currently unsupported by the Home Assistant platform.* -</div> +{% endwarning %} \ No newline at end of file diff --git a/source/_integrations/aosmith.markdown b/source/_integrations/aosmith.markdown index 1ca9c57b7015..bc5466086aff 100644 --- a/source/_integrations/aosmith.markdown +++ b/source/_integrations/aosmith.markdown @@ -62,12 +62,12 @@ The water heater entity offers the following capabilities: This table shows the supported operation modes. The available modes will depend on your specific water heater model. -| Mode displayed in A. O. Smith app | Mode displayed in Home Assistant | Mode name for `water_heater.set_operation_mode` service | -| ---------------------------------- | -------------------------------- | ------------------------------------------------------- | -| Electric/Standard | Electric | `electric` | -| Hybrid | Eco | `eco` | -| Heat Pump | Heat Pump | `heat_pump` | -| Vacation | N/A - use away mode | N/A - use `water_heater.set_away_mode` | +| Mode displayed in A. O. Smith app | Mode displayed in Home Assistant | Mode name for `water_heater.set_operation_mode` action | +| ---------------------------------- | -------------------------------- | ------------------------------------------------------ | +| Electric/Standard | Electric | `electric` | +| Hybrid | Eco | `eco` | +| Heat Pump | Heat Pump | `heat_pump` | +| Vacation | N/A - use away mode | N/A - use `water_heater.set_away_mode` | ### Sensor diff --git a/source/_integrations/apcupsd.markdown b/source/_integrations/apcupsd.markdown index 409a7ec2a6d9..819e1e30254f 100644 --- a/source/_integrations/apcupsd.markdown +++ b/source/_integrations/apcupsd.markdown @@ -34,11 +34,11 @@ After installation, follow the instructions on the GitHub page to configure the {% include integrations/config_flow.md %} -<div class='note'> +{% note %} If you get `ConnectionRefusedError: Connection refused` errors in the Home Assistant logs, ensure the [apcupsd](http://www.apcupsd.org/) configuration directives used by its Network Information Server is set to permit connections from all addresses [NISIP 0.0.0.0](http://www.apcupsd.org/manual/manual.html#configuration-directives-used-by-the-network-information-server), else non-local addresses will not connect. -</div> +{% endnote %} ## Binary sensor @@ -51,11 +51,11 @@ This integration provides a binary sensor for the following information from apc This integration provides sensors for the following information from apcupsd based on their availability. Each sensor is listed here along with their corresponding resource name obtained from `apcaccess`. -<div class='note'> +{% note %} Some sensors are disabled by default, since they provide information that is only useful for advanced users. You can manually enable them in **{% my entities title="Settings -> Devices & Services -> Entities" %}** -> the sensor entity you want to enable -> Advanced settings -> Enabled. -</div> +{% endnote %} - UPS Alarm Delay (ALARMDEL) - UPS Ambient Temperature (AMBTEMP) diff --git a/source/_integrations/apple_tv.markdown b/source/_integrations/apple_tv.markdown index 406a388f3345..867850067c58 100644 --- a/source/_integrations/apple_tv.markdown +++ b/source/_integrations/apple_tv.markdown @@ -35,10 +35,10 @@ This entity will display the active app and playback controls. ### Launching apps -You can launch apps using the `media_player.select_source` service, or using the +You can launch apps using the `media_player.select_source` action, or using the “Apps” folder in the media browser. -Using the `media_player.play_media` service, you can also use `Deep Links` to +Using the `media_player.play_media` action, you can also use `Deep Links` to launch specific content in applications. Examples of some `Deep Links` for popular applications: @@ -109,7 +109,7 @@ The following commands are currently available: **NOTE:** Not all commands are supported by all Apple TV versions. -### Service `send_command` +### Action `send_command` | Service data<br>attribute | Optional | Description | | ------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- | diff --git a/source/_integrations/application_credentials.markdown b/source/_integrations/application_credentials.markdown index 0e50f4cbf0e1..b92fcf108070 100644 --- a/source/_integrations/application_credentials.markdown +++ b/source/_integrations/application_credentials.markdown @@ -10,29 +10,45 @@ ha_codeowners: ha_integration_type: system --- -The **Application credentials** {% term integration %} is used by integrations that use OAuth2 to link your account to Home Assistant. The most common and preferred approach is using account linking with Home Assistant Cloud, however not all cloud providers support that and integrations can use Application Credentials instead. Additionally, users may use Application Credentials if preferred instead of Home Assistant Cloud Account Linking. +The **Application credentials** {% term integration %} is used by integrations that use OAuth2 to link your account to Home Assistant. The most common and preferred approach is using account linking with Home Assistant Cloud, however, not all cloud providers support that and integrations can use Application Credentials instead. Additionally, users may use Application Credentials if preferred instead of Home Assistant Cloud Account Linking. ## Automatic setup -Some integrations like [Google Calendar](/integrations/google/) will automatically create application credentials as part of adding an integration. To view any entries: -1. Go to **{% my integrations title="Settings -> Devices & Services" %}** -2. Click the overflow menu on the top right **...** and choose **Application Credentials** +Some integrations like [Google Calendar](/integrations/google/) will automatically create application credentials as part of adding an integration. -![Devices and services overflow menu](/images/integrations/application_credentials/devices-and-services-menu.png) +## To view stored application credentials -![Application credential list](/images/integrations/application_credentials/application-credentials.png) +1. Go to {% my integrations title="**Settings** > **Devices & services**" %}. +2. In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Application credentials**. + + ![Devices and services overflow menu](/images/integrations/application_credentials/devices-and-services-menu.png) + + ![Application credential list](/images/integrations/application_credentials/application-credentials.png) ## Manual setup -Note that integrations that do not support cloud linking will prompt to setup Application Credentials +Some integrations do not support cloud linking. They will prompt you to set up Application Credentials when setting up for the first time. You may also manually enter credentials with the following steps: 1. Obtain an OAuth *Client ID* and *Client Secret* from the cloud provider. The integration should have specific instructions for this. -2. In Home Assistant navigate to **{% my integrations title="Settings -> Devices & Services" %}** -3. Click the overflow menu on the top right **...** and choose **Application Credentials** +2. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}. +3. In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Application credentials**. 4. Select the integration, enter a *Name* and your OAuth *Client ID* and *Client Secret*. -5. Save the credentials +5. Save the credentials. + + ![Manual setup](/images/integrations/application_credentials/application-credential-setup.png) + +6. You may then visit **Integrations** and set up the integration. + +## Deleting application credentials + +To delete an application credential, for example because you created a new one, follow these steps: + +1. Go to {% my integrations title="**Settings** > **Devices & services**" %}. + + ![Devices and services overflow menu](/images/integrations/application_credentials/devices-and-services-menu.png) -![Manual setup](/images/integrations/application_credentials/application-credential-setup.png) +2. In the top right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Application credentials**. +3. Select the credential from the list, select the three-dots menu and select **Delete**. -You may then visit **Integrations** and setup the integration. + ![Application credential list](/images/integrations/application_credentials/application-credential_delete.png) diff --git a/source/_integrations/apprise.markdown b/source/_integrations/apprise.markdown index 2ce75ae4898c..d5b52d97d95f 100644 --- a/source/_integrations/apprise.markdown +++ b/source/_integrations/apprise.markdown @@ -55,7 +55,7 @@ notify: {% configuration %} name: - description: The notifier will bind to the service `notify.NAME`. + description: The notifier will bind to the action `notify.NAME`. required: false type: string default: notify @@ -69,7 +69,7 @@ config: type: string {% endconfiguration %} -## Example service call +## Example action ```yaml - service: notify.NOTIFIER_NAME diff --git a/source/_integrations/aprilaire.markdown b/source/_integrations/aprilaire.markdown index 0b3d47c4233c..3494a5b3d1d0 100644 --- a/source/_integrations/aprilaire.markdown +++ b/source/_integrations/aprilaire.markdown @@ -1,6 +1,6 @@ --- -title: Aprilaire -description: Instructions on how to integrate Aprilaire devices into Home Assistant. +title: AprilAire +description: Instructions on how to integrate AprilAire devices into Home Assistant. ha_category: - Climate ha_iot_class: Local Push @@ -11,14 +11,17 @@ ha_codeowners: ha_config_flow: true ha_platforms: - climate + - humidifier + - select + - sensor ha_integration_type: device --- -The Aprilaire integration allows you to control an Aprilaire thermostat. +The AprilAire integration allows you to control an AprilAire thermostat. ## Supported Models -This integration supports Aprilaire [8800-series Home Automation Wi-Fi Thermostats](https://www.aprilaire.com/whole-house-products/thermostats/home-automation) and [6000-series Wi-Fi Zone Control devices](https://www.aprilaire.com/whole-house-products/zone-control) which support setting the thermostat to automation mode. It is known that there are some models which are marketed as home automation capable that do not support automation mode, and are therefore not supported. +This integration supports AprilAire [8800-series Home Automation Wi-Fi Thermostats](https://www.aprilaire.com/whole-house-products/thermostats/home-automation) and [6000-series Wi-Fi Zone Control devices](https://www.aprilaire.com/whole-house-products/zone-control) which support setting the thermostat to automation mode. It is known that there are some models which are marketed as home automation capable that do not support automation mode, and are therefore not supported. ## Prerequisites @@ -28,4 +31,4 @@ In order to connect to the thermostat, you will need to enable automation mode. ## Caution regarding device limitations -Due to limitations of the thermostats, only one automation connection to a device is permitted at one time (the Aprilaire app is not included in this limitation as it uses a separate protocol). Attempting to connect multiple times to the same thermostat simultaneously can cause various issues, including the thermostat becoming unresponsive and shutting down. If this does occur, power cycling the thermostat should restore functionality. +Due to limitations of the thermostats, only one automation connection to a device is permitted at one time (the AprilAire app is not included in this limitation as it uses a separate protocol). Attempting to connect multiple times to the same thermostat simultaneously can cause various issues, including the thermostat becoming unresponsive and shutting down. If this does occur, power cycling the thermostat should restore functionality. diff --git a/source/_integrations/apsystems.markdown b/source/_integrations/apsystems.markdown index 4822d9a8a3c1..3df7389c7c9c 100644 --- a/source/_integrations/apsystems.markdown +++ b/source/_integrations/apsystems.markdown @@ -8,8 +8,8 @@ ha_category: - Energy ha_domain: apsystems ha_platforms: - - sensor - number + - sensor ha_integration_type: device ha_codeowners: - '@mawoka-myblock' diff --git a/source/_integrations/aquacell.markdown b/source/_integrations/aquacell.markdown index b863076ae553..edd0ea9f44ea 100644 --- a/source/_integrations/aquacell.markdown +++ b/source/_integrations/aquacell.markdown @@ -1,5 +1,5 @@ --- -title: AquaCell +title: Aquacell description: Instructions on how to integrate AquaCell with Home Assistant. ha_category: - Sensor @@ -11,7 +11,7 @@ ha_codeowners: ha_domain: aquacell ha_platforms: - sensor -ha_integration_type: integration +ha_integration_type: device --- AquaCell is a water-softening device. The **AquaCell** {% term integration %} allows you to monitor your AquaCell device in Home Assistant. diff --git a/source/_integrations/aquostv.markdown b/source/_integrations/aquostv.markdown index 2ce4cbbdd0ba..41bcd6a74032 100644 --- a/source/_integrations/aquostv.markdown +++ b/source/_integrations/aquostv.markdown @@ -61,13 +61,11 @@ power_on_enabled: type: boolean {% endconfiguration %} -<div class='note warning'> - +{% important %} When you set **power_on_enabled** as True, you have to turn on your TV on the first time with the remote. Then you will be able to turn on with Home Assistant. Also, with **power_on_enabled** as True, the Aquos logo on your TV will stay on when you turn off the TV and your TV could consume more power. - -</div> +{% endimportant %} ## Currently known supported models diff --git a/source/_integrations/arest.markdown b/source/_integrations/arest.markdown index 8e45619eb141..ccd6552d2d34 100644 --- a/source/_integrations/arest.markdown +++ b/source/_integrations/arest.markdown @@ -73,9 +73,9 @@ binary_sensor: name: Office ``` -<div class='note'> +{% note %} This sensor is not suitable for fast state changes because there is a high possibility that the change took place between two update cycle. -</div> +{% endnote %} ## Sensor diff --git a/source/_integrations/arris_tg2492lg.markdown b/source/_integrations/arris_tg2492lg.markdown index 06a4fd4d8f37..709ccc151487 100644 --- a/source/_integrations/arris_tg2492lg.markdown +++ b/source/_integrations/arris_tg2492lg.markdown @@ -23,9 +23,9 @@ This is one of the routers provided by: - [Ziggo](https://www.ziggo.nl/), a cable operator in the Netherlands, to their customers as the Ziggo Connectbox. - [Virgin Media](https://www.virginmedia.com/), a cable operator in the United Kingdom and Ireland, to their customers as the Hub 3. -<div class='note warning'> +{% warning %} The router prevents the admin user from logging in twice. This can cause problems with accessing the router's configuration pages while this platform is active. -</div> +{% endwarning %} To use this device tracker in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/aruba.markdown b/source/_integrations/aruba.markdown index eb7887a0db6c..e5a3bacc37dc 100644 --- a/source/_integrations/aruba.markdown +++ b/source/_integrations/aruba.markdown @@ -26,9 +26,9 @@ Supported devices (tested): - Aruba IAP-335 - Aruba Instant IAP-275 -<div class='note warning'> +{% important %} This device tracker needs telnet to be enabled on the router. -</div> +{% endimportant %} To use this device tracker in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/asuswrt.markdown b/source/_integrations/asuswrt.markdown index ab57fc8c5182..881b7cfc4911 100644 --- a/source/_integrations/asuswrt.markdown +++ b/source/_integrations/asuswrt.markdown @@ -28,11 +28,9 @@ There is currently support for the following device types within Home Assistant: {% include integrations/config_flow.md %} -<div class='note warning'> - +{% important %} You need to enable telnet on your router if you choose to use `protocol: telnet`. - -</div> +{% endimportant %} ### Sensors configuration @@ -62,11 +60,9 @@ Require IP: description: If devices must have IP (this option is available only for access point mode). {% endconfiguration_basic %} -<div class='note'> - +{% note %} If you don't want to automatically track new detected device, disable the integration system option `Enable new added entities` - -</div> +{% endnote %} ## Padavan custom firmware (The rt-n56u project) diff --git a/source/_integrations/atag.markdown b/source/_integrations/atag.markdown index 09ea8ad0b2b6..02de4dbedd39 100644 --- a/source/_integrations/atag.markdown +++ b/source/_integrations/atag.markdown @@ -42,25 +42,25 @@ port: The `Atag` climate platform provides current and target temperature information for the heating system, boiler status and HVAC mode. -### Integration services +### Integration actions -This integration supports the following services (see [Climate](/integrations/climate/)). +This integration supports the following actions (see [Climate](/integrations/climate/)). -- [`set_temperature`](/integrations/climate/#service-climateset_temperature) -- [`set_hvac_mode`](/integrations/climate/#service-climateset_hvac_mode) +- [`set_temperature`](/integrations/climate/#action-climateset_temperature) +- [`set_hvac_mode`](/integrations/climate/#action-climateset_hvac_mode) - `heat` for thermostat mode - `auto` for weather-based mode -- [`set_preset_mode`](/integrations/climate/#service-climateset_preset_mode) +- [`set_preset_mode`](/integrations/climate/#action-climateset_preset_mode) - `Manual` enable manual operation - `Auto` enable schedule based operation - `Extend` delay the next scheduled temperature update by the default extend period - `away` enable the vacation mode for 1 day or until another preset is activated - `boost` enable fireplace mode -<div class='note'> +{% note %} `HVAC mode Auto` (Weather based) should not be confused with `Preset mode Auto` (Scheduled, thermostat mode). Currently selection of custom timeframes in Extend, Away and boost modes is not supported. The default settings can be changed on the device. -</div> +{% endnote %} ## Water heater diff --git a/source/_integrations/august.markdown b/source/_integrations/august.markdown index 855ee3fda903..12c7ac10d491 100644 --- a/source/_integrations/august.markdown +++ b/source/_integrations/august.markdown @@ -6,6 +6,7 @@ ha_category: - Button - Camera - Doorbell + - Event - Lock - Sensor ha_release: 0.64 @@ -20,6 +21,7 @@ ha_platforms: - button - camera - diagnostics + - event - lock - sensor ha_integration_type: integration @@ -58,9 +60,9 @@ There is currently support for the following device types within Home Assistant: - Camera - Lock -<div class='note'> +{% note %} Most devices will need either August Connect Bridge or Doorbell to connect to Home Assistant. -</div> +{% endnote %} ## Known issues with battery reporting @@ -92,6 +94,15 @@ If you have an August Smart Lock with DoorSense, once you have enabled the Augus Buttons are created to wake locks from a deep sleep. If your lock is not reporting a status, it may be in a deep sleep, and the button can be used to wake it. Locks are not automatically woken from deep sleep to preserve battery life. +## Event + +If you have an August doorbell or lock that has a built-in doorbell, once you have enabled the August integration, you should see the following event entities: + +- Doorbell +- Motion + +Not all models include motion sensors and support for locks with built-in doorbells is limited to Yale Doorman models type 7 and 10. + ## Camera The `august` camera platform allows you to view the latest camera image (triggered by motion) by your [August](https://august.com/) device in Home Assistant. diff --git a/source/_integrations/aurora.markdown b/source/_integrations/aurora.markdown index 5718aaa0e345..e179185786a7 100644 --- a/source/_integrations/aurora.markdown +++ b/source/_integrations/aurora.markdown @@ -15,7 +15,7 @@ ha_platforms: ha_integration_type: integration --- -The `aurora` platform uses the [NOAA Aurora Forecast](https://www.swpc.noaa.gov/products/aurora-30-minute-forecast) service to let you know if an aurora might be visible at your home location in the next 30 minutes, based off of current solar flare activity. +The `aurora` platform uses the [NOAA Aurora Forecast](https://www.swpc.noaa.gov/products/aurora-30-minute-forecast) action to let you know if an aurora might be visible at your home location in the next 30 minutes, based off of current solar flare activity. This service gives a number 0-100 representing the current likelihood of visible auroras at your latitude/longitude. By default this sensor is set up to trigger when the reported likelihood for your location is > 75. It updates every 5 minutes. diff --git a/source/_integrations/autarco.markdown b/source/_integrations/autarco.markdown new file mode 100644 index 000000000000..74cf55c8568f --- /dev/null +++ b/source/_integrations/autarco.markdown @@ -0,0 +1,42 @@ +--- +title: Autarco +description: Instructions on how to integrate Autarco solar system within Home Assistant. +ha_category: + - Energy + - Sensor +ha_release: 2024.8 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_codeowners: + - '@klaasnicolaas' +ha_domain: autarco +ha_platforms: + - sensor +ha_integration_type: integration +--- + +The **Autarco** {% term integration %} allows you to gather data from the cloud API of [Autarco](https://www.autarco.com) and use it in Home Assistant. + +Autarco is a Dutch company that provides solar panels, inverters and batteries. They have their own cloud platform where you can monitor the performance of your system. + +{% include integrations/config_flow.md %} + +## Sensors + +The Autarco platform mainly provides sensors that you can use in your [energy dashboard](/energy). + +### Solar + +Gain insight into how much solar energy your site produces. + +- Power production (W) +- Energy production today (kWh) +- Energy production this month (kWh) +- Energy production total (kWh) + +### Inverters + +Gain insight into how much energy an inverter produces. The integration will create a device for each inverter linked to your account. + +- AC output power (W) +- AC output energy total (kWh) diff --git a/source/_integrations/aws.markdown b/source/_integrations/aws.markdown index a2edad54af17..d6b0df57f1bf 100644 --- a/source/_integrations/aws.markdown +++ b/source/_integrations/aws.markdown @@ -96,7 +96,7 @@ profile_name: required: false type: string name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string @@ -108,9 +108,9 @@ context: ## Lambda notify usage -AWS Lambda is a notification platform and thus can be controlled by calling the `notify` service [as described here](/integrations/notify/). It will invoke a Lambda for all targets given in the notification payload. A target can be formatted as a function name, an entire ARN ([Amazon Resource Name](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)) or a partial ARN. For more information, please see the [botocore documentation](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/lambda/client/invoke.html). +AWS Lambda is a notification platform and thus can be controlled by calling the `notify` action [as described here](/integrations/notify/). It will invoke a Lambda for all targets given in the notification payload. A target can be formatted as a function name, an entire ARN ([Amazon Resource Name](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)) or a partial ARN. For more information, please see the [botocore documentation](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/lambda/client/invoke.html). -The Lambda event payload will contain everything passed in the service call payload. Here is an example payload that would be sent to Lambda: +The Lambda event payload will contain everything passed in the action payload. Here is an example payload that would be sent to Lambda: ```json { @@ -136,7 +136,7 @@ The context will look like this: ## SNS notify usage -AWS SNS is a notification platform and thus can be controlled by calling the `notify` service [as described here](/integrations/notify/). It will publish a message to all targets given in the notification payload. A target must be a SNS topic or endpoint ARN ([Amazon Resource Name](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)). For more information, please see the [botocore documentation](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/sns/client/publish.html). +AWS SNS is a notification platform and thus can be controlled by calling the `notify` action [as described here](/integrations/notify/). It will publish a message to all targets given in the notification payload. A target must be a SNS topic or endpoint ARN ([Amazon Resource Name](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)). For more information, please see the [botocore documentation](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/sns/client/publish.html). If one exists, the SNS Subject will be set to the title. All attributes from the payload, except the message, will be sent as stringified message attributes. @@ -146,9 +146,9 @@ If one exists, the SNS Subject will be set to the title. All attributes from the - On the left-hand side, select "Users" then click "Create New Users". Enter a name here and then click "Create". - You can either download the credentials or click the arrow to display them one time. -<div class='note warning'> +{% warning %} If you do not download them, you will lose them and will have to recreate a new user. -</div> +{% endwarning %} - Copy/Paste the two keys that are shown here in your {% term "`configuration.yaml`" %} file. - On the left-hand side of the screen go back to "Users" and select the user you just created. On the "Permissions" tab click the "Attach Policy" icon. Search for "SNS" and attach the policy "AmazonSNSFullAccess". @@ -162,9 +162,9 @@ If you do not download them, you will lose them and will have to recreate a new ## SQS Notify Usage -AWS SQS is a notification platform and thus can be controlled by calling the `notify` service [as described here](/integrations/notify/). It will publish a message to the queue for all targets given in the notification payload. A target must be a SQS topic URL. For more information, please see the [SQS documentation](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-message-identifiers.html) and [botocore documentation](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/sqs/client/send_message.html) +AWS SQS is a notification platform and thus can be controlled by calling the `notify` action [as described here](/integrations/notify/). It will publish a message to the queue for all targets given in the notification payload. A target must be a SQS topic URL. For more information, please see the [SQS documentation](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-message-identifiers.html) and [botocore documentation](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/sqs/client/send_message.html) -The SQS event payload will contain everything passed in the service call payload. SQS payloads will be published as stringified JSON. All attributes from the payload, except message, will also be sent as stringified message attributes. Here is an example message that would be published to the SQS queue: +The SQS event payload will contain everything passed in the action payload. SQS payloads will be published as stringified JSON. All attributes from the payload, except message, will also be sent as stringified message attributes. Here is an example message that would be published to the SQS queue: ```json { @@ -178,11 +178,11 @@ The SQS event payload will contain everything passed in the service call payload ``` ## EventBridge Notify Usage -AWS EventBridge is a notification platform and thus can be controlled by calling the `notify` service [as described here](/integrations/notify/). It will publish a message to the event bus for all targets given in the notification payload. A target must be a name of an event bus accessible by the given credentials. A target is not required, and the default event bus will be used if none are specified. For more information, please see the [EventBridge documentation](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-bus.html) and [botocore documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/events/client/put_events.html) +AWS EventBridge is a notification platform and thus can be controlled by calling the `notify` action [as described here](/integrations/notify/). It will publish a message to the event bus for all targets given in the notification payload. A target must be a name of an event bus accessible by the given credentials. A target is not required, and the default event bus will be used if none are specified. For more information, please see the [EventBridge documentation](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-bus.html) and [botocore documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/events/client/put_events.html) -There are two options for generating the event detail based on the service call payload. If the `detail` attribute is specified, then its value will be serialized as a JSON object and used for the event detail. If the attribute is not specified, then the value of the `message` attribute is serialized as a simple JSON object with a single key named `message` and the value of the message supplied to the service call. +There are two options for generating the event detail based on the action payload. If the `detail` attribute is specified, then its value will be serialized as a JSON object and used for the event detail. If the attribute is not specified, then the value of the `message` attribute is serialized as a simple JSON object with a single key named `message` and the value of the message supplied to the action. -Here are a couple of examples showing the service call input and corresponding API entry: +Here are a couple of examples showing the action input and corresponding API entry: ```jsonc // Service call payload diff --git a/source/_integrations/axis.markdown b/source/_integrations/axis.markdown index 6baa58ecc34d..b17b1a1308a9 100644 --- a/source/_integrations/axis.markdown +++ b/source/_integrations/axis.markdown @@ -30,9 +30,9 @@ ha_integration_type: device {% include integrations/config_flow.md %} -<div class='note'> - It is recommended that you create a user on your Axis device specifically for Home Assistant. For sensor functionality, it is enough to create a user with viewer privileges. If you want additional functional control you will need admin privileges. -</div> +{% tip %} +It is recommended that you create a user on your Axis device specifically for Home Assistant. For sensor functionality, it is enough to create a user with viewer privileges. If you want additional functional control you will need admin privileges. +{% endtip %} ## Debugging integration diff --git a/source/_integrations/azure_data_explorer.markdown b/source/_integrations/azure_data_explorer.markdown index ba37fd164940..cb131a4a011f 100644 --- a/source/_integrations/azure_data_explorer.markdown +++ b/source/_integrations/azure_data_explorer.markdown @@ -11,7 +11,9 @@ ha_codeowners: ha_domain: azure_data_explorer related: - docs: /docs/configuration/ +ha_integration_type: integration --- + [Azure Data Explorer](https://azure.microsoft.com/en-us/services/data-explorer/) is a high-performance time-series database, query engine, and dashboarding tool. The Home Assistant **Azure Data Explorer** {% term integration %} allows you to hook into the Home Assistant event bus and forward events to Azure Data Explorer for analytics and dashboarding. From here, data can be viewed in building dashboards, PowerBi, and Grafana, among others. ## Prerequisites @@ -140,10 +142,9 @@ filter: type: list {% endconfiguration %} -<div class='note warning'> +{% warning %} Not filtering domains or entities will send every event to Azure Data Explorer. -</div> - +{% endwarning %} ### Configuring a filter diff --git a/source/_integrations/azure_devops.markdown b/source/_integrations/azure_devops.markdown index 956d507596b4..39013b176e7b 100644 --- a/source/_integrations/azure_devops.markdown +++ b/source/_integrations/azure_devops.markdown @@ -33,4 +33,4 @@ This integration provides a sensor for Azure DevOps: - Latest build queue time - How long the latest build was queued. - Latest build start time - The time when the latest build actually started. - Latest build finish time - The time when the latest build finished. -- Latest build URL - The URL to the latest build. +- Latest build URL - The URL to the latest build. diff --git a/source/_integrations/azure_event_hub.markdown b/source/_integrations/azure_event_hub.markdown index 612b6169242b..a2948e056fe0 100644 --- a/source/_integrations/azure_event_hub.markdown +++ b/source/_integrations/azure_event_hub.markdown @@ -35,13 +35,13 @@ The final thing to consider is how often you want the integration to send messag You can setup [filters](#filter-configuration) through the {% term "`configuration.yaml`" %}. -<div class='note warning'> +{% warning %} Not filtering domains or entities will send every event to Azure Event Hub, thus taking up a lot of space and bandwidth. -</div> +{% endwarning %} -<div class='note warning'> +{% note %} Event Hubs have a retention time of at most 7 days, if you do not capture or use the events they are deleted automatically from the Event Hub, the default retention is 1 day. -</div> +{% endnote %} ### Filter configuration diff --git a/source/_integrations/azure_service_bus.markdown b/source/_integrations/azure_service_bus.markdown index 176f5ba42ccb..e4710c2aa0fa 100644 --- a/source/_integrations/azure_service_bus.markdown +++ b/source/_integrations/azure_service_bus.markdown @@ -28,11 +28,9 @@ You must then create a Shared Access Policy for the Service Bus with `Send` clai Once you have the connection string with `Send` policy, you can set up the integration itself. -<div class='note warning'> - +{% important %} The queue or topic that you are sending to needs to exists with the service bus namespace before you use it within Home Assistant. See [here](https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-quickstart-portal) for how to set up a queue and [here](https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-quickstart-topics-subscriptions-portal) for setting up a topic and subscriptions. - -</div> +{% endimportant %} ## Configuration @@ -52,7 +50,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false type: string default: notify @@ -70,11 +68,9 @@ topic: type: string {% endconfiguration %} -<div class="note"> - +{% tip %} If you plan to send all state changes from one or more entities within Home Assistant, you should consider using the [Azure Event Hub](/integrations/azure_event_hub/) integration instead. - -</div> +{% endtip %} ## Usage diff --git a/source/_integrations/backup.markdown b/source/_integrations/backup.markdown index d437c9d77dbc..e8cc9112199d 100644 --- a/source/_integrations/backup.markdown +++ b/source/_integrations/backup.markdown @@ -25,19 +25,19 @@ The **Backup** {% term integration %} is used for {% term "Home Assistant Core" Note: If you use {% term "Home Assistant Operating System" %} or {% term "Home Assistant Supervised" %} installation, this page is not for you. Instead, refer to the documentation on using the [built-in back up](/common-tasks/os/#backups). -## Services +## Actions -The **Backup** integration exposes a service that can be used to automate the backup +The **Backup** integration exposes an action that can be used to automate the backup process. -### Service {% my developer_call_service service="backup.create" %} +### Action {% my developer_call_service service="backup.create" %} -The {% my developer_call_service service="backup.create" %} service can be used +The {% my developer_call_service service="backup.create" %} action can be used to create a backup for your Home Assistant instance. -The service has no additional options or parameters. +The action has no additional options or parameters. -Example service call: +Example action: ```yaml service: backup.create diff --git a/source/_integrations/bang_olufsen.markdown b/source/_integrations/bang_olufsen.markdown index 4cf90fa4ef72..dc428e6fb614 100644 --- a/source/_integrations/bang_olufsen.markdown +++ b/source/_integrations/bang_olufsen.markdown @@ -22,6 +22,7 @@ The Bang & Olufsen integration enables control of some of the features of certai Devices that have been tested and _should_ work without any trouble are: +- [Beoconnect Core](https://www.bang-olufsen.com/en/dk/accessories/beoconnect-core) - [Beolab 8](https://www.bang-olufsen.com/en/dk/speakers/beolab-8) - [Beolab 28](https://www.bang-olufsen.com/en/dk/speakers/beolab-28) - [Beosound 2 3rd gen](https://www.bang-olufsen.com/en/dk/speakers/beosound-2) @@ -48,11 +49,11 @@ Device model: {% endconfiguration_basic %} -## Services +## Actions -### play_media services +### play_media actions -The Bang & Olufsen integration supports different playback types in the `media_player.play_media` service: playback from URL, activating a favorite, playback from a local file, playing a radio station, activating a Deezer flow and Deezer playlists, albums, tracks, and playing files and text-to-speech (TTS) as an overlay. +The Bang & Olufsen integration supports different playback types in the `media_player.play_media` action: playback from URL, activating a favorite, playback from a local file, playing a radio station, activating a Deezer flow and Deezer playlists, albums, tracks, and playing files and text-to-speech (TTS) as an overlay. #### play_media examples @@ -196,7 +197,7 @@ Bang & Olufsen Cloud TTS messages are limited to 100 unique messages a day and a Extra keys available: -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ------------------------- | -------- | ------------------------------------------------------------------------------------------------- | | `overlay_absolute_volume` | yes | Specify an absolute volume for the overlay. | | `overlay_offset_volume` | yes | Specify a volume offset to be added to the current volume level. | diff --git a/source/_integrations/bbox.markdown b/source/_integrations/bbox.markdown index 667f43a3aeff..4485298921c9 100644 --- a/source/_integrations/bbox.markdown +++ b/source/_integrations/bbox.markdown @@ -24,9 +24,9 @@ There is currently support for the following device types within Home Assistant: - [Presence Detection](#presence-detection) - [Sensor](#sensor) -<div class='note warning'> +{% note %} Due to third party limitation, the sensors will only be available if Home Assistant and the Bbox are on the same local area network. You can check this by going to 192.168.1.254 with your web browser. -</div> +{% endnote %} ## Presence detection @@ -55,9 +55,9 @@ host: default: 192.168.1.254 {% endconfiguration %} -<div class='note warning'> +{% important %} For now and due to third party limitation, the Bbox must be on the same local network as the Home Assistant installation. -</div> +{% endimportant %} See the [device tracker integration page](/integrations/device_tracker/) for instructions how to configure the people to be tracked. diff --git a/source/_integrations/blackbird.markdown b/source/_integrations/blackbird.markdown index 34d800efc72d..7dcf6021c17f 100644 --- a/source/_integrations/blackbird.markdown +++ b/source/_integrations/blackbird.markdown @@ -59,11 +59,11 @@ sources: type: string {% endconfiguration %} -### Service `blackbird.set_all_zones` +### Action `blackbird.set_all_zones` -Set all zones to the same input source. This service allows you to immediately synchronize all the TVs in your home. Regardless of `entity_id` provided, all zones will be updated. +Set all zones to the same input source. This action allows you to immediately synchronize all the TVs in your home. Regardless of `entity_id` provided, all zones will be updated. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------- | | `entity_id` | yes | String that points at an `entity_id` of a zone. | | `source` | no | String of source name to activate. | diff --git a/source/_integrations/blebox.markdown b/source/_integrations/blebox.markdown index 79cb29769d25..c73313fb8e10 100644 --- a/source/_integrations/blebox.markdown +++ b/source/_integrations/blebox.markdown @@ -8,7 +8,6 @@ ha_iot_class: Local Polling ha_config_flow: true ha_codeowners: - '@bbx-a' - - '@riokuu' - '@swistakm' ha_domain: blebox ha_platforms: diff --git a/source/_integrations/blink.markdown b/source/_integrations/blink.markdown index 780c4c1f6741..13ade8425536 100644 --- a/source/_integrations/blink.markdown +++ b/source/_integrations/blink.markdown @@ -28,9 +28,9 @@ ha_integration_type: integration The **Blink** {% term integration %} lets you view camera images and motion events from [Blink](https://blinkforhome.com/) camera and security systems. -<p class='note'> +{% important %} This integration does NOT allow for live viewing of your Blink camera within Home Assistant. -</p> +{% endimportant %} ## Setup @@ -54,13 +54,13 @@ Once Home Assistant starts and you authenticate access, the `blink` integration - A `binary_sensor` motion detection, camera armed status, and battery status. - A `switch` per camera to enable/disable motion detection -Since the cameras are battery operated, polling must be done with care so as to not drain the battery too quickly, or hammer Blink's servers with too many API requests. If an alternate polling rate is desired, disable the "enable poll for updates" option in the Blink integration system options and poll with `homeassistant.update_entity` service. The cameras can be also manually updated via the `trigger_camera` service. As a note, all of the camera-specific sensors are only polled when a new image is requested from the camera. This means that relying on any of these sensors to provide timely and accurate data is not recommended. +Since the cameras are battery operated, polling must be done with care so as to not drain the battery too quickly, or hammer Blink's servers with too many API requests. If an alternate polling rate is desired, disable the "enable poll for updates" option in the Blink integration system options and poll with `homeassistant.update_entity` action. The cameras can be also manually updated via the `trigger_camera` action. As a note, all of the camera-specific sensors are only polled when a new image is requested from the camera. This means that relying on any of these sensors to provide timely and accurate data is not recommended. Please note that each camera reports two different states: one as `sensor.blink_<camera_name>_status` and the other as `binary_sensor.blink_<camera_name>_motion_enabled`. The `motion_enabled` property reports if the `camera` is ready to detect motion **regardless if the system is actually armed**. -## Services +## Actions -Any sequential calls to {% term services %} relating to blink should have a minimum of a 5 second delay in between them to prevent the calls from being throttled and ignored. The services that act on a camera needs a target parameter. +Any sequential calls to {% term actions %} relating to blink should have a minimum of a 5 second delay in between them to prevent the calls from being throttled and ignored. The actions that act on a camera needs a target parameter. ### `blink.record` @@ -74,7 +74,7 @@ Trigger a camera to take a new still image. Save the last recorded video of a camera to a local file. Note that in most cases, Home Assistant will need to know that the directory is writable via the `allowlist_external_dirs` in your {% term "`configuration.yaml`" %} file (see example below). -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------- | | `filename` | no | Location of save file. | @@ -88,30 +88,30 @@ homeassistant: Save the recent video clips of a camera to a local file in the pattern `%Y%m%d_%H%M%S_{name}.mp4`. Note that in most cases, Home Assistant will need to know that the directory is writable via the `allowlist_external_dirs` in your {% term "`configuration.yaml`" %} file. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------- | | `file_path` | no | Location of save files. | ### `blink.send_pin` -Send a new pin to blink. Since Blink's 2FA implementation is new and changing, this is to allow the integration to continue to work with user intervention. The intent is to handle all of this behind the scenes, but until the login implementation is settled this was added. To use it, you simply call the service with the pin you receive from Blink as the payload (for a simple "Allow this Device" email, you may keep the `pin` value empty). +Send a new pin to blink. Since Blink's 2FA implementation is new and changing, this is to allow the integration to continue to work with user intervention. The intent is to handle all of this behind the scenes, but until the login implementation is settled this was added. To use it, perform the action with the pin you receive from Blink as the payload (for a simple "Allow this Device" email, you may keep the `pin` value empty). -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------- | | `config_entry_id` | no | Blink config to send pin to. | | `pin` | no | 2FA Pin received from blink. | -### Other services +### Other actions -In addition to the services mentioned above, there are generic `camera`, `alarm_control_panel`, and `homeassistant` services available. The `camera.enable_motion_detection` and `camera.disable_motion_detection` services allow for individual cameras to be enabled and disabled, respectively, within the Blink system. The `alarm_control_panel.alarm_arm_away` and `alarm_control_panel.alarm_disarm` services allow for the whole system to be armed and disarmed, respectively. The `homeassistant.update_entity` service will force an update of the blink system. Blink Mini cameras linked to an existing sync module cannot be armed/disarmed individually via Home Assistant. +In addition to the actions mentioned above, there are generic `camera`, `alarm_control_panel`, and `homeassistant` actions available. The `camera.enable_motion_detection` and `camera.disable_motion_detection` actions allow for individual cameras to be enabled and disabled, respectively, within the Blink system. The `alarm_control_panel.alarm_arm_away` and `alarm_control_panel.alarm_disarm` actions allow for the whole system to be armed and disarmed, respectively. The `homeassistant.update_entity` action will force an update of the blink system. Blink Mini cameras linked to an existing sync module cannot be armed/disarmed individually via Home Assistant. ## Examples -The following are some examples showing how to correctly make service calls using Blink: +The following are some examples showing how to correctly perform an action using Blink: ### Snap picture and save locally -This example script shows how to take a picture with your camera, named `My Camera` in your Blink app (this is **not necessarily** the friendly name in Home Assistant). After snapping a picture, the image will then be saved to a local directory called `/tmp/my_image.jpg`. Note that this example makes use of services found in the [camera integration](/integrations/camera#service-snapshot) +This example script shows how to take a picture with your camera, named `My Camera` in your Blink app (this is **not necessarily** the friendly name in Home Assistant). After snapping a picture, the image will then be saved to a local directory called `/tmp/my_image.jpg`. Note that this example makes use of actions found in the [camera integration](/integrations/camera#action-snapshot) ```yaml alias: "Blink Snap Picture" @@ -128,7 +128,7 @@ sequence: ### Arm Blink when away -This example automation will arm your blink sync module to detect motion on any of your blink cameras that have motion detection enabled. By default, Blink enables motion detection on all cameras so, unless you've changed anything in your app, you're all set. If you want to manually enable motion detection for individual cameras, you can utilize the [appropriate camera service](/integrations/camera#service-enable_motion_detection) but please note that motion will only be captured if the sync module is armed. +This example automation will arm your blink sync module to detect motion on any of your blink cameras that have motion detection enabled. By default, Blink enables motion detection on all cameras so, unless you've changed anything in your app, you're all set. If you want to manually enable motion detection for individual cameras, you can utilize the [appropriate camera action](/integrations/camera#action-enable_motion_detection) but please note that motion will only be captured if the sync module is armed. Here, this example assumes your blink module is named `My Sync Module` and that you have [device trackers](/integrations/device_tracker) set up for presence detection. diff --git a/source/_integrations/bluesound.markdown b/source/_integrations/bluesound.markdown index 15a44ef2302f..17660309f231 100644 --- a/source/_integrations/bluesound.markdown +++ b/source/_integrations/bluesound.markdown @@ -63,36 +63,36 @@ media_player: - host: 192.168.1.131 ``` -### Service `bluesound.join` +### Action `bluesound.join` Group players together under a single master speaker. That will make a new group or join an existing group. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------- | | `master` | no | A single `entity_id` that will become/hold the master speaker. | | `entity_id` | no | String or list of a single `entity_id` that will group to master speaker. | -### Service `bluesound.unjoin` +### Action `bluesound.unjoin` Remove one or more speakers from a group of speakers. If no `entity_id` is provided, all speakers are unjoined. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------- | | `entity_id` | yes | String or list of `entity_id`s that will be separated from their master speaker. | -### Service `bluesound.set_sleep_timer` +### Action `bluesound.set_sleep_timer` Sets a timer that will turn off the speaker. For each time you call this it will increase the time by one step. The steps are (in minutes): 15, 30, 45, 60, 90, 0. If you increase an ongoing timer of for example 13 minutes, it will increase it to 15. If the timer is set to 90, it will remove the time (hence the 0). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------- | | `entity_id` | no | String or list of `entity_id`s that will have their timers set. | -### Service `bluesound.clear_sleep_timer` +### Action `bluesound.clear_sleep_timer` Clear the sleep timer on a speaker, if one is set. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------- | | `entity_id` | no | String or list of `entity_id`s that will have their timers cleared. | diff --git a/source/_integrations/bluetooth.markdown b/source/_integrations/bluetooth.markdown index c30e1914fe03..d9972c364951 100644 --- a/source/_integrations/bluetooth.markdown +++ b/source/_integrations/bluetooth.markdown @@ -53,7 +53,7 @@ For Bluetooth to function on Linux systems: ### Additional details for Container, Core, and Supervised installs -{% details Making the DBus socket available in the Docker container %} +{% details "Making the DBus socket available in the Docker container" %} For most systems, the Dbus socket is in `/run/dbus`. The socket must be available in the container for Home Assistant to be able to connect to Dbus and access the Bluetooth adapter. When starting with `docker run`, this can be accomplished by adding `-v /run/dbus:/run/dbus:ro` to the command. If the Dbus socket is in `/var/run/dbus` on the host system, use `-v /var/run/dbus:/run/dbus:ro` instead. @@ -66,13 +66,13 @@ volumes: {% enddetails %} -{% details Switching from dbus-daemon to dbus-broker %} +{% details "Switching from dbus-daemon to dbus-broker" %} Follow [the instructions](https://github.com/bus1/dbus-broker/wiki) to switch to dbus-broker. {% enddetails %} -{% details Installing BlueZ %} +{% details "Installing BlueZ" %} On Debian based host systems, the `sudo apt-get -y install bluez` command will install BlueZ. @@ -121,11 +121,11 @@ These adapters generally offer the fastest connect times and do not require addi #### Broadcom (BCM) based adapters -<div class='note warning'> +{% warning %} These adapters may require additional patch files available at <a href="https://github.com/winterheart/broadcom-bt-firmware">https://github.com/winterheart/broadcom-bt-firmware</a> for stable operation. There is currently no supported method to install these patch files when using Home Assistant Operating System. -</div> +{% endwarning %} - ASUS USB-BT400 (BCM20702A0) - Cable Matters 604002-BLK (BCM20702A0) @@ -171,15 +171,15 @@ Performance testing used the following hardware: ### Known working adapters -<div class='note'> +{% note %} Known working adapters list adapters that do not meet high-performance requirements but will generally work. These adapters vary widely in performance and may take as long as thirty seconds or more to establish a connection. These adapters may also miss advertisements such as button presses or temperature updates. -</div> +{% endnote %} #### Realtek RTL8761BU adapters -<div class='note warning'> +{% warning %} These adapters do not have a reset pin. If they stop responding, there is currently no way for the kernel to reset them automatically. A generic USB reset for these adapters has been introduced in Linux kernel 6.1 and later. -</div> +{% endwarning %} - ASUS USB-BT500 (RTL8761BU) - Avantree DG45 (RTL8761BU) diff --git a/source/_integrations/bluetooth_tracker.markdown b/source/_integrations/bluetooth_tracker.markdown index 3f18b8d86cfa..6134b1a0ae6e 100644 --- a/source/_integrations/bluetooth_tracker.markdown +++ b/source/_integrations/bluetooth_tracker.markdown @@ -47,10 +47,10 @@ device_id: In some cases it can be that your device is not discovered. In that case let your phone scan for Bluetooth devices while you restart Home Assistant. Just hit `Scan` on your phone all the time (or keep the Bluetooth device view open on an iOS device) until Home Assistant is fully restarted and the device should appear in `known_devices.yaml`. -The integration will try to create an entity using the device name that is detected. If such an entity already exists (for example because you are already using the [Companion App](https://companion.home-assistant.io/) for this device) no entity will be created and the log file will show an error that the `The see service is not supported for this entity device_tracker.device` (as it is not a `device_tracker` entity). You can rename the other conflicting entity, next time the device is detected a new entity with the same name will be created. +The integration will try to create an entity using the device name that is detected. If such an entity already exists (for example because you are already using the [Companion App](https://companion.home-assistant.io/) for this device) no entity will be created and the log file will show an error that the `The see action is not supported for this entity device_tracker.device` (as it is not a `device_tracker` entity). You can rename the other conflicting entity, next time the device is detected a new entity with the same name will be created. For additional configuration variables check the [Device tracker page](/integrations/device_tracker/). -## `bluetooth_tracker.update` service +## `bluetooth_tracker.update` action -The `bluetooth_tracker.update` service can be used to manually trigger a Bluetooth scan. An example of when this service can be useful is to trigger scans based on other events like doors being opened, beacons are in range or buttons are pressed. +The `bluetooth_tracker.update` action can be used to manually trigger a Bluetooth scan. An example of when this action can be useful is to trigger scans based on other events like doors being opened, beacons are in range or buttons are pressed. diff --git a/source/_integrations/bmw_connected_drive.markdown b/source/_integrations/bmw_connected_drive.markdown index 06a9f7ae834c..33d226fd6363 100644 --- a/source/_integrations/bmw_connected_drive.markdown +++ b/source/_integrations/bmw_connected_drive.markdown @@ -37,9 +37,9 @@ The **BMW Connected Drive** {% term integration %} lets you retrieve data of you The **BMW Connected Drive** {% term integration %} also works with (recent) Mini vehicles. You need to have a working Mini Connected account, and a Mini Connected enabled vehicle for this to work. -<div class='note'> +{% note %} The {% term entities %} available in Home Assistant heavily depend on your vehicle's capabilities (model year, headunit, etc.). The integration will make sure all available car attributes are added as entities. -</div> +{% endnote %} For compatibility with your BMW vehicle check the [bimmer_connected page](https://github.com/bimmerconnected/bimmer_connected) on GitHub. @@ -59,22 +59,20 @@ This integration provides the following platforms: Enable the `BMW Connected Drive` integration via **Settings** -> **Devices & Services**. -<div class='note'> - - For `china`, it is mandatory to prefix your username/phone number with `86`, i.e. `8612345678`. - -</div> +{% note %} +For `china`, it is mandatory to prefix your username/phone number with `86`, i.e. `8612345678`. +{% endnote %} After connecting to your account, you can set the following settings in the integration's options: | Setting | Description | |---------|-------------| -| Read-only | No execution of services to the vehicle. Still possible to send messages and POIs via `notify` and to request a status update via `bmw_connected_drive.update_state`. +| Read-only | No execution of actions to the vehicle. Still possible to send messages and POIs via `notify` and to request a status update via `bmw_connected_drive.update_state`. ## Notifications -The `bmw_connected_drive` integration offers a notification service. Using this service you can send Points of Interest (POI) to your vehicle. In your vehicle you can select this POI and the navigation will automatically start using the POI as a destination. -The name of the service is `notify.bmw_connected_drive_<your_vehicle>`. +The `bmw_connected_drive` integration offers a notification action. Using this action you can send Points of Interest (POI) to your vehicle. In your vehicle you can select this POI and the navigation will automatically start using the POI as a destination. +The name of the action is `notify.bmw_connected_drive_<your_vehicle>`. ### Send a Point of Interest to your vehicle @@ -100,15 +98,15 @@ The vehicle can be locked and unlocked via the lock integration that is created ## Buttons -The `bmw_connected_drive` integration offers several buttons to trigger actions in your car. The buttons are automatically created and can be pressed/executed from the UI or using the `button.press` service. Please see the [button documentation](/integrations/button/) for more information. +The `bmw_connected_drive` integration offers several buttons to trigger actions in your car. The buttons are automatically created and can be pressed/executed from the UI or using the `button.press` action. Please see the [button documentation](/integrations/button/) for more information. -Using these buttons will impact the state of your vehicle. So use these services with care! +Using these buttons will impact the state of your vehicle. So use these with care! ### Air conditioning The air conditioning of the vehicle can be activated with the `button.<your_vehicle>_activate_air_conditioning` button. -What exactly is started here depends on the type of vehicle. It might range from just ventilation over auxiliary heating to real air conditioning. If your vehicle is equipped with auxiliary heating, only trigger this service if the vehicle is parked in a location where it is safe to use it (e.g., not in an underground parking or closed garage). +What exactly is started here depends on the type of vehicle. It might range from just ventilation over auxiliary heating to real air conditioning. If your vehicle is equipped with auxiliary heating, only trigger this action if the vehicle is parked in a location where it is safe to use it (e.g., not in an underground parking or closed garage). ### Sound the horn @@ -122,22 +120,18 @@ The `button.<your_vehicle>_light_flash` button flashes the lights of the vehicle The `button.<your_vehicle>_find_vehicle` button requests the vehicle to update the GPS location. This can be used for older vehicles which don't automatically send the updated GPS location. -<div class="note warning"> - - Using this service will **send your Home Assistant location to BMW**, as this is required by the API (like sharing your mobile phone's location with the MyBMW app for vehicle tracking). - If you do not want this, trigger the `vehicle_finder` service from your phone and it should update in Home Assistant within 5 minutes. - -</div> - -<div class="note"> - - On some older cars (non i3/i8 series produced before 7/2014) this service will fail in getting your vehicles position, if the vehicle is more than 1.5 km away from the location of your Home Assistant instance. This is a limitation of the BMW API. +{% warning %} +Using this action will **send your Home Assistant location to BMW**, as this is required by the API (like sharing your mobile phone's location with the MyBMW app for vehicle tracking). +If you do not want this, trigger the `vehicle_finder` action from your phone and it should update in Home Assistant within 5 minutes. +{% endwarning %} -</div> +{% note %} +On some older cars (non i3/i8 series produced before 7/2014) this action will fail in getting your vehicles position, if the vehicle is more than 1.5 km away from the location of your Home Assistant instance. This is a limitation of the BMW API. +{% endnote %} ## Selects -If you have a (PH)EV, you can control the charging process through Home Assistant. The selects are created automatically depending on your vehicle's capabilities and can be pressed/executed from the UI or using the `select.select_option` service. For more information, please see the [select documentation](/integrations/select/). +If you have a (PH)EV, you can control the charging process through Home Assistant. The selects are created automatically depending on your vehicle's capabilities and can be pressed/executed from the UI or using the `select.select_option` action. For more information, please see the [select documentation](/integrations/select/). Using these selects will impact the state of your vehicle. Use them with care! @@ -146,7 +140,7 @@ Using these selects will impact the state of your vehicle. Use them with care! ## Switches -If supported by your vehicle, you can display and toggle remote services with start/stop functionality. +If supported by your vehicle, you can display and toggle remote actions with start/stop functionality. Using these selects will impact the state of your vehicle, use them with care! @@ -155,7 +149,7 @@ Using these selects will impact the state of your vehicle, use them with care! ## Numbers -If you have a (PH)EV, you can control the charging process through Home Assistant. The number entities are created automatically depending on your vehicle's capabilities and can be changed from the UI or using the `number.set_value` service. For more information, please see the [number documentation](/integrations/number/). +If you have a (PH)EV, you can control the charging process through Home Assistant. The number entities are created automatically depending on your vehicle's capabilities and can be changed from the UI or using the `number.set_value` action. For more information, please see the [number documentation](/integrations/number/). Using these selects will impact the state of your vehicle, use them with care! diff --git a/source/_integrations/bond.markdown b/source/_integrations/bond.markdown index 6ccff2d525c6..8b3c83b33fee 100644 --- a/source/_integrations/bond.markdown +++ b/source/_integrations/bond.markdown @@ -63,42 +63,42 @@ upgrade your firmware from Bond app before adding this integration. Firmware version 2.10.8 or newer is required for push updates. The integration will fallback to polling for 2.10.x versions lower than .8 -### Service `bond.set_fan_speed_tracked_state` +### Action `bond.set_fan_speed_tracked_state` Sets the tracked fan speed for a bond fan. -Calling this service will change the tracked speed of the fan but not transmit any signal to make the device change speed. +Calling this action will change the tracked speed of the fan but not transmit any signal to make the device change speed. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings of `entity_id`s. | `speed` | no | Speed as a percentage. -### Service `bond.set_switch_power_tracked_state` +### Action `bond.set_switch_power_tracked_state` Sets the tracked power state of a bond switch. -Calling this service will change the tracked power state of any bond switch but not transmit any signal to make the device change its state. +Calling this action will change the tracked power state of any bond switch but not transmit any signal to make the device change its state. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings of `entity_id`s. | `power_state` | no | Boolean power state. -### Service `bond.set_light_power_tracked_state` +### Action `bond.set_light_power_tracked_state` Sets the tracked power state of a bond light. -Calling this {% term service %} will change the tracked power state of any bond light but not transmit any signal to make the device change its state. +Calling this {% term action %} will change the tracked power state of any bond light but not transmit any signal to make the device change its state. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings of `entity_id`s. | `power_state` | no | Boolean power state. -### Service `bond.set_light_brightness_tracked_state` +### Action `bond.set_light_brightness_tracked_state` Sets the tracked brightness state of a bond light -Calling this {% term service %} will change the tracked brightness state of any bond light but not transmit any signal to make the device change its state. +Calling this {% term action %} will change the tracked brightness state of any bond light but not transmit any signal to make the device change its state. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings of `entity_id`s. | `brightness` | no | brightness as an integer between 0 and 255 diff --git a/source/_integrations/braviatv.markdown b/source/_integrations/braviatv.markdown index 2d790922dd89..83e5c4c41455 100644 --- a/source/_integrations/braviatv.markdown +++ b/source/_integrations/braviatv.markdown @@ -107,9 +107,9 @@ media_player: {% enddetails %} -## Play media service +## Play media action -The `play_media` {% term service %} can be used in an {% term automation %} or {% term script %} to switch to a specified application or TV channel. It selects the best matching application or channel according to the `media_content_id`: +The `play_media` {% term action %} can be used in an {% term automation %} or {% term script %} to switch to a specified application or TV channel. It selects the best matching application or channel according to the `media_content_id`: 1. Channel number *(i.e., '1' or '6')* 2. Exact app or channel name *(i.e., 'Google Play' or 'CNN')* @@ -151,9 +151,9 @@ data: ## Remote -The {% term integration %} supports `remote` {% term platform %}. It allows you to send remote control commands to your TV with the `remote.send_command` service. +The {% term integration %} supports `remote` {% term platform %}. It allows you to send remote control commands to your TV with the `remote.send_command` action. -The commands that can be sent to the TV depend on the model of your TV. To display a list of supported commands for your TV, call the {% term service %} `remote.send_command` with non-valid command (e.g. `Test`). A list of available commands will be displayed in [Home Assistant System Logs](https://my.home-assistant.io/redirect/logs). +The commands that can be sent to the TV depend on the model of your TV. To display a list of supported commands for your TV, call the {% term action %} `remote.send_command` with non-valid command (e.g. `Test`). A list of available commands will be displayed in [Home Assistant System Logs](https://my.home-assistant.io/redirect/logs). **Example to send `Down` key command:** @@ -216,7 +216,7 @@ See [Using with Google Cast](#using-with-google-cast) section for more details. ### Power consumption ~15 W when the TV in standby mode while integration is enabled -The Bravia TV is [local pulling integration](https://www.home-assistant.io/blog/2016/02/12/classifying-the-internet-of-things/#polling-the-local-device). Even if the TV is turned off, its status is constantly polled to determine the current state, so the TV's network interface remains enabled. This is normal behavior. If you are concerned about this, you can disable polling for updates in the integration **System options** menu, but the TV status will no longer update automatically and you will have to force the {% term entity %} update by calling `homeassistant.update_entity` {% term service %} manually. +The Bravia TV is [local pulling integration](https://www.home-assistant.io/blog/2016/02/12/classifying-the-internet-of-things/#polling-the-local-device). Even if the TV is turned off, its status is constantly polled to determine the current state, so the TV's network interface remains enabled. This is normal behavior. If you are concerned about this, you can disable polling for updates in the integration **System options** menu, but the TV status will no longer update automatically and you will have to force the {% term entity %} update by calling `homeassistant.update_entity` {% term action %} manually. Please note that this behavior can be caused not only by the integration, but also by some applications installed on the TV. diff --git a/source/_integrations/bring.markdown b/source/_integrations/bring.markdown index 4adf1643c18e..15fb893c8c4e 100644 --- a/source/_integrations/bring.markdown +++ b/source/_integrations/bring.markdown @@ -30,15 +30,15 @@ For authentication, the integration requires the `email` and `password` you used {% include integrations/config_flow.md %} -## Services +## Actions -You can use the services from the [to-do list](/integrations/todo/) to create, update, or delete items on your Bring! shopping lists. +You can use the actions from the [to-do list](/integrations/todo/) to create, update, or delete items on your Bring! shopping lists. ### Notifications -The **Bring** integration offers a service to send push notifications to the Bring! mobile apps of other members of a shared shopping list. The Bring! mobile app has 4 predefined notification types. Note: If you want to receive these notifications yourself, you need to use a dedicated account as mentioned above. +The **Bring** integration offers an action to send push notifications to the Bring! mobile apps of other members of a shared shopping list. The Bring! mobile app has 4 predefined notification types. Note: If you want to receive these notifications yourself, you need to use a dedicated account as mentioned above. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- | | `target` | no | Target Bring! list(s) whose members should be notified. | | `message` | no | Type of push notification to send to list members. See [Notification types](#available-notification-types). | diff --git a/source/_integrations/broadlink.markdown b/source/_integrations/broadlink.markdown index ffd66c4926fe..63f93e02fa7f 100644 --- a/source/_integrations/broadlink.markdown +++ b/source/_integrations/broadlink.markdown @@ -20,8 +20,10 @@ ha_platforms: - climate - light - remote + - select - sensor - switch + - time ha_dhcp: true ha_integration_type: integration related: @@ -29,7 +31,11 @@ related: title: Configuration file --- -The **Broadlink** {% term integration %} allows you to control and monitor Broadlink universal remotes, smart plugs, power strips, switches and sensors. The following devices are supported: +The **Broadlink** {% term integration %} allows you to control and monitor Broadlink universal remotes, smart plugs, power strips, switches and sensors. + +The manufacturer's app is required in order to connect new devices to the network. + +The following devices are supported: - Thermostats: `Hysen HY02B05H` and `Floureon HY03WE` - Power Strips: `MP1-1K3S2U` and `MP1-1K4S` @@ -51,9 +57,11 @@ The {% term entities %} are divided into four subdomains: - [Climate](#climate) - [Remote](#remote) +- [Select](#select) - [Sensor](#sensor) - [Switch](#switch) - [Light](#light) +- [Time](#time) ## Climate @@ -65,9 +73,9 @@ The `remote` {% term entities %} allow you to learn and send codes with universa ### Learning commands -Use `remote.learn_command` to learn IR and RF codes. These codes are grouped by device and stored as commands in the [storage folder](#learned-codes-storage-location). They can be sent with the `remote.send_command` service later. +Use `remote.learn_command` to learn IR and RF codes. These codes are grouped by device and stored as commands in the [storage folder](#learned-codes-storage-location). They can be sent with the `remote.send_command` action later. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------- | | `entity_id` | no | ID of the remote. | | `device` | no | Name of the device to be controlled. | @@ -118,7 +126,7 @@ When the LED blinks for the first time, press and hold the button to sweep the f The codes will be stored in the same way as the IR codes. You don't need to specify `command_type` to send them because this information is stored in the first byte of the code. -_Tip:_ Click Notifications in the sidebar after calling the service and follow the instructions to make sure you are pressing the button at the right time. +_Tip:_ Click Notifications in the sidebar after using the action and follow the instructions to make sure you are pressing the button at the right time. #### Learning a sequence of commands @@ -141,7 +149,7 @@ script: - volume down ``` -After calling this service, you will be prompted to press the buttons in the same order as provided. Check the notifications to stay on track and make sure you are pressing the right button at the right time. +After using this action, you will be prompted to press the buttons in the same order as provided. Check the notifications to stay on track and make sure you are pressing the right button at the right time. #### Learning an alternative code @@ -173,9 +181,9 @@ The learned codes are stored in `/config/.storage/` in a JSON file called `broad ### Sending commands -After learning IR and RF codes with the `remote.learn_command` service, you can use `remote.send_command` to send them. You can also use this service to send base64 codes taken from elsewhere. +After learning IR and RF codes with the `remote.learn_command` action, you can use `remote.send_command` to send them. You can also use this action to send base64 codes taken from elsewhere. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------- | | `entity_id` | no | ID of the remote. | | `command` | no | Names of the commands to be sent or base64 codes prefixed with `b64:`. | @@ -292,9 +300,9 @@ script: ### Deleting commands -You can use `remote.delete_command` to remove commands that you've learned with the `remote.learn_command` service. +You can use `remote.delete_command` to remove commands that you've learned with the `remote.learn_command` action. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------ | | `entity_id` | no | ID of the remote. | | `device` | no | Name of the device. | @@ -337,6 +345,10 @@ script: - menu ``` +## Select + +The `select` {% term entities %} allow you to control the weekday of your Broadlink devices. These entities are created automatically when you configure supported devices. + ## Sensor The `sensor` {% term entities %} allow you to monitor Broadlink sensors. These entities are created automatically when you configure a device that has sensors. @@ -345,6 +357,10 @@ The `sensor` {% term entities %} allow you to monitor Broadlink sensors. These e The `light` {% term entities %} allow you to control Broadlink lights. You can turn them on and off, change brightness, adjust the color or set a color temperature. These entities are created automatically when you configure a device that has lights. +## Time + +The `time` {% term entities %} allow you to control the time of Broadlink devices. These entities are created automatically when you configure supported devices. + ## Switch The `switch` {% term entities %} allow you to control and monitor Broadlink smart plugs, power strips and switches. You can turn them on and off, and you can monitor their state and power consumption, when available. These entities are created automatically when you configure a device that has switches. diff --git a/source/_integrations/brother.markdown b/source/_integrations/brother.markdown index c33622be83cb..4da9e1436858 100644 --- a/source/_integrations/brother.markdown +++ b/source/_integrations/brother.markdown @@ -24,11 +24,9 @@ The integration monitors every supported part. {% include integrations/config_flow.md %} -<div class="note warning"> - +{% note %} Some very old Brother printers use different data format and these models are not supported. The integration will show information about that during configuration. - -</div> +{% endnote %} ## Configuring the printer diff --git a/source/_integrations/browser.markdown b/source/_integrations/browser.markdown index 0e19a364a2dc..11500fa401c2 100644 --- a/source/_integrations/browser.markdown +++ b/source/_integrations/browser.markdown @@ -13,7 +13,7 @@ related: title: Configuration file --- -The **Browser** {% term integration %} provides a service to open URLs in the default browser on the host machine. +The **Browser** {% term integration %} provides a action to open URLs in the default browser on the host machine. ## Configuration @@ -25,19 +25,19 @@ To load this integration, add the following lines to your {% term "`configuratio browser: ``` -### Services +### Actions -Once loaded, the `browser` platform will expose {% term services %} that can be called to perform various {% term actions %}. +Once loaded, the `browser` platform will expose {% term actions %} that can be called to perform various {% term actions %}. -Available services: `browser/browse_url`. +Available actions: `browser/browse_url`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------- | | `url` | no | The URL to open. | ### Usage -To use this {% term service %}, choose **Call Service** from the **Developer Tools**. Choose the service *browser/browse_url* from the list of **Available services:** and enter the URL into the **Service Data** field and hit **CALL SERVICE**. +To use this {% term action %}, select the **Actions** tab from the **Developer Tools**. Choose the action *browser/browse_url* from the list of **Actions:** and enter the URL into the **data** field and select **Perform action**. ```json {"url": "http://www.google.com"} diff --git a/source/_integrations/brunt.markdown b/source/_integrations/brunt.markdown index c83d6ddb51b9..a158866fccc7 100644 --- a/source/_integrations/brunt.markdown +++ b/source/_integrations/brunt.markdown @@ -16,8 +16,8 @@ ha_integration_type: integration The **Brunt Blind Energy** {% term integration %} allows one to control Blind Engines by [Brunt](https://www.brunt.co). To use it, you need a Brunt App Account. All Brunt Blind devices registered to your account are automatically added to your Home Assistant with the names given them through the Brunt app. -<div class='note warning'> +{% warning %} This integration is not affiliated with Brunt and retrieves data from the endpoints of the mobile application. Use at your own risk. -</div> +{% endwarning %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/buienradar.markdown b/source/_integrations/buienradar.markdown index 0adae5b40839..9ae04423f9a9 100644 --- a/source/_integrations/buienradar.markdown +++ b/source/_integrations/buienradar.markdown @@ -116,9 +116,9 @@ timeframe: description: Minutes to look ahead for precipitation forecast sensors (minimum 5, maximum 120). {% endconfiguration_basic %} -<div class='note'> +{% note %} **Usage statement** Buienradar makes free weather data available for use by individuals and businesses (website/intranet). The use of the weather data is allowed for **non-commercial purposes**. Please refer to the [full usage statement](https://www.buienradar.nl/overbuienradar/gratis-weerdata) to confirm your use or to request permission. -</div> +{% endnote %} diff --git a/source/_integrations/button.markdown b/source/_integrations/button.markdown index ae885ea9ae84..a99b6a0441c0 100644 --- a/source/_integrations/button.markdown +++ b/source/_integrations/button.markdown @@ -31,7 +31,7 @@ The button {% term entity %} is stateless, as in, it cannot have a state like th Every button entity does keep track of the timestamp of when the last time the button entity has been pressed in the Home Assistant UI or pressed via -a service call. +an action. 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: @@ -46,11 +46,11 @@ action: message: "My button has been pressed!" ``` -## Services +## Actions -The button entities exposes a single {% term service %}: {% my developer_call_service service="button.press" %} +The button entities exposes a single {% term action %}: {% my developer_call_service service="button.press" %} -This service can be called to trigger a button press for that entity. +This action can be called to trigger a button press for that entity. ```yaml - service: button.press diff --git a/source/_integrations/button.mqtt.markdown b/source/_integrations/button.mqtt.markdown index e3393dc32296..b84e055f58e9 100644 --- a/source/_integrations/button.mqtt.markdown +++ b/source/_integrations/button.mqtt.markdown @@ -8,7 +8,7 @@ ha_iot_class: Configurable ha_domain: mqtt --- -The `mqtt` button platform lets you send an MQTT message when the button is pressed in the frontend or the button press service is called. This can be used to expose some service of a remote device, for example reboot. +The `mqtt` button platform lets you send an MQTT message when the button is pressed in the frontend or the button press action is called. This can be used to expose some service of a remote device, for example reboot. ## Configuration @@ -183,11 +183,9 @@ unique_id: type: string {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/caldav.markdown b/source/_integrations/caldav.markdown index 8b2fe35ce7d3..596f363adbaf 100644 --- a/source/_integrations/caldav.markdown +++ b/source/_integrations/caldav.markdown @@ -21,7 +21,6 @@ related: title: To-do list card - docs: /integrations/calendar title: Calendar -related: - docs: /docs/configuration/ title: Configuration file --- @@ -53,7 +52,7 @@ This integration was tested against the following systems, but any other complyi You may also manually add a WebDAV calendar in Home Assistant by adding the following section to your {% term "`configuration.yaml`" %} file. This method does not support to-do lists. {% include integrations/restart_ha_after_config_inclusion.md %} -{% details Manual configuration examples %} +{% details "Manual configuration examples" %} ```yaml # Example configuration.yaml entry for baikal @@ -177,11 +176,9 @@ See [Calendar Automations](/integrations/calendar#automation) for an overview, a The calendar entity has additional attributes related to a single next upcoming event. -<div class='note'> - +{% tip %} Using the entity state and attributes is more error prone and less flexible than using Calendar Automations. The calendar entity itself may only track a single upcoming active event and can't handle multiple events with the same start time, or overlapping events. - -</div> +{% endtip %} - **offset_reached**: If set in the event title and parsed out will be on/off once the offset in the title in minutes is reached. So the title Very important meeting `!! -10` would trigger this attribute to be on 10 minutes before the event starts. This should be in the format of `HH:MM` or `MM`. This attribute is not available when configured from the UI. - **all_day**: `True/False` if this is an all day event. Will be `False` if there is no event found. @@ -195,7 +192,7 @@ Using the entity state and attributes is more error prone and less flexible than The todo entity is the number of incomplete items on the to-do list. See the [todo integration](/integrations/todo) documentation for details and available -services that can be used in automations. +actions that can be used in automations. ## Troubleshooting diff --git a/source/_integrations/calendar.markdown b/source/_integrations/calendar.markdown index 231c3f6c5e18..6026e32bf820 100644 --- a/source/_integrations/calendar.markdown +++ b/source/_integrations/calendar.markdown @@ -32,7 +32,7 @@ Some calendar integrations allow Home Assistant to manage your calendars directly from Home Assistant. In this case, you can add new events by selecting the **Add event** button in the lower right corner of the calendar dashboard. -Also see [Services](#services) below. +Also see [Actions](#actions) below. ## Automation @@ -139,16 +139,16 @@ automation: {% enddetails %} -## Services +## Actions Some calendar {% term integrations %} allow Home Assistant to manage your calendars -directly using {% term services %}. The services provided by some calendar {% term entity %} are described below or you can read more about [Service Calls](/docs/scripts/service-calls/). +directly using {% term actions %}. The actions provided by some calendar {% term entity %} are described below or you can read more about [actions](/docs/scripts/service-calls/). -### Service `calendar.create_event` +### Action `calendar.create_event` Add a new calendar event. A calendar `target` is selected with a [Target Selector](/docs/blueprint/selectors/#target-selector) and the `data` payload supports the following fields: -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `summary` | no | Acts as the title of the event. | Bowling | `description` | yes | The description of the event. | Birthday bowling @@ -160,11 +160,9 @@ Add a new calendar event. A calendar `target` is selected with a [Target Selecto | `location` | yes | The location of the event. | Bowling center -<div class='note'> - +{% note %} You either use `start_date_time` and `end_date_time`, or `start_date` and `end_date`, or `in`. - -</div> +{% endnote %} This is a full example of a {% term service %} call in YAML: @@ -193,22 +191,20 @@ data: {% endraw %} -### Service `calendar.get_events` +### Action `calendar.get_events` -This service populates [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) +This action populates [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with calendar events within a date range. It can return events from multiple calendars. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `start_date_time` | yes | Return active events after this time (exclusive). When not set, defaults to now. | 2019-03-10 20:00:00 | `end_date_time` | yes | Return active events before this time (exclusive). Cannot be used with `duration`. You must specify either `end_date_time` or `duration`.| 2019-03-10 23:00:00 | `duration` | yes | Return active events from `start_date_time` until the specified duration. Cannot be used with `end_date_time`. You must specify either `duration` or `end_date_time`. | `days: 2` -<div class='note'> - +{% note %} Use only one of `end_date_time` or `duration`. - -</div> +{% endnote %} ```yaml service: calendar.get_events @@ -233,7 +229,7 @@ Every calendar entity has a field `events` containing a list of events with thes | `end` | The date or date time the event ends (exclusive). | 2019-03-10 23:00:00 | `location` | The location of the event. | Bowling center -This example uses a template with response data in another service call: +This example uses a template with response data in another action: {% raw %} ```yaml diff --git a/source/_integrations/camera.markdown b/source/_integrations/camera.markdown index 4704d1e46d37..8cc146343683 100644 --- a/source/_integrations/camera.markdown +++ b/source/_integrations/camera.markdown @@ -22,40 +22,40 @@ The camera integration allows you to use IP cameras with Home Assistant. If your camera supports it, and the [`stream`](/integrations/stream) integration is setup, you will be able to stream your cameras in the frontend and on supported media players. -The `Preload stream` option will start the camera feed on Home Assistant startup and continue to keep the stream alive. This will result in reduced latency when opening the stream in the frontend, as well as when using the `play_stream` service or Google Assistant integration. It does, however, utilize more resources on your machine, so it is recommended to check CPU usage if you plan to use this feature. +The `Preload stream` option will start the camera feed on Home Assistant startup and continue to keep the stream alive. This will result in reduced latency when opening the stream in the frontend, as well as when using the `play_stream` action or Google Assistant integration. It does, however, utilize more resources on your machine, so it is recommended to check CPU usage if you plan to use this feature. <p class='img'> <img src='/images/integrations/camera/preload-stream.png' alt='Screenshot showing Preload Stream option in Home Assistant front end.'> Example showing the Preload Stream option in the camera dialog. </p> -### Services +### Actions -Once loaded, the `camera` platform will expose services that can be called to perform various actions. +Once loaded, the `camera` platform will expose actions that can be called to perform various actions. -Available services: `enable_motion_detection`, `disable_motion_detection`, `play_stream`, `record`, `snapshot`, `turn_off` and `turn_on`. +Available actions: `enable_motion_detection`, `disable_motion_detection`, `play_stream`, `record`, `snapshot`, `turn_off` and `turn_on`. -#### Service `enable_motion_detection` +#### Action `enable_motion_detection` Enable the motion detection in a camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------- | | `entity_id` | yes | Name(s) of entities to enable motion detection, e.g., `camera.living_room_camera`. | -#### Service `disable_motion_detection` +#### Action `disable_motion_detection` Disable the motion detection in a camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------- | | `entity_id` | yes | Name(s) of entities to disable motion detection, e.g., `camera.living_room_camera`. | -#### Service `play_stream` +#### Action `play_stream` Play a live stream from a camera to selected media player(s). Requires [`stream`](/integrations/stream) integration to be set up. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------- | | `entity_id` | no | Name of entity to fetch stream from, e.g., `camera.living_room_camera`. | | `media_player` | no | Name of media player to play stream on, e.g., `media_player.living_room_tv`. | @@ -72,13 +72,13 @@ action: media_player: media_player.chromecast ``` -#### Service `record` +#### Action `record` Make a `.mp4` recording from a camera stream. Requires `stream` integration to be set up. Both `duration` and `lookback` options are suggestions, but should be consistent per camera. The actual length of the recording may vary. It is suggested that you tweak these settings to fit your needs. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Name(s) of entities to create a snapshot from, e.g., `camera.living_room_camera`. | | `filename` | no | Template of a file name. Variable is `entity_id`, e.g., {% raw %}`/tmp/{{ entity_id.name }}.mp4`{% endraw %}. | @@ -102,11 +102,11 @@ action: {% endraw %} -#### Service `snapshot` +#### Action `snapshot` Take a snapshot from a camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | | `entity_id` | no | Name(s) of entities to create a snapshot from, e.g., `camera.living_room_camera`. | | `filename` | no | Template of a file name. Variable is `entity_id`, e.g., {% raw %}`/tmp/snapshot_{{ entity_id.name }}`{% endraw %}. | @@ -128,25 +128,25 @@ action: {% endraw %} -#### Service `turn_off` +#### Action `turn_off` -Turn off camera. Not all camera models support this service, please consult individual camera page. +Turn off camera. Not all camera models support this action, please consult individual camera page. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------- | | `entity_id` | yes | Name(s) of entities to turn off, e.g., `camera.living_room_camera`. | -#### Service `turn_on` +#### Action `turn_on` -Turn on camera. Not all camera models support this service, please consult individual camera page. +Turn on camera. Not all camera models support this action, please consult individual camera page. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------ | | `entity_id` | yes | Name(s) of entities to turn on, e.g., `camera.living_room_camera`. | ### Test if it works -A simple way to test if you have set up your `camera` platform correctly, is to use **Services** from the **Developer Tools**. Choose your service from the dropdown menu **Service**, enter something like the sample below into the **Service Data** field, and hit **CALL SERVICE**. +A way to test if you have set up your `camera` platform correctly, is to use **Actions** from the **Developer Tools**. Choose your action from the dropdown menu **Action**, enter something like the sample below into the **data** field, and select **Perform action**. ```yaml entity_id: camera.living_room_camera diff --git a/source/_integrations/cast.markdown b/source/_integrations/cast.markdown index 2a880e2b4abf..718244cd5b0b 100644 --- a/source/_integrations/cast.markdown +++ b/source/_integrations/cast.markdown @@ -33,7 +33,7 @@ Ignore CEC: ## Home Assistant Cast -Home Assistant has its own Cast application to show the Home Assistant UI on any Chromecast device. You can use it by adding the [Cast entity row](/dashboards/entities/#cast) to your dashboards, or by calling the `cast.show_lovelace_view` service. The service takes the path of a dashboard view and an entity ID of a Cast device to show the view on. A `path` has to be defined in your dashboard's YAML for each view, as outlined in the [views documentation](/dashboards/views/#path). The `dashboard_path` is the part of the dashboard URL that follows the defined `base_url`, typically "`lovelace`". The following is a full configuration for a script that starts casting the `downstairs` tab of the `lovelace-cast` path (note that `entity_id` is specified under `data` and not for the service call): +Home Assistant has its own Cast application to show the Home Assistant UI on any Chromecast device. You can use it by adding the [Cast entity row](/dashboards/entities/#cast) to your dashboards, or by calling the `cast.show_lovelace_view` action. The action takes the path of a dashboard view and an entity ID of a Cast device to show the view on. A `path` has to be defined in your dashboard's YAML for each view, as outlined in the [views documentation](/dashboards/views/#path). The `dashboard_path` is the part of the dashboard URL that follows the defined `base_url`, typically "`lovelace`". The following is a full configuration for a script that starts casting the `downstairs` tab of the `lovelace-cast` path (note that `entity_id` is specified under `data` and not for the action): ```yaml cast_downstairs_on_kitchen: @@ -46,21 +46,19 @@ cast_downstairs_on_kitchen: service: cast.show_lovelace_view ``` -<div class='note'> - +{% important %} Home Assistant Cast requires your Home Assistant installation to be accessible via `https://`. If you're using Home Assistant Cloud, you don't need to do anything. Otherwise you must make sure that you have configured the `external_url` in your [configuration](/integrations/homeassistant/#configuration-variables). - -</div> +{% endimportant %} ## Playing media -<div class='note'> +{% note %} Chromecasts generally ignore DNS servers from DHCP and will instead use Google's DNS servers, 8.8.8.8 and 8.8.4.4. This means media URLs must either be specifying the IP-address of the server directly, e.g. `http://192.168.1.1:8123/movie.mp4`, or be publicly resolvable, e.g. `http://homeassistant.internal.mydomain.com:8123/movie.mp4` where `homeassistant.internal.mydomain.com` resolves to `192.168.1.1`. A hostname which can't be publicly resolved, e.g. `http://homeassistant.local:8123/movie.mp4` will fail to play. This is important when casting TTS or local media sources; the cast integration will cast such media from the `external_url` if [configured](/integrations/homeassistant/#editing-the-general-settings-in-yaml), otherwise from the Home Assistant Cloud if configured, otherwise from the [`internal_url`](/integrations/homeassistant/#editing-the-general-settings-in-yaml). Note that the Home Assistant Cloud will not be used if an `external_url` is configured. -</div> +{% endnote %} ### Using the built in media player app (Default Media Receiver) @@ -68,7 +66,7 @@ Chromecasts can play many kinds of modern [media (image/audio/video) formats](ht The media needs to be accessible via HTTP(S). Chromecast devices do not support other protocols like DLNA or playback from an SMB file share. -You can play MP3 streams like net radios, FLAC files or videos from your local network with the `media_player.play_media` service, as long as the media is accessible via HTTP(S). You need to set the `media_content_id` to the media URL and `media_content_type` to a matching content type. +You can play MP3 streams like net radios, FLAC files or videos from your local network with the `media_player.play_media` action, as long as the media is accessible via HTTP(S). You need to set the `media_content_id` to the media URL and `media_content_type` to a matching content type. ```yaml # Play a video file from the local network: @@ -90,7 +88,7 @@ data: media_content_id: "http://via.placeholder.com/1024x600.jpg/0B6B94/FFFFFF/?text=Hello,%20Home%20Assistant!" ``` -Extra media metadata (for example title, subtitle, artist or album name) can be passed into the service and that will be shown on the Chromecast display. +Extra media metadata (for example title, subtitle, artist or album name) can be passed into the action and that will be shown on the Chromecast display. For the possible metadata types and values check [Google cast documentation > MediaInformation > metadata field](https://developers.google.com/cast/docs/reference/messages#MediaInformation). ```yaml @@ -325,7 +323,7 @@ Example values to cast the item at <https://tv.nrk.no/serie/uti-vaar-hage/sesong ### Plex -To cast media directly from a configured Plex server, set the fields [as documented in the Plex integration](/integrations/plex/#service-media_playerplay_media) and prepend the `media_content_id` with `plex://`: +To cast media directly from a configured Plex server, set the fields [as documented in the Plex integration](/integrations/plex/#action-media_playerplay_media) and prepend the `media_content_id` with `plex://`: ```yaml 'cast_plex_to_chromecast': diff --git a/source/_integrations/channels.markdown b/source/_integrations/channels.markdown index 53c0f9a82a1f..042d63e63dbe 100644 --- a/source/_integrations/channels.markdown +++ b/source/_integrations/channels.markdown @@ -48,27 +48,27 @@ name: type: string {% endconfiguration %} -### Service `seek_forward` +### Action `seek_forward` Seek forward by the number of seconds currently set in settings on the instance of Channels. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------- | | `entity_id` | no | String that points at `entity_id` of Channels app. | -### Service `seek_backward` +### Action `seek_backward` Seek backward by the number of seconds currently set in settings on the instance of Channels. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------- | | `entity_id` | no | String that points at `entity_id` of Channels app. | -### Service `seek_by` +### Action `seek_by` Seek forward or backward by a provided number of seconds. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------- | | `entity_id` | no | String that points at `entity_id` of Channels app. | | `seconds` | no | Number of seconds to seek in the timeline by. Negative seconds seeks backwards. | diff --git a/source/_integrations/cisco_ios.markdown b/source/_integrations/cisco_ios.markdown index 1634ff4cfd9a..65007d28d5fc 100644 --- a/source/_integrations/cisco_ios.markdown +++ b/source/_integrations/cisco_ios.markdown @@ -18,9 +18,9 @@ related: This is a presence detection scanner for [Cisco IOS](https://www.cisco.com/) devices. -<div class='note warning'> +{% important %} This device tracker needs SSH to be enabled on the router. -</div> +{% endimportant %} Before using this scanner it is recommended that you lower the ARP cache timeout on your router, as Cisco IOS normally comes with a 4 hour default ARP cache timeout. @@ -46,11 +46,11 @@ arp timeout 120 copy running-config startup-config ``` -<div class='note warning'> +{% note %} If you have a very large number of devices on your VLan (+1000), then you may want to adjust the ARP cache timeout to suit your needs. See [this discussion](https://community.cisco.com/t5/switching/arp-timeout/td-p/839027) to learn more. -</div> +{% endnote %} To use this device tracker in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/cisco_webex_teams.markdown b/source/_integrations/cisco_webex_teams.markdown index 30844b7adcfc..568649d1d1d6 100644 --- a/source/_integrations/cisco_webex_teams.markdown +++ b/source/_integrations/cisco_webex_teams.markdown @@ -1,6 +1,6 @@ --- title: Cisco Webex Teams -description: Instructions on how to add Cisco Webex Teams notifications to Home Assistant. +description: Instructions on how to add Cisco Webex notifications to Home Assistant. ha_category: - Notifications ha_iot_class: Cloud Push @@ -16,11 +16,11 @@ related: title: Configuration file --- -The `cisco_webex_teams` notification platform allows you to deliver rich notifications from Home Assistant to [Cisco Webex Teams](https://www.webex.com/team-collaboration.html) (formerly known as Cisco Spark). +The `cisco_webex_teams` notification platform allows you to deliver rich notifications from Home Assistant to [Cisco Webex Teams](https://www.webex.com/team-collaboration.html) (formerly known as Cisco Spark or Cisco Webex Teams). To use this notification platform you will need an app (bot) token. To obtain a token visit [Cisco Webex for Developers](https://developer.webex.com/). -- Detailed instructions can be found in the section titled **Creating a Webex Teams Bot** on the [Webex Teams bot documentation](https://developer.webex.com/docs/bots). +- Detailed instructions can be found in the section titled **Creating a Webex Bot** on the [Webex Teams bot documentation](https://developer.webex.com/docs/bots). You also need to specify the `room_id` that you wish to post messages into. The `room_id` can be found in one of two ways: @@ -28,12 +28,12 @@ You also need to specify the `room_id` that you wish to post messages into. The 2. Log into the web client at [teams.webex.com](https://teams.webex.com/), - select the room (or create a new room), - then copying the room ID from the URL. +3. Within the Webex Client, press Control+Shift+K (Windows) or Command+Shift+K (macOS), which will automatically copy the space information to your clipboard, which you + can paste to a notepad, and will contain your space ID. -<div class='note'> - +{% important %} You must add the bot email (in the format `mybot@webex.bot`) as a participant to the room specified above. - -</div> +{% endimportant %} To enable this platform in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} @@ -49,7 +49,7 @@ notify: ## Rich Text Formatting -Webex Teams clients can render rich text via a whitelisted set of html tags. +Webex clients can render rich text via a whitelisted set of html tags. For example, you could configure automations to display details in an easy to read fashion like so: @@ -142,7 +142,7 @@ The following is a list of the allowed html tags and attributes: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string diff --git a/source/_integrations/clementine.markdown b/source/_integrations/clementine.markdown index 9c227813c07e..f2681947033f 100644 --- a/source/_integrations/clementine.markdown +++ b/source/_integrations/clementine.markdown @@ -51,4 +51,4 @@ Remember that Clementine must be configured to accept connections through its ne You can configure this through Clementine `Tools > Preferences > Network remote control` configuration menu. Enable `Use network remote control` and configure the other options for your use case. -This integration does not implement the `play_media` service so you cannot add tracks to the playlist. +This integration does not implement the `play_media` action so you cannot add tracks to the playlist. diff --git a/source/_integrations/clickatell.markdown b/source/_integrations/clickatell.markdown index a83555f6afa3..989357900eea 100644 --- a/source/_integrations/clickatell.markdown +++ b/source/_integrations/clickatell.markdown @@ -43,7 +43,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter name allows multiple notifiers to be created. The notifier will bind to the service notify.NOTIFIER_NAME. + description: Setting the optional parameter name allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: clickatell type: string diff --git a/source/_integrations/clicksend.markdown b/source/_integrations/clicksend.markdown index eef5a8030786..32530ab156d0 100644 --- a/source/_integrations/clicksend.markdown +++ b/source/_integrations/clicksend.markdown @@ -45,7 +45,7 @@ notify: {% configuration %} name: - description: "Setting the optional parameter name allows multiple notifiers to be created. The default value is `ClickSend`. The notifier will bind to the service `notify.NOTIFIER_NAME`." + description: "Setting the optional parameter name allows multiple notifiers to be created. The default value is `ClickSend`. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: false type: string username: diff --git a/source/_integrations/clicksend_tts.markdown b/source/_integrations/clicksend_tts.markdown index 893c232d02ad..fe4965b427e7 100644 --- a/source/_integrations/clicksend_tts.markdown +++ b/source/_integrations/clicksend_tts.markdown @@ -27,7 +27,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter name allows multiple notifiers to be created. The notifier will bind to the service notify.NOTIFIER_NAME. + description: "Setting the optional parameter name allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: false default: clicksend_tts type: string @@ -57,7 +57,7 @@ voice: ### Usage -ClickSend is a notify platform and thus can be controlled by calling the notify service [as described here](/integrations/notify/). It will send a notification to the E.164 phone number you configured as **recipient**. +ClickSend is a notify platform and thus can be controlled by calling the notify action [as described here](/integrations/notify/). It will send a notification to the E.164 phone number you configured as **recipient**. ```yaml alias: "The sun has set" diff --git a/source/_integrations/climate.markdown b/source/_integrations/climate.markdown index b49e08ac8209..058354d41377 100644 --- a/source/_integrations/climate.markdown +++ b/source/_integrations/climate.markdown @@ -15,23 +15,21 @@ The **Climate** {% term integration %} allows you to control and monitor HVAC (h {% include integrations/building_block_integration.md %} -## Services +## Actions -### Climate control services +### Climate control actions -Available services: `climate.set_aux_heat`, `climate.set_preset_mode`, `climate.set_temperature`, `climate.set_humidity`, `climate.set_fan_mode`, `climate.set_hvac_mode`, `climate.set_swing_mode`, `climate.turn_on`, `climate.turn_off`, `climate.toggle` +Available actions: `climate.set_aux_heat`, `climate.set_preset_mode`, `climate.set_temperature`, `climate.set_humidity`, `climate.set_fan_mode`, `climate.set_hvac_mode`, `climate.set_swing_mode`, `climate.turn_on`, `climate.turn_off`, `climate.toggle` -<div class='note'> +{% tip %} +Not all climate {% term actions %} may be available for your platform. You can check which climate action are available under **Developer Tools** -> **Actions**. +{% endtip %} -Not all climate {% term services %} may be available for your platform. You can check which climate services are available under **Developer Tools** -> **Services**. - -</div> - -### Service `climate.set_aux_heat` +### Action `climate.set_aux_heat` Turn auxiliary heater on/off for climate device -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. | `aux_heat` | no | New value of auxiliary heater. @@ -51,13 +49,13 @@ automation: aux_heat: true ``` -### Service `climate.set_preset_mode` +### Action `climate.set_preset_mode` Set preset mode for climate device. Away mode changes the target temperature permanently to a temperature reflecting a situation where the climate device is set to save energy. For example, this may be used to emulate a "vacation mode." -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. | `preset_mode` | no | New value of preset mode. @@ -77,11 +75,11 @@ automation: preset_mode: "eco" ``` -### Service `climate.set_temperature` +### Action `climate.set_temperature` Set target temperature of climate device -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. | `temperature` | yes | New target temperature for climate device (commonly referred to as a *setpoint*). Do not use if `hvac_mode` is `heat_cool`. @@ -122,11 +120,11 @@ automation: hvac_mode: heat_cool ``` -### Service `climate.set_humidity` +### Action `climate.set_humidity` Set target humidity of climate device -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. | `humidity` | no | New target humidity for climate device @@ -146,11 +144,11 @@ automation: humidity: 60 ``` -### Service `climate.set_fan_mode` +### Action `climate.set_fan_mode` Set fan operation for climate device -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. | `fan_mode` | no | New value of fan mode @@ -170,11 +168,11 @@ automation: fan_mode: "On Low" ``` -### Service `climate.set_hvac_mode` +### Action `climate.set_hvac_mode` Set climate device's HVAC mode -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. | `hvac_mode` | no | New value of HVAC mode @@ -194,11 +192,11 @@ automation: hvac_mode: heat ``` -### Service `climate.set_swing_mode` +### Action `climate.set_swing_mode` Set swing operation mode for climate device -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. | `swing_mode` | no | New value of swing mode @@ -218,27 +216,27 @@ automation: swing_mode: 1 ``` -### Service `climate.turn_on` +### Action `climate.turn_on` Turn climate device on. This is only supported if the climate device supports being turned off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. -### Service `climate.turn_off` +### Action `climate.turn_off` Turn climate device off. This is only supported if the climate device has the HVAC mode `off`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. -### Service `climate.toggle` +### Action `climate.toggle` Toggle climate device. This is only supported if the climate device supports being turned on and off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of climate device(s) to control. To target all climate devices, use `all`. diff --git a/source/_integrations/climate.mqtt.markdown b/source/_integrations/climate.mqtt.markdown index 64b17af46188..b1179141219d 100644 --- a/source/_integrations/climate.mqtt.markdown +++ b/source/_integrations/climate.mqtt.markdown @@ -264,7 +264,7 @@ power_command_template: required: false type: template power_command_topic: - description: The MQTT topic to publish commands to change the HVAC power state. Sends the payload configured with `payload_on` if the climate is turned on via the `climate.turn_on`, or the payload configured with `payload_off` if the climate is turned off via the `climate.turn_off` service. Note that `optimistic` mode is not supported through `climate.turn_on` and `climate.turn_off` services. When called, these services will send a power command to the device but will not optimistically update the state of the climate entity. The climate device should report its state back via `mode_state_topic`. + description: The MQTT topic to publish commands to change the HVAC power state. Sends the payload configured with `payload_on` if the climate is turned on via the `climate.turn_on`, or the payload configured with `payload_off` if the climate is turned off via the `climate.turn_off` action. Note that `optimistic` mode is not supported through `climate.turn_on` and `climate.turn_off` actions. When called, these actions will send a power command to the device but will not optimistically update the state of the climate entity. The climate device should report its state back via `mode_state_topic`. required: false type: string precision: diff --git a/source/_integrations/cloudflare.markdown b/source/_integrations/cloudflare.markdown index af4dcde4d4fb..44f8c18e78af 100644 --- a/source/_integrations/cloudflare.markdown +++ b/source/_integrations/cloudflare.markdown @@ -15,7 +15,7 @@ ha_integration_type: integration With the **Cloudflare** {% term integration %}, you can keep your Cloudflare DNS records up to date. -The integration runs every hour, but can also be triggered by running the {% my developer_services title="`cloudflare.update_records` service" service="cloudflare.update_records" %}. +The integration runs every hour, but can also be triggered by running the {% my developer_services title="`cloudflare.update_records` action" service="cloudflare.update_records" %}. ## Requirements diff --git a/source/_integrations/color_extractor.markdown b/source/_integrations/color_extractor.markdown index 211fa90d800b..a40716152ec6 100644 --- a/source/_integrations/color_extractor.markdown +++ b/source/_integrations/color_extractor.markdown @@ -16,11 +16,11 @@ Useful as part of an {% term automation %}. {% include integrations/config_flow.md %} -## Services +## Actions -Because `color_extractor.turn_on` will then call `light.turn_on`, you can pass any valid [`light.turn_on`](/integrations/light#service-lightturn_on) parameters (`rgb_color` will be set for you though) as those will be passed along. +Because `color_extractor.turn_on` will then call `light.turn_on`, you can pass any valid [`light.turn_on`](/integrations/light#action-lightturn_on) parameters (`rgb_color` will be set for you though) as those will be passed along. -Passing the key `color_extract_url` to the {% term service %} call will download the linked image and extract the predominant color from it. Passing the key `color_extract_path` to the service call will process the image file from local storage instead. `color_extract_url` and `color_extract_path` are exclusive and cannot be used together. +Passing the key `color_extract_url` to the {% term action %} call will download the linked image and extract the predominant color from it. Passing the key `color_extract_path` to the action will process the image file from local storage instead. `color_extract_url` and `color_extract_path` are exclusive and cannot be used together. | Key | Example | Description | | -------------------- | ------------------------------------- | ------------------------------------------------------------------------------ | @@ -28,23 +28,21 @@ Passing the key `color_extract_url` to the {% term service %} call will download | `color_extract_path` | `/tmp/album.png` | The full path to the image file on local storage we'll process | | `entity_id` | `light.shelf_leds` | The RGB capable light we'll set the color of | -<div class="note"> - - Please ensure any [external URLs](/integrations/homeassistant/#allowlist_external_urls) or [external files](/docs/integrations/homeassistant/#allowlist_external_dirs) are authorized for use. You will receive error messages if this {% term integration %} is not allowed access to these external resources. - -</div> +{% important %} +Ensure any [external URLs](/integrations/homeassistant/#allowlist_external_urls) or [external files](/docs/integrations/homeassistant/#allowlist_external_dirs) are authorized for use. You will receive error messages if this {% term integration %} is not allowed access to these external resources. +{% endimportant %} -### URL Service Call +### URL Action -Add the parameter key `color_extract_url` to the service call. +Add the parameter key `color_extract_url` to the action. -This {% term service %} allows you to pass in the URL of an image, have it downloaded, get the predominant color from it, and then set a light's RGB value to it. +This {% term action %} allows you to pass in the URL of an image, have it downloaded, get the predominant color from it, and then set a light's RGB value to it. -### File Service Call +### File Action -Add the parameter key `color_extract_path` to the service call. +Add the parameter key `color_extract_path` to the action. -This {% term service %} is very similar to the URL service above, except it processes a file from the local file storage. +This {% term action %} is very similar to the URL action above, except it processes a file from the local file storage. ## Example Automations @@ -67,7 +65,7 @@ Example usage in an {% term automation %}, taking the album art present on a Chr entity_id: light.shelf_leds ``` -With a nicer transition period of 5 seconds and setting brightness to 100% each time (part of the [`light.turn_on`](/integrations/light#service-lightturn_on) service parameters): +With a nicer transition period of 5 seconds and setting brightness to 100% each time (part of the [`light.turn_on`](/integrations/light#action-lightturn_on) action parameters): ```yaml #automation.yaml diff --git a/source/_integrations/comfoconnect.markdown b/source/_integrations/comfoconnect.markdown index 9d08628d0e31..08318ce2fe83 100644 --- a/source/_integrations/comfoconnect.markdown +++ b/source/_integrations/comfoconnect.markdown @@ -90,7 +90,7 @@ sensor: The list above indicates all supported sensors. It is recommended to only include the ones you need. -<div class='note'> +{% note %} Note that multiple connections to the bridge only work version >= U1.2.6 of the ComfoConnect LAN C bridge. In older versions it's not possible to have multiple connections to the bridge at the same time. This integration will then keep the connection open, and if you open the app, it will ask you to disconnect Home Assistant. If you close the app again, Home Assistant will reconnect automatically. -</div> +{% endnote %} diff --git a/source/_integrations/command_line.markdown b/source/_integrations/command_line.markdown index 381c56436d65..89a82a444362 100644 --- a/source/_integrations/command_line.markdown +++ b/source/_integrations/command_line.markdown @@ -26,11 +26,9 @@ related: The **Command line** {% term integration %} offers functionality that issues specific commands to get data or to control a device. -<div class='note'> - +{% tip %} It's highly recommended to enclose the command in single quotes `'` as it ensures all characters can be used in the command and reduces the risk of unintentional escaping. To include a single quote in a command enclosed in single quotes, double it: `''`. - -</div> +{% endtip %} {% configuration %} command_line: @@ -158,7 +156,7 @@ command_line: type: map keys: name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string @@ -189,6 +187,10 @@ command_line: description: Defines a list of keys to extract values from a JSON dictionary result and then set as sensor attributes. required: false type: [string, list] + json_attributes_path: + description: A [JSONPath](https://goessner.net/articles/JsonPath/) that references the location of the `json_attributes` in the JSON content. + required: false + type: string name: description: Name of the command sensor. required: false @@ -373,7 +375,7 @@ command_line: ``` {% endraw%} -<div class='note'> +{% note %} A note on `name` for `cover` and `switch`: @@ -381,17 +383,17 @@ The use of `friendly_name` and `object_id` has been deprecated and the slugified Use `unique_id` to enable changing the name from the UI and if required, use the slugified `name` as identifier. -</div> +{% endnote %} ## Execution The `command` is executed within the [configuration directory](/docs/configuration/). -<div class='note'> +{% note %} If you are using [Home Assistant Operating System](https://github.com/home-assistant/operating-system), the commands are executed in the `homeassistant` container context. So if you test or debug your script, it might make sense to do this in the context of this container to get the same runtime environment. -</div> +{% endnote %} With a `0` exit code, the output (stdout) of the command is used as `value`. In case a command results in a non `0` exit code or is terminated by the `command_timeout`, the result is only logged to Home Assistant log and the sensors value is not updated. @@ -637,6 +639,26 @@ command_line: ``` {% 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. + +{% raw %} + +```yaml +command_line: + - sensor: + name: JSON user + command: python3 -c "import requests; print(requests.get('https://jsonplaceholder.typicode.com/users').text)" + json_attributes_path: "$.[0].address" + json_attributes: + - street + - suite + - city + - zipcode + value_template: "{{ value_json[0].name }}" +``` + +{% endraw %} + ## Example switch platform ### Change the icon when a state changes @@ -691,9 +713,9 @@ Given this example, in the UI one would see the `friendly_name` of This switch will shutdown your system that is hosting Home Assistant. -<div class='note warning'> +{% warning %} This switch will shutdown your host immediately, there will be no confirmation. -</div> +{% endwarning %} {% raw %} ```yaml @@ -744,12 +766,12 @@ command_line: - Replace admin and password with an "Admin" privileged Foscam user - Replace ipaddress with the local IP address of your Foscam -## Services +## Actions -Available services: `reload`. +Available actions: `reload`. -### Service `command_line.reload` +### Action `command_line.reload` Reload all `command_line` entities. -This service takes no service data attributes. +This action takes no data attributes. diff --git a/source/_integrations/configurator.markdown b/source/_integrations/configurator.markdown index 216a8cc85cb2..627c64836602 100644 --- a/source/_integrations/configurator.markdown +++ b/source/_integrations/configurator.markdown @@ -11,9 +11,9 @@ ha_domain: configurator ha_integration_type: system --- -<div class='note'> +{% caution %} This integration is intended for developers. -</div> +{% endcaution %} The **Configurator** {% term integration %} allows integrations to request information from the user. It is currently implemented as the minimum viable product: diff --git a/source/_integrations/conversation.markdown b/source/_integrations/conversation.markdown index 4531739927c9..e2910a284641 100644 --- a/source/_integrations/conversation.markdown +++ b/source/_integrations/conversation.markdown @@ -12,7 +12,7 @@ ha_domain: conversation ha_integration_type: system --- -The **Conversation** {% term integration %} allows you to converse with Home Assistant. You can either converse by pressing the microphone in the frontend (supported browsers only (no iOS)) or by calling the `conversation/process` service with the transcribed text. +The **Conversation** {% term integration %} allows you to converse with Home Assistant. You can either converse by pressing the microphone in the frontend (supported browsers only (no iOS)) or by calling the `conversation/process` action with the transcribed text. <p class='img'> <img src="/images/screenshots/voice-commands.png" /> @@ -66,8 +66,7 @@ intent_script: {% endraw %} -More complex [actions](/docs/scripts/) can be done in `intent_script`, such as calling services and firing events. - +More complex [actions](/docs/scripts/) can be done in `intent_script`, such as performing actions and firing events. ## Extending built-in intents @@ -156,23 +155,23 @@ intents: It's now possible to say "engage all lights in the bedroom", which will turn on every light in the area named "bedroom". -## Service `conversation.process` +## Action `conversation.process` Send a message to a conversation agent for processing. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- | | `text` | no | Transcribed text input | | `language` | yes | Language of the text | | `agent_id` | yes | ID of conversation agent. The conversation agent is the brains of the assistant. It processes the incoming text commands. | | `conversation_id` | yes | ID of a new or previous conversation. Will continue an old conversation or start a new one. | -This service is able to return [response data](/docs/scripts/service-calls/#use-templates-to-handle-response-data). The response is the same response as for the +This action is able to return [response data](/docs/scripts/service-calls/#use-templates-to-handle-response-data). The response is the same response as for the [`/api/conversation/process` API](https://developers.home-assistant.io/docs/intent_conversation_api#conversation-response). -## Service `conversation.reload` +## Action `conversation.reload` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------ | | `language` | yes | Language to clear intent cache for. No value clears all languages | | `agent_id` | yes | ID of conversation agent. Defaults to the built-in Home Assistant agent. | diff --git a/source/_integrations/counter.markdown b/source/_integrations/counter.markdown index 7afbad9f1312..477df2d98278 100644 --- a/source/_integrations/counter.markdown +++ b/source/_integrations/counter.markdown @@ -83,46 +83,46 @@ This integration will automatically restore the state it had prior to Home Assis If `restore` is set to `true`, the `initial` value will only be used when no previous state is found or when the counter is reset. -## Services +## Actions -Available services: `increment`, `decrement`, `reset`, and `set_value`. +Available actions: `increment`, `decrement`, `reset`, and `set_value`. -### Service `counter.increment` +### Action `counter.increment` Increments the counter with 1 or the given value for the steps. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------- | | `entity_id` | no | Name of the entity to take action, e.g., `counter.my_custom_counter`. | -### Service `counter.decrement` +### Action `counter.decrement` Decrements the counter with 1 or the given value for the steps. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------- | | `entity_id` | no | Name of the entity to take action, e.g., `counter.my_custom_counter`. | -### Service `counter.reset` +### Action `counter.reset` -With this service the counter is reset to its initial value. +With this action the counter is reset to its initial value. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------- | | `entity_id` | no | Name of the entity to take action, e.g., `counter.my_custom_counter`. | -### Service `counter.set_value` +### Action `counter.set_value` -This service allows setting the counter to a specific value. +This action allows setting the counter to a specific value. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------- | | `entity_id` | no | Name of the entity to take action, e.g., `counter.my_custom_counter`. | | `value` | yes | Set the counter to the given value. | -### Use the service +### Use the action -Select the **Services** tab from within **Developer Tools**. Choose **counter** from the list of **Domains**, select the **Service**, enter something like the sample below into the **Service Data** field, and hit **CALL SERVICE**. +Select the **Actions** tab from within **Developer Tools**. Choose **counter** from the list of **Domains**, select the **Actions**, enter something like the sample below into the **data** field, and select **Perform action**. ```json { diff --git a/source/_integrations/cover.markdown b/source/_integrations/cover.markdown index ee34b926e00b..1edf4f59f323 100644 --- a/source/_integrations/cover.markdown +++ b/source/_integrations/cover.markdown @@ -47,13 +47,13 @@ The following device classes are supported for covers. - **shutter**: Control of shutters, which are linked slats that swing out/in to covering an opening or may be tilted to partially cover an opening, such as indoor or exterior window shutters. - **window**: Control of a physical window that opens and closes or may tilt. -## Services +## Actions -### Cover control services +### Cover control actions -Available services: `cover.open_cover`, `cover.close_cover`, `cover.stop_cover`, `cover.toggle`, `cover.open_cover_tilt`, `cover.close_cover_tilt`, `cover.stop_cover_tilt`, `cover.toggle_tilt` +Available actions: `cover.open_cover`, `cover.close_cover`, `cover.stop_cover`, `cover.toggle`, `cover.open_cover_tilt`, `cover.close_cover_tilt`, `cover.stop_cover_tilt`, `cover.toggle_tilt` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of covers. Use `entity_id: all` to target all. | @@ -70,11 +70,11 @@ automation: entity_id: cover.demo ``` -### Service `cover.set_cover_position` +### Action `cover.set_cover_position` Set cover position of one or multiple covers. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of covers. Use `entity_id: all` to target all. | | `position` | no | Integer between 0 and 100. | @@ -94,11 +94,11 @@ automation: position: 50 ``` -### Service `cover.set_cover_tilt_position` +### Action `cover.set_cover_tilt_position` Set cover tilt position of one or multiple covers. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of covers. Use `entity_id: all` to target all. | | `tilt_position` | no | Integer between 0 and 100. | diff --git a/source/_integrations/cover.mqtt.markdown b/source/_integrations/cover.mqtt.markdown index fc8bcc30881d..0b890ea932b6 100644 --- a/source/_integrations/cover.mqtt.markdown +++ b/source/_integrations/cover.mqtt.markdown @@ -311,13 +311,12 @@ value_template: type: template {% endconfiguration %} -<div class="note"> +{% note %} MQTT cover expects position and tilt values to be in range of 0 to 100, where 0 indicates closed position and 100 indicates fully open position. If position `min` or `max` are set to a different range (e.g. 40 to 140), when sending command to the device the range will be adjusted to the device range (position 0 will send a value of 40 to device) and when position payload is received from the device it will be adjusted back to the 0 to 100 range (device value of 40 will report cover position 0). `min` and `max` can also be used to reverse the direction of the device, if `min` is set to 100 and `max` is set to `0` device operation will be inverted (e.g. when setting position to 40, a value of 60 will be sent to device). - -</div> +{% endnote %} ## Examples diff --git a/source/_integrations/cover.template.markdown b/source/_integrations/cover.template.markdown index 5349c3cbb08c..7f92395ba73f 100644 --- a/source/_integrations/cover.template.markdown +++ b/source/_integrations/cover.template.markdown @@ -3,14 +3,23 @@ title: "Template cover" description: "Instructions on how to integrate template covers into Home Assistant." ha_category: - Cover + - Helper ha_release: 0.48 ha_iot_class: Local Push ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' ha_domain: template +ha_platforms: + - cover +ha_integration_type: helper +related: + - docs: /docs/configuration/ + title: Configuration file --- The `template` platform can create covers that combine integrations and provides -the ability to run scripts or invoke services for each of the open, +the ability to run scripts or invoke actions for each of the open, close, stop, position and tilt commands of a cover. ## Configuration diff --git a/source/_integrations/cppm_tracker.markdown b/source/_integrations/cppm_tracker.markdown index 615842ce3932..4b33fe0f047d 100644 --- a/source/_integrations/cppm_tracker.markdown +++ b/source/_integrations/cppm_tracker.markdown @@ -17,11 +17,9 @@ Supported platforms (tested): - Aruba ClearPass 6.7.5 -<div class='note warning'> - +{% important %} You must first create an API client [here](https://www.arubanetworks.com/techdocs/ClearPass/6.6/Guest/Content/AdministrationTasks1/CreateEditAPIclient.htm). - -</div> +{% endimportant %} To use this device tracker in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/daikin.markdown b/source/_integrations/daikin.markdown index 89e4e573322e..376bd2ab6c63 100644 --- a/source/_integrations/daikin.markdown +++ b/source/_integrations/daikin.markdown @@ -20,11 +20,11 @@ ha_platforms: ha_integration_type: integration --- -<div class='note warning'> +{% warning %} Daikin has removed their local API in newer products. They offer a Onecta cloud API for controlling Daikin devices through the cloud, see the [Daikin Europe Developer Portal](https://developer.cloud.daikineurope.com) for more details. This affects units fitted with the BRP069C4x wifi adapter. Units listed under Supported Hardware below continue to have access to local control. Additionally the older but commonly available BRP072A42 adapter can be fitted to most if not all newer units for access to local control. -</div> +{% endwarning %} The **Daikin** {% term integration %} integrates Daikin air conditioning systems into Home Assistant. @@ -43,16 +43,16 @@ There is currently support for the following device types within Home Assistant: - The Australian version of the Daikin Wifi Controller for **AirBase** units (BRP15B61), which is operated by the [Daikin Airbase](https://play.google.com/store/apps/details?id=au.com.daikin.airbase) application. - **SKYFi** based units, which is operated by the SKYFi application*. -<div class='note'> +{% note %} - The integration for BRP072Cxx and SKYFi based units need API-key / password respectively. The API-key/password can be found on a sticker under the front cover. The other models are auto detected and the API-key and password field must be left empty. - BRP084Cxx firmware update from 1.19.0 to 2.8.0 breaks local API there is however ongoing work in fixing local API support again. -</div> +{% endnote %} {% include integrations/config_flow.md %} -<div class='note'> +{% note %} If your Daikin unit does not reside in the same network as your Home Assistant instance, i.e. your network is segmented, note that a couple of UDP connections are made during discovery: @@ -61,28 +61,28 @@ If your Daikin unit does not reside in the same network as your Home Assistant i If this situation applies to you, you may need to adjust your firewall(s) accordingly. -</div> +{% endnote %} ## Climate The `daikin` climate platform integrates Daikin air conditioning systems into Home Assistant, enabling control of setting the following parameters: -- [**set_hvac_mode**](/integrations/climate/#service-climateset_hvac_mode) (`off`, `heat`, `cool`, `heat_cool`, or `fan_only`) -- [**target temperature**](/integrations/climate#service-climateset_temperature) -- [**turn on/off**](/integrations/climate#service-climateturn_on) -- [**fan mode**](/integrations/climate#service-climateset_fan_mode) (speed) -- [**swing mode**](/integrations/climate#service-climateset_swing_mode) -- [**set_preset_mode**](/integrations/climate#service-climateset_preset_mode) (away, none) +- [**set_hvac_mode**](/integrations/climate/#action-climateset_hvac_mode) (`off`, `heat`, `cool`, `heat_cool`, or `fan_only`) +- [**target temperature**](/integrations/climate#action-climateset_temperature) +- [**turn on/off**](/integrations/climate#action-climateturn_on) +- [**fan mode**](/integrations/climate#action-climateset_fan_mode) (speed) +- [**swing mode**](/integrations/climate#action-climateset_swing_mode) +- [**set_preset_mode**](/integrations/climate#action-climateset_preset_mode) (away, none) Current inside temperature is displayed. -<div class='note'> +{% note %} Some models do not support setting of **fan speed** or **swing mode**. -</div> +{% endnote %} -<div class='note'> +{% note %} Preset mode **away** translates to Daikin's "Holiday Mode":<br/> <br> @@ -93,7 +93,7 @@ _When "Holiday mode" is enabled, the following action take place:_ - _All connected units are turned OFF._ - _All schedule timers are disabled._ -</div> +{% endnote %} ## Sensor @@ -112,16 +112,16 @@ The integration displays the following parameters for the outdoor compressor: - Outside compressor Energy consumption (sum of all devices, resets at 00:00) - Outside compressor frequency -<div class='note'> +{% note %} - Some models only report outside temperature when they are turned on. - Some models do not have humidity sensor. - Some models do not report the power/energy consumption. - Some models do not report the compressor frequency. -</div> +{% endnote %} -<div class='note'> +{% note %} - The 'Outdoor compressor Energy consumption' and 'Outdoor compressor Estimated power consumption' sensors are updated every time 100 Wh are consumed by all different operating modes summed together. - The 'Outdoor compressor Estimated power consumption' sensor is derived from the above energy consumption and not provided by the AC directly. @@ -130,17 +130,17 @@ The integration displays the following parameters for the outdoor compressor: - The 'cool' mode also includes the 'fan' and 'dehumidifier' modes' power consumption. - If you have multiple indoor devices, the 'Outdoor compressor' sensors will be created multiple times but will all report the same values. You can disable all but one. -</div> +{% endnote %} ## Switch AirBase and SKYFi units exposes zones (typically rooms) that can be switched on/off individually. -<div class='note'> +{% note %} Zones with the name `-` will be ignored, just as the AirBase application is working. -</div> +{% endnote %} A switch is created for each device that will toggle the unit on/off. This will turn the unit on to its previous state, or toggle it off. This switch works in conjunction with the climate entity. diff --git a/source/_integrations/date.markdown b/source/_integrations/date.markdown index b9b64e7dd8ec..a097fe31bfbe 100644 --- a/source/_integrations/date.markdown +++ b/source/_integrations/date.markdown @@ -17,17 +17,17 @@ The **Date** {% term integration %} is built for the controlling and monitoring If you are looking for a way to create a similar entity, please take a look at the [Date/Time helper](/integrations/input_datetime). -## Services +## Actions -### Date services +### Date actions -Available {% term services %}: `date.set_value` +Available {% term actions %}: `date.set_value` -### Service `date.set_value` +### Action`date.set_value` Set a new value for the date {% term entity %}. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings that point at `entity_id`'s of dates to control. | `date` | no | New date value to set. diff --git a/source/_integrations/datetime.markdown b/source/_integrations/datetime.markdown index 5b836e368a74..109704ba5475 100644 --- a/source/_integrations/datetime.markdown +++ b/source/_integrations/datetime.markdown @@ -17,17 +17,17 @@ The **Date/Time** {% term integration %} is built for the controlling and monito If you are looking for a way to create a Date/Time entity, please take a look at the [Date/Time helper](/integrations/input_datetime). -## Services +## Actions -### datetime services +### datetime actions -Available {% term services %}: `datetime.set_value` +Available {% term actions %}: `datetime.set_value` -### Service `datetime.set_value` +### Action `datetime.set_value` Set a new value for the datetime {% term entity %}. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------ | | `entity_id` | no | String or list of strings that point at `entity_id`'s of datetimes to control. | | `datetime` | no | New datetime value to set. If timezone is not included, the Home Assistant instance's timezone will be used. | diff --git a/source/_integrations/debugpy.markdown b/source/_integrations/debugpy.markdown index 192d6e9d06d0..ed44d6d2cd3d 100644 --- a/source/_integrations/debugpy.markdown +++ b/source/_integrations/debugpy.markdown @@ -23,7 +23,7 @@ the default library used by Visual Studio Code. This is useful in testing changes on a local development install, or connecting to a production server to debug issues. It is possible to load the integration -without activating the debugger, but injecting it with a service call. This +without activating the debugger, but injecting it with an action. This is particularly useful on a developer's production system as it does not impact performance when not injected. @@ -53,7 +53,7 @@ port: default: 5678 type: integer start: - description: "If `true`, the debugger will be injected on start of Home Assistant. Set it to false to inject it on demand using the `debugpy.start` service call." + description: "If `true`, the debugger will be injected on start of Home Assistant. Set it to false to inject it on demand using the `debugpy.start` action." required: false default: true type: boolean @@ -81,7 +81,7 @@ persistent (production) server, unless absolutely required. Alternatively, the integration can be loaded by setting the `start` option to `false`. This will prevent the debugger from being injected, instead, -it will be injected on-demand by calling the `debugpy.start` service. +it will be injected on-demand by calling the `debugpy.start` action. ## Waiting at startup @@ -112,10 +112,10 @@ debugpy: This is useful for multi-homed servers, or for localhost only access -## Service `debugpy.start` +## Action `debugpy.start` When the `start` option of the integration has been set to `false`, one can -use the `debugpy.start` service call to inject and start the remote Python +use the `debugpy.start` action to inject and start the remote Python debugger at runtime. Please note: There is no way to stop it once started, this would require diff --git a/source/_integrations/deconz.markdown b/source/_integrations/deconz.markdown index de99bdbe696d..0245a08f1a82 100644 --- a/source/_integrations/deconz.markdown +++ b/source/_integrations/deconz.markdown @@ -89,15 +89,15 @@ If you are having issues and want to report a problem, always start with making If the state of {% term entities %} are only reflected in Home Assistant when the {% term integration %} is loaded (during restart, reload, setup) you probably have an issue with the WebSocket configuration where your deCONZ instance is running. The deCONZ integration uses the WebSocket port provided by the deCONZ REST API. If you're running the deCONZ Docker container make sure that it properly configures the WebSocket port so deCONZ can report what port is exposed outside of the containerized environment. Also, make sure to review firewall rules that might block communication over certain ports. -## Device services +## Device actions -Available services: `configure`, `deconz.device_refresh` and `deconz.remove_orphaned_entries`. +Available actions: `configure`, `deconz.device_refresh` and `deconz.remove_orphaned_entries`. -### Service `deconz.configure` +### Action `deconz.configure` Set the attribute of device in deCONZ using [REST-API](https://dresden-elektronik.github.io/deconz-rest-doc/about_rest/). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------- | | `field` | No | String representing a specific device in deCONZ. | | `entity` | No | String representing a specific Home Assistant entity of a device in deCONZ. | @@ -121,17 +121,21 @@ Either `entity` or `field` must be provided. If both are present, `field` will b { "field": "/config", "data": {"permitjoin": 60} } ``` -### Service `deconz.device_refresh` +### Action `deconz.device_refresh` Refresh with devices added to deCONZ after Home Assistants latest restart. -Note: deCONZ automatically signals Home Assistant when new {% term sensors %} are added, but other devices must at this point in time (deCONZ v2.05.35) be added manually using this service or a restart of Home Assistant. +{% note %} +deCONZ automatically signals Home Assistant when new {% term sensors %} are added, but other devices must at this point in time (deCONZ v2.05.35) be added manually using this action or a restart of Home Assistant. +{% endnote %} -### Service `deconz.remove_orphaned_entries` +### Action `deconz.remove_orphaned_entries` Remove entries from {% term entity %} and device registry which are no longer provided by deCONZ. -Note: it is recommended to use this {% term service %} after a restart of Home Assistant Core in order to have deCONZ integration properly mirrored to deCONZ. +{% note %} +It is recommended to use this {% term action %} after a restart of Home Assistant Core in order to have deCONZ integration properly mirrored to deCONZ. +{% endnote %} ## Remote control devices diff --git a/source/_integrations/decora.markdown b/source/_integrations/decora.markdown index 2e389fe8af82..2672db9bf956 100644 --- a/source/_integrations/decora.markdown +++ b/source/_integrations/decora.markdown @@ -48,7 +48,7 @@ devices: type: string {% endconfiguration %} -<div class='note'> +{% note %} If you get an error looking like this: @@ -68,4 +68,4 @@ Jun 20 19:41:18 androlapin hass[29588]: OSError: [Errno 8] Exec format error 3. Then run `make all` 4. Restart Home Assistant -</div> +{% endnote %} diff --git a/source/_integrations/denonavr.markdown b/source/_integrations/denonavr.markdown index 8c7c893d980b..a3480b8c4643 100644 --- a/source/_integrations/denonavr.markdown +++ b/source/_integrations/denonavr.markdown @@ -45,6 +45,7 @@ Known supported devices: - Denon AVR-X3500H - Denon AVR-X3600H - Denon AVR-X3700H +- Denon AVC-X3800H - Denon AVR-X4100W - Denon AVR-X4300H - Denon AVR-X4400H @@ -114,9 +115,9 @@ If your model is not on the list then give it a test, if everything works correc If you are using VLANs, Home Assistant needs access to the following ports on the AVR: 23, 8080, and 60006 (all TCP). -<div class='note warning'> +{% warning %} If you have something else using the IP controller for your Denon AVR 3808CI, such as your URC controller, it will not work! There is either a bug or security issue with some models where only one device could be controlling the IP functionality. -</div> +{% endwarning %} {% include integrations/config_flow.md %} @@ -149,41 +150,41 @@ A few notes: - To remotely power on Marantz receivers with Home Assistant, the Auto-Standby feature must be enabled in the receiver's settings. - Sound mode: The command to set a specific sound mode is different from the value of the current sound mode reported by the receiver (sound_mode_raw). There is a key-value structure (sound_mode_dict) that matches the raw sound mode to one of the possible commands to set a sound mode (for instance {'MUSIC':['PLII MUSIC']}. If you get a "Not able to match sound mode" warning, please open an issue on the [denonavr library](https://github.com/ol-iver/denonavr), stating which raw sound mode could not be matched so it can be added to the matching dictionary. You can find the current raw sound mode under **Developer Tools** -> **States**. -#### Service `denonavr.get_command` +#### Action `denonavr.get_command` -Denon AVR receivers support a simple text-based network interface for sending commands to the receiver over the network. You can access this interface via the `denonavr.get_command` service. In addition, IR remote codes can also be sent to this interface. +Denon AVR receivers support a simple text-based network interface for sending commands to the receiver over the network. You can access this interface via the `denonavr.get_command` action. In addition, IR remote codes can also be sent to this interface. A list of network commands supported by the various Denon AVR receivers can be [found here](https://www.heimkinoraum.de/upload/files/product/IP_Protocol_AVR-Xx100.pdf). A list of IR codes can be [found here](https://assets.denon.com/DocumentMaster/UK/AVR3313_IR_CODE_V01.pdf). -To use these commands, call the `denonavr.get_command` service and append the specific command to the path `/goform/formiPhoneAppDirect.xml?`: +To use these commands, call the `denonavr.get_command` action and append the specific command to the path `/goform/formiPhoneAppDirect.xml?`: -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | no | Name of entity to send command to. For example `media_player.marantz`| | `command` | no | Command to send to device, e.g., `/goform/formiPhoneAppDirect.xml?VSMONI2`| So for example, the above command `/goform/formiPhoneAppDirect.xml?VSMONI2` will switch the HDMI to output 2 (if your receiver supports it). Sending an IR code works the same, so the command `/goform/formiPhoneAppDirect.xml?RCKSK0410370` will toggle muting. -<div class='note'> +{% tip %} -The denonavr platform supports the standard media player controls such as `turn_on` and `volume_up`. Thus calling the service `media_player.turn_on` is equivalent to calling `denonavr.get_command` with the command `/goform/formiPhoneAppDirect.xml?PWON`. See [media_player](/integrations/media_player/) for more details. +The denonavr platform supports the standard media player controls such as `turn_on` and `volume_up`. Thus calling the `media_player.turn_on` action is equivalent to calling `denonavr.get_command` with the command `/goform/formiPhoneAppDirect.xml?PWON`. See [media_player](/integrations/media_player/) for more details. -</div> +{% endtip %} -#### Service `denonavr.set_dynamic_eq` +#### Action `denonavr.set_dynamic_eq` Enable or disable DynamicEQ setting. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | yes | Name of entity to send command to. For example `media_player.marantz`| | `dynamic_eq` | no | True/false for enable/disable.| -#### Service `denonavr.update_audyssey` +#### Action `denonavr.update_audyssey` Update Audyssey settings. This can take up to 10 Seconds for some receivers. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | yes | Name of entity to send command to. For example `media_player.marantz`| diff --git a/source/_integrations/devialet.markdown b/source/_integrations/devialet.markdown index 077ee62441e6..7ba1b3b69005 100644 --- a/source/_integrations/devialet.markdown +++ b/source/_integrations/devialet.markdown @@ -18,13 +18,13 @@ ha_platforms: The **Devialet** integration lets you control your [Devialet](https://www.devialet.com) wireless speakers from Home Assistant. -<div class='note'> +{% important %} - For a stereo setup, only one of the speakers need to be configured. - Make sure your Devialet firmware version is 2.16.1 or later. Otherwise, expect functions not to work. - Assigning a fixed IP address to your speakers is highly recommended. -</div> +{% endimportant %} {% include integrations/config_flow.md %} @@ -37,4 +37,4 @@ Known supported devices: ## Turning off the device -The media player `turn off` button and the service `media_player.turn_off` will turn off all the devices of the designated system. Exiting OFF mode is only possible by pressing a physical button on each device. +The media player `turn off` button and the `media_player.turn_off` action will turn off all the devices of the designated system. Exiting OFF mode is only possible by pressing a physical button on each device. diff --git a/source/_integrations/device_tracker.markdown b/source/_integrations/device_tracker.markdown index d43b7dc7bc00..ae71eed4a18e 100644 --- a/source/_integrations/device_tracker.markdown +++ b/source/_integrations/device_tracker.markdown @@ -32,20 +32,20 @@ device_tracker: The following optional parameters can be used with any platform: -<div class='note'> - Device tracker will only look for the following global settings under the configuration of the first configured platform: -</div> +{% note %} +Device tracker will only look for the following global settings under the configuration of the first configured platform: +{% endnote %} | Parameter | Default | Description | | ------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `interval_seconds` | 12 | Seconds between each scan for new devices. This only applies to local device trackers, not applications that push updates. | | `consider_home` | 180 | Seconds to wait till marking someone as not home after not being seen. This parameter is most useful for households with Apple iOS devices that go into sleep mode while still at home to conserve battery life. iPhones will occasionally drop off the network and then re-appear. `consider_home` helps prevent false alarms in presence detection when using IP scanners such as Nmap. `consider_home` accepts various time representations, (e.g., the following all represents 3 minutes: `180`, `0:03`, `0:03:00`) | -<div class='note'> +{% note %} - Note that setting `track_new_devices: false` will still result in new devices being recorded in `known_devices.yaml`, but they won't be tracked (`track: false`). +Note that setting `track_new_devices: false` will still result in new devices being recorded in `known_devices.yaml`, but they won't be tracked (`track: false`). -</div> +{% endnote %} The extended example from above would look like the following sample: @@ -65,11 +65,11 @@ Multiple device trackers can be used in parallel, such as [Owntracks](/integrati ## `known_devices.yaml` -<div class='note warning'> +{% warning %} As of 0.94 `known_devices.yaml` is being phased out and no longer used by all trackers. Depending on the integration you use this section may no longer apply. This includes OwnTracks, GeoFency, GPSLogger, Locative and Huawei LTE. -</div> +{% endwarning %} Once `device_tracker` is enabled, a file will be created in your configuration dir named `known_devices.yaml`. Edit this file to adjust which devices to be tracked. @@ -83,11 +83,11 @@ devicename: track: true ``` -<div class='note warning'> +{% important %} In the example above, `devicename` refers to the detected name of the device. For example, with `nmap`, this will be the MAC address (with byte separators omitted). -</div> +{% endimportant %} | Parameter | Default | Description | | --------------- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -103,11 +103,11 @@ In the example above, `devicename` refers to the detected name of the device. F The state of your tracked device will be `'home'` if it is in the [home zone](/integrations/zone#home-zone), detected by your network or Bluetooth based presence detection. If you're using a presence detection method that includes coordinates then when it's in a zone the state will be the name of the zone (case sensitive). When a device isn't at home and isn't in any zone, the state will be `'not_home'`. -## `device_tracker.see` service +## `device_tracker.see` action -The `device_tracker.see` service can be used to manually update the state of a device tracker: +The `device_tracker.see` action can be used to manually update the state of a device tracker: -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------- | | `dev_id` | no | The `object_id`, for example `tardis` for `device_tracker.tardis` | | `location_name` | yes | The location, `home`, `not_home`, or the name of the zone | diff --git a/source/_integrations/device_tracker.mqtt.markdown b/source/_integrations/device_tracker.mqtt.markdown index 0742270e5759..1471fe455cf0 100644 --- a/source/_integrations/device_tracker.mqtt.markdown +++ b/source/_integrations/device_tracker.mqtt.markdown @@ -233,11 +233,11 @@ To create the device_tracker with GPS coordinates support: mosquitto_pub -h 127.0.0.1 -t homeassistant/device_tracker/a4567d663eaf/config -m '{"json_attributes_topic": "a4567d663eaf/attributes", "name": "My Tracker"}' ``` -<div class='note info'> +{% note %} Using `state_topic` is optional when using `json_attributes_topic` to determine the state of the device tracker. -</div> +{% endnote %} To set the state of the device tracker to specific coordinates: diff --git a/source/_integrations/dexcom.markdown b/source/_integrations/dexcom.markdown index 132e5c2e9d68..912a57685b8b 100644 --- a/source/_integrations/dexcom.markdown +++ b/source/_integrations/dexcom.markdown @@ -22,9 +22,9 @@ You will need to set up the [Dexcom Share](https://provider.dexcom.com/education {% include integrations/config_flow.md %} -<div class='note warning'> +{% note %} Some people have had problems with connecting when their Dexcom passwords are entirely numeric. If you have connection issues in that case, try changing your password to something with a mix of numbers and letters. -</div> +{% endnote %} ### Server @@ -32,7 +32,7 @@ There are two Dexcom Share servers, `US` for United States customers, and `OUS` ### Unit of measurement -The integrations allows both `mg/dL` and `mmol/l` units of measurement for blood glucose values. To change your preferred unit of measurement, go to **Settings** -> **Devices & Services** in the UI, and click `OPTIONS`. +The integrations allow both `mg/dL` and `mmol/l` units of measurement for blood glucose values. To change your preferred unit of measurement, go to **Settings** -> **Devices & services** in the UI, and click `OPTIONS`. ## Sensor diff --git a/source/_integrations/dialogflow.markdown b/source/_integrations/dialogflow.markdown index 93ce6720cdc0..bab7a140ca5e 100644 --- a/source/_integrations/dialogflow.markdown +++ b/source/_integrations/dialogflow.markdown @@ -19,7 +19,9 @@ To be able to receive messages from Dialogflow, your Home Assistant instance nee Dialogflow could be [integrated](https://cloud.google.com/dialogflow/es/docs/integrations) with many popular messaging, virtual assistant and IoT platforms. -<div class='note warning'> After the [Conversational Actions sunset on June 13, 2023](https://developers.google.com/assistant/ca-sunset), Dialogflow can no longer be integreated with Google Assistant </div> +{% note %} +After the [Conversational Actions sunset on June 13, 2023](https://developers.google.com/assistant/ca-sunset), Dialogflow can no longer be integreated with Google Assistant. +{% endnote %} Using Dialogflow will be easy to create conversations like: @@ -57,11 +59,9 @@ To get the webhook URL, go to the integrations page in the configuration screen - At the top right of the screen where it says "Try it now...", type, or say, the phrase you have previously defined and hit enter. - Dialogflow will now send a request to your Home Assistant instance and display the response. -<div class='note warning'> - - The V1 API will be deprecated on October 23, 2019. If you are still using the V1 API, it is recommended to change your settings in Dialogflow to use the V2 API. No changes to your intents YAML configuration need to take place after upgrading to the V2 API. Change to the V2 API by clicking on the cog button [here](https://console.dialogflow.com/) and then select the V2 API. - -</div> +{% note %} +The V1 API will be deprecated on October 23, 2019. If you are still using the V1 API, it is recommended to change your settings in Dialogflow to use the V2 API. No changes to your intents YAML configuration need to take place after upgrading to the V2 API. Change to the V2 API by clicking on the cog button [here](https://console.dialogflow.com/) and then select the V2 API. +{% endnote %} Take a look to "Integrations", in the left menu, to configure third parties. diff --git a/source/_integrations/directv.markdown b/source/_integrations/directv.markdown index 14a62d21e9c4..2729729a5076 100644 --- a/source/_integrations/directv.markdown +++ b/source/_integrations/directv.markdown @@ -30,15 +30,15 @@ This is done via series of settings found via **Menu** > **Settings & Help** > * {% include integrations/config_flow.md %} -## Services +## Actions -### Media control services +### Media control actions -Available {% term services %}: turn_on, turn_off, media_play, media_pause, media_stop, media_next_track, media_previous_track, play_media +Available {% term actions %}: turn_on, turn_off, media_play, media_pause, media_stop, media_next_track, media_previous_track, play_media -#### Service `media_player.play_media` +#### Action `media_player.play_media` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | -----------------------| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | yes | Target a specific media player. Defaults to all. | | `media_content_id` | no | The channel number to change to. | @@ -94,7 +94,7 @@ At the moment, the following buttons are supported: - `dash` - `enter` -A typical service call for press several buttons looks like this. +A typical action for pressing several buttons looks like this. ```yaml service: remote.send_command diff --git a/source/_integrations/discord.markdown b/source/_integrations/discord.markdown index f5e2c9476f09..201fc37a05b8 100644 --- a/source/_integrations/discord.markdown +++ b/source/_integrations/discord.markdown @@ -28,10 +28,9 @@ Once the application is ready, create a [bot](https://discordapp.com/developers/ Retrieve the **Application ID** from the 'General Information' section and the (hidden) **Token** of your bot for later. -<div class='note'> - -The name you give your application on the [Discord My Apps page](https://discordapp.com/developers/applications/me) will determine the name of the notify service. For example: if you enter "Discord Chat", the service will be named `notify.discord_chat`. -</div> +{% note %} +The name you give your application on the [Discord My Apps page](https://discordapp.com/developers/applications/me) will determine the name of the notify action. For example: if you enter "Discord Chat", the action will be named `notify.discord_chat`. +{% endnote %} ### Setting up the bot @@ -57,7 +56,7 @@ Once the bot has been added to your server, get the channel ID of the channel yo Right click channel name and copy the channel ID (**Copy ID**). -This channel or a user ID has to be used as the target when calling the notification service. Multiple channel or user IDs can be specified, across multiple servers or direct messages. +This channel or a user ID has to be used as the target when calling the notification action. Multiple channel or user IDs can be specified, across multiple servers or direct messages. ## Add Discord integration to Home Assistant @@ -87,9 +86,9 @@ You can use standard Discord methods to ping users, roles, and channels within t | `Role` | `<@&roleID>` | | `Channel` | `<#channelID>` | -## Discord service data +## Discord action data -The following attributes can be placed inside the `data` key of the service call for extended functionality: +The following attributes can be placed inside the `data` key of the action for extended functionality: | Attribute | Optional | Description | | ------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- | @@ -112,7 +111,7 @@ To include messages with embedding, use these attributes underneath the `embed` | `image` | yes | Sets the image for the embed content. | | `fields` | yes | Adds a field to the embed object. `name` and `value` are *required*, `inline` is *true* by default. | -### Example service call +### Example action ```yaml - service: notify.discord @@ -125,7 +124,7 @@ To include messages with embedding, use these attributes underneath the `embed` - "/tmp/garage.jpg" ``` -### Example service call with attachments sourced from remote URLs +### Example action with attachments sourced from remote URLs ```yaml - service: notify.discord @@ -141,7 +140,7 @@ To include messages with embedding, use these attributes underneath the `embed` Note that `verify_ssl` defaults to `True`, and that any remote hosts will need to be in your [`allowlist_external_urls`](/integrations/homeassistant/#allowlist_external_urls) list. Discord limits attachment size to 8MB, so anything exceeding this will be skipped and noted in the error log. -### Example embed service call +### Example embed action ```yaml - service: notify.discord diff --git a/source/_integrations/dlib_face_detect.markdown b/source/_integrations/dlib_face_detect.markdown index 9f23152bbaf3..7fb9c035e058 100644 --- a/source/_integrations/dlib_face_detect.markdown +++ b/source/_integrations/dlib_face_detect.markdown @@ -16,9 +16,9 @@ The `dlib_face_detect` image processing {% term integration %} allows you to use This can be used to trigger an automation rule. Further info is on the [integration](/integrations/image_processing/) page. -<div class='note'> +{% note %} This integration is only available on Home Assistant Core installation types. Unfortunately, it cannot be used with Home Assistant OS, Supervised or Container. -</div> +{% endnote %} ## Configuration diff --git a/source/_integrations/dlib_face_identify.markdown b/source/_integrations/dlib_face_identify.markdown index 035724f4a4fa..90eb68e062d5 100644 --- a/source/_integrations/dlib_face_identify.markdown +++ b/source/_integrations/dlib_face_identify.markdown @@ -16,9 +16,9 @@ The `dlib_face_identify` image processing {% term integration %} allows you to u For using the result inside an automation rule, take a look at the [integration](/integrations/image_processing/) page. -<div class='note'> +{% note %} This integration is only available on Home Assistant Core installation types. Unfortunately, it cannot be used with Home Assistant OS, Supervised or Container. -</div> +{% endnote %} ## Configuration @@ -61,8 +61,6 @@ confidence: default: 0.6 {% endconfiguration %} -<div class='note'> - +{% note %} If the platform fails to load because it could not install its requirement, install cmake: `sudo apt-get install cmake`. - -</div> +{% endnote %} diff --git a/source/_integrations/dlna_dmr.markdown b/source/_integrations/dlna_dmr.markdown index 3f2018e566ea..efb5ad44e2ee 100644 --- a/source/_integrations/dlna_dmr.markdown +++ b/source/_integrations/dlna_dmr.markdown @@ -17,13 +17,13 @@ ha_integration_type: integration The **DLNA Digital Media Renderer** {% term integration %} allows you to control a [DLNA Digital Media Renderer](https://www.dlna.org/), such as DLNA enabled TVs or radios. -Please note that some devices, such as Samsung TVs, are rather picky about the source used to play from. The TTS service might not work in combination with these devices. If the play_media service does not work, please try playing from a DLNA/DMS (such as [MiniDLNA](https://sourceforge.net/projects/minidlna/)). +Note that some devices, such as Samsung TVs, are rather picky about the source used to play from. The TTS action might not work in combination with these devices. If the play_media action does not work, please try playing from a DLNA/DMS (such as [MiniDLNA](https://sourceforge.net/projects/minidlna/)). {% include integrations/config_flow.md %} ## Options -Options for DLNA DMR devices can be set going to **Settings** > **Devices & Services** > **DLNA Digital Media Renderer** > **Configuration**. +Options for DLNA DMR devices can be set by going to **Settings** > **Devices & services** > **DLNA Digital Media Renderer** > **Configuration**. {% configuration_basic %} Event listener port: @@ -36,9 +36,9 @@ Show incompatible media when browsing: description: "When browsing media, show all media files and links, even if the device reports that it is not compatible with the media type." {% endconfiguration_basic %} -## Services +## Actions -DLNA devices can support a range of features. Depending on the device itself, the following [media_player](/integrations/media_player/#services) services may be supported: +DLNA devices can support a range of features. Depending on the device itself, the following [media_player](/integrations/media_player/#actions) actions may be supported: - `media_player.volume_up`, `media_player.volume_down`, and `media_player.volume_set` - `media_player.volume_mute` diff --git a/source/_integrations/dlna_dms.markdown b/source/_integrations/dlna_dms.markdown index 7b487ba6f924..3bed11fc51e6 100644 --- a/source/_integrations/dlna_dms.markdown +++ b/source/_integrations/dlna_dms.markdown @@ -34,7 +34,7 @@ The `<media_identifier>` can have one of three forms: - `:ObjectID`: Colon followed by a server-assigned ID for an object. - `?query`: Question mark followed by a query string to search for, see [DLNA ContentDirectory SearchCriteria](https://openconnectivity.org/wp-content/uploads/2015/11/UPnP-av-ContentDirectory-v4-Service.pdf) (part 5.3.16 "A_ARG_TYPE_SearchCriteria" on page 65 and part D.5 "Searching" on page 269) for the syntax. The first result found will be used. -URIs generated while browsing will look like the Object ID form above. However, all three forms will work with the [media_player.play_media](/integrations/media_player/#service-media_playerplay_media) service. +URIs generated while browsing will look like the Object ID form above. However, all three forms will work with the [media_player.play_media](/integrations/media_player/#action-media_playerplay_media) action. ### Examples diff --git a/source/_integrations/dominos.markdown b/source/_integrations/dominos.markdown index e16341688661..28be4dd81dfb 100644 --- a/source/_integrations/dominos.markdown +++ b/source/_integrations/dominos.markdown @@ -35,7 +35,7 @@ dominos: - P12IPAZA ``` -Now you can use the Dominos {% term service %} to order pizza within your automations: +Now you can use the Dominos {% term action %} to order pizza within your automations: ```yaml - service: dominos.order diff --git a/source/_integrations/doods.markdown b/source/_integrations/doods.markdown index c80ab38f310b..5cd9143e7bc8 100644 --- a/source/_integrations/doods.markdown +++ b/source/_integrations/doods.markdown @@ -200,7 +200,7 @@ image_processing: ## Optimizing resources -The [Image processing integration](/components/image_processing/) process the image from a camera at a fixed period given by the `scan_interval`. This leads to excessive processing if the image on the camera hasn't changed, as the default `scan_interval` is 10 seconds. You can override this by adding to your configuration `scan_interval: 10000` (setting the interval to 10,000 seconds) and then call the `image_processing.scan` service when you actually want to perform processing. +The [Image processing integration](/components/image_processing/) processes the image from a camera at a fixed period given by the `scan_interval`. This leads to excessive processing if the image on the camera hasn't changed, as the default `scan_interval` is 10 seconds. You can override this by adding to your configuration `scan_interval: 10000` (setting the interval to 10,000 seconds) and then call the `image_processing.scan` action when you actually want to perform processing. ```yaml # Example advanced configuration.yaml entry diff --git a/source/_integrations/doorbird.markdown b/source/_integrations/doorbird.markdown index a530813955a1..9feb717e55b2 100644 --- a/source/_integrations/doorbird.markdown +++ b/source/_integrations/doorbird.markdown @@ -5,6 +5,7 @@ ha_category: - Button - Camera - Doorbell + - Event ha_release: 0.54 ha_iot_class: Local Push ha_config_flow: true @@ -17,6 +18,7 @@ ha_zeroconf: true ha_platforms: - button - camera + - event ha_integration_type: integration --- @@ -25,7 +27,8 @@ The **DoorBird** {% term integration %} allows you to integrate your [DoorBird]( There is currently support for the following device types within Home Assistant: - [Camera](#camera) - View live and historical event based images. -- [Button](#button) - Enable control of relays and camera low-light/night vision (IR). +- [Button](#button) - Enable control of relays and camera low-light/night vision (IR) and resetting favorites. +- [Event](#event) - Monitor doorbell ring and motion events. ## Setup @@ -44,26 +47,22 @@ To setup a new account for Home Assistant, open the DoorBird App by selecting ** Events can be defined for each configured DoorBird device independently. These events will be registered on the device and can be attached to a schedule via the DoorBird app. +For new installs, a `doorbell` and `motion` event will automatically be created and configured. If you do not need any additional events, you can skip configuring schedules. See [Schedules](#schedules) section below for details on how to configure schedules. -Event names will be prefixed by `doorbird_devicename`. For example, the example event `somebody_pressed_the_button` for the device 'Driveway Gate' will be seen in Home Assistant as `doorbird_driveway_gate_somebody_pressed_the_button`. This is to prevent conflicts with other events. +Event names will be prefixed by `doorbird_devicename`. For example, the sample event `doorbell` for the device 'Driveway Gate' will be seen in Home Assistant as `doorbird_devicename_doorbell`. This is to prevent conflicts with other events. See [Automation Example](#automation-example) section below for details on how to use the event names in an automation. -<div class="note info"> -Events will not be received in Home Assistant until a schedule is defined via the DoorBird app. -</div> +{% important %} +Events other than `doorbell` and `motion` will not be received in Home Assistant until a schedule is defined via the DoorBird app. +{% endimportant %} ### Clearing registered events -Events can be cleared from DoorBird devices by visiting a special URL. +Events can be cleared from DoorBird devices by pressing the `Reset favorites` button. -Simply open a new browser window and navigate to `{Home Assistant URL}/api/doorbird/clear?token={DEVICE_TOKEN}`. Replace `{Home Assistant URL}` with the full path to your running instance, such as ` -localhost:8123`. Replace `{DEVICE_TOKEN}` with the token specified in your configuration for the device you would like to clear. -<br><br> Please note that clearing device events will require configuration steps above to be taken again. It could also affect other third-party applications you may use with your DoorBird device. It will not break the official mobile app in any way, so mobile push notifications will still work. -<br><br> -If DoorBird was setup using UI prompts, a token can be discovered through DoorBird App by selecting **Settings** (cog icon) > **Administration** > **LOGIN** (using your App Administration details). Under the **FAVORITES** section, choose **HTTP(S) Calls**. This displays all events and the associated HTTP URL. In that URL field, you will be able to see the token that was auto-generated by Home Assistant. ### Event data @@ -77,9 +76,9 @@ The following keys are available on `event_data`: - `rtsp_live_video_url` - `html5_viewer_url` -<div class="note"> +{% note %} The URLs on the event will be based on the configuration used to connect to your DoorBird device. The ability to connect from outside your network will depend on your configuration. -</div> +{% endnote %} ## Schedules @@ -123,3 +122,7 @@ The `doorbird` implementation allows you to view the live video, the last doorbe ## Button The `doorbird` button platform allows you to power connected relays and trigger the low-light/dark Infra-Red (IR) array on your [DoorBird](https://www.doorbird.com/) video doorbell device. + +## Event + +An event entity will be created for each doorbell or motion event with a configured HTTP(s) call in the [schedule](#schedules). diff --git a/source/_integrations/dormakaba_dkey.markdown b/source/_integrations/dormakaba_dkey.markdown index 251acddf94aa..b020490345a7 100644 --- a/source/_integrations/dormakaba_dkey.markdown +++ b/source/_integrations/dormakaba_dkey.markdown @@ -28,8 +28,6 @@ In addition to a lock entity, each added dKey lock will also have: - A binary_sensor which shows if the door is open or not - A binary_sensor which shows the position of the lock's dead bolt -<div class='note warning'> - +{% important %} The Dormakaba dKey lock is currently not working with USB dongles or built-in Bluetooth radios, only [ESPHome Bluetooth proxies](/integrations/bluetooth/#remote-adapters-bluetooth-proxies) configured to allow active connections work reliably. - -</div> +{% endimportant %} diff --git a/source/_integrations/dovado.markdown b/source/_integrations/dovado.markdown index 917759bf0fa9..a33f356a2f96 100644 --- a/source/_integrations/dovado.markdown +++ b/source/_integrations/dovado.markdown @@ -70,7 +70,7 @@ notify: ### Usage -This is a notify platform and thus can be controlled by calling the notify service [as described here](/integrations/notify/). It will send an SMS notification to a single phone number in the notification **target**. +This is a notify platform and thus can be controlled by calling the notify action [as described here](/integrations/notify/). It will send an SMS notification to a single phone number in the notification **target**. ```yaml # Example automation notification entry diff --git a/source/_integrations/downloader.markdown b/source/_integrations/downloader.markdown index 1155ea8a033f..d9f1df48d046 100644 --- a/source/_integrations/downloader.markdown +++ b/source/_integrations/downloader.markdown @@ -12,15 +12,15 @@ ha_integration_type: integration ha_config_flow: true --- -The **Downloader** {% term integration %} provides a service to download files. It will raise an error and not continue to set itself up when the download directory does not exist. The directory needs to be writable for the user that is running Home Assistant. +The **Downloader** {% term integration %} provides an action to download files. It will raise an error and not continue to set itself up when the download directory does not exist. The directory needs to be writable for the user who is running Home Assistant. {% include integrations/config_flow.md %} If the path is not absolute, it’s assumed to be relative to the Home Assistant configuration directory (for example, .homeassistant/downloads). -### Use the service +### Use the action -Go to the "Developer Tools", then to "Services", and choose `downloader/download_file` from the list of available services. Fill the "Service Data" field as shown in the example below and hit "CALL SERVICE". +Go to the "Developer Tools", then to "Actions", and choose `downloader.download_file` from the list of available actions. Fill the "data" field as shown in the example below and select "Perform action". ```json {"url":"http://domain.tld/path/to/file"} @@ -28,7 +28,7 @@ Go to the "Developer Tools", then to "Services", and choose `downloader/download This will download the file from the given URL. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | | `url` | no | The URL of the file to download. | | `subdir` | yes | Download into subdirectory of **download_dir** | diff --git a/source/_integrations/drop_connect.markdown b/source/_integrations/drop_connect.markdown index d1994cc4b79e..f770e1f57046 100644 --- a/source/_integrations/drop_connect.markdown +++ b/source/_integrations/drop_connect.markdown @@ -55,13 +55,11 @@ Assistant. {% details "Manual configuration steps" %} - Browse to your Home Assistant instance. -- Go to **{% my integrations title="Settings > Devices & Services" %}**. +- Go to **{% my integrations title="Settings > Devices & services" %}**. - Set up the new discovered devices. {% enddetails %} -<div class="note"> - +{% important %} The MQTT broker address and port used for the DROP Hub must be the same as configured for the Home Assistant MQTT integration. - -</div> +{% endimportant %} diff --git a/source/_integrations/dsmr.markdown b/source/_integrations/dsmr.markdown index f115aec63257..df5497889505 100644 --- a/source/_integrations/dsmr.markdown +++ b/source/_integrations/dsmr.markdown @@ -1,6 +1,6 @@ --- -title: DSMR Slimme Meter -description: Instructions on how to integrate DSMR Smartmeter within Home Assistant. +title: DSMR Smart Meter +description: Instructions on how to integrate DSMR smart meter within Home Assistant. ha_category: - Energy ha_release: 0.34 @@ -19,7 +19,7 @@ A sensor platform for Belgian, Dutch, Luxembourg and Swedish Smart Meters which - Currently support DSMR V2.2, V3, V4, V5, Belgian V5 variant, Luxembourg V5 variant (Smarty), Swedish V5 variant and the EasyMeter Q3D (Germany) through the [dsmr_parser](https://github.com/ndokter/dsmr_parser) module by Nigel Dokter. - For official information about DSMR refer to: [DSMR Document](https://www.netbeheernederland.nl/dossiers/slimme-meter-15) -- For official information about the P1 port refer to: [P1 Companion Standard](https://www.netbeheernederland.nl/_upload/Files/Slimme_meter_15_a727fce1f1.pdf) +- For official information about the P1 port refer to: [P1 Companion Standard](https://www.netbeheernederland.nl/sites/default/files/2024-02/dsmr_5.0.2_p1_companion_standard.pdf) - For unofficial hardware connection examples refer to: [Domoticx](http://domoticx.com/p1-poort-slimme-meter-hardware/) - For official information about the Swedish variant refer to: [Swedish specification](https://www.energiforetagen.se/globalassets/energiforetagen/det-erbjuder-vi/kurser-och-konferenser/elnat/branschrekommendation-lokalt-granssnitt-v2_0-201912.pdf). - Supports [P1 cables](http://www.rfxcom.com/epages/78165469.sf/nl_NL/?ObjectPath=/Shops/78165469/Products/19602) integrated in a [RFXtrx device](http://www.rfxcom.com/epages/78165469.sf/nl_NL/?ObjectPath=/Shops/78165469/Products/18103). @@ -38,15 +38,15 @@ A sensor platform for Belgian, Dutch, Luxembourg and Swedish Smart Meters which ### Options -To configure options for DSMR integration go to **Settings** -> **Devices & Services** and press **Options** on the DSMR card. +To configure options for DSMR integration go to **Settings** -> **Devices & services** and press **Options** on the DSMR card. #### Time between updates Typically the smart meter sends new data every 5-10 seconds. This value defines the minimum time between entity updates in seconds. Setting this value to 0 will update entities each time data is received from the smart meter. -<div class='note warning'> +{% important %} Reducing the default time between updates will increase the amount of events generated and can potentially flood the system with events. -</div> +{% endimportant %} ### Supported meters @@ -93,6 +93,7 @@ $ docker run --device /dev/ttyUSB0:/dev/ttyUSB0 -d --name="home-assistant" -v /h - [Smart Meter bridge](https://github.com/legolasbo/smartmeterBridge) - [WIZnet WIZ110SR](https://www.wiznet.io/product-item/wiz110sr/) - [esp8266 SmartMeter (Poluket)](https://www.domohab.be/categorie-produit/passerelle/) (create for DSMR5 / ESMR5 Meter) +- [Smart Gateways NL](https://smartgateways.nl/) DIY solutions (ESP8266 based): diff --git a/source/_integrations/dte_energy_bridge.markdown b/source/_integrations/dte_energy_bridge.markdown deleted file mode 100644 index c40c920c394e..000000000000 --- a/source/_integrations/dte_energy_bridge.markdown +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: DTE Energy Bridge -description: Setup early-model DTE Energy Bridge with Home Assistant. -ha_category: - - Energy -ha_release: 0.21 -ha_iot_class: Local Polling -ha_domain: dte_energy_bridge -ha_platforms: - - sensor -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file ---- - -A sensor {% term integration %} for [DTE](https://www.newlook.dteenergy.com/) using an early model of the Energy Bridge. To find out which version of the DTE Energy Bridge you have, find the status LED on your box. - - - If the status LED is on the top, you have a v1. - - If the status LED is on the front, you have a v2. - -<div class='note'> - -The firmware of the DTE v2 bridges that started shipping circa mid-2020 will not work with this integration. This includes the model containing integrated Wi-Fi. - -You can check if your firmware is still supported by trying accessing `http://{ip_address}:8888/zigbee/se/instantaneousdemand`, and see if -you get a response. - -Later model DTE Energy Bridge hardware uses [MQTT](https://www.home-assistant.io/integrations/mqtt/) to communicate your energy data with Home Assistant. - -</div> - -To enable this sensor, add the following lines to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -sensor: - - platform: dte_energy_bridge - ip: 192.168.1.11 -``` - -{% configuration %} -ip: - description: The IP address of your bridge. - required: true - type: string -name: - description: Name to use in the frontend. - required: false - type: string -version: - description: Hardware version of the sensor. - required: false - type: string - default: 1 -{% endconfiguration %} diff --git a/source/_integrations/duckdns.markdown b/source/_integrations/duckdns.markdown index 5a6f42319862..b9608a96edac 100644 --- a/source/_integrations/duckdns.markdown +++ b/source/_integrations/duckdns.markdown @@ -14,11 +14,11 @@ related: The DuckDNS {% term integration %} allows you to keep your DuckDNS subdomain always in sync with your public IP address. [DuckDNS](https://www.duckdns.org) is a free service that allows you to bind your own favorite subdomain under `duckdns.org` to the public IP address in use from your router, even though such address is dynamically allocated by your internet service provider and therefore changes over time. -<div class='note'> +{% warning %} If you are running the Home Assistant DuckDNS add-on this integration is not required. The add-on will keep your IP updated with DuckDNS. -</div> +{% endwarning %} ## Configuration @@ -43,10 +43,10 @@ duckdns: type: string {% endconfiguration %} -## Service `set_txt` +## Action `set_txt` Set the TXT record of your DuckDNS subdomain. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------- | | `txt` | no | Payload for the TXT record. | diff --git a/source/_integrations/dwd_weather_warnings.markdown b/source/_integrations/dwd_weather_warnings.markdown index 52a2e5eade44..2e193cf3f3ae 100644 --- a/source/_integrations/dwd_weather_warnings.markdown +++ b/source/_integrations/dwd_weather_warnings.markdown @@ -47,8 +47,6 @@ Device tracker entity: | `warning_<x>_parameters` | *(list)* A list of additional warning parameters. More information can be found [here](https://www.dwd.de/DE/leistungen/opendata/help/warnungen/warning_codes_pdf.pdf?__blob=publicationFile&v=5). | | `warning_<x>_color` | *(str)* The DWD color of the warning encoded as `#rrggbb`. | -<div class="note"> - +{% note %} In the attribute name `x` is the counter of the warning starting from `1`. - -</div> +{% endnote %} diff --git a/source/_integrations/dweet.markdown b/source/_integrations/dweet.markdown index 8f6e3cff94af..5f7b2bd73833 100644 --- a/source/_integrations/dweet.markdown +++ b/source/_integrations/dweet.markdown @@ -21,9 +21,9 @@ The `dweet` {% term integration %} makes it possible to transfer details collect <img src='/images/screenshots/dweet-freeboard.png' /> </p> -<div class='note warning'> +{% note %} The publishing interval is limited to 1 second. This means that it's possible to miss fast changes. -</div> +{% endnote %} There is currently support for the following device types within Home Assistant: diff --git a/source/_integrations/dynalite.markdown b/source/_integrations/dynalite.markdown index a9ed3d2b8256..24850bdf27e1 100755 --- a/source/_integrations/dynalite.markdown +++ b/source/_integrations/dynalite.markdown @@ -54,35 +54,35 @@ For example, you would go to your kitchen light and turn it on. Now you log into The initial process can be a bit time consuming and tedious, but it only has to be done once. Once you are done configuring, it is better to set `autodiscover` to `false`, since there are many "fake" channels and areas that the system uses for internal communication and you do not want to have visible. -## Services +## Actions -### Service `dynalite.request_area_preset` +### Action `dynalite.request_area_preset` Send a command on the Dynalite network asking an area to report its currently selected preset. Normally, channel 1 (default) is used, but in some implementation, specific areas will need other channels. -<div class='note'> +{% note %} This does not return the area preset. It sends a network command asking the area to report its preset. Once it reports, that will be caught and handled by the system. -</div> +{% endnote %} -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------- | | `host` | yes | Which gateway to send the command to. If not specified, sends to all configured gateways. | | `area` | no | Area for the requested channel. | | `channel` | no | Which channel to request. | -### Service `dynalite.request_channel_level` +### Action `dynalite.request_channel_level` Send a command on the Dynalite network asking a specific channel in an area to report its current level. -<div class='note'> +{% note %} This does not return the channel level. It sends a network command asking the channel to report its level. Once it reports, that will be caught and handled by the system. -</div> +{% endnote %} -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------- | | `host` | yes | Which gateway to send the command to. If not specified, sends to all configured gateways. | | `area` | no | Which area to request the preset for. | diff --git a/source/_integrations/eafm.md b/source/_integrations/eafm.md index 2bd773d5ccf8..ff4f15548be3 100644 --- a/source/_integrations/eafm.md +++ b/source/_integrations/eafm.md @@ -12,15 +12,15 @@ ha_codeowners: The `eafm` integration offers integration with the [UK Environment Agency Flood Monitoring](https://flood-warning-information.service.gov.uk/) API to provide sensors for nearby water levels. Combined with Home Assistant notifications, you could give yourself a warning if a nearby river was likely to flood your local cycle path or the only road out of your village. -<div class='note warning'> +{% important %} The UK Environment Agency Flood Monitoring only provides data for England - Northern Ireland, Scotland and Wales have their own flood agencies. -</div> +{% endimportant %} ## Configuration -Home Assistant offers the flood monitoring integration through **Settings** -> **Devices & Services** -> **Environment Agency Flood Gauges**. +Home Assistant offers the flood monitoring integration through **Settings** -> **Devices & services** -> **Environment Agency Flood Gauges**. You will be prompted to select a monitoring station. You can find the name of nearby monitoring stations on the Flood information service [website](https://flood-warning-information.service.gov.uk/river-and-sea-levels). diff --git a/source/_integrations/easyenergy.markdown b/source/_integrations/easyenergy.markdown index 3797a95cffd9..6ad960470ad1 100644 --- a/source/_integrations/easyenergy.markdown +++ b/source/_integrations/easyenergy.markdown @@ -66,15 +66,15 @@ For the dynamic gas prices, only entities are created that display the `current` and `next hour` price because the price is always fixed for 24 hours; new prices are published every morning at **05:00 UTC time**. -## Services +## Actions -The energy and gas prices are exposed using [service calls](/docs/scripts/service-calls/). The services populate [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with price data. +The energy and gas prices are exposed using [actions](/docs/scripts/service-calls/). The actions populate [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with price data. -### Service `easyenergy.get_gas_prices` +### Action `easyenergy.get_gas_prices` Fetches the hourly prices for gas. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `config_entry` | no | Config entry to use. | 013713c172577bada2874a32dbe44feb | `incl_vat` | no | Defines whether the prices include or exclude VAT. Defaults to True | False @@ -100,11 +100,11 @@ The response data is a dictionary with the gas timestamps and prices as string a } ``` -### Service `easyenergy.get_energy_usage_prices` +### Action `easyenergy.get_energy_usage_prices` Fetches the hourly prices for energy that you use (buy). -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `config_entry` | no | Config entry to use. | 013713c172577bada2874a32dbe44feb | `incl_vat` | no | Defines whether the prices include or exclude VAT. Defaults to True | False @@ -130,11 +130,11 @@ The response data is a dictionary with the energy timestamps as strings and pric } ``` -### Service `easyenergy.get_energy_return_prices` +### Action `easyenergy.get_energy_return_prices` Fetches the hourly prices for energy that you return (sell). -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `config_entry` | no | Config entry to use. | 013713c172577bada2874a32dbe44feb | `start` | yes | Start time to get prices. Defaults to today 00:00:00 | 2023-01-01 00:00:00 diff --git a/source/_integrations/ecobee.markdown b/source/_integrations/ecobee.markdown index c71d87898e7b..5cc5586b9655 100644 --- a/source/_integrations/ecobee.markdown +++ b/source/_integrations/ecobee.markdown @@ -35,9 +35,9 @@ The **ecobee** {% term integration %} lets you control and view sensor data from You will need to obtain an API key from ecobee's [developer site](https://www.ecobee.com/developers/) to use this integration. To get the key, your thermostat must be registered on ecobee's website (which you likely would have already done while installing your thermostat). Once you have done that, perform the following steps. -<div class='note warning'> +{% warning %} As of March 28th, 2024, ecobee is no longer accepting new developer subscriptions, nor are existing developer accounts able to create new API keys. There is no ETA for when they will be allowed again. Existing API keys will continue to function. -</div> +{% endwarning %} 1. Click on the **Become a developer** link on the [developer site](https://www.ecobee.com/home/developer/loginDeveloper.jsp). 2. Log in with your ecobee credentials. (Make sure multifactor authentication is disabled to meet the developer login form's limits. If you've already enabled MFA, the web portal doesn't support disabling it. The iOS and Android apps do under Account > Account Security. You can re-enable MFA after becoming a developer.) @@ -59,7 +59,7 @@ Your new application will now appear on the left. Upon clicking on the applicati ## Configuration -1. In the **Settings** -> **Devices & Services** menu, click **+** and then select "ecobee" from the pop-up menu. +1. In the **Settings** -> **Devices & services** menu, click **+** and then select "ecobee" from the pop-up menu. 2. In the pop-up box, enter the API key you obtained from ecobee's [developer portal](https://ecobee.com/developers). 3. In the next pop-up box, you will be presented with a unique 8 character code separated by a dash (format: XXXX-XXXX), which you will need to authorize in the [ecobee consumer portal](https://www.ecobee.com/consumerportal/index.html). You can do this by logging in, selecting **My Apps** from the hamburger menu, clicking **Add Application** on the left, entering the PIN code from Home Assistant, clicking **Validate** and then **Add Application** in the bottom right. 4. After authorizing the app with ecobee, return to Home Assistant and click **Submit**. If the authorization was successful, a configuration entry will be created and your thermostats, ventilators and sensors will be available in Home Assistant. @@ -87,13 +87,13 @@ api_key: <img src='/images/screenshots/ecobee-thermostat-card.png' /> </p> -You must [restart Home Assistant](/docs/configuration/#reloading-changes) for the changes to take effect. After restarting, go to {% my integrations title="**Settings** > **Devices & Services**" %} and select the integration. Then, select **Configure** and continue to authorize the app according to the above **Automatic Configuration**, starting at step 2. +You must [restart Home Assistant](/docs/configuration/#reloading-changes) for the changes to take effect. After restarting, go to {% my integrations title="**Settings** > **Devices & services**" %} and select the integration. Then, select **Configure** and continue to authorize the app according to the above **Automatic Configuration**, starting at step 2. ## Notifications The `ecobee` notify platform allows you to send notifications to an ecobee thermostat. For each thermostat found, a `notify` entity will be added. -Example service call: +Example action: ```yaml service: notify.send_message @@ -124,7 +124,7 @@ The _HVAC mode_ of the device is the currently active operational modes that the The _target humidity_ is the humidity set point of the thermostat when a humidifier is connected and in manual control or "On" mode. -When enabling the auxiliary heat toggle, the ecobee thermostat HVAC mode will be changed to "Aux". However, Home Assistant will reflect that the thermostat is in "heat" mode. Disabling auxiliary heat will change the thermostat back to last active HVAC mode (heat, auto, etc). +On a thermostat configured with auxiliary heat, an aux_heat_only switch will be present. When this switch is turned on, the ecobee thermostat HVAC mode will be changed to "Aux". However, Home Assistant will reflect that the thermostat is in "heat" mode. Turning off the aux_heat_only switch will change the thermostat back to the last active HVAC mode (heat, auto, etc). ### Attributes @@ -156,9 +156,9 @@ The `ventilator 20 min` switch is behaving like the switch in the physical ecobe | `ventilator_min_on_time_home` | The minimum amount of time (in minutes) that the ventilator will run per hour, when you are home. This is determined by the minimum ventilator runtime setting which can be changed in the ecobee app or on the thermostat itself. | | `ventilator_min_on_time_away` | The minimum amount of time (in minutes) that the ventilator will run per hour, when you are away. This is determined by the minimum ventilator runtime setting which can be changed in the ecobee app or on the thermostat itself. | -## Services +## Actions -Besides the standard services provided by the Home Assistant [Climate](/integrations/climate/) integration, the following extra services are provided by the ecobee integration: +Besides the standard actions provided by the Home Assistant [Climate](/integrations/climate/) integration, the following extra actions are provided by the ecobee integration: - `ecobee.create_vacation` - `ecobee.delete_vacation` @@ -168,11 +168,11 @@ Besides the standard services provided by the Home Assistant [Climate](/integrat - `ecobee.set_mic_mode` - `ecobee.set_occupancy_modes` -### Service `ecobee.create_vacation` +### Action `ecobee.create_vacation` Creates a vacation on the selected ecobee thermostat. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | no | ecobee thermostat on which to create the vacation | | `vacation_name` | no | Name of the vacation to create. Must be unique on the thermostat | @@ -185,56 +185,56 @@ Creates a vacation on the selected ecobee thermostat. | `fan_mode` | yes | Fan mode of the thermostat during the vacation (auto or on) (auto if not provided) | | `fan_min_on_time` | yes | Minimum number of minutes to run the fan each hour (0 to 60) during the vacation (0 if not provided) | -### Service `ecobee.delete_vacation` +### Action `ecobee.delete_vacation` Delete a vacation on the selected ecobee thermostat. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------- | | `entity_id` | no | ecobee thermostat on which to delete the vacation | | `vacation_name` | no | Name of the vacation to delete | -### Service `ecobee.resume_program` +### Action `ecobee.resume_program` Resumes the standard active schedule of presets. This cancels any manual temperature settings or selected preset. This will not cancel vacation events, use `delete_vacation`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | yes | String or list of strings that point at `entity_id`s of climate devices to control. Omit to target all ecobee thermostats. | | `resume_all` | no | `true` will resume the standard schedule. `false` will only cancel the latest active event, which is not used often. | -### Service `ecobee.set_fan_min_on_time` +### Action `ecobee.set_fan_min_on_time` Sets the minimum amount of time that the fan will run per hour. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. Omit to target all ecobee thermostats. | | `fan_min_on_time` | no | integer (e.g., 5) | -### Service `ecobee.set_dst_mode` +### Action `ecobee.set_dst_mode` Enable/disable automatic daylight savings time. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | yes | ecobee thermostat on which to set daylight savings time mode. Omit to target all ecobee thermostats. | | `dst_enabled` | no | true or false | -### Service `ecobee.set_mic_mode` +### Action `ecobee.set_mic_mode` Enable/disable Alexa mic (only for ecobee 4). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------- | | `entity_id` | yes | ecobee thermostat on which to set the mic mode. Omit to target all ecobee thermostats. | | `mic_enabled` | no | true or false | -### Service `ecobee.set_occupancy_modes` +### Action `ecobee.set_occupancy_modes` Enable/disable Smart Home/Away and Follow Me modes. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------- | | `entity_id` | yes | ecobee thermostat on which to set occupancy modes. Omit to target all ecobee thermostats. | | `auto_away` | yes | true or false | diff --git a/source/_integrations/ecovacs.markdown b/source/_integrations/ecovacs.markdown index f38654e61489..f58ad2b0ccd2 100644 --- a/source/_integrations/ecovacs.markdown +++ b/source/_integrations/ecovacs.markdown @@ -8,7 +8,6 @@ ha_category: ha_iot_class: Cloud Push ha_release: 0.77 ha_codeowners: - - '@OverloadUT' - '@mib1185' - '@edenhaus' - '@Augar' @@ -142,7 +141,7 @@ Finally, if a vacuum becomes unavailable (usually due to being idle and off its ### Getting device and chargers coordinates -The integration has a `raw_get_positions` service to retrieve device and chargers coordinates. +The integration has a `raw_get_positions` action to retrieve device and chargers coordinates. Example: @@ -152,8 +151,8 @@ target: entity_id: vacuum.deebot_n8_plus ``` -{% details "Service response example" %} -The service call returns a raw response with a list of coordinates available in `resp -> body -> data` like this: +{% details "Action response example" %} +The action returns a raw response with a list of coordinates available in `resp -> body -> data` like this: ```yaml vacuum.deebot_n8_plus: diff --git a/source/_integrations/edl21.markdown b/source/_integrations/edl21.markdown index 728e847e564c..93a579d4c09e 100644 --- a/source/_integrations/edl21.markdown +++ b/source/_integrations/edl21.markdown @@ -44,7 +44,7 @@ For the efr SGM-C4 it is: - entering pin using quicker flashes, wait for 3 seconds for next digit - pin accepted - flashing 7 times to get to InF=OFF -- 5-second flash to switch to InF=OFF +- 5-second flash to switch to InF=ON You will now get more readings like current Power, Voltage, and phase angle. Some meters don´t have this, in that case only an overall reading is provided. diff --git a/source/_integrations/egardia.markdown b/source/_integrations/egardia.markdown index 0e6340aa99b1..dc1881a8b7da 100644 --- a/source/_integrations/egardia.markdown +++ b/source/_integrations/egardia.markdown @@ -99,9 +99,9 @@ report_server_codes: Note that this basic configuration will only enable you to read the armed/armed away/disarmed status of your alarm and will **not** update the status if the alarm is triggered. This is because of how Egardia built their system. The alarm triggers normally go through their servers. You can change this, however, using the following procedure. This is a more advanced (and more useful) configuration. -<div class='note'> +{% note %} There seem to be multiple versions of software running on GATE-02 devices; we have received reports from GATE-02 users who successfully run this package in GATE-02 mode. Others have reported they needed to specify GATE-03 as their version to integrate their GATE-02. -</div> +{% endnote %} ## Advanced configuration diff --git a/source/_integrations/electric_kiwi.markdown b/source/_integrations/electric_kiwi.markdown index f0887d991eb6..b61e4cea626f 100644 --- a/source/_integrations/electric_kiwi.markdown +++ b/source/_integrations/electric_kiwi.markdown @@ -21,8 +21,6 @@ This integration uses the official [Electric Kiwi API](https://developer.electri {% include integrations/config_flow.md %} -<div class='note'> - +{% note %} The configuration uses `client_id` and `client_secret` provided to Home Assistant, so all you need to do is install the integration and authenticate using your account credentials. - -</div> +{% endnote %} diff --git a/source/_integrations/elgato.markdown b/source/_integrations/elgato.markdown index 21edb1daaedd..2a6d1320e671 100644 --- a/source/_integrations/elgato.markdown +++ b/source/_integrations/elgato.markdown @@ -60,20 +60,20 @@ If you have a Key Light Mini, Home Assistant will provide an additional switch that allows the control of the "Studio mode" of your light. When studio mode is enabled, your battery will not be used and bypassed. -## Services +## Actions -### Service `elgato.identify` +### Action `elgato.identify` -The identify service shortly blinks the Elgato light. Originally meant as +The identify action shortly blinks the Elgato light. Originally meant as a way to identify which light you are talking to; it can also be used as -a service to create a visual notification. +an action to create a visual notification. -This service also works when the light is turned off and will turn off the +This action also works when the light is turned off and will turn off the light after the identification sequence has been completed. {% my developer_call_service badge service="elgato.identify" %} -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | Yes | String or list of Elgato light entity IDs. diff --git a/source/_integrations/elkm1.markdown b/source/_integrations/elkm1.markdown index 446c740ac59e..bc2dde98f4e6 100644 --- a/source/_integrations/elkm1.markdown +++ b/source/_integrations/elkm1.markdown @@ -441,10 +441,10 @@ The `event_data` contains the following: - `key_name`: The name of the key that was pressed. - `key`: The number of the key that was pressed. -## Services +## Actions -Besides the standard Home Assistant services for Alarm control panel, Climate, Light, Scene, Sensor, -and Switch the ElkM1 integration offers these additional services: +Besides the standard Home Assistant actions for Alarm control panel, Climate, Light, Scene, Sensor, +and Switch the ElkM1 integration offers these additional actions: - `elkm1.alarm_arm_home_instant` - `elkm1.alarm_arm_night_instant` @@ -460,31 +460,31 @@ and Switch the ElkM1 integration offers these additional services: - `elkm1.speak_phrase` - `elkm1.speak_word` -### Services `elkm1.alarm_arm_home_instant`, `elkm1.alarm_arm_night_instant`, and `elkm1.alarm_arm_vacation` +### Actions `elkm1.alarm_arm_home_instant`, `elkm1.alarm_arm_night_instant`, and `elkm1.alarm_arm_vacation` Arms the ElkM1 area in "home instant", "night instant", or "vacation" modes respectively. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------- | | `entity_id` | yes | ElkM1 area which to arm. | | `code` | no | Alarm code to arm the system (4 or 6 digits). | -### Services `elkm1.alarm_bypass` and `elkm1.alarm_clear_bypass` +### Actions `elkm1.alarm_bypass` and `elkm1.alarm_clear_bypass` -For all zones associated with the specified alarm panel these services respectively +For all zones associated with the specified alarm panel these actions respectively bypass or clear the bypass the zones. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------- | | `entity_id` | yes | ElkM1 area which to bypass or clear bypass. | | `code` | no | Alarm code to bypass the alarm panel (4 or 6 digits). | -### Service `elkm1.alarm_display_message` +### Action `elkm1.alarm_display_message` Display text on an area's keypads. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------- | | `entity_id` | yes | ElkM1 area which to display the message. | | `clear` | yes | 0=clear message, 1=clear message with * key, 2=Display until timeout; default 2 | @@ -493,66 +493,66 @@ Display text on an area's keypads. | `line1` | yes | Up to 16 characters of text (truncated if too long). Default blank. | | `line2` | yes | Up to 16 characters of text (truncated if too long). Default blank. | -### Service `elkm1.sensor_counter_refresh` +### Action `elkm1.sensor_counter_refresh` Refresh the value of a counter. Note that under certain conditions the panel does not automatically send a new value under certain -conditions. This service retrieves the current counter value. +conditions. This action retrieves the current counter value. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------- | | `entity_id` | yes | ElkM1 counter to refresh. | -### Service `elkm1.sensor_counter_set` +### Action `elkm1.sensor_counter_set` Set counter to value. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------- | | `entity_id` | yes | ElkM1 counter to refresh. | | `value` | no | Value to set the counter to Can be 0-65536. | -### Service `elkm1.sensor_zone_bypass` +### Action `elkm1.sensor_zone_bypass` Bypass a zone. Note that the only mechanism ElkM1 offers to clear the bypass is to clear all the bypassed zones in a given alarm panel (area). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | | `entity_id` | yes | ElkM1 zone which to bypass. | | `code` | no | Alarm code to bypass the zone (4 or 6 digits). | -### Service `elkm1.sensor_zone_trigger` +### Action `elkm1.sensor_zone_trigger` Cause a zone on the panel to trigger. This command creates a virtual momentary open condition on the zone as if the EOL hardwired loop had been physically opened. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------- | | `entity_id` | yes | ElkM1 zone which to trigger. | -### Service `elkm1.set_time` +### Action `elkm1.set_time` Set the time on the panel. Uses the current time on the instance of Home Assistant. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------- | | `prefix` | yes | Prefix to identify panel when multiple panels configured. | -### Service `elkm1.speak_phrase` +### Action `elkm1.speak_phrase` Speak a phrase. The list of phrases is defined in the ElkM1 ASCII Protocol documentation. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------- | | `phrase` | no | Phrase to speak. | | `prefix` | yes | Prefix to identify panel when multiple panels configured. | -### Service `elkm1.speak_word` +### Action `elkm1.speak_word` Speak a word. The list of words is defined in the ElkM1 ASCII Protocol documentation. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------- | | `word` | no | Word to speak. | | `prefix` | yes | Prefix to identify panel when multiple panels configured. | diff --git a/source/_integrations/emoncms.markdown b/source/_integrations/emoncms.markdown index f38f791adb0e..3f923a92f5c7 100644 --- a/source/_integrations/emoncms.markdown +++ b/source/_integrations/emoncms.markdown @@ -8,6 +8,7 @@ ha_iot_class: Local Polling ha_domain: emoncms ha_codeowners: - '@borpin' + - '@alexandrecuer' ha_platforms: - sensor ha_integration_type: integration diff --git a/source/_integrations/emulated_hue.markdown b/source/_integrations/emulated_hue.markdown index f77700816f71..2f31f19d02a7 100644 --- a/source/_integrations/emulated_hue.markdown +++ b/source/_integrations/emulated_hue.markdown @@ -16,43 +16,43 @@ related: title: Configuration file --- -<div class='note warning'> +{% warning %} Be aware that `emulated_hue` doesn't work for new users of **Google Home** with `emulated_hue`. If you've not previously set this up and had it working, use the [Google Assistant](/integrations/google_assistant/) integration or [Nabu Casa cloud](/integrations/cloud) integration. -</div> +{% endwarning %} The `emulated_hue` {% term integration %} provides a virtual [Philips Hue](https://www.philips-hue.com) bridge, written entirely in software that allows services that work with the Hue API to interact with Home Assistant entities. The driving use case behind this functionality is to allow Home Assistant to work with an Amazon Echo or Google Home with no setup cost outside of configuration changes. The virtual bridge can turn entities on/off or change the brightness of dimmable lights. The volume level of media players can be controlled as brightness. -<div class='note'> +{% important %} A physical Hue Bridge is required for Philips Hue lights to function - this virtual bridge will not replace a physical bridge. Instead, it allows Home Assistant to represent non-Philips Hue devices to Amazon Echo as Philips Hue devices, which Amazon Echo can control with built-in support. -</div> +{% endimportant %} -<div class='note'> +{% tip %} It is recommended to assign a static IP address to the computer running Home Assistant. This is because the Amazon Echo discovers devices by IP addresses, and if the IP changes, the Echo won't be able to control it. This is easiest done from your router, see your router's manual for details. -</div> +{% endtip %} -<div class='note'> +{% note %} Both Google Home and Alexa use the device they were initially set up with for communication with `emulated_hue`. In other words: if you remove/replace this device you will also break `emulated_hue`. To recover your `emulated_hue` functionality, backup your `config/.storage/emulated_hue.ids` file, delete the original one and reboot your Home Assistant instance. If you added or upgraded to a newer Alexa device and devices are not found, you must change to listen_port: 80. If Alexa responds with "value is out of range for device..." it means switches were automatically added as lights in discovery. Remove each device in the Alexa app. Turn on all the switches in Home Assistant. In the Alexa app go to "Add New Device" select "Switch" and then "other" to add them correctly. -</div> +{% endnote %} -<div class='note'> +{% note %} [Sleep Cycle](https://www.sleepcycle.com) and [Sleep as Android](https://sleep.urbandroid.org): smart alarm clock app can use emulated_hue to turn on and off entities. Sleep Cycle only has it implemented in the iOS app, see [Sleep Cycle support](https://support.sleepcycle.com/hc/articles/207670385-Does-Sleep-Cycle-integrates-with-Phillips-Hue-). The app requires the same configuration as Google Home and does not work if the type is defined as Alexa in the configuration. -</div> +{% endnote %} -<div class='note'> +{% note %} Logitech Harmony remotes cannot connect to this emulator via Android and iOS mobile applications because they require the physical button on the hub to be pressed. The [MyHarmony desktop software](https://support.myharmony.com/download) must be used with the original cable to connect it, then "Scan for Devices". -</div> +{% endnote %} ### Configuration @@ -149,11 +149,11 @@ The following are attributes that can be applied in the `entities` section: - **name** (*Optional*): The name that the emulated Hue will use. The default for this is the entity's friendly name. - **hidden** (*Optional*): Whether or not the emulated Hue bridge should expose the entity. Adding `hidden: false` will expose the entity to Alexa. The default value for this attribute is controlled by the `expose_by_default` option. -<div class='note'> +{% note %} These attributes used to be found under the `customize` section of `homeassistant`, however, they have now been moved to `entities`. Emulated Hue configuration under `homeassistant.customize` will be deprecated in the near future. -</div> +{% endnote %} ### Troubleshooting diff --git a/source/_integrations/emulated_kasa.markdown b/source/_integrations/emulated_kasa.markdown index 64a069280a36..df28a71f5b5c 100644 --- a/source/_integrations/emulated_kasa.markdown +++ b/source/_integrations/emulated_kasa.markdown @@ -23,11 +23,9 @@ The configuration includes a list of entities to expose with attributes for the If the entity is a sensor, that value will be reported as the current power usage unless the power field is defined. The power field can contain a hardcoded value, a sensor, or a template (see configuration example). -<div class='note'> - +{% note %} The provided power unit must be the current power usage in Watts. Values of `kW` can be converted, but the values of `kWh` cannot be used. - -</div> +{% endnote %} ## Configuration diff --git a/source/_integrations/emulated_roku.markdown b/source/_integrations/emulated_roku.markdown index 3626e7f996fb..4072fcba9417 100644 --- a/source/_integrations/emulated_roku.markdown +++ b/source/_integrations/emulated_roku.markdown @@ -18,19 +18,19 @@ so remotes such as Harmony and Android apps can connect to it through Wi-Fi as i Home Assistant will see key presses and app launches as Events, which you can use as triggers for automations. Multiple Roku servers may be started if you run out of buttons by specifying multiple server entries. -<div class='note'> +{% note %} Windows is not supported because Home Assistant uses `ProactorEventLoop` which does not support UDP sockets. -</div> +{% endnote %} -<div class='note warning'> +{% caution %} This {% term integration %} opens an unauthenticated API on the host, allowing anything on the local network to access your Home Assistant instance through the automations you create with emulated Roku as the trigger. Using a proxy with whitelisted IP addresses is recommended. (set `advertise_ip` to the proxy's IP or DNS name) -</div> +{% endcaution %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/energyzero.markdown b/source/_integrations/energyzero.markdown index 8183eb23f3d9..e26dc6568808 100644 --- a/source/_integrations/energyzero.markdown +++ b/source/_integrations/energyzero.markdown @@ -55,15 +55,15 @@ For the dynamic gas prices, only entities are created that display the `current` and `next hour` price because the price is always fixed for 24 hours; new prices are published every morning at **05:00 UTC time**. -## Services +## Actions -The energy and gas prices are exposed using [service calls](/docs/scripts/service-calls/). The services populate [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with price data. +The energy and gas prices are exposed using [actions](/docs/scripts/service-calls/). The actions populate [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with price data. -### Service `energyzero.get_gas_prices` +### Action `energyzero.get_gas_prices` -Fetches the gas prices. The `config_entry` value be found using the Services tab in the Developer Tools, selecting the desired entity and then switching to YAML. +Fetches the gas prices. The `config_entry` value be found using the **Actions** tab in the **Developer Tools**, selecting the desired entity and then switching to YAML. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `config_entry` | no | Config entry to use. | 1b4a46c6cba0677bbfb5a8c53e8618b0 | `incl_vat` | no | Defines whether the prices include or exclude VAT. | false @@ -94,13 +94,13 @@ The response data is a dictionary with the gas timestamps and prices as string a {% endraw %} -### Service `energyzero.get_energy_prices` +### Action `energyzero.get_energy_prices` -Fetches the energy prices. The `config_entry` value be found using the Services tab in the Developer Tools, selecting the desired entity and then switching to YAML. +Fetches the energy prices. The `config_entry` value be found using the **Actions** tab in the **Developer Tools**, selecting the desired entity and then switching to YAML. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| -| `config_entry` | no | Config entry to use. Can be found using the Services tab in the Developer Tools and switching to YAML. | 1b4a46c6cba0677bbfb5a8c53e8618b0 +| `config_entry` | no | Config entry to use. Can be found using the **Actions** tab in the **Developer Tools** and switching to YAML. | 1b4a46c6cba0677bbfb5a8c53e8618b0 | `incl_vat` | no | Defines whether the prices include or exclude VAT. | false | `start` | yes | Start time to get prices. Defaults to today 00:00:00 | 2023-01-01 00:00:00 | `end` | yes | End time to get prices. Defaults to today 00:00:00 | 2023-01-01 00:00:00 diff --git a/source/_integrations/enocean.markdown b/source/_integrations/enocean.markdown index 49968bb72e1a..9d61d04b79fe 100644 --- a/source/_integrations/enocean.markdown +++ b/source/_integrations/enocean.markdown @@ -65,8 +65,8 @@ Tested with: The following [EnOcean Equipment Profiles](https://www.enocean-alliance.org/specifications/) are supported: -- F6-02-01 (Light and Blind Control - Application Style 2) -- F6-02-02 (Light and Blind Control - Application Style 1) +- F6-02-01 (Light and Blind Control - Application Style 1) +- F6-02-02 (Light and Blind Control - Application Style 2) To use your EnOcean device, you first have to set up your EnOcean hub and then add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/enphase_envoy.markdown b/source/_integrations/enphase_envoy.markdown index e2f106dd5534..54315bea0b7b 100644 --- a/source/_integrations/enphase_envoy.markdown +++ b/source/_integrations/enphase_envoy.markdown @@ -38,6 +38,8 @@ This integration will offer various sensors depending on the configuration of yo _Consumption sensors require your Envoy to be properly configured with consumption <abbr title="current transformers">CT</abbr> sensors installed._ +### With current transformers + For Envoy S Metered / IQ Gateway Metered with installed and configured current transformers (CT), additional features are available: - Sensors for net production (grid export) and net consumption (grid import) if the consumption <abbr title="current transformers">CT</abbr> is a net-consumption <abbr title="current transformers">CT</abbr>. @@ -48,26 +50,32 @@ For Envoy S Metered / IQ Gateway Metered with installed and configured current t - Frequency net consumption <abbr title="current transformers">CT</abbr> (aggregate and phase). - Voltage net consumption <abbr title="current transformers">CT</abbr> (aggregate and phase).[^1] - Metering status for net consumption and production <abbr title="current transformers">CT</abbr> (`normal` | `not-metering` | `check-wiring`) (aggregate and phase). - - Meter status flags active for net consumption and production <abbr title="current transformers">CT</abbr> (aggregate and phase).[^2] + - Count of meter status flags active for net consumption and production <abbr title="current transformers">CT</abbr> (aggregate and phase).[^2] -[^1]: For multi-phase systems, the Envoy sums the voltages of the phases. May be valid for split-phase, but for 3-phase systems use the individual phases rather than the summed value. +[^1]: For multiphase systems, the Envoy sums the voltages of the phases. This may be valid for split-phase, but for 3-phase systems, use the individual phases rather than the summed value. [^2]: If this value is non-zero, consult the diagnostic report of the Envoy and look for `raw_data` - `/ivp/meters` - `statusFlags` for set flags (`production-imbalance` | `negative-production` | `power-on-unused-phase` | `negative-total-consumption`). +### With batteries + For Enphase Ensemble systems with the Enpower/IQ System Controller and Encharge/IQ Batteries installed, additional features are available: - Sensors for battery status and usage -- Sensors for grid status -- Sensors for the state of the Enpower's 4 load-shedding relays -- A switch allowing you to take your system on-grid and off-grid. Note that the Enpower has a slight delay built-in between receiving these commands and actually switching the system on or off grid. -- A switch allowing you to enable or disable charging the Encharge/IQ Batteries from the power grid. +- Sensors for grid status (*) +- Sensors for the state of the Enpower's four load-shedding relays (*) +- A switch allowing you to take your system on-grid and off-grid. Note that the Enpower has a slight delay built-in between receiving these commands and actually switching the system on or off grid. (*) +- A switch allowing you to enable or disable charging the Encharge/IQ batteries from the power grid. (*) - Support for changing the battery storage mode between full backup, self-consumption, and savings mode and setting the reserve battery level for outages. - If a storage <abbr title="current transformers">CT</abbr> is installed: - - Sensors for battery storage energy charged and discharged and current active power discharge/charge + - Sensors for battery storage energy charged and discharged and current active power discharge/charge - Disabled sensors for: - Phase battery storage energy charged and discharged and current power discharge/charge - - Voltage net consumption <abbr title="current transformers">CT</abbr> (aggregate and phase) + - Voltage storage <abbr title="current transformers">CT</abbr> (aggregate and phase) - Metering status for storage <abbr title="current transformers">CT</abbr> (aggregate and phase) - - Meter status flags active storage <abbr title="current transformers">CT</abbr> (aggregate and phase) + - Count of meter status flags active storage <abbr title="current transformers">CT</abbr> (aggregate and phase) + +The load shedding and on/off-grid functions marked (*) are only available with the Enpower/IQ System Controller installed. In battery installations without off-grid functionality, used in many EU countries, these off-grid related sensors and switches are not available. + +In multiphase installations with batteries, in countries with phase-balancing grid meters, the battery will export to the grid on one phase the amount it lacks on another phase, as if it is using the grid as a 'transport' between phases. Since the grid meter will balance the amount in and exported on the two phases, the net result is zero. The Envoy multiphase consumption CTs, however, will report the amounts on both phases, resulting in too high export on one and too high import on the other. One needs to use the sum of grid import and export to eliminate this effect. ## Envoy authentication requirements @@ -89,11 +97,11 @@ When the relay mode is set to battery level, the relays will turn on and off bas ## Polling interval -The default polling interval is 60 seconds. To customize the polling interval, refer to [defining a custom polling interval](/common-tasks/general/#defining-a-custom-polling-interval). Specify one single entity from the envoy device as target of the service using the `+ choose entity` button. Updating one entity will update all entities of the Envoy and the related devices like the inverters; there is no need to specify multiple or all entities or add (all) inverter entities. When using multiple Envoys, add one entity for each envoy as targets or create separate custom polling intervals with a single entity as needed. +The default polling interval is 60 seconds. To customize the polling interval, refer to [defining a custom polling interval](/common-tasks/general/#defining-a-custom-polling-interval). Specify one single entity from the envoy device as target of the action using the `+ choose entity` button. Updating one entity will update all entities of the Envoy and the related devices like the inverters; there is no need to specify multiple or all entities or add (all) inverter entities. When using multiple Envoys, add one entity for each envoy as targets or create separate custom polling intervals with a single entity as needed. ## Credentials or device IP address update -This integration supports updating the Envoy configuration through a `reconfigure` menu option. The reconfiguration allows for changing the Envoy IP address, username, and/or password. Use this menu option if your Enlighten credentials or the device's IP address has changed and needs to be manually updated. The latter is typically automatically detected and updated. +This integration supports updating the Envoy configuration through a `reconfigure` menu option. The reconfiguration allows for changing the Envoy IP address, username, and/or password. Use this menu option if your Enlighten credentials or the device's IP address has changed and needs to be manually updated. The latter is typically automatically detected and updated. Use this menu option also when an Envoy firmware upgrade requires a switch from local Envoy username/password to token-based authentication with Enlighten username/password (refer to [authentication requirements](#envoy-authentication-requirements)). @@ -111,6 +119,12 @@ This integration provides several values suitable for the energy dashboard: [^5]: Only applies when using Envoy S Metered / IQ Gateway Metered / IQ Combiner with installed and configured storage / battery <abbr title="current transformers">CT</abbr>. +## Configure + +The integration provides a `configure` menu to configure the following options: + +- Collect test fixture data in [diagnostics report](#diagnostics) - No/Yes + ## Debug logs and diagnostics This integration provides debug logs and diagnostics reports as described in the [Home Assistant troubleshooting pages](/docs/configuration/troubleshooting/#debug-logs-and-diagnostics). @@ -144,7 +158,11 @@ The end of a collection cycle is marked by: ### Diagnostics -The diagnostics file is a JSON file and includes a `data` section with the details for this integration. The file can be viewed with any text editor[^4]. The data section has 5 major subsections which reflects how the integration is setup and data is used. Below the 5 subsections, each collapsed. +The diagnostics file is a JSON file and includes a `data` section with the details for this integration. The file can be viewed with any text editor[^4]. The data section has up to 6 major subsections which reflect how the integration is set up and data is used. + +When new features are requested or firmware is upgraded, it can happen that existing test fixtures no longer cover all test cases and new ones are needed. It may happen, you are requested to provide data for such test fixtures. The diagnostics report can provide the needed information to build such test fixtures. By default, the diagnostics report does not include this data. To include the test fixture data, enable this option in the integration [configure](#configure) menu. When this option is enabled, the creation of the diagnostic report may take longer as it will perform a scan of the Envoy. When done creating the report, clear the option to prevent this delay the next time a diagnostic report is created. The option has no impact on the integration's performance, only on the time it takes to create the report. + +Below the 6 subsections, each collapsed. [^4]: Use of a JSON-aware viewer is not required but makes inspecting the file easier. @@ -159,7 +177,9 @@ The diagnostics file is a JSON file and includes a `data` section with the detai "envoy_model_data": { ... }, "envoy_entities_by_device": [ ... - ] + ], + "fixtures" : { ... + } } } ``` @@ -183,3 +203,7 @@ Shows the data of the Envoy extracted from the raw_data into Envoy class data us #### Envoy entities by device Shows all entities created by the integration based on the findings of the initial scan, grouped by device. Entity state based on the last data collection cycle is included. State values here come from the Envoy model data and are the values visible in the dashboards. + +#### Fixtures + +The data to build test fixtures from. This section is only available when the option to provide this is enabled in the integration [configuration](#configure). Information is collected from the envoy in a scan for known and needed endpoints. Data is collected to enable the developers to build test fixtures from it. diff --git a/source/_integrations/entur_public_transport.markdown b/source/_integrations/entur_public_transport.markdown index d352222e08ea..6af51bcf8fbc 100644 --- a/source/_integrations/entur_public_transport.markdown +++ b/source/_integrations/entur_public_transport.markdown @@ -19,9 +19,9 @@ For each stop place given in the configuration, a sensor will be mounted for tha Real-time data is fetched from [Entur](https://www.entur.no). Entur is a service which collects and delivers information about all public transport available in Norway under an [open source license](https://data.norge.no/nlod/no). -<div class='note'> -Note that the underlying API is rate limited and to avoid getting your instance blocked from entur the sensor is only fetching new information every 45 seconds. It's recommended to not schedule updates more often than this. -</div> +{% note %} +Note that the underlying API is rate limited and to avoid getting your instance blocked from Entur the sensor is only fetching new information every 45 seconds. It's recommended to not schedule updates more often than this. +{% endnote %} ## Configuration diff --git a/source/_integrations/environment_canada.markdown b/source/_integrations/environment_canada.markdown index 5d36c0a378bf..bd450f2e51e9 100644 --- a/source/_integrations/environment_canada.markdown +++ b/source/_integrations/environment_canada.markdown @@ -41,7 +41,7 @@ The integration will create the entities listed below. Some of the entities are ### Camera -- Loop of radar imagery from the last 3 hours (disabled by default). Also, by default this entity uses the radar rain layer from 1 April to 30 November and the snow layer from 1 December to 31 March. The rain/snow layer can be changed using the service described below. +- Loop of radar imagery from the last 3 hours (disabled by default). Also, by default, this entity uses the radar rain layer from 1 April to 30 November and the snow layer from 1 December to 31 March. The rain/snow layer can be changed using the action described below. ### Sensors @@ -100,7 +100,7 @@ Although infrequent, there have been some outages and instabilities of the Envir 2022-10-05 12:25:08.619 ERROR (MainThread) [homeassistant.components.environment_canada] Timeout fetching environment_canada weather data ``` -The first course of action should be to check if there are known problems with the service. Look for recent messages on the [Environment Canada mailing list](https://lists.ec.gc.ca/pipermail/dd_info/) ([example message](https://lists.ec.gc.ca/pipermail/dd_info/2022-October/000542.html)). The next course of action is to post on the forum. The answers are usually already known by someone. +The first course of action should be to check if there are known problems with the service. Look for recent messages on the [Environment Canada mailing list](https://comm.collab.science.gc.ca/mailman3/hyperkitty/list/dd_info@comm.collab.science.gc.ca/) ([example message](https://comm.collab.science.gc.ca/mailman3/hyperkitty/list/dd_info@comm.collab.science.gc.ca/thread/QJHBU7C5MWICGFHETGQ5752MUWR6OZ6G/)). The next course of action is to post on the forum. The answers are usually already known by someone. ### Sensor `unavailable` or `unknown` @@ -133,13 +133,13 @@ template: {% endraw %} -## Services +## Actions -### Service `environment_canada.set_radar_type` +### Action `environment_canada.set_radar_type` Sets the type of radar to retrieve for the camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | Camera to set the radar type for. | `radar_type` | no | One of "Auto", "Rain", or "Snow". diff --git a/source/_integrations/envisalink.markdown b/source/_integrations/envisalink.markdown index ff46591c855b..a61edf68fda3 100644 --- a/source/_integrations/envisalink.markdown +++ b/source/_integrations/envisalink.markdown @@ -109,7 +109,7 @@ timeout: default: 10 type: integer panic_type: - description: "Both DSC and Honeywell boards support a panic alarm. This is used when the alarm_trigger service is called in Home Assistant. This determines which type of panic alarm to raise. Valid values are: Police, Fire, Ambulance." + description: "Both DSC and Honeywell boards support a panic alarm. This is used when the alarm_trigger action is called in Home Assistant. This determines which type of panic alarm to raise. Valid values are: Police, Fire, Ambulance." required: false default: Police type: string @@ -138,9 +138,9 @@ partitions: type: string {% endconfiguration %} -## Services +## Actions -The following services are supported by Envisalink and can be used to script or automate the alarm. +The following actions are supported by Envisalink and can be used to script or automate the alarm. - **alarm_disarm**: Disarms the alarm with the user code provided, or the code specified in the configuration. - **alarm_arm_home**: Arms the alarm in home mode. @@ -155,8 +155,8 @@ The following services are supported by Envisalink and can be used to script or The zone status binary sensors have extra attributes representing additional information about each zone. -| Name | Description | -| ------------------- | --------------------------------------------------------------------- | -| `last_tripped_time` | Last time this zone was tripped. | -| `zone` | Zone number. Can be used in combination with `alarm_keypress` service | +| Name | Description | +| ------------------- | -------------------------------------------------------------------- | +| `last_tripped_time` | Last time this zone was tripped. | +| `zone` | Zone number. Can be used in combination with `alarm_keypress` action | to issue commands relating to this zone. diff --git a/source/_integrations/ephember.markdown b/source/_integrations/ephember.markdown index 4b49f26b053b..1fc0ecf3dfc8 100644 --- a/source/_integrations/ephember.markdown +++ b/source/_integrations/ephember.markdown @@ -48,4 +48,4 @@ The supported operation modes map to the ON/OFF period selection of your timeswi - **Off** The timeswitch is permanently off. If **All Day** is selected in the EMBER app it will show as **Auto** in Home Assistant. -To **Boost** your heating, you should call the `climate.set_aux_heater` service on your zone entity. This will then **Boost** that zone for 1 hour. +To **Boost** your heating, you should use the `climate.set_aux_heater` action on your zone entity. This will then **Boost** that zone for 1 hour. diff --git a/source/_integrations/esphome.markdown b/source/_integrations/esphome.markdown index dda362e5ab80..7f03d5d0081c 100644 --- a/source/_integrations/esphome.markdown +++ b/source/_integrations/esphome.markdown @@ -41,6 +41,7 @@ ha_platforms: - valve ha_integration_type: device ha_dhcp: true +ha_quality_scale: platinum works_with: - local --- @@ -49,9 +50,9 @@ This integration allows [ESPHome](https://esphome.io) devices to connect directl {% include integrations/config_flow.md %} -## Home Assistant service calls +## Home Assistant actions -ESPHome devices can make service calls to any [Home Assistant service](https://esphome.io/components/api.html#homeassistant-service-action). This functionality is not enabled by default for newly configured device, but can be turned on the options flow on a per device basis. +ESPHome devices can perform actions to any [Home Assistant action](https://esphome.io/components/api.html#homeassistant-service-action). This functionality is not enabled by default for newly configured device, but can be turned on the options flow on a per device basis. {% include integrations/option_flow.md %} diff --git a/source/_integrations/eufylife_ble.markdown b/source/_integrations/eufylife_ble.markdown index 39a99de70eed..3f9937844598 100644 --- a/source/_integrations/eufylife_ble.markdown +++ b/source/_integrations/eufylife_ble.markdown @@ -24,11 +24,9 @@ The EufyLife integration allows you to integrate Eufy smart scales with Home Ass - [Smart Scale P2 (T9148)](https://us.eufy.com/products/t9148) - [Smart Scale P2 Pro (T9149)](https://us.eufy.com/products/t9149111) -<div class='note'> - +{% note %} This integration does not support the Wi-Fi capabilities of the P2 and P2 Pro. It can only connect to your smart scale via Bluetooth. - -</div> +{% endnote %} ## Features diff --git a/source/_integrations/event.mqtt.markdown b/source/_integrations/event.mqtt.markdown index 39253b0aed19..645264b8a031 100644 --- a/source/_integrations/event.mqtt.markdown +++ b/source/_integrations/event.mqtt.markdown @@ -179,11 +179,9 @@ value_template: type: template {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ### Full configuration with JSON data diff --git a/source/_integrations/everlights.markdown b/source/_integrations/everlights.markdown index d5842cadcdde..035931521694 100644 --- a/source/_integrations/everlights.markdown +++ b/source/_integrations/everlights.markdown @@ -39,7 +39,7 @@ hosts: ### Effects -EverLights patterns saved to the control box can be activated using the effect parameter to the `light.turn_on` service. If an effect is specified, then the color and brightness are ignored. +EverLights patterns saved to the control box can be activated using the effect parameter to the `light.turn_on` action. If an effect is specified, then the color and brightness are ignored. ### Limitations diff --git a/source/_integrations/evohome.markdown b/source/_integrations/evohome.markdown index 5854d34ae0f3..ea3cd3413f38 100644 --- a/source/_integrations/evohome.markdown +++ b/source/_integrations/evohome.markdown @@ -116,15 +116,15 @@ Some locations have a hidden mode, **AutoWithReset**, that will behave as **Auto In the Home Assistant schema, all this is done via a combination of `HVAC_MODE` and `PRESET_MODE` (but also see the state attributes `system_mode_status` and `setpoint_status`, below). -## Service calls +## Action calls -This integration provides its own service calls to expose the full functionality of TCC systems beyond the limitations of Home Assistant's standardized schema. Mostly, this relates to specifying the duration of mode changes, after which time the entities revert to **Auto** or **FollowSchedule** (for locations and zones, respectively). +This integration provides its own actions to expose the full functionality of TCC systems beyond the limitations of Home Assistant's standardized schema. Mostly, this relates to specifying the duration of mode changes, after which time the entities revert to **Auto** or **FollowSchedule** (for locations and zones, respectively). -It is recommended to use the native service calls (e.g., `evohome.set_system_mode`) instead of Home Assistant's generic equivalents (e.g., `climate.set_hvac_mode`) whenever possible. However, it may be necessary to use the generic service calls for integration with 3rd party systems such as Amazon Alexa or Google Home. +It is recommended to use the native actions (e.g., `evohome.set_system_mode`) instead of Home Assistant's generic equivalents (e.g., `climate.set_hvac_mode`) whenever possible. However, it may be necessary to use the generic actions for integration with 3rd party systems such as Amazon Alexa or Google Home. ### evohome.set_system_mode -This service call will set the operating `mode` of the system for a specified period of time, after which it will revert to **Auto**. However, if no period of time is provided, then the change is permanent. +This action call will set the operating `mode` of the system for a specified period of time, after which it will revert to **Auto**. However, if no period of time is provided, then the change is permanent. For **AutoWithEco**, the period of time is a `duration` is up to 24 hours. @@ -148,17 +148,17 @@ For the other modes, such as **Away**, the duration is a `period` of days, where ### evohome.reset_system -This service call will set the operating mode of the system to **AutoWithReset**, and reset all the zones to **FollowSchedule**. +This action will set the operating mode of the system to **AutoWithReset**, and reset all the zones to **FollowSchedule**. Not all systems support this feature. ### evohome.refresh_system -This service call will immediately pull the latest state data from the vendor's servers rather than waiting for the next `scan_interval`. +This action will immediately pull the latest state data from the vendor's servers rather than waiting for the next `scan_interval`. ### evohome.set_zone_override -This service call will set the `setpoint` of a zone, as identified by its `entity_id`, for a specified period of time (**TemporaryOverride**). However, if no period of time is provided (c.f. a duration of 0, below), then the change is permanent (**PermanentOverride**). +This action will set the `setpoint` of a zone, as identified by its `entity_id`, for a specified period of time (**TemporaryOverride**). However, if no period of time is provided (c.f. a duration of 0, below), then the change is permanent (**PermanentOverride**). ```yaml - action: @@ -183,7 +183,7 @@ The `duration` can be up to 24 hours, after which the zone mode will revert to s ### evohome.clear_zone_override -This service call is used to set a zone, as identified by its `entity_id`, to **FollowSchedule**. +This action is used to set a zone, as identified by its `entity_id`, to **FollowSchedule**. ## Useful Jinja templates diff --git a/source/_integrations/ezviz.markdown b/source/_integrations/ezviz.markdown index 8fc658bd9155..ee8036389972 100644 --- a/source/_integrations/ezviz.markdown +++ b/source/_integrations/ezviz.markdown @@ -73,63 +73,63 @@ You can also change the camera options should you need to access a high or low r - Please note this only works on the camera entities. -### Service `ezviz.alarm_sound` +### Action `ezviz.alarm_sound` -If your EZVIZ camera supports warning sounds, you can use this service to set the intensity. +If your EZVIZ camera supports warning sounds, you can use this action to set the intensity. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | | `level` | Set the sound level to 0 for Soft, 1 for Intensive or 2 to disable | -### Service `ezviz.ptz` +### Action `ezviz.ptz` If your EZVIZ camera supports <abbr title="pan, tilt, and zoom">PTZ</abbr>, you will be able to pan or tilt your camera. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | | `direction` | Direction of the movement. Allowed values: `up`, `down`, `left`, `right` | | `speed` | (Optional) Speed to in which to move the camera. Allowed values: int from 1 to 9. Default: 5 | -### Service `ezviz.set_alarm_detection_sensibility` +### Action `ezviz.set_alarm_detection_sensibility` -If your EZVIZ camera supports motion detection, you will be able to set the sensitivity level using this service. +If your EZVIZ camera supports motion detection, you will be able to set the sensitivity level using this action. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | | `level` | Sensibility level (1-6) for type 0 (Normal camera) or (1-100) for type 3 (PIR sensor camera). | | `type_value` | Type of detection. Options : 0 - Camera or 3 - PIR Sensor Camera. | -### Service `ezviz.sound_alarm` +### Action `ezviz.sound_alarm` -If your EZVIZ camera has a built-in siren, you can use this service to make a noise. +If your EZVIZ camera has a built-in siren, you can use this action to make a noise. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | | `enable` | Sound the alarm by setting this to 1 or stop the siren by setting this to 0. | -### Service `ezviz.wake_device` +### Action `ezviz.wake_device` -If you have "sleep" mode enabled on your camera, you can use this service to wake it. Especially useful for battery cameras. +If you have "sleep" mode enabled on your camera, you can use this action to wake it. Especially useful for battery cameras. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | -To enable/disable motion detection, use the Home Assistant built in services. +To enable/disable motion detection, use the Home Assistant built in actions. -### Service `camera.enable_motion_detection` +### Action `camera.enable_motion_detection` -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | -### Service `camera.disable_motion_detection` +### Action `camera.disable_motion_detection` -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | diff --git a/source/_integrations/facebook.markdown b/source/_integrations/facebook.markdown index c2fc73491200..a92e01e98dcf 100644 --- a/source/_integrations/facebook.markdown +++ b/source/_integrations/facebook.markdown @@ -33,7 +33,7 @@ page_access_token: required: true type: string name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: "`notify`" type: string @@ -41,7 +41,7 @@ name: ### Usage -With Facebook notify service, you can send your notifications to your Facebook messenger with help of your Facebook page. You have to create a [Facebook Page and App](https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start) for this service. You can control it by calling the notify service [as described here](/integrations/notify/). It will send a message on messenger to user specified by **target** on behalf of your page. See the [quick start](https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start) guide for more information. +With Facebook notify action, you can send your notifications to your Facebook messenger with help of your Facebook page. You have to create a [Facebook Page and App](https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start) for this action. You can control it by calling the notify action [as described here](/integrations/notify/). It will send a message on messenger to user specified by **target** on behalf of your page. See the [quick start](https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start) guide for more information. The phone number used in **target** should be registered with Facebook messenger. Phone number of the recipient should be in +1(212)555-2368 format. If your app is not approved by Facebook then the recipient should by either admin, developer or tester for your Facebook app. [More information](https://developers.facebook.com/docs/messenger-platform/reference/send-api#phone_number) about the phone number. ```yaml diff --git a/source/_integrations/fail2ban.markdown b/source/_integrations/fail2ban.markdown index 76ab10e56774..4247d387d0ea 100644 --- a/source/_integrations/fail2ban.markdown +++ b/source/_integrations/fail2ban.markdown @@ -16,11 +16,11 @@ related: The `fail2ban` {% term integration %} allows for IPs banned by [fail2ban](https://www.fail2ban.org/wiki/index.php/Main_Page) to be displayed in the Home Assistant frontend. -<div class='note'> +{% important %} Your system must have `fail2ban` installed and correctly configured for this sensor to work. In addition, Home Assistant must be able to read the `fail2ban` log file. -</div> +{% endimportant %} ## Configuration @@ -55,11 +55,11 @@ file_path: ### Fail2Ban with Docker -<div class='note'> +{% important %} These steps assume you already have the Home Assistant Docker running behind NGINX and that it is externally accessible. It also assumes the Docker is running with the `--net='host'` flag. -</div> +{% endimportant %} For those of us using Docker, the above tutorial may not be sufficient. The following steps specifically outline how to set up `fail2ban` and Home Assistant when running Home Assistant within a Docker behind NGINX. The setup this was tested on was an unRAID server using the [SWAG](https://github.com/linuxserver/docker-swag) from linuxserver.io. diff --git a/source/_integrations/fan.markdown b/source/_integrations/fan.markdown index 44a26535ed6b..ca7525d9477d 100644 --- a/source/_integrations/fan.markdown +++ b/source/_integrations/fan.markdown @@ -15,24 +15,24 @@ The fan integration allows you to control and monitor fan devices. {% include integrations/building_block_integration.md %} -## Services +## Actions -### Fan control services +### Fan control actions -Available services: +Available actions: `fan.set_percentage`, `fan.set_preset_mode`, `fan.set_direction`, `fan.oscillate`, `fan.turn_on`, `fan.turn_off`, `fan.toggle`, `fan.increase_speed`, `fan.decrease_speed` -<div class='note'> +{% note %} -Not all fan services may be available for your platform. You can check which services are available for your fan(s) under **Developer Tools** > **Services**. +Not all fan actions may be available for your platform. You can check which actions are available for your fan(s) under **Developer Tools** > **Actions**. -</div> +{% endnote %} -### Service `fan.set_percentage` +### Action `fan.set_percentage` Sets the speed percentage for fan device. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of fan device(s) to control. To target all fan devices, use `all`. | `percentage` | no | Percentage speed setting @@ -52,11 +52,11 @@ automation: percentage: 33 ``` -### Service `fan.set_preset_mode` +### Action `fan.set_preset_mode` Sets a preset mode for the fan device. Available preset modes are defined by the integration that supplies the fan entity to Home Assistant. For example, the ESPHome [Speed Fan](https://esphome.io/components/fan/speed.html) component provides three available presets by default: `Low`, `Medium`, and `High`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of fan device(s) to control. To target all fan devices, use `all`. | `preset_mode` | no | The preset mode @@ -76,11 +76,11 @@ automation: preset_mode: auto ``` -### Service `fan.set_direction` +### Action `fan.set_direction` Sets the rotation for fan device. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of fan device(s) to control. To target all fan devices, use `all`. | `direction` | no | The direction to rotate. Either `forward` or `reverse` @@ -100,11 +100,11 @@ automation: direction: forward ``` -### Service `fan.oscillate` +### Action `fan.oscillate` Sets the oscillation for fan device. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of fan device(s) to control. To target all fan devices, use `all`. | `oscillating` | no | Flag to turn on/off oscillation. Either `True` or `False`. @@ -124,21 +124,21 @@ automation: oscillating: True ``` -### Service `fan.turn_on` +### Action `fan.turn_on` Turn fan device on. This is only supported if the fan device supports being turned off. See a similar example under `fan.turn_off`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of fan device(s) to control. To target all fan devices, use `all`. | `percentage` | yes | Percentage speed setting | `preset_mode` | yes | The preset mode -### Service `fan.turn_off` +### Action `fan.turn_off` Turn fan device off. This is only supported if the fan device supports being turned on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of fan device(s) to control. To target all fan devices, use `all`. @@ -158,11 +158,11 @@ automation: speed: low ``` -### Service `fan.increase_speed` +### Action `fan.increase_speed` Increases the speed of the fan device. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of fan device(s) to control. To target all fan devices, use `all`. | `percentage_step` | yes | Increase speed by a percentage. Should be between 0..100. @@ -183,11 +183,11 @@ automation: entity_id: fan.dining_room_fan_by_front_door ``` -### Service `fan.decrease_speed` +### Action `fan.decrease_speed` Decreases the speed of the fan device. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that define the entity ID(s) of fan device(s) to control. To target all fan devices, use `all`. | `percentage_step` | yes | Decrease speed by a percentage. Should be between 0..100. diff --git a/source/_integrations/fan.mqtt.markdown b/source/_integrations/fan.mqtt.markdown index 2af02cfcd24f..4a56e0d507a8 100644 --- a/source/_integrations/fan.mqtt.markdown +++ b/source/_integrations/fan.mqtt.markdown @@ -305,11 +305,11 @@ unique_id: type: string {% endconfiguration %} -<div class='note warning'> +{% important %} Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics. -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/fan.template.markdown b/source/_integrations/fan.template.markdown index e526bd82c4a9..01ae4f6a7950 100644 --- a/source/_integrations/fan.template.markdown +++ b/source/_integrations/fan.template.markdown @@ -3,14 +3,23 @@ title: "Template fan" description: "Instructions how to setup the template fans within Home Assistant." ha_category: - Fan + - Helper ha_release: 0.69 ha_iot_class: Local Push ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' ha_domain: template +ha_platforms: + - fan +ha_integration_type: helper +related: + - docs: /docs/configuration/ + title: Configuration file --- The **Template** {% term integration %} creates fans that combine integrations and provides the -ability to run scripts or invoke services for each of the `turn_on`, `turn_off`, `set_percentage`, +ability to run scripts or invoke actions for each of the `turn_on`, `turn_off`, `set_percentage`, `set_preset_mode`, `set_oscillating`, and `set_direction` commands of a fan. ## Configuration @@ -130,7 +139,7 @@ fan: type: [string, list] default: [] speed_count: - description: The number of speeds the fan supports. Used to calculate the percentage step for the `fan.increase_speed` and `fan.decrease_speed` services. + description: The number of speeds the fan supports. Used to calculate the percentage step for the `fan.increase_speed` and `fan.decrease_speed` actions. required: false type: integer default: 100 @@ -154,7 +163,7 @@ When converting a fan with 3 speeds from the old fan entity model, the following ### Helper fan This example uses an input_boolean and an input_number to mimic a fan, and -the example shows multiple service calls for set_percentage. +the example shows multiple actions for `set_percentage`. {% raw %} diff --git a/source/_integrations/fastdotcom.markdown b/source/_integrations/fastdotcom.markdown index dd8d9b5fb59d..5af3793a629f 100644 --- a/source/_integrations/fastdotcom.markdown +++ b/source/_integrations/fastdotcom.markdown @@ -20,16 +20,14 @@ ha_quality_scale: gold The `fastdotcom` integration uses the [Fast.com](https://fast.com/) web service to measure network bandwidth performance. -<div class='note'> - +{% note %} Currently, the Fast.com integration only supports measuring download bandwidth. If you want to measure bandwidth metrics other than download such as ping and upload, utilize the [Speedtest.net](/integrations/speedtestdotnet) integration. - -</div> +{% endnote %} Enabling this integration will automatically create the Fast.com Sensor. -By default, a speed test will be run every hour. The user can manually run a speed test via the `homeassistant.update_entity` service. +By default, a speed test will be run every hour. The user can manually run a speed test via the `homeassistant.update_entity` action. {% include integrations/config_flow.md %} diff --git a/source/_integrations/feedreader.markdown b/source/_integrations/feedreader.markdown index 9ef96296dd7f..c5fa88b6a1d4 100644 --- a/source/_integrations/feedreader.markdown +++ b/source/_integrations/feedreader.markdown @@ -2,10 +2,14 @@ title: Feedreader description: Instructions on how to integrate RSS feeds into Home Assistant. ha_category: + - Event - Other ha_release: 0.18 ha_iot_class: Cloud Polling ha_domain: feedreader +ha_config_flow: true +ha_platforms: + - event ha_integration_type: integration related: - docs: /docs/configuration/ @@ -14,48 +18,9 @@ related: Add an RSS/Atom feed reader that polls feeds every hour and sends new entries into the event bus. -To use RSS feeds in your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} +{% include integrations/config_flow.md %} -```yaml -# Example configuration.yaml entry -feedreader: - urls: - - https://www.home-assistant.io/atom.xml - - https://github.com/blog.atom - - https://hasspodcast.io/feed/podcast -``` - -{% configuration %} - urls: - description: List of URLs for your feeds. - required: true - type: list - scan_interval: - description: Defines the update interval of the feeds. - required: false - default: 1 hour - type: time - max_entries: - description: The maximum number of entries to extract from each feed. - required: false - default: 20 - type: integer -{% endconfiguration %} - -The following configuration example shows how to configure update interval and maximum number of entries: - -```yaml -# Example configuration.yaml entry with optional parameters -feedreader: - urls: - - https://www.home-assistant.io/atom.xml - - https://github.com/blog.atom - - https://hasspodcast.io/feed/podcast - scan_interval: - minutes: 30 - max_entries: 5 -``` +## Usage Feedreader events can be used out of the box to trigger automation actions, e.g.: @@ -93,6 +58,10 @@ automation: Any field under the `<entry>` tag in the feed can be used for example `trigger.event.data.content` will get the body of the feed entry. +### Event + +An event entity will be created for each configured feed which always represents the latest entry of the feed. + ### Video tutorial This video tutorial explains how to set up the feedreader and show the latest news feed item on your dashboard in Home Assistant. diff --git a/source/_integrations/ffmpeg_motion.markdown b/source/_integrations/ffmpeg_motion.markdown index 6a7481666e26..b730843e5c48 100644 --- a/source/_integrations/ffmpeg_motion.markdown +++ b/source/_integrations/ffmpeg_motion.markdown @@ -16,11 +16,11 @@ related: The `ffmpeg` {% term integration %} allows you to use any video feed with [FFmpeg](https://www.ffmpeg.org/) for motion sensors in Home Assistant. -<div class='note'> +{% note %} -If the `ffmpeg` process is broken, the sensor will be unavailable. To control the FFmpeg process of sensor, use the service `ffmpeg.start`, `ffmpeg.stop`, `ffmpeg.restart`. +If the `ffmpeg` process is broken, the sensor will be unavailable. To control the FFmpeg process of the sensor, use the `ffmpeg.start`, `ffmpeg.stop`, and `ffmpeg.restart` actions. -</div> +{% endnote %} ## Motion diff --git a/source/_integrations/ffmpeg_noise.markdown b/source/_integrations/ffmpeg_noise.markdown index dcc2d43bdd6e..61e3937182ff 100644 --- a/source/_integrations/ffmpeg_noise.markdown +++ b/source/_integrations/ffmpeg_noise.markdown @@ -16,11 +16,11 @@ related: The `ffmpeg` {% term integration %} allows you to use any video or audio feed with [FFmpeg](https://www.ffmpeg.org/) for various sensors in Home Assistant. -<div class='note'> +{% note %} -If the `ffmpeg` process is broken, the sensor will be unavailable. To control the FFmpeg process of sensor, use the service `ffmpeg.start`, `ffmpeg.stop`, `ffmpeg.restart`. +If the `ffmpeg` process is broken, the sensor will be unavailable. To control the FFmpeg process of sensor, use the `ffmpeg.start`, `ffmpeg.stop`, and `ffmpeg.restart` actions. -</div> +{% endnote %} ## Configuration diff --git a/source/_integrations/fibaro.markdown b/source/_integrations/fibaro.markdown index 4910d87e8d10..feee3ce22015 100644 --- a/source/_integrations/fibaro.markdown +++ b/source/_integrations/fibaro.markdown @@ -47,11 +47,11 @@ Fibaro Home Center 2, Home Center Lite, Home Center 3, Home Center 3 Lite, and Y {% include integrations/config_flow.md %} -<div class='note'> +{% tip %} It is recommended to assign a static IP address to your Fibaro controller. This ensures that it won't change its IP address, so you won't have to change the `url` if the controller reboots and comes up with a different IP address. See your router's manual for details on how to set this up. If you need the MAC address of your Fibaro, check the label on the bottom. -</div> +{% endtip %} ## Supported platforms diff --git a/source/_integrations/file.markdown b/source/_integrations/file.markdown index 9eb1d11bf163..581b24ceef44 100644 --- a/source/_integrations/file.markdown +++ b/source/_integrations/file.markdown @@ -31,7 +31,7 @@ After creating a config entry, you can change the entry name, the name of the no To use notifications in automations or scripts, see the [getting started with automation page](/getting-started/automation/). -Use the `notify.send_message` entity service to store notification messages. +Use the `notify.send_message` entity to store notification messages. ## Sensor diff --git a/source/_integrations/filesize.markdown b/source/_integrations/filesize.markdown index 3d34b5044c77..b1724722927f 100644 --- a/source/_integrations/filesize.markdown +++ b/source/_integrations/filesize.markdown @@ -17,12 +17,12 @@ ha_integration_type: integration The **File size** {% term integration %} is for displaying the size in MB of a file. -<div class='note'> +{% important %} File paths must also be added to [allowlist_external_dirs](/integrations/homeassistant/#allowlist_external_dirs) in your `configuration.yaml`. File paths should be absolute paths. For example: `/config/home-assistant_v2.db` to monitor the size of the default database. -</div> +{% endimportant %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/filter.markdown b/source/_integrations/filter.markdown index e965ae3b2bf5..49b50b28a561 100644 --- a/source/_integrations/filter.markdown +++ b/source/_integrations/filter.markdown @@ -119,11 +119,9 @@ filters: default: positive infinity {% endconfiguration %} -<div class="note warning"> - +{% warning %} When configuring a `window_size` that is not a time and with a value larger than the default of `1`, the database must examine nearly every stored state for that entity during Home Assistant startup. If you have modified the [Recorder `purge_keep_days`](/integrations/recorder/#purge_keep_days) value or have many states stored in the database for the filtered entity, this can cause your Home Assistant instance to respond poorly during startup. - -</div> +{% endwarning %} ## Filters diff --git a/source/_integrations/fire_tv.markdown b/source/_integrations/fire_tv.markdown index acd2d505b57b..1a36319e0585 100644 --- a/source/_integrations/fire_tv.markdown +++ b/source/_integrations/fire_tv.markdown @@ -3,6 +3,7 @@ title: Amazon Fire TV description: Connect and control your Amazon Fire TV devices using the Android Debug Bridge integration ha_category: - Media player + - Remote ha_domain: fire_tv ha_integration_type: virtual ha_supporting_domain: androidtv @@ -15,6 +16,7 @@ ha_config_flow: true ha_platforms: - diagnostics - media_player + - remote ha_iot_class: Local Polling --- diff --git a/source/_integrations/fireservicerota.markdown b/source/_integrations/fireservicerota.markdown index f7a094c59521..4dc5138f371b 100644 --- a/source/_integrations/fireservicerota.markdown +++ b/source/_integrations/fireservicerota.markdown @@ -25,11 +25,11 @@ The FireServiceRota integration provides you real-time information about inciden You will need a FireServiceRota or BrandweerRooster account. -<div class='note'> +{% caution %} A word of caution: Do not solely rely on this integration for your emergency calls! -</div> +{% endcaution %} This integration provides the following platforms: diff --git a/source/_integrations/firmata.markdown b/source/_integrations/firmata.markdown index fcb3f7ecb6db..2623c318ba1b 100644 --- a/source/_integrations/firmata.markdown +++ b/source/_integrations/firmata.markdown @@ -37,15 +37,15 @@ You will need to upload a [Firmata firmware](https://github.com/firmata/) to you To integrate Arduino boards with Home Assistant, add the following section to your {% term "`configuration.yaml`" %} file: -<div class='note warning'> +{% warning %} Firmata does not store the last state across power cycles. This means that with every powerup the pins are set to off/low and after every initialization, they will be set to the default that you have configured in YAML. -</div> +{% endwarning %} -<div class='note warning'> +{% warning %} Firmata may cycle pins HIGH/LOW during initialization. If your pins should not be accidentally cycled, you may need to modify your Firmtata sketch or if you are using a relay board use an output pin as VCC. See this issue for details: [Make initial pin value configurable](https://github.com/firmata/arduino/issues/166). -</div> +{% endwarning %} You may configure multiple Firmata boards. Each board has the following options: @@ -179,15 +179,13 @@ sensors: type: integer {% endconfiguration %} -<div class='note'> +{% note %} If you double-configure a pin, the integration will fail to configure the second one that it attempts to set up and will log an error. -</div> - -<div class='note'> +{% endnote %} +{% note %} To invert/negate a light, set the `maximum` to `0` and the `minimum` to `255`. - -</div> +{% endnote %} ```yaml # Example firmata configuration.yaml entry diff --git a/source/_integrations/flexit.markdown b/source/_integrations/flexit.markdown index 174d6cf1c711..b54a78ff6132 100644 --- a/source/_integrations/flexit.markdown +++ b/source/_integrations/flexit.markdown @@ -44,11 +44,9 @@ hub: type: string {% endconfiguration %} -<div class='note'> - -This integration requires the [Modbus](/integrations/modbus/) integration to be set up to work - -</div> +{% important %} +This integration requires the [Modbus](/integrations/modbus/) integration to be set up to work. +{% endimportant %} Full configuration example including modbus setup shown below: diff --git a/source/_integrations/flexit_bacnet.markdown b/source/_integrations/flexit_bacnet.markdown index 3a5d42af39a0..09fcc2b778f8 100644 --- a/source/_integrations/flexit_bacnet.markdown +++ b/source/_integrations/flexit_bacnet.markdown @@ -86,6 +86,6 @@ The consequences of shutting down the unit can be costly and extensive. For exam If you need to shut down the unit, make sure to take all necessary precautions, such as securing the system with frost protection dampers. -Furthermore, Flexit recommends to unplug the unit from the power socket before replacing a filter. To prevent damage, always initiate a controlled shutdown from the control panel (or, in the future, from a service call in Home Assistant) before unplugging the device. +Furthermore, Flexit recommends unplugging the unit from the power socket before replacing a filter. To prevent damage, always initiate a controlled shutdown from the control panel (or, in the future, from an action in Home Assistant) before unplugging the device. {% include integrations/config_flow.md %} diff --git a/source/_integrations/flic.markdown b/source/_integrations/flic.markdown index c82ea30a571a..febee6dbeec2 100644 --- a/source/_integrations/flic.markdown +++ b/source/_integrations/flic.markdown @@ -18,7 +18,7 @@ The `flic` {% term integration %} allows you to receive click events from [flic] The {% term integration %} does not directly interact with the buttons, *but communicates with a flic service* that manages the buttons. The service can run on the same instance as Home Assistant or any other reachable machine. -## Service setup +## Action setup If you are using the Home Assistant Operating System, you can run the service locally by [installing](/common-tasks/os#installing-third-party-add-ons) the flicd add-on from [pschmitt's repository](https://github.com/pschmitt/home-assistant-addons). diff --git a/source/_integrations/flick_electric.markdown b/source/_integrations/flick_electric.markdown index ee70e55acdd0..c1e11e3fe449 100644 --- a/source/_integrations/flick_electric.markdown +++ b/source/_integrations/flick_electric.markdown @@ -18,10 +18,10 @@ ha_integration_type: service {% include integrations/config_flow.md %} -<div class='note'> +{% note %} The configuration uses the client ID and secret used by the app at the time of release. If this stops working, you can find the new ones by using a MITM proxy with the mobile app. The app will call `https://api.flick.energy/identity/oauth/token` with the `client_id` and `client_secret`. You can then use these values during the configuration. -</div> +{% endnote %} diff --git a/source/_integrations/flo.markdown b/source/_integrations/flo.markdown index 6df10b9b7e3c..a2dc8e615535 100644 --- a/source/_integrations/flo.markdown +++ b/source/_integrations/flo.markdown @@ -29,7 +29,7 @@ There is currently support for the following device types within Home Assistant: {% include integrations/config_flow.md %} -## Services +## Actions ### `flo.run_health_test` diff --git a/source/_integrations/flock.markdown b/source/_integrations/flock.markdown index 5ec0c2ec6f9e..61f5eceec168 100644 --- a/source/_integrations/flock.markdown +++ b/source/_integrations/flock.markdown @@ -45,7 +45,7 @@ notify: {% configuration %} name: - description: "The optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`." + description: "The optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: false type: string default: notify diff --git a/source/_integrations/flume.markdown b/source/_integrations/flume.markdown index 62892c7813ab..ab57f46359b7 100644 --- a/source/_integrations/flume.markdown +++ b/source/_integrations/flume.markdown @@ -30,11 +30,11 @@ Flume monitors the real-time status of your home water meter. Allowing the end-u You can find your Client ID and Client Secret under "API Access" on the [settings page](https://portal.flumewater.com/#settings). -To add `Flume` to your installation, go to **Settings** -> **Devices & Services** in the UI, click the button with `+` sign and from the list of integrations select **Flume**. +To add `Flume` to your installation, go to **Settings** -> **Devices & services** in the UI, click the button with `+` sign and from the list of integrations select **Flume**. ## Notifications -Flume notifications are fetched every 5 minutes and are available via the service `flume.list_notifications`. Some notifications are available via the following binary sensors: +Flume notifications are fetched every 5 minutes and are available via the `flume.list_notifications` action. Some notifications are available via the following binary sensors: - Bridge disconnected - High flow diff --git a/source/_integrations/flux.markdown b/source/_integrations/flux.markdown index 85a7e405881e..c9af0419e66c 100644 --- a/source/_integrations/flux.markdown +++ b/source/_integrations/flux.markdown @@ -25,7 +25,7 @@ The value of `sunset_time` is automatically calculated based on the location spe The color temperature is specified in kelvin, and accepted values are between 1000 and 40000 kelvin. Lower values will seem more red, while higher will look more white. -If you want to update at variable intervals, you can leave the switch turned off and use automation rules that call the service `switch.<name>_update` whenever you want the lights updated, where `<name>` equals the `name:` property in the switch configuration. +If you want to update at variable intervals, you can leave the switch turned off and use automation rules that use the `switch.<name>_update` action whenever you want the lights updated, where `<name>` equals the `name:` property in the switch configuration. To use the Flux switch in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} @@ -96,6 +96,10 @@ interval: required: false default: 30 type: integer +unique_id: + description: An ID that uniquely identifies this switch. Set this to a unique value to allow customization through the UI. + required: false + type: string {% endconfiguration %} Full example: diff --git a/source/_integrations/flux_led.markdown b/source/_integrations/flux_led.markdown index ce08c447df2f..de86e857a7a9 100644 --- a/source/_integrations/flux_led.markdown +++ b/source/_integrations/flux_led.markdown @@ -222,11 +222,11 @@ The Magic Home light offers a number of effects which are not included in other | `random` | Chooses a random color by selecting random values for R, G, and B. | -### Custom effects - service `flux_led.set_custom_effect` +### Custom effects - action `flux_led.set_custom_effect` -The integration offers a custom service to enable you to set the lights to a custom light effect. +The integration offers a custom action to enable you to set the lights to a custom light effect. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | The entity_id of the LED light to set the effect on. | | `colors` | List of RGB colors to transition between in your effect. (Max 16, Required) | @@ -234,7 +234,7 @@ The integration offers a custom service to enable you to set the lights to a cus | `transition` | The transition effect you would like. Valid options are `gradual`, `jump`, or `strobe`. (Default `gradual`) | ```yaml -#Example Service Call +#Example action entity_id: light.led_strip colors: - [255,0,0] @@ -244,11 +244,11 @@ speed_pct: 80 transition: "jump" ``` -### Set zones - service `flux_led.set_zones` +### Set zones - action `flux_led.set_zones` The Addressable v3 (0xA3) models allow setting a color effect per zone. The length of each zone is the number of pixels per segment divided by the number of colors. If the device is turned off, setting the zones will not turn it on. A separate call to `light.turn_on` is needed to turn on the device. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | The entity_id of the LED light to set the effect on. | | `colors` | List of colors for each zone (RGB). (Max 2048 Colors) | @@ -256,7 +256,7 @@ The Addressable v3 (0xA3) models allow setting a color effect per zone. The leng | `effect` | The effect you would like. Valid options are `static`, `running_water`, `strobe`, `jump`, or `breathing`. (Default `static`) | ```yaml -#Example service call +#Example action service: flux_led.set_zones target: entity_id: @@ -271,11 +271,11 @@ data: speed_pct: 80 ``` -### Set Music Mode - Service `flux_led.set_music_mode` +### Set Music Mode - Action `flux_led.set_music_mode` The RGB with MIC (0x08), Addressable v2 (0xA2), and Addressable v3 (0xA3) models have a built-in microphone that have multiple music mode settings. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | The entity_id of the LED light to set the effect on. | | `sensitivity` | Microphone sensitivity (0-100) | @@ -286,7 +286,7 @@ The RGB with MIC (0x08), Addressable v2 (0xA2), and Addressable v3 (0xA3) models | `background_color` | The background RGB color (Addressable models only) | ```yaml -#Example Service Call +#Example action service: flux_led.set_music_mode target: entity_id: diff --git a/source/_integrations/forecast_solar.markdown b/source/_integrations/forecast_solar.markdown index cd02101c586d..46760e298dc2 100644 --- a/source/_integrations/forecast_solar.markdown +++ b/source/_integrations/forecast_solar.markdown @@ -118,7 +118,8 @@ the results a bit. The **damping** factor allows you to adjust and "damp" the results of your solar predictions in the morning and evening a bit and is a great method to make -results less optimistic and more tuned to your reality. +results less optimistic and more tuned to your reality. More details on damping can +be found [here](https://doc.forecast.solar/damping). The **inverter** size can be used in a situation where the maximum power of your inverter is lower than the total power of all your solar panels (as entered under @@ -132,6 +133,6 @@ To adjust the configuration settings for your Forecast.Solar integration instance: 1. Browse to your Home Assistant instance. -2. Go to **{% my integrations title="Settings > Devices & Services" %}**. +2. Go to **{% my integrations title="Settings > Devices & services" %}**. 3. If multiple instances of {{ name }} are configured, choose the instance you want to configure. 4. Select **Configure**. diff --git a/source/_integrations/foscam.markdown b/source/_integrations/foscam.markdown index 54abf407e3b0..c0d766c25fb9 100644 --- a/source/_integrations/foscam.markdown +++ b/source/_integrations/foscam.markdown @@ -18,29 +18,29 @@ The `foscam` platform allows you to watch the live stream of your [Foscam](https {% include integrations/config_flow.md %} -<div class='note'> +{% note %} There seems to be some issues within Foscam with lengthy passwords and passwords containing certain symbols. Be sure to check your camera's documentation. -</div> +{% endnote %} ### Streams Most Foscam IP Cameras supports two video streams, by default the `Main` stream is the high quality stream while the `Sub` stream is a lower quality stream. These streams can be configured in your camera preferences. -### Service `foscam.ptz` +### Action `foscam.ptz` If your Foscam camera supports <abbr title="pan, tilt, and zoom">PTZ</abbr>, you will be able to pan or tilt your camera. -| Service data attribute | Description | +| Data attribute | Description | | -----------------------| ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | | `movement` | Direction of the movement. Allowed values: `up`, `down`, `left`, `right`, `top_left`, `top_right`, `bottom_left`, `bottom_right` | | `travel_time` | (Optional) Travel time in seconds. Allowed values: float from 0 to 1. Default: 0.125 | -### Service `foscam.ptz_preset` +### Action `foscam.ptz_preset` If your Foscam camera supports <abbr title="pan, tilt, and zoom">PTZ</abbr> presets, you will be able to move the camera to a predefined preset using the preset name. -| Service data attribute | Description | +| Data attribute | Description | | -----------------------| ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | | `preset_name` | The name of the preset to move to. Presets can be created from within the official Foscam apps. | diff --git a/source/_integrations/foursquare.markdown b/source/_integrations/foursquare.markdown index 5f13eee2d237..c5847ebfc876 100644 --- a/source/_integrations/foursquare.markdown +++ b/source/_integrations/foursquare.markdown @@ -12,7 +12,7 @@ related: title: Configuration file --- -The `foursquare` {% term integration %} accepts pushes from the Foursquare [Real-Time API](https://developer.foursquare.com/overview/realtime) and a service to check users in on Swarm. +The `foursquare` {% term integration %} accepts pushes from the Foursquare [Real-Time API](https://developer.foursquare.com/overview/realtime) and an action to check users in on Swarm. To enable Foursquare, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} @@ -69,7 +69,7 @@ automation: ### Check ins -To check a user in, use the `foursquare/checkin` service. +To check a user in, use the `foursquare/checkin` action. Parameters: diff --git a/source/_integrations/free_mobile.markdown b/source/_integrations/free_mobile.markdown index 0a5f30e9fbad..06a91868b525 100644 --- a/source/_integrations/free_mobile.markdown +++ b/source/_integrations/free_mobile.markdown @@ -26,9 +26,9 @@ Before doing anything, you have to activate the SMS API option in your Free Mobi This API only sends classic SMS messages and only to the cell phone of the account owner. So you only have to provide a text message in your payload. -<div class='note warning'> +{% note %} If you disable and re-enable the SMS API option, please be sure to update your token in your configuration. -</div> +{% endnote %} ## Configuration @@ -46,7 +46,7 @@ notify: {% configuration %} name: - description: "The optional parameter name allows multiple notifiers to be created. The notifier will bind to the service notify.NOTIFIER_NAME." + description: "The optional parameter name allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: false type: string default: notify diff --git a/source/_integrations/freebox.markdown b/source/_integrations/freebox.markdown index 12263bcceca1..9042bbb783e2 100644 --- a/source/_integrations/freebox.markdown +++ b/source/_integrations/freebox.markdown @@ -45,23 +45,23 @@ You can find out your Freebox host and port by opening this address <http://mafr The returned JSON should contain an `api_domain` (`host`) and a `https_port` (`port`). Please consult the [API documentation](https://dev.freebox.fr/sdk/os/) for more information. -<div class='note warning'> +{% tip %} The `host` (ex: xxxxxxxx.fbxos.fr) and `port` given by <http://mafreebox.freebox.fr/api_version> refers to your Freebox public IP address and may not work if your Home Assistant server is located inside your local LAN. For local API access, you can alternatively use `host` = *mafreebox.freebox.fr* and `port` = *443*. -</div> +{% endtip %} ### Initial setup -<div class='note warning'> +{% important %} - You must have set a password for your Freebox router web administration page. Enable the option "Permettre les nouvelles demandes d'associations" and check that the option "Accès à distance sécurisé à Freebox OS" is active in "Gestion des ports" > "Connexions entrantes". +You must have set a password for your Freebox router web administration page. Enable the option "Permettre les nouvelles demandes d'associations" and check that the option "Accès à distance sécurisé à Freebox OS" is active in "Gestion des ports" > "Connexions entrantes". -</div> +{% endimportant %} The first time Home Assistant will connect to your Freebox, you will need to authorize it by pressing the right arrow on the facade of the Freebox when prompted to do so. -To make the Wi-Fi switch and the reboot service working you will have to add "Modification des réglages de la Freebox" permission to Home Assistant application in "Paramètres de la Freebox" > "Gestion des accès" > "Applications". +To make the Wi-Fi switch and the reboot action working, you will have to add "Modification des réglages de la Freebox" permission to Home Assistant application in "Paramètres de la Freebox" > "Gestion des accès" > "Applications". To use cameras from the Freebox Delta, you will have to add "Gestion de l'alarme et maison connectée" permission to Home Assistant application in "Paramètres de la Freebox" > "Gestion des accès" > "Applications". @@ -118,11 +118,11 @@ This integration allows you to view and control the Freebox alarm control panel. -## Service +## Action -### Service `freebox.reboot` +### Action `freebox.reboot` -This service will reboot your Freebox router. It does not take any parameter. Be aware there is no confirmation. +This action will reboot your Freebox router. It does not take any parameter. Be aware there is no confirmation. ## Switch diff --git a/source/_integrations/fritz.markdown b/source/_integrations/fritz.markdown index 85f8b91ee070..a558379e2ed8 100644 --- a/source/_integrations/fritz.markdown +++ b/source/_integrations/fritz.markdown @@ -42,25 +42,25 @@ There is support for the following platform types within Home Assistant: - **Update** - firmware status of the device. {% include integrations/config_flow.md %} -<div class='note'> +{% important %} Both TR-064 and UPnP need to be enabled in the FRITZ!Box ( Home Network -> Network -> Network settings -> Access Settings in the Home Network ) for Home Assistant to login and read device info. -</div> +{% endimportant %} ## Username The configuration in the UI asks for a username. Starting from FRITZ!OS 7.24 the FRITZ!Box creates a random username for the admin user if you didn't set one yourself. This can be found after logging into the FRITZ!Box and visiting System -> FRITZ!Box Users -> Users. The username starts with `fritz` followed by four random numbers. Under properties on the right it says `created automatically`. Prior to FRITZ!OS 7.24 the default username was `admin`. -## Services +## Actions -Available {% term services %}: `set_guest_wifi_password` +Available {% term actions %}: `set_guest_wifi_password` -### Service `set_guest_wifi_password` +### Action `set_guest_wifi_password` Set a new password for the guest wifi. The password must be between 8 and 63 characters long. If no password is given, it will be auto-generated. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | | `device_id` | no | Only act on a specific router | | `password` | yes | New password for the guest wifi | @@ -69,7 +69,7 @@ If no password is given, it will be auto-generated. ## Integration options It is possible to change some behaviors through the integration options. -To change the settings, go to {% my integrations title="**Settings** > **Devices & Services**" %}. Select the **AVM FRITZ!Box Tools** integration, then select **Configure**. +To change the settings, go to {% my integrations title="**Settings** > **Devices & services**" %}. Select the **AVM FRITZ!Box Tools** integration, then select **Configure**. - **Consider home**: Number of seconds that must elapse before considering a disconnected device "not at home". - **Enable old discovery method**: Needed on some scenarios like no mesh support (fw <= 6.x), mixed brands network devices or LAN switches. diff --git a/source/_integrations/fritzbox.markdown b/source/_integrations/fritzbox.markdown index 142e1c154a37..ee2a0d2c2c8a 100644 --- a/source/_integrations/fritzbox.markdown +++ b/source/_integrations/fritzbox.markdown @@ -63,9 +63,9 @@ Additionally, we also support to trigger smarthome templates. {% include integrations/config_flow.md %} -<div class='note'> +{% note %} The configuration in the UI asks for a username. Starting from FRITZ!OS 7.24 the FRITZ!Box creates a random username for the admin user if you didn't set one yourself. This can be found after logging into the FRITZ!Box and visiting System -> FRITZ!Box Users -> Users. The username starts with "fritz" followed by four random numbers. Under properties on the right it says "created automatically". Prior to FRITZ!OS 7.24 the default username was "admin". -</div> +{% endnote %} ## Switches & thermostats @@ -118,9 +118,9 @@ There are several attributes that can be useful for automations and templates. To get AVM FRITZ!DECT lightbulbs (e.g., FRITZ!DECT 500) follow the [configuration instructions](#configuration) above. -<div class='note'> -The FRITZ!DECT 500 lightbulb supports only 36 colors. When a color is picked in home assistant that is not supported by the device, a color that comes close will be activated. -</div> +{% note %} +The FRITZ!DECT 500 lightbulb supports only 36 colors. When a color is picked in Home Assistant that is not supported by the device, a color that comes close will be activated. +{% endnote %} ## Cover diff --git a/source/_integrations/fronius.markdown b/source/_integrations/fronius.markdown index 0b28fc037148..8993c07473cd 100644 --- a/source/_integrations/fronius.markdown +++ b/source/_integrations/fronius.markdown @@ -78,10 +78,10 @@ When an endpoint is not responding correctly the update interval will increase t - For _"Solar production"_: - If no battery is connected to an inverter: Add each inverters `Energy total` entity. - If a battery is connected to an inverter: Use [Riemann sum](/integrations/integration/) over `Power photovoltaics` entity (from your `SolarNet` device). -- _"Battery systems"_ aren't supported directly. Use [Template](/integrations/template) to split and invert negative values of `Power battery` entity (from `SolarNet` device) for charging power (W) and positive values for discharging power (W). Then use [Riemann sum](/integrations/integration/) to integrate each into energy values (kWh). +- _"Battery systems"_ energy values aren't supported directly by the API. Use [Riemann sum](/integrations/integration/) to integrate `Power battery charge` and `Power battery discharge` into energy values (kWh). - For _"Devices"_ use the Ohmpilots `Energy consumed` entity. -The energy meter integrated with Fronius devices can be installed (and configured) in two different installation positions: _"feed in path"_ (`Meter location` = 0) or _"consumption path"_ (`Meter location` = 1). +The energy meter integrated with Fronius devices can be installed (and configured) in two different installation positions: _"feed in path"_ (grid interconnection point) or _"consumption path"_. ### Feed in path meter @@ -94,8 +94,7 @@ Recommended energy dashboard configuration for meter location in feed in path: Recommended energy dashboard configuration for meter location in consumption path: -- The `Power grid` entity provided by the Fronius API is positive on import and negative on export. Split it up into import- and export-power entities by using helpers with templates `max(states('sensor.solarnet_power_grid') | float, 0)` and `max(0 - states('sensor.solarnet_power_grid') | float, 0)`. -- Then use [Riemann sum](/integrations/integration/) to integrate these import-/export-power entities into energy values (kWh). +- Use [Riemann sum](/integrations/integration/) to integrate `Power grid import` and `Power grid export` entities into energy values (kWh). - Use these energy entities for `Grid consumption` and `Return to grid` in the energy dashboard configuration. ## Note diff --git a/source/_integrations/frontend.markdown b/source/_integrations/frontend.markdown index 3f47415e9166..9e726b0242ce 100644 --- a/source/_integrations/frontend.markdown +++ b/source/_integrations/frontend.markdown @@ -155,14 +155,14 @@ Check our [community forums](https://community.home-assistant.io/c/projects/them ## Setting themes -There are two themes-related services: +There are two themes-related actions: - `frontend.reload_themes`: Reloads theme configuration from your {% term "`configuration.yaml`" %} file. - `frontend.set_theme`: Sets backend-preferred theme name. -### Service `set_theme` +### Action `set_theme` -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | --------------------------------------------------------------------------------------------------- | | `name` | Name of the theme to set, `default` for the default theme or `none` to restore to the default. | | `mode` | If the theme should be applied in light or dark mode `light` or `dark` (Optional, default `light`). | @@ -173,7 +173,7 @@ The backend theme settings will be saved and restored on a restart of Home Assis ### Manual theme selection When themes are enabled in the {% term "`configuration.yaml`" %} file, a new option will show up in the user profile page (accessed by clicking your user account initials at the bottom of the sidebar). You can then choose any installed theme from the dropdown list and it will be applied immediately. -This will overrule the theme settings set by the above service calls, and will only be applied to the current device. +This will overrule the theme settings set by the above actions, and will only be applied to the current device. <p class='img'> <img src='/images/frontend/user-theme.png' /> diff --git a/source/_integrations/frontier_silicon.markdown b/source/_integrations/frontier_silicon.markdown index 23389fdce46c..211ca211f89e 100644 --- a/source/_integrations/frontier_silicon.markdown +++ b/source/_integrations/frontier_silicon.markdown @@ -74,13 +74,13 @@ Overview of the info dialog: ## Notes and Limitations -<div class='note warning'> +{% warning %} Some older devices may require setting up a session to process requests. This is automatically detected by the underlying library. There is always a single user (session) controlling a device, which means that once Home Assistant connects to a device all other sessions will be invalidated. This renders the usage of [UNDOK] almost impossible for these older devices, as the Home Assistant integration polls the device state every 30 seconds or issues a command by creating a new session. In that case, you have to disable the integration if you want to use UNDOK. -</div> +{% endwarning %} [Frontier Silicon chipset]: https://www.frontiersmart.com/solution/solutions-for-digital-radio/ [Medion Radios]: https://www.medion.com/de/shop/internetradios diff --git a/source/_integrations/fully_kiosk.markdown b/source/_integrations/fully_kiosk.markdown index 5617ead79904..c6273c287d5b 100644 --- a/source/_integrations/fully_kiosk.markdown +++ b/source/_integrations/fully_kiosk.markdown @@ -3,6 +3,8 @@ title: Fully Kiosk Browser description: Instructions on how to integrate Fully Kiosk Browser with Home Assistant ha_category: - Binary sensor + - Camera + - Notifications - Sensor - Switch ha_release: 2022.9 @@ -14,8 +16,11 @@ ha_domain: fully_kiosk ha_platforms: - binary_sensor - button + - camera - diagnostics + - image - media_player + - notify - number - sensor - switch @@ -64,17 +69,30 @@ The following controls are available: - Play and stop media files - Set device volume -<div class='note warning'> - The Fully Kiosk Browser app does not provide feedback on the device volume or media playback status, so we are unable to display the current volume level or playback status. -</div> +The following is available as camera entity: -## Services +- Camera (the camera only works in Fully Kiosk if the **Motion detection** is set to **On**). -**Service `load_url`** +The following is available as image entity: -You can use the service `fully_kiosk.load_url` to have the tablet open the specified URL. +- Screenshot -| Service data attribute | Optional | Description | +The following notify entities that can be passed to `notify.send_message` action are available: + +- Text-to-speech +- Overlay message + +{% note %} +The Fully Kiosk Browser app does not provide feedback on the device volume or media playback status, so we are unable to display the current volume level or playback status. +{% endnote %} + +## Actions + +**Action `load_url`** + +You can use the `fully_kiosk.load_url` action to have the tablet open the specified URL. + +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `device_id` | yes | Device ID (or list of device IDs) to load the URL on. | `url` | yes | The URL to load. @@ -89,11 +107,11 @@ target: device_id: a674c90eca95eca91f6020415de07713 ``` -**Service `set_config`** +**Action `set_config`** -You can use the service `fully_kiosk.set_config` to change the many configuration parameters of Fully Kiosk Browser. +You can use the `fully_kiosk.set_config` action to change the many configuration parameters of Fully Kiosk Browser. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `device_id` | no | Device ID (or list of device IDs) to load the URL on. | `key` | no | The configuration parameter key. The list of available keys can be found in the Fully Kiosk Browser remote admin panel by clicking the **Show keys** button. @@ -110,11 +128,11 @@ target: device_id: a674c90eca95eca91f6020415de07713 ``` -**Service `start_application`** +**Action `start_application`** -You can use the service `fully_kiosk.start_application` to have the tablet launch the specified app. +You can use the `fully_kiosk.start_application` action to have the tablet launch the specified app. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `device_id` | yes | Device ID (or list of device IDs) to load the URL on. | `application` | yes | The package name of the app to load. diff --git a/source/_integrations/garages_amsterdam.markdown b/source/_integrations/garages_amsterdam.markdown index 785f0864dd86..67c0e482beba 100644 --- a/source/_integrations/garages_amsterdam.markdown +++ b/source/_integrations/garages_amsterdam.markdown @@ -29,11 +29,9 @@ When you add a parking garage, 4 sensors are created in your configuration by de - **Long capacity** - Total of parking spaces for cardholders or reserved spaces - **Short capacity** - Total of parking spaces for regular paid parking -<div class='note warning'> - - Some parking garages don't have long-term parking spaces, in which case the 2 specific **Long** sensors will not be created. - -</div> +{% note %} +Some parking garages don't have long-term parking spaces, in which case the 2 specific **Long** sensors will not be created. +{% endnote %} ### Binary sensor diff --git a/source/_integrations/gardena_bluetooth.markdown b/source/_integrations/gardena_bluetooth.markdown index 5d06922b28a2..9e368a61b261 100644 --- a/source/_integrations/gardena_bluetooth.markdown +++ b/source/_integrations/gardena_bluetooth.markdown @@ -18,6 +18,7 @@ ha_platforms: - number - sensor - switch + - valve ha_integration_type: integration --- diff --git a/source/_integrations/gdacs.markdown b/source/_integrations/gdacs.markdown index c6d1e4bba141..c9db78baf423 100644 --- a/source/_integrations/gdacs.markdown +++ b/source/_integrations/gdacs.markdown @@ -28,13 +28,13 @@ Entities are generated, updated and removed automatically with each update from The data is updated every 5 minutes. -<div class='note'> +{% note %} The material used by this integration is provided by the [Global Disaster Alert and Coordination System (GDACS)](https://www.gdacs.org/) - a cooperation framework between the United Nations and the European Commission - under the [Creative Commons Attribution 4.0 International (CC BY 4.0) license](https://creativecommons.org/licenses/by/4.0/). It has only been modified for the purpose of presenting the material in Home Assistant. Please refer to the [creator's disclaimer and terms of use notice](https://www.gdacs.org/About/termofuse.aspx) for more information. -</div> +{% endnote %} {% include integrations/config_flow.md %} @@ -83,16 +83,3 @@ from the feed. | created | Number of entities that were created during last update (optional). | | updated | Number of entities that were updated during last update (optional). | | removed | Number of entities that were removed during last update (optional). | - -## Full configuration - -```yaml -# Example configuration.yaml entry -gdacs: - categories: - - Drought - - Earthquake - radius: 1000 - latitude: -41.2 - longitude: 174.7 -``` diff --git a/source/_integrations/generic_hygrostat.markdown b/source/_integrations/generic_hygrostat.markdown index 19b029548d57..296e38cbf779 100644 --- a/source/_integrations/generic_hygrostat.markdown +++ b/source/_integrations/generic_hygrostat.markdown @@ -2,6 +2,7 @@ title: Generic hygrostat description: Virtual hygrostat device ha_category: + - Helper - Humidifier ha_release: 2021.8 ha_domain: generic_hygrostat @@ -11,16 +12,28 @@ ha_codeowners: ha_iot_class: Local Polling ha_platforms: - humidifier -ha_integration_type: integration +ha_integration_type: helper related: - docs: /docs/configuration/ title: Configuration file +ha_config_flow: true --- The `generic_hygrostat` humidifier {% term integration %} is a virtual hygrostat implemented in Home Assistant. It uses a sensor and a switch connected to a humidifier or dehumidifier under the hood. When in humidifier mode, if the measured humidity is less than the target humidity, the humidifier will be turned on and turned off when the required humidity is reached. When in dehumidifier mode, if the measured humidity is greater than the target humidity, the dehumidifier will be turned on and turned off when required humidity is reached. One Generic Hygrostat entity can only control one switch. If you need to activate two switches, one for a humidifier and one for a dehumidifier, you will need two Generic Hygrostat entities. -To enable the {% term integration %}, you need to add it to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} +{% include integrations/config_flow.md %} + +{% note %} +Configuration using our user interface provides a more limited subset of options, making this integration more accessible while covering most use cases. + +If you need more specific features for your use case, the manual [YAML-configuration section](#yaml-configuration) of this integration might provide them. +{% endnote %} + +## YAML configuration + +Alternatively, this integration can be configured and set up manually via YAML +as well. To enable the generic hygrostat in your installation, add the +following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry @@ -72,12 +85,12 @@ min_cycle_duration: required: false type: [time, integer] dry_tolerance: - description: Set a minimum amount of difference between the humidity read by the sensor specified in the *target_sensor* option and the target humidity that must change prior to being switched on. For example, if the target humidity is 45 and the tolerance is 3 the humidifier will start when the sensor equals or goes below 42. It is advised to set this parameter equal or above your sensor precision. This parameter is only used on *target_sensor* changes and is ignored on initialization, on manual operation or `humidifier.turn_on` service. + description: Set a minimum amount of difference between the humidity read by the sensor specified in the *target_sensor* option and the target humidity that must change prior to being switched on. For example, if the target humidity is 45 and the tolerance is 3 the humidifier will start when the sensor equals or goes below 42. It is advised to set this parameter equal or above your sensor precision. This parameter is only used on *target_sensor* changes and is ignored on initialization, on manual operation or `humidifier.turn_on` action. required: false default: 3 type: float wet_tolerance: - description: Set a minimum amount of difference between the humidity read by the sensor specified in the *target_sensor* option and the target humidity that must change prior to being switched off. For example, if the target humidity is 45 and the tolerance is 3 the humidifier will stop when the sensor equals or goes above 48. It is advised to set this parameter equal or above your sensor precision. This parameter is only used on *target_sensor* changes and is ignored on initialization, on manual operation or `humidifier.turn_on` service. + description: Set a minimum amount of difference between the humidity read by the sensor specified in the *target_sensor* option and the target humidity that must change prior to being switched off. For example, if the target humidity is 45 and the tolerance is 3 the humidifier will stop when the sensor equals or goes above 48. It is advised to set this parameter equal or above your sensor precision. This parameter is only used on *target_sensor* changes and is ignored on initialization, on manual operation or `humidifier.turn_on` action. required: false default: 3 type: float @@ -107,7 +120,7 @@ sensor_stale_duration: Time for `min_cycle_duration` and `keep_alive` must be set as "hh:mm:ss" or it must contain at least one of the following entries: `days:`, `hours:`, `minutes:`, `seconds:` or `milliseconds:`. Alternatively, it can be an integer that represents time in seconds. -## Full configuration example +## Full YAML configuration example ```yaml generic_hygrostat: diff --git a/source/_integrations/generic_thermostat.markdown b/source/_integrations/generic_thermostat.markdown index bcb9faa79244..baa61e231856 100644 --- a/source/_integrations/generic_thermostat.markdown +++ b/source/_integrations/generic_thermostat.markdown @@ -1,22 +1,35 @@ --- -title: Generic thermostat +title: Generic Thermostat description: Turn Home Assistant into a thermostat ha_category: - Climate + - Helper ha_release: pre 0.7 ha_iot_class: Local Polling ha_domain: generic_thermostat ha_platforms: - climate -ha_integration_type: integration +ha_integration_type: helper related: - docs: /docs/configuration/ title: Configuration file +ha_config_flow: true --- The `generic_thermostat` climate {% term integration %} is a thermostat implemented in Home Assistant. It uses a sensor and a switch connected to a heater or air conditioning under the hood. When in heater mode, if the measured temperature is cooler than the target temperature, the heater will be turned on and turned off when the required temperature is reached. When in air conditioning mode, if the measured temperature is hotter than the target temperature, the air conditioning will be turned on and turned off when required temperature is reached. One Generic Thermostat entity can only control one switch. If you need to activate two switches, one for a heater and one for an air conditioner, you will need two Generic Thermostat entities. -To enable the {% term integration %}, you need to add it to your {% term "`configuration.yaml`" %} file. +{% include integrations/config_flow.md %} + +{% note %} +Configuration using our user interface provides a more limited subset of options, making this integration more accessible while covering most use cases. + +If you need more specific features for your use case, the manual [YAML-configuration section](#yaml-configuration) of this integration might provide them. +{% endnote %} + +## YAML configuration + +Alternatively, this integration can be configured and set up manually via YAML +as well. To enable the {% term integration %}, you need to add it to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} ```yaml @@ -129,7 +142,7 @@ Currently the `generic_thermostat` climate platform supports 'heat', 'cool' and Please note that when changing the preset mode to away, you will force a target temperature change as well that will get restored once the preset mode is set to none again. -## Full configuration example +## Full YAML configuration example ```yaml climate: diff --git a/source/_integrations/geniushub.markdown b/source/_integrations/geniushub.markdown index a175c48be9c8..8c93ff913923 100644 --- a/source/_integrations/geniushub.markdown +++ b/source/_integrations/geniushub.markdown @@ -37,11 +37,11 @@ Each zone controlled by your Genius Hub will be exposed as either a: Currently, there is no support for altering zone schedules, although entities can be switched to/from geniushub modes that utilize schedules. -There are limitations due to the differences between the Genius Hub and Home Assistant schemas (e.g., HA has no **Footprint** mode) - use the service handlers, below, for this functionality. +There are limitations due to the differences between the Genius Hub and Home Assistant schemas (for example, Home Assistant has no **Footprint** mode) - use the actions below, for this functionality. -### Service handlers +### Action handlers -Home Assistant is obligated to place restrictions upon integrations such as **geniushub** to maintain compatibility with other ecosystems (e.g., Google Home) and so not all of the **geniushub** functionality is available via the web UI. Some of this missing functionality is exposed via integration-specific service handlers: +Home Assistant is obligated to place restrictions upon integrations such as **geniushub** to maintain compatibility with other ecosystems (e.g., Google Home) and so not all of the **geniushub** functionality is available via the web UI. Some of this missing functionality is exposed via integration-specific actions: - `set_switch_override`: change the switches on time _for a specified duration_ (up to 24h), - `set_zone_override`: change the zone's setpoint _for a specified duration_ (up to 24h), and diff --git a/source/_integrations/geonetnz_quakes.markdown b/source/_integrations/geonetnz_quakes.markdown index add8f1644082..2e167a4f4297 100644 --- a/source/_integrations/geonetnz_quakes.markdown +++ b/source/_integrations/geonetnz_quakes.markdown @@ -35,7 +35,7 @@ converted to the unit (kilometers or miles) configured in Home Assistant. The data is updated every 5 minutes. -<div class='note'> +{% note %} The material used by this integration is provided under the [Creative Commons Attribution 3.0 New Zealand (CC BY 3.0 NZ) license](https://creativecommons.org/licenses/by/3.0/nz/). It has only been modified for the purpose of presenting the material in Home Assistant. @@ -43,7 +43,7 @@ Please refer to the [creator's disclaimer notice](https://www.geonet.org.nz/disc We acknowledge the New Zealand GeoNet project and its sponsors EQC, GNS Science and LINZ, for providing data/images used in this integration. -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/geonetnz_volcano.markdown b/source/_integrations/geonetnz_volcano.markdown index 5ca5b209bca7..01ddf3a6b0ec 100644 --- a/source/_integrations/geonetnz_volcano.markdown +++ b/source/_integrations/geonetnz_volcano.markdown @@ -35,15 +35,13 @@ The data is updated every 5 minutes. <img src='/images/integrations/geonetnz_volcano/sensor.png' /> </p> -<div class='note'> - +{% note %} The material used by this integration is provided under the [Creative Commons Attribution 3.0 New Zealand (CC BY 3.0 NZ) license](http://creativecommons.org/licenses/by/3.0/nz/). It has only been modified for the purpose of presenting the material in Home Assistant. Please refer to the [creator's disclaimer notice](https://www.geonet.org.nz/disclaimer) and [data policy](https://www.geonet.org.nz/policy) for more information. We acknowledge the New Zealand GeoNet project and its sponsors EQC, GNS Science and LINZ, for providing data/images used in this integration. - -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/github.markdown b/source/_integrations/github.markdown index fc1cabf2ccb4..89d6b4d9a625 100644 --- a/source/_integrations/github.markdown +++ b/source/_integrations/github.markdown @@ -28,14 +28,14 @@ The integration works by subscribing to events on the repository to provide a pu ## Remove authorization -After you have removed the integration from {% my integrations title="Settings -> Devices & Services" %}, you need to manually revoke OAuth app authorization. +After you have removed the integration from {% my integrations title="Settings -> Devices & services" %}, you need to manually revoke OAuth app authorization. 1. Go to your [Authorized OAuth Apps](https://github.com/settings/applications) 2. Find the "Home Assistant GitHub Integration" application 3. Click the 3 dots (`...`) to the right of the name 4. Select "Revoke" -## Service +## Action When you configure a repository to be tracked in this integration it will be represented as a service in the device panel and all entities related to the repository will be nested under that device. The device also provides a link to the repository on GitHub and an option to download [diagnostics](/integrations/diagnostics) for the service. @@ -116,16 +116,14 @@ These entities are simpler diagnostic entities without any additional attributes Here are some small examples on how you can automate using the provided entities from this integration. -<div class="note"> - -Remember that the service names and entity IDs used in these examples are examples as well, -you need to replace it with services and entities that you have in your installation. - -</div> +{% note %} +Remember that the action names and entity IDs used in these examples are examples as well, +you need to replace it with actions and entities that you have in your installation. +{% endnote %} ### Notify new releases -This example uses the [Latest release](#latest-release) entity provided by this integration, and a [notify](/integrations/notify) service, +This example uses the [Latest release](#latest-release) entity provided by this integration, and a [notify](/integrations/notify) action, {% raw %} @@ -147,7 +145,7 @@ action: ### Notify new stars -This example uses the [Stars](#diagnostic-entities) diagnostic entity provided by this integration, and a [notify](/integrations/notify) service, +This example uses the [Stars](#diagnostic-entities) diagnostic entity provided by this integration, and a [notify](/integrations/notify) action, {% raw %} diff --git a/source/_integrations/glances.markdown b/source/_integrations/glances.markdown index bff66d10ff4c..9e31f40c68cb 100644 --- a/source/_integrations/glances.markdown +++ b/source/_integrations/glances.markdown @@ -18,13 +18,11 @@ The `glances` integration allows you to monitor the system information provided ## Setup -<div class='note warning'> +{% important %} +Support for Glances api version 2 is deprecated. It is recommended to upgrade your Glances server to version 3. Once upgraded, reload the integration to connect again. +{% endimportant %} - Support for Glances api version 2 is deprecated. It is recommended to upgrade your Glances server to version 3. Once upgraded, reload the integration to connect again. - -</div> - -These sensors needs a running instance of `glances` on the host. The minimal supported version of `glances` is 2.3. +These sensors needs a running instance of `glances` in [Web Server Mode](https://glances.readthedocs.io/en/latest/quickstart.html#web-server-mode) on the host. The minimal supported version of `glances` is 2.3. For details about auto-starting `glances`, please refer to [Start Glances through Systemd](https://github.com/nicolargo/glances/wiki/Start-Glances-through-Systemd). diff --git a/source/_integrations/goodwe.markdown b/source/_integrations/goodwe.markdown index 9220e4fe4b44..1f8ac9b85e1d 100644 --- a/source/_integrations/goodwe.markdown +++ b/source/_integrations/goodwe.markdown @@ -24,11 +24,11 @@ The GoodWe integration will poll a [GoodWe](http://www.goodwe.com/) solar invert It works with GoodWe ET, EH, BT, BH, ES, EM, DT, MS, D-NS, XS and BP families of inverters. Different inverter families/models expose different sets of sensors, the newer models have usually broader support. -<div class='note'> +{% note %} If you can't communicate with the inverter despite your model is listed above, it is possible you have an old ARM firmware version. You should ask manufacturer support to upgrade your ARM firmware (not just inverter firmware) to be able to communicate with the inverter via UDP. It may work on other inverter families as well, as long as they listen on UDP port 8899 and respond to one of the supported communication protocols. In general, if you can communicate with the inverter via an official mobile application (PvMaster, SolarGo), it is very likely the integration will work too. -</div> +{% endnote %} {% include integrations/config_flow.md %} @@ -56,9 +56,9 @@ The integration will poll the inverter for new values every 10 seconds. If you w entity_id: sensor.ppv ``` -<div class='note'> +{% note %} It has been observed in some rare situations that frequent polling conflicts with updates to the Goodwe SEMS cloud portal and do not receive any updates anymore. Reducing polling frequency to 30 seconds or 1 minute seems to help in such cases. -</div> +{% endnote %} For more detailed steps on how to define a custom polling interval, follow the procedure below. diff --git a/source/_integrations/google.markdown b/source/_integrations/google.markdown index ec8c55ae637c..3cd6b6493320 100644 --- a/source/_integrations/google.markdown +++ b/source/_integrations/google.markdown @@ -64,11 +64,9 @@ See [calendar automations](/integrations/calendar#automation) for an overview, a The calendar entity has additional attributes related to a single next upcoming event. -<div class='note'> - +{% tip %} Using the entity state and attributes is more error prone and less flexible than using Calendar Automations. The calendar entity itself may only track a single upcoming active event and can't handle multiple events with the same start time, or overlapping events. - -</div> +{% endtip %} {% details "Attributes" %} @@ -82,21 +80,19 @@ Using the entity state and attributes is more error prone and less flexible than {% enddetails %} -### Service `google.create_event` - -You can use the service `google.create_event` to create a new calendar event in a calendar. +### Action `google.create_event` -{% details "Create Event Service details" %} +You can use the `google.create_event` action to create a new calendar event in a calendar. -<div class='note'> +{% details "Create event action details" %} +{% note %} This will only be available if you have given Home Assistant `read-write` access in configuration options. - -</div> +{% endnote %} A calendar `target` is selected with a [Target Selector](/docs/blueprint/selectors/#target-selector) and the `data` payload supports the following fields: -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | --------------------------------------------------- | ------------------- | | `summary` | no | Acts as the title of the event. | Bowling | | `description` | yes | The description of the event. | Birthday bowling | @@ -107,13 +103,11 @@ A calendar `target` is selected with a [Target Selector](/docs/blueprint/selecto | `in` | yes | Days or weeks that you want to create the event in. | "days": 2 | | `location` | yes | The location of the event. | Bowling center | -<div class='note'> - +{% important %} You either use `start_date_time` and `end_date_time`, or `start_date` and `end_date`, or `in`. +{% endimportant %} -</div> - -This is a full example of service call in YAML: +This is a full example of an action in YAML: ```yaml service: google.create_event @@ -132,11 +126,11 @@ data: {% details "More Configuration" %} -<div class='note warning'> +{% warning %} It is not recommended to new users to use these settings as they are not compatible with other Home Assistant features, but this documentation is available for existing users. -</div> +{% endwarning %} The integration supports additional configuration from a file `google_calendars.yaml` which is available for existing users before version `2022.06`. This file is no longer automatically populated. diff --git a/source/_integrations/google_assistant.markdown b/source/_integrations/google_assistant.markdown index df95fa3648b6..de87ba2143c5 100644 --- a/source/_integrations/google_assistant.markdown +++ b/source/_integrations/google_assistant.markdown @@ -29,11 +29,9 @@ For Home Assistant Cloud users, documentation can be found [here](https://www.na The Google Assistant integration (without Home Assistant Cloud) requires a bit more setup than most due to the way Google requires Assistant Apps to be set up. -<div class='note warning'> - +{% important %} To use Google Assistant, your Home Assistant configuration has to be [externally accessible with a hostname and SSL certificate](/docs/configuration/remote/). If you haven't already configured that, you should do so before continuing. If you make DNS changes to accomplish this, please ensure you have allowed up to the full 48 hours for DNS changes to propagate, otherwise, Google may not be able to reach your server. Once you have confirmed you can reach your Home Assistant from outside your home network, you can set up the Google integration: - -</div> +{% endimportant %} ### Google Cloud Platform configuration @@ -93,11 +91,9 @@ To use Google Assistant, your Home Assistant configuration has to be [externally 1. Open the Google Home app. 2. Select the `+` button on the top left corner, select **Set up device**. In the **Set up a device** screen, select **Works with Google**. You should have `[test] <Action Name>` listed under **Add new**. Selecting that should lead you to a browser to login your Home Assistant instance, then redirect back to a screen where you can set rooms and nicknames for your devices if you wish. -<div class='note'> - +{% important %} If you've added Home Assistant to your phone's home screen, you have to first remove it from the home screen. Otherwise, this HTML5 app will show up instead of a browser. Using it would prevent Home Assistant redirecting back to the Google Home app. - -</div> +{% endimportant %} ### Allow other users @@ -134,15 +130,13 @@ Your Google Assistant devices will still communicate via the internet to: - Send commands that involve a [secure device](#secure-devices). - Send commands if local fulfillment fails. -<div class='note'> - +{% important %} The [HTTP integration](/integrations/http) must **not** be configured to use an SSL certificate with the [`ssl_certificate` option](/integrations/http/#ssl_certificate). This is because the Google Assistant device will connect directly to the IP of your Home Assistant instance and will fail if it encounters an invalid SSL certificate. For secure remote access, use a reverse proxy such as the {% my supervisor_addon addon="core_nginx_proxy" title="NGINX SSL" %} add-on instead of directing external traffic straight to Home Assistant. - -</div> +{% endimportant %} 1. Open the project you created in the [Actions on Google console](https://console.actions.google.com/). 2. Select **Develop** on the top of the page, then select **Actions** located in the hamburger menu on the top left. @@ -283,11 +277,9 @@ Currently, the following domains are available to be used with Google Assistant, - valve (open/close/set position/stop/start=toggle valve) - water_heater (on-off/temperature setting/operation mode) -<div class='note'> - +{% note %} Some of these devices may not display correctly in the Google Home app, such as media_player, however voice commands will still work. - -</div> +{% endnote %} ### Secure devices @@ -301,13 +293,11 @@ If a code is set for the Alarm control panel, it must be the same as the `secure Entities that have not been explicitly assigned to rooms but have been placed in Home Assistant areas will return room hints to Google with the devices in those areas. -<div class='note'> - +{% note %} Some devices, such as `scene` or `script`, must be assigned to an `area` before other members of a shared Google Home Household can use them. This is because household members in a shared Google Home will not be able to view devices that are not assigned to a room _unless_ they were the user who linked the service to Google Home. This issue isn't immediately apparent because `script` and `scene` devices aren't visible in the main Google Home dashboard. The automatic room assignment will not work when multiple homes are set up in your Google account. - -</div> +{% endnote %} ### Climate operation modes @@ -348,11 +338,11 @@ Verify that the Google Assistant is available on `https://[YOUR HOME ASSISTANT U #### 403 errors on request sync -The `request_sync` service may fail with a 403 if the HomeGraph API is not enabled. Go to [Google API Console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview) and verify that HomeGraph API is enabled for your project. +The `request_sync` action may fail with a 403 if the HomeGraph API is not enabled. Go to [Google API Console](https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview) and verify that HomeGraph API is enabled for your project. #### 404 errors on report state -If you receive 404 errors linked to reporting state in your log, Home Assistant is reporting state for entities that were never synced to Google. Ask your Google Home to `Sync my devices` or run the service `google_assistant.request_sync`. +If you receive 404 errors linked to reporting state in your log, Home Assistant is reporting state for entities that were never synced to Google. Ask your Google Home to `Sync my devices` or run the `google_assistant.request_sync` action. #### Error during linking: "Could not update the setting. Please check your connection" diff --git a/source/_integrations/google_assistant_sdk.markdown b/source/_integrations/google_assistant_sdk.markdown index 750bba81ba8e..a82d95b1435c 100644 --- a/source/_integrations/google_assistant_sdk.markdown +++ b/source/_integrations/google_assistant_sdk.markdown @@ -12,6 +12,7 @@ ha_codeowners: - '@tronikos' ha_integration_type: service ha_platforms: + - diagnostics - notify ha_quality_scale: platinum google_dev_console_link: https://console.developers.google.com/apis/api/embeddedassistant.googleapis.com/overview @@ -115,7 +116,7 @@ This guide is for advanced users only. It requires creating an OAuth client ID o {% details "Enable personal results" %} -1. Go to **{% my developer_services title="Developer Tools > Services" %}** and issue a query that requires personal results, for example call `google_assistant_sdk.send_text_command` with `command: "what is my name"` +1. Go to **{% my developer_services title="Developer Tools > Actions" %}** and issue a query that requires personal results, for example call `google_assistant_sdk.send_text_command` with `command: "what is my name"` 2. On your phone, you should receive a notification **Allow personal answers** **Allow Google Assistant to answer your questions about your calendar, trips, and more**. 3. DO NOT tap on **ALLOW** (it won't work until you enter a device name). Instead, tap on the notification text. 4. If the app doesn't open, you need to retry on a device running Android 12. If you don't have such a device, you can use an Android emulator. @@ -147,13 +148,13 @@ The easiest way to check if the integration is working is to check [My Google Ac On the configure page, you can set the language code of the interactions with Google Assistant. If not configured, the integration picks one based on Home Assistant's configured language and country. Supported languages are listed [here](https://developers.google.com/assistant/sdk/reference/rpc/languages). -## Services +## Actions -### Service `google_assistant_sdk.send_text_command` +### Action `google_assistant_sdk.send_text_command` -You can use the service `google_assistant_sdk.send_text_command` to send commands to Google Assistant. +You can use the `google_assistant_sdk.send_text_command` action to send commands to Google Assistant. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `command` | no | Command(s) to send to Google Assistant. | turn off kitchen TV | | `media_player` | yes | Name(s) of media player entities to play response on | media_player.living_room_speaker | @@ -206,11 +207,11 @@ responses: The drumsticks 🍗 ``` -### Service `notify.google_assistant_sdk` +### Action `notify.google_assistant_sdk` -You can use the service `notify.google_assistant_sdk` to broadcast messages to Google Assistant speakers and displays without interrupting music/video playback. +You can use the `notify.google_assistant_sdk` action to broadcast messages to Google Assistant speakers and displays without interrupting music/video playback. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | --------------------------- | ---------------------------- | | `message` | no | Message to broadcast. | someone is at the front door | | `target` | yes | Rooms (in Google Assistant) | bedroom | @@ -242,6 +243,6 @@ Then you can converse with Google Assistant by tapping the Assist icon at the to ![Screenshot Conversation](/images/integrations/google_assistant_sdk/conversation.png) -Or by calling the `conversation.process` service. +Or by calling the `conversation.process` action. Note: due to a bug in the Google Assistant API, not all responses contain text, especially for home control commands, like turn on the lights. These will be shown as `<empty response>`. For those, Google Assistant responds with HTML and Home Assistant integrations are [not allowed](https://github.com/home-assistant/architecture/blob/master/adr/0004-webscraping.md) to parse HTML. diff --git a/source/_integrations/google_generative_ai_conversation.markdown b/source/_integrations/google_generative_ai_conversation.markdown index 2cc8115013ce..b9073be8225e 100644 --- a/source/_integrations/google_generative_ai_conversation.markdown +++ b/source/_integrations/google_generative_ai_conversation.markdown @@ -88,20 +88,18 @@ You can use an OpenAI Conversation integration to [talk to Super Mario and, if y The tutorial is using OpenAI, but this could also be done with the Google Generative AI integration. -## Services +## Actions -### Service `google_generative_ai_conversation.generate_content` +### Action `google_generative_ai_conversation.generate_content` -<div class='note info'> - - This service isn't tied to any integration entry, so it won't use the model, prompt, or any of the other settings in your options. If you only want to pass text, you should use the `conversation.process` service. - -</div> +{% tip %} +This action isn't tied to any integration entry, so it won't use the model, prompt, or any of the other settings in your options. If you only want to pass text, you should use the `conversation.process` action. +{% endtip %} Allows you to ask Gemini Pro or Gemini Pro Vision to generate content from a prompt consisting of text and optionally images. -This service populates [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with the generated content. +This action populates [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with the generated content. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------------------------------------------- | ------------------- | | `prompt` | no | The prompt for generating the content. | Describe this image | | `image_filename` | yes | File names for images to include in the prompt. | /tmp/image.jpg | diff --git a/source/_integrations/google_mail.markdown b/source/_integrations/google_mail.markdown index 2d42bfd34db8..71e3e23530de 100644 --- a/source/_integrations/google_mail.markdown +++ b/source/_integrations/google_mail.markdown @@ -18,7 +18,7 @@ api: Gmail API api_link: https://console.cloud.google.com/apis/library/gmail.googleapis.com --- -The Google Mail integration allows you to connect your [Google Mail](https://mail.google.com) to Home Assistant. The integration adds a service to allow you to set an email auto-response for when you go on vacation. A `notify` service is also added, allowing you to draft or send emails in plain text. +The Google Mail integration allows you to connect your [Google Mail](https://mail.google.com) to Home Assistant. The integration adds an action to allow you to set an email auto-response for when you go on vacation. A `notify` action is also added, allowing you to draft or send emails in plain text. ## Prerequisites @@ -36,13 +36,13 @@ These are not the same as *Device Auth* credentials previously recommended for [ If you have an error with your credentials you can delete them in the [Application Credentials](/integrations/application_credentials/) user interface. -### Service `google_mail.set_vacation` +### Action `google_mail.set_vacation` -You can use the service `google_mail.set_vacation` to set vacation options. +You can use the `google_mail.set_vacation` action to set vacation options. -{% details "Create Event Service details" %} +{% details "Create event action details" %} -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `enabled` | yes | Turn this off to end vacation responses. | True | `title` | no | The subject for the email. | Vacation @@ -57,9 +57,9 @@ You can use the service `google_mail.set_vacation` to set vacation options. The added `notify` service will be named after the email address you chose on the consent screen. For example, an email address named "example@gmail.com" wil display as `notify.example_gmail_com`. -### Google Mail notify service data +### Google Mail notify action data -The following attributes can be placed inside the `data` key of the service call for extended functionality: +The following attributes can be placed inside the `data` key of the action for extended functionality: | Attribute | Optional | Description | | ---------------------- | -------- | ----------- | diff --git a/source/_integrations/google_maps.markdown b/source/_integrations/google_maps.markdown index 48695ee03dfd..64409aa023a1 100644 --- a/source/_integrations/google_maps.markdown +++ b/source/_integrations/google_maps.markdown @@ -38,12 +38,9 @@ device_tracker: username: "ACCOUNT_B_EMAIL" ``` -<div class='note'> +{% note %} If using more than one account, your own device may show twice, however, the parameters returned from Account A will not include a value for battery_level or entity_picture. These parameters will be present in your device tracker entity from Account B. Therefore, disregard the device tracker entity with is missing those parameters. -</div> - - - +{% endnote %} ## Configuration @@ -77,6 +74,6 @@ scan_interval: type: integer {% endconfiguration %} -<div class='note'> +{% note %} As of release 0.97 Google passwords are no longer required in your configuration. Users coming from earlier releases should only remove the password entry from their configuration file (username is still required) and restart Home Assistant. The cookie file previously generated should still be valid and will allow the tracker to continue functioning normally until the cookie is invalidated. -</div> +{% endnote %} diff --git a/source/_integrations/google_pubsub.markdown b/source/_integrations/google_pubsub.markdown index 529defa39097..f0927a960024 100644 --- a/source/_integrations/google_pubsub.markdown +++ b/source/_integrations/google_pubsub.markdown @@ -84,9 +84,9 @@ filter: type: list {% endconfiguration %} -<div class='note warning'> - Not filtering domains or entities will send every event to Google PubSub, thus hitting the free tier limit very fast. Be sure to fill in this configuration parameter or have a paid subscription for Google Cloud. -</div> +{% important %} +Not filtering domains or entities will send every event to Google PubSub, thus hitting the free tier limit very fast. Be sure to fill in this configuration parameter or have a paid subscription for Google Cloud. +{% endimportant %} ### Configure filter diff --git a/source/_integrations/google_sheets.markdown b/source/_integrations/google_sheets.markdown index 1f0321a74be9..1b3802980104 100644 --- a/source/_integrations/google_sheets.markdown +++ b/source/_integrations/google_sheets.markdown @@ -17,7 +17,7 @@ api2: Google Sheets API api2_link: https://console.cloud.google.com/apis/enableflow?apiid=sheets.googleapis.com --- -The Google Sheets integration allows you to connect your [Google Drive](https://drive.google.com) to Home Assistant. The integration adds a service to allow you to append rows to a Sheets document. The idea is that you can store data on there for further processing. When you set up a config entry, your drive will have a new sheet called Home Assistant. You can then rename this to whatever you like. +The Google Sheets integration allows you to connect your [Google Drive](https://drive.google.com) to Home Assistant. The integration adds an actiion to allow you to append rows to a Sheets document. The idea is that you can store data on there for further processing. When you set up a config entry, your drive will have a new sheet called Home Assistant. You can then rename this to whatever you like. **Note**: The integration currently only has access to that one document that is created during setup. @@ -45,22 +45,22 @@ This video tutorial explains how to set up the Google Sheets integration and how <lite-youtube videoid="hgGMgoxLYwo" videotitle="How to use Google Sheets in Home Assistant - TUTORIAL" posterquality="maxresdefault"></lite-youtube> -### Service `google_sheets.append_sheet` +### Action `google_sheets.append_sheet` -You can use the service `google_sheets.append_sheet` to add a row of data to the Sheets document created at setup. +You can use the `google_sheets.append_sheet` action to add rows of data to the Sheets document created at setup. -{% details "Create Event Service details" %} +{% details "Create event action details" %} -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| -| `config_entry` | no | Config entry to use. -| `worksheet` | yes | Name of the worksheet. Defaults to the first one in the document. | Sheet1 -| `data` | no | Data to be appended to the worksheet. This puts the data on a new row, one value per column. | {"hello": world, "cool": True, "count": 5} +| `config_entry` | no | Config entry to use. | +| `worksheet` | yes | Name of the worksheet. Defaults to the first one in the document. | Sheet1 | +| `data` | no | Data to be appended to the worksheet. This puts the data on new rows, one value per column. | {"hello": world, "cool": True, "count": 5} | {% raw %} ```yaml -# Example service call +# Example action service: google_sheets.append_sheet data: config_entry: 1b4a46c6cba0677bbfb5a8c53e8618b0 @@ -69,6 +69,17 @@ data: Date: "{{ now().strftime('%-d-%b-%y') }}" KWh: "{{ states('input_number.car_charging_kwh')|float(0) }}" Cost: "{{ states('input_number.car_charging_cost')|float(0) }}" + +# Example action with multiple rows +service: google_sheets.append_sheet +data: + config_entry: 1b4a46c6cba0677bbfb5a8c53e8618b0 + worksheet: "Car Charging" + data: + - Item: "Car 1 cost" + Cost: "{{ states('input_number.car_1_charging_cost')|float(0) }}" + - Item: "Car 2 cost" + Cost: "{{ states('input_number.car_2_charging_cost')|float(0) }}" ``` {% endraw %} diff --git a/source/_integrations/google_tasks.markdown b/source/_integrations/google_tasks.markdown index 02ccff1f7616..a3c79002c9de 100644 --- a/source/_integrations/google_tasks.markdown +++ b/source/_integrations/google_tasks.markdown @@ -28,11 +28,9 @@ related: The **Google Tasks** integration allows you to connect your [Google Tasks](https://support.google.com/tasks/answer/7675772) to Home Assistant. The integration adds a [to-do list entity](/integrations/todo) for each task list, allowing you to create, update, or delete items on the list from the **To-do list** dashboard. -<div class='note'> - +{% note %} The Google Tasks public API does not support viewing or setting the due time of tasks, only the due date. - -</div> +{% endnote %} ## Prerequisites diff --git a/source/_integrations/google_translate.markdown b/source/_integrations/google_translate.markdown index c25d55370ed9..c542e1890671 100644 --- a/source/_integrations/google_translate.markdown +++ b/source/_integrations/google_translate.markdown @@ -113,11 +113,11 @@ You can also use supported BCP 47 tags like the below or the 2-2 digit format fo | es-us | es | com | -## Service speak +## Action speak -The `tts.speak` service is the modern way to use Google translate TTS action. Add the `speak` action, select the entity for your Google translate TTS (it's named for the language you created it with), select the media player entity or group to send the TTS audio to, and enter the message to speak. +The `tts.speak` actiion is the modern way to use Google translate TTS action. Add the `speak` action, select the entity for your Google translate TTS (it's named for the language you created it with), select the media player entity or group to send the TTS audio to, and enter the message to speak. -For more options about `speak`, see the Speak section on the main [TTS](/integrations/tts/#service-speak) building block page. +For more options about `speak`, see the Speak section on the main [TTS](/integrations/tts/#action-speak) building block page. In YAML, your action will look like this: ```yaml @@ -129,15 +129,13 @@ data: message: Hello, can you hear me now? ``` -## Service say (legacy) +## Action say (legacy) -<div class='note'> +{% tip %} +The `google_translate_say` action can be used when configuring the legacy `google_translate` text-to-speech platform in `configuration.yaml`. We recommend new users to instead set up the integration in the UI and use the `tts.speak` action with the corresponding Google Translate text-to-speech entity as target. +{% endtip %} -The `google_translate_say` service can be used when configuring the legacy `google_translate` text-to-speech platform in `configuration.yaml`. We recommend new users to instead set up the integration in the UI and use the `tts.speak` service with the corresponding Google Translate text-to-speech entity as target. - -</div> - -The `google_translate_say` service supports `language` and also `options` for setting `tld`. The text for speech is set with `message`. Since release 0.92, the service name can be defined in the configuration `service_name` option. +The `google_translate_say` action supports `language` and also `options` for setting `tld`. The text for speech is set with `message`. Since release 0.92, the action name can be defined in the configuration `service_name` option. Say to all `media_player` device entities: diff --git a/source/_integrations/google_travel_time.markdown b/source/_integrations/google_travel_time.markdown index 69abcfc5427d..f383da778f99 100644 --- a/source/_integrations/google_travel_time.markdown +++ b/source/_integrations/google_travel_time.markdown @@ -64,7 +64,7 @@ Destination: Eddies House Using automatic polling can lead to calls that exceed your API limit, especially when you are tracking multiple travel times using the same API key. To use more granular polling, disable automated polling. -You can use the `homeassistant.update_entity` service to update the sensor on-demand. For example, if you want to update `sensor.morning_commute` every 2 minutes on weekday mornings, you can use the following automation: +You can use the `homeassistant.update_entity` action to update the sensor on-demand. For example, if you want to update `sensor.morning_commute` every 2 minutes on weekday mornings, you can use the following automation: ```yaml - id: update_morning_commute_sensor diff --git a/source/_integrations/govee_ble.markdown b/source/_integrations/govee_ble.markdown index 4f8dc1657311..62ecd1077e29 100644 --- a/source/_integrations/govee_ble.markdown +++ b/source/_integrations/govee_ble.markdown @@ -38,6 +38,11 @@ The Govee BLE integration will automatically discover devices once the [Bluetoot - H5105 Hygrometer Thermometer - H5106 Hygrometer Thermometer and Air Quality Monitor - H5108 Hygrometer Thermometer +- H5121 Motion Sensor - Only battery is supported +- H5122 Mini Button - Only battery is supported +- H5123 Window Sensor - Only battery is supported +- H5125 2 Button Switch - Only battery is supported +- H5126 6 Button Switch - Only battery is supported - [H5177/5178 Bluetooth Thermo-Hygrometer](https://us.govee.com/collections/thermo-hydrometer/products/bluetooth-thermo-hygrometer) - H5174 Hygrometer Thermometer - [H5179 Hygrometer Thermometer](https://us.govee.com/products/wi-fi-temperature-humidity-sensor) diff --git a/source/_integrations/gree.markdown b/source/_integrations/gree.markdown index 7db402cdc3ba..86fc7153f994 100644 --- a/source/_integrations/gree.markdown +++ b/source/_integrations/gree.markdown @@ -24,9 +24,9 @@ There is currently support for the following device types within Home Assistant: {% include integrations/config_flow.md %} -<div class='note'> +{% important %} Devices must first be bound to WiFi using the Gree+ app, or app provided by the device manufacturer. It is not possible to connect devices to WiFi using this integration at the current time. -</div> +{% endimportant %} ## Supported models @@ -44,16 +44,16 @@ Any Gree Smart device working with the Gree+ app should be supported, including The `gree` climate platform integrates Gree HVAC systems into Home Assistant, enabling control of setting the following parameters: -- [`set_hvac_mode`](/integrations/climate/#service-climateset_hvac_mode) -- [`target temperature`](/integrations/climate#service-climateset_temperature) -- [`turn on/off`](/integrations/climate#service-climateturn_on) -- [`fan mode`](/integrations/climate#service-climateset_fan_mode) -- [`swing mode`](/integrations/climate#service-climateset_swing_mode) -- [`set_preset_mode`](/integrations/climate#service-climateset_preset_mode) +- [`set_hvac_mode`](/integrations/climate/#action-climateset_hvac_mode) +- [`target temperature`](/integrations/climate#action-climateset_temperature) +- [`turn on/off`](/integrations/climate#action-climateturn_on) +- [`fan mode`](/integrations/climate#action-climateset_fan_mode) +- [`swing mode`](/integrations/climate#action-climateset_swing_mode) +- [`set_preset_mode`](/integrations/climate#action-climateset_preset_mode) -<div class='note'> +{% note %} Preset mode **Away** represents Gree's "8°C heating mode." -</div> +{% endnote %} ## Switch diff --git a/source/_integrations/group.markdown b/source/_integrations/group.markdown index d8b538970023..798bbc6ea48b 100644 --- a/source/_integrations/group.markdown +++ b/source/_integrations/group.markdown @@ -3,6 +3,7 @@ title: Group description: Instructions on how to setup groups within Home Assistant. ha_category: - Binary sensor + - Button - Cover - Event - Fan @@ -62,6 +63,13 @@ Binary sensor, light, and switch groups allow you set the "All entities" option. - Otherwise, the group state is `off` if at least one group member is `off`. - Otherwise, the group state is `on`. +### Button groups + +The group state is the last time the grouped button was pressed. + +- The group state is `unavailable` if all group members are `unavailable`. +- Otherwise, the group state is the last time the grouped button was pressed. + ### Cover groups In short, when any group member entity is `open`, the group will also be `open`. A complete overview of how cover groups behave: @@ -116,7 +124,7 @@ In short, when any group member entity is `unlocked`, the group will also be `un ## Managing groups -To edit a group, **{% my helpers title="Settings -> Devices & Services -> Helpers" %}**. Find and select the group from the list. +To edit a group, **{% my helpers title="Settings -> Devices & services -> Helpers" %}**. Find and select the group from the list. ![Group members](/images/integrations/group/Group_settings.png) @@ -144,6 +152,19 @@ binary_sensor: - binary_sensor.door_right_contact ``` +Example YAML configuration of a button group: + +```yaml +# Example configuration.yaml entry +button: + - platform: group + name: "Restart all ESPHome devices" + device_class: opening + entities: + - button.device_1_restart + - button.device_2_restart +``` + Example YAML configuration of a cover group: ```yaml @@ -288,7 +309,7 @@ state_class: This group is a special case of groups currently only available via YAML configuration. -Notify groups are used to combine multiple notification services into a single service. This allows you to send notification to multiple devices with a single call. +Notify groups are used to combine multiple notification actions into a single action. This allows you to send notification to multiple devices by performing a single action. ```yaml # Example configuration.yaml entry @@ -308,12 +329,12 @@ name: required: true type: string services: - description: A list of all the services to be included in the group. + description: A list of all the actions to be included in the group. required: true type: list keys: service: - description: The service part of an entity ID, e.g., if you use `notify.html5` normally, just put `html5`. Note that you must put everything in lower case here. Although you might have capitals written in the actual notification services! + description: The name part of an entity ID, e.g., if you use `notify.html5` normally, just put `html5`. Note that you must put everything in lower case here. Although you might have capitals written in the actual notification actions! required: true type: string data: @@ -400,11 +421,9 @@ Old style groups can calculate group state with entities from the following doma - `vacuum` - `water_heater` -<div class='note info'> - +{% note %} Platform domains other than these are not supported to be used with old style groups, nor will other domains be supported in the future. - -</div> +{% endnote %} When member entities all have a single `on` and `off` state, the group state will be calculated as follows: @@ -420,13 +439,13 @@ When a group contains entities from domains that have multiple `on` states or on It is possible to create a group that the system cannot calculate a group state. Groups with entities from unsupported domains will always have an unknown state. -These groups can still be in templates with the `expand()` directive, called using the `homeassistant.turn_on` and `homeassistant.turn_off` services, etc. +These groups can still be in templates with the `expand()` directive, called using the `homeassistant.turn_on` and `homeassistant.turn_off` actions, etc. -### Services +### Actions -This integration provides the following services to modify groups and a service to reload the configuration without restarting Home Assistant itself. +This integration provides the following actions to modify groups and a action to reload the configuration without restarting Home Assistant itself. -| Service | Data | Description | +| Action | Data | Description | | -------- | ----------------- | ----------------------------------------------------------------------------- | | `set` | `Object ID` | Group id and part of entity id. | | | `Name` | Name of the group. | diff --git a/source/_integrations/guardian.markdown b/source/_integrations/guardian.markdown index d51ccaaa140a..a29c86590f74 100644 --- a/source/_integrations/guardian.markdown +++ b/source/_integrations/guardian.markdown @@ -38,13 +38,13 @@ There is currently support for the following device types within Home Assistant: {% include integrations/config_flow.md %} -## Services +## Actions ### `guardian.pair_sensor` Add a new paired sensor to the valve controller. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `uid` | yes | The unique device ID on the bottom of the sensor.| @@ -52,7 +52,7 @@ Add a new paired sensor to the valve controller. Remove a paired sensor from the valve controller. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `uid` | yes | The unique device ID on the bottom of the sensor.| @@ -60,15 +60,17 @@ Remove a paired sensor from the valve controller. Upgrade the device firmware. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `url` | yes | The URL of the server hosting the firmware file. | | `port` | yes | The port on which the firmware file is served. | | `filename` | yes | The firmware filename. | -*Note:* not all service calls are available on all Guardian valve controller firmwares. +{% note %} +Not all actions are available on all Guardian valve controller firmwares. Please ensure you upgrade your valve controller to the latest firmware before opening -bugs related to non-working service calls. +bugs related to non-working actions. +{% endnote %} ## Paired Sensor Notes diff --git a/source/_integrations/habitica.markdown b/source/_integrations/habitica.markdown index 9c21fd9a44ec..c5db4a87d034 100644 --- a/source/_integrations/habitica.markdown +++ b/source/_integrations/habitica.markdown @@ -8,7 +8,10 @@ ha_release: 0.78 ha_iot_class: Cloud Polling ha_domain: habitica ha_platforms: + - button - sensor + - switch + - todo ha_codeowners: - '@ASMfreaK' - '@leikoilja' @@ -19,9 +22,13 @@ ha_integration_type: integration This integration allows you to monitor and manage your Habitica profile. This integration exposes the [Habitica's API](https://habitica.com/apidoc/) as a Home Assistant service. It supports multiple users and allows you to automate checking out your habits and daily tasks or casting magics using Home Assistant. +{% include integrations/config_flow.md %} + There is currently support for the following device types within Home Assistant: -Player data: allows you to view and monitor your player data from [Habitica](https://habitica.com/) in Home Assistant. The following sensors will be available: +## Player data + +Allows you to view and monitor your player data from [Habitica](https://habitica.com/) in Home Assistant. The following sensors will be available: - Player's name - Player's health points @@ -34,38 +41,45 @@ Player data: allows you to view and monitor your player data from [Habitica](htt - Player's gold pieces - Player's class -Tasks: allows you to view and monitor your tasks from [Habitica](https://habitica.com/) in Home Assistant. The following sensors will be available: +## To-do lists + +The following Habitica tasks are available as to-do lists in Home Assistant. You can add, delete, edit and check-off completed tasks + +- To-do's +- Dailies + +## Tasks + +Allows you to view and monitor your tasks from [Habitica](https://habitica.com/) in Home Assistant. The following sensors will be available: - Habits -- Daily tasks -- Todo tasks - Rewards -{% include integrations/config_flow.md %} +## API Service -At runtime you will be able to use API for each respective user by their Habitica's username. +At runtime, you will be able to use the API for each respective user by their Habitica's username. You can override this by passing `name` key, this value will be used instead of the username. If you are hosting your own instance of Habitica, you can specify a URL to it in `url` key. ### API Service Parameters -The API is exposed to Home Assistant as a service called `habitica.api_call`. To call it you should specify this keys in service data: +The API is exposed to Home Assistant as an action called `habitica.api_call`. To call it, you should specify these keys in the data: -| Service data attribute | Required | Type | Description | +| Data attribute | Required | Type | Description | | ---------------------- | -------- | -------- | ----------------------------------------------------------------------------------------------------------------- | | `name` | yes | string | Habitica's username as per `configuration.yaml` entry. | | `path` | yes | [string] | Items from API URL in form of an array with method attached at the end. See the example below. | | `args` | no | map | Any additional JSON or URL parameter arguments. See the example below and [apidoc](https://habitica.com/apidoc/). | -A successful call to this service will fire an event `habitica_api_call_success`. +A successful run of this action will fire an event `habitica_api_call_success`. | Event data attribute | Type | Description | | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | string | Copied from service data attribute. | -| `path` | [string] | Copied from service data attribute. | +| `name` | string | Copied from the data attribute. | +| `path` | [string] | Copied from the data attribute. | | `data` | map | Deserialized `data` field of JSON object Habitica's server returned in response to API call. For more info see the [API documentation](https://habitica.com/apidoc/). | -#### Let's consider some examples on how to call the service. +#### Let's consider some examples on how to use the action For example, let's say that there is a configured `habitica` platform for user `xxxNotAValidNickxxx` with their respective `api_user` and `api_key`. Let's create a new task (a todo) for this user via Home Assistant. There is an [API call](https://habitica.com/apidoc/#api-Task-CreateUserTasks) for this purpose. diff --git a/source/_integrations/harmony.markdown b/source/_integrations/harmony.markdown index efe32137376f..983b4d141529 100644 --- a/source/_integrations/harmony.markdown +++ b/source/_integrations/harmony.markdown @@ -16,7 +16,6 @@ ha_ssdp: true ha_platforms: - remote - select - - switch ha_integration_type: integration --- @@ -34,7 +33,7 @@ Supported units: **Note:** Depending on the firmware, you may need to enable XMPP for this integration to work. From your Harmony app, go to: **Menu** > **Harmony Setup** > **Add/Edit Devices & Activities** > **Remote & Hub** > **Enable XMPP**. -Once the Logitech Harmony Hub has been configured, the default activity and duration in seconds between sending commands to a device can be adjusted in the settings via **Settings** -> **Devices & Services** >> **Your Logitech Harmony Hub** +Once the Logitech Harmony Hub has been configured, the default activity and duration in seconds between sending commands to a device can be adjusted in the settings via **Settings** -> **Devices & services** >> **Your Logitech Harmony Hub** ### Configuration file @@ -46,19 +45,19 @@ Upon startup one file will be written to your Home Assistant configuration direc This file will be overwritten whenever the Harmony HUB has a new configuration, there is no need to restart Home Assistant. -### Service `remote.turn_off` +### Action `remote.turn_off` Turn off all devices that were switched on from the start of the current activity. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------- | | `entity_id` | no | Entity ID to target. | -### Service `remote.turn_on` +### Action `remote.turn_on` Start an activity. Will start the default `activity` from {% term "`configuration.yaml`" %} if no activity is specified. The specified activity can either be the activity name or the activity ID from the configuration file written to your [Home Assistant configuration directory](/docs/configuration/). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------- | | `entity_id` | no | Entity ID to target. | | `activity` | yes | Activity ID or Activity Name to start. | @@ -78,7 +77,7 @@ In the file 'harmony_REMOTENAME.conf' you can find the available activities, for } ``` -Using the activity name 'Watch TV', you can call a service via automation to switch this activity on: +Using the activity name 'Watch TV', you can perform an action via automation to switch this activity on: ```yaml action: @@ -89,11 +88,11 @@ action: activity: "Watch TV" ``` -### Service `remote.send_command` +### Action `remote.send_command` Send a single command or a set of commands to one device, device ID and available commands are written to the configuration file at startup. You can optionally specify the number of times you wish to repeat the command(s) and delay you want between repeated command(s). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------- | | `entity_id` | no | Entity ID to target. | | `device` | no | Device ID or Device Name to send the command to. | @@ -127,7 +126,7 @@ In the file 'harmony_REMOTENAME.conf' you can find the available devices and com } ``` -A typical service call for sending several button presses looks like this: +A typical action for sending several button presses looks like this: ```yaml service: remote.send_command @@ -153,16 +152,16 @@ data: delay_secs: 0.6 ``` -### Service `harmony.change_channel` +### Action `harmony.change_channel` Sends the change channel command to the Harmony HUB -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------- | | `entity_id` | no | Entity ID to target. | | `channel` | no | Channel number to change to | -A typical service call for changing the channel would be:: +A typical action for changing the channel would be:: ```yaml service: harmony.change_channel @@ -172,11 +171,11 @@ data: channel: 200 ``` -### Service `harmony.sync` +### Action `harmony.sync` Force synchronization between the Harmony device and the Harmony cloud. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------- | | `entity_id` | no | Entity ID to target. | diff --git a/source/_integrations/hassio.markdown b/source/_integrations/hassio.markdown index 9d1107739b9e..7147a224e864 100644 --- a/source/_integrations/hassio.markdown +++ b/source/_integrations/hassio.markdown @@ -86,61 +86,61 @@ For Home Assistant OS Supervisor provides following binary sensors: For all your installed add-ons, Home Assistant Core, Home Assistant Supervisor, and for the Home Assistant Operating System (if you are running that), this integration will provide [update](/integrations/update) entities that provide information about pending updates, and will allow you to update to them. -## Services +## Actions -### Service hassio.addon_start +### Action hassio.addon_start Start an add-on. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `addon` | no | Add-on slug -### Service hassio.addon_stop +### Action hassio.addon_stop Stop an add-on. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `addon` | no | Add-on slug -### Service hassio.addon_restart +### Action hassio.addon_restart Restart an add-on. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `addon` | no | Add-on slug -### Service hassio.addon_stdin +### Action hassio.addon_stdin Write data to add-on stdin. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `addon` | no | Add-on slug -### Service hassio.addon_update +### Action hassio.addon_update -Update add-on. This service should be used with caution since add-on updates can contain backward-incompatible changes. It is highly recommended that you review release notes/change logs before updating an add-on. +Update add-on. This action should be used with caution since add-on updates can contain backward-incompatible changes. It is highly recommended that you review release notes/change logs before updating an add-on. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `addon` | no | Add-on slug -### Service hassio.host_reboot +### Action hassio.host_reboot Reboot the host system. -### Service hassio.host_shutdown +### Action hassio.host_shutdown Shutdown the host system. -### Service hassio.backup_full +### Action hassio.backup_full Create a full backup. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `name` | yes | By default, the current date and time are used in your local time, which you have set in your general settings. | `password` | yes | Optional password for backup @@ -148,11 +148,11 @@ Create a full backup. | `location` | yes | Alternate backup location instead of using the default location for backups | `homeassistant_exclude_database` | yes | Exclude the Home Assistant database file from backup -### Service hassio.backup_partial +### Action hassio.backup_partial Create a partial backup. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `addons` | yes | List of add-on slugs to backup | `folders` | yes | List of directories to backup @@ -163,20 +163,20 @@ Create a partial backup. | `homeassistant` | yes | Include Home Assistant and associated config in backup | `homeassistant_exclude_database` | yes | Exclude the Home Assistant database file from backup -### Service hassio.restore_full +### Action hassio.restore_full Restore from full backup. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `slug` | no | Slug of backup to restore from | `password` | yes | Optional password for backup -### Service hassio.restore_partial +### Action hassio.restore_partial Restore from partial backup. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `slug` | no | Slug of backup to restore from | `homeassistant` | yes | Whether to restore Home Assistant, `true` or `false` diff --git a/source/_integrations/haveibeenpwned.markdown b/source/_integrations/haveibeenpwned.markdown index 48cb979330f2..564e64cb8421 100644 --- a/source/_integrations/haveibeenpwned.markdown +++ b/source/_integrations/haveibeenpwned.markdown @@ -56,8 +56,8 @@ account has been breached as well as the added date of the breach data. This dat <img src='/images/integrations/haveibeenpwned/sensor.png' /> </p> -<div class='note warning'> - The sensor will scan all email addresses specified with a 5 second delay between all breach data requests on Home Assistant startup. - After this initial startup scanning, the sensor will only scan one email account per 15 minutes to prevent abuse, and not hammer "the - Have I been Pwned" service, as this breach data almost never changes. -</div> +{% note %} +The sensor will scan all email addresses specified with a 5 second delay between all breach data requests on Home Assistant startup. +After this initial startup scanning, the sensor will only scan one email account per 15 minutes to prevent abuse, and not hammer "the +Have I been Pwned" service, as this breach data almost never changes. +{% endnote %} diff --git a/source/_integrations/hddtemp.markdown b/source/_integrations/hddtemp.markdown index 73e057c3a628..2468ae5f38b5 100644 --- a/source/_integrations/hddtemp.markdown +++ b/source/_integrations/hddtemp.markdown @@ -24,12 +24,9 @@ It required that `hddtemp` is started or running in daemon mode on a local or re hddtemp -dF ``` -<div class='note warning'> - - You can't use this sensor in a container (only Home Assistant Core is supported) as it requires access to `hddtemp` which is not available in a container-based setup. - -</div> - +{% important %} +You can't use this sensor in a container (only Home Assistant Core is supported) as it requires access to `hddtemp` which is not available in a container-based setup. +{% endimportant %} ## Configuration diff --git a/source/_integrations/hdmi_cec.markdown b/source/_integrations/hdmi_cec.markdown index cf681a6dbb9e..8ee39bba1b3e 100644 --- a/source/_integrations/hdmi_cec.markdown +++ b/source/_integrations/hdmi_cec.markdown @@ -14,7 +14,7 @@ ha_codeowners: - '@inytar' --- -The `hdmi_cec` integration provides services that allow selecting the active device, powering on all devices, setting all devices to standby and creates switch entities for HDMI devices. Devices are defined in the configuration file by associating HDMI port number and a device name. Connected devices that provide further HDMI ports, such as sound-bars and AVRs are also supported. Devices are listed from the perspective of the CEC-enabled Home Assistant device. Any connected device can be listed, regardless of whether it supports CEC. Ideally the HDMI port number on your device will map correctly the CEC physical address. If it does not, use `cec-client` (part of the `libcec` package) to listen to traffic on the CEC bus and discover the correct numbers. +The `hdmi_cec` integration provides actions that allow selecting the active device, powering on all devices, setting all devices to standby and creates switch entities for HDMI devices. Devices are defined in the configuration file by associating HDMI port number and a device name. Connected devices that provide further HDMI ports, such as sound-bars and AVRs are also supported. Devices are listed from the perspective of the CEC-enabled Home Assistant device. Any connected device can be listed, regardless of whether it supports CEC. Ideally the HDMI port number on your device will map correctly the CEC physical address. If it does not, use `cec-client` (part of the `libcec` package) to listen to traffic on the CEC bus and discover the correct numbers. ## CEC Setup @@ -53,12 +53,10 @@ ln -s /usr/local/lib/python*/dist-packages/cec.py /srv/homeassistant/lib/python* ln -s /usr/local/lib/python*/dist-packages/_cec.so /srv/homeassistant/lib/python*/site-packages ``` -<div class='note'> - +{% note %} If after symlinking and adding `hdmi_cec:` to your configuration you are getting the following error in your logs, `* failed to open vchiq instance` you will also need to add the user account Home Assistant runs under, to the `video` group. To add the Home Assistant user account to the `video` group, run the following command. `$ usermod -a -G video <hass_user_account>` - -</div> +{% endnote %} ## Testing your installation @@ -93,11 +91,9 @@ power status: on language: ??? ``` -<div class='note'> - +{% note %} `address:` entry above this will be used to configure Home Assistant, this address is represented below as 3: BlueRay player. - -</div> +{% endnote %} ## Configuration Example @@ -153,11 +149,11 @@ hdmi_cec: host: 192.168.1.3 ``` -## Services +## Actions ### Select Device -Call the `hdmi_cec.select_device` service with the name of the device from configuration or entity_id or physical address"to select it, for example: +Use the `hdmi_cec.select_device` action with the name of the device from configuration or entity_id or physical address"to select it, for example: ```json {"device": "Chromecast"} @@ -182,7 +178,7 @@ action: ### Power On -Call the `hdmi_cec.power_on` service (no arguments) to power on any devices that support this function. +Use the `hdmi_cec.power_on` action (no arguments) to power on any devices that support this function. An Automation action using the example above would look something like this. @@ -193,7 +189,7 @@ action: ### Standby -Call the `hdmi_cec.standby` service (no arguments) to place in standby any devices that support this function. +Use the `hdmi_cec.standby` action (no arguments) to place in standby any devices that support this function. An Automation action using the example above would look something like this. @@ -204,7 +200,7 @@ action: ### Change volume level -Call the `hdmi_cec.volume` service with one of following commands: +Use the `hdmi_cec.volume` action with one of following commands: #### Volume up diff --git a/source/_integrations/heos.markdown b/source/_integrations/heos.markdown index 84abe6d82c10..c33f14b709fe 100644 --- a/source/_integrations/heos.markdown +++ b/source/_integrations/heos.markdown @@ -26,43 +26,47 @@ The HEOS integration adds support for [HEOS](https://www.denon.com/en-gb/categor {% include integrations/config_flow.md %} -<div class='note info'> +{% note %} A connection to a single device enables control for all devices on the network. If you have multiple HEOS devices, enter the host of one that is connected to the LAN via wire or has the strongest wireless signal. -</div> +{% endnote %} -## Services +## Actions -### Service `heos.sign_in` +### Action `heos.sign_in` -Use the sign-in service (go to Developer Tools -> Services and then run the `heos.sign_in` with your username and password. Use the "Fill example data" first, then change it with your data. Check the logs right after, there you should see if the sign-in was successful or not) to sign the connected controller into a HEOS account so that it can retrieve and play HEOS favorites and playlists. An error message is logged if sign-in is unsuccessful. Example service data payload: +Use the sign-in action (go to **Developer Tools** > **Actions** and then run the `heos.sign_in` with your username and password. Use the "Fill example data" first, then change it with your data. Check the logs right after, there you should see if the sign-in was successful or not) to sign the connected controller into a HEOS account so that it can retrieve and play HEOS favorites and playlists. An error message is logged if sign-in is unsuccessful. Example action data payload: ```yaml -username: "example@example.com" -password: "password" +service: heos.sign_in +data: + username: "example@example.com" + password: "password" ``` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------ | | `username` | no | The username or email of the HEOS account. | | `password` | no | The password of the HEOS account. | -### Service `heos.sign_out` +### Action `heos.sign_out` -Use the sign-out service to sign the connected controller out of a HEOS account. An error message is logged if sign-out is unsuccessful. There are no parameters to this service. +Use the sign-out action to sign the connected controller out of a HEOS account. An error message is logged if sign-out is unsuccessful. There are no parameters to this action. -### Service `media_player.play_media` +### Action `media_player.play_media` #### Play favorite -You can play a HEOS favorite by number or name with the `media_player.play_media` service. Example service data payload: +You can play a HEOS favorite by number or name with the `media_player.play_media` action. Example action data payload: ```yaml -entity_id: media_player.office -media_content_type: "favorite" -media_content_id: "1" +service: media_player.play_media +data: + entity_id: media_player.office + media_content_type: "favorite" + media_content_id: "1" ``` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------- | | `entity_id` | yes | `entity_id` of the player(s) | | `media_content_type` | no | Set to the value `favorite` | @@ -70,15 +74,17 @@ media_content_id: "1" #### Play playlist -You can play a HEOS playlist with the `media_player.play_media` service. Example service data payload: +You can play a HEOS playlist with the `media_player.play_media` action. Example action data payload: ```yaml -entity_id: media_player.office -media_content_type: "playlist" -media_content_id: "Awesome Music" +service: media_player.play_media +data: + entity_id: media_player.office + media_content_type: "playlist" + media_content_id: "Awesome Music" ``` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------- | | `entity_id` | yes | `entity_id` of the player(s) | | `media_content_type` | no | Set to the value `playlist` | @@ -86,15 +92,17 @@ media_content_id: "Awesome Music" #### Play Quick Select -You can play a HEOS Quick Select by number or name with the `media_player.play_media` service. Example service data payload: +You can play a HEOS Quick Select by number or name with the `media_player.play_media` action. Example action data payload: ```yaml -entity_id: media_player.office -media_content_type: "quick_select" -media_content_id": "1" +service: media_player.play_media +data: + entity_id: media_player.office + media_content_type: "quick_select" + media_content_id": "1" ``` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------- | | `entity_id` | yes | `entity_id` of the player(s) | | `media_content_type` | no | Set to the value `quick_select` | @@ -102,42 +110,52 @@ media_content_id": "1" #### Play URL -You can play a URL through a HEOS media player using the `media_player.play_media` service. The HEOS player must be able to reach the URL. Example service data payload: +You can play a URL through a HEOS media player using the `media_player.play_media` action. The HEOS player must be able to reach the URL. Example action data payload: ```yaml -entity_id: media_player.office -media_content_type: "url" -media_content_id: "http://path.to/stream.mp3" +service: media_player.play_media +data: + entity_id: media_player.office + media_content_type: "url" + media_content_id: "http://path.to/stream.mp3" ``` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------- | | `entity_id` | yes | `entity_id` of the player(s) to play the URL | | `media_content_type` | no | Set to the value `url` | | `media_content_id` | no | The full URL to the stream | -### Service `media_player.join` +### Action `media_player.join` -For grouping HEOS media players together for synchronous playback you can use the `media_player.join` service. With the example service data payload down below you'll expand playback of `media_player.office` to the `media_player.kitchen` and `media_player.bathroom` players. Please note that all of the media players need to be HEOS players. +For grouping HEOS media players together for synchronous playback you can use the `media_player.join` action. With the example action data payload down below you'll expand playback of `media_player.office` to the `media_player.kitchen` and `media_player.bathroom` players. Please note that all of the media players need to be HEOS players. ```yaml -entity_id: media_player.office -group_members: - - media_player.kitchen - - media_player.bathroom +service: media_player.join +data: + entity_id: media_player.office + group_members: + - media_player.kitchen + - media_player.bathroom ``` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------- | | `entity_id` | yes | The media player entity whose playback will be expanded to the players specified in `group_members`. | | `group_members` | no | The player entities which will be synced with the playback from `entity_id`. | -### Service `media_player.unjoin` +### Action `media_player.unjoin` -For removing a HEOS player from a group you can use the `media_player.unjoin` service. +For removing a HEOS player from a group you can use the `media_player.unjoin` action. -| Service data attribute | Optional | Description | +```yaml +service: media_player.unjoin +data: + entity_id: media_player.office +``` + +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | yes | Unjoin this media player from any player groups. | @@ -146,7 +164,7 @@ For removing a HEOS player from a group you can use the `media_player.unjoin` se - Receivers with multiple zones are represented as a single media player. They will be turned on when playback is started, but cannot be turned off by the integration at this time. - [Denon AVR](/integrations/denonar/) and HEOS media players can be combined into a [Universal Media Player](/integrations/universal/#denon-avr--heos) -## Troubleshooing +## Troubleshooting ### Debugging @@ -162,7 +180,7 @@ logger: ### Missing Favorites -If the HEOS controller is not signed in to a HEOS account, HEOS favorites will not be populated in the media player source selection and the service `media_player.play_media` for `favorite` and `playlist` will fail. Additionally, the following warning will be logged at startup: -> IP_ADDRESS is not logged in to a HEOS account and will be unable to retrieve HEOS favorites: Use the 'heos.sign_in' service to sign-in to a HEOS account +If the HEOS controller is not signed in to a HEOS account, HEOS favorites will not be populated in the media player source selection and the `media_player.play_media` action for `favorite` and `playlist` will fail. Additionally, the following warning will be logged at startup: +> IP_ADDRESS is not logged in to a HEOS account and will be unable to retrieve HEOS favorites: Use the 'heos.sign_in' action to sign-in to a HEOS account -To resolve this issue, use the `heos.sign_in` service to sign the controller into an account as documented above. This only needs to be performed once, as the controller will remain signed in while the account credentials are valid. +To resolve this issue, use the `heos.sign_in` action to sign the controller into an account as documented above. This only needs to be performed once, as the controller will remain signed in while the account credentials are valid. diff --git a/source/_integrations/here_travel_time.markdown b/source/_integrations/here_travel_time.markdown index afd618da87c2..3a16f9fd819c 100644 --- a/source/_integrations/here_travel_time.markdown +++ b/source/_integrations/here_travel_time.markdown @@ -64,7 +64,7 @@ input_select: ## Updating sensors on-demand using Automation -You can also use the `homeassistant.update_entity` service to update the sensor on-demand. For example, if you want to update `sensor.morning_commute` every 2 minutes on weekday mornings, you can use the following automation: +You can also use the `homeassistant.update_entity` action to update the sensor on-demand. For example, if you want to update `sensor.morning_commute` every 2 minutes on weekday mornings, you can use the following automation: ```yaml automation: diff --git a/source/_integrations/hikvision.markdown b/source/_integrations/hikvision.markdown index 47fbbf54016b..017bb3a2cc30 100644 --- a/source/_integrations/hikvision.markdown +++ b/source/_integrations/hikvision.markdown @@ -24,10 +24,10 @@ as a trigger. If you would like to hide a sensor type you can do so by either unchecking "Notify the surveillance center" in the camera configuration or by using the "ignored" customize option detailed below. -<div class='note'> +{% important %} In order for the sensors to work the hikvision user must have the 'Remote: Notify Surveillance Center/Trigger Alarm Output' permission which can be enabled from the user management section of the web interface. If authentication issues persist after permissions are verified, try accessing using an admin user. Certain devices will only authenticate with an admin account despite permissions being set correctly. Also, the 'WEB Authentication' needs to be set to 'digest/basic' in the security/authentication section. Ensure this is applied on each individual camera in case of using an NVR. -</div> +{% endimportant %} For example, if you configure a camera with the name "Front Porch" that has motion detection and line crossing events enabled to notify the surveillance diff --git a/source/_integrations/hikvisioncam.markdown b/source/_integrations/hikvisioncam.markdown index dad7e7a9618a..dfd4e9552e19 100644 --- a/source/_integrations/hikvisioncam.markdown +++ b/source/_integrations/hikvisioncam.markdown @@ -18,9 +18,9 @@ related: This `hikvisioncam` switch {% term integration %} allows you to control your motion detection setting on your [Hikvision](https://www.hikvision.com/) camera. -<div class='note warning'> -Currently works using default https port only. -</div> +{% important %} +Currently works using default HTTPS port only. +{% endimportant %} To use your Hikvision cam in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/history_stats.markdown b/source/_integrations/history_stats.markdown index 99bcefc3c4da..7995cdc28678 100644 --- a/source/_integrations/history_stats.markdown +++ b/source/_integrations/history_stats.markdown @@ -8,6 +8,7 @@ ha_iot_class: Local Polling ha_release: 0.39 ha_quality_scale: internal ha_domain: history_stats +ha_config_flow: true ha_platforms: - sensor ha_integration_type: integration @@ -26,7 +27,28 @@ Examples of what you can track: - How long the lights were ON yesterday - How long you watched TV today -## Configuration +{% include integrations/config_flow.md %} + +Further information and examples about these configuration options can be found under the [YAML configuration](#yaml-configuration) + +{% configuration_basic %} +Name: + description: The name the sensor should have. +Entity: + description: The entity that provides the input. +State: + description: Which states of the input entity is counted in the statistics. +Type: + description: Any of `time`, `ratio` or `count`. +Start: + description: When to start the measure (timestamp or datetime). Can be a template. +End: + description: When to stop the measure (timestamp or datetime). Can be a template. +Duration: + description: Duration of the measure. +{% endconfiguration_basic %} + +## YAML Configuration To enable the history statistics sensor, add the following lines to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} @@ -84,13 +106,13 @@ duration: type: time {% endconfiguration %} -<div class='note'> +{% note %} You have to provide **exactly 2** of `start`, `end` and `duration`. <br/> You can use [template extensions](/docs/configuration/templating/#home-assistant-template-extensions) such as `now()` or `as_timestamp()` to handle dynamic dates, as shown in the examples below. -</div> +{% endnote %} ## Sensor type @@ -131,11 +153,9 @@ duration: minutes: 30 ``` -<div class='note'> - - If the duration exceeds the number of days of history stored by the `recorder` integration (`purge_keep_days`), the history statistics sensor will not have all the information it needs to look at the entire duration. For example, if `purge_keep_days` is set to 7, a history statistics sensor with a duration of 30 days will only report a value based on the last 7 days of history. - -</div> +{% note %} +If the duration exceeds the number of days of history stored by the `recorder` integration (`purge_keep_days`), the history statistics sensor will not have all the information it needs to look at the entire duration. For example, if `purge_keep_days` is set to 7, a history statistics sensor with a duration of 30 days will only report a value based on the last 7 days of history. +{% endnote %} ### Video tutorial This video tutorial explains how you can use history stats. It also shows how you can create a daily bar chart graph to visualize things such as occupancy, or how long the lights are on in a particular room. @@ -251,8 +271,6 @@ Here, last Monday is today at 00:00, minus the current weekday (the weekday is 0 {% endraw %} -<div class='note'> - - The `/developer-tools/template` page of your Home Assistant UI can help you check if the values for `start`, `end` or `duration` are correct. If you want to check if your period is right, just click on your component, the `from` and `to` attributes will show the start and end of the period, nicely formatted. - -</div> +{% tip %} +The `/developer-tools/template` page of your Home Assistant UI can help you check if the values for `start`, `end` or `duration` are correct. If you want to check if your period is right, just click on your component, the `from` and `to` attributes will show the start and end of the period, nicely formatted. +{% endtip %} diff --git a/source/_integrations/hive.markdown b/source/_integrations/hive.markdown index 1835055ce6d5..cbe3d0a96d20 100644 --- a/source/_integrations/hive.markdown +++ b/source/_integrations/hive.markdown @@ -32,12 +32,10 @@ ha_homekit: true The Hive integration for Home Assistant allows you to interact with supported devices and services offered by [hivehome.com](https://www.hivehome.com) -<div class='note'> - +{% note %} Please note that Hive shut down its North American Servers on November 30th, 2021. Read more about this in their [shutdown notice](https://www.hivehome.com/us/support). - -</div> +{% endnote %} This Hive integration uses the same username and password you use on the [Hive website](https://sso.hivehome.com) to configure it within Home Assistant, 2FA authentication must be enabled to use this integration. Once configured Home Assistant will detect and add all Hive devices, including support for multi-zone heating. @@ -49,13 +47,13 @@ Menu: *Configuration* > *Integrations* > *Select your new integration* > *Press - **Scan Interval**: Update the scan interval allowing the integration to poll for data more frequently (Cannot be set lower than 30 seconds). -## Services +## Actions -### Service `hive.boost_heating_on` +### Action `hive.boost_heating_on` -You can use the service `hive.boost_heating_on` to set your heating to boost for a period of time at a certain target temperature". Individual TRVs can also be boosted in the same way, using this service. +You can use the action `hive.boost_heating_on` to set your heating to boost for a period of time at a certain target temperature". Individual TRVs can also be boosted in the same way, using this action. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------- | | `entity_id` | no | String, Name of entity e.g., `climate.heating` | | `time_period` | no | Time Period, Period of time the boost should last for e.g., `01:30:00` | @@ -76,11 +74,11 @@ script: temperature: "20.5" ``` -### Service `hive.boost_heating_off` +### Action `hive.boost_heating_off` -You can use the service `hive.boost_heating_off` to turn your heating boost off. +You can use the `hive.boost_heating_off` action to turn your heating boost off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | | `entity_id` | no | String, Name of entity e.g., `climate.heating` | @@ -96,11 +94,11 @@ script: entity_id: "climate.heating" ``` -### Service `hive.boost_hot_water` +### Action `hive.boost_hot_water` -You can use the service `hive.boost_hot_water` to set your hot water to boost for a period of time. +You can use the `hive.boost_hot_water` action to set your hot water to boost for a period of time. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------- | | `entity_id` | no | String, Name of entity e.g., `water_heater.hot_water` | | `time_period` | yes | Time Period, Period of time the boost should last for e.g., `01:30:00`. | diff --git a/source/_integrations/home_connect.markdown b/source/_integrations/home_connect.markdown index 9bd0c1e78dfb..5f59a21f60e3 100644 --- a/source/_integrations/home_connect.markdown +++ b/source/_integrations/home_connect.markdown @@ -42,6 +42,7 @@ Note that it depends on the appliance and on API permissions which of the featur - Application ID: Home Assistant (or whatever name makes sense to you) - OAuth Flow: Authorization Code Grant Flow - Redirect URI: `https://my.home-assistant.io/redirect/oauth` +- Go to `https://my.home-assistant.io/` and make sure that your Home Assistant URL is set there. For example: `http://homeassistant:8123/` or `http://homeassistant.local:8123` *Important*: - **Power on** all your appliances during the integration configuration process; otherwise appliance programs list will be empty. @@ -67,54 +68,54 @@ Internal examples: `http://192.168.0.2:8123/auth/external/callback`, `http://hom The integration configuration will ask for the *Client ID* and *Client Secret* created above. See [Application Credentials](/integrations/application_credentials) for more details. -## Services +## Actions -The Home Connect integration makes various services available. -Available services: `set_option_active`, `set_option_selected`, `pause_program`, `resume_program`, `select_program`, `start_program` and `change_setting` +The Home Connect integration makes various actions available. +Available actions: `set_option_active`, `set_option_selected`, `pause_program`, `resume_program`, `select_program`, `start_program` and `change_setting` -### Service `home_connect.set_option_active` +### Action `home_connect.set_option_active` Sets an option for the active program. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| | `device_id` | no | Id of a device associated with the home appliance. | | `key` | no | Key of the option. | | `value` | no | Value of the option. | | `unit` | yes | Unit for the option. | -### Service `home_connect.set_option_selected` +### Action `home_connect.set_option_selected` Sets an option for the selected program. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| | `device_id` | no | Id of a device associated with the home appliance. | | `key` | no | Key of the option. | | `value` | no | Value of the option. | | `unit` | yes | Unit for the option. | -### Service `home_connect.pause_program` +### Action `home_connect.pause_program` Pauses the current running program. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| | `device_id` | no | Id of a device associated with the home appliance. | -### Service `home_connect.resume_program` +### Action `home_connect.resume_program` Resumes a paused program. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| | `device_id` | no | Id of a device associated with the home appliance. | -### Service `home_connect.select_program` +### Action `home_connect.select_program` Selects a program without starting it. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| | `device_id` | no | Id of a device associated with the home appliance. | | `program` | no | Program to select. | @@ -122,11 +123,11 @@ Selects a program without starting it. | `value` | yes | Value of the option. | | `unit` | yes | Unit for the option. | -### Service `home_connect.start_program` +### Action `home_connect.start_program` Selects a program and starts it. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| | `device_id` | no | Id of a device associated with the home appliance. | | `program` | no | Program to select. | @@ -134,11 +135,11 @@ Selects a program and starts it. | `value` | yes | Value of the option. | | `unit` | yes | Unit for the option. | -### Service `home_connect.change_setting` +### Action `home_connect.change_setting` Changes a setting. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|--------------------------------------------------| | `device_id` | no | Id of a device associated with the home appliance. | | `key` | no | Key of the setting. | diff --git a/source/_integrations/homeassistant.markdown b/source/_integrations/homeassistant.markdown index 0bbbd06d500a..240a7e4bd69e 100644 --- a/source/_integrations/homeassistant.markdown +++ b/source/_integrations/homeassistant.markdown @@ -18,7 +18,7 @@ related: - docs: /docs/configuration/customizing-devices/ --- -The **Home Assistant Core** {% term integration %} provides generic implementations like the generic `homeassistant.turn_on` service. +The **Home Assistant Core** {% term integration %} provides generic implementations like the generic `homeassistant.turn_on` action. ## Editing the General Settings in YAML @@ -211,11 +211,9 @@ For a list of the supported device classes, refer to the documentation of the pl ### Manual customization -<div class='note'> - +{% important %} If you implement `customize`, `customize_domain`, or `customize_glob` you must make sure it is done inside of `homeassistant:` or it will fail. - -</div> +{% endimportant %} ```yaml homeassistant: @@ -253,60 +251,60 @@ homeassistant: icon: mdi:other ``` -## Services +## Actions -The `homeassistant` integration provides services for controlling Home Assistant itself, as well as generic controls for any entity. +The `homeassistant` integration provides actions for controlling Home Assistant itself, as well as generic controls for any entity. -### Service `homeassistant.check_config` +### Action `homeassistant.check_config` Reads the configuration files and checks them for correctness, but **does not** load them into Home Assistant. Creates a persistent notification and log entry if errors are found. -### Service `homeassistant.reload_all` +### Action `homeassistant.reload_all` Reload all YAML configuration that can be reloaded without restarting Home Assistant. -It calls the `reload` service on all domains that have it available. Additionally, +It calls the `reload` action on all domains that have it available. Additionally, it reloads the core configuration (equivalent to calling `homeassistant.reload_core_config`), themes (`frontend.reload_themes`), and custom Jinja (`homeassistant.reload_custom_templates`). Prior to reloading, a basic configuration check is performed. If that fails, the reload will not be performed and will raise an error. -### Service `homeassistant.reload_custom_templates` +### Action `homeassistant.reload_custom_templates` Reload all Jinja templates in the `config/custom_templates` directory. Changes to these templates will take effect the next time an importing template is rendered. -### Service `homeassistant.reload_config_entry` +### Action `homeassistant.reload_config_entry` Reloads an integration config entry. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------------- | | `entity_id` | List of entity ids used to reference a config entry. | | `area_id` | List of area ids used to reference a config entry. | | `device_id` | List of device ids used to reference a config entry. | | `entry_id` | A single config entry id used to reference a config entry. | -### Service `homeassistant.reload_core_config` +### Action `homeassistant.reload_core_config` Reloads the core configuration under `homeassistant:` and all linked files. Once loaded the new configuration is applied. New `customize:` information will be applied the next time the state of the entity gets updated. -### Service `homeassistant.restart` +### Action `homeassistant.restart` Restarts the Home Assistant instance (also reloading the configuration on start). This will also do a configuration check before doing a restart. If the configuration check fails then Home Assistant will not be restarted, instead a persistent notification with the ID `persistent_notification.homeassistant_check_config` will be created. The logs will show details on what failed the configuration check. -### Service `homeassistant.stop` +### Action `homeassistant.stop` Stops the Home Assistant instance. Home Assistant must be restarted from the Host device to run again. -### Service `homeassistant.set_location` +### Action `homeassistant.set_location` Update the location of the Home Assistant default zone (usually "Home"). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------- | | `latitude` | no | Latitude of your location. | | `longitude` | no | Longitude of your location. | @@ -323,14 +321,14 @@ action: elevation: 120 ``` -### Service `homeassistant.toggle` +### Action `homeassistant.toggle` -Generic service to toggle devices on/off. Same usage as the -`light.toggle`, `switch.toggle`, etc. services. The difference with this -service compared the others, is that is can be used to mix different domains, -for example, a light and a switch can be toggled in a single service call. +Generic action to toggle devices on/off. Same usage as the +`light.toggle`, `switch.toggle`, etc. actions. The difference with this +action compared the others, is that is can be used to mix different domains, +for example, a light and a switch can be toggled in a single action. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------- | | `entity_id` | yes | The entity_id of the device to toggle on/off. | @@ -345,14 +343,14 @@ action: - switch.tv ``` -### Service `homeassistant.turn_on` +### Action `homeassistant.turn_on` -Generic service to toggle devices on. Same usage as the -`light.turn_on`, `switch.turn_on`, etc. services. The difference with this -service compared the others, is that is can be used to mix different domains, -for example, a light and a switch can be turned on in a single service call. +Generic action to toggle devices on. Same usage as the +`light.turn_on`, `switch.turn_on`, etc. actions. The difference with this +action compared the others, is that is can be used to mix different domains, +for example, a light and a switch can be turned on in a single action. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------- | | `entity_id` | yes | The entity_id of the device to turn on. | @@ -367,14 +365,14 @@ action: - switch.tv ``` -### Service `homeassistant.turn_off` +### Action `homeassistant.turn_off` -Generic service to toggle devices off. Same usage as the -`light.turn_off`, `switch.turn_off`, etc. services. The difference with this -service compared the others, is that is can be used to mix different domains, -for example, a light and a switch can be turned off in a single service call. +Generic action to toggle devices off. Same usage as the +`light.turn_off`, `switch.turn_off`, etc. actions. The difference with this +action compared the others, is that is can be used to mix different domains, +for example, a light and a switch can be turned off in a single action. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------- | | `entity_id` | yes | The entity_id of the device to turn off. | @@ -389,11 +387,11 @@ action: - switch.tv ``` -### Service `homeassistant.update_entity` +### Action `homeassistant.update_entity` Force one or more entities to update its data rather than wait for the next scheduled update. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------- | | `entity_id` | no | One or multiple entity_ids to update. It can be a list. | @@ -408,7 +406,7 @@ action: - switch.coffe_pot ``` -### Service `homeassistant.save_persistent_states` +### Action `homeassistant.save_persistent_states` Save the persistent states (for entities derived from RestoreEntity) immediately. Maintain the normal periodic saving interval. diff --git a/source/_integrations/homekit.markdown b/source/_integrations/homekit.markdown index 4d090c329950..4b3e75e8a4fd 100644 --- a/source/_integrations/homekit.markdown +++ b/source/_integrations/homekit.markdown @@ -23,13 +23,11 @@ Please make sure that you have read the [considerations](#considerations) listed some trouble later. However, if you do encounter issues, check out the [troubleshooting](#troubleshooting) section. -<div class="note"> - - If you want to control HomeKit-only devices with Home Assistant, - check out the [HomeKit Device](/integrations/homekit_controller/) integration, - which provides the possibility to pull HomeKit-enabled devices into Home Assistant. - -</div> +{% tip %} +If you want to control HomeKit-only devices with Home Assistant, +check out the [HomeKit Device](/integrations/homekit_controller/) integration, +which provides the possibility to pull HomeKit-enabled devices into Home Assistant. +{% endtip %} {% include integrations/config_flow.md %} @@ -162,7 +160,7 @@ homekit: required: false type: string linked_doorbell_sensor: - description: The `entity_id` of a `binary_sensor` entity to use as the doorbell sensor of the camera accessory to enable doorbell notifications. + description: The `entity_id` of a `binary_sensor` or `event` entity to use as the doorbell sensor of the camera accessory to enable doorbell notifications. required: false type: string linked_humidity_sensor: @@ -170,7 +168,7 @@ homekit: required: false type: string linked_motion_sensor: - description: The `entity_id` of a `binary_sensor` entity to use as the motion sensor of the camera accessory to enable motion notifications. + description: The `entity_id` of a `binary_sensor` or `event` entity to use as the motion sensor of the camera accessory to enable motion notifications. required: false type: string linked_obstruction_sensor: @@ -274,7 +272,7 @@ homekit: default: libopus available options: copy, libopus co_threshold: - description: Only for `sensor` entities with `device_class` `carbon_monoxide` or `co` in `entity_id`. Used as the threshold value once HomeKit will warn/notify the user. + description: Only for `sensor` entities with `device_class` `carbon_monoxide`. Used as the threshold value once HomeKit will warn/notify the user. required: false type: integer default: 25 @@ -332,7 +330,7 @@ The HomeKit Accessory Protocol Specification only allows a maximum of 150 unique ### Multiple HomeKit instances -If you create a HomeKit integration via the UI (i.e., **Settings** > **Devices & Services**), it must be configured via the UI **only**. While the UI only offers limited configuration options at the moment, any attempt to configure a HomeKit instance created in the UI via the {% term "`configuration.yaml`" %} file will result in another instance of HomeKit running on a different port. +If you create a HomeKit integration via the UI (i.e., **Settings** > **Devices & services**), it must be configured via the UI **only**. While the UI currently offers limited configuration options, any attempt to configure a HomeKit instance created in the UI via the {% term "`configuration.yaml`" %} file will result in another instance of HomeKit running on a different port. It is recommended to only edit a HomeKit instance in the UI that was created in the UI, and likewise, only edit a HomeKit instance in YAML that was created in YAML. @@ -342,7 +340,7 @@ When exposing a Camera, Activity based remote (a `remote` that supports activiti To quickly add all accessory mode entities in the UI: -1. Create a new bridge via the UI (i.e., **{% my config_flow_start title="Settings > Devices & Services" domain=page.ha_domain %}**). +1. Create a new bridge via the UI (i.e., **{% my config_flow_start title="Settings > Devices & services" domain=page.ha_domain %}**). 2. Select `media_player`, `remote`, `lock`, and `camera` domains. 3. Complete the flow as normal. 4. Additional HomeKit entries for each entity that must operate in accessory mode will be created for each entity that does not already have one. @@ -351,7 +349,7 @@ To quickly add all accessory mode entities in the UI: To add a single entity in accessory mode: -1. Create a new bridge via the UI (i.e., **{% my config_flow_start title="Settings > Devices & Services" domain=page.ha_domain %}**) +1. Create a new bridge via the UI (i.e., **{% my config_flow_start title="Settings > Devices & services" domain=page.ha_domain %}**) 2. Before pairing the bridge, access the options for the bridge. 3. Change the mode to `accessory` 4. Select the entity. @@ -430,16 +428,17 @@ The following integrations are currently supported: | sensor | TemperatureSensor | All sensors that have `°C` or `°F` as their `unit_of_measurement` and `temperature` as their `device_class`. | | sensor | HumiditySensor | All sensors that have `%` as their `unit_of_measurement` and `humidity` as their `device_class`. | | sensor | AirQualitySensor | All sensors that have `gas`/`pm10`/`pm25` as part of their `entity_id` or `gas`/`pm10`/`pm25`/`nitrogen_dioxide`/`volatile_organic_compounds` as their `device_class`. The VOC mappings use the IAQ guidelines for Europe released by the WHO (World Health Organization). | -| sensor | CarbonMonoxideSensor | All sensors that have `co` as their `device_class` | -| sensor | CarbonDioxideSensor | All sensors that have `co2` as part of their `entity_id` or `co2` as their `device_class` | +| sensor | CarbonMonoxideSensor | All sensors that have `carbon_monoxide` as their `device_class` | +| sensor | CarbonDioxideSensor | All sensors that have `co2` as part of their `entity_id` or `carbon_dioxide` as their `device_class` | | sensor | LightSensor | All sensors that have `lm` or `lx` as their `unit_of_measurement` or `illuminance` as their `device_class` | | switch | Switch | Represented as a switch by default but can be changed by using `type` within `entity_config`. | | water_heater | WaterHeater | All `water_heater` devices. | | device_automation | DeviceTriggerAccessory | All devices that support triggers. | +| valve | Valve | All `valve` devices. | # Device triggers -Devices that support triggers can be added to the bridge by accessing options for the bridge in **{% my integrations title="Settings > Devices & Services" %}**. To use this feature, Advanced Mode must be enabled in your user profile. +Devices that support triggers can be added to the bridge by accessing options for the bridge in **{% my integrations title="Settings > Devices & services" %}**. To use this feature, Advanced Mode must be enabled in your user profile. Bridged device triggers are represented as a single press button on stateless programmable switches. This allows a HomeKit automation to run when a device trigger fires. Because the Apple Home app currently only shows the number of the button and not the name, users may find it easier to identify the name of the button in the `Eve for HomeKit` app. @@ -448,7 +447,7 @@ Bridged device triggers are represented as a single press button on stateless pr Entities exposed as `TelevisionMediaPlayer` and `ReceiverMediaPlayer` are controllable within the Apple Remote widget in Control Center. Play, pause, volume up and volume down should work out of the box depending on the `supported_features` of the entity. However, if your television can be controlled in other ways outside of the `media_player` entity, (e.g., -service calls to an IR blaster), it is possible to build an automation to take advantage of these events. +performing actions to an IR blaster), it is possible to build an automation to take advantage of these events. When a key is pressed within the Control Center Remote widget, the event `homekit_tv_remote_key_pressed` will be fired. The key name will be available in the event data in the `key_name` field. Example: @@ -641,7 +640,7 @@ Ensure that the [`ffmpeg`](/integrations/ffmpeg) integration is configured corre #### Camera streaming is unstable or slow -If your camera supports native H.264 streams, Home Assistant can avoid converting the video stream, which is an expensive operation. To enable native H.264 streaming when configured via YAML, change the `video_codec` to `copy`. To allow native H.264 streaming when setting up HomeKit via the UI, go to **Settings** > **Devices & Services** in the UI, click **Options** for your HomeKit Bridge, and check the box for your camera on the `Cameras that support native H.264 streams` screen. +If your camera supports native H.264 streams, Home Assistant can avoid converting the video stream, which is an expensive operation. To enable native H.264 streaming when configured via YAML, change the `video_codec` to `copy`. To allow native H.264 streaming when setting up HomeKit via the UI, go to **Settings** > **Devices & services** in the UI, click **Options** for your HomeKit Bridge, and check the box for your camera on the `Cameras that support native H.264 streams` screen. #### Multiple camera streams @@ -665,7 +664,7 @@ HomeKit camera snapshots tie up the HomeKit connection during snapshots. To avoi #### Resetting accessories -You may use the service `homekit.reset_accessory` with one or more entity IDs to reset accessories whose configuration may have changed. This can be useful when changing a media player's device class to `tv`, linking a battery, or whenever Home Assistant adds support for new HomeKit features to existing entities. +You may use the `homekit.reset_accessory` action with one or more entity IDs to reset accessories whose configuration may have changed. This can be useful when changing a media player's device class to `tv`, linking a battery, or whenever Home Assistant adds support for new HomeKit features to existing entities. On earlier versions of Home Assistant, you can reset accessories by removing the entity from HomeKit (via [filter](#configure-filter)) and then re-adding the accessory. @@ -673,6 +672,18 @@ With either strategy, the accessory will behave as if it's the first time the ac #### Unpairing and Re-pairing -The HomeKit integration remembers a public key for each paired device. Occasionally the public key for a device pairing will be missing because of pairing failures. Suppose one or more devices show the accessory as unavailable. In that case, it may be necessary to unpair and re-pair the device to ensure the integration has the public key for each paired client. The `homekit.unpair` service will forcefully remove all pairings and allow re-pairing with the accessory. When setting up HomeKit from the UI, this avoids the sometimes time-consuming process of deleting and create a new instance. +The HomeKit integration remembers a public key for each paired device. Occasionally, the public key for a device pairing will be missing because of pairing failures. Suppose one or more devices show the accessory as unavailable. In that case, it may be necessary to unpair and re-pair the device to ensure the integration has the public key for each paired client. The `homekit.unpair` action will forcefully remove all pairings and allow re-pairing with the accessory. When setting up HomeKit from the UI, this avoids the sometimes time-consuming process of deleting and create a new instance. The accessory will behave as if it's the first time the accessory has been set up, so you will need to restore the name, group, room, scene, and/or automation settings. + +#### Air Quality Sensor Entities + +HomeKit provides five values to represent air quality: Excellent, Good, Fair, Inferior, and Poor. For PM2.5 sensor entities in Home Assistant, the raw density value (µg/m3) is used to determine the corresponding value based on the [2024 US AQI](https://www.epa.gov/system/files/documents/2024-02/pm-naaqs-air-quality-index-fact-sheet.pdf) standard. The mapping is as follows: + +| HomeKit | US AQI | PM2.5 µg/m³ | +|-----------|------------------------------------------|---------------| +| Excellent | Good (0-50) | 0.0 to 9.0 | +| Good | Moderate (51-100) | 9.1 to 35.4 | +| Fair | Unhealthy for Sensitive Groups (101-150) | 35.5 to 55.4 | +| Inferior | Unhealthy (151-200) | 55.5 to 125.4 | +| Poor | Very Unhealthy (201+) | 125.5+ | diff --git a/source/_integrations/homekit_controller.markdown b/source/_integrations/homekit_controller.markdown index 958bf36cbb51..bfa3611f5ba0 100644 --- a/source/_integrations/homekit_controller.markdown +++ b/source/_integrations/homekit_controller.markdown @@ -79,7 +79,7 @@ The HomeKit Device integration automatically detects HomeKit [compatible devices ### To add a HomeKit device via Ethernet or Wi-Fi -1. The device should have been discovered under **{% my integrations title="Settings > Devices & Services" %}**. +1. The device should have been discovered under **{% my integrations title="Settings > Devices & services" %}**. 2. On the HomeKit Device integration, select **Configure**. ![HomeKit integration](/images/integrations/homekit_controller/homekit_controller_add_01.png) @@ -105,7 +105,7 @@ You can add a HomeKit [compatible device](#supported-devices) to Home Assistant ### To add a HomeKit device through Bluetooth 1. Power up your HomeKit device. - - If you have Bluetooth enabled, the device should be discovered under **{% my integrations title="Settings > Devices & Services" %}**. + - If you have Bluetooth enabled, the device should be discovered under **{% my integrations title="Settings > Devices & services" %}**. 2. On the HomeKit Bridge integration, select **Configure**. ![HomeKit integration](/images/integrations/homekit_controller/homekit_controller_add_01.png) @@ -174,7 +174,7 @@ This section describes how to add a HomeKit [compatible device](#supported-devic - This leaves the {% term Thread %} network details on the HomeKit device. - The device will be automatically discovered by the HomeKit controller integration in Home Assistant. - It will appear as a discovered device over {% term Thread %}. -2. Under **{% my integrations title="Settings > Devices & Services" %}**, on the HomeKit integration, select **Configure**. +2. Under **{% my integrations title="Settings > Devices & services" %}**, on the HomeKit integration, select **Configure**. ![HomeKit integration](/images/integrations/homekit_controller/homekit_controller_add_01.png) @@ -205,11 +205,9 @@ There is currently support for the following device types (also called *domains* - Humidifier (HomeKit humidifiers and dehumidifiers) - Automation triggers (HomeKit 'stateless' accessories like buttons, remotes and doorbells) -<div class='note'> - - If your device is not on this list then you may still be able to pair it, and it will be visible in the Device Registry. But Home Assistant may not create entities for it. - -</div> +{% note %} +If your device is not on this list then you may still be able to pair it, and it will be visible in the Device Registry. But Home Assistant may not create entities for it. +{% endnote %} The integration will enable push updates. Devices that connect through Wi-Fi or Ethernet may fall back to only polling if the connection is unstable. diff --git a/source/_integrations/homematic.markdown b/source/_integrations/homematic.markdown index 2a67d9a7be6f..a76bcdf441c6 100644 --- a/source/_integrations/homematic.markdown +++ b/source/_integrations/homematic.markdown @@ -47,11 +47,9 @@ There is currently support for the following device types within Home Assistant: Device support is available for most of the wired and wireless devices, as well as a lot of IP devices. If you have a setup with mixed protocols, you have to configure additional [interfaces](/integrations/homematic#interfaces) with the appropriate ports. The default is using port 2001, which are wireless devices. Wired devices usually are available through port 2000 and IP devices through port 2010. The virtual thermostatgroups the CCU provides use port 9292 **and** require you to set the `path` setting to `/groups`. When using SSL on a CCU3, by default the same ports as usual with a prepended 4 are available. So 2001 becomes 42001, 2010 becomes 42010 etc.. -<div class='note info'> - +{% important %} Since CCU Version 3, the internal firewalls are enabled by default. You have to grant full access for the `XML-RPC API` or specify the IP-address of the Home Assistant instance and allowlist it, inside the CCU's security settings. - -</div> +{% endimportant %} If you want to see if a specific device you have is supported, head over to the [pyhomematic](https://github.com/danielperna84/pyhomematic/tree/master/pyhomematic/devicetypes) repository and browse through the source code. A dictionary with the device identifiers (e.g., HM-Sec-SC-2) can be found within the relevant modules near the bottom. If your device is not supported, feel free to contribute. @@ -213,7 +211,7 @@ Resolving names can take some time. So when you start Home Assistant you won't s ### Multiple hosts In order to allow communication with multiple hosts or different protocols in parallel (wireless, wired and IP), multiple connections will be established, each to the configured destination. The name you choose for the host has to be unique and limited to ASCII letters. -Using multiple hosts has the drawback, that the services (explained below) may not work as expected. Only one connection can be used for services, which limits the devices/variables a service can use to the scope/protocol of the host. +Using multiple hosts has the drawback, that the actions (explained below) may not work as expected. Only one connection can be used for actions, which limits the devices/variables an action can use to the scope/protocol of the host. This does *not* affect the entities in Home Assistant. They all use their own connection and work as expected. ### Reading attributes of entities @@ -294,7 +292,7 @@ To get the `homematic.keypress` event for some Homematic IP devices like WRC2 / 8. When your channel is working now, you can edit it to select the other channels one by one 9. At the end, you can delete this program from the CCU -### Services +### Actions - *homematic.virtualkey*: Simulate a keypress (or other valid action) on CCU/Homegear with device or virtual keys. - *homematic.reconnect*: Reconnect to CCU/Homegear without restarting Home Assistant (useful when CCU has been restarted) @@ -344,7 +342,7 @@ action: #### Advanced examples If you are familiar with the internals of Homematic devices, you can manually set values on the devices. This can serve as a workaround if support for a device is currently not available, or only limited functionality has been implemented. -Using this service provides you direct access to the setValue-method of the primary connection. If you have multiple hosts, you may select the one hosting a specific device by providing the proxy-parameter with a value equivalent to the name you have chosen. In the example configuration from above `rf`, `wired` and `ip` would be valid values. +Using this action provides you direct access to the setValue-method of the primary connection. If you have multiple hosts, you may select the one hosting a specific device by providing the proxy-parameter with a value equivalent to the name you have chosen. In the example configuration from above, `rf`, `wired`, and `ip` would be valid values. Manually turn on a switch actor: @@ -587,7 +585,7 @@ value: ### Usage -`homematic` is a notify platform and can be controlled by calling the notify service [as described here](/integrations/notify/). +`homematic` is a notify platform and can be controlled by calling the notify action [as described here](/integrations/notify/). Only the `data` part of the event payload is processed. This part can specify or override the value given as configuration variable: @@ -645,4 +643,4 @@ alert: {% endraw %} -Please note that the first `data` element belongs to the service `my_hm`, while the second one belongs to the event payload. +Please note that the first `data` element belongs to the `my_hm` action, while the second one belongs to the event payload. diff --git a/source/_integrations/homematicip_cloud.markdown b/source/_integrations/homematicip_cloud.markdown index 2c454d0df5bf..6baf8039f121 100644 --- a/source/_integrations/homematicip_cloud.markdown +++ b/source/_integrations/homematicip_cloud.markdown @@ -203,14 +203,14 @@ Within this delay the device registration should be completed in the App, otherw In order for a device to be integrated into Home Assistant, it must first be implemented in the upstream library. A dump of your configuration is required for this, which is then attached to a new issue in the [upstream lib's](https://github.com/hahn-th/homematicip-rest-api) GitHub repository. 1. Create a dump of your access point configuration in Home Assistant: - Developer Tools -> Services -> Select `homematicip_cloud.dump_hap_config` -> Execute. + **Developer Tools** -> **Actions** -> Select `homematicip_cloud.dump_hap_config` -> Execute. The default dump is anonymized and is written to your configuration directory (`hmip_config_XXXX.json`). 2. Create a [new issue](https://github.com/hahn-th/homematicip-rest-api/issues/new) at this GitHub repository and attach the created dump file. Please be patient, wait for the implementation and a new release of the upstream library. Afterward, this device can be implemented into Home Assistant. -## Services +## Actions Executable by all users: - `homematicip_cloud.activate_eco_mode_with_duration`: Activate eco mode with duration. @@ -224,9 +224,9 @@ Executable by administrators or within the context of an automation: - `homematicip_cloud.dump_hap_config`: Dump the configuration of the Homematic IP Access Point(s). - `homematicip_cloud.reset_energy_counter`: Reset energy counter of measuring actuators. -### Service examples +### Action examples -`accesspoint_id` (SGTIN) is optional for all services and only relevant if you have multiple Homematic IP Accesspoints connected to HA. If empty, service will be called for all configured Homematic IP Access Points. +`accesspoint_id` (SGTIN) is optional for all actions and only relevant if you have multiple Homematic IP Accesspoints connected to HA. If empty, the action will be performed for all configured Homematic IP Access Points. The `accesspoint_id` (SGTIN) can be found on top of the integration page, or on the back of your Homematic IP Accesspoint. Activate eco mode with duration. diff --git a/source/_integrations/homewizard.markdown b/source/_integrations/homewizard.markdown index 9bda71324123..eb439da0501b 100644 --- a/source/_integrations/homewizard.markdown +++ b/source/_integrations/homewizard.markdown @@ -31,11 +31,9 @@ Integration for the [HomeWizard Energy](https://www.homewizard.com) platform. It - [Wi-Fi Watermeter](https://www.homewizard.com/watermeter): Sensors for active and total water usage (model: `HWE-WTR`) - [Wi-Fi kWh Meter](https://www.homewizard.com/kwh-meter): Sensors for power import/export and energy consumption. (Models: `HWE-KWH1`, `HWE-KWH3`, `SDM230-wifi`, and `SDM630-wifi`) -<div class='note'> - +{% note %} The Watermeter can be powered via a USB-C cable and with batteries. When using batteries they only connect to Wi-Fi every couple of hours. Because of this, the API can only be used when powered via the USB-C cable. It is not possible to use this integration when the water meter is powered by batteries. - -</div> +{% endnote %} ## Enable the API diff --git a/source/_integrations/homeworks.markdown b/source/_integrations/homeworks.markdown index 37412df31690..19ae794dda88 100644 --- a/source/_integrations/homeworks.markdown +++ b/source/_integrations/homeworks.markdown @@ -29,13 +29,13 @@ Homeworks keypad buttons are momentary switches. The button is pressed and rele The protocol for automatically extracting device information from the controller isn't documented. Lights and keypads need to be added manually. This is done by configuring the integration after it has been added. -## Services +## Actions -### Service `send_command` +### Action `send_command` Send a custom command to the Lutron Homeworks controller. -| Service data attribute | Optional | Example | Description | +| Data attribute | Optional | Example | Description | | ---------------------- | -------- | ----------------------- | --------------------------------------------------- | | `controller_id` | No | `homeworks` | The controller to which the command should be sent to. | | `command` | No | `KBP, [02:08:02:01], 1` | The command you want to send. This can either be a single command or a list of commands. In addition to the [commands supported by the controller](https://assets.lutron.com/a/documents/hwi%20rs232%20protocol.pdf), the special command `DELAY <ms>` is supported, where ms is the number of milliseconds to sleep. | diff --git a/source/_integrations/honeywell.markdown b/source/_integrations/honeywell.markdown index 6bf566d6c74f..97ba49a06e34 100644 --- a/source/_integrations/honeywell.markdown +++ b/source/_integrations/honeywell.markdown @@ -48,9 +48,9 @@ Other devices like Security systems are not currently supported by this integrat The climate platform integrates Honeywell US-based thermostats into Home Assistant, allowing control of the thermostat through the user interface. The current inside temperature, operating mode, and fan state are also displayed on the thermostat card. -All [climate services](/integrations/climate) are supported except set_swing_mode. +All [climate actions](/integrations/climate) are supported except set_swing_mode. -Due to the instability of the Honeywell total connect system, service calls within automations should repeat until success similar to the following example: +Due to the instability of the Honeywell total connect system, actions within automations should repeat until success similar to the following example: ```yaml alias: "No one home" diff --git a/source/_integrations/hp_ilo.markdown b/source/_integrations/hp_ilo.markdown index 90c443a01bab..1dc830465ffb 100644 --- a/source/_integrations/hp_ilo.markdown +++ b/source/_integrations/hp_ilo.markdown @@ -130,9 +130,9 @@ sensor: ## Hardware specifics -<div class='note warning'> +{% note %} Not every hardware supports all values. -</div> +{% endnote %} ### HP Microserver Gen8 diff --git a/source/_integrations/html5.markdown b/source/_integrations/html5.markdown index 65c933054100..ee5d31436b5a 100644 --- a/source/_integrations/html5.markdown +++ b/source/_integrations/html5.markdown @@ -16,11 +16,9 @@ related: The `html5` notification {% term integration %} enables you to receive push notifications to Chrome or Firefox, no matter where you are in the world. `html5` also supports Chrome and Firefox on Android, which enables native-app-like integrations without actually needing a native app. -<div class='note'> - +{% important %} HTML5 push notifications **do not** work on iOS versions below 16.4. - -</div> +{% endimportant %} ## Configuration @@ -91,9 +89,9 @@ Assuming the previous test completed successfully and your browser was registere {% my developer_services badge %} -1. Click on the My button above, or open Home Assistant in Chrome or Firefox, open the sidebar and click the Services button at the bottom (shaped like a remote control), located below the Developer Tools. -2. From the Services dropdown, search for your HTML5 notify service (notify.html5) and select it. -3. In the Service Data text box enter: `{"message":"hello world"}`, then press the CALL SERVICE button. +1. Click on the My button above. +2. From the **Actions** dropdown, search for your HTML5 notify action (`notify.html5`) and select it. +3. In the data text box enter: `{"message":"hello world"}`, then select the **Perform action** button. 4. If everything worked you should see a popup notification. ### Usage @@ -210,7 +208,7 @@ data: ### Dismiss -You can dismiss notifications by using service html5.dismiss like so: +You can dismiss notifications by using `html5.dismiss` action like so: ```yaml target: ['my phone'] diff --git a/source/_integrations/http.markdown b/source/_integrations/http.markdown index 485a88723938..081b33353805 100644 --- a/source/_integrations/http.markdown +++ b/source/_integrations/http.markdown @@ -19,11 +19,9 @@ There is currently support for the following device types within Home Assistant: - [Binary sensor](#binary-sensor) - [Sensor](#sensor) -<div class='note'> - +{% warning %} The option `server_host` should only be used on a Home Assistant Core installation! - -</div> +{% endwarning %} ```yaml # Example configuration.yaml entry @@ -86,11 +84,6 @@ ssl_profile: required: false type: string default: modern -strict_connection: - description: Specifies the strict connection mode. Please read the section ["Strict connection mode"](#strict-connection-mode) before changing this value. Can be one of `disabled`, `guard_page` or `drop_connection`. - required: false - type: string - default: disabled {% endconfiguration %} The sample below shows a configuration entry with possible values: @@ -155,17 +148,13 @@ After a ban is added a Persistent Notification is populated to the Home Assistan If you want to use Home Assistant to host or serve static files then create a directory called `www` under the configuration path (`/config`). The static files in `www/` can be accessed by the following URL `http://your.domain:8123/local/`, for example `audio.mp3` would be accessed as `http://your.domain:8123/local/audio.mp3`. -<div class='note'> - - If you've had to create the `www/` folder for the first time, you'll need to restart Home Assistant. - -</div> - -<div class='note warning'> - - Files served from the `www` folder (`/local/` URL), aren't protected by the Home Assistant authentication. Files stored in this folder, if the URL is known, can be accessed by anybody without authentication. +{% important %} +If you've had to create the `www/` folder for the first time, you'll need to restart Home Assistant. +{% endimportant %} -</div> +{% caution %} +Files served from the `www` folder (`/local/` URL), aren't protected by the Home Assistant authentication. Files stored in this folder, if the URL is known, can be accessed by anybody without authentication. +{% endcaution %} ## Binary sensor @@ -179,9 +168,9 @@ The URL for a binary sensor looks like the example below: http://IP_ADDRESS:8123/api/states/binary_sensor.DEVICE_NAME ``` -<div class='note'> +{% important %} You should choose a unique device name (DEVICE_NAME) to avoid clashes with other devices. -</div> +{% endimportant %} The JSON payload must contain the new state and can have a friendly name. The friendly name is used in the frontend to name the sensor. @@ -264,9 +253,9 @@ The URL for a sensor looks like the example below: http://IP_ADDRESS:8123/api/states/sensor.DEVICE_NAME ``` -<div class='note'> +{% important %} You should choose a unique device name (DEVICE_NAME) to avoid clashes with other devices. -</div> +{% endimportant %} The JSON payload must contain the new state and should include the unit of measurement and a friendly name. The friendly name is used in the frontend to name the sensor. diff --git a/source/_integrations/huawei_lte.markdown b/source/_integrations/huawei_lte.markdown index bfc0e5e289fe..97650508c103 100644 --- a/source/_integrations/huawei_lte.markdown +++ b/source/_integrations/huawei_lte.markdown @@ -78,25 +78,25 @@ entities varies by device model and firmware version. Unauthenticated mode and default list of notification recipient phone numbers can be set using the integration's configuration options. -## Services +## Actions -The following router action services are available. When invoked by a user, administrator access is required. +The following router action actions are available. When invoked by a user, administrator access is required. -### Service `huawei_lte.suspend_integration` +### Action `huawei_lte.suspend_integration` Suspend integration. Suspending logs the integration out from the router, and stops accessing it. Useful e.g., if accessing the router web interface from another source such as a web browser is temporarily required. -Invoke the `huawei_lte.resume_integration` service to resume. +Invoke the `huawei_lte.resume_integration` action to resume. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `url` | yes, if only one router configured | Router URL. | -### Service `huawei_lte.resume_integration` +### Action `huawei_lte.resume_integration` Resume suspended integration. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `url` | yes, if only one router configured | Router URL. | diff --git a/source/_integrations/hue.markdown b/source/_integrations/hue.markdown index f115aab7b048..0e7f0d2f8514 100644 --- a/source/_integrations/hue.markdown +++ b/source/_integrations/hue.markdown @@ -49,11 +49,11 @@ In the Hue concept you can create (dynamic) scenes for the lights within rooms a It is advised to use Hue scenes for controlling multiple lights at once for a smooth experience. If you individually control multiple lights and/or use Home Assistant scenes, each light command will be sent to each light one by one which doesn't give a very good user experience, while using a Hue scene sends commands to all lights at once in an optimized way, resulting in a smooth experience. -### Service `hue.activate_scene` +### Action `hue.activate_scene` -To have more control over Hue scenes we've implemented a secondary, more advanced service to activate a Hue scene and set some properties at the same time, such as the Dynamic mode and/or brightness. +To have more control over Hue scenes we've implemented a secondary, more advanced action to activate a Hue scene and set some properties at the same time, such as the Dynamic mode and/or brightness. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------- | | `entity_id` | yes | Entity ID of the Hue Scene entity you want to activate. | | `transition` | no | Transition duration (in seconds) it takes to bring devices to the state defined in the scene. | @@ -61,22 +61,20 @@ To have more control over Hue scenes we've implemented a secondary, more advance | `speed` | no | Set the speed (of the dynamic palette) for this scene. | | `brightness` | no | Set the brightness for this scene. | -You can use this service for example if you'd like to start/stop Dynamic Mode. +You can use this action for example if you'd like to start/stop Dynamic Mode. ## Hue remotes and switches Hue remotes such as the Dimmer Switch are stateless devices, meaning that they do not have a on/off state like regular entities in Home Assistant. Instead, such devices emit the event `hue_event` when a button is pressed. You can test what events come in using the event {% my developer_events title="developer tools in Home Assistant" %} and subscribe to the `hue_event`. Once you know what the event data looks like, you can use this to create automations. -<div class='note warning'> - +{% note %} At the time of writing, there's a limitation on the Hue API that each device can only send one event per second. This means that button events are rate-limited to 1 per second. This is brought to the attention of Signify and it will hopefully be fixed soon. - -</div> +{% endnote %} ## Support for legacy (V1) Hue bridges Philips/Signify released a new version of their Hue bridge (square shape) and their legacy/V1 bridge (round shape) is now end of life and no longer supported by them. Home Assistant will continue to support the V1 Hue bridge as long as it is technically possible, although with a few limitations: -- Scene entities are not automatically created for V1 bridges. To call a Hue scene on a V1 bridge from Home Assistant we provide a service call to call a Hue scene by name. +- Scene entities are not automatically created for V1 bridges. To activate a Hue scene on a V1 bridge from Home Assistant we provide an action to active it the Hue scene by name. - State updates for devices/entities on a V1 bridges are not received instantly but polled on interval. - Light entities for Hue rooms are not automatically created for V1 bridges, you can opt-in for creating entities for rooms within the Integration's options. diff --git a/source/_integrations/huisbaasje.markdown b/source/_integrations/huisbaasje.markdown index 57638fee2c2f..7235d0db1b3a 100644 --- a/source/_integrations/huisbaasje.markdown +++ b/source/_integrations/huisbaasje.markdown @@ -1,6 +1,6 @@ --- -title: Huisbaasje -description: Instructions on how to integrate Huisbaasje with Home Assistant. +title: EnergyFlip +description: Instructions on how to integrate EnergyFlip with Home Assistant. ha_category: - Energy - Sensor @@ -15,10 +15,11 @@ ha_platforms: ha_integration_type: integration --- -The Huisbaasje integrations allows you to track your energy consumption collected +The EnergyFlip (formerly Huisbaasje) integration allows you to track your energy consumption collected by the monitoring device installed on your energy meters. {% include integrations/config_flow.md %} + ## Sensors This integration provides the following sensors: diff --git a/source/_integrations/humidifier.markdown b/source/_integrations/humidifier.markdown index db5b2bf55678..6725025b91c5 100644 --- a/source/_integrations/humidifier.markdown +++ b/source/_integrations/humidifier.markdown @@ -37,23 +37,21 @@ The following device classes are supported for humidifiers: - **Humidifier**: Adds humidity to the air around it. - **Dehumidifier**: Removes humidity from the air around it. -## Services +## Actions -### Humidifier services +### Humidifier actions -Available services: `humidifier.set_mode`, `humidifier.set_humidity`, `humidifier.turn_on`, `humidifier.turn_off`, `humidifier.toggle` +Available actions: `humidifier.set_mode`, `humidifier.set_humidity`, `humidifier.turn_on`, `humidifier.turn_off`, `humidifier.toggle` -<div class='note'> +{% tip %} +Not all humidifier actions may be available for your platform. Be sure to check the available actions Home Assistant has enabled by checking the **Actions** page in the [Developer Tools](/docs/tools/dev-tools/). +{% endtip %} -Not all humidifier services may be available for your platform. Be sure to check the available services Home Assistant has enabled by checking the Services page in the [Developer Tools](/docs/tools/dev-tools/). +### Action `humidifier.set_mode` -</div> +Set mode for the humidifier device. This action is only available if the device supports operating in several working modes. The list of available modes and the device functionality in every mode depend on the device itself. -### Service `humidifier.set_mode` - -Set mode for the humidifier device. This service is only available if the device supports operating in several working modes. The list of available modes and the device functionality in every mode depend on the device itself. - -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of humidifier devices to control. | `mode` | no | New mode. @@ -73,11 +71,11 @@ automation: mode: "eco" ``` -### Service `humidifier.set_humidity` +### Action `humidifier.set_humidity` Set target humidity of the humidifier device -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of humidifier devices to control. | `humidity` | no | New target humidity for humidifier device @@ -97,26 +95,26 @@ automation: humidity: 60 ``` -### Service `humidifier.turn_on` +### Action `humidifier.turn_on` Turn the humidifier device on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of humidifier devices to control. -### Service `humidifier.turn_off` +### Action `humidifier.turn_off` Turn the humidifier device off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of humidifier devices to control. -### Service `humidifier.toggle` +### Action `humidifier.toggle` Toggle the humidifier device on/off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of humidifier devices to control. diff --git a/source/_integrations/humidifier.mqtt.markdown b/source/_integrations/humidifier.mqtt.markdown index c50b9e6f47de..078bb6319e49 100644 --- a/source/_integrations/humidifier.mqtt.markdown +++ b/source/_integrations/humidifier.mqtt.markdown @@ -286,11 +286,9 @@ unique_id: type: string {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/hunterdouglas_powerview.markdown b/source/_integrations/hunterdouglas_powerview.markdown index e39b7964af82..492fe0686f7b 100644 --- a/source/_integrations/hunterdouglas_powerview.markdown +++ b/source/_integrations/hunterdouglas_powerview.markdown @@ -53,11 +53,11 @@ Generation 1 and 2 Pebble remotes use proprietary Bluetooth Low Energy (PLE) and This will result in the shade positioning displayed within Home Assistant being incorrect. -<div class="note"> -Calling the update entity service (`homeassistant.update_entity`) on a shade entity will trigger the hub to awaken a shade and report its current position. +{% note %} +Calling the update entity action (`homeassistant.update_entity`) on a shade entity will trigger the hub to awaken a shade and report its current position. [An example automation is available](#force-update-shade-position) below for mains powered shades. While the automation will work for battery-powered shades, it will quickly drain the batteries for these devices. -</div> +{% endnote %} ### Generation 3 @@ -67,9 +67,9 @@ Generation 3 shades report position changes back to the hub automatically. They ## Shades -<div class="note"> +{% note %} Your shades may still make work even if not listed. If you encounter issues, please raise a feature request on the community forum. -</div> +{% endnote %} | Name (Type) | Capabilities | | :---------------------------------------- | :------------------------------ | @@ -181,9 +181,9 @@ Three different entities that will be created for each blind: Front, Rear and Co ### Calibrate -<div class="note"> +{% important %} Gen 1 and Gen 2 Only. -</div> +{% endimportant %} Initiate a calibration of the shade position. Calibration is a common requirement with Duette-type shades with a string drop that lowers and raises the blind and less so with roller types. ### Identify @@ -192,27 +192,30 @@ Identify will 'jog' the shade position as a diagnostic tool to ensure the shade ### Favorite -<div class="note"> +{% important %} Gen 1 and Gen 2 Only. -</div> +{% endimportant %} + Move the shade to the favorite position as programmed physically on the device. This will perform the same move as the heart on the pebble remote. ## Selection Entities ### Power Source -<div class="note"> +{% important %} Gen 1 and Gen 2 Only. -</div> +{% endimportant %} + Set the type for connected power source. Available options are Hardwired Power Supply, Battery Wand and Rechargeable Battery ## Number entities ### Velocity -<div class="note"> +{% important %} Gen 3 Only. -</div> +{% endimportant %} + Velocity controls the speed of the shade. The default speed from Hunter Douglas is 0; setting this higher will increase the speed of the shade. ## Example Automations diff --git a/source/_integrations/husqvarna_automower.markdown b/source/_integrations/husqvarna_automower.markdown index dcc25a568a21..5ed08f5996a6 100644 --- a/source/_integrations/husqvarna_automower.markdown +++ b/source/_integrations/husqvarna_automower.markdown @@ -86,6 +86,10 @@ The My Home Assistant redirect feature needs to be setup to redirect to your Hom {% include integrations/config_flow.md %} +## Troubleshooting + +If you have an error with your credentials, you can delete them on the [application credentials](/integrations/application_credentials/) page. + ## Entities Once you have enabled the Husqvarna Automower integration, you should see the following entities: @@ -153,10 +157,31 @@ The integration will create the following sensors: ### Switch +#### Avoid (if available) + +The integration will create a switch for each stay-out zone defined for your mower. When the switch is on, the mower avoids the corresponding zone. When the switch is off, the mower enters the corresponding zone. + #### Enable schedule The integration will create a switch to enable or disable the schedule of the mower. If the switch is on, the mower will mow according to the schedule. If the switch is off the mower will return to the dock and park until further notice. -#### Avoid (if available) +## Actions -The integration will create a switch for each stay-out zone defined for your mower. When the switch is on, the mower avoids the corresponding zone. When the switch is off, the mower enters the corresponding zone. +The integration offers the following actions: + +### Override schedule + +With this action, you can let your mower mow or park for a given time. You can select the override mode with the `override_mode´ attribute. This will override all your schedules during this time. The duration can be given in days, hours and/or minutes. The values for the duration have to be between 1 minute and 42 days. Seconds will be ignored. + +```yaml +# Replace <name> with the name of your mower. +service: husqvarna_automower.override_schedule +target: + entity_id: lawn_mower.<name> +data: + duration: + days: 1 + hours: 12 + minutes: 30 + override_mode: mow ### alternative: `park` +``` diff --git a/source/_integrations/huum.markdown b/source/_integrations/huum.markdown index 4f05569a0df2..aa61d470fe35 100644 --- a/source/_integrations/huum.markdown +++ b/source/_integrations/huum.markdown @@ -21,12 +21,10 @@ You’ll need your username (which is usually your email) and password to config The integration takes the same security measures regarding an open sauna door as the Huum app. If the sauna door is open, the sauna will not turn on. -<div class='note info'> - +{% note %} When the sauna is off, you must turn on the sauna after setting the temperature. This is as a security measure so that one does not turn on the sauna by mistake. - -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/hydrawise.markdown b/source/_integrations/hydrawise.markdown index f50726cd18df..8d1812f15267 100644 --- a/source/_integrations/hydrawise.markdown +++ b/source/_integrations/hydrawise.markdown @@ -6,17 +6,20 @@ ha_category: - Irrigation - Sensor - Switch + - Valve ha_config_flow: true ha_release: 0.71 ha_iot_class: Cloud Polling ha_domain: hydrawise ha_codeowners: - '@dknowles2' + - '@thomaskistler' - '@ptcryan' ha_platforms: - binary_sensor - sensor - switch + - valve ha_integration_type: integration --- @@ -27,6 +30,7 @@ There is currently support for the following device types within Home Assistant: - [Binary sensor](#binary-sensor) - [Sensor](#sensor) - [Switch](#switch) +- [Valve](#valve) ## Prerequisites @@ -42,9 +46,9 @@ Binary sensor entities are created for the controller: - Cloud API availability -<div class='note warning'> +{% note %} The Hydrawise API removed the ability to read the rain sensor status. Therefore it is no longer supported by the Hydrawise integration to Home Assistant. -</div> +{% endnote %} Binary sensor entities are created for each zone: @@ -70,6 +74,12 @@ When `auto_watering` is `on` the irrigation zone will follow the Smart Watering When `manual_watering` is `on` the zone will run for 15 minutes. -<div class='note warning'> +{% note %} Due to changes in the Hydrawise API the status of the Auto Watering switches has changed. Under normal conditions the Auto Watering switches correctly reflect the Smart Watering schedule on the Hydrawise mobile or web app. However, if a rain sensor is connected to the system and it is active (rain detected), or the zone is running the Auto Watering switch will turn off. After both of those conditions are removed the switch will again show the correct Auto Watering condition. -</div> +{% endnote %} + +## Valve + +A valve is added for each zone allowing manual control of zone watering. + +When a zone's valve is opened through Home Assistant, it will have an automatic shutoff time set to the zone's default watering duration configured in the Hydrawise [mobile or web app](https://www.hydrawise.com). diff --git a/source/_integrations/ialarm.markdown b/source/_integrations/ialarm.markdown index 1f5dca5f50c9..fea08e77f7c0 100644 --- a/source/_integrations/ialarm.markdown +++ b/source/_integrations/ialarm.markdown @@ -17,7 +17,7 @@ ha_integration_type: integration The iAlarm integration provides connectivity with the [Antifurto365](https://www.antifurtocasa365.it/) iAlarm alarm systems and has also been confirmed to work with the alarm system brands Meian and Emooluxr. Please note that the latest iAlarm-XR alarm system is not supported. -This platform supports the following services: +This platform supports the following actions: - `alarm_control_panel.alarm_arm_away` - `alarm_control_panel.alarm_arm_home` diff --git a/source/_integrations/ibeacon.markdown b/source/_integrations/ibeacon.markdown index 10a5879e6144..7c49d732e03b 100644 --- a/source/_integrations/ibeacon.markdown +++ b/source/_integrations/ibeacon.markdown @@ -78,6 +78,7 @@ To get the Estimated distance sensor to work, in most cases, it has to be calibr - [Blue SLIM ID](https://elainnovation.com/en/product/blue-slim-id-en/) - [Feasycom FSC-BP103B](https://www.feasycom.com/bluetooth-ibeacon-da14531) - [Feasycom FSC-BP104D](https://www.feasycom.com/dialog-da14531-bluetooth-low-energy-beacon) +- [Feasycom FSC-BP106](https://www.feasycom.com/fsc-bp106) - [Feasycom FSC-BP108](https://www.feasycom.com/bluetooth-5-1-waterproof-bluetooth-beacon) - [MikroTik TG-BT5-IN](https://mikrotik.com/product/tg_bt5_in) (Additional sensors such as angle or impact are not compatible) - [NRF51822 iBeacon](https://www.aliexpress.com/item/32826502025.html) diff --git a/source/_integrations/icloud.markdown b/source/_integrations/icloud.markdown index c21090c0f3b9..9818f608303e 100644 --- a/source/_integrations/icloud.markdown +++ b/source/_integrations/icloud.markdown @@ -28,11 +28,11 @@ It does require that your devices are registered with the [Find My](https://www. {% include integrations/config_flow.md %} -<div class='note warning'> +{% warning %} You may receive an email and a notification from Apple saying that someone has logged into your account. For the notification, press "Allow", then "OK". -</div> +{% endwarning %} To prevent excessive battery drainage, a dynamic interval is used for each individual device instead of a fixed interval for all devices linked to one account. The dynamic interval is based on the current zone of a device, the distance towards home and the battery level of the device. @@ -54,27 +54,27 @@ The iCloud integration will track available devices on your iCloud account. The iCloud integration will add a battery sensor for each iCloud devices available on your iCloud account. -## Services +## Actions -4 services are available: +4 actions are available: -### Service `icloud.update` +### Action `icloud.update` -This service can be used to ask an update of a certain iDevice or all devices linked to an iCloud account. Request will result in new Home Assistant [state_changed](/docs/configuration/events/#event-state_changed) event describing current iPhone location. It can be used in automations when a manual location update is needed, e.g., to check if anyone is home when a door has been opened. +This action can be used to ask an update of a certain iDevice or all devices linked to an iCloud account. Request will result in new Home Assistant [state_changed](/docs/configuration/events/#event-state_changed) event describing current iPhone location. It can be used in automations when a manual location update is needed, e.g., to check if anyone is home when a door has been opened. -### Service `icloud.play_sound` +### Action `icloud.play_sound` -This service will play the Lost iPhone sound on your iDevice. It will still ring if you are on "Mute" or "Do not disturb" mode. +This action will play the Lost iPhone sound on your iDevice. It will still ring if you are on "Mute" or "Do not disturb" mode. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------| | `account` | no | Email address of the iCloud account | | `device_name` | no | Human Friendly device name like Bob's iPhone | -### Service `icloud.display_message` +### Action `icloud.display_message` -This service will display a message on your iDevice. It can also ring your device. +This action will display a message on your iDevice. It can also ring your device. -### Service `icloud.lost_device` +### Action `icloud.lost_device` -This service will put your iDevice on "lost" mode (compatible devices only). You have to provide a phone number with a suffixed [country code](https://en.wikipedia.org/wiki/List_of_country_calling_codes) and a message. +This action will put your iDevice on "lost" mode (compatible devices only). You have to provide a phone number with a suffixed [country code](https://en.wikipedia.org/wiki/List_of_country_calling_codes) and a message. diff --git a/source/_integrations/idasen_desk.markdown b/source/_integrations/idasen_desk.markdown index 2e948d66857e..1df4b341e0f1 100644 --- a/source/_integrations/idasen_desk.markdown +++ b/source/_integrations/idasen_desk.markdown @@ -20,7 +20,7 @@ ha_codeowners: The IKEA IDÅSEN integration allows you to connect your IKEA Idåsen motorized desk to Home Assistant, making it possible to control the desk height and also monitor height changes from the physical controller. -<div class='note warning'> +{% tip %} The recommended way to connect the desk to Home Assistant is by using an [ESPHome Bluetooth Proxy](https://esphome.io/projects/?type=bluetooth), as they provide the best experience. @@ -28,15 +28,15 @@ If you are not using an ESPHome Bluetooth Proxy, you need to keep `bluetoothctl` Also, if not using an ESPHome Bluetooth Proxy, you may experience the desk becoming unavailable and needing re-pairing after a restart of Home Assistant or a reload of the integration. To pair it permanently, [access the host over SSH](https://developers.home-assistant.io/docs/operating-system/debugging/#ssh-access-to-the-host), pair the desk with `bluetoothctl pair <desk-BT-address>`, and validate it being listed by `bluetoothctl devices Paired`. If the desk is not listed as paired, repeat the command several times while entering pairing mode on the desk. -</div> +{% endtip %} {% include integrations/config_flow.md %} Home Assistant will display a list of addresses of the available desks, and you just need to select the one you want to add. Repeat the process to add more than one desk. -<div class='note'> +{% note %} If you see an "No unconfigured devices found" message, make sure that the desk is in Bluetooth pairing mode. For that, press the small button with the Bluetooth logo on the controller until it starts blinking (about 3 seconds). -</div> +{% endnote %} ## Connect/Disconnect buttons diff --git a/source/_integrations/ifttt.markdown b/source/_integrations/ifttt.markdown index 126e45d4c3d8..2b425b00371a 100644 --- a/source/_integrations/ifttt.markdown +++ b/source/_integrations/ifttt.markdown @@ -64,11 +64,11 @@ ifttt: `key` is your API key which can be obtained by viewing the **Settings** of the [Webhooks applet](https://ifttt.com/maker_webhooks/settings). It's the last part of the URL (e.g., https://maker.ifttt.com/use/MYAPIKEY) you will find under **My Applets** > **Webhooks** > **Settings**. ![Property screen of the Maker Channel.](/images/integrations/ifttt/finding_key.png) -Once you have added your key to your {% term "`configuration.yaml`" %} file, restart your Home Assistant instance. This will load up the IFTTT integration and make a service available to trigger events in IFTTT. +Once you have added your key to your {% term "`configuration.yaml`" %} file, restart your Home Assistant instance. This will load up the IFTTT integration and make an action available to trigger events in IFTTT. -<div class='note'> +{% important %} After restarting the server, be sure to watch the console for any logging errors that show up in red, white or yellow. -</div> +{% endimportant %} ### Multiple IFTTT keys @@ -84,7 +84,7 @@ ifttt: ### Testing your trigger -You can use **Developer Tools** to test your [Webhooks](https://ifttt.com/maker_webhooks) trigger. To do this, open the Home Assistant sidebar, click on **Developer Tools** -> **Services** tab. Select `IFTTT: Trigger` as the service and fill in the following values: +You can use **Developer Tools** to test your [Webhooks](https://ifttt.com/maker_webhooks) trigger. To do this, open the Home Assistant sidebar, click on **Developer Tools** > **Actions** tab. Select `IFTTT: Trigger` as the action and fill in the following values: {% configuration_basic %} event: @@ -105,17 +105,18 @@ value3: type: string {% endconfiguration_basic %} -When your screen looks like this, click the 'call service' button. -![Testing service.](/images/integrations/ifttt/testing_service.png) +When your screen looks like this, select the **Perform action** button. + +![Testing action.](/images/integrations/ifttt/testing_service.png) By default, the trigger is sent to all the API keys from {% term "`configuration.yaml`" %}. If you want to send the trigger to a specific key use the `target` field: -| Field | Value | -| ------------ | ----------------------------------------------------------------------------- | -| domain | `ifttt` | -| service | `trigger` | -| Service Data | `{"event": "EventName", "value1": "Hello World", "target": "YOUR_KEY_NAME1"}` | +| Field | Value | +| --------| ----------------------------------------------------------------------------- | +| domain | `ifttt` | +| service | `trigger` | +| data | `{"event": "EventName", "value1": "Hello World", "target": "YOUR_KEY_NAME1"}` | The `target` field can contain a single key name or a list of key names. diff --git a/source/_integrations/ihc.markdown b/source/_integrations/ihc.markdown index c7401a199127..af836d265b9e 100644 --- a/source/_integrations/ihc.markdown +++ b/source/_integrations/ihc.markdown @@ -342,46 +342,46 @@ switch: The resource id should be a boolean resource (On/Off). For more information about IHC resource ids see [Manual Setup](#manual-setup). -## Services +## Actions Below are the service functions for the IHC integrations. -### Service `ihc.pulse` +### Action `ihc.pulse` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------- | | `controller_id` | yes | If you have multiple controller, this is the index of you controller starting with 0 (0 is default) | | `ihc_id` | no | The boolean IHC resource ID. | -This service will send a pulse to the specified IHC resource. +This action will send a pulse to the specified IHC resource. On and Off with a 400ms delay. -### Service `ihc.set_runtime_value_bool` +### Action `ihc.set_runtime_value_bool` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------- | | `controller_id` | yes | If you have multiple controller, this is the index of you controller starting with 0 (0 is default) | | `ihc_id` | no | The boolean IHC resource ID. | | `value` | no | The boolean value to set. (true or false) | -This service will set the specified boolean resource on the IHC controller. +This action will set the specified boolean resource on the IHC controller. -### Service `ihc.set_runtime_value_float` +### Action `ihc.set_runtime_value_float` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------- | | `controller_id` | yes | If you have multiple controller, this is the index of you controller starting with 0 (0 is default) | | `ihc_id` | no | The float IHC resource ID. | | `value` | no | The float value to set. | -This service will set the specified float resource on the IHC controller. +This action will set the specified float resource on the IHC controller. -### Service `ihc.set_runtime_value_int` +### Action `ihc.set_runtime_value_int` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------- | | `controller_id` | yes | If you have multiple controller, this is the index of you controller starting with 0 (0 is default) | | `ihc_id` | no | The integer IHC resource ID. | | `value` | no | The integer value to set. | -This service will set the specified integer resource on the IHC controller. +This action will set the specified integer resource on the IHC controller. diff --git a/source/_integrations/image_processing.markdown b/source/_integrations/image_processing.markdown index 6c5a31e50bfe..436dc8a2c878 100644 --- a/source/_integrations/image_processing.markdown +++ b/source/_integrations/image_processing.markdown @@ -59,7 +59,7 @@ The following event attributes will be present (platform-dependent): `entity_id` ## scan_interval and optimizing Resources -Image processing integrations process the image from a camera at a fixed period given by the `scan_interval`. This leads to excessive processing if the image on the camera hasn't changed, as the default `scan_interval` is 10 seconds. You can override this by adding to your configuration `scan_interval: 10000` (setting the interval to 10,000 seconds), and then call the `image_processing.scan` service when you actually want to perform processing. +Image processing integrations process the image from a camera at a fixed period given by the `scan_interval`. This leads to excessive processing if the image on the camera hasn't changed, as the default `scan_interval` is 10 seconds. You can override this by adding to your configuration `scan_interval: 10000` (setting the interval to 10,000 seconds), and then call the `image_processing.scan` action when you actually want to perform processing. ```yaml # Example configuration.yaml diff --git a/source/_integrations/imap.markdown b/source/_integrations/imap.markdown index 0e10b7ea74f0..62e2b9f3b4b2 100644 --- a/source/_integrations/imap.markdown +++ b/source/_integrations/imap.markdown @@ -62,17 +62,14 @@ Below is an example for setting up the integration to connect to your Microsoft - Password: Your password - Charset: `US-ASCII` -<div class="note"> - +{% important %} Yahoo also requires the character set `US-ASCII`. - -</div> - +{% endimportant %} ### Selecting message data to include in the IMAP event (advanced mode) By default, the IMAP event won't include `text` or `headers` message data. If you want them to be included (`text` or `headers`, or both), you have to manually select them in the option flow. -Another way to process the `text` data, is to use the `imap.fetch` service. In this case, `text` won't be limited by size. +Another way to process the `text` data, is to use the `imap.fetch` action. In this case, `text` won't be limited by size. ### Selecting an alternate SSL cipher list or disabling SSL verification (advanced mode) @@ -81,21 +78,17 @@ The SSL cipher list option allows you to select the list of SSL ciphers to be ac If you are using self signed certificates, you can turn off SSL verification. -<div class='note info'> - +{% important %} The SSL cipher list and verify SSL are advanced settings. The options are available only when advanced mode is enabled (see user settings). - -</div> +{% endimportant %} ### Enable IMAP-Push IMAP-Push is enabled by default if your IMAP server supports it. If you use an unreliable IMAP service that periodically drops the connection and causes issues, you might consider turning off IMAP-Push. This will fall back to polling the IMAP server. -<div class='note info'> - +{% important %} The enforce polling option is an advanced setting. The option is available only when advanced mode is enabled (see user settings). - -</div> +{% endimportant %} ### Troubleshooting @@ -110,11 +103,9 @@ The table below shows what attributes come with `trigger.event.data`. The data i The attributes shown in the table are also available as variables for the custom event data template. The [example](/integrations/imap/#example---custom-event-data-template) shows how to use this as an event filter. -<div class='note info'> - +{% important %} The custom event data template is an advanced feature. The option is available only when advanced mode is enabled (see user settings). The `text` attribute is not size limited when used as a variable in the template. - -</div> +{% endimportant %} {% configuration_basic %} server: @@ -148,11 +139,9 @@ The `event_type` for the custom event should be set to `imap_content`. The confi If the default maximum message size (2048 bytes) to be used in events is too small for your needs, then this maximum size setting can be increased. You need to have your profile set to _advanced_ mode to do this. -<div class='note warning'> - +{% warning %} Increasing the default maximum message size (2048 bytes) could have a negative impact on performance as event data is also logged by the `recorder`. If the total event data size exceeds the maximum event size (32168 bytes), the event will be skipped. - -</div> +{% endwarning %} {% raw %} @@ -185,26 +174,24 @@ template: {% endraw %} -### Services for post-processing +### Actions for post-processing -The IMAP integration has some services for post-pressing email messages. The services are intended to be used in automations as actions after an "imap_content" event. The services take the IMAP `entry_id` and the `uid` of the message's event data. You can use a template for the `entry_id` and the `uid`. When the service is set up as a trigger action, you can easily select the correct entry from the UI. You will find the `entry_id` in YAML mode. It is highly recommended you filter the events by the `entry_id`. +The IMAP integration has some actions for post-pressing email messages. The actions are intended to be used in automations as actions after an "imap_content" event. The actions take the IMAP `entry_id` and the `uid` of the message's event data. You can use a template for the `entry_id` and the `uid`. When the action is set up as a trigger action, you can easily select the correct entry from the UI. You will find the `entry_id` in YAML mode. It is highly recommended you filter the events by the `entry_id`. -Available services are: +Available actions are: - `seen`: Mark the message as seen. - `move`: Move the message to a `target_folder` and optionally mark the message `seen`. - `delete`: Delete the message. - `fetch`: Fetch the content of a message. Returns a dictionary containing `"text"`, `"subject"`, `"sender"` and `"uid""`. This allows to fetch and process the complete message text, not limited by size. -<div class='note warning'> - -When these services are used in an automation, make sure the right triggers and filtering are set up. When messages are deleted, they cannot be recovered. When multiple IMAP entries are set up, make sure the messages are filtered by the `entry_id` as well to ensure the correct messages are processed. Do not use these services unless you know what you are doing. - -</div> +{% caution %} +When these actions are used in an automation, make sure the right triggers and filtering are set up. When messages are deleted, they cannot be recovered. When multiple IMAP entries are set up, make sure the messages are filtered by the `entry_id` as well to ensure the correct messages are processed. Do not use these actions unless you know what you are doing. +{% endcaution %} ## Example - post-processing -The example below filters the event trigger by `entry_id`, fetches the message and stores it in `message_text`. It then marks the message in the event as seen and finally, it adds a notification with the subject of the message. The `seen` service `entry_id` can be a template or literal string. In UI mode you can select the desired entry from a list as well. +The example below filters the event trigger by `entry_id`, fetches the message and stores it in `message_text`. It then marks the message in the event as seen and finally, it adds a notification with the subject of the message. The `seen` action `entry_id` can be a template or literal string. In UI mode you can select the desired entry from a list as well. {% raw %} diff --git a/source/_integrations/incomfort.markdown b/source/_integrations/incomfort.markdown index a23413b55610..ddc6ce8db7d2 100644 --- a/source/_integrations/incomfort.markdown +++ b/source/_integrations/incomfort.markdown @@ -9,7 +9,7 @@ ha_category: ha_release: 0.93 ha_iot_class: Local Polling ha_codeowners: - - '@zxdavb' + - '@jbouwh' ha_domain: incomfort ha_platforms: - binary_sensor diff --git a/source/_integrations/influxdb.markdown b/source/_integrations/influxdb.markdown index e1c2a13b056d..84ae7803c0a8 100644 --- a/source/_integrations/influxdb.markdown +++ b/source/_integrations/influxdb.markdown @@ -25,11 +25,9 @@ There is currently support for the following device types within Home Assistant: - [Sensor](#sensor) -<div class='note'> - +{% note %} The `influxdb` database integration runs parallel to the Home Assistant database. It does not replace it. - -</div> +{% endnote %} ## Configuration @@ -300,7 +298,7 @@ influxdb: The `influxdb` sensor allows you to use values from an [InfluxDB](https://influxdb.com/) database to populate a sensor state. This can be used to present statistics as Home Assistant sensors, if used with the `influxdb` history integration. It can also be used with an external data source. -<div class='note'> +{% important %} You must configure the `influxdb` history integration in order to create `influxdb` sensors. If you just want to create sensors for an external InfluxDB database and you don't want Home Assistant to write any data to it you can exclude all entities like this: @@ -310,7 +308,7 @@ influxdb: entity_globs: "*" ``` -</div> +{% endimportant %} ### Configuration diff --git a/source/_integrations/input_boolean.markdown b/source/_integrations/input_boolean.markdown index d86e1680c65e..25dc2e01dc6c 100644 --- a/source/_integrations/input_boolean.markdown +++ b/source/_integrations/input_boolean.markdown @@ -21,7 +21,7 @@ automations by using them in their {% term conditions %}. The preferred way to configure input boolean helpers is via the user interface, in which they are known as Toggle Helpers. To add one, go to -**{% my helpers title="Settings > Devices & Services > Helpers" %}** and click the add button; +**{% my helpers title="Settings > Devices & services > Helpers" %}** and click the add button; next choose the **{% my config_flow_start domain="input_boolean" title="Toggle" %}** option. To be able to add **Helpers** via the user interface you should have @@ -61,13 +61,13 @@ input_boolean: icon: mdi:car ``` -## Services +## Actions -This integration provides the following {% term services %} to modify the state of the -`input_boolean` and a service to reload the configuration without restarting +This integration provides the following {% term actions %} to modify the state of the +`input_boolean` and an action to reload the configuration without restarting Home Assistant itself. -| Service | Data | Description | +| Action | Data | Description | | ---------- | ------------------------------ | ----------------------------------------------------------- | | `turn_on` | `entity_id(s)`<br>`area_id(s)` | Set the value of specific `input_boolean` entities to `on` | | `turn_off` | `entity_id(s)`<br>`area_id(s)` | Set the value of specific `input_boolean` entities to `off` | diff --git a/source/_integrations/input_button.markdown b/source/_integrations/input_button.markdown index 6abcad97259b..ef17846f3ef1 100644 --- a/source/_integrations/input_button.markdown +++ b/source/_integrations/input_button.markdown @@ -19,7 +19,7 @@ like an automation. ## Configuration The preferred way to configure button helpers is via the user interface. -To add one, go to **{% my helpers title="Settings -> Devices & Services -> Helpers" %}** +To add one, go to **{% my helpers title="Settings -> Devices & services -> Helpers" %}** and click the add button; next choose the **{% my config_flow_start domain="input_button" title="Button" %}** option. To be able to add **Helpers** via the user interface you should have @@ -76,12 +76,12 @@ action: message: "My button has been pressed!" ``` -## Services +## Actions -The input button entities exposes a single service: +The input button entities exposes a single action: {% my developer_call_service service="input_button.press" %} -This service can be called to trigger a button press for that entity. +This action can be used to trigger a button press for that entity. ```yaml - service: input_button.press diff --git a/source/_integrations/input_datetime.markdown b/source/_integrations/input_datetime.markdown index 995af13d1873..90afc6e93e59 100644 --- a/source/_integrations/input_datetime.markdown +++ b/source/_integrations/input_datetime.markdown @@ -16,7 +16,7 @@ The `input_datetime` integration allows the user to define date and time values that can be controlled via the frontend and can be used within automations and templates. -The preferred way to configure input datetime is via the user interface at **{% my helpers title="Settings > Devices & Services > Helpers" %}**. Click the add button and then choose the **{% my config_flow_start domain="input_datetime" title="Date and/or time" %}** option. +The preferred way to configure input datetime is via the user interface at **{% my helpers title="Settings > Devices & services > Helpers" %}**. Click the add button and then choose the **{% my config_flow_start domain="input_datetime" title="Date and/or time" %}** option. To be able to add **{% my helpers title="Helpers" %}** via the user interface you should have `default_config:` in your {% term "`configuration.yaml`" %}, it should already be there by default unless you removed it. If you removed `default_config:` from your configuration, you must add `input_datetime:` to your `configuration.yaml` first, then you can use the UI. @@ -89,13 +89,13 @@ automations and templates. If you set a valid value for `initial`, this integration will start with the state set to that value. Otherwise, it will restore the state it had prior to Home Assistant stopping. -### Services +### Actions -Available service: `input_datetime.set_datetime` and `input_datetime.reload`. +Available actions: `input_datetime.set_datetime` and `input_datetime.reload`. #### input_datetime.set_datetime -| Service data attribute | Format String | Description | +| Data attribute | Format String | Description | | ---------------------- | ------------------- | -------------------------------------------------------------------------------- | | `date` | `%Y-%m-%d` | This can be used to dynamically set the date. | | `time` | `%H:%M:%S` | This can be used to dynamically set the time. | @@ -106,7 +106,7 @@ To set both the date and time in the same call, use `date` and `time` together, #### input_datetime.reload -`input_datetime.reload` service allows one to reload `input_datetime`'s configuration without restarting Home Assistant itself. +`input_datetime.reload` action allows one to reload `input_datetime`'s configuration without restarting Home Assistant itself. ## Examples @@ -127,7 +127,7 @@ automation: ``` To dynamically set the `input_datetime` you can call -`input_datetime.set_datetime`. The values for `date`, `time` and/or `datetime` must be in a certain format for the call to be successful. (See service description above.) +`input_datetime.set_datetime`. The values for `date`, `time` and/or `datetime` must be in a certain format for the call to be successful. (See action description above.) If you have a `datetime` object you can use its `timestamp` method. Of if you have a timestamp you can just use it directly. {% raw %} diff --git a/source/_integrations/input_number.markdown b/source/_integrations/input_number.markdown index b95f5b4a8767..0a219b127a81 100644 --- a/source/_integrations/input_number.markdown +++ b/source/_integrations/input_number.markdown @@ -14,7 +14,7 @@ ha_integration_type: helper The **Input number** {% term integration %} allows the user to define values that can be controlled via the frontend and can be used within conditions of automation. The frontend can display a slider, or a numeric input box. Changes to the slider or numeric input box generate state events. These state events can be utilized as `automation` triggers as well. -The preferred way to configure an input number is via the user interface at **{% my helpers title="Settings > Devices & Services > Helpers" %}**. Click the add button and then choose the **{% my config_flow_start domain="input_number" title="Number" %}** option. +The preferred way to configure an input number is via the user interface at **{% my helpers title="Settings > Devices & services > Helpers" %}**. Click the add button and then choose the **{% my config_flow_start domain="input_number" title="Number" %}** option. To be able to add **Helpers** via the user interface you should have `default_config:` in your {% term "`configuration.yaml`" %}, it should already be there by default unless you removed it. If you removed `default_config:` from you configuration, you must add `input_number:` to your `configuration.yaml` first, then you can use the UI. @@ -82,9 +82,9 @@ input_number: type: icon {% endconfiguration %} -### Services +### Actions -This integration provides the following services to modify the state of the `input_number` and a service to reload the +This integration provides the following actions to modify the state of the `input_number` and an action to reload the configuration without restarting Home Assistant itself. | Service | Data | Description | diff --git a/source/_integrations/input_select.markdown b/source/_integrations/input_select.markdown index 442636fda928..ce01a61b4cff 100644 --- a/source/_integrations/input_select.markdown +++ b/source/_integrations/input_select.markdown @@ -14,7 +14,7 @@ ha_integration_type: helper The **Input select** {% term integration %} allows the user to define a list of values that can be selected via the frontend and can be used within conditions of an automation. When a user selects a new item, a state transition event is generated. This state event can be used in an `automation` trigger. -The preferred way to configure an input select is via the user interface at **{% my helpers title="Settings > Devices & Services > Helpers" %}**. Click the add button and then choose the **{% my config_flow_start domain="input_select" title="Dropdown" %}** option. +The preferred way to configure an input select is via the user interface at **{% my helpers title="Settings > Devices & services > Helpers" %}**. Click the add button and then choose the **{% my config_flow_start domain="input_select" title="Dropdown" %}** option. To be able to add **Helpers** via the user interface you should have `default_config:` in your {% term "`configuration.yaml`" %}, it should already be there by default unless you removed it. If you removed `default_config:` from you configuration, you must add `input_select:` to your `configuration.yaml` first, then you can use the UI. @@ -63,21 +63,19 @@ input_select: type: icon {% endconfiguration %} -<div class='note'> - +{% note %} Because YAML defines [booleans](https://yaml.org/type/bool.html) as equivalent, any variations of 'On', 'Yes', 'Y', 'Off', 'No', or 'N' (regardless of case) used as option names will be replaced by True and False unless they are defined in quotation marks. - -</div> +{% endnote %} ### Restore state If you set a valid value for `initial` this integration will start with the state set to that value. Otherwise, it will restore the state it had prior to Home Assistant stopping. -### Services +### Actions -This integration provides three services to modify the state of the `input_select`. +This integration provides three actions to modify the state of the `input_select`. -| Service | Data | Description | +| Action | Data | Description | | --------------- | --------------------------- | ----------------------------------------------------- | | `select_option` | `option` | This can be used to select a specific option. | | `set_options` | `options`<br>`entity_id(s)` | Set the options for specific `input_select` entities. | @@ -85,19 +83,19 @@ This integration provides three services to modify the state of the `input_selec | `select_last` | | Select the last option. | | `reload` | | Reload `input_select` configuration | -#### Service `input_select.select_next` +#### Action `input_select.select_next` Select the next option. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------- | | `cycle` | yes | Whether to cycle to the first value after the last. Default: `true` | -#### Service `input_select.select_previous` +#### Action `input_select.select_previous` Select the previous option. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------- | | `cycle` | yes | Whether to cycle to the last value before the first. Default: `true` | @@ -131,7 +129,7 @@ scene: ## Automation examples -The following example shows the usage of the `input_select.select_option` service in an automation: +The following example shows the usage of the `input_select.select_option` action in an automation: ```yaml # Example configuration.yaml entry diff --git a/source/_integrations/input_text.markdown b/source/_integrations/input_text.markdown index 8960f0fa54cf..5bafef44f7c9 100644 --- a/source/_integrations/input_text.markdown +++ b/source/_integrations/input_text.markdown @@ -14,7 +14,7 @@ ha_integration_type: helper The **Input text** {% term integration %} allows the user to define values that can be controlled via the frontend and can be used within conditions of automation. Changes to the value stored in the text box generate state events. These state events can be utilized as `automation` triggers as well. It can also be configured in password mode (obscured text). -The preferred way to configure an input text is via the user interface at **{% my helpers title="Settings > Devices & Services > Helpers" %}**. Click the add button and then choose the **{% my config_flow_start domain="input_text" title="Text" %}** option. +The preferred way to configure an input text is via the user interface at **{% my helpers title="Settings > Devices & services > Helpers" %}**. Click the add button and then choose the **{% my config_flow_start domain="input_text" title="Text" %}** option. To be able to add **Helpers** via the user interface you should have `default_config:` in your {% term "`configuration.yaml`" %}, it should already be there by default unless you removed it. If you removed `default_config:` from your configuration, you must add `input_text:` to your `configuration.yaml` first, then you can use the UI. @@ -79,11 +79,11 @@ input_text: default: text {% endconfiguration %} -### Services +### Actions -This integration provides a service to modify the state of the `input_text` and a service to reload the `input_text` configuration without restarting Home Assistant itself. +This integration provides an action to modify the state of the `input_text` and an action to reload the `input_text` configuration without restarting Home Assistant itself. -| Service | Data | Description | +| Action | Data | Description | | ----------- | ------------------------- | ------------------------------------------------- | | `set_value` | `value`<br>`entity_id(s)` | Set the value for specific `input_text` entities. | | `reload` | | Reload `input_text` configuration | diff --git a/source/_integrations/insteon.markdown b/source/_integrations/insteon.markdown index 193dca0801c7..ca68809fc76e 100644 --- a/source/_integrations/insteon.markdown +++ b/source/_integrations/insteon.markdown @@ -27,7 +27,9 @@ ha_integration_type: integration ha_dhcp: true --- -<p class='note warning'>The Insteon apps (Director or Insteon for Hub) are a paid service utilizing the Insteon cloud to control an Insteon Hub. Home Assistant does not require the use of the Insteon app but can operate in conjunction with the app if desired.</p> +{% important %} +The Insteon apps (Director or Insteon for Hub) are a paid service utilizing the Insteon cloud to control an Insteon Hub. Home Assistant does not require the use of the Insteon app but can operate in conjunction with the app if desired. +{% endimportant %} This integration adds support for integrating your Insteon network with Home Assistant. It has been tested with all USB and serial PowerLinc Modems (PLM) including [2413U], [2448A7], [2413S] and [2412S] models. It has also been tested to work with the [2242] and [2245] Hubs. @@ -60,7 +62,7 @@ The Insteon configuration panel allows for product specific configuration of Ins To open the Insteon configuration panel: -1. Go to {% my integrations title="**Settings** > **Devices & Services**" %}. +1. Go to {% my integrations title="**Settings** > **Devices & services**" %}. 2. Select the **Insteon** {% term integration %}. Then, select **Configure** to open the Insteon configuration panel. The following capabilities are available in the Insteon configuration panel: @@ -102,8 +104,13 @@ The Insteon All-Link Database (ALDB) contains the list of links to other devices - **Undo changes**: Undoes ALDB record changes before they are written to the device. - **Delete device**: Deletes the Insteon device from Home Assistant and removes all references to the device in the modem. Optionally, it can remove any references to the device in other Insteon devices. -<p class='note warning'>If you choose to use the Insteon app, it is recommended to add devices and scenes using the Insteon app. Home Assistant will see the devices and scenes as well. Devices and scenes added in Home Assistant will not be available in the Insteon app.</p> -<p class='note warning'>Editing a device's All-Link Database can cause the device to become unresponsive. If this occurs, simply relink the device to the modem using the <a href="#add-device">Add device</a> directions above.</p> +{% tip %} +If you choose to use the Insteon app, it is recommended to add devices and scenes using the Insteon app. Home Assistant will see the devices and scenes as well. Devices and scenes added in Home Assistant will not be available in the Insteon app. +{% endtip %} + +{% warning %} +Editing a device's All-Link Database can cause the device to become unresponsive. If this occurs, simply relink the device to the modem using the <a href="#add-device">Add device</a> directions above. +{% endwarning %} [understanding linking]: https://www.insteon.com/support-knowledgebase/2015/1/28/understanding-linking @@ -115,7 +122,7 @@ The Insteon All-Link Database (ALDB) contains the list of links to other devices ## Triggering Insteon scenes -Triggering an Insteon scene on or off is done via automations. Two services are provided to support this feature: +Triggering an Insteon scene on or off is done via automations. Two actions are provided to support this feature: - **insteon.scene_on** - **group**: (required) The Insteon scene number to trigger. @@ -183,9 +190,9 @@ automation: entity_id: light.some_light ``` -## Services +## Actions -The following services are available: +The following actions are available: - **insteon.add_all_link**: Puts the Insteon Modem (IM) into All-Linking mode. The IM can be set as a controller or a responder. If the IM is a controller, put the IM into linking mode then press the SET button on the device. If the IM is a responder, press the SET button on the device then put the IM into linking mode. - **insteon.delete_all_link**: Tells the Insteon Modem (IM) to remove an All-Link record from the All-Link Database of the IM and a device. Once the IM is set to delete the link, press the SET button on the corresponding device to complete the process. @@ -196,7 +203,9 @@ The following services are available: ## Device overrides -<p class='note warning'>Device overrides are not used to add a device to the Insteon integration. They are only used if a device that was linked correctly to the Insteon Modem but is not appearing in Home Assistant. +{% warning %} +Device overrides are not used to add a device to the Insteon integration. They are only used if a device that was linked correctly to the Insteon Modem but is not appearing in Home Assistant. +{% endwarning %} There are two primary uses for the **device override** feature: diff --git a/source/_integrations/integration.markdown b/source/_integrations/integration.markdown index 74430c55cc6a..1c40f629d0aa 100644 --- a/source/_integrations/integration.markdown +++ b/source/_integrations/integration.markdown @@ -96,6 +96,7 @@ max_sub_interval: description: "Applies time-based integration if the source did not change for this duration. This implies that at least every `max sub-interval`, the integral is updated. If you don't want time-based updates, enter 0." required: false type: time + default: 0 {% endconfiguration %} The unit of `source` together with `unit_prefix` and `unit_time` is used to generate a unit for the integral product (e.g. a source in `W` with prefix `k` and time `h` would result in `kWh`). Note that `unit_prefix` and `unit_time` are _also_ relevant to the Riemann sum calculation. diff --git a/source/_integrations/intent_script.markdown b/source/_integrations/intent_script.markdown index 95d68434607c..34adabbcd368 100644 --- a/source/_integrations/intent_script.markdown +++ b/source/_integrations/intent_script.markdown @@ -116,7 +116,7 @@ intent_script: data_template: start_date_time: "{{ today_at('00:00') }}" duration: { "hours": 24 } - response_variable: result # get service response + response_variable: result # get action response - stop: "" response_variable: result # and return it speech: diff --git a/source/_integrations/intesishome.markdown b/source/_integrations/intesishome.markdown index 0cd501377139..410dcf70667a 100644 --- a/source/_integrations/intesishome.markdown +++ b/source/_integrations/intesishome.markdown @@ -48,9 +48,9 @@ This integration opens a TCP connection with the IntesisHome API to receive temp By default, the integration will be named using the friendly device name from the IntesisHome website or application. If internet connectivity is lost, the device will be marked as unavailable after 5 minutes. -### Supported services +### Supported actions -Available services: +Available actions: - `climate.set_temperature` - `climate.set_fan_mode` diff --git a/source/_integrations/iperf3.markdown b/source/_integrations/iperf3.markdown index d19fc04de13c..57b779c36842 100644 --- a/source/_integrations/iperf3.markdown +++ b/source/_integrations/iperf3.markdown @@ -111,16 +111,16 @@ The frequency when the test will be automatically triggered can be adjusted by s Parallel streams can help in some situations. As TCP attempts to be fair and conservative, you may consider increasing the `parallel` attribute. Use this value with careful and refer to Iperf3 man page for more information. -You can use the service `sensor.iperf3_update` to trigger a manual speed test for all sensors. Iperf3 has its own service call that allow to perform a speed test on a particular entity. +You can use the `sensor.iperf3_update` action to trigger a manual speed test for all sensors. Iperf3 has its own action that allows performing a speed test on a particular entity. -## Service +## Action -Once loaded, the `iperf3` integration will expose a service (`iperf3.speedtest`) that can be called to run a speed test on demand. This can be useful if you have enabled manual mode. +Once loaded, the `iperf3` integration will expose an action (`iperf3.speedtest`) that can be called to run a speed test on demand. This can be useful if you have enabled manual mode. -| Service data attribute | Description | +| Data attribute | Description | | `host` | String that point at a configured `host` from `configuration.yaml`. Otherwise, tests will be run against all configured hosts. -Example Service data: +Example action data: ```json {"host": "192.168.0.121"} diff --git a/source/_integrations/israel_rail.markdown b/source/_integrations/israel_rail.markdown new file mode 100644 index 000000000000..6bb9373b9807 --- /dev/null +++ b/source/_integrations/israel_rail.markdown @@ -0,0 +1,25 @@ +--- +title: Israel Rail +description: Instructions on how to integrate timetable data for traveling in Israel rail within Home Assistant. +ha_category: + - Transport +ha_iot_class: Cloud Polling +ha_release: 2024.8 +ha_config_flow: true +ha_codeowners: + - '@shaiu' +ha_domain: israel_rail +ha_platforms: + - sensor +ha_integration_type: integration +--- + +The Israel rail integration will give you the next three departure times from a given location to another one in Israel rail. + +{% include integrations/config_flow.md %} + +The public timetables are coming from [Israel rail](https://www.rail.co.il). + +### Defining a custom polling interval + +{% include common-tasks/define_custom_polling.md %} diff --git a/source/_integrations/iss.markdown b/source/_integrations/iss.markdown index ff00c58f607f..19771213729e 100644 --- a/source/_integrations/iss.markdown +++ b/source/_integrations/iss.markdown @@ -22,10 +22,10 @@ It will also tell you how many people are in space. {% include integrations/config_flow.md %} -<div class='note warning'> +{% note %} If you enable "Show on map" in the options for this integration then the location attributes are named `latitude` and `longitude`. The default name of the location attributes is `lat` and `long` to avoid showing them on the map. -</div> +{% endnote %} diff --git a/source/_integrations/isy994.markdown b/source/_integrations/isy994.markdown index 4a8307229755..1a58b7753faf 100644 --- a/source/_integrations/isy994.markdown +++ b/source/_integrations/isy994.markdown @@ -130,28 +130,28 @@ Insteon Secondary Keypad buttons and Remote buttons are added to Home Assistant Insteon devices will include entities for setting the device On Level, Ramp Rate, and Backlight Level, if supported; as well as `button` entities for `Beep` and `Query` actions. Note: Backlight Level cannot be read from the device, so an assumed state is used. The current state in Home Assistant will be valid if the backlight is changed from Home Assistant and will also be updated if changed from the ISY Admin Console or REST command while Home Assistant is running. Additional configuration changes still require the ISY Admin Console. -### Services +### Actions -Once loaded, the following services will be exposed with the `isy994.` prefix, to allow advanced control over the ISY and its connected devices: +Once loaded, the following actions will be exposed with the `isy994.` prefix, to allow advanced control over the ISY and its connected devices: - - Entity services for all Home Assistant-connected entities: `send_node_command`, `send_raw_node_command`. - - ISY Z-Wave Node services: `get_zwave_parameter`, `set_zwave_parameter`, `set_zwave_lock_user_code`, `delete_zwave_lock_user_code` - - Generic ISY services: `send_program_command` + - Actions for all Home Assistant-connected entities: `send_node_command`, `send_raw_node_command`. + - ISY Z-Wave Node actions: `get_zwave_parameter`, `set_zwave_parameter`, `set_zwave_lock_user_code`, `delete_zwave_lock_user_code` + - Generic ISY actions: `send_program_command` -#### Service `isy994.send_node_command` +#### Action `isy994.send_node_command` Send a command to an ISY Device using its Home Assistant entity ID. Valid commands are: `beep`, `brighten`, `dim`, `disable`, `enable`, `fade_down`, `fade_stop`, `fade_up`, `fast_off`, `fast_on`, and `query`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name(s) of target entities for the command, e.g., `light.front_porch`. | | `command` | no | The command to be sent to the device, e.g., `"fast_on"` | -#### Service `isy994.send_raw_node_command` +#### Action `isy994.send_raw_node_command` Send a "raw" (e.g., `DON`, `DOF`) ISY REST Device Command to a Node using its Home Assistant Entity ID. This is useful for devices that aren't fully supported in Home Assistant yet, such as controls for many NodeServer nodes. Refer to the ISY (or PyISY Python Module) Documentation for details of valid commands. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name(s) of target entities for the command, e.g., `light.front_porch`. | | `command` | no | The ISY REST Command to be sent to the device, e.g., `"DON"` | @@ -159,60 +159,60 @@ Send a "raw" (e.g., `DON`, `DOF`) ISY REST Device Command to a Node using its Ho | `parameters` | yes | A `dict` of parameters to be sent in the query string for controlling colored bulbs or advanced parameters, e.g., `{ GV2: 0, GV3: 0, GV4: 255 }` | | `unit_of_measurement` | yes | The ISY Unit of Measurement (UOM) to send with the command, if required, e.g., `67` | -#### Service `isy994.get_zwave_parameter` +#### Action `isy994.get_zwave_parameter` Request a Z-Wave Device parameter via the ISY. The parameter value will be returned as an entity extra state attribute with the name "ZW#" where "#" is the parameter number. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------- | | `entity_id` | no | Name of target entity for the command, e.g., `light.front_porch`. This must be an ISY Z-Wave Node. | | `parameter` | no | The parameter number to retrieve from the end device. | -#### Service `isy994.set_zwave_parameter` +#### Action `isy994.set_zwave_parameter` Update a Z-Wave Device parameter via the ISY. The parameter value will also be returned as an entity extra state attribute with the name "ZW#" where "#" is the parameter number. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------- | | `entity_id` | no | Name of target entity for the command, e.g., `light.front_porch`. This must be an ISY Z-Wave Node. | | `parameter` | no | The parameter number to set on the end device. | | `value` | no | The value to set for the parameter. May be an integer or byte string (e.g. "0xFFFF"). | | `size` | no | The size of the parameter, either 1, 2, or 4 bytes. | -#### Service `isy994.set_zwave_lock_user_code` +#### Action `isy994.set_zwave_lock_user_code` Set a Z-Wave Lock User Code via the ISY. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------- | | `entity_id` | no | Name of target entity for the command, e.g., `lock.front_door`. The entity must be an ISY Z-Wave Lock entity. | | `user_num` | no | The user slot number to set on the end device. | | `code` | no | The lock code to set for the user slot. | -#### Service `isy994.delete_zwave_lock_user_code` +#### Action `isy994.delete_zwave_lock_user_code` Delete a Z-Wave Lock User Code via the ISY. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------- | | `entity_id` | no | Name of target entity for the command, e.g., `lock.front_door`. The entity must be an ISY Z-Wave Lock entity. | | `user_num` | no | The user slot number to delete the code on the end device. | -#### Service `isy994.rename_node` +#### Action `isy994.rename_node` Rename a node or group (scene) on the ISY994. Note: this will not automatically change the Home Assistant Entity Name or Entity ID to match. The entity name and ID will only be updated after reloading the integration or restarting Home Assistant, and ONLY IF you have not already customized the name within Home Assistant. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------- | | `entity_id` | no | Name of target entity for the command, e.g., `light.front_porch`. | | `name` | no | The new name to use within the ISY. | -#### Service `isy994.send_program_command` +#### Action `isy994.send_program_command` Send a command to control an ISY program or folder. Valid commands are `run`, `run_then`, `run_else`, `stop`, `enable`, `disable`, `enable_run_at_startup`, and `disable_run_at_startup`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `command` | no | The ISY Program Command to be sent, e.g., `"run"` | | `address` | yes | The address of the program to control (optional, use either `address` or `name`), e.g., `"04B1"` | @@ -290,12 +290,12 @@ The IF clause of the *status* program in the device directory is what indicates <img src='/images/isy994/isy994_SwitchStatusExample.png' /> </p> -The *actions* program indicates what should be performed for the following device services: +The *actions* program indicates what should be performed for the following device actions: -- *cover* the THEN clause is evaluated for the open_cover service, the ELSE clause is evaluated for the close_cover service. -- *fan* the THEN clause is evaluated for the turn_on service, the ELSE clause is evaluated for the turn_off service. -- *lock* the THEN clause is evaluated for the lock service, the ELSE clause is evaluated for the unlock service. -- *switch* the THEN clause is evaluated for the turn_on service, the ELSE clause is evaluated for the turn_off service. +- *cover* the THEN clause is evaluated for the `open_cover` action, the ELSE clause is evaluated for the `close_cover` action. +- *fan* the THEN clause is evaluated for the `turn_on` action, the ELSE clause is evaluated for the `turn_off` action. +- *lock* the THEN clause is evaluated for the `lock` action, the ELSE clause is evaluated for the `unlock` action. +- *switch* the THEN clause is evaluated for the `turn_on` action, the ELSE clause is evaluated for the `turn_off` action. <p class='img'> <img src='/images/isy994/isy994_SwitchActionsExample.png' /> diff --git a/source/_integrations/itach.markdown b/source/_integrations/itach.markdown index 7d4b72f797e7..c4510d279a52 100644 --- a/source/_integrations/itach.markdown +++ b/source/_integrations/itach.markdown @@ -85,7 +85,7 @@ devices: type: string {% endconfiguration %} -An example to call the integration from developer tools using the `remote.send_command` service: `{ "entity_id":"remote.tv", "command":"menu" }` +An example to call the integration from developer tools using the `remote.send_command` action: `{ "entity_id":"remote.tv", "command":"menu" }` Note: Global Cache devices expect data in their own format of "sendir...". This integration converts hex code to Global Cache IR form. diff --git a/source/_integrations/izone.markdown b/source/_integrations/izone.markdown index 74c64892a021..fcf457a75a55 100644 --- a/source/_integrations/izone.markdown +++ b/source/_integrations/izone.markdown @@ -123,22 +123,22 @@ logger: This will help you to find network connection issues etc. -## Services +## Actions -### Service `izone.airflow_min` +### Action `izone.airflow_min` Set the minimum airflow for a particular zone. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | | `entity_id` | yes | izone Zone entity. For example `climate.bed_2` | | `airflow` | no | Airflow percent in 5% increments | -### Service `izone.airflow_max` +### Action `izone.airflow_max` Set the maximum airflow for a particular zone. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | | `entity_id` | yes | izone Zone entity. For example `climate.bed_2` | | `airflow` | no | Airflow percent in 5% increments | diff --git a/source/_integrations/jewish_calendar.markdown b/source/_integrations/jewish_calendar.markdown index 124675e723d2..18aae8cd405a 100644 --- a/source/_integrations/jewish_calendar.markdown +++ b/source/_integrations/jewish_calendar.markdown @@ -47,9 +47,9 @@ Allows you to override the default location information provided by Home Assista ### Data sensors - `date`: Shows the hebrew date for today. -- `weekly_portion`: Shows the weekly portion (parshat hashavu'a - פרשת השבוע) +- `parshat_hashavua`: Shows the weekly portion (parshat hashavu'a - פרשת השבוע) - `holiday`: If it is a holiday, shows the name of the holiday _(see below for more info)_. -- `omer_count`: An integer sensor indicating the day of the Omer (1-49) or 0 if it is not currently the Omer. +- `day_of_the_omer`: An integer sensor indicating the day of the Omer (1-49) or 0 if it is not currently the Omer. - `daf_yomi`: Shows the date's daf yomi page. ### Time sensors @@ -58,20 +58,19 @@ Allows you to override the default location information provided by Home Assista Time sensor states are represented as ISO8601 formatted *UTC time*. -- `first_light`: First light of dawn (Alot Hashachar - עלות השחר) -- `talit`: Earliest time for tallit and tefillin (Misheyakir - משיכיר) -- `sunrise`: Earliest time for Shacharit (Hanetz Hachama - הנץ החמה) -- `gra_end_shma`: Last time for the reading of the Shma according to the Gr"a. -- `mga_end_shma`: Last time for the reading of the Shma according to the MG"A. -- `gra_end_tefilla`: Last time for full shacharit according to the Gr"a. -- `mga_end_tefilla`: Last time for full shacharit according to the MG"A. -- `midday`: Half way through the day (Chatzot Hayom - חצות היום) -- `big_mincha`: Earliest time for Mincha (Mincha Gedola - מנחה גדולה) -- `little_mincha`: Preferable earliest time for Mincha (Mincha Ketana - מנחה קטנה) -- `plag_mincha`: Time of the Plag Hamincha (פלג המנחה) -- `sunset`: Sunset (Shkiya - שקיעה) -- `first_stars`: Time at which the first stars are visible (Tseit Hakochavim - צאת הכוכבים) -- `three_stars`: Time at which the first three stars are visible (Tseit Hakochavim - צאת הכוכבים - for Shabbat and Yom Tov) +- `alot_hashachar`: First light of dawn (Alot Hashachar - עלות השחר) +- `talit_and_tefillin`: Earliest time for tallit and tefillin (Misheyakir - משיכיר) +- `hanetz_hachama`: Earliest time for Shacharit (Hanetz Hachama - הנץ החמה) +- `latest_time_for_shma_gr_a`: Last time for the reading of the Shma according to the Gr"a. +- `latest_time_for_shma_mg_a`: Last time for the reading of the Shma according to the MG"A. +- `latest_time_for_tefilla_gr_a`: Last time for full shacharit according to the Gr"a. +- `latest_time_for_tefilla_mg_a`: Last time for full shacharit according to the MG"A. +- `chatzot_hayom`: Half way through the day (Chatzot Hayom - חצות היום) +- `mincha_gedola`: Earliest time for Mincha (Mincha Gedola - מנחה גדולה) +- `mincha_ketana`: Preferable earliest time for Mincha (Mincha Ketana - מנחה קטנה) +- `plag_hamincha`: Time of the Plag Hamincha (פלג המנחה) +- `shkia`: Sunset (Shkiya - שקיעה) +- `t_set_hakochavim`: Time at which the first stars are visible (Tseit Hakochavim - צאת הכוכבים) - `upcoming_shabbat_candle_lighting`: The time of candle lighting for either the current Shabbat (if it is currently Shabbat) or the immediately upcoming Shabbat. - `upcoming_shabbat_havdalah`: The time of havdalah for either the current Shabbat (if it is currently Shabbat) or the immediately upcoming Shabbat. If it is currently a three-day holiday, this value *could* be None (i.e., if a holiday is Sat./Sun./Mon. and it's Saturday, there will be no `shabbat_havdalah` value. See comments in hdate library for details.) - `upcoming_candle_lighting`: The time of candle lighting for either the current Shabbat OR Yom Tov, or the immediately upcoming Shabbat OR Yom Tov. If, for example, today is Sunday, and Rosh Hashana is Monday night through Wednesday night, this reports the candle lighting for Rosh Hashana on Monday night. This avoids a situation of triggering pre-candle-lighting automations while it is currently Yom Tov. To always get the Shabbat times, use the `upcoming_shabbat_candle_lighting` sensor. diff --git a/source/_integrations/joaoapps_join.markdown b/source/_integrations/joaoapps_join.markdown index 317995a707bc..c78886e2dd77 100644 --- a/source/_integrations/joaoapps_join.markdown +++ b/source/_integrations/joaoapps_join.markdown @@ -15,7 +15,7 @@ related: title: Configuration file --- -The `joaoapps_join` {% term integration %} exposes services from +The `joaoapps_join` {% term integration %} exposes actions from [Join](https://joaoapps.com/join). In Home Assistant, the Joaoapps Join features are divided up in two locations, the Join integration, and the Joaoapps Join notify platform. The notify platform allows us to send messages to Joaoapps Join devices, the integration @@ -61,7 +61,7 @@ device_names: required: false type: string name: - description: The name parameter is optional but needed if you want to use multiple notification platforms. The platform will be exposed as service `notify.<name>`. The name will default to `notify` if not supplied. See the [Notifications integration](/integrations/notify) for more details. + description: The name parameter is optional but needed if you want to use multiple notification platforms. The platform will be exposed as `notify.<name>` action. The name will default to `notify` if not supplied. See the [Notifications integration](/integrations/notify) for more details. required: false type: string {% endconfiguration %} @@ -81,7 +81,7 @@ notify: name: NAME2 ``` -The notify service has several optional parameters: `icon`, `smallicon`, `image`, `sound`, `url`, `notification_id`, `category`, `tts`, `tts_language` and `vibration`. +The notify action has several optional parameters: `icon`, `smallicon`, `image`, `sound`, `url`, `notification_id`, `category`, `tts`, `tts_language` and `vibration`. You can use them like so: ```yaml @@ -105,10 +105,10 @@ data: Sleep: ``` -The services exposed in the `joaoapps_join` integration can be used with the -service data described below: +The actions exposed in the `joaoapps_join` integration can be used with the +action data described below: -| Service | Data | +| Action | Data | | ---------------------------- | ------------------------------------------------------------------ | | joaoapps_join/ring | | | joaoapps_join/send_sms | `{"number":"5553334444", "message":"Hello!"}` | diff --git a/source/_integrations/jvc_projector.markdown b/source/_integrations/jvc_projector.markdown index 6546abff3fe7..15370d3e8f02 100644 --- a/source/_integrations/jvc_projector.markdown +++ b/source/_integrations/jvc_projector.markdown @@ -28,7 +28,7 @@ This integration is intended for the automation of any modern JVC Projector with ## Remote -The JVC Projector remote platform will create a [Remote](/integrations/remote/) entity for the device. This entity allows you to send the following commands via the [remote.send_command](/integrations/remote/) service. +The JVC Projector remote platform will create a [Remote](/integrations/remote/) entity for the device. This entity allows you to send the following commands via the [remote.send_command](/integrations/remote/) action. - `menu` - `up` diff --git a/source/_integrations/kaleidescape.markdown b/source/_integrations/kaleidescape.markdown index f0919231401c..809084ab4283 100644 --- a/source/_integrations/kaleidescape.markdown +++ b/source/_integrations/kaleidescape.markdown @@ -40,7 +40,7 @@ The Kaleidescape media player platform will create a [media player](/integration ## Remote -The Kaleidescape remote platform will create a [Remote](/integrations/remote/) entity for the device. This entity allows you to send the following commands via the [remote.send_command](/integrations/remote/) service. +The Kaleidescape remote platform will create a [Remote](/integrations/remote/) entity for the device. This entity allows you to send the following commands via the [remote.send_command](/integrations/remote/) action. - `select` - `up` @@ -54,7 +54,7 @@ The Kaleidescape remote platform will create a [Remote](/integrations/remote/) e - `go_movie_covers` - `menu_toggle` -A typical service call might look like the example below, which sends a command to the device to _select_ the currently highlighted item. +A typical action might look like the example below, which sends a command to the device to _select_ the currently highlighted item. ```yaml service: remote.send_command diff --git a/source/_integrations/keba.markdown b/source/_integrations/keba.markdown index 55b4768c0ccf..585804b53d9f 100644 --- a/source/_integrations/keba.markdown +++ b/source/_integrations/keba.markdown @@ -29,7 +29,7 @@ This {% term integration %} provides the following platforms: - Binary sensors: Online state, plug state, charging state and failsafe mode state. - Lock: Authorization (like with the RFID card). - Sensors: current set by the user, target energy set by the user, charging power, charged energy of the current session and total energy charged. -- Services: authorize, deauthorize, set energy target, set the maximum allowed current and manually update the states. More details can be found [here](/integrations/keba/#services). +- Actions: authorize, deauthorize, set energy target, set the maximum allowed current and manually update the states. More details can be found in the [actions](#actions) section. - Notify: Show a text on chargers with a built-in LED display. ## Configuration @@ -64,7 +64,7 @@ keba: type: boolean default: false failsafe_timeout: - description: Timeout of the failsafe mode in seconds. Allowed values are between 10 seconds and 600 seconds (this parameter is only used if failsafe mode is enabled). Make sure to call the `keba.set_curr` service regularly within this timeout period! + description: Timeout of the failsafe mode in seconds. Allowed values are between 10 seconds and 600 seconds (this parameter is only used if failsafe mode is enabled). Make sure to call the `keba.set_curr` action regularly within this timeout period! required: false type: integer default: 30 @@ -85,21 +85,21 @@ keba: default: 5 {% endconfiguration %} -## Services +## Actions -The `keba` integration offers several services. Using these services will change the state of your charging station. So use these services with care! +The Keba integration offers several actions. Using these actions will change the state of your charging station. So use these actions with care! ### Authorizing and Deauthorizing `keba.authorize` and `keba.deauthorize` -The charging station can be authorized and deauthorized via service calls (`keba.authorize` and `keba.deauthorize`) or via the lock integration that is created automatically for the charging station. In both cases the RFID tag from the configuration is used. +The charging station can be authorized and deauthorized using actions (`keba.authorize` and `keba.deauthorize`) or via the lock integration that is created automatically for the charging station. In both cases the RFID tag from the configuration is used. ### Start and Stop `keba.start` and `keba.stop` -The service `keba.start` and `keba.stop` controls the charging process if the car is already authorized. Technically it sends `ena 1` or `ena 0` commands to the charging station. +The `keba.start` and `keba.stop` actions control the charging process if the car is already authorized. Technically it sends `ena 1` or `ena 0` commands to the charging station. ### Set Target Energy `keba.set_energy` -The service `keba.set_energy` sets the target energy for the current session to the given energy attribute in kWh. Payload example: +The action `keba.set_energy` sets the target energy for the current session to the given energy attribute in kWh. Payload example: ```json { @@ -109,7 +109,7 @@ The service `keba.set_energy` sets the target energy for the current session to ### Maximum Current `keba.set_curr` -The service `keba.set_curr` sets the maximum current to the given current attribute in Ampere. Payload example: +The `keba.set_curr` action sets the maximum current to the given current attribute in Ampere. Payload example: ```json { @@ -119,11 +119,11 @@ The service `keba.set_curr` sets the maximum current to the given current attrib ### Request New Data `keba.request_data` -The service `keba.request_data` sends data update requests to the charging station. +The `keba.request_data` action sends data update requests to the charging station. ### Request New Data `keba.set_failsafe` -The service `keba.set_failsafe` sets the failsafe mode of the charging station. Payload example: +The `keba.set_failsafe` action sets the failsafe mode of the charging station. Payload example: ```json { @@ -148,7 +148,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: "`notify`" type: string @@ -156,7 +156,7 @@ name: ### Usage -The use of the notify service is [described here](/integrations/notify/). +The use of the notify action is [described here](/integrations/notify/). The `message` part of the event payload is shown on the display. Scrolling is performed if needed. A maximum of 23 characters can be shown. diff --git a/source/_integrations/keenetic_ndms2.markdown b/source/_integrations/keenetic_ndms2.markdown index 87c00786a4f3..1f13a037851b 100644 --- a/source/_integrations/keenetic_ndms2.markdown +++ b/source/_integrations/keenetic_ndms2.markdown @@ -21,4 +21,4 @@ Router running NDMS firmware versions 2.05 and up. It uses telnet connection so ## Configuration -To add Keenetic router to your installation, go to **Settings** -> **Devices & Services** in the UI, click the button with `+` sign and from the list of integrations select **Keenetic NDMS2 Router**. +To add a Keenetic router to your installation, go to **Settings** > **Devices & services** in the UI, click the button with `+` sign, and from the list of integrations, select **Keenetic NDMS2 Router**. diff --git a/source/_integrations/kef.markdown b/source/_integrations/kef.markdown index af7155490cf5..f9d70a4ddf12 100644 --- a/source/_integrations/kef.markdown +++ b/source/_integrations/kef.markdown @@ -94,26 +94,26 @@ media_player: volume_step: 0.05 ``` -## Services +## Actions Just like in the KEF Control app, we can change the digital signal processing (DSP) settings. -The speaker's current DSP settings are updated automatically each hour and after each service call. +The speaker's current DSP settings are updated automatically each hour and after each action. To update the settings manually, use `kef.update_dsp`. -### Service `kef.update_dsp` +### Action `kef.update_dsp` Update all DSP settings. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------- | | entity_id | No | The entity_id of the KEF speaker. | -### Service `kef.set_mode` +### Action `kef.set_mode` Set the mode of the speaker. When optional attributes are left out, the setting will be unchanged. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------- | | entity_id | No | The entity_id of the KEF speaker. | | desk_mode | Yes | "Desk mode" (`true` or `false`) | @@ -123,56 +123,56 @@ Set the mode of the speaker. When optional attributes are left out, the setting | sub_polarity | Yes | "Sub polarity" (`-` or `+`) | | bass_extension | Yes | "Bass extension" selector (`Less`, `Standard`, or `Extra`) | -### Service `kef.set_desk_db` +### Action `kef.set_desk_db` Set the "Desk mode" slider of the speaker in dB. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------- | | entity_id | No | The entity_id of the KEF speaker. | | db_value | No | Value of the slider (-6 to 0 with steps of 0.5) | -### Service `kef.set_wall_db` +### Action `kef.set_wall_db` Set the "Wall mode" slider of the speaker in dB. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------- | | entity_id | No | The entity_id of the KEF speaker. | | db_value | No | Value of the slider (-6 to 0 with steps of 0.5) | -### Service `kef.set_treble_db` +### Action `kef.set_treble_db` Set desk the "Treble trim" slider of the speaker in dB. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------- | | entity_id | No | The entity_id of the KEF speaker. | | db_value | No | Value of the slider (-2 to 2 with steps of 0.5) | -### Service `kef.set_high_hz` +### Action `kef.set_high_hz` Set the "High-pass mode" slider of the speaker in Hz. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------- | | entity_id | No | The entity_id of the KEF speaker. | | hz_value | No | Value of the slider (50 to 120 with steps of 5) | -### Service `kef.set_low_hz` +### Action `kef.set_low_hz` Set the "Sub out low-pass frequency" slider of the speaker in Hz. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------- | | entity_id | No | The entity_id of the KEF speaker. | | hz_value | No | Value of the slider (40 to 250 with steps of 5) | -### Service `kef.set_sub_db` +### Action `kef.set_sub_db` Set the "Sub gain" slider of the speaker in dB. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------- | | entity_id | No | The entity_id of the KEF speaker. | | db_value | No | Value of the slider (-10 to 10 with steps of 1) | diff --git a/source/_integrations/keymitt_ble.markdown b/source/_integrations/keymitt_ble.markdown index 12dd280adc87..eba822773083 100644 --- a/source/_integrations/keymitt_ble.markdown +++ b/source/_integrations/keymitt_ble.markdown @@ -33,13 +33,13 @@ Please note, that the devices cannot remain paired to the MicroBot application f This Integration is for the MicroBot Push only. The Keymitt lock is not supported. -### Service `keymitt_ble.calibrate` +### Action `keymitt_ble.calibrate` -The Calibration service will locally set the MicroBot Push depth, duration, and mode. +The Calibration action will locally set the MicroBot Push depth, duration, and mode. -Please note: The push arm will extend or retract (depending on the mode defined) after the service call is invoked. The mode and depth will be demonstrated, but not the duration. The setting is, however, stored and can be confirmed by manually operating the device. +Please note: The push arm will extend or retract (depending on the mode defined) after the action is performed. The mode and depth will be demonstrated, but not the duration. The setting is, however, stored and can be confirmed by manually operating the device. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------- | | `depth` | yes | How far (in percent) to extend the push arm. | | `duration` | yes | Duration (in seconds) to hold the arm extended. | diff --git a/source/_integrations/knocki.markdown b/source/_integrations/knocki.markdown new file mode 100644 index 000000000000..cbf3518503f4 --- /dev/null +++ b/source/_integrations/knocki.markdown @@ -0,0 +1,26 @@ +--- +title: Knocki +description: Instructions on how to setup Knocki devices in Home Assistant. +ha_category: + - Event +ha_config_flow: true +ha_release: 2024.7 +ha_iot_class: Cloud Push +ha_codeowners: + - '@joostlek' + - '@jgatto1' +ha_domain: knocki +ha_platforms: + - event +ha_integration_type: device +--- + +The **Knocki** {% term integration %} can receive events for the triggers set up from your [Knocki devices](https://knocki.com/). + +## Prerequisites + +To use the Knocki integration, you need a Knocki account. + +Once you set a trigger in the app, it will show up in Home Assistant to use. + +{% include integrations/config_flow.md %} diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown index 335133c51414..2fde7fdeb6e8 100644 --- a/source/_integrations/knx.markdown +++ b/source/_integrations/knx.markdown @@ -162,11 +162,9 @@ The KNX integration provides its own trigger platform which can be used in autom The `knx.telegram` trigger can be used to trigger automations on incoming or outgoing KNX telegrams. -<div class='note'> - +{% note %} This trigger is also provided as a device trigger by the `KNX Interface` device. It supports setting the options in the automation builder UI, but doesn't support setting a specific <abbr title="data point type">DPT</abbr> (`type`) to decode the payload as it always relies on project data. - -</div> +{% endnote %} {% configuration %} destination: @@ -284,11 +282,9 @@ context: null ## Events -<div class='note'> - +{% tip %} For automation triggers, it is recommended to use the [knx.telegram](#telegram-trigger) trigger instead of `knx_event`. - -</div> +{% endtip %} ```yaml knx: @@ -324,16 +320,16 @@ Every telegram that matches an address pattern with its destination field will b - `telegramtype` the APCI service of the telegram. "GroupValueWrite", "GroupValueRead" or "GroupValueResponse" generate a knx_event. - `value` contains the decoded payload value if `type` is configured for the address. Will be `None` for "GroupValueRead" telegrams. -## Services +## Actions -In order to directly interact with the KNX bus, you can use the following services: +In order to directly interact with the KNX bus, you can use the following actions: ### Send ```txt Domain: knx -Service: send -Service Data: {"address": "1/0/15", "payload": 0, "type": "temperature"} +Action: send +Data: {"address": "1/0/15", "payload": 0, "type": "temperature"} ``` {% configuration %} @@ -354,13 +350,13 @@ response: ### Read -You can use the `homeassistant.update_entity` service call to issue GroupValueRead requests for all `*state_address` of an entity. -To manually send GroupValueRead requests, use the `knx.read` service. The response can be used in automations by the `knx.telegram` trigger and it will be processed in KNX entities. +You can use the `homeassistant.update_entity` action call to issue GroupValueRead requests for all `*state_address` of an entity. +To manually send GroupValueRead requests, use the `knx.read` action. The response can be used in automations by the `knx.telegram` trigger and it will be processed in KNX entities. ```txt Domain: knx -Service: read -Service Data: {"address": "1/0/15"} +Action: read +Data: {"address": "1/0/15"} ``` {% configuration %} @@ -396,7 +392,7 @@ automation: ### Register event -The `knx.event_register` service can be used to register (or unregister) group addresses to fire `knx_event` Events. Events for group addresses configured in the `event` key in `configuration.yaml` cannot be unregistered. See [knx_event](#events) +The `knx.event_register` action can be used to register (or unregister) group addresses to fire `knx_event` Events. Events for group addresses configured in the `event` key in `configuration.yaml` cannot be unregistered. See [knx_event](#events) {% configuration %} address: @@ -416,7 +412,7 @@ type: ### Register exposure -The `knx.exposure_register` service can be used to register (or unregister) exposures to the KNX bus. Exposures defined in `configuration.yaml` can not be unregistered. Per address only one exposure can be registered. See [expose](#exposing-entity-states-entity-attributes-or-time-to-knx-bus) +The `knx.exposure_register` action can be used to register (or unregister) exposures to the KNX bus. Exposures defined in `configuration.yaml` can not be unregistered. Per address only one exposure can be registered. See [expose](#exposing-entity-states-entity-attributes-or-time-to-knx-bus) {% configuration %} remove: @@ -431,11 +427,9 @@ remove: KNX integration is able to expose entity states or attributes to KNX bus. The integration will broadcast any change of the exposed value to the KNX bus and answer read requests to the specified group address. It is also possible to expose the current time and date. These are sent to the bus every hour. -<div class='note'> - -Expose is only triggered on state changes. If you need periodical telegrams, use an automation with the `knx.send` service to send the value to the bus. - -</div> +{% tip %} +Expose is only triggered on state changes. If you need periodical telegrams, use an automation with the `knx.send` action to send the value to the bus. +{% endtip %} {% raw %} @@ -654,13 +648,11 @@ action: ## Button -The KNX button platform allows to send concurrent predefined values via the frontend or a platform service. When a user presses the button, the assigned generic raw payload is sent to the KNX bus. - -<div class='note'> +The KNX button platform allows to send concurrent predefined values via the frontend or an action. When a user presses the button, the assigned generic raw payload is sent to the KNX bus. +{% tip %} Telegrams received on the KNX bus for the group address of a button are not reflected in a new button state. Use the `knx.telegram` trigger if you want to automate on a specific payload received on a group address. - -</div> +{% endtip %} ```yaml # Example configuration.yaml entry @@ -678,12 +670,10 @@ knx: type: temperature ``` -<div class='note'> - +{% important %} When `type` is used `value` is required, `payload` is invalid. When `payload_length` is used `value` is invalid. - -</div> +{% endimportant %} {% configuration %} name: @@ -968,13 +958,11 @@ entity_category: The KNX cover platform is used as an interface to KNX covers. -<div class='note'> - +{% note %} Unlike most KNX devices, Home Assistant defines 0% as closed and 100% as fully open in regards to covers. The corresponding value inversion is done internally by the KNX integration. Home Assistant will, by default, `close` a cover by moving it in the `DOWN` direction in the KNX nomenclature, and `open` a cover by moving it in the `UP` direction. - -</div> +{% endnote %} To use your KNX covers in your installation, add the following lines to your top level [KNX Integration](/integrations/knx) configuration key in `configuration.yaml`: @@ -1066,19 +1054,15 @@ entity_category: The KNX date platform allows to send date values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -<div class='note'> - +{% note %} Date entities without a `state_address` will restore their last known state after Home Assistant was restarted. Dates that have a `state_address` configured request their current state from the KNX bus. +{% endnote %} -</div> - -<div class='note'> - +{% note %} DPT 11.001 covers the range 1990 to 2089. Year values outside of this range are not allowed. - -</div> +{% endnote %} ```yaml # Example configuration.yaml entry @@ -1136,20 +1120,16 @@ entity_category: The KNX datetime platform allows to send datetime values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -<div class='note'> - +{% note %} Date entities without a `state_address` will restore their last known state after Home Assistant was restarted. DateTimes that have a `state_address` configured request their current state from the KNX bus. +{% endnote %} -</div> - -<div class='note'> - +{% note %} System timezone is used as DPT 19.001 doesn't provide timezone information. Year values outside of the range 1900 to 2155 are invalid. - -</div> +{% endnote %} ```yaml # Example configuration.yaml entry @@ -1525,7 +1505,7 @@ entity_category: default: None {% endconfiguration %} -### Example service call +### Example action ```yaml service: notify.send_message @@ -1538,13 +1518,11 @@ data: The KNX number platform allows to send generic numeric values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -<div class='note'> - +{% note %} Number entities without a `state_address` will restore their last known state after Home Assistant was restarted. Numbers that have a `state_address` configured request their current state from the KNX bus. - -</div> +{% endnote %} ```yaml # Example configuration.yaml entry @@ -1650,13 +1628,11 @@ entity_category: The KNX select platform allows the user to define a list of values that can be selected via the frontend and can be used within conditions of automation. When a user selects a new item, the assigned generic raw payload is sent to the KNX bus. A received telegram updates the state of the select entity. It can optionally respond to read requests from the KNX bus. -<div class='note'> - +{% note %} Select entities without a `state_address` will restore their last known state after Home Assistant was restarted. Selects that have a `state_address` configured request their current state from the KNX bus. - -</div> +{% endnote %} ```yaml # Example configuration.yaml entry @@ -1753,7 +1729,7 @@ entity_category: The KNX sensor platform allows you to monitor [KNX](https://www.knx.org/) sensors. -Sensors are read-only. To write to the KNX bus configure a [Number](#number), an exposure [KNX Integration Expose](/integrations/knx/#exposing-entity-states-entity-attributes-or-time-to-knx-bus) or use the `knx.send` service. +Sensors are read-only. To write to the KNX bus configure a [Number](#number), an exposure [KNX Integration Expose](/integrations/knx/#exposing-entity-states-entity-attributes-or-time-to-knx-bus) or use the `knx.send` action. ```yaml # Example configuration.yaml entry @@ -2064,13 +2040,11 @@ Switches that have a `state_address` configured request their current state from The KNX text platform allows to send text values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -<div class='note'> - +{% note %} Text entities without a `state_address` will restore their last known state after Home Assistant was restarted. Texts that have a `state_address` configured request their current state from the KNX bus. - -</div> +{% endnote %} ```yaml # Example configuration.yaml entry @@ -2126,19 +2100,15 @@ entity_category: The KNX time platform allows to send time values to the KNX bus and update its state from received telegrams. It can optionally respond to read requests from the KNX bus. -<div class='note'> - +{% note %} Time entities without a `state_address` will restore their last known state after Home Assistant was restarted. Times that have a `state_address` configured request their current state from the KNX bus. +{% endnote %} -</div> - -<div class='note'> - +{% note %} The `day` field of the time telegram will always be set to 0 (`no day`). - -</div> +{% endnote %} ```yaml # Example configuration.yaml entry @@ -2326,7 +2296,7 @@ logger: xknx.state_updater: warning # provides information about the state updater ``` -You can use the service `logger.set_level` to change the log level of a handler on a running instance. +You can use the `logger.set_level` action to change the log level of a handler on a running instance. {% my developer_call_service badge service="logger.set_level" %} ### Group address can not be read diff --git a/source/_integrations/kodi.markdown b/source/_integrations/kodi.markdown index ff019861220f..394e234a5cf6 100644 --- a/source/_integrations/kodi.markdown +++ b/source/_integrations/kodi.markdown @@ -66,13 +66,13 @@ automation: - service: script.kodi_turn_off ``` -### Services +### Actions -#### Service `kodi.add_to_playlist` +#### Action `kodi.add_to_playlist` Add music to the default playlist (i.e., playlistid=0). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Name(s) of the Kodi entities where to add the media. | | `media_type` | yes | Media type identifier. It must be one of SONG or ALBUM. | @@ -80,11 +80,11 @@ Add music to the default playlist (i.e., playlistid=0). | `media_name` | no | Optional media name for filtering media. Can be 'ALL' when `media_type` is 'ALBUM' and `artist_name` is specified, to add all songs from one artist. | | `artist_name` | no | Optional artist name for filtering media. | -#### Service `kodi.call_method` +#### Action `kodi.call_method` Call a [Kodi JSON-RPC API](https://kodi.wiki/?title=JSON-RPC_API) method with optional parameters. Results of the Kodi API call will be redirected in a Home Assistant event: `kodi_call_method_result`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------- | | `entity_id` | no | Name(s) of the Kodi entities where to run the API method. | | `method` | yes | Name of the Kodi JSON-RPC API method to be called. | @@ -92,12 +92,12 @@ Call a [Kodi JSON-RPC API](https://kodi.wiki/?title=JSON-RPC_API) method with op ### Event triggering -When calling the `kodi.call_method` service, if the Kodi JSON-RPC API returns data, when received by Home Assistant it will fire a `kodi_call_method_result` event on the event bus with the following `event_data`: +When calling the `kodi.call_method` action, if the Kodi JSON-RPC API returns data, when received by Home Assistant it will fire a `kodi_call_method_result` event on the event bus with the following `event_data`: ```yaml entity_id: "<Kodi media_player entity_id>" result_ok: <boolean> -input: <input parameters of the service call> +input: <input parameters of the action> result: <data received from the Kodi API> ``` @@ -107,7 +107,7 @@ The following scripts can be used in automations for turning on/off your Kodi in #### Turn on Kodi with Wake on LAN -With this configuration, when calling `media_player/turn_on` on the Kodi device, a _magic packet_ will be sent to the specified MAC address. To use this service, first you need to configuration the [`wake_on_lan`](/integrations/wake_on_lan) integration in Home Assistant, which is achieved simply by adding `wake_on_lan:` to your {% term "`configuration.yaml`" %}. +With this configuration, when calling `media_player/turn_on` on the Kodi device, a _magic packet_ will be sent to the specified MAC address. To use this action, first you need to configure the [`wake_on_lan`](/integrations/wake_on_lan) integration in Home Assistant, which is achieved simply by adding `wake_on_lan:` to your {% term "`configuration.yaml`" %}. ```yaml script: @@ -220,13 +220,11 @@ script: command: standby ``` -<div class='note'> - +{% important %} This example and the following requires to have the [script.json-cec](https://github.com/joshjowen/script.json-cec) plugin installed on your Kodi player. It'll also expose the endpoints standby, toggle and activate without authentication on your Kodi player. Use this with caution. +{% endimportant %} -</div> - -### Kodi services samples +### Kodi action samples #### Simple script to turn on the PVR in some channel as a time function @@ -319,7 +317,7 @@ notify: {% configuration %} name: - description: Name displayed in the frontend. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Name displayed in the frontend. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false type: string host: diff --git a/source/_integrations/konnected.markdown b/source/_integrations/konnected.markdown index 36df0a6f4ed8..96a76e90ad28 100644 --- a/source/_integrations/konnected.markdown +++ b/source/_integrations/konnected.markdown @@ -22,19 +22,16 @@ ha_integration_type: integration The `konnected` integration lets you connect wired sensors and switches to a Konnected Alarm Panel, or NodeMCU ESP8226 based device running the [open source Konnected software](https://github.com/konnected-io/konnected-security). Reuse the wired sensors and siren from an old or pre-wired alarm system installation and integrate them directly into Home Assistant. -<div class='note warning'> - -This integration is deprecated in favor of [Konnected's ESPHome firmware](https://support.konnected.io/add-a-konnected-device-to-home-assistant-with-esphome) and will not receive updates. ESPHome connects locally and natively to Home Assistant and doesn't need this custom integration. If you are getting started with a Konnected device, do not use this integration. Instead, flash your device with ESPHome-based firmware for the [Konnected Alarm Panel](https://install.konnected.io/esphome) and [Garage Door Opener](https://support.konnected.io/installing-the-garage-door-opener-with-home-assistant). +{% warning %} -</div> +This integration is deprecated in favor of [Konnected's ESPHome firmware](https://support.konnected.io/add-a-konnected-device-to-home-assistant-with-esphome) and will not receive updates. ESPHome connects locally and natively to Home Assistant and doesn't need this custom integration. If you are getting started with a Konnected device, do not use this integration. Instead, flash your device with ESPHome-based firmware for the [Konnected Alarm Panel](https://install.konnected.io/esphome) and [Garage Door Opener](https://support.konnected.io/installing-the-garage-door-opener-with-home-assistant). +{% endwarning %} Visit the [Konnected.io website](https://konnected.io) for more information about the Konnected Alarm Panel board and compatible hardware. -<div class='note info'> - +{% important %} Always ensure your panel is running the [latest firmware](https://help.konnected.io/support/solutions/folders/32000035066) before connecting it to Home Assistant. - -</div> +{% endimportant %} The integration currently supports the following device types in Home Assistant: @@ -44,33 +41,29 @@ The integration currently supports the following device types in Home Assistant: This integration uses the [SSDP](/integrations/ssdp) integration, which must be enabled for device discovery to work. If you don't want to use SSDP you'll need to manually provide the IP and Port information for each Konnected Panel. The IP/Port info can be found using the Konnected mobile app. -<div class='note info'> - +{% note %} Konnected devices communicate with Home Assistant over your local LAN -- there is no cloud component! For best performance we recommend allowing unsecured HTTP API traffic between Konnected devices and Home Assistant on your LAN. This means that you should not use the `http` integration to serve SSL/TLS certificates. Instead, use a proxy like NGINX or Caddy to serve SSL/TLS. [Read more.](https://help.konnected.io/support/solutions/articles/32000023964-set-up-hass-io-with-secure-remote-access-using-duckdns-and-nginx-proxy) - -</div> +{% endnote %} ## Configuration ### Web Interface -Starting with 0.106.0 Home Assistant requires UI based configuration of Konnected via **Settings** -> **Devices & Services** in the Home Assistant (web) frontend. If you have Konnected Alarm Panels on your LAN, or in your configuration.yaml, you will see one or more **Konnected.io** entries appear in the **Discovered** integrations list. +Starting with 0.106.0 Home Assistant requires UI-based configuration of Konnected via **Settings** > **Devices & services** in the Home Assistant (web) frontend. If you have Konnected Alarm Panels on your LAN, or in your configuration.yaml, you will see one or more **Konnected.io** entries appear in the **Discovered** integrations list. Selecting one of these discovered panels will guide you through connecting and configuring the panel. If your panel was discovered via SSDP, you shouldn't need any information to complete configuration - simply confirm that the information displayed is correct. If the UI prompts you for IP/Port, you'll need to enter it. IP/Port info can be found using the Konnected mobile app. -<div class='note info'> - +{% note %} If you have an existing `configuration.yaml` completing the UI configuration will do a one time import of the settings contained in `configuration.yaml`. Once the import creates a **Configured** integration the Konnected section of the `configuration.yaml` is no longer used - it is recommended to remove the `konnected` section of `configuration.yaml` and after the import occurs. Any future changes to settings should occur via the settings provided in the Home Assistant web interface. -If you want to retain `configuration.yaml` and need to re-import any changes or updates you will need to delete the entry in **Settings** -> **Devices & Services** -> **Configured** and repeat the UI configuration for that device. - -</div> +If you want to retain `configuration.yaml` and need to re-import any changes or updates, you will need to delete the entry in **Settings** > **Devices & services** > **Configured** and repeat the UI configuration for that device. +{% endnote %} -Once configuration is completed you'll see a Konnected.io entry in **Settings** -> **Devices & Services** -> **Configured**. If you imported settings from `configuration.yaml` you are now done! If you are setting up a new Konnected Alarm Panel or modifying settings, you'll need to utilize the settings UI to configure zone behavior. +Once configuration is completed, you'll see a Konnected.io entry in **Settings** > **Devices & services** > **Configured**. If you imported settings from `configuration.yaml`, you are now done! If you are setting up a new Konnected Alarm Panel or modifying settings, you'll need to utilize the settings UI to configure zone behavior. #### Using Settings UI to Configure Zone Behavior -The settings for each panel can be accessed by selecting the entry in **Settings** -> **Devices & Services** -> **Configured** and then clicking on the gear icon in the upper right corner. You can reconfigure these settings at any time and once completed the settings will be immediately applied. +The settings for each panel can be accessed by selecting the entry in **Settings** > **Devices & services** > **Configured** and then clicking on the gear icon in the upper right corner. You can reconfigure these settings at any time, and once completed, the settings will be immediately applied. The settings UI starts by having you configure the general behavior of each zone. You need to specify `Disabled`, `Binary Sensor`, `Digital Sensor`, or `Switchable Output` for each zone. After that, you'll be prompted, for each zone that is not disabled, to configure details of the zones' behavior. All zones will allow entry of a Name. Additional fields depend on how you configured the general behavior of the zone. **Note some zones do not support all behaviors. The UI will reflect specific options available to each zone.** @@ -316,7 +309,7 @@ konnected: ## Unique IDs and the Entity Registry -Beginning in Home Assistant release 0.90, unique IDs are generated for each sensor or switch entity. This enables end users to modify the entity names and entity IDs through the Home Assistant UI at **Settings** -> **Devices & Services** -> **Entities**. +Beginning in Home Assistant release 0.90, unique IDs are generated for each sensor or switch entity. This enables end users to modify the entity names and entity IDs through the Home Assistant UI at **Settings** -> **Devices & services** -> **Entities**. Unique IDs are internally generated as follows: diff --git a/source/_integrations/kostal_plenticore.markdown b/source/_integrations/kostal_plenticore.markdown index c0a1f7d27623..51438158650f 100644 --- a/source/_integrations/kostal_plenticore.markdown +++ b/source/_integrations/kostal_plenticore.markdown @@ -28,9 +28,9 @@ The integration uses the REST-API interface which is also used by the integrated The integration disables most of the sensors per default. You can enable it in the *Entity* page. The sensors are split into two sets, one for the process data and one for the setting values. -<div class='note'> +{% note %} The Plenticore inverter provides much more data endpoints, some of them are also dependent of the version of the firmware. If you are missing process data values, open an issue with the necessary information or make an pull request. -</div> +{% endnote %} ### Process Data Sensors @@ -122,9 +122,9 @@ The following sensors are available in the library: | Energy to Grid Total | kWh | Energy fed into the grid in total, since the system was installed. | | Sum power of all PV DC inputs | W | Total sum of power provided by all PV inputs together. | -<div class='note'> +{% note %} The inverter does not provide any data about the energy that is fed into the grid directly, but the `pykoplenti` library provides it via virtual process data. -</div> +{% endnote %} #### Configuration of the energy dashboard @@ -136,9 +136,9 @@ The following sensors can be used in the [energy dashboard](/docs/energy/): | Solar production | Energy PV1 Total, Energy PV2 Total, Energy PV3 Total | | Battery systems | Battery Discharge Total, Battery Charge from PV Total | -<div class='note'> +{% note %} Some of the energy is measured on the DC side and some on the AC side, so the values may differ slightly due to losses between DC and AC. -</div> +{% endnote %} ### Settings Sensors @@ -151,9 +151,9 @@ The following sensors are available in the library: | Battery Strategy | | RW | Battery strategy. | | Shadow Management | | RW | PV string shadow management. | -<div class='note'> +{% note %} Setting values change less often, therefore these sensors are only polled every 5 minutes. -</div> +{% endnote %} #### Battery Strategy diff --git a/source/_integrations/lacrosse_view.markdown b/source/_integrations/lacrosse_view.markdown index 8b71a65d4012..485826136d30 100644 --- a/source/_integrations/lacrosse_view.markdown +++ b/source/_integrations/lacrosse_view.markdown @@ -19,11 +19,9 @@ ha_integration_type: integration It is also available in Europe as [**TFA View**](https://www.tfa-dostmann.de/en/produkte/weather-stations/wifi-weather-stations/). -<div class='note'> - +{% tip %} If you are looking for an integration for [**Jeelink LaCrosse sensors**](/integrations/lacrosse), you can find that integration [**here**](/integrations/lacrosse). - -</div> +{% endtip %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/lamarzocco.markdown b/source/_integrations/lamarzocco.markdown index 2f364a724e38..279883f2e40f 100644 --- a/source/_integrations/lamarzocco.markdown +++ b/source/_integrations/lamarzocco.markdown @@ -11,6 +11,7 @@ ha_domain: lamarzocco ha_platforms: - binary_sensor - button + - calendar - diagnostics - number - select @@ -81,6 +82,7 @@ Host: |-------------|-------------| ---------------------- | ------- | | Water tank empty | Indicates whether the water tank needs a refill. | all | - | | Brewing active | Is on if you are in the process of making coffee. | all | Only available when the *Host* was set during component configuration. | +| Backflush enabled | Is on if you started the backflushing process. | all | - | ## Sensors diff --git a/source/_integrations/lametric.markdown b/source/_integrations/lametric.markdown index 8905dd99eb8b..7b442ac97c99 100644 --- a/source/_integrations/lametric.markdown +++ b/source/_integrations/lametric.markdown @@ -34,15 +34,15 @@ ha_quality_scale: platinum {% include integrations/config_flow.md %} -## Services +## Actions -The LaMetric integration provides services to interact with your LaMetric -device(s). Those service can be called in, for example, automations. +The LaMetric integration provides actions to interact with your LaMetric +device(s). Those action can be used in, for example, automations. -### Service `lametric.chart` +### Action `lametric.chart` The {% my developer_call_service service="lametric.chart" title="`lametric.chart`" %} -service allows you to display a little chart to your LaMetric. +action allows you to display a little chart to your LaMetric. {% my developer_call_service badge service="lametric.chart" %} @@ -76,10 +76,10 @@ sound: type: string {% endconfiguration %} -### Service `lametric.message` +### Action `lametric.message` The {% my developer_call_service service="lametric.message" title="`lametric.message`" %} -service allows you to send a message to your LaMetric. These +action allows you to send a message to your LaMetric. These messages can be enrichted with icons and sounds. {% my developer_call_service badge service="lametric.message" %} @@ -124,11 +124,11 @@ You can send notifications to your LaMetric device using the [Notifications](/integrations/notify) integration. Each LaMetric device added to your Home Assistant will have its own -`notify.` service. The service name matches the name of your device +`notify.` actions. The action name matches the name of your device as shown in your LaMetric account. For example, if you have a device -called "My LaMetric", the service would become `notify.my_lametric`. +called "My LaMetric", the action would become `notify.my_lametric`. -The notification service call against an LaMetric device can take the +The notification performed action against an LaMetric device can take the following, additional, optional parameters: {% configuration "notification" %} @@ -184,7 +184,7 @@ To add a notification sound, icon, cycles, or priority override, ## List of notification sounds The following notification sounds can be used with the `sound` parameter on -notify service calls: +notify action: - `alarm1` - `alarm10` diff --git a/source/_integrations/lannouncer.markdown b/source/_integrations/lannouncer.markdown index 377f499d6bf7..5a4b33824775 100644 --- a/source/_integrations/lannouncer.markdown +++ b/source/_integrations/lannouncer.markdown @@ -29,7 +29,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string @@ -56,7 +56,7 @@ More information can be found [here](https://web.archive.org/web/20200928053944/ Lannouncer supports two types of messages. -Spoken messages is the default method (`speak`). You just invoke the `notify` service with the following JSON and the device will speak out the specified message. +Spoken messages is the default method (`speak`). You just invoke the `notify` action with the following JSON and the device will speak out the specified message. ```json { @@ -86,8 +86,8 @@ You can also request to play a configured additional soundfiles (`FILE1`, `FILE2 } ``` -<div class='note info'> +{% note %} The free version only supports one additional soundfile. -</div> +{% endnote %} To use notifications, please see the [getting started with automation page](/getting-started/automation/). diff --git a/source/_integrations/lawn_mower.markdown b/source/_integrations/lawn_mower.markdown index 42e870ace45b..4a60c8da879b 100644 --- a/source/_integrations/lawn_mower.markdown +++ b/source/_integrations/lawn_mower.markdown @@ -15,32 +15,32 @@ The lawn mower integration allows the control of robotic lawn mowers to be refle {% include integrations/building_block_integration.md %} -## Services +## Actions -Available services: `start_mowing`, `pause` and `dock`. +Available actions: `start_mowing`, `pause` and `dock`. -Before calling one of these services, make sure your lawn_mower platform supports it. +Before calling one of these actions, make sure your lawn_mower platform supports it. -### Service `lawn_mower.start_mowing` +### Action `lawn_mower.start_mowing` Start or resume a mowing task. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific lawn_mower. Use `entity_id: all` to target all. | -### Service `lawn_mower.pause` +### Action `lawn_mower.pause` Pause a mowing task. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific lawn_mower. Use `entity_id: all` to target all. | -### Service `lawn_mower.dock` +### Action `lawn_mower.dock` Tell the lawn_mower to return to dock. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific lawn_mower. Use `entity_id: all` to target all. | diff --git a/source/_integrations/lawn_mower.mqtt.markdown b/source/_integrations/lawn_mower.mqtt.markdown index 315bdc458280..61766ae84fb9 100644 --- a/source/_integrations/lawn_mower.mqtt.markdown +++ b/source/_integrations/lawn_mower.mqtt.markdown @@ -121,7 +121,7 @@ dock_command_template: required: false type: template dock_command_topic: - description: The MQTT topic that publishes commands when the service `lawn_mower.dock` service call is executed. The value `dock` is published when the service is called. Use a `dock_command_template` to publish a custom format. + description: The MQTT topic that publishes commands when the `lawn_mower.dock` action is performed. The value `dock` is published when the action is used. Use a `dock_command_template` to publish a custom format. required: false type: string enabled_by_default: @@ -168,7 +168,7 @@ pause_command_template: required: false type: template pause_command_topic: - description: The MQTT topic that publishes commands when the service `lawn_mower.pause` service call is executed. The value `pause` is published when the service is called. Use a `pause_command_template` to publish a custom format. + description: The MQTT topic that publishes commands when the `lawn_mower.pause` action is performed. The value `pause` is published when the action is used. Use a `pause_command_template` to publish a custom format. required: false type: string qos: @@ -181,7 +181,7 @@ start_mowing_template: required: false type: template start_mowing_command_topic: - description: The MQTT topic that publishes commands when the service `lawn_mower.start_mowing` service call is executed. The value `start_mowing` is published when the service is called. Use a `start_mowing_command_template` to publish a custom format. + description: The MQTT topic that publishes commands when the `lawn_mower.start_mowing` action is performed. The value `start_mowing` is published when the action used. Use a `start_mowing_command_template` to publish a custom format. required: false type: string retain: @@ -195,11 +195,9 @@ unique_id: type: string {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Example diff --git a/source/_integrations/lcn.markdown b/source/_integrations/lcn.markdown index eaf160486186..4473ea78c244 100644 --- a/source/_integrations/lcn.markdown +++ b/source/_integrations/lcn.markdown @@ -41,13 +41,11 @@ There is currently support for the following device types within Home Assistant: - [Sensor](#sensor) - [Switch](#switch) -<div class='note'> - - The implemented platforms do not cover the whole functionality of the LCN system. - Therefore the `lcn` integration offers a variety of [events](#events), [device triggers](#device-triggers) and [service calls](#services). - They are ideal to be used in automation scripts or for the `template` platforms. - -</div> +{% note %} +The implemented platforms do not cover the whole functionality of the LCN system. +Therefore the `lcn` integration offers a variety of [events](#events), [device triggers](#device-triggers) and [actions](#actions). +They are ideal to be used in automation scripts or for the `template` platforms. +{% endnote %} ## Configuration @@ -366,7 +364,7 @@ Leading zeroes in the segment id or module/group id can be omitted. If the `conn ## LCN constants -The platforms and service calls use several predefined constants as parameters. +The platforms and actions use several predefined constants as parameters. ### Ports @@ -438,11 +436,9 @@ This platform depends on the correct configuration of the module's regulators, w You need to specify at least the variable for the current temperature and a setpoint variable for the target temperature. If the control is set lockable, the regulator can be turned on/off. -<div class='note'> - +{% tip %} If you intend to leave the regulation to Home Assistant, you should consider using the [Generic Thermostat](/integrations/generic_thermostat/) in conjunction with [LCN Sensor](#sensor) and [LCN Switch](#switch). - -</div> +{% endtip %} ### Cover @@ -453,11 +449,10 @@ The configuration allows the optional definition of reverse time. This is the ti The reverse time should only be defined when using the [MOTOR_PORT](#ports) value `OUTPUTS`. For all other configuration, the reverse time has to be defined in the LCN Pro software. For the reverse time, you may choose one of the following constants: `RT70` (70ms), `RT600` (600ms), `RT1200` (1,2s). -<p class='note'> +{% important %} If you are using the module's output ports for motor control, ensure that you have configured the output ports as motor controllers in the LCN Pro software! Otherwise, the output ports are not mutually interlocked and you run the risk of destroying the motor. -</p> - +{% endimportant %} ### Light @@ -483,12 +478,10 @@ The `lcn` sensor platform allows the monitoring of the following [LCN](https://w The sensor can be used in automation scripts or in conjunction with `template` platforms. -<div class='note'> - - Ensure that the LCN module is configured properly to provide the requested value. - Otherwise, the module might show unexpected behavior or return error messages. - -</div> +{% important %} +Ensure that the LCN module is configured properly to provide the requested value. +Otherwise, the module might show unexpected behavior or return error messages. +{% endimportant %} ### Switch @@ -556,24 +549,20 @@ Alternatively, you can use the corresponding [device triggers](#device-triggers) Examples can be found in the [event section](#events). -<div class='note'> - - Only commands sent from physical buttons of a module are evaluated. The "Test command" button in the LCN-PRO software - is not evaluated and therefore cannot be used for testing purposes. - -</div> +{% note %} +Only commands sent from physical buttons of a module are evaluated. The "Test command" button in the LCN-PRO software +is not evaluated and therefore cannot be used for testing purposes. +{% endnote %} ## Events There are several functionalities of the LCN system which are not exposed as regular entities by the integration, but as events. Examples are button presses from remote controls (transmitters), transponder findings, fingerprint sensors and so called *send keys* events. -<div class='note'> - - If you find it difficult to deal with events in scripted automations, you can also use [device triggers](#device-triggers) - which offer automation design via the UI. - -</div> +{% tip %} +If you find it difficult to deal with events in scripted automations, you can also use [device triggers](#device-triggers) +which offer automation design via the UI. +{% endtip %} All events have some common attributes in their `event_data` which identify the sending LCN hardware module (e.g., the module the transponder is connected to): @@ -714,16 +703,16 @@ supposed to cause the event in the device list. You may select the trigger type attributes. If an attribute is optional it is considered as a supplementary filter for the trigger. For an explanation of the attributes refer to the corresponding [events](#events). -## Services +## Actions -In order to directly interact with the LCN system, and invoke commands which are not covered by the implemented platforms, the following service calls can be used. -Refer to the [Services Calls](/docs/scripts/service-calls) page for examples on how to use them. +In order to directly interact with the LCN system, and invoke commands which are not covered by the implemented platforms, the following actions can be used. +Refer to the [Performing actions](/docs/scripts/service-calls) page for examples on how to use them. -### Service: `output_abs` +### Action: `output_abs` Set absolute brightness of output port in percent. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | --------------------------------- | --------------------- | | `address` | No | [LCN address](#lcn-addresses) | | `output` | No | Output port of module | [OUTPUT_PORT](#ports) | @@ -741,11 +730,11 @@ data: transition: 0 ``` -### Service: `output_rel` +### Action: `output_rel` Set relative brightness of output port in percent. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | --------------------------------- | --------------------- | | `address` | No | [LCN address](#lcn-addresses) | | `output` | No | Output port of module | [OUTPUT_PORT](#ports) | @@ -762,11 +751,11 @@ data: brightness: 30 ``` -### Service: `output_toggle` +### Action: `output_toggle` Toggle output port. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | --------------------------------- | --------------------- | | `address` | No | [LCN address](#lcn-addresses) | | `output` | No | Output port of module | [OUTPUT_PORT](#ports) | @@ -782,14 +771,14 @@ data: transition: 0 ``` -### Service: `relays` +### Action: `relays` Set the relays status. The relays states are defined as a string with eight characters. Each character represents the state change of a relay (1=on, 0=off, t=toggle, -=nochange). Example states: `t---001-` -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ----------------------------- | ------ | | `address` | No | [LCN address](#lcn-addresses) | | `state` | No | Relay states as string | @@ -803,11 +792,11 @@ data: state: t---001- ``` -### Service: `led` +### Action: `led` Set the LED status. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ----------------------------- | -------------------- | | `address` | No | [LCN address](#lcn-addresses) | | `state` | No | LED state as string | [LED_STATE](#states) | @@ -822,13 +811,13 @@ data: state: blink ``` -### Service: `var_abs` +### Action: `var_abs` Set the absolute value of a variable or setpoint. If `value` is not defined, it is assumed to be 0. If `unit_of_measurement` is not defined, it is assumed to be `native`. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ----------------------------- | ------------------------------------------------------------------ | | `address` | No | [LCN address](#lcn-addresses) | | `variable` | No | Variable name | [VARIABLE](#variables-and-units), [SETPOINT](#variables-and-units) | @@ -846,18 +835,18 @@ data: unit_of_measurement: % ``` -<div class='note'> - Ensure that the LCN module is configured properly to provide access to the defined variable. - Otherwise the module might show unexpected behaviors or return error messages. -</div> +{% important %} +Ensure that the LCN module is configured properly to provide access to the defined variable. +Otherwise the module might show unexpected behaviors or return error messages. +{% endimportant %} -### Service: `var_rel` +### Action: `var_rel` Set the relative value of a variable or setpoint. If `value` is not defined, it is assumed to be 0. If `unit_of_measurement` is not defined, it is assumed to be `native`. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ----------------------------- | ----------------------------------------------------------------------------------------------------- | | `address` | No | [LCN address](#lcn-addresses) | | `variable` | No | Variable name | [VARIABLE](#variables-and-units), [SETPOINT](#variables-and-units), [THRESHOLD](#variables-and-units) | @@ -875,16 +864,16 @@ data: unit_of_measurement: % ``` -<div class='note'> - Ensure that the LCN module is configured properly to provide access to the defined variable. - Otherwise the module might show unexpected behavior or return error messages. -</div> +{% important %} +Ensure that the LCN module is configured properly to provide access to the defined variable. +Otherwise the module might show unexpected behavior or return error messages. +{% endimportant %} -### Service: `var_reset` +### Action: `var_reset` Reset value of variable or setpoint. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ----------------------------- | ------------------------------------------------------------------ | | `address` | No | [LCN address](#lcn-addresses) | | `variable` | No | Variable name | [VARIABLE](#variables-and-units), [SETPOINT](#variables-and-units) | @@ -898,17 +887,17 @@ data: variable: var1 ``` -<div class='note'> - Ensure that the LCN module is configured properly to provide access to the defined variable. - Otherwise the module might show unexpected behavior or return error messages. -</div> +{% important %} +Ensure that the LCN module is configured properly to provide access to the defined variable. +Otherwise the module might show unexpected behavior or return error messages. +{% endimportant %} -### Service: `lock_regulator` +### Action: `lock_regulator` Locks a regulator setpoint. If `state` is not defined, it is assumed to be `False`. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ----------------------------- | -------------------------------- | | `address` | No | [LCN address](#lcn-addresses) | | `setpoint` | No | Setpoint name | [SETPOINT](#variables-and-units) | @@ -924,7 +913,7 @@ data: state: true ``` -### Service: `send_keys` +### Action: `send_keys` Send keys (which executes bound commands). The keys attribute is a string with one or more key identifiers. Example: `a1a5d8` @@ -932,7 +921,7 @@ If `state` is not defined, it is assumed to be `hit`. The command allows the sending of keys immediately or deferred. For a deferred sending the attributes `time` and `time_unit` have to be specified. For deferred sending, the only key state allowed is `hit`. If `time_unit` is not defined, it is assumed to be `seconds`. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ----------------------------- | --------------------------------- | | `address` | No | [LCN address](#lcn-addresses) | | `keys` | No | Keys string | @@ -961,7 +950,7 @@ data: time_unit: s ``` -### Service: `lock_keys` +### Action: `lock_keys` Locks keys. If the table is not defined, it is assumed to be table `a`. @@ -969,7 +958,7 @@ The key lock states are defined as a string with eight characters. Each characte The command allows the locking of keys for a specified time period. For a time period, the attributes `time` and `time_unit` have to be specified. For a time period, only table `a` is allowed. If `time_unit` is not defined, it is assumed to be `seconds`. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ----------------------------- | --------------------------------- | | `address` | No | [LCN address](#lcn-addresses) | | `table` | Yes | Table with keys to lock | @@ -998,14 +987,14 @@ data: time_unit: s ``` -### Service: `dyn_text` +### Action: `dyn_text` Send dynamic text to LCN-GTxD displays. The displays support four rows for text messages. Each row can be set independently and can store up to 60 characters (encoded in UTF-8). -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ---------------------------------- | ------ | | `address` | No | [LCN address](#lcn-addresses) | | `row` | No | Text row 1..4 | @@ -1021,11 +1010,11 @@ data: text: "text in row 1" ``` -### Service: `pck` +### Action: `pck` Send arbitrary PCK command. Only the command part of the PCK command has to be specified in the `pck` string. -| Service data attribute | Optional | Description | Values | +| Data attribute | Optional | Description | Values | | ---------------------- | -------- | ----------------------------- | ------ | | `address` | No | [LCN address](#lcn-addresses) | | `pck` | No | PCK command | diff --git a/source/_integrations/ld2410_ble.markdown b/source/_integrations/ld2410_ble.markdown index b72511848d7a..ed5d30c648df 100644 --- a/source/_integrations/ld2410_ble.markdown +++ b/source/_integrations/ld2410_ble.markdown @@ -42,8 +42,8 @@ The following sensors are provided: ## Purchasing -<div class='note'> +{% note %} There are multiple similar versions of the board. Make sure to buy the LD2410B or LD2410C versions as these are the ones with Bluetooth and have been tested. The C variant has 2.54mm pitch pins which is the one used by Arduino type devices, whereas the B variant has half pitch pins. -</div> +{% endnote %} You can buy this module bareboard or in a devkit from [AliExpress](https://www.aliexpress.com/item/1005004351593073.html). diff --git a/source/_integrations/lg_netcast.markdown b/source/_integrations/lg_netcast.markdown index 855ab48444c8..3e1616867410 100644 --- a/source/_integrations/lg_netcast.markdown +++ b/source/_integrations/lg_netcast.markdown @@ -51,9 +51,9 @@ automation: Any other [actions](/docs/automation/action/) to power on the device can be configured. -## Change channel through play_media service +## Change channel through play_media action -The `play_media` service can be used in a script to switch to the specified TV channel. It selects the major channel number according to the `media_content_id` parameter: +The `play_media` action can be used in a script to switch to the specified TV channel. It selects the major channel number according to the `media_content_id` parameter: ```yaml # Example action entry in script to switch to channel number 15 diff --git a/source/_integrations/lifx.markdown b/source/_integrations/lifx.markdown index 2057e82519ca..4c02502985ab 100644 --- a/source/_integrations/lifx.markdown +++ b/source/_integrations/lifx.markdown @@ -28,19 +28,19 @@ The LIFX integration automatically discovers [LIFX](https://www.lifx.com) lights LIFX lights allow a change of color and brightness even when they are turned off. This way, you can control the light during the day, so its settings are correct when events for turning on are received, for example, from motion detectors or external buttons. -The normal `light.turn_on` call cannot be used for this because it always turns the power on. Thus, LIFX has its own `set_state` service that allows color changes without affecting the current power state. +The normal `light.turn_on` call cannot be used for this because it always turns the power on. Thus, LIFX has its own `set_state` action that allows color changes without affecting the current power state. -### Service `lifx.set_state` +### Action `lifx.set_state` Change the light to a new state. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of lights. Use `entity_id: all` to target all. | `transition` | Duration (in seconds) for the light to fade to the new state. | `zones` | List of integers for the zone numbers to affect. See **Calculating zones to affect** below for more detail. | `power` | Turn the light on (`True`) or off (`False`). Leave out to keep the power as it is. -| `...` | Use `color_name`, `brightness` etc. from [`light.turn_on`](/integrations/light/#service-lightturn_on) to specify the new state. +| `...` | Use `color_name`, `brightness` etc. from [`light.turn_on`](/integrations/light/#action-lightturn_on) to specify the new state. #### Calculating zones to affect @@ -48,17 +48,17 @@ The LIFX Z and LIFX Lightstrip each have eight (8) zones per segment. You can co The LIFX Beam has ten (10) zones per segment and one (1) zone per corner piece. You can connect up to eight (8) segments and two (2) corner pieces to a single controller, which results in a maximum zone count of 82. -All devices start counting zones at zero (0), which means the zone numbers for the `zones` attribute of the `lifx.set_state` service range from 0 to 79 for the LIFX Z and Lightstrip and 0 to 81 for the LIFX Beam. +All devices start counting zones at zero (0), which means the zone numbers for the `zones` attribute of the `lifx.set_state` action range from 0 to 79 for the LIFX Z and Lightstrip and 0 to 81 for the LIFX Beam. ## Set HEV cycle state -You can control the HEV LEDs in LIFX Clean bulbs using the `set_hev_cycle_state` service. The service can start or stop a HEV (or "Clean") cycle either using the default duration configured on the bulb or for a custom duration specified when calling the service. Home Assistant will return or log an error if an incompatible bulb is specified when calling the service. +You can control the HEV LEDs in LIFX Clean bulbs using the `set_hev_cycle_state` action. The action can start or stop a HEV (or "Clean") cycle either using the default duration configured on the bulb or for a custom duration specified when performing the action. Home Assistant will return or log an error if an incompatible bulb is specified when performing the action. To determine whether or not a HEV cycle is currently running, Home Assistant exposes a Clean Cycle binary sensor for all HEV-enabled bulbs. This sensor can be used to trigger automations to occur when a HEV cycle starts or stops. To reduce network load, HEV cycle status is only checked every 10 seconds so this sensor may not update instantaneously. -### Service `lifx.set_hev_cycle_state` +### Action `lifx.set_hev_cycle_state` -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of LIFX Clean bulbs. | `power` | Start a HEV cycle (`True`) or stop a cycle (`False`). @@ -82,13 +82,13 @@ Home Assistant provides a collection of predefined themes for LIFX multizone lig To apply a theme interactively, use the theme selection drop-down box found on the device configuration screen. -To apply a theme as part of an automation, use the `select.select_option` service call. You can also apply a theme when calling the `lifx.effect_move` service. See the **Light effects** section below for more details, including how to set a custom theme for that effect. +To apply a theme as part of an automation, use the `select.select_option` action call. You can also apply a theme when calling the `lifx.effect_move` action. See the **Light effects** section below for more details, including how to set a custom theme for that effect. The following themes are available: `autumn`, `blissful`, `cheerful`, `dream`, `energizing`, `epic`, `exciting`, `focusing`, `halloween`, `hanukkah`, `holly`, `independence_day`, `intense`, `mellow`, `peaceful`, `powerful`, `relaxing`, `santa`, `serene`, `soothing`, `sports`, `spring`, `tranquil`, `warming`. ## Light effects -The LIFX platform supports several software-controlled light effects and one hardware based effect. You can start these effects with default options by using the `effect` attribute of the normal [`light.turn_on`](/integrations/light/#service-lightturn_on) service, for example like this: +The LIFX platform supports several software-controlled light effects and one hardware based effect. You can start these effects with default options by using the `effect` attribute of the normal [`light.turn_on`](/integrations/light/#action-lightturn_on) action, for example like this: ```yaml automation: @@ -103,7 +103,7 @@ automation: effect: lifx_effect_pulse ``` -However, if you want to fully control a light effect, you have to use its dedicated service call, like this: +However, if you want to fully control a light effect, you have to use its dedicated action, like this: ```yaml script: @@ -122,17 +122,17 @@ script: ### Hardware effects -The Flame (`lifx.effect_flame`), Morph (`lifx.effect_morph`) and Move (`lifx.effect_move`) effects are hardware-based and only work on specific LIFX devices. Flame and Morph are available on the LIFX Tile and Candle, while the Move effect requires a LIFX Z, Lightstrip, or Beam. +The Flame (`lifx.effect_flame`), Morph (`lifx.effect_morph`), Sky (`lifx.effect_sky`), and Move (`lifx.effect_move`) effects are hardware-based and only work on specific LIFX devices. Flame and Morph are available on the LIFX Tile, Candle, Path, Spot, and Ceiling while the Sky effect is only available on the Ceiling. The Move effect requires a LIFX Z, Lightstrip, Beam, Neon, or String. -All hardware-based effects can be stopped and started regardless of the device's power state, but the default behavior for each service is to turn the device on when starting an effect. Set the `power_on` attribute of the service to `false` to override this default. +All hardware-based effects can be stopped and started regardless of the device's power state, but the default behavior for each action is to turn the device on when starting an effect. Set the `power_on` attribute of the action to `false` to override this default. All the available light effects and their options are listed below. -### Service `lifx.effect_pulse` +### Action `lifx.effect_pulse` Run a software-based flash effect by changing to a color and then back. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of lights. Use `entity_id: all` to target all. | `color_name` | A color name such as `red` or `green`. @@ -144,11 +144,11 @@ Run a software-based flash effect by changing to a color and then back. | `mode` | The way to change between colors. Valid modes: `blink` (default - direct transition to new color for 'period' time with original color between cycles), `breathe` (color fade transition to new color and back to original), `ping` (short pulse of new color), `strobe` (light turns off between color changes), `solid`(light does not return to original color between cycles). | `power_on` | Set this to False to skip the effect on lights that are turned off (defaults to True). -### Service `lifx.effect_colorloop` +### Action `lifx.effect_colorloop` Run a software-based effect that continuously loops colors around the color wheel. All participating lights will coordinate to keep similar (but not identical) colors. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of lights. Use `entity_id: all` to target all. | `brightness` | Number between 1 and 255 indicating the brightness of the effect. Leave this out to maintain the current brightness of each participating light. @@ -161,17 +161,17 @@ Run a software-based effect that continuously loops colors around the color whee | `spread` | Maximum color difference between participating lights, in degrees on a color wheel (ranges from 0 to 359). | `power_on` | Set this to False to skip the effect on lights that are turned off (defaults to True). -### Service `lifx.effect_flame` +### Action `lifx.effect_flame` Run a hardware-based effect on LIFX matrix devices that creates a flame effect on the device. The device will be powered on by default, but this can be overridden by setting `power_on` to `false`. The `speed` attribute controls the speed of the flames. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of matrix lights. | `speed` | Duration in seconds for the effect to travel the length of the device (min: 1s, max: 25s) | `power_on` | Whether to turn the light on before starting the effect (optional, default: true) -### Service `lifx.effect_morph` +### Action `lifx.effect_morph` Run a hardware-based effect on LIFX matrix devices that animates blobs of colors across the device. The `speed` attribute controls the speed of the movement. @@ -179,7 +179,7 @@ You must provide a `palette` or `theme` to use for the effect, but not both. The The device will be powered on by default, but this can be overridden by setting `power_on` to `false`. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of matrix lights. | `speed` | Duration in seconds for the effect to travel the length of the device (min: 1s, max: 25s) @@ -187,13 +187,58 @@ The device will be powered on by default, but this can be overridden by setting | `theme` | The theme to use for the effect. Must be one of: `autumn`, `blissful`, `cheerful`, `dream`, `energizing`, `epic`, `exciting`, `focusing`, `halloween`, `hanukkah`, `holly`, `independence` `day`, `intense`, `mellow`, `peaceful`, `powerful`, `relaxing`, `santa`, `serene`, `soothing`, `sports`, `spring`, `tranquil`, `warming`. | `power_on` | Whether to turn the light on before starting the effect (optional, default: true) -### Service `lifx.effect_move` +### Action `lifx.effect_sky` -Run a hardware-based effect on LIFX multizone devices that move the current colors on the device in a particular direction. The direction and speed of the animation are controlled by the `speed` and `direction` attributes. You can change the effect's colors while running using the `lifx.set_state` service. +Run a hardware-based effect on LIFX Ceiling devices that animates a sky scene across the device. The effect emulates three different types of sky: Sunrise, Sunset, and Clouds. +The default values and palette used by each sky type match those used by the LIFX smartphone app. + +| Data attribute | Description | +| ---------------------- | ----------------------------------------------------------------------------------- | +| `entity_id` | String or list of strings containing the `entity_id` of one or more Ceiling devices | +| `speed` | Duration in seconds for the effect to complete (optional, min: 1s, max: 86400s, default: 50s) | +| `palette` | A list of 6 colors to use for this effect (optional, see below for details) | +| `power_on` | Whether to turn the light on before starting the effect (optional, default: true) | +| `sky_type` | Either "Sunrise", "Sunset" or "Clouds" | +| `cloud_saturation_min` | The minimum cloud saturation for the Cloud sky type (optional, default: 50) | +| `cloud_saturation_max` | The maximum cloud saturation for the Cloud sky type (optional, default: 180) | + +The palette for the Sky effect is shared between all three sky types. To use a custom palette, you must specify all six color values as hue (0-360), saturation (0-100), brightness (0-100), and kelvin (1500-9000) in the following order to modify the effect: + +1. Sky: The color of the background sky when the Clouds sky type is used. All pixels on the light are given this color, and the "clouds" are made by applying a range of saturation values to the pixels. +2. Night sky: The starting (or finishing) color of the sky when no sun is visible for Sunrise or Sunset sky type. The Sunrise sky type starts with the light completely this color, then fades to a lighter color before starting to bring up the "sun". The Sunset sky type is the Sunrise sky type but in reverse. +3. Dawn sky: The color of the sky just as the sun appears. This is the color that the light fades to after starting at the "night sky" color. +4. Dawn sun: The color of the sun just as the sun appears. The background is still the "dawn sky" above, but now the sun is starting to rise with a warm color. +5. Full sun: The color of the sun as it covers the whole light. As the sun rises, it fades from the "dawn sun" color to this "full sun" color. The background stays at "dawn sky" but gets washed out by the bright sun colors. +6. Final sun: The color of the full sun at the end of the effect. After the sun has risen by covering the whole light, there is a phase where it fades to a cooler, bright daylight. This is the "final sun" color. + +For example, the following YAML will trigger the Sky effect with the Sunrise sky type to run for five minutes using the same palette as the LIFX smartphone app: + +```yaml +service: lifx.effect_sky +target: + entity_id: light.lifx_ceiling +data: + power_on: true + speed: 600 + sky_type: Sunrise + cloud_saturation_min: 50 + cloud_saturation_max: 180 + palette: + - [200, 100, 100, 3500] # Sky: blue + - [241, 100, 1, 3500] # Night sky: dark purple + - [189, 100, 8, 3500] # Dawn sky: dark blue + - [40, 100, 100, 3500] # Dawn sun: warm white + - [40, 50, 100, 3500] # Full sun: medium white + - [40, 0, 100, 6500] # Final sun: cool white +``` + +### Action `lifx.effect_move` + +Run a hardware-based effect on LIFX multizone devices that move the current colors on the device in a particular direction. The direction and speed of the animation are controlled by the `speed` and `direction` attributes. You can change the effect's colors while running using the `lifx.set_state` action. The effect will not be visible if all LEDs on the device are set to the same color and is ignored by unsupported devices. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of multizone lights. | `speed` | Duration in seconds for the effect to travel the length of the device (min: 0.1s, max: 60s) @@ -201,11 +246,11 @@ The effect will not be visible if all LEDs on the device are set to the same col | `theme` | The name of a pre-defined theme to apply to the multizone device before starting the effect. | `power_on` | Whether to turn the light on before starting the effect (optional, default: true) -### Service `lifx.effect_stop` +### Action `lifx.effect_stop` Run an effect that does nothing, thereby stopping any software or hardware effect that might be running. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of lights. Use `entity_id: all` to target all. diff --git a/source/_integrations/light.markdown b/source/_integrations/light.markdown index e79877da7128..83bc767431e6 100644 --- a/source/_integrations/light.markdown +++ b/source/_integrations/light.markdown @@ -29,19 +29,17 @@ The field transition is optional and can be omitted. The `.default` suffix should be added to the entity identifier of each light to define a default value, e.g., for `light.ceiling_2` the `profile` field is `light.ceiling_2.default`. To define a default for all lights, the identifier `group.all_lights.default` can be used. Individual settings always supersede the `all_lights` default setting. -<div class='note'> +{% note %} +If a light entity is in the `on` state, the default profile brightness will only be applied if it is called in the action data attribute `profile`, like any other named profile. The transition attribute will be applied for all `light.turn_on`, `light.toggle`, and `light.turn_off` actions, unless specified otherwise in the action data. +{% endnote %} -If a light entity is in the `on` state, the default profile brightness will only be applied if it is called in the service call data attribute `profile`, like any other named profile. The transition attribute will be applied for all `light.turn_on`, `light.toggle` and `light.turn_off` service calls, unless specified otherwise in the service call data. - -</div> - -### Service `light.turn_on` +### Action `light.turn_on` Turns one light on or multiple lights on using [groups](/integrations/group/). Most lights do not support all attributes. You can check the integration documentation of your particular light for hints, but in general, you will have to try things out and see what works. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | String or list of strings that point at `entity_id`s of lights. To target all lights, set `entity_id` to `all`. | | `transition` | yes | Number that represents the time (in seconds) the light should take to transition to the new state. | @@ -63,11 +61,9 @@ Most lights do not support all attributes. You can check the integration documen | `flash` | yes | Tell light to flash, can be either value `short` or `long`. | | `effect` | yes | Applies an effect such as `colorloop` or `random`. | -<div class='note'> - +{% note %} In order to apply attributes to an entity, you will need to add `data:` to the configuration. See example below - -</div> +{% endnote %} ```yaml # Example configuration.yaml entry @@ -101,24 +97,22 @@ automation: brightness: 130 rgb_color: [255,0,0] ``` -<div class='note'> - +{% note %} If no data is sent, and a default profile exists, the default profile will be applied. +{% endnote %} -</div> - -### Service `light.turn_off` +### Action `light.turn_off` Turns one or multiple lights off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | String or list of strings that point at `entity_id`s of lights. To target all lights, set `entity_id` to `all`. | | `transition` | yes | Integer that represents the time the light should take to transition to the new state in seconds. | | `flash` | yes | Tell light to flash, can be either value `short` or `long`. | -### Service `light.toggle` +### Action `light.toggle` -Toggles the state of one or multiple lights. Takes the same arguments as the [`light.turn_on`](#service-lightturn_on) service. +Toggles the state of one or multiple lights. Takes the same arguments as the [`light.turn_on`](#action-lightturn_on) action. *Note*: If `light.toggle` is used for a group of lights, it will toggle the individual state of each light. If you want the lights to be treated as a single light, use [Light Groups](/integrations/group#binary-sensor-light-and-switch-groups) instead. diff --git a/source/_integrations/light.mqtt.markdown b/source/_integrations/light.mqtt.markdown index 604a68376dcf..9aee3d634caf 100644 --- a/source/_integrations/light.mqtt.markdown +++ b/source/_integrations/light.mqtt.markdown @@ -397,15 +397,13 @@ xy_value_template: type: template {% endconfiguration %} -<div class='note warning'> +{% important %} +Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics. +{% endimportant %} - Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics. - -</div> - -<div class='note warning'> - XY and RGB can not be used at the same time. If both are provided, XY overrides RGB. -</div> +{% note %} +XY and RGB can not be used at the same time. If both are provided, XY overrides RGB. +{% endnote %} ## Default schema - Examples @@ -724,17 +722,13 @@ white_scale: default: 255 {% endconfiguration %} -<div class='note warning'> - - Make sure that your topics match exact. `some-topic/` and `some-topic` are different topics. - -</div> +{% important %} +Make sure that your topics match exact. `some-topic/` and `some-topic` are different topics. +{% endimportant %} -<div class='note warning'> - - RGB, XY and HSV can not be used at the same time in `state_topic` messages. Make sure that only one of the color models is in the "color" section of the state MQTT payload. - -</div> +{% note %} +RGB, XY and HSV can not be used at the same time in `state_topic` messages. Make sure that only one of the color models is in the "color" section of the state MQTT payload. +{% endnote %} ## JSON schema - Examples @@ -1078,11 +1072,9 @@ unique_id: type: string {% endconfiguration %} -<div class='note warning'> - - Make sure that your topics match exact. `some-topic/` and `some-topic` are different topics. - -</div> +{% important %} +Make sure that your topics match exact. `some-topic/` and `some-topic` are different topics. +{% endimportant %} ## Template schema - Examples diff --git a/source/_integrations/light.template.markdown b/source/_integrations/light.template.markdown index b1e0a786223d..1e7623f9a49d 100644 --- a/source/_integrations/light.template.markdown +++ b/source/_integrations/light.template.markdown @@ -3,14 +3,23 @@ title: "Template Light" description: "Instructions on how to integrate Template Lights into Home Assistant." ha_category: - Light + - Helper ha_release: 0.46 ha_iot_class: Local Push ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' ha_domain: template +ha_platforms: + - light +ha_integration_type: helper +related: + - docs: /docs/configuration/ + title: Configuration file --- The `template` platform creates lights that combine integrations and provides the -ability to run scripts or invoke services for each of the on, off, and +ability to run scripts or invoke actions for each of the on, off, and brightness commands of a light. To enable Template Lights in your installation, add the following to your @@ -209,7 +218,7 @@ result: {% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %} Transition doesn't have its own script, it will instead be passed as a named parameter `transition` to the `turn_on`, `turn_off`, `brightness`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts. Brightness will be passed as a named parameter `brightness` to either of `turn_on`, `color_temp`, `effect`, `hs_color`, `rgb_color`, `rgbw_color` or `rgbww_color` scripts if the corresponding parameter is also in the call. In this case, the brightness script (`set_level`) will not be called. -If only brightness is passed to `light.turn_on` service call then `set_level` script is called. +If only brightness is passed to `light.turn_on` action, then `set_level` script is called. ## Examples diff --git a/source/_integrations/limitlessled.markdown b/source/_integrations/limitlessled.markdown index 306fef689e6f..109d2a1bb664 100644 --- a/source/_integrations/limitlessled.markdown +++ b/source/_integrations/limitlessled.markdown @@ -106,7 +106,7 @@ bridges: LimitlessLED has a `night` effect that can be used to dim the lights below `brightness: 1`. This night mode is meant to temporarily turn the lights into a nightlight. This mode can be especially helpful when wall switches are also being used. For example, when a light is using the `night` effect one way to return it to its previous brightness level (other than using Home Assistant) is to switch the lights off and then back on from the wall switch. -Note that the `brightness`, `color` and `temperature` attributes cannot be used when using the `night` effect. You can turn on `night` effect by using the `effect` attribute of the normal `light.turn_on` service. Here is an example: +Note that the `brightness`, `color` and `temperature` attributes cannot be used when using the `night` effect. You can turn on `night` effect by using the `effect` attribute of the normal `light.turn_on` action. Here is an example: ```yaml automation: diff --git a/source/_integrations/lirc.markdown b/source/_integrations/lirc.markdown index 12bec615c0e9..35b89da54241 100644 --- a/source/_integrations/lirc.markdown +++ b/source/_integrations/lirc.markdown @@ -21,7 +21,7 @@ To allow Home Assistant to talk to your IR receiver, you need to first make sure sudo apt-get install lirc liblircclient-dev ``` -<div class='note'> +{% note %} If you are configuring on a Raspberry Pi, there are excellent instructions with GPIO schematics and driver configurations [here](http://alexba.in/blog/2013/01/06/setting-up-lirc-on-the-raspberrypi/). Take notice, the instructions in this blog are valid for Raspian Jesse where lirc 0.9.0 was included in the Debian package. In Raspian Stretch lirc 0.9.4 is included in the Debian package. The configuration is slightly different : @@ -32,7 +32,7 @@ The configuration is slightly different : For more information have a look at `/usr/share/doc/lirc/README.Debian.gz` where the update process is explained when you have updated from jessie to stretch. -</div> +{% endnote %} ## Configuring LIRC diff --git a/source/_integrations/litterrobot.markdown b/source/_integrations/litterrobot.markdown index 6b14cf35c694..d558027debc5 100644 --- a/source/_integrations/litterrobot.markdown +++ b/source/_integrations/litterrobot.markdown @@ -77,9 +77,9 @@ Some entities have attributes in addition to the default ones that are available | sleep_mode_enabled | boolean | Whether or not sleep mode is enabled. | | power_status | string | Current power status of the unit. `AC` indicates normal power, `DC` indicates battery backup and `NC` indicates that the unit is not connected and/or powered off. | -## Services +## Actions -Services are utilized for additional functionality that is available in the Whisker (previously Litter-Robot) companion app. The following are currently available: +Actions are utilized for additional functionality that is available in the Whisker (previously Litter-Robot) companion app. The following are currently available: ### set_sleep_mode diff --git a/source/_integrations/llamalab_automate.markdown b/source/_integrations/llamalab_automate.markdown index 024ebdbe9b42..bcf11fa714f5 100644 --- a/source/_integrations/llamalab_automate.markdown +++ b/source/_integrations/llamalab_automate.markdown @@ -36,7 +36,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string diff --git a/source/_integrations/local_file.markdown b/source/_integrations/local_file.markdown index 999e3bede7b2..16cd8394fd26 100644 --- a/source/_integrations/local_file.markdown +++ b/source/_integrations/local_file.markdown @@ -14,7 +14,7 @@ related: title: Configuration file --- -The **Local file** camera {% term integration %} allows you to integrate an image file from disk into Home Assistant as a camera. If the image is updated on the file system the image displayed in Home Assistant will also be updated. The service `local_file.update_file_path` can be used to update the image using an automation. +The **Local file** camera {% term integration %} allows you to integrate an image file from disk into Home Assistant as a camera. If the image is updated on the file system, the image displayed in Home Assistant will also be updated. The `local_file.update_file_path` action can be used to update the image using an automation. The `local_file` camera can for example be used with various camera platforms that save a temporary images locally. It can also be used to display a graph that you render periodically and will then be displayed in Home Assistant. @@ -41,11 +41,11 @@ name: type: string {% endconfiguration %} -### Service `local_file.update_file_path` +### Action `local_file.update_file_path` -Use this service to change the file displayed by the camera. +Use this action to change the file displayed by the camera. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------- | | `entity_id` | String of the `entity_id` of the camera to update. | | `file_path` | The full path to the new image file to be displayed. | diff --git a/source/_integrations/lock.markdown b/source/_integrations/lock.markdown index 406e67abd818..83576ff7a443 100644 --- a/source/_integrations/lock.markdown +++ b/source/_integrations/lock.markdown @@ -14,19 +14,19 @@ ha_integration_type: entity Keeps track which locks are in your environment, their state and allows you to control them. - Maintains a state per lock and a combined state `all_locks`. -- Registers services `lock.lock`, `lock.unlock` and `lock.open` (unlatch) to control locks. +- Registers actions `lock.lock`, `lock.unlock`, and `lock.open` (unlatch) to control locks. {% include integrations/building_block_integration.md %} -### Services +### Actions -A lock integration provides the following services: +A lock integration provides the following actions: -#### Service `lock.lock` +#### Action `lock.lock` -Lock your door, the attribute should appear under a 'data' attribute for the service. +Lock your door, the attribute should appear under a 'data' attribute for the action. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------- | | `entity_id` | no | Entity of the relevant lock. | @@ -39,11 +39,11 @@ action: entity_id: lock.my_place ``` -#### Service `lock.unlock` +#### Action `lock.unlock` -Unlock your door, the attribute should appear under a 'data' attribute for the service. +Unlock your door, the attribute should appear under a 'data' attribute for the action. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------- | | `entity_id` | no | Entity of the relevant lock. | @@ -56,14 +56,14 @@ action: entity_id: lock.my_place ``` -### Use the services +### Use the actions -Go to the **Developer Tools**, then to **Call Service** in the frontend, and choose `lock.lock`, `lock.unlock` or `lock.open` from the list of available services (**Services:** on the left). Enter something like the sample below into the **Service Data** field and hit **CALL SERVICE**. +Go to the **Developer Tools**, then to **Actions** in the frontend, and choose `lock.lock`, `lock.unlock` or `lock.open` from the list of available actions. Enter something like the sample below into the **data** field and select **Perform action**. ```json {"entity_id":"lock.front_door"} ``` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------- | | `entity_id` | yes | Only act on specific lock. Use `entity_id: all` to target all. | diff --git a/source/_integrations/lock.mqtt.markdown b/source/_integrations/lock.mqtt.markdown index 862ee9531b5b..6dece6193de4 100644 --- a/source/_integrations/lock.mqtt.markdown +++ b/source/_integrations/lock.mqtt.markdown @@ -68,11 +68,11 @@ availability_topic: required: false type: string code_format: - description: A regular expression to validate a supplied code when it is set during the service call to `open`, `lock` or `unlock` the MQTT lock. + description: A regular expression to validate a supplied code when it is set during the action to `open`, `lock` or `unlock` the MQTT lock. required: false type: string command_template: - description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`. The lock command template accepts the parameters `value` and `code`. The `value` parameter will contain the configured value for either `payload_open`, `payload_lock` or `payload_unlock`. The `code` parameter is set during the service call to `open`, `lock` or `unlock` the MQTT lock and will be set `None` if no code was passed. + description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`. The lock command template accepts the parameters `value` and `code`. The `value` parameter will contain the configured value for either `payload_open`, `payload_lock` or `payload_unlock`. The `code` parameter is set during the action to `open`, `lock` or `unlock` the MQTT lock and will be set `None` if no code was passed. required: false type: template command_topic: @@ -246,11 +246,9 @@ value_template: type: template {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topics match exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/lock.template.markdown b/source/_integrations/lock.template.markdown index 9ff1fc4d913e..84719d984622 100644 --- a/source/_integrations/lock.template.markdown +++ b/source/_integrations/lock.template.markdown @@ -3,10 +3,19 @@ title: "Template Lock" description: "Instructions on how to integrate Template Locks into Home Assistant." ha_category: - Lock + - Helper ha_release: 0.81 ha_iot_class: Local Push ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' ha_domain: template +ha_platforms: + - lock +ha_integration_type: helper +related: + - docs: /docs/configuration/ + title: Configuration file --- The `template` platform creates locks that combines components. @@ -197,4 +206,4 @@ In `secrets.yaml`: garage_door_pin: "1234" ``` -{% endraw %} \ No newline at end of file +{% endraw %} diff --git a/source/_integrations/logbook.markdown b/source/_integrations/logbook.markdown index 9a35e87bf2b2..b52ef960644a 100644 --- a/source/_integrations/logbook.markdown +++ b/source/_integrations/logbook.markdown @@ -172,14 +172,10 @@ script: ``` -<div class="note warning"> - -When calling the `logbook.log` service without a `domain` or `entity_id`, entries will be added with the `logbook` domain. Ensure that the `logbook` domain is not filtered away if you want these entries to appear in your logbook. - -</div> - -<div class='note'> +{% important %} +When calling the `logbook.log` action without a `domain` or `entity_id`, entries will be added with the `logbook` domain. Ensure that the `logbook` domain is not filtered away if you want these entries to appear in your logbook. +{% endimportant %} +{% note %} Sensor entities that have been assigned units (i.e., have a `unit_of_measurement` attribute) are assumed to change frequently and those sensors are automatically excluded from the logbook. - -</div> +{% endnote %} diff --git a/source/_integrations/logger.markdown b/source/_integrations/logger.markdown index 6fc27a0e667a..c0b55f59b80c 100644 --- a/source/_integrations/logger.markdown +++ b/source/_integrations/logger.markdown @@ -137,12 +137,12 @@ logger: - "^Error handling request$" ``` -## Services +## Actions -### Service `set_default_level` +### Action `set_default_level` You can alter the default log level (for integrations without a specified log -level) using the service `logger.set_default_level`. +level) using the `logger.set_default_level` action. An example call might look like this: @@ -152,10 +152,10 @@ data: level: info ``` -### Service `set_level` +### Action `set_level` -You can alter log level for one or several integrations using the service -`logger.set_level`. It accepts the same format as `logs` in the configuration. +You can alter log level for one or several integrations using the `logger.set_level` action. +It accepts the same format as `logs` in the configuration. An example call might look like this: diff --git a/source/_integrations/loqed.markdown b/source/_integrations/loqed.markdown index 06e64c5e86fb..b2dc8f1e691d 100644 --- a/source/_integrations/loqed.markdown +++ b/source/_integrations/loqed.markdown @@ -45,9 +45,9 @@ Home Assistant should automatically detect your lock when your Home Assistant ru You can also set up a lock manually when for some reason, it is not automatically detected. In that case, you need to provide both the API Key from the previous step and the name of the Lock, as it is known in the LOQED companion app. -## Services +## Actions -Please see the default [lock integration page](/integrations/lock/) for the services available for the lock. +Please see the default [lock integration page](/integrations/lock/) for the actions available for the lock. ## De-installation in Loqed diff --git a/source/_integrations/luci.markdown b/source/_integrations/luci.markdown index 822a3fb5e3ed..730566d146ab 100644 --- a/source/_integrations/luci.markdown +++ b/source/_integrations/luci.markdown @@ -62,9 +62,7 @@ See the [device tracker integration page](/integrations/device_tracker/) for ins This device tracker provides a number of additional attributes for each tracked device (if it is at home): `flags`, `ip`, `device`, and `host`. The first three attributes are taken from the ARP table returned by the luci RPC. The `host` attribute is taken from the platform configuration and can be used to distinguish in which router a device is logged in, if you are using multiple OpenWrt routers. -<div class='note warning'> - +{% note %} Some installations have [a small bug](https://github.com/openwrt/luci/issues/576). The timeout for luci RPC calls is not set and this makes the call fail. If you want to locally fix your OpenWrt installation, you can apply the change manually to `/usr/lib/lua/luci/controller/rpc.lua`, or simply set a fixed timeout. The default is 3600. - -</div> +{% endnote %} diff --git a/source/_integrations/lutron.markdown b/source/_integrations/lutron.markdown index 91fde89568fd..86c13170ad9e 100644 --- a/source/_integrations/lutron.markdown +++ b/source/_integrations/lutron.markdown @@ -39,17 +39,13 @@ To use Lutron RadioRA 2 devices in your installation, you'll need to first creat {% include integrations/config_flow.md %} -<div class='note'> - +{% tip %} It is recommended to assign a static IP address to your main repeater. This ensures that it won't change IP addresses, so you won't have to change the `host` if it reboots and comes up with a different IP address. +{% endtip %} -</div> - -<div class='note'> - +{% important %} If you are using RadioRA2 software version 12 or later, the default `lutron` user with password `integration` is not configured by default. To configure a new telnet user, go to **Settings** > **Integration** in your project and add a new telnet login. Once configured, use the transfer tab to push your changes to the RadioRA2 main repeater(s). - -</div> +{% endimportant %} ## Keypad buttons @@ -57,11 +53,11 @@ Keypad buttons actions are provided in event entities. ## Keypad LEDs -Each full-width button on a Lutron SeeTouch, Hybrid SeeTouch, and Tabletop SeeTouch Keypad has an LED that can be controlled by Home Assistant. A service call of switch.turn_off or switch.turn_on against the appropriate LED entity will control the keypad LED. +Each full-width button on a Lutron SeeTouch, Hybrid SeeTouch, and Tabletop SeeTouch Keypad has an LED that can be controlled by Home Assistant. Performing an action of `switch.turn_off` or `switch.turn_on` against the appropriate LED entity will control the keypad LED. Keep in mind that the Lutron system will also control the LED state independent of Home Assistant, according to the programming of the RadioRA2 system. This also means you can query LED states to determine if a certain scene is active, since the LED will have been illuminated by the RadioRA2 repeaters. This includes the "phantom" LEDs of Main Repeater Keypad buttons; even though there is no physical button or LED, the RadioRA2 system tracks the scenes and will "light" the LED that can be queried. -If a button is not programmed to control any lights or other devices in the RadioRA2 system but is given a name in the programming software, it will be available to fire events in Home Assistant. However, since there is no way to have a scene "active" on a button with no devices associated, the Main Repeater will automatically extinguish the keypad LED a few seconds after the button press. If you wish to have Home Assistant light the keypad LED after a button press, you will need to delay your service call to light the LED for several seconds, so it arrives after the Main Repeater has sent the command to turn it off. +If a button is not programmed to control any lights or other devices in the RadioRA2 system but is given a name in the programming software, it will be available to fire events in Home Assistant. However, since there is no way to have a scene "active" on a button with no devices associated, the Main Repeater will automatically extinguish the keypad LED a few seconds after the button press. If you wish to have Home Assistant light the keypad LED after a button press, you will need to delay your action to light the LED for several seconds, so it arrives after the Main Repeater has sent the command to turn it off. ## Scene diff --git a/source/_integrations/lutron_caseta.markdown b/source/_integrations/lutron_caseta.markdown index 4ca57f96e973..00cec8951744 100644 --- a/source/_integrations/lutron_caseta.markdown +++ b/source/_integrations/lutron_caseta.markdown @@ -80,11 +80,9 @@ lutron_caseta: ca_certs: caseta-bridge.crt ``` -<div class='note'> - +{% note %} Note that multiple hubs can be specified by using multiple configuration blocks, but each of them requires its own `keyfile`, `certfile`, and `ca_certs` to be generated and specified. - -</div> +{% endnote %} {% configuration %} host: @@ -105,13 +103,11 @@ Note that multiple hubs can be specified by using multiple configuration blocks, type: string {% endconfiguration %} -<div class='note'> - +{% tip %} It is recommended to assign a static IP address to your Lutron Smart Bridge. This ensures that it won't change IP address, so you won't have to change the `host` if it reboots and comes up with a different IP address. <br> Use a DHCP reservation on your router to reserve the address or in the PRO model of the Smart Bridge, set the IP address under Network Settings in the Advanced / Integration menu in the mobile app. - -</div> +{% endtip %} To get Lutron Caseta roller, honeycomb shades, wood blinds, lights, scene and switch working with Home Assistant, first follow the instructions for the general Lutron Caseta integration above. @@ -121,9 +117,9 @@ After setup, shades will appear in Home Assistant using an `entity_id` based on For more information on working with shades in Home Assistant, see the [Covers integration](/integrations/cover/). -Available services: `cover.open_cover`, `cover.close_cover`, `cover.stop_cover` and `cover.set_cover_position`. Cover `position` ranges from `0` for fully closed to `100` for fully open. +Available actions: `cover.open_cover`, `cover.close_cover`, `cover.stop_cover` and `cover.set_cover_position`. Cover `position` ranges from `0` for fully closed to `100` for fully open. -Available services for tilt-only wood blinds: `cover.open_cover_tilt`, `cover.close_cover_tilt`, `cover.stop_cover_tilt`, `cover.toggle_tilt`. Cover `position` is `0` or `100` for fully closed and `50` for fully open. +Available actions for tilt-only wood blinds: `cover.open_cover_tilt`, `cover.close_cover_tilt`, `cover.stop_cover_tilt`, `cover.toggle_tilt`. Cover `position` is `0` or `100` for fully closed and `50` for fully open. ## Light diff --git a/source/_integrations/madvr.markdown b/source/_integrations/madvr.markdown new file mode 100644 index 000000000000..2ef7307d0c7f --- /dev/null +++ b/source/_integrations/madvr.markdown @@ -0,0 +1,105 @@ +--- +title: madVR Envy +description: Instructions on how to integrate a madVR Envy into Home Assistant. +ha_category: + - Remote + - Binary Sensor + - Sensor +ha_release: '2024.8' +ha_iot_class: Local Push +ha_config_flow: true +ha_codeowners: + - '@iloveicedgreentea' +ha_domain: madvr +ha_platforms: + - binary_sensor + - remote + - sensor +ha_integration_type: device +--- + +The madVR Envy allows for the automation and control of [madVR Envy devices](https://madvrenvy.com). + +## Supported Devices + +This integration supports all current madVR Envy models. + +{% include integrations/config_flow.md %} + +## Remote + +The madVR Envy remote platform will create a [remote](/integrations/remote/) entity for the device. This entity allows you to send the following commands via the [remote.send_command](/integrations/remote/) action. + +The command structure uses the same keywords as the [official documentation](https://madvrenvy.com/wp-content/uploads/EnvyIpControl.pdf?r=113a) and simply sends the corresponding command to the device. Please refer to the official documentation for more details and usage. + +Using these commands, you can create a digital remote in the UI. + +### Single Commands + +These are commands that can be sent standalone, no parameters. + +- `PowerOff` +- `Standby` +- `Restart` +- `ReloadSoftware` +- `Bye` +- `ResetTemporary` +- `CloseMenu` +- `GetMaskingRatio` +- `GetMacAddress` +- `ToneMapOn` +- `ToneMapOff` +- `Hotplug` +- `RefreshLicenseInfo` +- `Force1080p60Output` + + +### Commands with Parameters + +These are commands that have parameters with a comma separating them. + +- `ActivateProfile (SOURCE | DISPLAY | CUSTOM)` +- `OpenMenu (Info | Settings | Configuration | Profiles | TestPatterns)` +- `KeyPress (MENU | UP | DOWN | LEFT | RIGHT | OK | INPUT | SETTINGS | RED | GREEN | BLUE | YELLOW | POWER)` +- `KeyHold (MENU | UP | DOWN | LEFT | RIGHT | OK | INPUT | SETTINGS | RED | GREEN | BLUE | YELLOW | POWER)` + +### Binary sensor + +The integration creates the following binary sensors: + +- `Power state` is On when the device is turned on. +- `Signal state` is On when the device is receiving a signal from the source. +- `HDR flag` is On when the device is receiving an HDR signal. This is useful to trigger automations based on the HDR flag, such as changing projector settings. +- `Outgoing HDR flag` is On when the device is sending an HDR signal. + +These can be used for various purposes, such as triggering your masking system based on the detected aspect ratio. + +### Sensor + +The integration creates the following sensors: + +- `MAC address`: The MAC address of the madVR Envy device. +- `Gpu temperature`: The temperature of the GPU. +- `Hdmi temperature`: The temperature of the HDMI interface. +- `Cpu temperature`: The temperature of the CPU. +- `Mainboard temperature`: The temperature of the mainboard. +- `Incoming resolution`: The resolution of the incoming video signal. +- `Incoming frame rate`: The frame rate of the incoming video signal. +- `Incoming color space`: The color space of the incoming video signal. +- `Incoming bit depth`: The bit depth of the incoming video signal. +- `Incoming colorimetry`: The colorimetry of the incoming video signal. +- `Incoming black levels`: The black level setting of the incoming video signal. +- `Incoming aspect ratio`: The aspect ratio of the incoming video signal. +- `Outgoing resolution`: The resolution of the outgoing video signal. +- `Outgoing frame rate`: The frame rate of the outgoing video signal. +- `Outgoing color space`: The color space of the outgoing video signal. +- `Outgoing bit depth`: The bit depth of the outgoing video signal. +- `Outgoing colorimetry`: The colorimetry of the outgoing video signal. +- `Outgoing black levels`: The black level setting of the outgoing video signal. +- `Aspect ratio resolution`: The resolution corresponding to the current aspect ratio. +- `Aspect ratio decimal`: The aspect ratio as a decimal value. +- `Aspect ratio integer`: The aspect ratio as an integer ratio. +- `Aspect ratio name`: The name of the current aspect ratio. +- `Masking resolution`: The resolution for the current masking setting. +- `Masking decimal`: The masking ratio as a decimal value. +- `Masking integer`: The masking ratio as an integer ratio. diff --git a/source/_integrations/mailgun.markdown b/source/_integrations/mailgun.markdown index 5c5f4def3f82..6e121b93eeb8 100644 --- a/source/_integrations/mailgun.markdown +++ b/source/_integrations/mailgun.markdown @@ -66,7 +66,7 @@ automation: ## Notifications -The Mailgun notification service allows you to send emails via Mailgun's REST API. It requires the [Mailgun component](#configuration) to be set up. +The Mailgun notification action allows you to send emails via Mailgun's REST API. It requires the [Mailgun component](#configuration) to be set up. ### Notifications configuration @@ -80,7 +80,7 @@ notify: {% configuration %} name: - description: "The optional parameter name allows multiple notifiers to be created. The notifier will bind to the service notify.NOTIFIER_NAME." + description: "The optional parameter name allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: false type: string default: notify diff --git a/source/_integrations/marytts.markdown b/source/_integrations/marytts.markdown index 609f2bd2a88f..6b2034515eab 100644 --- a/source/_integrations/marytts.markdown +++ b/source/_integrations/marytts.markdown @@ -14,7 +14,7 @@ related: title: Configuration file --- -The `marytts` text-to-speech {% term integration %} uses [MaryTTS](http://mary.dfki.de/) text-to-speech engine to read a text with natural sounding voices. +The `marytts` text-to-speech {% term integration %} uses [MaryTTS](https://marytts.github.io/) text-to-speech engine to read a text with natural sounding voices. ## Configuration @@ -59,7 +59,7 @@ effect: type: map {% endconfiguration %} -See [documentation](http://mary.dfki.de/documentation/index.html) for details. +See [documentation](https://marytts.github.io/documentation/index.html) for details. ## Speech effects diff --git a/source/_integrations/mastodon.markdown b/source/_integrations/mastodon.markdown index 04a6e61c3cba..844ac724ae9f 100644 --- a/source/_integrations/mastodon.markdown +++ b/source/_integrations/mastodon.markdown @@ -40,7 +40,7 @@ notify: {% configuration %} name: - description: "The optional parameter name allows multiple notifiers to be created. The notifier will bind to the service notify.NOTIFIER_NAME." + description: "The optional parameter name allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: false type: string default: notify @@ -65,26 +65,26 @@ base_url: ### Usage -Mastodon is a notify platform, and can be used by calling notify service as described in the [notify documentation](/integrations/notify/). It will toot messages using +Mastodon is a notify platform, and can be used by calling notify action as described in the [notify documentation](/integrations/notify/). It will toot messages using your account. An optional **target** parameter can be given to specify whether your toot will be public, private, unlisted, or direct. -| Service attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `message` | no | Body of the notification. | `target` | yes | If not used, will default to account setting. `public`: post will be public, `unlisted`: post will be public but not appear on the public timeline, `private`: post will only be visible to followers, and `direct`: post will only be visible to mentioned users. | `data` | yes | See below for extended functionality. -### Service data +### Action data The following attributes can be placed inside `data` for extended functionality. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `media` | yes | Attach an image or video to the message. | `media_warning` | yes | If an image or video is attached, `True`: will marked the media as sensitive. `False` is default. | `content_warning` | yes | Text will be be shown as a warning before the text of the status. If not used, no warning will be displayed. -### Example service call +### Example action This will post a message to Mastodon. Visibility will default to your account's setting. @@ -93,7 +93,7 @@ This will post a message to Mastodon. Visibility will default to your account's message: "A toot from Home Assistant" ``` -### Example service call - private +### Example action - private This will post a message to Mastodon, but visibility is marked as `private` so only followers will see it. @@ -103,7 +103,7 @@ This will post a message to Mastodon, but visibility is marked as `private` so o target: private ``` -### Example service call - with media +### Example action - with media This will post a message to Mastodon that includes an image. @@ -114,7 +114,7 @@ This will post a message to Mastodon that includes an image. media: /config/www/funny_meme.png ``` -### Example service call - with media and content warning to hide post behind a warning +### Example action - with media and content warning to hide post behind a warning This will post a message to Mastodon that includes an image and a target of `unlisted`, so it doesn't show in the public timeline. diff --git a/source/_integrations/matrix.markdown b/source/_integrations/matrix.markdown index a94c3500060c..44ed36f557e7 100644 --- a/source/_integrations/matrix.markdown +++ b/source/_integrations/matrix.markdown @@ -89,11 +89,9 @@ commands: default: empty {% endconfiguration %} -<div class="note"> - +{% warning %} In order to prevent infinite loops when reacting to commands, you have to use a separate account for the Matrix integration. - -</div> +{% endwarning %} ### Event data @@ -175,7 +173,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string @@ -222,8 +220,7 @@ action: - /path/to/picture.jpg ``` -<div class='note'> - +{% important %} If you need to include a file from an external folder in your notifications, you will have to [list the source folder as allowed](/integrations/homeassistant/#allowlist_external_dirs). ```yaml @@ -233,5 +230,4 @@ homeassistant: allowlist_external_dirs: - /tmp ``` - -</div> +{% endimportant %} diff --git a/source/_integrations/matter.markdown b/source/_integrations/matter.markdown index 7ba89330df13..2b99616dc6b0 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -8,6 +8,8 @@ ha_category: - Fan - Light - Lock + - Number + - Select - Sensor - Switch ha_release: '2022.12' @@ -25,6 +27,8 @@ ha_platforms: - fan - light - lock + - number + - select - sensor - switch ha_integration_type: integration @@ -42,9 +46,9 @@ The Matter integration allows you to control Matter devices on your local Wi-Fi For communicating with Matter devices, the Home Assistant integration runs its own "Matter controller" as add-on. This Matter Server add-on runs the controller software as a separate process and connects your Matter network (called Fabric in technical terms) and Home Assistant. The Home Assistant Matter integration connects to this server via a WebSocket connection. -<div class='note warning'> +{% warning %} The integration is marked BETA: Both the Matter standard itself and its implementation within Home Assistant are in an early stage. You may run into compatibility issues and/or other bugs. -</div> +{% endwarning %} # Introduction - What is Matter? @@ -80,9 +84,9 @@ Don't assume Matter support when you see a Thread logo on a device. Always look Most (if not all) Matter-compliant devices have a Bluetooth chip onboard to ease {% term commissioning %}. Bluetooth is not used to control but to pair a device after unboxing or after factory resetting. The Home Assistant controller uses the Home Assistant Companion app for {% term commissioning %}. During commissioning, you need to bring your phone close to the device. The controller then sends your network credentials to your device over Bluetooth. Once that is done, the device communicates over its native interface: Wi-Fi or Thread. -<div class='note'> +{% note %} Although your Home Assistant server might have a Bluetooth adapter on board that the controller can use to {% term commission %} devices, Home Assistant does not utilize that adapter. Mainly to prevent issues with the built-in Bluetooth integration but also because it is easier to bring your mobile devices close to the Matter device than bringing the device near your server. -</div> +{% endnote %} ## Multi fabric: join to multiple controllers @@ -174,14 +178,14 @@ This guide describes how to add a new device. This will use the Bluetooth connec - Scan the QR code. - When prompted to **Choose an app**, make sure to select Home Assistant. - Once the process is complete, select **Done**, then select **Add device**. -4. If you did not see a pop-up, go to {% my integrations title="**Settings** > **Devices & Services**" %}. +4. If you did not see a pop-up, go to {% my integrations title="**Settings** > **Devices & services**" %}. - On the **Devices** tab, select the **Add device** button, and select **Add Matter device**. - In the dialog, select **No, it's new.**. - Scan the QR-code of the Matter device with your phone camera or select **Setup without QR-code** to manually enter the commission code. - This starts the commissioning process which may take a few minutes. - If you're adding a test board (e.g. ESP32 running the example apps) and commissioning fails, you might need to take some actions in the Google Developer console, have a look at any instructions for your test device. - Once the process is complete, select **Done**. -5. To view the device details, go to {% my integrations title="**Settings** > **Devices & Services**" %} and select the **Matter** integration. +5. To view the device details, go to {% my integrations title="**Settings** > **Devices & services**" %} and select the **Matter** integration. 6. By default, the device gets a factory specified name. To rename it, on the device page, select the pencil to edit and rename the device. ![image](/images/integrations/matter/matter-android-rename.png) 7. Your device is now ready to use. @@ -271,7 +275,7 @@ Follow these steps if you have added a Matter device to Home Assistant and you w - There is no need to press a hardware button on the device to set it to commissioning mode. 4. To join the device to the other platform, in their app, scan the QR code or enter the sharing code. 5. Follow the instructions in their app. Once the process is complete, you can see that the device is shared in Home Assistant: - - Next to the **Share device** button, select the three dots menu, then **Manage fabrics**. + - Next to the **Share device** button, select the three dots {% icon "mdi:dots-vertical" %} menu, then **Manage fabrics**. - In the list there, the new platform should be listed. - For example, if you shared it with Google Home, it lists **Google LLC**. ![image](/images/integrations/matter/matter_share-device-with-other-platform.png) diff --git a/source/_integrations/mealie.markdown b/source/_integrations/mealie.markdown new file mode 100644 index 000000000000..3239a8802bd1 --- /dev/null +++ b/source/_integrations/mealie.markdown @@ -0,0 +1,120 @@ +--- +title: Mealie +description: Instructions on how to setup Mealie devices in Home Assistant. +ha_category: + - Calendar + - To-do list +ha_config_flow: true +ha_release: 2024.7 +ha_iot_class: Local Polling +ha_codeowners: + - '@joostlek' + - '@andrew-codechimp' +ha_domain: mealie +ha_platforms: + - calendar + - todo +ha_integration_type: service +--- + + +The Mealie integration will fetch data from your [Mealie instance](https://mealie.io/). + +## Prerequisites + +You create your API token on your Mealie installation: + +1. Sign in to Mealie. +2. Go to your user (profile). +3. Go to **Manage Your API Tokens** under (`/user/profile/api-tokens`). +4. Enter a meaningful token name, such as 'Home Assistant'. +5. Select **Generate**. +6. Copy the token that now appears so that you can later paste it into Home Assistant. + +{% include integrations/config_flow.md %} + +## Available calendars + +The integration will create a calendar for every type of meal plan: + +- Breakfast +- Lunch +- Dinner +- Side + +## Shopping Lists + +The integration will create a to-do list for every Mealie shopping list. + +## Actions + +The Mealie integration has the following actions: + +- `mealie.get_mealplan` +- `mealie.get_recipe` +- `mealie.import_recipe` + +### Action `mealie.get_mealplan` + +Get the meal plan for a specified range. + +| Data attribute | Optional | Description | +|------------------------|----------|----------------------------------------------------------| +| `config_entry_id` | No | The ID of the Mealie config entry to get data from. | +| `start_date` | Yes | The start date of the meal plan. (today if not supplied) | +| `end_date` | Yes | The end date of the meal plan. (today if not supplied) | + +### Action `mealie.get_recipe` + +Get the recipe for a specified recipe ID or slug. + +| Data attribute | Optional | Description | +|------------------------|----------|-----------------------------------------------------| +| `config_entry_id` | No | The ID of the Mealie config entry to get data from. | +| `recipe_id` | No | The ID or the slug of the recipe to get. | + +### Action `mealie.import_recipe` + +Import the recipe into Mealie from a URL. + +| Data attribute | Optional | Description | +|------------------------|----------|-----------------------------------------------------------------| +| `config_entry_id` | No | The ID of the Mealie config entry to get data from. | +| `url` | No | The URL of the recipe. | +| `include_tags` | Yes | Include tags from the website to the recipe. (false by default) | + +{% tip %} +You can get your `config_entry_id` by using actions within [Developer Tools](/docs/tools/dev-tools/), using one of the above actions and viewing the YAML. +{% endtip %} + +## Examples + +{% details "Example template sensor using get_mealplan" %} + +Example template sensor that contains today's dinner meal plan entries: + +{% raw %} + +```yaml +template: + - trigger: + - platform: time_pattern + hours: /1 + action: + - service: mealie.get_mealplan + data: + config_entry_id: YOUR_MEALIE_CONFIG_ENTITY_ID + response_variable: result + sensor: + - name: "Dinner today" + unique_id: mealie_dinner_today + state: > + {% for meal in result.mealplan if meal.entry_type == "dinner" -%} + {{ meal.recipe['name'] if meal.recipe is not none else meal.title }} + {{ ", " if not loop.last }} + {%- endfor %} +``` + +{% endraw %} + +{% enddetails %} diff --git a/source/_integrations/media_extractor.markdown b/source/_integrations/media_extractor.markdown index 2c4c6e745fed..e2b130a2f901 100644 --- a/source/_integrations/media_extractor.markdown +++ b/source/_integrations/media_extractor.markdown @@ -18,29 +18,29 @@ ha_config_flow: true The Media extractor {% term integration %} gets a stream URL and sends it to a media player entity. This integration can extract entity specific streams if configured accordingly. -<div class='note'> +{% note %} Media extractor doesn't transcode streams, it just tries to find a stream that matches the requested query. -</div> +{% endnote %} {% include integrations/config_flow.md %} -### Play media service +### Play media actions -Navigate to the **Services** tab inside **Developer Tools**. From the "Service" dropdown menu select `media_extractor.play_media` and then press the "Fill Example Data" button at the bottom of the page. Use the "Entity ID" dropdown to select your media player and then press the **Call Service** button. +Navigate to the **Actions** tab inside **Developer Tools**. From the **Actions** dropdown menu select `media_extractor.play_media` and then press the "Fill Example Data" button at the bottom of the page. Use the "Entity ID" dropdown to select your media player and then press the **Perform action** button. This will download the file from the given URL. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------- | | `entity_id` | yes | Name(s) of entities to seek media on, e.g., `media_player.living_room_chromecast`. Defaults to all. | | `media_content_id` | no | The ID of the content to play. Platform dependent. | | `media_content_type` | no | The type of the content to play. Must be one of MUSIC, TVSHOW, VIDEO, EPISODE, CHANNEL or PLAYLIST MUSIC. | -### Extract media URL service +### Extract media URL action -There is also a service that will directly return the URL in the response of the service. +There is also a action that will directly return the URL in the response of the action. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------ | | `url` | no | The URL of the media to extract. | | `format_query` | yes | The query that will be used to select the right media. | diff --git a/source/_integrations/media_player.markdown b/source/_integrations/media_player.markdown index 96dc74c90e5c..1e0c61169fa5 100644 --- a/source/_integrations/media_player.markdown +++ b/source/_integrations/media_player.markdown @@ -20,39 +20,39 @@ Interacts with media players on your network. {% include integrations/building_block_integration.md %} -## Services +## Actions -### Media control services -Available services: `turn_on`, `turn_off`, `toggle`, `volume_up`, `volume_down`, `volume_set`, `volume_mute`, `media_play_pause`, `media_play`, `media_pause`, `media_stop`, `media_next_track`, `media_previous_track`, `clear_playlist`, `shuffle_set`, `repeat_set`, `play_media`, `select_source`, `select_sound_mode`, `join`, `unjoin` +### Media control actions +Available actions: `turn_on`, `turn_off`, `toggle`, `volume_up`, `volume_down`, `volume_set`, `volume_mute`, `media_play_pause`, `media_play`, `media_pause`, `media_stop`, `media_next_track`, `media_previous_track`, `clear_playlist`, `shuffle_set`, `repeat_set`, `play_media`, `select_source`, `select_sound_mode`, `join`, `unjoin` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | yes | Target a specific media player. To target all media players, use `all`. | -#### Service `media_player.volume_mute` +#### Action `media_player.volume_mute` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|--------------------------------------------------| | `entity_id` | yes | Target a specific media player. To target all media players, use `all`. | | `is_volume_muted` | no | True/false for mute/unmute | -#### Service `media_player.volume_set` +#### Action `media_player.volume_set` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|--------------------------------------------------| | `entity_id` | yes | Target a specific media player. To target all media players, use `all`. | | `volume_level` | no | Float for volume level. Range 0..1 | -#### Service `media_player.media_seek` +#### Action `media_player.media_seek` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|--------------------------------------------------------| | `entity_id` | yes | Target a specific media player. To target all media players, use `all`. | | `seek_position` | no | Position to seek to. The format is platform dependent. | -#### Service `media_player.play_media` +#### Action `media_player.play_media` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | -----------------------| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | yes | Target a specific media player. To target all media players, use `all`. | | `media_content_id` | no | A media identifier. The format of this is integration dependent. For example, you can provide URLs to Sonos and Cast but only a playlist ID to iTunes. | @@ -122,7 +122,7 @@ Documentation: - [Google Dev Documentation MediaInformation](https://developers.google.com/cast/docs/reference/web_receiver/cast.framework.messages.MediaInformation) -Example of calling media_player service with title and image set: +Example of calling media player action with title and image set: ```yaml service: media_player.play_media @@ -136,50 +136,50 @@ data: title: HomeAssistantRadio ``` -#### Service `media_player.select_source` +#### Action `media_player.select_source` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | yes | Target a specific media player. To target all media players, use `all`. | | `source` | no | Name of the source to switch to. Platform dependent. | -#### Service `media_player.select_sound_mode` +#### Action `media_player.select_sound_mode` Currently only supported on [Denon AVR](/integrations/denonavr/) and [Songpal](/integrations/songpal). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | yes | Target a specific media player. For example `media_player.marantz`| | `sound_mode` | no | Name of the sound mode to switch to. Platform dependent.| -#### Service `media_player.shuffle_set` +#### Action `media_player.shuffle_set` Currently only supported on [Sonos](/integrations/sonos), [Spotify](/integrations/spotify), [MPD](/integrations/mpd), [Kodi](/integrations/kodi), [Roon](/integrations/roon), [OwnTone](/integrations/forked_daapd), [Squeezebox](/integrations/squeezebox) and [Universal](/integrations/universal). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | yes | Target a specific media player. For example `media_player.spotify`| | `shuffle` | no | `true`/`false` for enabling/disabling shuffle | -#### Service `media_player.repeat_set` +#### Action `media_player.repeat_set` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | yes | Target a specific media player. For example `media_player.kitchen`| | `repeat` | no | `off`/`all`/`one` for setting repeat mode | -#### Service `media_player.join` +#### Action `media_player.join` Allows to group media players together for synchronous playback. Only works on supported multiroom audio systems. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | yes | The media player entity whose playback will be expanded to the players specified in `group_members`. | | `group_members` | no | The player entities which will be synced with the playback from `entity_id`. | -#### Service `media_player.unjoin` +#### Action `media_player.unjoin` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | yes | Unjoin this media player from any player groups. | diff --git a/source/_integrations/media_source.markdown b/source/_integrations/media_source.markdown index fa6260eabb3e..76aad90c36e3 100644 --- a/source/_integrations/media_source.markdown +++ b/source/_integrations/media_source.markdown @@ -62,21 +62,18 @@ homeassistant: recording: /mnt/recordings ``` -<div class='note'> - - If you want to use media from a network storage, the network storage must be connected first. Refer to [these instructions on how to connect network storage](/common-tasks/os/#network-storage). - - The media from the network storage is then automatically added to the local media browser. - -</div> +{% tip %} +If you want to use media from a network storage, the network storage must be connected first. Refer to [these instructions on how to connect network storage](/common-tasks/os/#network-storage). +The media from the network storage is then automatically added to the local media browser. +{% endtip %} ## Playing media from a media source -To play media from a media source via a service call, use the uri +To play media from a media source via an action, use the uri scheme `media-source://media_source/<media_dir>/<path>`. Default `media_dir` is `local`. -<div class="note"> +{% note %} Web browsers and Google Cast media players have very limited video container and codec support. The media source integration does not do any transcoding of media, meaning media files must be natively supported by your media player or @@ -86,7 +83,7 @@ If a video file is not supported by your media player or web browser it will fail to play. Please check the documentation of your media player or web browser for lists of supported video formats. -</div> +{% endnote %} Example: diff --git a/source/_integrations/melcloud.markdown b/source/_integrations/melcloud.markdown index 97ab553a1722..97bbbdb7f894 100644 --- a/source/_integrations/melcloud.markdown +++ b/source/_integrations/melcloud.markdown @@ -9,9 +9,12 @@ ha_config_flow: true ha_domain: melcloud ha_platforms: - climate + - diagnostics - sensor - water_heater ha_integration_type: integration +ha_codeowners: + - '@erwindouna' --- The `melcloud` integration integrates Mitsubishi Electric's [MELCloud](https://www.melcloud.com/) enabled devices into Home Assistant. @@ -50,7 +53,7 @@ The following parameters can be controlled for the `climate` platform entities: #### Controlling vanes -The horizontal and vertical vane positions can be controlled using the corresponding `melcloud.set_vane_horizontal` and `melcloud.set_vane_vertical` services. +The horizontal and vertical vane positions can be controlled using the corresponding `melcloud.set_vane_horizontal` and `melcloud.set_vane_vertical` actions. Swing mode can also be used to control vertical vane position. diff --git a/source/_integrations/message_bird.markdown b/source/_integrations/message_bird.markdown index ddc9668314d9..a55308738d40 100644 --- a/source/_integrations/message_bird.markdown +++ b/source/_integrations/message_bird.markdown @@ -39,7 +39,7 @@ api_key: required: true type: string name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string @@ -52,9 +52,9 @@ sender: ### Usage -MessageBird is a notify platform and thus can be controlled by calling the notify service [as described here](/integrations/notify/). It will send a notification to the specified mobile phone number(s). +MessageBird is a notify platform and thus can be controlled by calling the notify action [as described here](/integrations/notify/). It will send a notification to the specified mobile phone number(s). -#### Example service payload +#### Example action payload ```json { diff --git a/source/_integrations/met_eireann.markdown b/source/_integrations/met_eireann.markdown index fe28adcb9ae6..29c317692d75 100644 --- a/source/_integrations/met_eireann.markdown +++ b/source/_integrations/met_eireann.markdown @@ -16,11 +16,9 @@ ha_integration_type: integration The Met Éireann integration uses the [Met Éireann](https://met.ie) (The Irish Meteorological Service) Public Weather Forecast API to provide current and forecasted weather data for a given location. This integration is in no way affiliated with or endorsed by Met Éireann. -<div class="note"> - +{% note %} The Met Éireann API will only provide data for Ireland, the UK and a small part of northern France. For specific coverage, please see the Notes on API document available [here](https://data.gov.ie/dataset/met-eireann-weather-forecast-api/resource/027da6d5-d819-48d1-9b16-331dba169bd1). - -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/meteo_france.markdown b/source/_integrations/meteo_france.markdown index 7a3ea544391f..86f225cfc8c5 100644 --- a/source/_integrations/meteo_france.markdown +++ b/source/_integrations/meteo_france.markdown @@ -57,17 +57,17 @@ All the following sensors will be created : Warning: The probability entities data are not always provided by the API. They are added only if available. -To enable an entity disabled by default, go in **Settings** -> **Devices & Services**, click on the city name in **Météo-France** and then the **X entities** link. You will have the list of the enabled entities. Here click the filter button and select **Show disable entities**. The disabled entities will be visible in the list, select the one you want to enable and click the **Enable Selected** button. +To enable an entity disabled by default, go in **Settings** -> **Devices & services**, click on the city name in **Météo-France** and then the **X entities** link. You will have the list of the enabled entities. Here click the filter button and select **Show disable entities**. The disabled entities will be visible in the list, select the one you want to enable and click the **Enable Selected** button. ### About `next_rain` condition sensor -<div class='note warning'> +{% note %} - The 1 hour rain forecast is supported for more than 75 % of metropolitan France.<br/> +The 1 hour rain forecast is supported for more than 75 % of metropolitan France.<br/> - ![Rain coverage map](/images/integrations/meteo_france/carte-couverture-du-service.png) +![Rain coverage map](/images/integrations/meteo_france/carte-couverture-du-service.png) -</div> +{% endnote %} The attributes allow to have a forecast of the rain type by 5 to 10 minutes intervals: @@ -99,9 +99,9 @@ forecast_time_ref: '2020-08-20T19:25:00+00:00' ### About `weather_alert` sensor -<div class='note warning'> - The weather alert is available for the metropolitan France and Andorre. -</div> +{% note %} +The weather alert is available for the metropolitan France and Andorre. +{% endnote %} The `weather_alert` sensor state give the current weather alert status for the department linked to the city. Only one entity by department is created. diff --git a/source/_integrations/meteoalarm.markdown b/source/_integrations/meteoalarm.markdown index 1f98c75c2049..817d518aa39c 100644 --- a/source/_integrations/meteoalarm.markdown +++ b/source/_integrations/meteoalarm.markdown @@ -104,6 +104,6 @@ automation: {% endraw %} -<div class='note warning'> +{% note %} This integration is not affiliated with MeteoAlarm and retrieves data from the website by using the XML feeds. Use it at your own risk. -</div> +{% endnote %} diff --git a/source/_integrations/microsoft.markdown b/source/_integrations/microsoft.markdown index e8ac566daf23..7fe4206ca976 100644 --- a/source/_integrations/microsoft.markdown +++ b/source/_integrations/microsoft.markdown @@ -74,19 +74,15 @@ region: default: "`eastus`" {% endconfiguration %} -<div class='note'> - +{% note %} Not all Azure regions support high-quality neural voices. Use [this overview](https://learn.microsoft.com/azure/cognitive-services/speech-service/regions) to determine the availability of standard and neural voices by region/endpoint. New users ([any newly created Azure Speech resource after August 31st, 2021](https://learn.microsoft.com/azure/cognitive-services/speech-service/text-to-speech#more-about-neural-text-to-speech-features)) can only use neural voices. Existing resources can continue using standard voices through August 31st, 2024. +{% endnote %} -</div> - -<div class='note'> - +{% important %} If you set the language to anything other than the default `en-us`, you will need to specify a matching voice type as well. - -</div> +{% endimportant %} ## Full configuration example diff --git a/source/_integrations/microsoft_face.markdown b/source/_integrations/microsoft_face.markdown index dd2f6a65a2c6..47a51b2fbe7d 100644 --- a/source/_integrations/microsoft_face.markdown +++ b/source/_integrations/microsoft_face.markdown @@ -59,7 +59,7 @@ This limits the processing and detection to elements provided by the group. Home Assistant creates an entity for all groups and allows you to show the state, person, and IDs directly on the frontend. -The following services are available for managing this feature and can be called +The following actions are available for managing this feature and can be called via the Frontend, a script, or the REST API. - *microsoft_face.create_group* diff --git a/source/_integrations/microsoft_face_detect.markdown b/source/_integrations/microsoft_face_detect.markdown index eccd546a6df1..c4c4963e5e83 100644 --- a/source/_integrations/microsoft_face_detect.markdown +++ b/source/_integrations/microsoft_face_detect.markdown @@ -23,11 +23,9 @@ how to setup the API key. For using the result inside an automation rule, take a look at the [Image Processing integration](/integrations/image_processing/) page. -<div class='note'> - +{% important %} The free version of the Microsoft Face identify API limits the number of requests possible per month. Therefore, it is strongly recommended that you limit the `scan_interval` when setting up an instance of this entity as detailed on the main [Image Processing integration](/integrations/image_processing/) page. - -</div> +{% endimportant %} ### Configuration diff --git a/source/_integrations/microsoft_face_identify.markdown b/source/_integrations/microsoft_face_identify.markdown index 87cfb45fbe72..e344c07eab04 100644 --- a/source/_integrations/microsoft_face_identify.markdown +++ b/source/_integrations/microsoft_face_identify.markdown @@ -23,11 +23,9 @@ how to setup the API key. For using the result inside an automation rule, take a look at the [Image Processing integration](/integrations/image_processing/) page. -<div class='note'> - +{% important %} The free version of the Microsoft Face identify API limits the number of requests possible per month. Therefore, it is strongly recommended that you limit the `scan_interval` when setting up an instance of this entity as detailed on the main [Image Processing integration](/integrations/image_processing/) page. - -</div> +{% endimportant %} ### Configuration diff --git a/source/_integrations/mill.markdown b/source/_integrations/mill.markdown index 4937426c8551..8cb9a95d93ab 100644 --- a/source/_integrations/mill.markdown +++ b/source/_integrations/mill.markdown @@ -22,13 +22,13 @@ Integrates Mill heater into Home Assistant. You can configure it for cloud access or local access. Local access requires Generation 3 heaters (Sold from Autumn 2021) -## Integration services +## Actions -This cloud integration supports a service to set the temperature for the room connected to heater in the Mill app: +This cloud integration supports an action to set the temperature for the room connected to heater in the Mill app: `mill.set_room_temperature` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `room_name` | no | String with room name. | `away_temp` | yes | Integer with temperature diff --git a/source/_integrations/minecraft_server.markdown b/source/_integrations/minecraft_server.markdown index 20d4a2d30cdc..51636ae55695 100644 --- a/source/_integrations/minecraft_server.markdown +++ b/source/_integrations/minecraft_server.markdown @@ -20,11 +20,9 @@ ha_integration_type: integration [Minecraft](https://www.minecraft.net/en-us) is a sandbox video game developed by Mojang Studios. Minecraft servers allow players to play the game online or via a local area network with other players. The **Minecraft Server** integration lets you retrieve information from a Minecraft server within Home Assistant. Both **Java Edition** and **Bedrock Edition** servers are supported. -<div class='note'> - +{% important %} Minecraft Java Edition servers must be version 1.7 or newer, since older versions don't expose any information. - -</div> +{% endimportant %} {% include integrations/config_flow.md %} @@ -34,11 +32,9 @@ During setup you will be prompted to enter the **name** and the **address** of t The **server name** can be chosen freely. -<div class='note'> - +{% note %} Default is `Minecraft Server`. - -</div> +{% endnote %} ### Server address @@ -48,13 +44,11 @@ The **server address** is a combination of the hostname and the port, where the - **Hostname**: `mc.hypixel.net:25565` or `mc.hypixel.net` - **IP address**: `192.168.0.123:19132` or `192.168.0.123` -<div class='note'> - +{% note %} Default is `localhost:25565`. Bedrock Edition servers don't support SRV records. - -</div> +{% endnote %} ## Binary sensors @@ -80,8 +74,6 @@ For Bedrock Edition servers following sensors are provided additionally: - Game mode - Map name -<div class='note'> - +{% note %} Player names are only available on Java Edition servers. Depending on the server, the player names list may not be shown completely. Some servers and plugins limit or completely hide this list or even replace the player names with fake ones to show some custom messages there. - -</div> +{% endnote %} diff --git a/source/_integrations/mini_connected.markdown b/source/_integrations/mini_connected.markdown new file mode 100644 index 000000000000..7938fac86de0 --- /dev/null +++ b/source/_integrations/mini_connected.markdown @@ -0,0 +1,38 @@ +--- +title: MINI Connected +description: Get the status and control your MINI vehicle, using the BMW Connected Drive integration +ha_category: + - Binary sensor + - Button + - Car + - Lock + - Notifications + - Number + - Presence detection + - Select + - Sensor + - Switch +ha_release: 2024.8 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_integration_type: virtual +ha_supporting_domain: bmw_connected_drive +ha_supporting_integration: BMW Connected Drive +ha_codeowners: + - '@gerard33' + - '@rikroe' +ha_domain: mini_connected +ha_platforms: + - binary_sensor + - button + - device_tracker + - diagnostics + - lock + - notify + - number + - select + - sensor + - switch +--- + +{% include integrations/supported_brand.md %} diff --git a/source/_integrations/minio.markdown b/source/_integrations/minio.markdown index 6932373dd74e..6c6d687463c8 100644 --- a/source/_integrations/minio.markdown +++ b/source/_integrations/minio.markdown @@ -121,39 +121,39 @@ automation: {% endraw %} -## Platform services +## Actions -These services are provided: +These actions are provided: - `get` - `put` - `remove` -### Service `minio.get` +### Action `minio.get` Download file. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ---------------------------------- | | `bucket` | yes | Bucket to use | | `key` | yes | Object key of the file | | `file_path` | yes | File path on the local file system | -### Service `minio.put` +### Action `minio.put` Upload file. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ---------------------------------- | | `bucket` | yes | Bucket to use | | `key` | yes | Object key of the file | | `file_path` | yes | File path on the local file system | -### Service `minio.remove` +### Action `minio.remove` Delete file. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ---------------------- | | `bucket` | yes | Bucket to use | | `key` | yes | Object key of the file | diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index 7beb76bd1d10..ea1d3672d945 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -1392,11 +1392,9 @@ sensors: type: string {% endconfiguration %} -<div class='note'> - +{% note %} If you specify scale or offset as floating point values, double precision floating point arithmetic will be used to calculate final value. This can cause loss of precision for values that are larger than 2^53. - -</div> +{% endnote %} ### Example: sensor configuration @@ -1604,11 +1602,11 @@ Some parameters exclude other parameters, the following tables show what can be | swap: word_byte | No | No | No | Yes | Yes | -# modbus services +# Actions -The modbus integration provides two generic write services in addition to the platform-specific services. +The modbus integration provides two generic write actions in addition to the platform-specific actions. -| Service | Description | +| Action | Description | | --------------------- | --------------------------- | | modbus.write_register | Write register or registers | | modbus.write_coil | Write coil or coils | @@ -1623,19 +1621,6 @@ Description: | value | (write_register) A single value or an array of 16-bit values. Single value will call modbus function code 0x06. Array will call modbus function code 0x10. Values might need reverse ordering. E.g., to set 0x0004 you might need to set `[4,0]`, this depend on the byte order of your CPU | | state | (write_coil) A single boolean or an array of booleans. Single boolean will call modbus function code 0x05. Array will call modbus function code 0x0F | -The modbus integration also provides communication stop/restart services. These services will not do any reconfiguring, but simply stop/start the modbus communication layer. - -| Service | Description | -| -------------- | --------------------------------------------- | -| modbus.stop | Stop communication | -| modbus.restart | Restart communication (Stop first if running) | - -Description: - -| Attribute | Description | -| --------- | ------------------------------------------------ | -| hub | Hub name (defaults to 'modbus_hub' when omitted) | - ## Example: writing a float32 type register To write a float32 datatype register use network format like `10.0` == `0x41200000` (network order float hexadecimal). @@ -1649,17 +1634,17 @@ data: value: [0x4120, 0x0000] ``` -## Service `modbus.set-temperature` +## Action `modbus.set-temperature` -| Service | Description | +| Action | Description | | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | set_temperature | Set temperature. Requires `value` to be passed in, which is the desired target temperature. `value` should be in the same type as `data_type` | -## Service `modbus.set_hvac_mode` +## Action `modbus.set_hvac_mode` -| Service | Description | +| Action | Description | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| set_hvac_mode | Set HVAC mode. Requires `value` to be passed in, which is the desired mode. `value` should be a valid HVAC mode. A mapping between the desired state and the value to be written to the HVAC mode register must exist. Calling this service will also set the On/Off register to an appropriate value, if such a register is defined. | +| set_hvac_mode | Set HVAC mode. Requires `value` to be passed in, which is the desired mode. `value` should be a valid HVAC mode. A mapping between the desired state and the value to be written to the HVAC mode register must exist. Performing this action will also set the On/Off register to an appropriate value, if such a register is defined. | # Opening an issue diff --git a/source/_integrations/modern_forms.markdown b/source/_integrations/modern_forms.markdown index 162d4080aa09..cff02a1c20a3 100644 --- a/source/_integrations/modern_forms.markdown +++ b/source/_integrations/modern_forms.markdown @@ -27,19 +27,17 @@ ha_integration_type: integration {% include integrations/config_flow.md %} -<div class='note'> - -If the Modern Forms fan does not have a light unit installed, then the Light entities and services will not show up. - -</div> +{% note %} +If the Modern Forms fan does not have a light unit installed, then the Light entities and actions will not show up. +{% endnote %} ## Fans -The Modern Forms integration has support for the Modern Forms fans. This includes directional support, and sleep timer services for the fan. +The Modern Forms integration has support for the Modern Forms fans. This includes directional support, and sleep timer actions for the fan. ## Lights -The Modern Forms integration has support for the Modern Forms fans light. This includes brightness, and sleep timer services for the light. +The Modern Forms integration has support for the Modern Forms fans light. This includes brightness, and sleep timer actions for the light. ## Binary sensors @@ -62,34 +60,32 @@ The Modern Forms integration provides support for the following toggleable attri - Away mode - to allow the fan simulate someone being home. - Adaptive learning - for allow learning for away mode. -## Services +## Actions -### Service `modern_forms.clear_fan_sleep_timer` +### Action `modern_forms.clear_fan_sleep_timer` -This service will clear the sleep timer for the fan if it has been set. It will not turn off the fan when the timer is cleared. +This action will clear the sleep timer for the fan if it has been set. It will not turn off the fan when the timer is cleared. -### Service `modern_forms.clear_light_sleep_timer` +### Action `modern_forms.clear_light_sleep_timer` -This service will clear the sleep timer for the light if it has been set. It will not turn off the light when the timer is cleared. +This action will clear the sleep timer for the light if it has been set. It will not turn off the light when the timer is cleared. -### Service `modern_forms.set_fan_sleep_timer` +### Action `modern_forms.set_fan_sleep_timer` -This service will set a sleep timer for the fan. When the sleep timer is expired it will turn off the fan. +This action will set a sleep timer for the fan. When the sleep timer is expired it will turn off the fan. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | -------------------------------------------------- | | `sleep_time` | yes | The amount of time in minutes to set the sleep timer for. This is time in minutes from 1 to 1440 (1 day). | -### Service `modern_forms.set_light_sleep_timer` +### Action `modern_forms.set_light_sleep_timer` -This service will set a sleep timer for the light. When the sleep timer is expired it will turn off the light. +This action will set a sleep timer for the light. When the sleep timer is expired it will turn off the light. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | -------------------------------------------------- | | `sleep_time` | yes | The amount of time in minutes to set the sleep timer for. This is time in minutes from 1 to 1440 (1 day).| -<div class='note'> - +{% note %} Modern Forms Fans use NTP to pool.ntp.org in order to set its internal clock and check of sleep timers have expired. Sleep timers will only work if the Modern Forms Fans have internet NTP access. You can block off cloud access for the fan and only leave NTP (UDP port 123) outbound working for the sleep timers. - -</div> +{% endnote %} diff --git a/source/_integrations/moehlenhoff_alpha2.markdown b/source/_integrations/moehlenhoff_alpha2.markdown index 41b3830773b6..47c78c97ef85 100644 --- a/source/_integrations/moehlenhoff_alpha2.markdown +++ b/source/_integrations/moehlenhoff_alpha2.markdown @@ -42,15 +42,15 @@ Please note that after changing the temperature in Home Assistant, it may take up to 10 minutes for your room control units to display these changes. -### Integration services +### Actions -This integration supports the following services (see [Climate](/integrations/climate/)). +This integration supports the following actions (see [Climate](/integrations/climate/)). -- [`set_temperature`](/integrations/climate/#service-climateset_temperature) -- [`set_hvac_mode`](/integrations/climate/#service-climateset_hvac_mode) +- [`set_temperature`](/integrations/climate/#action-climateset_temperature) +- [`set_hvac_mode`](/integrations/climate/#action-climateset_hvac_mode) - `heat` for heating mode - `cool` for cooling mode -- [`set_preset_mode`](/integrations/climate/#service-climateset_preset_mode) +- [`set_preset_mode`](/integrations/climate/#action-climateset_preset_mode) - `auto` enable schedule based operation - `day` enable day mode - `night` enable night mode diff --git a/source/_integrations/monoprice.markdown b/source/_integrations/monoprice.markdown index 6567f0ba2e9e..f9ca7ccade19 100644 --- a/source/_integrations/monoprice.markdown +++ b/source/_integrations/monoprice.markdown @@ -31,11 +31,11 @@ Sources can also be later edited from the integration options (gear icon in the Devices and entities are created for each of the possible 18 zones, and can be enabled, disabled and renamed through regular Home Assistant methods. By default, the first 6 zones (11..16) are enabled, and there's an attempt to automatically detect the 12 extension zones (21..26, and 31..36) on the first run. -## Services +## Actions -### Service `monoprice.snapshot` +### Action `monoprice.snapshot` -Take a snapshot of one or more zones' states. This service, and the following one are useful if you want to play a doorbell or notification sound and resume playback afterward. If `entity_id` is `all`, all zones are snapshotted. +Take a snapshot of one or more zones' states. This action, and the following one are useful if you want to play a doorbell or notification sound and resume playback afterward. If `entity_id` is `all`, all zones are snapshotted. The following attributes are stored in a snapshot: @@ -44,14 +44,14 @@ The following attributes are stored in a snapshot: - Volume level - Source -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`s of zones. -### Service `monoprice.restore` +### Action `monoprice.restore` Restore a previously taken snapshot of one or more speakers. If `entity_id` is `all`, all zones are restored. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`s of zones. diff --git a/source/_integrations/monzo.markdown b/source/_integrations/monzo.markdown index 205552030333..afcfa7b1cf62 100644 --- a/source/_integrations/monzo.markdown +++ b/source/_integrations/monzo.markdown @@ -41,9 +41,9 @@ The **Monzo** {% term integration %} allows you to connect your Monzo bank accou 1. To add a second Monzo account in Home Assistant, repeat the above process for creating an OAuth client. 2. Then, in Home Assistant, add the new credentials *before* trying to add the new entry. - - In the top right of **Devices & Services** page, select the three dot menu, open **Application Credentials**, and select **Add application credentials** + - In the top right of **Devices & services** page, select the three dot menu, open **Application Credentials**, and select **Add application credentials** - It is recommended to include the person's name in the *Name* field so you can distinguish it later. -3. Once added, you can return to **Devices & Services** > **Monzo** > **Add Entry** to proceed with authentication. +3. Once added, you can return to **Devices & services** > **Monzo** > **Add Entry** to proceed with authentication. ## Sensor diff --git a/source/_integrations/motion_blinds.markdown b/source/_integrations/motion_blinds.markdown index d3ed8636fcb4..f8f4e9c79de0 100644 --- a/source/_integrations/motion_blinds.markdown +++ b/source/_integrations/motion_blinds.markdown @@ -34,11 +34,13 @@ Additionally the following brands have been reported to also work with this inte - [Inspired Shades](https://www.inspired-shades.com/) - [iSmartWindow](https://www.ismartwindow.co.nz/) - [Krispol](https://krispol.eu/en/drives/) +- [Linx](https://linxautomation.com.au/) - [Madeco](https://www.madeco.fr/) - [Martec](https://www.martec.co.nz/) - [Motionblinds](https://motionblinds.com/) - [Raven Rock MFG](https://www.ravenrockmfg.com/) - [ScreenAway](https://www.screenaway.com.au/) +- [Smart Rollo (SIRO)](https://smart-rollos.de/) - [Smartblinds](https://www.smartblinds.nl/) - [Smart Home](https://www.smart-home.hu) - [Uprise Smart Shades](http://uprisesmartshades.com) @@ -54,6 +56,11 @@ The following bridges are reported to work with this integration: - D1554 Brel Home USB plug - Brel HUB-03 - Acomax FX-I 620 Bridge Maxi +- Linx Hub +- Linx Hub Mini +- Linx Hub USB +- SIRO Connect SI7002 +- SIRO Connect SI7005 {% include integrations/config_flow.md %} @@ -126,13 +133,13 @@ Therefore it is recommended to use scripts or automations with the TDBU Combined That will ensure the same absolute position with respect to the window is achieved without letting the Bottom or Top bar move to an absolute_position that is not allowed. -When the `motion_blinds.set_absolute_position` service is used with values that would move the Bottom or Top bar to positions that will make them collide, nothing will happen. An error will be logged telling that that position is not allowed and the TDBU blind will not move. +When the `motion_blinds.set_absolute_position` action is used with values that would move the Bottom or Top bar to positions that will make them collide, nothing will happen. An error will be logged telling that that position is not allowed and the TDBU blind will not move. -Therefore it is always safe to use any of the services in Home Assistant with the TDBU blinds. +Therefore it is always safe to use any of the actions in Home Assistant with the TDBU blinds. -## Service `motion_blinds.set_absolute_position` +## Action `motion_blinds.set_absolute_position` -For simple blinds the `motion_blinds.set_absolute_position` does the same as `cover.set_cover_position` service. +For simple blinds the `motion_blinds.set_absolute_position` does the same as `cover.set_cover_position` action. ### TDBU blinds @@ -143,7 +150,7 @@ The `cover.set_cover_position` will set the scaled position relative to the spac For tilt capable blinds a new position and tilt can be specified and the blind will move to the new position and then adjust its tilt. If the normal `cover.set_cover_position` is issued and immediately after a `cover.set_cover_tilt_position` is issued, the blind will stop moving and start adjusting the tilt before it reaches the intended position. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------- | | `entity_id` | yes | Name of the Motionblinds cover entity to control. For example `cover.TopDownBottomUp-Bottom-0001` | | `absolute_position` | no | Absolute position to move to. For example 70 | @@ -185,7 +192,7 @@ The default update interval of the Motionblinds integration is every 10 minutes. To increase the polling interval: Go to Settings -> Integrations -> on the already set up Motionblinds integration click more options (three dots) and select "System options" -> disable "polling for updates". Now create an automation with as trigger a time pattern and select your desired polling time. -As the action select "Call service" and select "Update entity", select one of the Motionblinds covers as entity. +As the action select **Perform action** and select **Update entity**, select one of the Motionblinds covers as entity. You only have to create one automation with only one Motionblinds cover as entity, the rest will update at the same time. Example YAML automation for custom polling interval (every minute): diff --git a/source/_integrations/motionblinds_ble.markdown b/source/_integrations/motionblinds_ble.markdown index aee84394c9f6..c97f698e7abc 100644 --- a/source/_integrations/motionblinds_ble.markdown +++ b/source/_integrations/motionblinds_ble.markdown @@ -14,6 +14,7 @@ ha_platforms: - button - cover - select + - sensor ha_integration_type: device --- @@ -46,10 +47,15 @@ The following entities are available for a Motionblinds Bluetooth device: - Favorite button: allows you to move the blind to the favorite position. - [Select](https://www.home-assistant.io/integrations/select/) entities: - Speed select: allows you to change the speed of the motor to low, medium, or high. Available for all blinds except curtain blinds and vertical blinds. +- [Sensor](https://www.home-assistant.io/integrations/sensor/) entities: + - Battery sensor: shows the battery percentage. The icon also reflects whether the motor is currently charging and/or whether the motor is wired and, therefore, does not have a battery. + Calibration sensor: shows whether the blind is still calibrated. The motor can move to an uncalibrated state when it has been moved to a different position while not powered. This sensor is available for curtain blinds and vertical blinds, as these can be moved while not powered. + - Connection sensor: shows whether the blind is connected, disconnected, connecting, or disconnecting. + - Signal strength sensor: shows the signal strength in dBm. -## Services +## Actions -Since Motionblinds Bluetooth motors require a Bluetooth connection to control them, Home Assistant does not get automatic updates of the motor's state by default. Therefore, you can use the [homeassistant.update_entity](https://www.home-assistant.io/docs/scripts/service-calls/#homeassistant-services) service on any entity belonging to a Motionblinds Bluetooth device, which will connect to your Motionblinds Bluetooth motor and update the state of all entities belong to that device. However, be aware that doing so may impact battery life. +Since Motionblinds Bluetooth motors require a Bluetooth connection to control them, Home Assistant does not get automatic updates of the motor's state by default. Therefore, you can use the [homeassistant.update_entity](https://www.home-assistant.io/docs/scripts/service-calls/#homeassistant-actions) action on any entity belonging to a Motionblinds Bluetooth device, which will connect to your Motionblinds Bluetooth motor and update the state of all entities belong to that device. However, be aware that doing so may impact battery life. This can also be automated using a YAML automation. For instance, the following automation connects to your Motionblind every 24 hours to update its state in Home Assistant: diff --git a/source/_integrations/motioneye.markdown b/source/_integrations/motioneye.markdown index 04aca2ec904e..23f57f78cde4 100644 --- a/source/_integrations/motioneye.markdown +++ b/source/_integrations/motioneye.markdown @@ -69,7 +69,7 @@ Stream URL template: | `sensor` | An "action sensor" that shows the number of configured [actions](https://github.com/ccrisan/motioneye/wiki/Action-Buttons) for this device. The names of the available actions are viewable in the `actions` attribute of the sensor entity. | **Note**: - - If the video streaming switch is turned off, the camera entity, and services that operate on that camera, will become unavailable. The rest of the integration will continue to function. + - If the video streaming switch is turned off, the camera entity, and actions that operate on that camera, will become unavailable. The rest of the integration will continue to function. - As cameras are added or removed to motionEye, devices/entities are automatically added or removed from Home Assistant. @@ -221,9 +221,9 @@ in automations (etc). } ``` -## Services +## Actions -All services accept either an `entity_id` or `device_id`. +All actions accept either an `entity_id` or `device_id`. ### motioneye.snapshot @@ -266,7 +266,7 @@ Parameters: **Note**: -- Calling this service triggers a reset of the motionEye cameras which will pause the +- Calling this action triggers a reset of the motionEye cameras which will pause the stream / recordings / motion detection (etc). - Ensure the `Text Overlay` switch is turned on to actually display the configured text overlays. @@ -299,7 +299,7 @@ correctly associate media with the camera from which that media was captured. ## Example Dashboard Card -A dashboard card with icons that will call the `action` service to send action commands to motionEye. +A dashboard card with icons that will call the `action` action to send action commands to motionEye. ```yaml - type: picture-glance diff --git a/source/_integrations/mpd.markdown b/source/_integrations/mpd.markdown index 8140f0f7cf72..0cd924d65869 100644 --- a/source/_integrations/mpd.markdown +++ b/source/_integrations/mpd.markdown @@ -16,7 +16,7 @@ related: The Music Player Daemon {% term integration %} allows you to control a [Music Player Daemon](https://www.musicpd.org/) from Home Assistant. Unfortunately, it does not allow you to manipulate the playlist (add or delete songs) or add transitions between the songs. -Even though no playlist manipulation is possible, it is possible to use the play_media service to load an existing saved playlist as part of an automation or scene. +Even though no playlist manipulation is possible, it is possible to use the `play_media` action to load an existing saved playlist as part of an automation or scene. {% include integrations/config_flow.md %} diff --git a/source/_integrations/mqtt.markdown b/source/_integrations/mqtt.markdown index dc0380564248..73c28b1a55b8 100644 --- a/source/_integrations/mqtt.markdown +++ b/source/_integrations/mqtt.markdown @@ -125,12 +125,10 @@ While public MQTT brokers are available, the easiest and most private option is The recommended setup method is to use the [Mosquitto MQTT broker add-on](https://github.com/home-assistant/hassio-addons/blob/master/mosquitto/DOCS.md). -<div class='note warning'> - +{% warning %} Neither ActiveMQ MQTT broker nor the RabbitMQ MQTT Plugin are supported, use a known working broker like Mosquitto instead. There are [at least two](https://issues.apache.org/jira/browse/AMQ-6360) [issues](https://issues.apache.org/jira/browse/AMQ-6575) with the ActiveMQ MQTT broker which break MQTT message retention. - -</div> +{% endwarning %} ## Broker configuration @@ -138,28 +136,21 @@ MQTT broker settings are configured when the MQTT integration is first set up an Add the MQTT integration, then provide your broker's hostname (or IP address) and port and (if required) the username and password that Home Assistant should use. To change the settings later, follow these steps: -1. Go to **{% my integrations title="Settings > Devices & Services" %}**. +1. Go to **{% my integrations title="Settings > Devices & services" %}**. 2. Select the MQTT integration. 3. Select **Configure**, then **Re-configure MQTT**. -<div class='note'> -<p> - +{% important %} If you experience an error message like `Failed to connect due to exception: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed`, then turn on `Advanced options` and set [Broker certificate validation](/integrations/mqtt/#broker-certificate-validation) to `Auto`. - - -</p> -</div> +{% endimportant %} ### Advanced broker configuration Advanced broker configuration options include setting a custom client ID, setting a client certificate and key for authentication, and enabling TLS validation of the broker's certificate for secure connection. To access the advanced settings, open the MQTT broker settings, switch on `Advanced options` and click `Next`. The advanced options will be shown by default if there are advanced settings active already. -<div class='note info'> - +{% tip %} Advanced broker options are accessible only when advanced mode is enabled (see user settings), or when advanced broker settings are configured already. - -</div> +{% endtip %} #### Alternative client ID @@ -187,17 +178,15 @@ With a secure broker connection it is possible to use a client certificate for a You can select `websockets` as transport method if your MQTT broker supports it. When you select `websockets` and click `NEXT`, you will be able to add a WebSockets path (default = `/`) and WebSockets headers (optional). The target WebSockets URI: `ws://{broker}:{port}{WebSockets path}` is built with `broker`, `port` and `ws_path` (WebSocket path) settings. To configure the WebSocket's headers supply a valid JSON dictionary string. E.g. `{ "Authorization": "token" , "x-header": "some header"}`. The default transport method is `tcp`. The WebSockets transport can be secured using TLS and optionally using user credentials or a client certificate. -<div class='note'> - +{% note %} A configured client certificate will only be active if broker certificate validation is enabled. - -</div> +{% endnote %} ## Configure MQTT options To change the settings, follow these steps: -1. Go to **{% my integrations title="Settings > Devices & Services" %}**. +1. Go to **{% my integrations title="Settings > Devices & services" %}**. 2. Select the MQTT integration. 3. Select **Configure**, then **Re-configure MQTT**. 4. To open the MQTT options page, select **Next**. @@ -223,9 +212,9 @@ The `mosquitto` broker package ships command line tools (often as `*-clients` pa mosquitto_pub -h 127.0.0.1 -t homeassistant/switch/1/on -m "Switch is ON" ``` -Another way to send MQTT messages manually is to use the **MQTT** integration in the frontend. Choose "Settings" on the left menu, click "Devices & Services", and choose "Configure" in the "Mosquitto broker" tile. Enter something similar to the example below into the "topic" field under "Publish a packet" and press "PUBLISH" . +Another way to send MQTT messages manually is to use the **MQTT** integration in the frontend. Choose "Settings" on the left menu, click "Devices & services", and choose "Configure" in the "Mosquitto broker" tile. Enter something similar to the example below into the "topic" field under "Publish a packet" and press "PUBLISH" . -1. Go to **{% my integrations title="Settings > Devices & Services" %}**. +1. Go to **{% my integrations title="Settings > Devices & services" %}**. 2. Select the Mosquitto broker integration, then select **Configure**. 3. Enter something similar to the example below into the **topic** field under **Publish a packet**. Select **Publish**. @@ -284,11 +273,9 @@ The discovery of MQTT devices will enable one to use MQTT devices with only mini MQTT discovery is enabled by default, but can be disabled. The prefix for the discovery topic (default `homeassistant`) can be changed. See the [MQTT Options sections](#configure-mqtt-options) -<div class='note info'> - +{% note %} Documentation on the MQTT components that support MQTT discovery [can be found here](/integrations/mqtt/#configuration-via-mqtt-discovery). - -</div> +{% endnote %} ### Discovery messages @@ -650,15 +637,13 @@ This can also be done by publishing `retained` messages. As soon as a config is the setup will subscribe any state topics. If a retained message is available at a state topic, this message will be replayed so that the state can be restored for this topic. -<div class='note warning'> - +{% warning %} A disadvantage of using retained messages is that these messages retain at the broker, even when the device or service stops working. They are retained even after the system or broker has been restarted. Retained messages can create ghost entities that keep coming back. <br><br> Especially when you have many entities, (unneeded) discovery messages can cause excessive system load. For this reason, use discovery messages with caution. - -</div> +{% endwarning %} ### Using Availability topics @@ -865,9 +850,9 @@ Setting up a sensor with multiple measurement values requires multiple consecuti The sensor [`identifiers` or `connections`](/integrations/sensor.mqtt/#device) option allows to set up multiple entities that share the same device. -<p class='note info'> +{% note %} If a device configuration is shared, then it is not needed to add all device details to the other entity configs. It is enough to add shared identifiers or connections to the device mapping for the other entity config payloads. -</p> +{% endnote %} A common state payload that can be parsed with the `value_template` in the sensor configs: @@ -1034,11 +1019,9 @@ mqtt: If you have a large number of manually configured items, you might want to consider [splitting up the configuration](/docs/configuration/splitting_configuration/). -<div class='note info'> - +{% note %} Documentation on the MQTT components that support YAML [can be found here](/integrations/mqtt/#configuration-via-yaml). - -</div> +{% endnote %} ## Using Templates @@ -1046,9 +1029,9 @@ The MQTT integration supports templating. Read more [about using templates with ## MQTT Notifications -The MQTT notification support is different than for the other [notification](/integrations/notify/) integrations. It is a service. This means you need to provide more details when calling the service. +The MQTT notification support is different than for the other [notification](/integrations/notify/) integrations. It is an action. This means you need to provide more details when calling the action. -**Call Service** section from **Developer Tools** -> **Services** allows you to send MQTT messages. Choose *mqtt.publish* from the list of **Available services:** and enter something like the sample below into the **Service Data** field and hit **CALL SERVICE**. +**Perform action** section from **Developer Tools** -> **Actions** allows you to send MQTT messages. Choose *mqtt.publish* from the list of available actions, and enter something like the sample below into the **data** field and select **Perform action**. ```json { @@ -1114,30 +1097,23 @@ script: {% endraw %} -## Publish & Dump services +## Publish & Dump actions -The MQTT integration will register the service `mqtt.publish` which allows publishing messages to MQTT topics. There are two ways of specifying your payload. You can either use `payload` to hard-code a payload or use `payload_template` to specify a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) that will be rendered to generate the payload. +The MQTT integration will register the `mqtt.publish` action, which allows publishing messages to MQTT topics. -### Service `mqtt.publish` +### Action `mqtt.publish` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------ | | `topic` | no | Topic to publish payload to. | -| `topic_template` | no | Template to render as topic to publish payload to. | -| `payload` | yes | Payload to publish. | -| `payload_template` | yes | Template to render as payload value. | +| `payload` | no | Payload to publish. | | `qos` | yes | Quality of Service to use. (default: 0) | | `retain` | yes | If message should have the retain flag set. (default: false) | -<div class='note'> -<p> - +{% important %} You must include either `topic` or `topic_template`, but not both. If providing a payload, you need to include either `payload` or `payload_template`, but not both. - - -</p> -</div> +{% endimportant %} ```yaml @@ -1177,7 +1153,7 @@ you should take special care if `payload` contains template content. Home Assistant will force you in to the YAML editor and will treat your definition as a template. Make sure you escape the template blocks as like in the example below. Home Assistant will convert the result to a string -and will pass it to the MQTT publish service. +and will pass it to the MQTT publish action. The example below shows how to publish a temperature sensor 'Bathroom Temperature'. The `device_class` is set, so it is not needed to set the "name" option. The entity @@ -1215,11 +1191,11 @@ qos: 2 retain: true ``` -### Service `mqtt.dump` +### Action `mqtt.dump` Listen to the specified topic matcher and dumps all received messages within a specific duration into the file `mqtt_dump.txt` in your configuration folder. This is useful when debugging a problem. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------- | | `topic` | no | Topic to dump. Can contain a wildcard (`#` or `+`). | | `duration` | yes | Duration in seconds that we will listen for messages. Default is 5 seconds. | diff --git a/source/_integrations/msteams.markdown b/source/_integrations/msteams.markdown index bbe20e2bef73..d1350c73d1d4 100644 --- a/source/_integrations/msteams.markdown +++ b/source/_integrations/msteams.markdown @@ -32,7 +32,7 @@ notify: {% configuration %} name: - description: Setting this parameter allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting this parameter allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false type: string default: "notify" @@ -46,7 +46,7 @@ url: The following attributes can be placed inside `data` for extended functionality. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------- | | `image_url` | yes | Attach an image to the message. | diff --git a/source/_integrations/mycroft.markdown b/source/_integrations/mycroft.markdown index 33c91b31f58b..14f819206cd1 100644 --- a/source/_integrations/mycroft.markdown +++ b/source/_integrations/mycroft.markdown @@ -59,7 +59,7 @@ name: ## Examples -Send a message to Mycroft by calling `notify.mycroft` service: +Send a message to Mycroft by calling `notify.mycroft` action: ```yaml message: "Hey Mycroft. Turn on the office light. " diff --git a/source/_integrations/mysensors.markdown b/source/_integrations/mysensors.markdown index b1c36cbe4abf..ab47931703f8 100644 --- a/source/_integrations/mysensors.markdown +++ b/source/_integrations/mysensors.markdown @@ -44,9 +44,9 @@ In addition to the serial device you also need to enter the baud rate. If you are using the MQTT gateway, you will need to enter topic prefixes for input and output. These need to be swapped with the settings of the gateway. I.e. the input topic for Home Assistant needs to be the output (publish) topic of the gateway. -<div class='note'> +{% note %} The MQTT gateway requires MySensors version 2.0+ and only the MQTT client gateway is supported. -</div> +{% endnote %} ### Ethernet gateway diff --git a/source/_integrations/mystrom.markdown b/source/_integrations/mystrom.markdown index 6410c2da9dfc..68a592586996 100644 --- a/source/_integrations/mystrom.markdown +++ b/source/_integrations/mystrom.markdown @@ -93,6 +93,6 @@ binary_sensor: - platform: mystrom ``` -<div class='note'> +{% important %} The firmware version 2.56 doesn't support TLS/SSL. This means that you are only able to use the WiFi Buttons if you are using plain-text communication between Home Assistant and the clients/entities. -</div> +{% endimportant %} diff --git a/source/_integrations/myuplink.markdown b/source/_integrations/myuplink.markdown index e0333c6ee79b..2a9264eb45cb 100644 --- a/source/_integrations/myuplink.markdown +++ b/source/_integrations/myuplink.markdown @@ -4,6 +4,7 @@ description: Instructions on how to set up the myUplink integration within Home ha_category: - Binary sensor - Number + - Select - Sensor - Switch - Update @@ -18,6 +19,7 @@ ha_platforms: - binary_sensor - diagnostics - number + - select - sensor - switch - update @@ -26,7 +28,7 @@ ha_integration_type: integration The myUplink integration lets you get information about the devices supporting myUplink using the [official cloud API](https://dev.myuplink.com). -Depending on the type of devices in your system, one or more entities are added to Home Assistant. Currently, there is support for reading sensor states. There is also support for switches and number entities if suitable data points are discovered in the system. Note that you may need a valid subscription with MyUplink to control your equipment with switches and number entities. +Depending on the type of devices in your system, one or more entities are added to Home Assistant. Currently, there is support for reading sensor states. There is also support for switch, select and number entities if suitable data points are discovered in the system. Note that you may need a valid subscription with MyUplink to control your equipment with switch, select, and number entities. ## Prerequisites diff --git a/source/_integrations/nad.markdown b/source/_integrations/nad.markdown index 3e7187cd8a94..d49da6d91615 100644 --- a/source/_integrations/nad.markdown +++ b/source/_integrations/nad.markdown @@ -95,13 +95,11 @@ volume_step: The `min_volume` and `max_volume` options are there to protect you against misclicks on the slider so you will not blow up your speakers when you go from -92dB to +20dB. You can still force higher or lower volumes than the values set by using the plus and minus buttons. -<div class='note warning'> - +{% important %} On Linux the user running Home Assistant needs `dialout` permissions to access the serial port. This can be added to the user by doing `sudo usermod -a -G dialout <username>`. Be aware that the user might need to logout and logon again to activate these permissions. - -</div> +{% endimportant %} An example of a full configuration: diff --git a/source/_integrations/namecheapdns.markdown b/source/_integrations/namecheapdns.markdown index d129c3cd4b3f..19a8f3cb10d5 100644 --- a/source/_integrations/namecheapdns.markdown +++ b/source/_integrations/namecheapdns.markdown @@ -14,9 +14,9 @@ related: With the `namecheapdns` {% term integration %} you can automatically update your dynamic DNS entry hosted by Namecheap's [FreeDNS](https://www.namecheap.com/store/domains/freedns/) service. -<div class='note warning'> +{% important %} Namecheap only supports updating IPv4 addresses. -</div> +{% endimportant %} ## Configuration diff --git a/source/_integrations/nanoleaf.markdown b/source/_integrations/nanoleaf.markdown index a81707f1e7a9..3842aac7912a 100644 --- a/source/_integrations/nanoleaf.markdown +++ b/source/_integrations/nanoleaf.markdown @@ -3,9 +3,11 @@ title: Nanoleaf description: Instructions how to integrate Nanoleaf Panels into Home Assistant. ha_category: - Button + - Event - Light ha_codeowners: - '@milanmeu' + - '@joostlek' ha_config_flow: true ha_homekit: true ha_iot_class: Local Push @@ -14,6 +16,7 @@ ha_domain: nanoleaf ha_platforms: - button - diagnostics + - event - light ha_zeroconf: true ha_ssdp: true @@ -28,4 +31,4 @@ This integration does not support the Nanoleaf Remote and Essentials lights. Con # Transition and brightness -When using a transition in service calls (such as `light.turn_on`), the transition is only applied to brightness and does not apply to color. When a service call has a transition set but no brightness is included, the light will automatically transition to 100% brightness. +When using a transition in an action (such as `light.turn_on`), the transition is only applied to brightness and does not apply to color. When an action has a transition set, but no brightness is included, the light will automatically transition to 100% brightness. diff --git a/source/_integrations/neato.markdown b/source/_integrations/neato.markdown index 8afdb03c7054..67a425d239db 100644 --- a/source/_integrations/neato.markdown +++ b/source/_integrations/neato.markdown @@ -36,7 +36,7 @@ There is support for the following platform types within Home Assistant: Visit [the Neato Developer Network](https://developers.neatorobotics.com/applications) and create a new app. -<div class='note'> +{% important %} You will have to enter a name, a description, and the redirect URI: @@ -47,7 +47,7 @@ You will have to enter a name, a description, and the redirect URI: - **Privacy Policy URL**: leave blank You have to select all three scopes (`public_profile`, `control_robots` and `maps`). -</div> +{% endimportant %} {% details "I have manually disabled My Home Assistant" %} @@ -69,11 +69,9 @@ instance does not need to be exposed to the Internet. The integration configuration will ask for the *Client ID* and *Client Secret* created above. See [Application Credentials](/integrations/application_credentials) for more details. -<div class='note'> - +{% note %} After the update to firmware 4.0 (which adds cleaning maps) there is also support for displaying the maps of the Botvac D3 Connected and Botvac D5 Connected robots. More information on how to update can be found [here](https://support.neatorobotics.com/hc/en-us/articles/115004320694-Software-Update-4-0-for-Neato-Botvac-Connected-D3-D5-). - -</div> +{% endnote %} ## Button @@ -84,9 +82,9 @@ Each `neato` vacuum has a _Dismiss alert_ button. This allows to dismiss an aler The `neato` vacuum platform allows you to control your [Neato Botvac Connected][botvac-connected]. The status will contain attributes on the robots last clean session. -### Services +### Actions -Currently supported services are: +Currently supported actions are: - `start` - `pause` @@ -95,24 +93,20 @@ Currently supported services are: - `locate` - `clean_spot` -And a specific Platform Service: +And a specific integration-specific action: - `neato.custom_cleaning` -### Platform services - -#### Service `neato.custom_cleaning` +#### Action `neato.custom_cleaning` Starts a custom cleaning of your house. You can set the various options like in the mobile application (mode, map usage, navigation mode, zone). -<div class='note'> - +{% note %} Not all Botvac models support all the attributes. Only the Neato Botvac D7 supports the `zone` attribute. Some information about the capabilities might be found on the [Neato Developer Portal](https://developers.neatorobotics.com/api/robot-remote-protocol/housecleaning). +{% endnote %} -</div> - -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Only act on a specific robot | | `mode` | yes | Set the cleaning mode: 1 for eco and 2 for turbo. Defaults to turbo if not set. | diff --git a/source/_integrations/ness_alarm.markdown b/source/_integrations/ness_alarm.markdown index b02c3283ad14..bfbcbbc44c59 100644 --- a/source/_integrations/ness_alarm.markdown +++ b/source/_integrations/ness_alarm.markdown @@ -102,21 +102,21 @@ scan_interval: milliseconds: 0 ``` -## Services +## Actions -### Service `aux` +### Action `aux` Trigger an aux output. This requires PCB version 7.8 or higher. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `output_id` | No | The aux output you wish to change. A number from 1-4. | | `state` | Yes | The On/Off State, represented as true/false. Default is true. If P14xE 8E is enabled then a value of true will pulse output x for the time specified in P14(x+4)E. | -### Service `panic` +### Action `panic` Trigger a panic -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------ | | `code` | No | The user code to use to trigger the panic. | diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index 2568f640bdb9..5e6b30b766d4 100644 --- a/source/_integrations/nest.markdown +++ b/source/_integrations/nest.markdown @@ -36,17 +36,13 @@ Cameras and doorbells use [Automation and device triggers](#automation-and-devic You are in control of the information and capabilities exposed to Home Assistant. You can authorize a single device, multiple devices, or different levels of functionality such as motion events, live streams, for any particular device. The integration is flexible enough to adapt based on what you allow. -<div class='note'> - +{% caution %} The Nest Smart Device Management (SDM) API **requires a US$5 fee**. Before buying, make sure your device is [supported](https://developers.google.com/nest/device-access/supported-devices). +{% endcaution %} -</div> - -<div class='note'> - +{% note %} The Google Nest integration uses a Cloud Pub/Sub subscription with a 15-minute retention period by default. The Google Cloud Pub/Sub billing changes, effective June 30, 2024, do not apply. The billing changes only apply to subscriptions with a 24-hour retention period. See the [Pub/Sub console](https://console.cloud.google.com/cloudpubsub/subscription/list) to view your subscriptions if you previously created one manually. - -</div> +{% endnote %} <lite-youtube videoid="RwZmQ7QfhsM" videotitle="Finally! A WORKING NEST Integration with Home Assistant using Oauth!" posterquality="maxresdefault"></lite-youtube> @@ -60,7 +56,7 @@ To add the **Nest** integration to your Home Assistant, use this My Button: {% details "Manual configuration steps" %} 1. Browse to your Home Assistant instance. -2. Go to **{% my integrations title="Settings > Devices & Services" %}**. +2. Go to **{% my integrations title="Settings > Devices & services" %}**. 3. In the bottom right corner, select the **{% my config_flow_start icon domain=page.ha_domain %}** button. 4. From the list, select **Nest** and follow the instructions on screen. @@ -165,9 +161,9 @@ Now that you have authentication configured, you will create a Nest Device Acces 2. Check the box to "Accept the Terms of Service" and click **Continue to Payment** where you need to pay a fee (currently US$5). ![Screenshot of accepting terms](/images/integrations/nest/accept_terms.png) - <div class='note'> - It is currently not possible to share/be invited to a home with a G-Suite account. Make sure that you pay the fee with an account that has access to your devices. - </div> +{% note %} +It is currently not possible to share/be invited to a home with a G-Suite account. Make sure that you pay the fee with an account that has access to your devices. +{% endnote %} 3. Now the [Device Access Console](https://console.nest.google.com/device-access/project-list) should be visible. Click on **Create project**. @@ -228,13 +224,13 @@ All Google Nest Thermostat models are exposed as a `climate` entity that use the Given a thermostat named `Upstairs` then the climate entity is created with a name such as `climate.upstairs` -<div class='note'> +{% note %} This feature is enabled by the following permissions: - *Allow Home Assistant to access and control your thermostat* -</div> +{% endnote %} ## Sensor @@ -245,33 +241,33 @@ All Google Nest Thermostat models have traits exposed from the SDM API. The init Given a thermostat named `Upstairs` then sensors are created with names such as `sensor.upstairs_temperature` or `sensor.upstairs_humidity`. -<div class='note'> +{% note %} This feature is enabled by the following permissions: - *Allow Home Assistant to access and control your thermostat* -</div> -<div class='note'> +{% endnote %} +{% note %} Additional Nest Temperature Sensors are not supported by the SDM API. The Temperature reported by the API will be pulled from whichever device is currently configured as the Active Sensor, which can be adjusted via manual selection or the schedule offered in the Nest App. -</div> +{% endnote %} ## Camera Home Assistant supports all SDM API features. However, every Camera or Doorbell device has a different set of built-in capabilities. A Camera device has one of the following live stream types: -- **RTSP**: These devices have an HLS stream served by the Home Assistant Core. These cameras support server-side `camera` services like stream recording or image preview. See [Low Latency HLS](/integrations/stream#ll-hls) as a great option to enable to reduce stream latency. -- **WebRTC**: These devices support direct browser to camera communication and a super low latency stream. A [Picture Glance Card](/dashboards/picture-glance/) can show the live stream in the grid with the *Camera View* set to `live` (not recommended for battery-powered cameras). `camera` services like stream recording are *not supported*. +- **RTSP**: These devices have an HLS stream served by the Home Assistant Core. These cameras support server-side `camera` actions like stream recording or image preview. See [Low Latency HLS](/integrations/stream#ll-hls) as a great option to enable to reduce stream latency. +- **WebRTC**: These devices support direct browser to camera communication and a super low latency stream. A [Picture Glance Card](/dashboards/picture-glance/) can show the live stream in the grid with the *Camera View* set to `live` (not recommended for battery-powered cameras). `camera` actions like stream recording are *not supported*. -<div class='note'> +{% note %} This feature is enabled by the following permissions: - *Allow Home Assistant to see and display your camera’s livestream* - *Other permissions in the Nest or Google Home apps*. -</div> +{% endnote %} All cameras have motion and person triggers, however only some support capturing snapshots for events. The table below summarizes the [Supported SDM API features](https://developers.google.com/nest/device-access/supported-devices) for each device. @@ -297,7 +293,7 @@ The Nest integration provides [device triggers](/docs/automation/trigger/#device ![Screenshot Device Triggers](/images/integrations/nest/device_triggers.png) -{% details "Example Device Trigger / Event payload %} +{% details "Example Device Trigger / Event payload" %} This is an example of what the `nest_event` payload looks like for a Device Trigger that you can use to power automations. @@ -322,14 +318,14 @@ This is an example of what the `nest_event` payload looks like for a Device Trig Continue reading below to *Media Source Attachments* to see how to use media with notification actions. -<div class='note'> +{% note %} This feature is enabled by the following permissions: - *Allow Home Assistant to know when there's a camera event* - *Allow Home Assistant to know when there's a doorbell event* - *Other permissions and notification settings in the Nest or Google Home apps*. -</div> +{% endnote %} ### Google Home App Notification Settings @@ -378,7 +374,7 @@ The Media Source APIs can be used in [Companion App Attachments](https://compani You can use the event payload fields `device_id` and `event_id` in an [automation](/getting-started/automation/) to send a notification from an [actions](/getting-started/automation-action/) as shown in the examples below. -{% details "Example Action: Clip Preview (mp4) attachment for iOS %} +{% details "Example Action: Clip Preview (mp4) attachment for iOS" %} Example for cameras that support Clip Previews used with iOS which can render video in notifications. @@ -401,7 +397,7 @@ mode: single {% enddetails %} -{% details "Example Action: Clip Preview thumbnail (gif) for Android or iOS %} +{% details "Example Action: Clip Preview thumbnail (gif) for Android or iOS" %} Example for cameras that support Clip Previews, but transcoded to an animated gif (Android does not render video notifications). @@ -421,7 +417,7 @@ data: {% enddetails %} -{% details "Example Action: Snapshot (jpg) attachment for Android or iOS %} +{% details "Example Action: Snapshot (jpg) attachment for Android or iOS" %} Example for cameras that support Snapshot (jpg) on either Android or iOS. @@ -441,7 +437,7 @@ data: {% enddetails %} -<div class='note'> +{% note %} This feature is enabled by the following permissions: @@ -449,16 +445,16 @@ This feature is enabled by the following permissions: - *Based on the events you've selected to share from this device, allow Home Assistant to access camera snapshots* - *Other permissions in the Nest or Google Home apps*. -</div> +{% endnote %} ## Deprecated App Auth Credentials To improve security and reduce phishing risk Google has [deprecated](https://developers.googleblog.com/2022/02/making-oauth-flows-safer.html) a previous authentication method used by Home Assistant. **This requires action by you to resolve** if you previously configured *Nest* using *App Auth*. -{% details "Reconfigure the integration %} +{% details "Reconfigure the integration" %} 1. Make sure to upgrade to the latest version of Home Assistant. -2. Go to **{% my integrations title="Settings > Devices & Services" %}**. +2. Go to **{% my integrations title="Settings > Devices & services" %}**. 3. The **Nest** integration should appear with alert. ![Screenshot of success](/images/integrations/nest/attention.png) @@ -576,7 +572,7 @@ The *OAuth Client ID* used must be consistent, so check these: - Restart the Thermostat device. See [How to restart or reset a Nest thermostat](https://support.google.com/googlenest/answer/9247296) for more details. - In the official Nest app or on https://home.nest.com: Move the Thermostat to a different or fake/temporary room. -- Reload the integration in Home Assistant: Navigate to **Configuration** then **Devices & Services**, click `...` next to *Nest* and choose **Reload**. +- Reload the integration in Home Assistant: Navigate to **Configuration** then **Devices & services**, click `...` next to *Nest* and choose **Reload**. {% enddetails %} diff --git a/source/_integrations/netatmo.markdown b/source/_integrations/netatmo.markdown index d7d58a462e85..72d7d93e482e 100644 --- a/source/_integrations/netatmo.markdown +++ b/source/_integrations/netatmo.markdown @@ -55,7 +55,7 @@ There is currently support for the following device types within Home Assistant: Configuration of Netatmo public weather stations is offered from the front end. Enter the Netatmo integration and press the "CONFIGURE", then set "Area name" for new area. -In the dialog, it is possible to create, edit and remove public weather sensors. For each area a unique name has to be set along with an area to be covered and whether to display average or maximum values. +In the dialog, it is possible to create, edit and remove public weather sensors. For each area a unique name has to be set along with an area to be covered and whether to display average, maximum or minimum values. To edit an existing area, enter its name and follow the dialog. @@ -95,7 +95,7 @@ The `netatmo` sensor platform is consuming the information provided by a [Netatm The `netatmo` switch platform provides support for Legrand/BTicino switches and power plugs. -## Services +## Actions ### Set Outdoor Camera Light Mode @@ -103,7 +103,7 @@ The `netatmo` switch platform provides support for Legrand/BTicino switches and Set the outdoor camera light mode. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | -------------------------- | | `camera_light_mode` | Yes | Outdoor camera light mode. | @@ -113,7 +113,7 @@ Set the outdoor camera light mode. Set the heating schedule. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ------------------------------------- | | `schedule_name` | Yes | The name of the schedule to activate. | @@ -123,7 +123,7 @@ Set the heating schedule. Set the preset mode for a Netatmo climate device. The preset mode must match a preset mode configured at Netatmo. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ----------------------------------------------------------- | | `preset_mode` | Yes | Climate preset mode such as Schedule, Away, or Frost Guard. | | `end_datetime` | Yes | Date & time until which the preset will be active. | @@ -134,7 +134,7 @@ Set the preset mode for a Netatmo climate device. The preset mode must match a p Sets the target temperature for a Netatmo climate device with an end date & time. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | -------------------------------------------------------- | | `target_temperature` | Yes | The target temperature for the device. | | `end_datetime` | Yes | Date & time the target temperature will be active until. | @@ -145,7 +145,7 @@ Sets the target temperature for a Netatmo climate device with an end date & time Sets the target temperature for a Netatmo climate device as well as the time period during which this target temperature applies. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ----------------------------------------------------------- | | `target_temperature` | Yes | The target temperature for the device. | | `time_period` | Yes | Time period during which the target temperature is applied. | @@ -162,7 +162,7 @@ Clears any temperature setting for a Netatmo climate device reverting it to the Set a list of persons as at home. Person's name must match a name known by the Netatmo Smart Indoor Camera. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | -------------- | | `persons` | Yes | List of names. | @@ -172,7 +172,7 @@ Set a list of persons as at home. Person's name must match a name known by the N Set a person away. If no person is set the home will be marked as empty. Person's name must match a name known by the Netatmo Smart Indoor Camera. -| Service data attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | -------------- | | `person` | Yes | Person's name. | @@ -180,19 +180,17 @@ Set a person away. If no person is set the home will be marked as empty. Person' `register_webhook` and `unregister_webhook` -Service to manually register and unregister the webhook. +Actions to manually register and unregister the webhook. ## Webhook Events The Netatmo backend sends instant events to Home Assistant by using webhooks which unlocks improved responsiveness of most devices with the exception of [Netatmo Smart Home Weather Station](https://www.netatmo.com/smart-weather-station), [Netatmo Smart Indoor Air Quality Monitor](https://www.netatmo.com/smart-indoor-air-quality-monitor) or [Netatmo Public Weather Stations](https://weathermap.netatmo.com/). -<div class='note warning'> - +{% warning %} Netatmo webhook events have known issues with Home Assistant Cloud Link. It is therefore recommended to use [an individual development account](#development--testing-with-your-own-client-id). - -</div> +{% endwarning %} To be able to receive events from [Netatmo](https://www.netatmo.com/), your Home Assistant instance needs to be accessible from the web over port `443`. To achieve this you can either use your Nabu Casa account or for example Duck DNS ([Home Assistant instructions](/addons/duckdns/)). You also need to have the external URL configured in the Home Assistant [configuration](/integrations/homeassistant/#allowlist_external_urls). @@ -302,15 +300,13 @@ to declare a new application in the [Netatmo Developer Page](https://dev.netatmo Sign in using your username and password from your regular Netatmo account. -<div class='note warning'> - +{% important %} In your Netatmo Application configuration, do not enter a 'redirect URI' or a 'webhook URI'. The 'webhook URI' is automatically registered by this integration based on the external URL configured in the Home Assistant [configuration](/integrations/homeassistant/#editing-the-general-settings-in-yaml). - -</div> +{% endimportant %} See [Application Credentials](/integrations/application_credentials) for instructions on how to configure your *Client ID* and *Client Secret*, then enable Netatmo through the integrations page. -Menu: **Settings** -> **Devices & Services**. +Menu: **Settings** > **Devices & services**. Click on the `+` sign to add an integration and click on **Netatmo**. After completing the configuration flow, the Netatmo integration will be available. diff --git a/source/_integrations/netgear_lte.markdown b/source/_integrations/netgear_lte.markdown index 41970ddd18f6..62748f330e6d 100644 --- a/source/_integrations/netgear_lte.markdown +++ b/source/_integrations/netgear_lte.markdown @@ -29,17 +29,15 @@ There is currently support for the following device types within Home Assistant: The integration supports sending notifications with SMS, reporting incoming SMS with events and reporting the modem and connection state in a number of sensors and binary sensors. -<div class='note'> - +{% note %} Splitting of long SMS messages is not supported so notifications can contain a maximum of 70 characters. Simple messages using the reduced GSM-7 alphabet can contain up to 160 characters. Most emojis are not supported. - -</div> +{% endnote %} {% include integrations/config_flow.md %} -## Notification Service +## Notification Actions -The integration will create a `notify` service matching the name of the integration entry. This is the model name of the device by default. +The integration will create a `notify` actions matching the name of the integration entry. This is the model name of the device by default. ## Events @@ -54,38 +52,38 @@ Messages arriving in the modem inbox are sent as events of type `netgear_lte_sms | `from` | The sender of the message. | `message` | The SMS message content. -## Services +## Actions -### Service `netgear_lte.connect_lte` +### Action `netgear_lte.connect_lte` -This service asks the modem to establish its LTE connection, useful if the modem does not autoconnect. +This action asks the modem to establish its LTE connection, useful if the modem does not autoconnect. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `host` | yes | The modem that should connect (optional when just one modem is configured). -### Service `netgear_lte.disconnect_lte` +### Action `netgear_lte.disconnect_lte` -This service asks the modem to close its LTE connection. +This action asks the modem to close its LTE connection. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `host` | yes | The modem that should disconnect (optional when just one modem is configured). -### Service `netgear_lte.delete_sms` +### Action `netgear_lte.delete_sms` -The integration makes a service available to delete messages from the modem inbox. This can be used to clean up after incoming SMS events. +The integration makes an action available to delete messages from the modem inbox. This can be used to clean up after incoming SMS events. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `host` | yes | The modem that should have a message deleted (optional when just one modem is configured). | `sms_id` | no | Integer or list of integers with inbox IDs of messages to delete. -### Service `netgear_lte.set_option` +### Action `netgear_lte.set_option` -This service can set modem configuration options (otherwise available in the modem web UI). +This action can set modem configuration options (otherwise available in the modem web UI). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `host` | yes | The modem to set options on (optional when just one modem is configured). | `autoconnect` | yes | Autoconnect value: `never`/`home`/`always`, with `home` meaning "not roaming". diff --git a/source/_integrations/nexia.markdown b/source/_integrations/nexia.markdown index fe26f6a4bf6d..f14d6c190fd3 100644 --- a/source/_integrations/nexia.markdown +++ b/source/_integrations/nexia.markdown @@ -84,21 +84,21 @@ The scene platform lets you activate a nexia automation. The switch platform lets you enable or disable hold mode for each thermostat. -### Service `nexia.set_aircleaner_mode` +### Action `nexia.set_aircleaner_mode` Sets the air cleaner mode. Options include 'auto', 'quick', and 'allergy'. This setting will affect all zones on the same thermostat. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings that point at `entity_id`'s of climate devices to control. | `aircleaner_mode` | no | 'auto', 'quick', or 'allergy' -### Service `nexia.set_humidify_setpoint` +### Action `nexia.set_humidify_setpoint` Sets the humidify setpoint. This setting will affect all zones on the same thermostat. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings that point at `entity_id`'s of climate devices to control. | `humidity` | no | Humidify setpoint level, from 35 to 65. diff --git a/source/_integrations/nfandroidtv.markdown b/source/_integrations/nfandroidtv.markdown index 4ffe982a49f9..12f32786fd92 100644 --- a/source/_integrations/nfandroidtv.markdown +++ b/source/_integrations/nfandroidtv.markdown @@ -22,11 +22,11 @@ When setting this up be aware, that there are two apps: one for your smartphone {% include integrations/config_flow.md %} -## Services +## Actions -The following options can be specified inside the data field for the notify service call: +The following options can be specified inside the data field for the notify action: -### Service `notify.[name_of_your_tv]` +### Action `notify.[name_of_your_tv]` {% configuration %} duration: @@ -59,7 +59,7 @@ interrupt: type: boolean {% endconfiguration %} -This is a fully customized YAML you can use inside `data` to test how the final notification will look like (for using this inside a service call look at the service example at the end of this page): +This is a fully customized YAML you can use inside `data` to test how the final notification will look like (for using this inside an action look at the example at the end of this page): ```yaml fontsize: "large" @@ -70,9 +70,9 @@ color: "red" interrupt: 1 ``` -## Service data for sending images and icons +## Action data for sending images and icons -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `image` | yes | Groups the attributes for image upload. It can take a `url` or `path`. It is optional unless you use authentication options. Then, either `url` or `path` has to be provided. | | `icon` | yes | Groups the attributes for icon upload. It can take a `url` or `path`. It is optional unless you use authentication options. Then, either `url` or `path` has to be provided. | @@ -82,7 +82,7 @@ interrupt: 1 | `password` | yes | Password if the URL requires authentication. Is placed inside `image`, `icon` or both. | `auth` | yes | If set to `digest` HTTP-Digest-Authentication is used. If missing, HTTP-BASIC-Authentication is used and is placed inside `image`, `icon` or both. -Example Service data for both image and icons: +Example action data for both image and icons: ```yaml # If your urls do not require extra authentication @@ -111,7 +111,7 @@ icon: auth: "digest" # Optional ``` -Example of an automation with an service call, full configuration: +Example of an automation with an action, full configuration: {% raw %} diff --git a/source/_integrations/nibe_heatpump.markdown b/source/_integrations/nibe_heatpump.markdown index 69c60eda6a6a..82c545f55d17 100644 --- a/source/_integrations/nibe_heatpump.markdown +++ b/source/_integrations/nibe_heatpump.markdown @@ -105,6 +105,6 @@ If your system is equipped with a MODBUS40 accessory, this can be used to contro - `serial://[DEVICE PATH]` for direct local connection - `rfc2217://[IP OR HOSTNAME]:[PORT]` for a [ser2net](https://linux.die.net/man/8/ser2net) type proxy -<div class='note info'> +{% note %} Support for RCU-based communication is currently untested. -</div> +{% endnote %} \ No newline at end of file diff --git a/source/_integrations/nina.markdown b/source/_integrations/nina.markdown index 988edfd8c706..c16fca961d9a 100644 --- a/source/_integrations/nina.markdown +++ b/source/_integrations/nina.markdown @@ -18,11 +18,9 @@ The [NINA](https://www.bbk.bund.de/DE/Warnung-Vorsorge/Warn-App-NINA/warn-app-ni For each county/city it creates warning slots that change to Unsafe when warnings are present. The text of the warning and the metadata are stored in the attributes of the slots. -<div class='note warning'> - +{% important %} This integration may only work with an Internet connection that supports IPv4. - -</div> +{% endimportant %} {% include integrations/config_flow.md %} @@ -30,9 +28,9 @@ This integration may only work with an Internet connection that supports IPv4. The integration includes the possibility to filter warnings in two ways via a regex. -<div class='note'> +{% note %} All filters are applied to lowercase text only. -</div> +{% endnote %} #### Headline filter diff --git a/source/_integrations/nissan_leaf.markdown b/source/_integrations/nissan_leaf.markdown index 950010d0b673..c6c47a53d96e 100644 --- a/source/_integrations/nissan_leaf.markdown +++ b/source/_integrations/nissan_leaf.markdown @@ -21,18 +21,16 @@ related: The `nissan_leaf` {% term integration %} offers integration with the [NissanConnect EV](https://www.nissan.co.uk/dashboard.html) cloud service. NissanConnect EV was previously known as Nissan Carwings. -<div class='note info'> - +{% important %} Please be aware that the `nissan_leaf` {% term integration %} only works with Nissan vehicles from before 2019. Newer vehicles will not work with this integration. - -</div> +{% endimportant %} The {% term integration %} offers offers: - sensors for the battery status, range and charging status. - a switch to start and stop the climate control. - a button to request the car starts charging. -- service to request updates from the car. +- action to request updates from the car. ## Configuration @@ -98,7 +96,7 @@ nissan_leaf: ## Starting a Charge -You can use the `button.press` service to send a request to the Nissan servers to start a charge. The car must be plugged in! +You can use the `button.press` action to send a request to the Nissan servers to start a charge. The car must be plugged in! ```yaml - service: button.press @@ -108,7 +106,7 @@ You can use the `button.press` service to send a request to the Nissan servers t ## Updating on-demand using Automation -You can also use the `nissan_leaf.update` service to request an on-demand update. To update almost exclusively via the service set the `update_interval` to a high value in the integration configuration. The service requests the VIN number as described above. +You can also use the `nissan_leaf.update` action to request an on-demand update. To update almost exclusively via the action set the `update_interval` to a high value in the integration configuration. The action requests the VIN number as described above. ```yaml - id: update_when_driver_not_home @@ -132,7 +130,7 @@ You can also use the `nissan_leaf.update` service to request an on-demand update - The update interval has a minimum of two minutes. - Requesting updates uses a small amount of energy from the 12 V battery. The 12 V battery charges from the main traction battery when the car is not plugged in. If the car is left plugged in for a long time, or if the main traction battery is very low then the 12 V battery may gradually discharge. A low update interval may cause the 12 V battery to become flat. When the 12 V battery is flat the car will not start. _Do not set the update interval too low. Use at your own risk._ - This integration communicates with the Nissan Servers which then communicate with the car. The communication between the car and the Nissan Servers is very slow, and takes up to five minutes to get information from the car, therefore the default polling interval is set to one hour to not overwhelm the connection. -- Responses from the Nissan servers are received separately for the battery/range, climate control and location. The `updated_on` attribute will show the last time the data was retrieved from the server. There are separate attributes for when the `next_update` is scheduled, and to indicate if `update_in_progress`. The `nissan_leaf.update` service will reset the `next_update` attribute. +- Responses from the Nissan servers are received separately for the battery/range, climate control, and location. The `updated_on` attribute will show the last time the data was retrieved from the server. There are separate attributes for when the `next_update` is scheduled and for indicating if `update_in_progress`. The `nissan_leaf.update` action will reset the `next_update` attribute. - The Nissan APIs do not allow charging to be stopped remotely. - The Nissan servers have a history of being unstable, therefore please confirm that the official Nissan Leaf app/website is working correctly before reporting bugs. - In the UK the cut-off for Carwings was the 16 plate 24 kWh and the 65 plate 30 kWh. Cars after this have NissanConnect. diff --git a/source/_integrations/nmap_tracker.markdown b/source/_integrations/nmap_tracker.markdown index 6e39547ea464..249202270a91 100644 --- a/source/_integrations/nmap_tracker.markdown +++ b/source/_integrations/nmap_tracker.markdown @@ -14,17 +14,15 @@ ha_integration_type: integration As an alternative to the router-based device tracking, it is possible to directly scan the network for devices by using Nmap. The IP addresses to scan can be specified in any format that Nmap understands, including the network-prefix notation (`192.168.1.1/24`) and the range notation (`192.168.1.1-255`). -<div class='note'> +{% note %} Please keep in mind that modern smart phones will usually turn off WiFi when they are idle. Simple trackers like this may not be reliable on their own. -</div> - -<div class='note'> +{% endnote %} +{% note %} If you are running Home Assistant Core in a Python virtual environment, you might have to install the packages for `arp` and `nmap`. On Debian based hosts (for example Raspbian) do so by running `sudo apt-get install net-tools nmap`. On a Fedora host run `sudo dnf -y install nmap`. - -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/notify.markdown b/source/_integrations/notify.markdown index ce65e495ad40..90f485bc64bd 100644 --- a/source/_integrations/notify.markdown +++ b/source/_integrations/notify.markdown @@ -17,11 +17,11 @@ If you want to send notifications to the Home Assistant web interface, you may u {% include integrations/building_block_integration.md %} -## Service +## Action -The legacy `notify` platform will expose a generic `notify` service that can be called to send notifications. +The legacy `notify` platform will expose a generic `notify` action that can be called to send notifications. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `message` | no | Body of the notification. | `title` | yes | Title of the notification. @@ -30,38 +30,38 @@ The legacy `notify` platform will expose a generic `notify` service that can be ## Usage -The different **Notify** integrations you have set up will each show up as a different automation {% term action %} or {% term service %} call that you can use. +The different **Notify** integrations you have set up will each show up as a different automation {% term action %} that you can use. -One notification integration is automatically included, the Persistent Notifications which creates a notification in the sidebar of the web interface of Home Assistant. This can be chosen with the action named "Notifications: Send a persistent notification" which uses the service `notify.persistent_notification`. +One notification integration is automatically included, the Persistent Notifications which creates a notification in the sidebar of the web interface of Home Assistant. This can be chosen with the action named "Notifications: Send a persistent notification" which uses the `notify.persistent_notification` action. -## Notify entity service +## Notify action -Integrations can also implement the notify entity platform. Entity platform implementations will replace the legacy notify service in time. There is an entity platform service `send_message` which allows you to send notification messages to multiple notify entities. +Integrations can also implement the notify entity platform. Entity platform implementations will replace the legacy notify action in time. There is an entity platform action `send_message` which allows you to send notification messages to multiple notify entities. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `message` | no | Body of the notification. | `title` | yes | Title of the notification. ## Companion app notifications -A common notification integration is via the Home Assistant Companion app for Android or iPhone. This can be chosen with the action "Send a notification via mobile_app_your_phone_name", which uses the service `notify.mobile_app_your_phone_name`. Refer to the [Companion app documentation](https://companion.home-assistant.io/docs/notifications/notifications-basic) for lots of customization options. +A common notification integration is via the Home Assistant Companion app for Android or iPhone. This can be chosen with the action "Send a notification via mobile_app_your_phone_name", which uses the `notify.mobile_app_your_phone_name` action. Refer to the [Companion app documentation](https://companion.home-assistant.io/docs/notifications/notifications-basic) for lots of customization options. With any of these integrations, the `message` data input in the automation editor is the main text that will be sent. Other fields are optional, and some integrations support additional `data` or `target` information to customize the action. For more details, refer to their integration documentation. -Be aware that the `notify.notify` service is shorthand for the first notify service the system can find. It might not work as intended. Choose a specific service to make sure your message goes to the right place. +Be aware that the `notify.notify` action is shorthand for the first notify action the system can find. It might not work as intended. Choose a specific action to make sure your message goes to the right place. Notifications can also be sent using [Notify groups](https://www.home-assistant.io/integrations/group/#notify-groups). These allow you to send notification to multiple devices with a single call, or to update which device is notified by only changing it in a single place. ### Test if it works -After you setup a [notifier](/integrations/#notifications), a simple way to test if you have set up your notify platform correctly is to open {% my developer_services title="**Developer tools** > **Services**" %}** tab from the sidebar. Choose your service from the **Service** dropdown menu depending on the integration you want to test, such as **Notifications: Send a persistent notification** or **Notifications: Send a notification via mobile_app_your_phone_name**. Enter your message into the **message** field, and select the **CALL SERVICE** button. +After you setup a [notifier](/integrations/#notifications), a simple way to test if you have set up your notify platform correctly is to open {% my developer_services title="**Developer tools** > **Actions**" %}** tab from the sidebar. Choose your action from the **Action** dropdown menu depending on the integration you want to test, such as **Notifications: Send a persistent notification** or **Notifications: Send a notification via mobile_app_your_phone_name**. Enter your message into the **message** field, and select the **Perform action** button. -To test the entity platform service, select the `notify.send_message` service, and select one or more of `entity`, `device`, `area`, or `label`. Then, supply a `message`. +To test the entity platform action, select the `notify.send_message` action, and select one or more of `entity`, `device`, `area`, or `label`. Then, supply a `message`. -### Example with the entity platform notify service +### Example with the entity platform notify action -Under {% my developer_services title="**Developer Tools** > **Services**" %}, select the **Notifications: Send a notification message** action. Select some target entity's using the entity selectors, enter a message and test sending it. +Under {% my developer_services title="**Developer Tools** > **Actions**" %}, select the **Notifications: Send a notification message** action. Select some target entity's using the entity selectors, enter a message and test sending it. If you switch to view the YAML data under **Developer Tools**, it will appear as below. The same {% term action %} can be chosen in {% term automation %}. The YAML will appear the same: @@ -91,9 +91,9 @@ action: {% endraw %} -### Examples with the legacy notify service +### Examples with the legacy notify action -In the **Developer Tools**, on the **Services** tab, select the **Notifications: Send a persistent notification** action. Enter a message and test sending it. +In the **Developer Tools**, on the **Action** tab, select the **Notifications: Send a persistent notification** action. Enter a message and test sending it. If you switch to view the YAML data under **Developer Tools**, it will appear as below. The same {% term action %} can be chosen in {% term automation %} actions %, whose YAML will appear the same: diff --git a/source/_integrations/notify.mqtt.markdown b/source/_integrations/notify.mqtt.markdown index 9328222e0467..2f02873ff8a7 100644 --- a/source/_integrations/notify.mqtt.markdown +++ b/source/_integrations/notify.mqtt.markdown @@ -8,7 +8,7 @@ ha_iot_class: Configurable ha_domain: mqtt --- -The **MQTT notify** platform lets you send an MQTT message when the `send_message` service is called. This can be used to expose a service of a remote device that allows processing a message, such as showing it on a screen. +The **MQTT notify** platform lets you send an MQTT message when the `send_message` action is called. This can be used to expose a action of a remote device that allows processing a message, such as showing it on a screen. ## Configuration @@ -174,11 +174,9 @@ unique_id: type: string {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/notify.rest.markdown b/source/_integrations/notify.rest.markdown index a5ac079ae334..39b7cb445a28 100644 --- a/source/_integrations/notify.rest.markdown +++ b/source/_integrations/notify.rest.markdown @@ -21,7 +21,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string diff --git a/source/_integrations/notify.tts.markdown b/source/_integrations/notify.tts.markdown index 490371cc6520..833f19c3ccc7 100644 --- a/source/_integrations/notify.tts.markdown +++ b/source/_integrations/notify.tts.markdown @@ -1,6 +1,6 @@ --- title: "Notify using TTS" -description: "Instructions on how to set up a Notify integration using TTS service and media_player within Home Assistant." +description: "Instructions on how to set up a Notify integration using TTS action and media_player within Home Assistant." ha_category: - Notifications ha_release: 0.117 @@ -9,7 +9,7 @@ ha_quality_scale: internal ha_domain: notify --- -The notify TTS platform lets you use the TTS integration [speak](/integrations/tts/#service-speak) or legacy [say](/integrations/tts/#service-say-legacy) service and a [media_player](/integrations/media_player) to alert you of important events. This integration provides a simple interface to use in your automations and alerts. +The notify TTS platform lets you use the TTS integration [speak](/integrations/tts/#action-speak) or legacy [say](/integrations/tts/#action-say-legacy) action and a [media_player](/integrations/media_player) to alert you of important events. This integration provides a simple interface to use in your automations and alerts. In order to use this integration, you must already have a TTS platform installed and configured, and a media_player working with the TTS platform. @@ -27,7 +27,7 @@ notify: {% configuration %} name: - description: The name of the notify service. + description: The name of the notify action. required: true type: string entity_id: @@ -43,7 +43,7 @@ notify: required: true type: string language: - description: "The `language` to be passed to the TTS `speak` or `say` service." + description: "The `language` to be passed to the TTS `speak` or `say` action." required: false type: string {% endconfiguration %} diff --git a/source/_integrations/notify_events.markdown b/source/_integrations/notify_events.markdown index a7c8bdaa469f..aac7092078d4 100644 --- a/source/_integrations/notify_events.markdown +++ b/source/_integrations/notify_events.markdown @@ -68,7 +68,7 @@ notify: {% configuration %} name: - description: "The optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`." + description: "The optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: false type: string default: notify @@ -76,13 +76,13 @@ name: ### That's it! -Now you can use the `notify.events` service inside your Home Assistant to: +Now you can use the `notify.events` action inside your Home Assistant to: - Send any notifications or alerts - Distribute events by `level` and `priority` - Attach **files** and **images** (local or remote) - .. and just keep using your favorite messenger to receive them! -### Example service call +### Example action ```yaml - service: notify.events diff --git a/source/_integrations/nuheat.markdown b/source/_integrations/nuheat.markdown index e32c69247a4d..4509dd375414 100644 --- a/source/_integrations/nuheat.markdown +++ b/source/_integrations/nuheat.markdown @@ -110,20 +110,20 @@ Returns the maximum supported temperature by the thermostat | ---------------| ----------- | | Integer | Maximum supported temperature -## Services +## Actions -The following services are provided by the NuHeat Thermostat: `set_temperature`, `set_hvac_mode`, `set_preset_mode`. +The following actions are provided by the NuHeat Thermostat: `set_temperature`, `set_hvac_mode`, `set_preset_mode`. -### Service `climate.set_hvac_mode` ([Climate integration](/integrations/climate/)) +### Action `climate.set_hvac_mode` ([Climate integration](/integrations/climate/)) NuHeat Thermostats do not have an off concept. Setting the temperature to `min_temp` and changing the mode to `heat` will cause the device to enter a `Permanent Hold` preset and will stop the thermostat from turning on unless you happen to live in a freezing climate. -### Service `climate.set_temperature` ([Climate integration](/integrations/climate/)) +### Action `climate.set_temperature` ([Climate integration](/integrations/climate/)) If the thermostat is in auto mode, it puts the thermostat into a temporary hold at the given temperature. If the thermostat is in heat mode, it puts the thermostat into a permanent hold at the given temperature. -### Service `climate.set_preset_mode` ([Climate integration](/integrations/climate/)) +### Action `climate.set_preset_mode` ([Climate integration](/integrations/climate/)) The following presets are available: `Run Schedule`, `Temporary Hold`, `Permanent Hold`. diff --git a/source/_integrations/nuki.markdown b/source/_integrations/nuki.markdown index e6196c867e3c..6fe076ddda87 100644 --- a/source/_integrations/nuki.markdown +++ b/source/_integrations/nuki.markdown @@ -39,23 +39,23 @@ For faster updates, the callback function of the Nuki bridge can be used. This r description: Use an encrypted token for API calls to the bridge. This should only be deactivated if you experience issues with the API (authentication, etc). The default is `True`. {% endconfiguration_basic %} -## Services +## Actions -### Service `nuki.lock_n_go` +### Action `nuki.lock_n_go` This will first unlock, wait a few seconds (20 by default) then re-lock. The wait period can be customized through the app. See the [Nuki Website](https://nuki.io/en/support/smart-lock/sl-features/locking-with-the-smart-lock/) for more details about this feature. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`s Nuki Locks. | `unlatch` | yes | Boolean - Whether to unlatch the door when first opening it. -### Service `nuki.set_continuous_mode` +### Action `nuki.set_continuous_mode` -This service allows you to enable or disable the "Continuous Mode" feature of Nuki Openers. This is similar to the Ring-to-Open feature that is mapped to "lock/unlock", except that it doesn't have a time limit - as long as this mode is enabled, the door will open when the buzzer button is pressed, similar to how it works at e.g. a doctor's office or other business during the day. On other Nuki products, this service is a no-op. +This action allows you to enable or disable the "Continuous Mode" feature of Nuki Openers. This is similar to the Ring-to-Open feature that is mapped to "lock/unlock", except that it doesn't have a time limit - as long as this mode is enabled, the door will open when the buzzer button is pressed, similar to how it works at e.g. a doctor's office or other business during the day. On other Nuki products, this action is a no-op. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`s Nuki Locks. | `enabled` | yes | Boolean - Set to `true` to enable Continuous Mode, or `false` to disable. diff --git a/source/_integrations/numato.markdown b/source/_integrations/numato.markdown index eaa005503a07..768eb939b4c9 100644 --- a/source/_integrations/numato.markdown +++ b/source/_integrations/numato.markdown @@ -140,14 +140,12 @@ devices: The `numato` binary_sensor platform allows you to operate the GPIOs of your [Numato](https://numato.com) 32 port USB GPIO expander in binary input mode. -<div class='note warning'> - +{% caution %} As the Numato devices do not have internal pull-up or pull-down circuitry, be careful not to destroy a port by creating a short circuit. Refer to the [Numato documentation](https://numato.com/docs/32-channel-usb-gpio-module-with-analog-inputs/#gpio-with-switches-8) on how to connect a switch to an input port, for example. - -</div> +{% endcaution %} ## Sensor @@ -211,7 +209,7 @@ Hint: It is a good practice to put sticky labels with the IDs onto the PCBs in order to avoid confusion of devices and their port configuration since this could easily destroy your device. -<div class='note warning'> +{% warning %} Numato devices used by Home Assistant are expected to be exclusive to Home Assistant and remain permanently connected. -</div> +{% endwarning %} diff --git a/source/_integrations/number.markdown b/source/_integrations/number.markdown index 636ff6316eda..84ffa781153a 100644 --- a/source/_integrations/number.markdown +++ b/source/_integrations/number.markdown @@ -77,10 +77,10 @@ The following device classes are supported for numbers: - **weight**: Generic mass in kg, g, mg, µg, oz, lb, or st - **wind_speed**: Wind speed in ft/s, km/h, kn, m/s, or mph -## Services +## Actions -The Number entities registers the following services: +The Number entities registers the following actions: -| Service | Data | Description | +| Action | Data | Description | | ------- | ---- | ----------- | | `set_value` | `value`<br>`entity_id(s)`<br>`area_id(s)` | Set the value of specific `number` entities diff --git a/source/_integrations/number.mqtt.markdown b/source/_integrations/number.mqtt.markdown index ca7c58e4019f..e4301d3fac7d 100644 --- a/source/_integrations/number.mqtt.markdown +++ b/source/_integrations/number.mqtt.markdown @@ -203,8 +203,6 @@ value_template: type: template {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} diff --git a/source/_integrations/nws.markdown b/source/_integrations/nws.markdown index 85a89a9db78a..c554ad89f2d9 100644 --- a/source/_integrations/nws.markdown +++ b/source/_integrations/nws.markdown @@ -26,8 +26,36 @@ According to the [API documentation](https://www.weather.gov/documentation/servi Providing a METAR station code is optional, and if not supplied, the closest station to the latitude and longitude will be chosen. A list of nearby stations is printed to the log with level `DEBUG` if no station is supplied. Stations can also be found on the [NOAA website](https://www.cnrfc.noaa.gov/metar.php). Codes with only three characters, for example, `ADW` should be prefixed with the letter K, `KADW`. -One weather entity is created for each entry in the configuration. Hourly and day/night forecasts are provided through the `weather.get_forecasts` service. The time supplied for each forecast is the start time for the forecast. Sensors are also created as disabled entities after configuration and can be enabled by the user. +One weather entity is created for each entry in the configuration. Hourly and day/night forecasts are provided through the [`weather.get_forecasts` action](/integrations/weather/action--weatherget_forecasts). The time supplied for each forecast is the start time for the forecast. Sensors are also created as disabled entities after configuration and can be enabled by the user. -Details about the API are available in the [NWS API documentation](https://www.weather.gov/documentation/services-web-api). The [pynws](https://github.com/MatthewFlamm/pynws) library is used to retrieve data. +## Action `nws.get_forecasts_extra` + +`nws.get_forecasts_extra` provides extra data in a form similar to `weather.get_forecasts`. See [`weather.get_forecasts` documentation](/integrations/weather/action--weatherget_forecasts). + +| Data attribute | Optional | Description | Example | +| ---------------------- | -------- | ----------- | --------| +| `type` | no | The type of forecast, must be either `twice_daily` or `hourly`. | `twice_daily` | + +```yaml +service: nws.get_forecasts_extra +target: + entity_id: + - weather.khou +data: + type: twice_daily +response_variable: weather_forecast +``` -Details about the `weather.get_forecasts` service are available in the [`weather` documentation](/integrations/weather/). +The response data field is a mapping of called target entities, each containing the `forecast` field. +`forecast` is a list of forecasted conditions at a given point in time that are not returned from `weather.get_forecasts`. The `datetime` and `is_daytime` attributes are still provided for context. + +| Response data | Description | Example | +| ---------------------- | ----------- | -------- | +| `datetime` | The time of the forecasted conditions. | 2023-02-17T14:00:00+00:00 | +| `is_daytime` | Only set for `twice_daily` forecasts. | True | +| `detailed_description` | Only set for `twice_daily` forecasts. | 50% Chance of rain, otherwise partly cloudy with a high of 75F. | +| `short_description` | Short weather condition | Partly Sunny then Slight Chance Showers And Thunderstorms | + +## Details + +Details about the API are available in the [NWS API documentation](https://www.weather.gov/documentation/services-web-api). The [pynws](https://github.com/MatthewFlamm/pynws) library is used to retrieve data. diff --git a/source/_integrations/nx584.markdown b/source/_integrations/nx584.markdown index ff801f76e5bc..5727b4066359 100644 --- a/source/_integrations/nx584.markdown +++ b/source/_integrations/nx584.markdown @@ -118,22 +118,22 @@ binary_sensor: 6: moisture ``` -## Services +## Actions -### Service `bypass_zone` +### Action `bypass_zone` -This service will bypass a given zone. +This action will bypass a given zone. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------- | | `entity_id` | yes | entity_id of the NX584 Alarm. | | `zone` | no | Zone number you want to bypass. | -### Service `unbypass_zone` +### Action `unbypass_zone` -This service will unbypass a given zone. +This action will unbypass a given zone. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------- | | `entity_id` | yes | entity_id of the NX584 Alarm. | | `zone` | no | Zone number you want to unbypass. | diff --git a/source/_integrations/nzbget.markdown b/source/_integrations/nzbget.markdown index 015bd1762bb4..d091500fb5ae 100644 --- a/source/_integrations/nzbget.markdown +++ b/source/_integrations/nzbget.markdown @@ -65,16 +65,16 @@ Example automation to send a Telegram message on a completed download: {% endraw %} -## Services +## Actions -Available services: +Available actions: - `pause`: Pause the download queue. - `resume`: Resume the download queue. - `set_speed`: Set the download queue speed limit. -### Service `nzbget/set_speed` +### Action `nzbget/set_speed` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------- | | `speed` | yes | Sets the download speed limit, specified in Kb/s. 0 disables the speed limit. Defaults to 1000. | diff --git a/source/_integrations/ollama.markdown b/source/_integrations/ollama.markdown index 7ba8f9e947dd..ec007662651a 100644 --- a/source/_integrations/ollama.markdown +++ b/source/_integrations/ollama.markdown @@ -41,4 +41,7 @@ Prompt template: Max history messages: description: Maximum number of messages to keep for each conversation (0 = no limit). Limiting this value will cause older messages in a conversation to be dropped. +Keep alive: + description: Duration in seconds for the Ollama host to keep the model in memory after receiving a message (-1 = no limit, 0 = no retention). Default value is -1. + {% endconfiguration_basic %} diff --git a/source/_integrations/ombi.markdown b/source/_integrations/ombi.markdown index b3ad34c741dc..30f3c0dea9aa 100644 --- a/source/_integrations/ombi.markdown +++ b/source/_integrations/ombi.markdown @@ -85,33 +85,33 @@ ombi: ssl: true ``` -## Services +## Actions -### Submit request services +### Submit request actions -Available services: `submit_movie_request`, `submit_music_request`, `submit_tv_request` +Available actions: `submit_movie_request`, `submit_music_request`, `submit_tv_request` -#### Service `submit_movie_request` +#### Action `submit_movie_request` Searches and requests the closest matching movie. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------- | | `name` | no | Search parameter. | -#### Service `submit_music_request` +#### Action `submit_music_request` Searches and requests the closest matching music album. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------- | | `name` | no | Search parameter. | -#### Service `submit_tv_request` +#### Action `submit_tv_request` Searches and requests the closest matching TV show. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------ | | `name` | no | Search parameter. | | `season` | yes | Which season(s) to request. Must be one of `first`, `latest` or `all`. Defaults to latest. | diff --git a/source/_integrations/onkyo.markdown b/source/_integrations/onkyo.markdown index 35e2f9e588c2..f6ec390ce392 100644 --- a/source/_integrations/onkyo.markdown +++ b/source/_integrations/onkyo.markdown @@ -4,7 +4,7 @@ description: Instructions on how to integrate Onkyo and some Pioneer receivers i ha_category: - Media player ha_release: 0.17 -ha_iot_class: Local Polling +ha_iot_class: Local Push ha_domain: onkyo ha_platforms: - media_player @@ -12,6 +12,8 @@ ha_integration_type: integration related: - docs: /docs/configuration/ title: Configuration file +ha_codeowners: + - '@arturpragacz' --- The `onkyo` {% term integration %} allows you to control a [Onkyo](https://www.onkyo.com), [Integra](http://www.integrahometheater.com) @@ -105,11 +107,11 @@ onkyo --host 192.168.0.100 volume=query unknown-model: master-volume = 191 ``` -### Service `onkyo_select_hdmi_output` +### Action `onkyo_select_hdmi_output` Changes HDMI output of your receiver -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------- | | `entity_id` | no | String or list of a single `entity_id` that will change output. | | `hdmi_output` | no | The desired output code. | diff --git a/source/_integrations/onvif.markdown b/source/_integrations/onvif.markdown index 807735dc891a..84c90c7e3d2a 100644 --- a/source/_integrations/onvif.markdown +++ b/source/_integrations/onvif.markdown @@ -25,13 +25,13 @@ The ONVIF camera integration allows you to use an [ONVIF](https://www.onvif.org/ {% include integrations/config_flow.md %} -<div class='note'> - It is recommended that you create a user on your device specifically for Home Assistant. For all current functionality, it is enough to create a standard user. -</div> +{% tip %} +It is recommended that you create a user on your device specifically for Home Assistant. For all current functionality, it is enough to create a standard user. +{% endtip %} -<div class='note'> -If running Home assistant Core in a venv, ensure that libxml2 and libxslt python interfaces are installed via your package manager. -</div> +{% note %} +If running Home Assistant Core in a venv, ensure that libxml2 and libxslt Python interfaces are installed via your package manager. +{% endnote %} ### Configuration notes @@ -85,11 +85,11 @@ To help with development of this integration, enable `info` level logging for `h If you are running into trouble with this sensor, please refer to the [Troubleshooting section](/integrations/ffmpeg/#troubleshooting). -### Service `onvif.ptz` +### Action `onvif.ptz` If your ONVIF camera supports <abbr title="pan, tilt, and zoom">PTZ</abbr>, you will be able to pan, tilt or zoom your camera. -| Service data attribute | Description | +| Data attribute | Description | | -----------------------| ----------- | | `entity_id` | String or list of strings that point at `entity_id`s of cameras. Use `entity_id: all` to target all. | | `tilt` | Tilt direction. Allowed values: `UP`, `DOWN`, `NONE` | diff --git a/source/_integrations/openai_conversation.markdown b/source/_integrations/openai_conversation.markdown index ff65e7160f4a..1bbca6de234a 100644 --- a/source/_integrations/openai_conversation.markdown +++ b/source/_integrations/openai_conversation.markdown @@ -77,15 +77,15 @@ Top P: You can use an OpenAI Conversation integration to [talk to Super Mario and, if desired, have it control devices](/voice_control/assist_create_open_ai_personality/) in your home. -## Services +## Actions -### Service `openai_conversation.generate_image` +### Action `openai_conversation.generate_image` -Allows you to ask OpenAI to generate an image based on a prompt. This service +Allows you to ask OpenAI to generate an image based on a prompt. This action populates [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with the requested image. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ------------------------------------------------------ | ---------------- | | `config_entry` | no | Integration entry ID to use. | | | `prompt` | no | The text to turn into an image. | Picture of a dog | @@ -117,7 +117,7 @@ to generate a new image of New York in the current weather state. The resulting image entity can be used in, for example, a card on your dashboard. The *config_entry* is installation specific. To get the value, make sure the integration has been installed. -Then, go to {% my developer_services title="**Developer Tools** > **Services**" %}. Ensure you are in UI mode and enter the following below: +Then, go to {% my developer_services title="**Developer Tools** > **Actions**" %}. Ensure you are in UI mode and enter the following below: ![Open AI Conversation UI Mode](/images/integrations/openai_conversation/openai_developer_tools_ui.png) diff --git a/source/_integrations/openhome.markdown b/source/_integrations/openhome.markdown index 9290e03e9a78..84389415790c 100644 --- a/source/_integrations/openhome.markdown +++ b/source/_integrations/openhome.markdown @@ -44,12 +44,13 @@ action: media_content_type: music ``` -## Services +## Actions -### Media control services -Available services: `invoke_pin` +### Media control actions -| Service data attribute | Optional | Description | +Available actions: `invoke_pin` + +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | yes | The name of the openhome device to invoke the pin on.| | `pin` | no | Which pin to invoke. | diff --git a/source/_integrations/opentherm_gw.markdown b/source/_integrations/opentherm_gw.markdown index 80e4f954bed2..fa3d1c257edf 100644 --- a/source/_integrations/opentherm_gw.markdown +++ b/source/_integrations/opentherm_gw.markdown @@ -29,9 +29,9 @@ The following device types are currently supported within Home Assistant: This integration will add a single `climate` entity to Home Assistant for each configured gateway. Each gateway also has a collection of `sensor` and `binary_sensor` entities, which are disabled by default. These can be enabled from the `Devices` panel in the `Configuration` page of the web interface. -<div class='note'> +{% note %} The OpenTherm protocol is based on polling. The thermostat sends requests to the boiler at specific intervals. As a result, it may take some time for changes to propagate between Home Assistant and the thermostat. -</div> +{% endnote %} {% include integrations/config_flow.md %} @@ -43,16 +43,16 @@ name: path or url: description: "Path to the OpenTherm Gateway device as supported by [PySerial](https://pythonhosted.org/pyserial/url_handlers.html). This is usually either a path to a serial device in `/dev/` if the gateway is connected via serial or USB, or a URL in the form of `socket://[IP address]:[port]` if it is connected over the network.<br/>Examples: `/dev/ttyUSB0`, `socket://192.168.0.250:7686`" id: - description: "The `gateway_id` for this OpenTherm Gateway. This is used to identify this specific gateway in service calls and to generate the entity IDs for the entities related to this gateway. The entered value will be slugified, i.e. all spaces and special characters will be converted to underscores and any accents will be removed from their characters. The default value is the slugified version of the `name` given above.<br/>Examples: `thermostat`, `living_room`" + description: "The `gateway_id` for this OpenTherm Gateway. This is used to identify this specific gateway in action and to generate the entity IDs for the entities related to this gateway. The entered value will be slugified, i.e. all spaces and special characters will be converted to underscores and any accents will be removed from their characters. The default value is the slugified version of the `name` given above.<br/>Examples: `thermostat`, `living_room`" {% endconfiguration_basic %} -<div class='note warning'> +{% important %} Please make sure no other device or application is connected to the OpenTherm Gateway at the same time as Home Assistant. This is not a supported scenario and may lead to unexpected results. -</div> +{% endimportant %} -<div class='note'> +{% note %} The precision and floor_temperature settings that were supported in configuration.yaml entries have been lost upon import of the `configuration.yaml` entry into the Integrations panel. You can now configure them as per the following Options paragraph. -</div> +{% endnote %} # Options @@ -70,66 +70,62 @@ Floor Temperature: description: "Some thermostats round all temperatures down to the lower value according to their precision. Default behavior for Home Assistant is to round temperatures to the nearest value. Enable this setting to override this behavior and round to the lower value according to the configured precision." {% endconfiguration_basic %} -## Services +## Actions -### Service `opentherm_gw.reset_gateway` +### Action `opentherm_gw.reset_gateway` Reset the OpenTherm Gateway. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------- | | `gateway_id` | no | The `gateway_id` as specified during configuration. | -### Service `set_central_heating_ovrd` +### Action `set_central_heating_ovrd` Set the central heating override option on the gateway. -When overriding the control setpoint (via a [set_control_setpoint](#service-opentherm_gwset_control_setpoint) service call with a temperature value other than `0`), the gateway automatically enables the central heating override to start heating. This service can then be used to control the central heating override status. -To return control of the central heating to the thermostat, call the [set_control_setpoint](#service-opentherm_gwset_control_setpoint) service with temperature value `0`. +When overriding the control setpoint (via the [set_control_setpoint](#action-opentherm_gwset_control_setpoint) action with a temperature value other than `0`), the gateway automatically enables the central heating override to start heating. This action can then be used to control the central heating override status. +To return control of the central heating to the thermostat, use the [set_control_setpoint](#action-opentherm_gwset_control_setpoint) action with temperature value `0`. **You will only need this if you are writing your own software thermostat.** -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------- | | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `ch_override` | no | The desired value for the central heating override. Use `0` to disable or `1` to enable. | -<div class='note'> - +{% warning %} Please read [this information](http://otgw.tclcode.com/standalone.html) from the designer of the OpenTherm Gateway before considering to write your own software thermostat. +{% endwarning %} -</div> - -### Service `opentherm_gw.set_clock` +### Action `opentherm_gw.set_clock` Provide the time and day of week to the OpenTherm Gateway. The value provided here will be forwarded to the thermostat on the next date/time request from the thermostat. The OpenTherm Gateway does not have the ability to accurately keep track of time, so it will only retain the information provided here for a maximum of about 61 seconds. -| Service data attribute | Optional | Default | Description | +| Data attribute | Optional | Default | Description | | ---------------------- | -------- | ------------ | ------------------------------------------------------------------------ | | `gateway_id` | no | N/A | The `gateway_id` as specified during configuration. | | `date` | yes | Today's date | Date from which the day of week will be extracted. Format: `YYYY-MM-DD`. | | `time` | yes | Current time | Time in 24h format. | -### Service `opentherm_gw.set_control_setpoint` +### Action `opentherm_gw.set_control_setpoint` -<div class='note warning'> -Improper use of this service may continuously keep your central heating system active, resulting in an overheated house and a significant increase in gas and/or electricity consumption. -</div> +{% caution %} +Improper use of this action may continuously keep your central heating system active, resulting in an overheated house and a significant increase in gas and/or electricity consumption. +{% endcaution %} Set the central heating control setpoint override on the OpenTherm Gateway. In a normal situation, the thermostat will calculate and control the central heating setpoint on the boiler. Setting this to any value other than 0 will enable the override and allow the OpenTherm Gateway to control this setting. While the override is active, the OpenTherm Gateway will also request your boiler to activate the central heating circuit. For your boiler's actual maximum and minimum supported setpoint value, please see the `slave_ch_max_setp` and `slave_ch_min_setp` [sensors](#sensors). Due to the potential consequences of leaving this setting enabled for prolonged periods, the override will be disabled when Home Assistant is shut down or restarted. **You will only need this if you are writing your own software thermostat.** -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `temperature` | no | The central heating setpoint. Values between `0.0` and `90.0` are accepted, but your boiler may not support the full range. Set to `0` to disable the override. | -<div class='note'> - +{% warning %} Please read [this information](http://otgw.tclcode.com/standalone.html) from the designer of the OpenTherm Gateway before considering to write your own software thermostat. +{% endwarning %} -</div> - -### Service `opentherm_gw.set_hot_water_ovrd` +### Action `opentherm_gw.set_hot_water_ovrd` Set the domestic hot water enable option on the OpenTherm Gateway. Control the domestic hot water enable option. If the boiler has @@ -137,89 +133,101 @@ been configured to let the room unit control when to keep a small amount of water preheated, this command can influence that. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `dhw_override` | no | The domestic hot water override state. Value should be `0` or `1` to enable the override in off or on state, or `"A"` to disable the override. | -### Service `opentherm_gw.set_hot_water_setpoint` +### Action `opentherm_gw.set_hot_water_setpoint` Set the domestic hot water setpoint on the OpenTherm Gateway. Not all boilers support this feature. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `temperature` | no | The domestic hot water setpoint to set on the gateway. Values between `0` and `90` are accepted, but not all boilers support this range. Check the values of the `slave_dhw_min_setp` and `slave_dhw_max_setp` sensors to see the supported range on your boiler. | -### Service `opentherm_gw.set_gpio_mode` +### Action `opentherm_gw.set_gpio_mode` Configure the GPIO behavior on the OpenTherm Gateway. For an explanation of the possible modes, see [GPIO modes](#gpio-modes) -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------- | | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `id` | no | The GPIO ID; `A` or `B`. | | `mode` | no | The GPIO mode to be set. | -### Service `opentherm_gw.set_led_mode` +### Action `opentherm_gw.set_led_mode` Configure the function of the LEDs on the OpenTherm Gateway. For a list of possible modes with explanation, see [LED modes](#led-modes) -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------- | | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `id` | no | The LED ID, accepted values are `A` through `F`. | | `mode` | no | The LED mode to be set. | -### Service `opentherm_gw.set_max_modulation` +### Action `opentherm_gw.set_max_modulation` -<div class='note warning'> -Improper use of this service may impair the performance of your central heating system. -</div> +{% warning %} +Improper use of this action may impair the performance of your central heating system. +{% endwarning %} Set the maximum modulation level override on the OpenTherm Gateway. In a normal situation, the thermostat will control the maximum modulation level on the boiler. Setting this to any value other than `-1` will enable the override and allow the OpenTherm Gateway to control this setting. Due to the potential consequences of leaving this setting enabled, the override will be disabled when Home Assistant is shut down or restarted. **You will only need this if you are writing your own software thermostat.** -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------- | | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `level` | no | The maximum modulation level. Accepted values are `-1` through `100`. Set to `-1` to disable the override. | -<div class='note'> - +{% warning %} Please read [this information](http://otgw.tclcode.com/standalone.html) from the designer of the OpenTherm Gateway before considering to write your own software thermostat. +{% endwarning %} -</div> - -### Service `opentherm_gw.set_outside_temperature` +### Action `opentherm_gw.set_outside_temperature` Provide the outside temperature to the thermostat. If your thermostat is unable to display an outside temperature and does not support OTC (Outside Temperature Correction), this has no effect. Note that not all thermostats are able to display the full supported range. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `temperature` | no | The outside temperature to provide to the thermostat. Accepted values are `-40.0` through `64.0`. Any value above `64.0` will clear a previously configured value (suggestion: `99`). | -### Service `opentherm_gw.set_setback_temperature` +### Action `opentherm_gw.set_setback_temperature` Configure the setback temperature on the OpenTherm Gateway. The value you provide here will be used with the GPIO `home` (5) and `away` (6) modes. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------ | | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `temperature` | no | The setback temperature. Accepted values are `0.0` through `30.0`. | +### Action `opentherm_gw.send_transparent_command` + +<div class='note warning'> +Improper use of this action may impair the performance of your central heating system. +</div> + +Send a transparent [command](https://otgw.tclcode.com/firmware.html) to the OpenTherm Gateway. + +| Data attribute | Optional | Description | +| ---------------------- | -------- | ------------------------------------------------------------------ | +| `gateway_id` | no | The `gateway_id` as specified during configuration. | +| `transp_cmd` | no | The serial command to be sent to the OpenTherm Gateway. | +| `transp_arg` | no | The serial command argument to be sent to the OpenTherm Gateway. | + ## Sensors The following `sensor` entities will be created for each configured gateway. The `entity_id` of every sensor will have a suffix containing the data source (`boiler`, `gateway` or `thermostat`) and the `gateway_id` of the gateway to which it belongs. All `sensor` entities are disabled by default. -<p class='note'> +{% note %} Not all boilers and thermostats properly support all OpenTherm features, so not all of the sensors will have useful values. -</p> +{% endnote %} - **burner_hours** Boiler flame on time. @@ -417,9 +425,9 @@ Not all boilers and thermostats properly support all OpenTherm features, so not ## Binary sensors The following `binary_sensor` entities will be created for each configured gateway. The `entity_id` of every sensor will have a suffix containing the data source (`boiler`, `gateway` or `thermostat`) and the `gateway_id` of the gateway to which it belongs. All `binary_sensor` entities are disabled by default. -<p class='note'> +{% note %} Not all boilers and thermostats properly support all OpenTherm features, so not all of the sensors will have useful values. -</p> +{% endnote %} - **master_ch2_enabled** Thermostat requests central heating 2 on. diff --git a/source/_integrations/openuv.markdown b/source/_integrations/openuv.markdown index 8c2d737d2a01..06067b3989e8 100644 --- a/source/_integrations/openuv.markdown +++ b/source/_integrations/openuv.markdown @@ -20,11 +20,11 @@ ha_integration_type: service The OpenUV integration displays UV and Ozone data from [openuv.io](https://www.openuv.io/). -<div class='note warning'> +{% warning %} The guidelines within this documentation constitute estimates which are intended to help informed decision making. They should not replace analysis, advice, or diagnosis from a trained medical professional. -</div> +{% endwarning %} ## Generating an API Key @@ -50,16 +50,16 @@ To generate an API key, log in at [the OpenUV website](https://www.openuv.io/). ## Updating data -<div class='note warning'> +{% important %} OpenUV does _not_ automatically update data for its entities! Users must manually -update data via the `homeassistant.update_entity` service. -</div> +update data via the `homeassistant.update_entity` action. +{% endimportant %} Beginning February 1, 2019, the "Limited" plan (which is what new users are given by default) is limited to 50 API requests per day. Because different API plans and locations will have different requirements, the OpenUV integration does not automatically query the API for new data after it initially loads. To request new data, the -`homeassistant.update_entity` service should be used. +`homeassistant.update_entity` action should be used. Note that in the case of UV and ozone data, selecting any one of: @@ -74,7 +74,7 @@ Note that in the case of UV and ozone data, selecting any one of: - Skin Type 5 Safe Exposure Time - Skin Type 6 Safe Exposure Time -...as the target for the `homeassistant.update_entity` service will update the data for +...as the target for the `homeassistant.update_entity` action will update the data for _all_ of these entities. To protect against possible API call waste, all calls to `homeassistant.update_entity` @@ -151,7 +151,7 @@ automation: before: sunset # The last call will most likely fall before the sunset, leaving the UV index at # something other than 0 for the remainder of the night; to fix this, we allow - # one more service call after the sun has set: + # one more action after the sun has set: before_offset: "+00:45:00" - condition: template # We check if the last trigger has been 40 minutes or more ago so we don't run diff --git a/source/_integrations/openweathermap.markdown b/source/_integrations/openweathermap.markdown index fd3d948f945f..5a76e29a9006 100644 --- a/source/_integrations/openweathermap.markdown +++ b/source/_integrations/openweathermap.markdown @@ -16,9 +16,12 @@ ha_platforms: - sensor - weather ha_integration_type: integration +related: + - docs: /common-tasks/general/#defining-a-custom-polling-interval + title: Defining a custom polling interval --- -The OpenWeatherMap weather integrations uses [OpenWeatherMap](https://openweathermap.org/) as a source for current meteorological data for your location. +The OpenWeatherMap weather integration uses [OpenWeatherMap](https://openweathermap.org/) as a source for current meteorological data for your location. There is currently support for the following device types within Home Assistant: @@ -42,13 +45,11 @@ To continue using the service: For more details, set limits on your usage to avoid charges at [OpenWeatherMap Subscriptions](https://home.openweathermap.org/subscriptions). -<div class='note'> - +{% important %} If you register an new API key with OpenWeatherMap, it will be activated automatically, this typically takes between 10 minutes and 2 hours after your successful registration. Keep in mind when configuring this integration, that you new API key might not be activated yet. Recent policy changes limit the API access for new registered users with a free plan, they should select the `hourly` mode. The other modes require a paid subscription plan. Invalid API-key errors might occur if your API key is used with the other modes. - -</div> +{% endimportant %} {% include integrations/config_flow.md %} @@ -61,17 +62,15 @@ not be activated yet. Recent policy changes limit the API access for new registe | Mode | API version, `v2.5` (deprecated), `v3.0` new API version. | | Language | Language for receiving data (only for `sensor`) | -A `sensor` entity will be created for each supported condition. Their ids will follow the format: +A `sensor` entity will be created for each supported condition. Their IDs will follow the format: `sensor.<integration name>_<monitored condition>` Sensors provide data in the language that was selected when configuring the integration. -<div class='note'> - +{% note %} The Weather entity provides data only in English. Home Assistant automatically translates it to the language configured for the frontend. - -</div> +{% endnote %} ## Supported Weather Conditions @@ -94,21 +93,6 @@ The Weather entity provides data only in English. Home Assistant automatically t | `weather` | A human-readable description of the [weather condition](https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2). | | `weather_code` | ID of the [weather condition](https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2). | | `wind_bearing` | Wind direction, degrees (meteorological). | -| `wind_speed` | Wind speed, metre/sec. | - -### Forecast Weather Conditions - -| Condition | Description | -| :----------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `forecast_cloud_coverage` | Cloudiness, %. | -| `forecast_condition` | [Weather condition](https://developers.home-assistant.io/docs/core/entity/weather/#recommended-values-for-state-and-condition) for the forecast's time period. | -| `forecast_precipitation` | Combined Rain and Snow volume for the forecast's time period, mm. | -| `forecast_precipitation_probability` | Probability of precipitation for the forecast's time period. | -| `forecast_pressure` | Atmospheric pressure at sea level for the forecast's time period, hPa. | -| `forecast_temperature` | Maximum temperature for the day. | -| `forecast_temperature_low` | Minimum temperature for the day. | -| `forecast_time` | Time of the forecasted data. | -| `forecast_wind_bearing` | Wind direction for the forecast's time period, degrees (meteorological). | -| `forecast_wind_speed` | Wind speed for the forecast's time period, metre/sec. | +| `wind_speed` | Wind speed, meter/sec. | Details about the API are available in the [OpenWeatherMap documentation](https://openweathermap.org/api). diff --git a/source/_integrations/oralb.markdown b/source/_integrations/oralb.markdown index 523c86c6a9d2..7071feee54fd 100644 --- a/source/_integrations/oralb.markdown +++ b/source/_integrations/oralb.markdown @@ -49,6 +49,6 @@ The integration can discover most Bluetooth-enabled Oral-B toothbrushes. Brushes - Toothbrush state - whether the toothbrush is running, idle. - Battery - toothbrush battery percentage. -<div class='note'> +{% important %} Updates of the battery sensor require an active Bluetooth connection and relatively close proximity. If you use a <a href="/integrations/bluetooth/#remote-adapters-bluetooth-proxies/" target="_blank">Bluetooth proxy</a>, please ensure it supports active connections. All the other sensors update with active or passive connections. -</div> +{% endimportant %} diff --git a/source/_integrations/orvibo.markdown b/source/_integrations/orvibo.markdown index 60a9f1ffbdc9..4b8c1f691fc3 100644 --- a/source/_integrations/orvibo.markdown +++ b/source/_integrations/orvibo.markdown @@ -11,11 +11,9 @@ ha_platforms: ha_integration_type: integration --- -<div class='note warning'> - +{% caution %} Please be aware that the product ORVIBO WIFI SMART SOCKET S20 (LGS-20) has been recalled by the European authorities due to safety concerns. For more information, please visit [RAPEX information](https://ec.europa.eu/consumers/consumers_safety/safety_products/rapex/alerts/?event=viewProduct&reference=A12/1577/15&lng=en). - -</div> +{% endcaution %} The `orvibo` switch platform allows you to toggle your Orvibo S20 Wifi Smart Sockets. diff --git a/source/_integrations/otp.markdown b/source/_integrations/otp.markdown index 7afe598d1dfa..d6dadccac328 100644 --- a/source/_integrations/otp.markdown +++ b/source/_integrations/otp.markdown @@ -40,6 +40,6 @@ Token: IHEDPEBEVA2WVHB7 Copy and paste the token into your Home Assistant configuration and add it to your OTP generator. Verify that they generate the same code. -<div class='note warning'> +{% important %} It is vital that your system clock is correct both on your Home Assistant instance and on your OTP generator device (e.g., your phone). If not, the generated codes will not match! Make sure NTP is running and syncing your time correctly before creating an issue. -</div> +{% endimportant %} diff --git a/source/_integrations/owntracks.markdown b/source/_integrations/owntracks.markdown index b6f2ddb2b912..7a0595729b2b 100644 --- a/source/_integrations/owntracks.markdown +++ b/source/_integrations/owntracks.markdown @@ -12,13 +12,13 @@ ha_platforms: ha_integration_type: integration --- -[OwnTracks](https://owntracks.org/) is a free and open source application for iOS and Android that allows you to track your location and send it directly to Home Assistant. OwnTracks can be set up via **{% my integrations title="Settings > Devices & Services" %}**. +[OwnTracks](https://owntracks.org/) is a free and open source application for iOS and Android that allows you to track your location and send it directly to Home Assistant. OwnTracks can be set up via **{% my integrations title="Settings > Devices & services" %}**. By default, the integration listens for incoming messages from OwnTracks via HTTP. If Home Assistant is configured to use MQTT instead, it listens for MQTT messages. When a location is submitted via HTTP, Home Assistant returns all [Persons](/integrations/person/)' last known locations. Their location will be displayed within the OwnTracks app. ## Configuration -1. To set up OwnTracks in Home Assistant, go to **{% my integrations title="Settings > Devices & Services" %}**. +1. To set up OwnTracks in Home Assistant, go to **{% my integrations title="Settings > Devices & services" %}**. 2. Add the **OwnTracks** integration. - This will give you the **Webhook** URL as well as the **Encryption key** to use during mobile device configuration (below). @@ -122,9 +122,9 @@ When you exit a zone, Home Assistant will start using location updates to track ## Using OwnTracks regions - forcing OwnTracks to update using iBeaconsOwntracks -<div class='note'> +{% note %} OwnTracks v2.0.0 removes support for iBeacons on Android. -</div> +{% endnote %} When run in the usual *significant changes mode* (which is kind to your phone battery), OwnTracks sometimes doesn't update your location as quickly as you'd like when you arrive at a zone. This can be annoying if you want to trigger an automation when you get home. You can improve the situation using iBeacons. diff --git a/source/_integrations/p1_monitor.markdown b/source/_integrations/p1_monitor.markdown index 0730a3a709f6..f8086cdd7113 100644 --- a/source/_integrations/p1_monitor.markdown +++ b/source/_integrations/p1_monitor.markdown @@ -51,11 +51,9 @@ See per phase what your voltage, current and power consumption/production is. ### WaterMeter -<div class='note'> - +{% important %} You need to run at least version **1.1.0** of P1 Monitor, to use a water meter. - -</div> +{% endimportant %} See how much water you consume per day, in total and the number of counted pulses. diff --git a/source/_integrations/panasonic_viera.markdown b/source/_integrations/panasonic_viera.markdown index 80a1dc2479e3..f35ae495745e 100644 --- a/source/_integrations/panasonic_viera.markdown +++ b/source/_integrations/panasonic_viera.markdown @@ -63,7 +63,7 @@ turn_on_action: type: list {% endconfiguration %} -When you restart Home Assistant, make sure the TV is turned on and connected to your local network. If your TV needs to be paired, you'll need to go to **Settings > Devices & Services** to type the PIN code that will be displayed on it and finish the setup. +When you restart Home Assistant, make sure the TV is turned on and connected to your local network. If your TV needs to be paired, you'll need to go to **Settings > Devices & services** to type the PIN code that will be displayed on it and finish the setup. ### Example `turn_on_action` @@ -110,7 +110,7 @@ script: ### Remote -When the integration is configured, two entities will be created: a `media_player` and a `remote`. The remote allows you to send key commands to your TV with the `remote.send_command` service. +When the integration is configured, two entities will be created: a `media_player` and a `remote`. The remote allows you to send key commands to your TV with the `remote.send_command` action. Some of the known valid key values are: diff --git a/source/_integrations/pandora.markdown b/source/_integrations/pandora.markdown index afff323f618b..6c20dae36be4 100644 --- a/source/_integrations/pandora.markdown +++ b/source/_integrations/pandora.markdown @@ -16,9 +16,9 @@ related: If you have a Pandora account, you can control it from Home Assistant with this media player. -<div class='note'> +{% important %} This integration is only available on Home Assistant Core installation types. Unfortunately, it cannot be used with Home Assistant OS, Supervised or Container. -</div> +{% endimportant %} ### Installation of Pianobar diff --git a/source/_integrations/panel_custom.markdown b/source/_integrations/panel_custom.markdown index dd83cc955644..94dc7967bfed 100644 --- a/source/_integrations/panel_custom.markdown +++ b/source/_integrations/panel_custom.markdown @@ -31,11 +31,9 @@ panel_custom: who: world ``` -<div class='note'> - +{% tip %} Store your custom panels in `<config>/www` to make them available in the frontend at the path `/local`. - -</div> +{% endtip %} {% configuration %} name: diff --git a/source/_integrations/peco.markdown b/source/_integrations/peco.markdown index e8483457470c..649d44a98770 100644 --- a/source/_integrations/peco.markdown +++ b/source/_integrations/peco.markdown @@ -19,15 +19,11 @@ PECO is a public utility company that provides electricity to the Philadelphia m To learn more about PECO, visit [**their about page**](https://www.peco.com/AboutUs/Pages/Default.aspx). -<div class='note'> - +{% note %} This integration is only for PECO customers. To see if your county is supported, take a look at [**their outage map**](https://www.peco.com/Outages/CheckOutageStatus/Pages/OutageMap.aspx). - - PECO Is a registered trademark of Exelon Business Services Co., LLC - -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/persistent_notification.markdown b/source/_integrations/persistent_notification.markdown index 9f4bf3f312eb..4fa186ea227f 100644 --- a/source/_integrations/persistent_notification.markdown +++ b/source/_integrations/persistent_notification.markdown @@ -43,11 +43,11 @@ automation: See [Automation Trigger Variables: Persistent Notification](/docs/automation/templating/#persistent-notification) for additional trigger data available for conditions or actions. -### Service +### Action -The service `persistent_notification.create` takes in `message`, `title`, and `notification_id`. +The `persistent_notification.create` action takes in `message`, `title`, and `notification_id`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `message` | no | Body of the notification. Accepts [templates](/docs/configuration/templating/). | `title` | yes | Title of the notification. Accepts [templates](/docs/configuration/templating/). @@ -78,13 +78,13 @@ action: {% endraw %} -The service `persistent_notification.dismiss` requires a `notification_id`. +The `persistent_notification.dismiss` action requires a `notification_id`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `notification_id` | no | the `notification_id` is required to identify the notification that should be removed. -This service allows you to remove a notifications by script or automation. +This action allows you to remove a notifications by script or automation. ```yaml action: @@ -93,7 +93,7 @@ action: notification_id: "1234" ``` -The service `persistent_notification.dismiss_all` allows you to remove all notifications. +The `persistent_notification.dismiss_all` action allows you to remove all notifications. ```yaml action: @@ -114,15 +114,13 @@ The message attribute supports the [Markdown formatting syntax](https://daringfi | Link | `[Link](https://home-assistant.io/)` | | Image | `![image](/local/my_image.jpg)` | -<div class="note"> - - `/local/` in this context refers to the `.homeassistant/www/` folder. - -</div> +{% note %} +`/local/` in this context refers to the `.homeassistant/www/` folder. +{% endnote %} ### Create a persistent notification -Choose the **{% my developer_services title="Services" %}** tab from the **Developer Tools** sidebar item, then select the {% my developer_services service="persistent_notification.create" title="`persistent_notification.create`" %} service from the "Service" dropdown. Enter something like the sample below into the **Service Data** field and press the **CALL SERVICE** button. +Choose the **{% my developer_services title="Actions" %}** tab from the **Developer Tools** sidebar item, then select the {% my developer_services service="persistent_notification.create" title="`persistent_notification.create`" %} action from the **Action** dropdown. Enter something like the sample below into the **data** field and press the **Perform action** button. ```json { @@ -139,6 +137,6 @@ Persistent notifications can also be used as a pre-configured notifier for the [ The following attributes can be placed inside `data` for extended functionality. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `notification_id` | yes | If `notification_id` is given, it will overwrite the notification if there already was a notification with that ID. | diff --git a/source/_integrations/person.markdown b/source/_integrations/person.markdown index ac2de5440e1a..f7b350b1810d 100644 --- a/source/_integrations/person.markdown +++ b/source/_integrations/person.markdown @@ -89,7 +89,7 @@ person: - device_tracker.beacon ``` -If you change the YAML, you can reload it by calling the `person.reload` service. +If you change the YAML, you can reload it by calling the `person.reload` action. ### Customizing the picture for a person diff --git a/source/_integrations/philips_js.markdown b/source/_integrations/philips_js.markdown index 6aa7f42be687..96711f088f13 100644 --- a/source/_integrations/philips_js.markdown +++ b/source/_integrations/philips_js.markdown @@ -59,7 +59,7 @@ The Philips TV does not always support turning on via the API. You can either tu ### Remote -The integration provides a remote entity for sending remote key presses directly to the TV. The following list of commands are available for use with the `remote.send_command` service. +The integration provides a remote entity for sending remote key presses directly to the TV. The following list of commands are available for use with the `remote.send_command` action. | Command | Comment | | ---------------- | ----------------------------------------- | diff --git a/source/_integrations/pi_hole.markdown b/source/_integrations/pi_hole.markdown index cb1e27b6ef6d..5c9d5323c614 100644 --- a/source/_integrations/pi_hole.markdown +++ b/source/_integrations/pi_hole.markdown @@ -39,23 +39,23 @@ The combined host, port and location should take you to the login page of Pi-Hol If your Pi-hole web interface is password protected, an API key will be requested by Home Assistant after submitting the initial details above. You can get the API key by logging into your Pi-Hole and going to _from Settings > API_ and then the **Show API token** button. -## Services +## Actions -The platform provides the following services to interact with your Pi-hole. Use switch entities when calling the services. +The platform provides the following actions to interact with your Pi-hole. Use switch entities when calling the actions. -### Service `pi_hole.disable` +### Action `pi_hole.disable` Disables configured Pi-hole(s) for the specified amount of time. -| Service data attribute | Required | Type | Description | +| Data attribute | Required | Type | Description | | ---------------------- | -------- | -------- | ----------- | | `entity_id` | `False` | string | Target switch entity. Use `all` to target all Pi-hole services | | `duration` | `True` | timedelta | Time for which Pi-hole should be disabled | -Example service call: +Example action: ```yaml -# Example service call to disable Pi-Hole for 30 minutes +# Example action to disable Pi-Hole for 30 minutes service: pi_hole.disable data: duration: '00:30' diff --git a/source/_integrations/picnic.markdown b/source/_integrations/picnic.markdown index dd9c65f24718..f0958a1fe730 100644 --- a/source/_integrations/picnic.markdown +++ b/source/_integrations/picnic.markdown @@ -47,17 +47,17 @@ This integration provides the following sensors. Some sensors are disabled by de This integration provides a list containing the content of your shopping cart. This list is provided as a [to-do list](/integrations/todo/) and can also be found in the to-do list dashboard in the main sidebar of your Home Assistant instance. -You can add products to your shopping cart by entering a name in the **Add item** field. Just like with the [`picnic.add_product`](#service-picnicadd_product) service, a search will be done and the first item found will be added. +You can add products to your shopping cart by entering a name in the **Add item** field. Just like with the [`picnic.add_product`](#action-picnicadd_product) action, a search will be done and the first item found will be added. -## Services +## Actions -### Service `picnic.add_product` +### Action `picnic.add_product` -Add a product to your cart using the `picnic.add_product` service, either using a product ID or a product name. +Add a product to your cart using the `picnic.add_product` action, either using a product ID or a product name. A search will be done and the first result will be added to the cart when one adds a product using a product name. -The service call will fail when no product can be found, or when no `product_id` or `product_name` is specified. +The action will fail when no product can be found, or when no `product_id` or `product_name` is specified. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|----------------------------------------------------------------------------------| | `config_entry_id` | No | The Id of the Picnic service config entry. | | `product_id` | yes | The Picnic product ID. | diff --git a/source/_integrations/pilight.markdown b/source/_integrations/pilight.markdown index 948ccc27b04f..3fb287d2cd49 100644 --- a/source/_integrations/pilight.markdown +++ b/source/_integrations/pilight.markdown @@ -26,7 +26,7 @@ related: This pilight hub connects to the [pilight-daemon](https://manual.pilight.org/programs/daemon.html) via a socket connection to receive and send codes. Thus Home Assistant does not have to run on the computer in charge of the RF communication. -The received and supported RF codes are put on the event bus of Home Assistant and are therefore directly usable by other integrations (e.g., automation). Additionally a send service is provided to send RF codes. +The received and supported RF codes are put on the event bus of Home Assistant and are therefore directly usable by other integrations (e.g., automation). Additionally a send action is provided to send RF codes. There is currently support for the following device types within Home Assistant: diff --git a/source/_integrations/ping.markdown b/source/_integrations/ping.markdown index 741931d29cc6..2bbd6fb8e453 100644 --- a/source/_integrations/ping.markdown +++ b/source/_integrations/ping.markdown @@ -41,7 +41,7 @@ For more detailed steps on how to define a custom interval, follow the procedure ## Integration options It is possible to change some behaviors through the integration options. -To change the settings, go to {% my integrations title="**Settings** > **Devices & Services**" %}. Select the **Ping** integration, then select **Configure**. +To change the settings, go to {% my integrations title="**Settings** > **Devices & services**" %}. Select the **Ping** integration, then select **Configure**. - **Ping count**: Number of echo requests to send to the target. The default is 5. - **Consider home**: Number of seconds that must elapse before considering a disconnected device "not at home". The default is 180 seconds (3 minutes). @@ -62,9 +62,9 @@ The integration exposes the different round trip times milliseconds as entities: **These entities are disabled by default and can be enabled in the UI if needed.** -<div class='note'> +{% note %} When run on Windows systems, the round trip time attributes are rounded to the nearest millisecond and the mdev value is unavailable. -</div> +{% endnote %} ## Presence detection @@ -72,8 +72,8 @@ The `ping` device tracker platform offers presence detection by using `ping` to The device tracker is disabled by default and can be enabled in the UI. -<div class='note'> - Please keep in mind that modern smart phones will usually turn off WiFi when they are idle. Simple trackers like this may not be reliable on their own. -</div> +{% note %} +Please keep in mind that modern smart phones will usually turn off WiFi when they are idle. Simple trackers like this may not be reliable on their own. +{% endnote %} See the [person integration page](/integrations/person/) for instructions on how to configure the people to be tracked. diff --git a/source/_integrations/plex.markdown b/source/_integrations/plex.markdown index 42404f73b92d..4571e2c6feb3 100644 --- a/source/_integrations/plex.markdown +++ b/source/_integrations/plex.markdown @@ -96,15 +96,13 @@ action: message: "{{ trigger.to_state.attributes.last_added_item }}" ``` -<div class='note info'> - +{% important %} The library sensors are disabled by default, but can be enabled via the Plex integration page. - -</div> +{% endimportant %} ## Button -A `button.scan_clients` entity is available to discover new controllable Plex clients. This may be necessary in scripts or automations which control a Plex client app, but where the underlying device must be turned on first. This button is preferred over the legacy `plex.scan_for_clients` service. +A `button.scan_clients` entity is available to discover new controllable Plex clients. This may be necessary in scripts or automations which control a Plex client app, but where the underlying device must be turned on first. This button is preferred over the legacy `plex.scan_for_clients` action. Example script: @@ -152,7 +150,7 @@ The Plex media player platform will create media player entities for each connec By default, the Plex integration will create media player entities for all local, managed, and shared users on the Plex server. To customize which users or client types to monitor, adjust the "*Monitored users*", "*Ignore new managed/shared users*", and "*Ignore Plex Web clients*" options described under [Integration Options](#integration-options). -### Service `media_player.play_media` +### Action `media_player.play_media` Play media hosted on a Plex server on a Plex client or other supported device. @@ -165,24 +163,20 @@ Required fields within the `media_content_id` payloads are marked as such, other Simplified examples are provided for [music](#music), [TV episodes](#tv-episode), and [movies](#movie). See [advanced searches](#advanced-searches) for complex/smart search capabilities. -<div class='note info'> - +{% note %} Refer to these links if casting to non-Plex players: - [Chromecast](/integrations/cast/#plex) - [Sonos](/integrations/plex#sonos-playback) - -</div> - -<div class='note warning'> +{% endnote %} +{% important %} The integration must be configured with a token for playback commands to work. This can occur if using the `List of IP addresses and networks that are allowed without auth` option on the Plex server. If that feature is required, it's recommended to configure the integration with that feature temporarily disabled. - -</div> +{% endimportant %} #### Music -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `entity_id` | `entity_id` of the client | | `media_content_id` | Quoted JSON containing:<br/><ul><li>`library_name` (Required)</li><li>`artist_name` or `artist.title`</li><li>`album_name` or `album.title`</li><li>`track_name` or `track.title`</li><li>`track_number` or `track.index`</li><li>`shuffle` (0 or 1)</li><li>`allow_multiple` (0 or 1)</li></ul> | @@ -208,7 +202,7 @@ media_content_id: '{ "library_name": "Music", "artist_name": "Stevie Wonder", "s #### Playlist -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | --------------------------------------------------------------------------------------------------- | | `entity_id` | `entity_id` of the client | | `media_content_id` | Quoted JSON containing:<br/><ul><li>`playlist_name` (Required)</li><li>`shuffle` (0 or 1)</li></ul> | @@ -226,7 +220,7 @@ media_content_id: '{ "playlist_name": "The Best of Disco", "shuffle": "1" }' #### TV episode -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | `entity_id` of the client | | `media_content_id` | Quoted JSON containing:<br/><ul><li>`library_name` (Required)</li><li>`show_name` or `show.title`</li><li>`season_number` or `season.index`</li><li>`episode_number` or `episode.index`</li><li>`shuffle` (0 or 1)</li><li>`resume` (0 or 1)</li><li>`offset` (in seconds)</li><li>`allow_multiple` (0 or 1)</li></ul> | @@ -260,7 +254,7 @@ media_content_id: '{ "library_name": "News TV", "show_name": "60 Minutes", "epis #### Movie -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | `entity_id` of the client | | `media_content_id` | Quoted JSON containing:<br/><ul><li>`library_name` (Required)</li><li>`title`</li><li>`resume` (0 or 1)</li><li>`offset` (in seconds)</li></ul> | @@ -352,7 +346,7 @@ To play Plex music directly to Sonos speakers, the following requirements must b 2. Sonos speakers linked to your Plex account [(Instructions)](https://support.plex.tv/articles/control-sonos-playback-with-a-plex-app/). 3. [Sonos](/integrations/sonos/) integration configured. -Call the `media_player.play_media` service with the `entity_id` of a Sonos integration device and `media_content_type` prepended with `plex://`. Both [music](#music) and [playlist](#playlist) `media_content_type` values are supported. +Call the `media_player.play_media` action with the `entity_id` of a Sonos integration device and `media_content_type` prepended with `plex://`. Both [music](#music) and [playlist](#playlist) `media_content_type` values are supported. ### Examples: @@ -372,13 +366,13 @@ media_content_type: playlist media_content_id: 'plex://{ "playlist_name": "Party Mix" }' ``` -## Additional services +## Additional actions -### Service `plex.refresh_library` +### Action `plex.refresh_library` Refresh a Plex library to scan for new and updated media. -| Service data attribute | Required | Description | Example | +| Data attribute | Required | Description | Example | | ---------------------- | -------- | ---------------------------------------------------------- | ---------------- | | `server_name` | No | Name of Plex server to use if multiple servers configured. | "My Plex Server" | | `library_name` | Yes | Name of Plex library to update. | "TV Shows" | @@ -386,5 +380,5 @@ Refresh a Plex library to scan for new and updated media. ## Notes -- The Plex integration supports multiple Plex servers. Additional connections can be configured under **Settings** -> **Devices & Services**. +- The Plex integration supports multiple Plex servers. Additional connections can be configured under **Settings** -> **Devices & services**. - Movies must be located under the 'Movies' section in a Plex library to properly view the 'playing' state. diff --git a/source/_integrations/plugwise.markdown b/source/_integrations/plugwise.markdown index 2806419855e4..a6668359ca03 100644 --- a/source/_integrations/plugwise.markdown +++ b/source/_integrations/plugwise.markdown @@ -3,6 +3,7 @@ title: Plugwise description: Plugwise Smile platform integration. ha_category: - Binary sensor + - Button - Climate - Number - Select @@ -19,6 +20,7 @@ ha_domain: plugwise ha_zeroconf: true ha_platforms: - binary_sensor + - button - climate - diagnostics - number @@ -34,6 +36,7 @@ The platform supports [Anna](https://www.plugwise.com/en_US/products/anna), [Ada Platforms available - depending on your Smile and setup include: - `climate` (for the Anna, Jip and Lisa products, or a single Tom) + - `button` (for the Adam and the non-legacy Anna and P1 gateways) - `sensor` (for all relevant products including the Smile P1) - `binary_sensor` (for showing the status of e.g. domestic hot water heating or secondary heater) - `switch` (for Plugs connected to Adam, or Circles and Stealths connected to a Stretch) @@ -66,11 +69,11 @@ For a thermostat, the active schedule can be deactivated or reactivated via the Auto means the schedule is active, Heat means it's not active. The active thermostat schedule can be changed via the connected thermostat select-entity. Please note: that only schedules that have two or more schedule points will be shown as select options. -### Services +### Actions #### Update Smile data -Forced update of data from your Smile can be triggered by calling the generic `homeassistant.update_entity` service with your Smile entity as the target. +Forced update of data from your Smile can be triggered by calling the generic `homeassistant.update_entity` action with your Smile entity as the target. ```yaml # Example script change the temperature @@ -82,6 +85,20 @@ script: entity_id: climate.anna ``` +#### Reboot the Plugwise gateway + +Service: `button.press` + +```yaml +# Example script change the thermostat schedule +script: + reboot_gateway: + sequence: + - service: button.press + target: + entity_id: button.adam_reboot +``` + #### Set HVAC mode Service: `climate.set_hvac_mode` @@ -116,7 +133,7 @@ script: Service: `climate.turn_off`, `climate.turn_on` (Adam only) -These services will switch the Adam regulation mode (= HVAC system mode) to off or on, affecting the operation of all connected thermostats. +These actions will switch the Adam regulation mode (= HVAC system mode) to off or on, affecting the operation of all connected thermostats. `climate.turn_on` will activate the previously selected heating or cooling mode. Example: diff --git a/source/_integrations/point.markdown b/source/_integrations/point.markdown index 6aeb4b2aeb58..87f610ac7534 100644 --- a/source/_integrations/point.markdown +++ b/source/_integrations/point.markdown @@ -63,21 +63,17 @@ The integration supports the following device types within Home Assistant: - [Binary sensor](#binary-sensor) - [Sensor](#sensor) -<div class='note'> - +{% note %} The Point is just active occasionally so the [sensors](#sensor) are only updated every hour or so. The [binary sensors](#binary-sensor) are however updated via [Cloud Push](/blog/2016/02/12/classifying-the-internet-of-things/#cloud-pushing-new-state), making the changes close to instant. - -</div> +{% endnote %} ## Alarm Each home configured in the Point mobile application will show up as a separate alarm control panel. The panels allow **arming** and **disarming** of the Point home alarm system. -<div class="note"> - +{% note %} The Point only supports a Arm/Disarm action, so it is only `Arm Away` that is implemented. - -</div> +{% endnote %} ## Binary sensor @@ -99,11 +95,9 @@ Each Point exposes the following binary sensors: - **tamper**: `On` means the point was removed, `Off` means normal - **tamper_old**: `On` means the point was removed or attached, `Off` means normal (this is only supported on some "old" devices) -<div class="note"> - +{% note %} The binary sensors **button_press**, **sound** and **tamper** are switched `On` for a brief moment and are then switched back to `Off`. - -</div> +{% endnote %} ### Automation example diff --git a/source/_integrations/profiler.markdown b/source/_integrations/profiler.markdown index cdad5ac398a1..254b203f7335 100644 --- a/source/_integrations/profiler.markdown +++ b/source/_integrations/profiler.markdown @@ -16,13 +16,13 @@ The Profiler integration provides a profile which is a set of statistics that id {% include integrations/config_flow.md %} -### Service profiler.start +### Action profiler.start {% my developer_call_service badge service="profiler.start" %} Start the profiler for the specified number of seconds. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------- | | `seconds` | yes | The number of seconds to run the profile. Defaults to 60.0 | @@ -53,13 +53,13 @@ dot callgrind.dot -Tpng -o callgrind.png gprof2dot -f pstats profile.1234567890123456.cprof | dot -Tsvg -o profile.svg ``` -### Service profiler.memory +### Action profiler.memory {% my developer_call_service badge service="profiler.memory" %} Start the memory profiler for the specified number of seconds. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------- | | `seconds` | yes | The number of seconds to run the profile. Defaults to 60.0 | @@ -73,58 +73,58 @@ from guppy import hpy hpy().pb() ``` -### Service profiler.start_log_objects +### Action profiler.start_log_objects {% my developer_call_service badge service="profiler.start_log_objects" %} Start logging the growth of objects in memory. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------- | | `scan_interval` | yes | The the frequency between logging objects. Defaults to 30.0 | -Periodically log the growth of new objects in memory. This service's primary use case is finding memory leaks. This service can be run for long periods to find slow leaks. For finding fast leaks, `profiler.start_log_object_sources` is preferred; however, it is much more CPU intensive. +Periodically log the growth of new objects in memory. This action's primary use case is finding memory leaks. This action can be run for long periods to find slow leaks. For finding fast leaks, `profiler.start_log_object_sources` is preferred; however, it is much more CPU intensive. See the [corresponding documentation for `growth()`](https://mg.pov.lt/objgraph/objgraph.html#objgraph.growth) regarding the format in which this data is logged. -### Service profiler.stop_log_objects +### Action profiler.stop_log_objects {% my developer_call_service badge service="profiler.stop_log_objects" %} Stop logging the growth of objects in memory. -### Service profiler.start_log_object_sources +### Action profiler.start_log_object_sources {% my developer_call_service badge service="profiler.start_log_object_sources" %} Start logging the growth of objects in memory and attempt to find the source of the new objects. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------- | | `scan_interval` | yes | The the frequency between logging objects. Defaults to 30.0 | | `max_objects` | yes | The number of new objects to examine for source information. Defaults to 5 | -Periodically log the growth of new objects in memory. This service's primary use case is finding memory leaks. +Periodically log the growth of new objects in memory. This actions's primary use case is finding memory leaks. -This service is similar to `start_log_objects` except that it is much more CPU intensive since it will attempt to locate the source of each new object up to `max_objects` each time it logs. +This action is similar to `start_log_objects` except that it is much more CPU intensive since it will attempt to locate the source of each new object up to `max_objects` each time it logs. -### Service profiler.stop_log_object_sources +### Action profiler.stop_log_object_sources {% my developer_call_service badge service="profiler.stop_log_object_sources" %} Stop logging the growth of objects with sources in memory. -### Service profiler.dump_log_objects +### Action profiler.dump_log_objects {% my developer_call_service badge service="profiler.dump_log_objects" %} -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------- | | `type` | no | The type of object to dump to the log. | -When `start_log_objects` highlights the growth of a collection of objects in memory, this service can help investigate. The `repr` of each object that matches `type` will be logged. +When `start_log_objects` highlights the growth of a collection of objects in memory, this action can help investigate. The `repr` of each object that matches `type` will be logged. -This service is useful for investigating the state of objects in memory. For example, if your system has templates that are rendering too frequently, the below example service calls shows how to find which templates are the source of the problem: +This action is useful for investigating the state of objects in memory. For example, if your system has templates that are rendering too frequently, the below example actions shows how to find which templates are the source of the problem: ```yaml service: profiler.dump_log_objects @@ -137,11 +137,11 @@ data: type: Template ``` -### Service profiler.log_thread_frames +### Action profiler.log_thread_frames {% my developer_call_service badge service="profiler.log_thread_frames" %} -To help discover run away threads, why the executor is overloaded, or other threading problems, the current frames for each running thread will be logged when this service is called. +To help discover run away threads, why the executor is overloaded, or other threading problems, the current frames for each running thread will be logged when this action is performed. An example is below: @@ -174,7 +174,7 @@ An example is below: sock.connect(address) ``` -### Service profiler.log_event_loop_scheduled +### Action profiler.log_event_loop_scheduled {% my developer_call_service badge service="profiler.log_event_loop_scheduled" %} @@ -184,27 +184,27 @@ Each upcoming scheduled item is logged similar to the below example: `[homeassistant.components.profiler] Scheduled: <TimerHandle when=1528307.1818668307 async_track_point_in_utc_time.<locals>.run_action(<Job HassJobType.Coroutinefunction <bound method DataUpdateCoordinator._handle_refresh_interval of <homeassistant.components.screenlogic.ScreenlogicDataUpdateCoordinator object at 0x7f985d896d30>>>) at /usr/src/homeassistant/homeassistant/helpers/event.py:1175>` -### Service profiler.lru_stats +### Action profiler.lru_stats {% my developer_call_service badge service="profiler.lru_stats" %} Logs statistics from [lru_cache](https://docs.python.org/3/library/functools.html#functools.lru_cache) and [lru-dict](https://pypi.org/project/lru-dict/) to help tune Home Assistant and locate memory leaks. -### Service profiler.set_asyncio_debug +### Action profiler.set_asyncio_debug {% my developer_call_service badge service="profiler.set_asyncio_debug" %} -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------- | | `enabled` | yes | Boolean to enable asyncio debug. | When `set_asyncio_debug` is enabled, `asyncio` will run in [debug mode](https://docs.python.org/3/library/asyncio-dev.html#debug-mode). Use this service to help identify an integration that is blocking the event loop. -### Service profiler.log_current_tasks +### Action profiler.log_current_tasks {% my developer_call_service badge service="profiler.log_current_tasks" %} -This service can help track down task leaks, or find tasks that are delaying startup. +This action can help track down task leaks, or find tasks that are delaying startup. An example is below: diff --git a/source/_integrations/prometheus.markdown b/source/_integrations/prometheus.markdown index cff2bb947ba4..d4c88d886554 100644 --- a/source/_integrations/prometheus.markdown +++ b/source/_integrations/prometheus.markdown @@ -204,3 +204,9 @@ For example: - record: "known_temperature_c" expr: "temperature_c unless entity_available == 0" ``` + +## Supported metrics + +Metrics are exported only for the following domains: + +`automation`, `binary_sensor`, `climate`, `cover`, `counter`, `device_tracker`, `fan`, `humidifier`, `input_boolean`, `input_number`, `light`, `lock`, `number`, `person`, `sensor`, `update`, `switch` diff --git a/source/_integrations/prosegur.markdown b/source/_integrations/prosegur.markdown index 850c06e49303..e1ba3e6fa167 100644 --- a/source/_integrations/prosegur.markdown +++ b/source/_integrations/prosegur.markdown @@ -29,6 +29,6 @@ There is currently support for the following device types within Home Assistant: {% include integrations/config_flow.md %} -### Service `camera.request_image` +### Action `camera.request_image` -This service will have Prosegur cloud service "Request image" from your local camera. This service should only be called seldom, as Prosegur tends to throttle this service for long periods of time, resulting in errors for both this integration and your Prosegur mobile application. +This action will have Prosegur cloud service "Request image" from your local camera. This action should only be called seldom, as Prosegur tends to throttle this action for long periods of time, resulting in errors for both this integration and your Prosegur mobile application. diff --git a/source/_integrations/prowl.markdown b/source/_integrations/prowl.markdown index fb3ea5b42812..0bf3550ab769 100644 --- a/source/_integrations/prowl.markdown +++ b/source/_integrations/prowl.markdown @@ -31,7 +31,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string @@ -41,11 +41,11 @@ api_key: type: string {% endconfiguration %} -### Prowl service data +### Prowl action data The following attributes can be placed `data` for extended functionality. -| Service data attribute | Optional | Default | Description | +| Data attribute | Optional | Default | Description | | ---------------------- | -------- | ------- | --------------------------------------------------------------------------------------------------------------- | | `priority` | yes | 0 | Priority level, for more info refer to the [Prowl API documentation](https://www.prowlapp.com/api.php#add). | | `url` | yes | n/a | URL to be attached, for more info refer to the [Prowl API documentation](https://www.prowlapp.com/api.php#add). | diff --git a/source/_integrations/proximity.markdown b/source/_integrations/proximity.markdown index 8bb23da47ff8..169676606646 100644 --- a/source/_integrations/proximity.markdown +++ b/source/_integrations/proximity.markdown @@ -28,9 +28,9 @@ Some examples of its use include: {% include integrations/config_flow.md %} -<div class="note"> +{% note %} When adding the **Proximity** integration, you are prompted to define the **Tolerance distance**. The tolerance distance is used to calculate the direction of travel in meters (m) to filter out small GPS coordinate changes. -</div> +{% endnote %} ## Sensors @@ -50,9 +50,9 @@ For each tracked device or person, a sensor is created showing the direction of - `towards` - `unknown` -<div class="note"> +{% important %} To calculate the distance and the direction of travel for a tracked device or person, they must specify a geo-location. -</div> +{% endimportant %} ### Nearest device diff --git a/source/_integrations/proxmoxve.markdown b/source/_integrations/proxmoxve.markdown index d1297d36f8c1..e32646a79889 100644 --- a/source/_integrations/proxmoxve.markdown +++ b/source/_integrations/proxmoxve.markdown @@ -23,9 +23,9 @@ After configuring this {% term integration %}, the binary sensors automatically ## Configuration -<div class='note'> +{% important %} You should have at least one VM or container entry configured, else this integration won't do anything. -</div> +{% endimportant %} To use the `proxmoxve` {% term integration %}, add the following configuration to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/ps4.markdown b/source/_integrations/ps4.markdown index 802fdba083b8..e2a9d5a6c0fb 100644 --- a/source/_integrations/ps4.markdown +++ b/source/_integrations/ps4.markdown @@ -26,17 +26,17 @@ The `ps4` integration allows you to control a 1. Download the Second Screen App and make sure that you can find and control your PlayStation 4 normally. -<div class='note'> - Read the section "Granting Port Access" below before continuing. -</div> +{% important %} +Read the section "Granting Port Access" below before continuing. +{% endimportant %} -2. Navigate to `Settings -> Integrations` and press the plus button in the bottom right corner. Select `PlayStation 4` from the list of integrations. +1. Navigate to `Settings -> Integrations` and press the plus button in the bottom right corner. Select `PlayStation 4` from the list of integrations. -3. Follow instructions displayed to generate user credentials. You will know this step is completed when a form with fields appears. +2. Follow instructions displayed to generate user credentials. You will know this step is completed when a form with fields appears. -4. On the PS4, go to Settings / Mobile App Connection Settings / Add Device, a PIN will be displayed. +3. On the PS4, go to Settings / Mobile App Connection Settings / Add Device, a PIN will be displayed. -5. Pair Home Assistant to your PlayStation 4 by filling in the fields using the PIN from the above step. +4. Pair Home Assistant to your PlayStation 4 by filling in the fields using the PIN from the above step. - **Note:** To find your correct region refer to the section [Regions](#regions) @@ -44,17 +44,15 @@ The `ps4` integration allows you to control a The PlayStation 4 integration requires the use of privileged ports during configuration to work correctly, specifically UDP port 987 and TCP port 997. Depending on your OS of your Home Assistant instance, you may need to allow usage of privileged ports manually. -<div class='note warning'> - Do not run your <b>Home Assistant Core</b> instance itself as <b>root</b> or with <b>root/sudo privileges</b> to accomplish this. This would create a security risk for your host system. -</div> +{% warning %} +Do not run your <b>Home Assistant Core</b> instance itself as <b>root</b> or with <b>root/sudo privileges</b> to accomplish this. This would create a security risk for your host system. +{% endwarning %} There are varying methods to perform this, dependent on your OS that is running Home Assistant. Specifically, your *Python Interpreter*, which runs your Home Assistant instance, needs access to the mentioned ports. -<div class='note'> - +{% note %} Additional configuration is only required for Home Assistant Core users **not** running on Docker. - -</div> +{% endnote %} ### Debian-based @@ -114,20 +112,18 @@ When running Home Assistant using Docker, make sure that the Home Assistant cont ## Configuration -<div class='note'> - - The PlayStation 4 integration does not use entries from `configuration.yaml`. You must configure this integration by using `Integrations` - -</div> +{% note %} +The PlayStation 4 integration does not use entries from `configuration.yaml`. You must configure this integration by using `Integrations` +{% endnote %} ## Regions Some titles will have different SKUs in the PlayStation Store database, depending on your [region](https://www.playstation.com/country-selector/index.html). You must select your specific region in the setup in order to retrieve the cover art for such titles correctly. The integration will attempt to search other databases for the correct title if it cannot be found. -<div class='note'> - The following regions have no database and can not be used by the integration: - China, Philippines, Serbia, Vietnam. -</div> +{% important %} +The following regions have no database and can not be used by the integration: +China, Philippines, Serbia, Vietnam. +{% endimportant %} ## Media Data @@ -170,28 +166,29 @@ Each entry will begin with the SKU ID of the title, e.g., `CUSA00000` and will h The `media_image_url` value can be any valid URL. This includes the `local directory` of your Home Assistant instance. The first entry in the example directs to a file named `image.jpg` located in the `config/www/` directory. ### Editing with Text Editor -<div class='note'> - Backup a copy of your <b>.ps4-games.json</b> file before continuing. If there are errors in the formatting, your file may be deleted. -</div> + +{% warning %} +Backup a copy of your `.ps4-games.json` file before continuing. If there are errors in the formatting, your file may be deleted. +{% endwarning %} To edit, simply open the file in a text editor, find the game or app you would like to edit, and edit the value(s) you wish to change and then save the file. The changes will appear the next time you play the game or app on your console. -## Services +## Actions -### Service `select_source` +### Action `select_source` Opens new application/game and closes currently running application/game. The game/app must be in the entity's source list. Games will be added automatically when you open them normally. -| Service data attribute | Optional | Example | Description | +| Data attribute | Optional | Example | Description | | ---------------------- | -------- | -------------------------- | ----------------------------------------------------------------------------------------------------------- | | `entity_id` | No | `media_player.ps4` | The entity id for your PlayStation 4. | | `source` | No | `Some Game` or `CUSA00123` | The game/app you want to open. You can use the title or SKU ID. Using the SKU ID will be the most reliable. | -### Service `send_command` +### Action `send_command` Emulate button press on PlayStation 4. This emulates the commands available for the PS4 Second Screen App. This is not to be confused with DualShock 4 controller buttons. -| Service data attribute | Optional | Example | Description | +| Data attribute | Optional | Example | Description | | ---------------------- | -------- | ------------------ | ------------------------------------- | | `entity_id` | No | `media_player.ps4` | The entity id for your PlayStation 4. | | `command` | No | `ps` | The command you want to send. | diff --git a/source/_integrations/pulseaudio_loopback.markdown b/source/_integrations/pulseaudio_loopback.markdown index d69007cf9c44..e897cd075640 100644 --- a/source/_integrations/pulseaudio_loopback.markdown +++ b/source/_integrations/pulseaudio_loopback.markdown @@ -57,8 +57,6 @@ port: type: integer {% endconfiguration %} -<div class='note warning'> - +{% important %} This integration relies on raw TCP commands to PulseAudio. In order for PulseAudio to accept commands with this integration, `module-native-protocol-tcp auth-ip-acl=<homeassistant ip>` must be loaded on the PulseAudio server. - -</div> +{% endimportant %} diff --git a/source/_integrations/pure_energie.markdown b/source/_integrations/pure_energie.markdown index 7dd273c1a35f..8b4460b632b3 100644 --- a/source/_integrations/pure_energie.markdown +++ b/source/_integrations/pure_energie.markdown @@ -24,11 +24,11 @@ The Pure Energie meter is a product that allows you to read the data from your smart meter via the serial port (P1), such as your energy consumption and power flow. -<div class='note'> +{% note %} The product of Pure Energie is a white label product of Net2Grid, other white label products may be found by zeroconf and work with this integration. -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/purpleair.markdown b/source/_integrations/purpleair.markdown index b68ff6682b40..459e818e8229 100644 --- a/source/_integrations/purpleair.markdown +++ b/source/_integrations/purpleair.markdown @@ -52,11 +52,11 @@ The PurpleAir API does not provide AQI data; therefore, the integration does not an AQI sensor automatically. However, sensors providing raw particulate data can be used to create a human-friendly AQI rating sensor. -<div class='note warning'> +{% warning %} The guidelines within this documentation constitute estimates and are intended to help informed decision making. They should not replace analysis, advice or diagnosis from a trained medical professional. -</div> +{% endwarning %} ### Understanding EPA Guidelines @@ -75,10 +75,10 @@ With the EPA guidelines in hand, the next step is to create [`statistics`](/integrations/statistics/) sensors for each particulate sensor you are interested. This example uses PM2.5 and PM10.0 over a 24-hour period: -<div class='note info'> +{% note %} The entity IDs provided below are simulated; make sure that you use entity IDs that actually exist in your Home Assistant instance. -</div> +{% endnote %} ```yaml sensor: @@ -103,10 +103,10 @@ The [`statistics`](/integrations/statistics/) sensors can then be combined into sensor. Note that this example takes a conservative approach: the "worse" of the two values (PM2.5 or PM10.0) is used to determine the overall rating. -<div class='note info'> +{% tip %} Reminder that the breakpoints used below can be determined from the aforementioned EPA guidelines. -</div> +{% endtip %} {% raw %} diff --git a/source/_integrations/pushbullet.markdown b/source/_integrations/pushbullet.markdown index 97339a83a2ef..3c2ed5c739ce 100644 --- a/source/_integrations/pushbullet.markdown +++ b/source/_integrations/pushbullet.markdown @@ -21,11 +21,9 @@ There is currently support for the following device types within Home Assistant: - [Sensor](#sensors) - [Notifications](#notifications) -<div class='note'> - +{% note %} The free tier is [limited](https://docs.pushbullet.com/#push-limit) to 500 pushes per month. - -</div> +{% endnote %} ## Prerequisites @@ -58,7 +56,7 @@ The Pushbullet notification platform sends messages to [Pushbullet](https://www. ### Usage -Pushbullet is a notify platform and thus can be controlled by calling the notify service [as described here](/integrations/notify/). It will send a notification to all devices registered in the Pushbullet account. An optional **target** parameter can be given to Pushbullet to specify specific account's devices, contacts or channels. +Pushbullet is a notify platform and thus can be controlled by calling the notify action [as described here](/integrations/notify/). It will send a notification to all devices registered in the Pushbullet account. An optional **target** parameter can be given to Pushbullet to specify specific account's devices, contacts or channels. | Type | Prefix | Suffix | Example | | ------- | ---------- | ----------------------- | ------------------------- | @@ -69,7 +67,7 @@ Pushbullet is a notify platform and thus can be controlled by calling the notify If using targets, your own account's email address functions as 'send to all devices'. All targets are verified (if exists) before sending, except email. -#### Example service payload +#### Example action payload ```yaml @@ -139,8 +137,6 @@ action: - `target`: Pushbullet device to receive the notification. -<div class='note'> - +{% important %} Don't forget to [allowlist external directories](/integrations/homeassistant/#allowlist_external_dirs), so Home Assistant has access to them. - -</div> +{% endimportant %} diff --git a/source/_integrations/pushsafer.markdown b/source/_integrations/pushsafer.markdown index 765a46b9a791..a956e2df512d 100644 --- a/source/_integrations/pushsafer.markdown +++ b/source/_integrations/pushsafer.markdown @@ -31,7 +31,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string diff --git a/source/_integrations/pvpc_hourly_pricing.markdown b/source/_integrations/pvpc_hourly_pricing.markdown index b2c759e18023..5bbba6b8acab 100644 --- a/source/_integrations/pvpc_hourly_pricing.markdown +++ b/source/_integrations/pvpc_hourly_pricing.markdown @@ -47,8 +47,7 @@ Then, enable the API Token option for this integration. You can set up the integration 2 times; one for each geographic zone. To do this, add them again through the integrations panel under {% my integrations title="**Settings** > **Devices & services**" %}. You can change the configuration anytime in the integration options. -<div class='note'> - +{% note %} The sensor provides an hourly price for energy consumed, but the variable cost of energy is only one of the factors that add up to the electricity bill: - Fixed cost of contracted power @@ -56,5 +55,4 @@ The sensor provides an hourly price for energy consumed, but the variable cost o - Variable cost of energy consumed (the sensor's value) - Other fixed expenses, such as the rental of the electric meter - Multiple taxes applied - -</div> +{% endnote %} diff --git a/source/_integrations/pyload.markdown b/source/_integrations/pyload.markdown index 6de44f32cde9..3940f1a67968 100644 --- a/source/_integrations/pyload.markdown +++ b/source/_integrations/pyload.markdown @@ -6,58 +6,38 @@ ha_category: ha_release: 0.58 ha_iot_class: Local Polling ha_domain: pyload +ha_codeowners: + - '@tr4nt0r' ha_platforms: + - button + - diagnostics - sensor -ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file + - switch +ha_integration_type: service +ha_quality_scale: platinum +ha_config_flow: true --- -The `pyload` {% term integration %} allows you to monitor your downloads with [pyLoad](https://pyload.net/) from within Home Assistant and setup automation based on the information. - -To enable this sensor, add the following lines to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -sensor: - - platform: pyload -``` - -{% configuration %} -host: - description: This is the IP address of your pyLoad download manager. - required: false - type: string - default: localhost -port: - description: The port your pyLoad interface uses. - required: false - type: integer - default: 8000 -name: - description: The name to use when displaying this pyLoad instance. - required: false - type: string - default: 20 -username: - description: Your pyLoad username. - required: false - type: string -password: - description: Your pyLoad password. - required: false - type: string -ssl: - description: Enable SSL/TLS for the host. - required: false - type: boolean - default: false -{% endconfiguration %} - -If everything is setup correctly, the download speed will show up in the frontend. - -<p class='img'> - <img src='/images/integrations/pyload/pyload_speed.png' /> -</p> +The [**pyLoad**](https://pyload.net/) {% term integration %} enables monitoring your downloads directly in Home Assistant. This integration provides various sensors to keep track of your download activities and allows creating automations based on the sensor information, alongside button and switch controls for performing specific tasks such as aborting downloads and managing file restarts. + +{% include integrations/config_flow.md %} + +## Sensors + +- **Speed:** Monitors the current download speed. +- **Active downloads:** Indicates the number of files pyLoad is actively downloading +- **Downloads in queue:** Shows the number of downloads currently in the queue. +- **Finished downloads:** Indicates the number of completed downloads. +- **Free space:** Shows the available disk space in the download directory. + +## Buttons + +- **Abort all running downloads:** Aborts all currently running downloads. +- **Delete finished files/packages:** Deletes all finished files and packages. +- **Restart all failed files/packages:** Restarts all failed downloads. +- **Restart pyLoad core**: Restarts the pyLoad core. + +## Switches + +- **Pause/Resume Queue:** Pauses or resumes the download queue. When paused, active downloads will continue, but new downloads in the queue will not start. +- **Auto-reconnect:** If configured, enables pyLoad to automatically reconnect the internet connection. diff --git a/source/_integrations/python_script.markdown b/source/_integrations/python_script.markdown index 66d1a42bb9e7..e3a7ed68aa31 100644 --- a/source/_integrations/python_script.markdown +++ b/source/_integrations/python_script.markdown @@ -9,13 +9,13 @@ ha_domain: python_script ha_integration_type: integration --- -This integration allows you to write Python scripts that are exposed as services in Home Assistant. Each Python file created in the `<config>/python_scripts/` folder will be exposed as a service. The content is not cached so you can easily develop: edit file, save changes, call service. The scripts are run in a sandboxed environment. The following variables are available in the sandbox: +This integration allows you to write Python scripts that are exposed as actions in Home Assistant. Each Python file created in the `<config>/python_scripts/` folder will be exposed as an action. The content is not cached so you can easily develop: edit file, save changes, perform action. The scripts are run in a sandboxed environment. The following variables are available in the sandbox: | Name | Description | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| `hass` | The Home Assistant object. Access is only allowed to call services, set/remove states and fire events. [API reference][hass-api] | -| `data` | The data passed to the Python Script service call. | -| `logger` | A logger to allow you to log messages: `logger.info()`, `logger.warning()`, `logger.error()`. [API reference][logger-api] | +| `hass` | The Home Assistant object. Access is only allowed to perform actions, set/remove states and fire events. [API reference][hass-api] | +| `data` | The data passed to the Python Script action. | +| `logger` | A logger to allow you to log messages: `logger.info()`, `logger.warning()`, `logger.error()`. [API reference][logger-api] | | `time` | The stdlib `time` available as limited access. | | `datetime` | The stdlib `datetime` available as limited access. | | `dt_util` | The ` homeassistant.util.dt` module. | @@ -27,11 +27,9 @@ Other imports like `min`, `max` are available as builtins. See the [python_scrip [hass-api]: https://developers.home-assistant.io/docs/dev_101_hass/ [logger-api]: https://docs.python.org/3.7/library/logging.html#logger-objects -<div class='note'> - +{% note %} It is not possible to use Python imports with this integration. If you want to do more advanced scripts, you can take a look at [AppDaemon](https://appdaemon.readthedocs.io/en/latest/) or [pyscript](https://github.com/custom-components/pyscript) - -</div> +{% endnote %} ## Writing your first script, reading input and logging the activity @@ -57,7 +55,7 @@ logger.info("Hello {} at {}".format(name, time.time())) ``` - Start Home Assistant to reload the script configuration. -- Call your new {% my developer_call_service service="python_script.hello_world" %} service (with parameters) from the {% my developer_services %}, using the YAML mode. +- Call your new {% my developer_call_service service="python_script.hello_world" %} action (with parameters) from the {% my developer_services %}, using the YAML mode. ```yaml service: python_script.hello_world @@ -65,7 +63,7 @@ data: name: "Input-Text" ``` -<div class='note'> +{% tip %} Running this script show absolutely no output on the screen, but it logs with level `info`. You must have the [Logger](/integrations/logger/) enabled at least for level `info`. @@ -76,7 +74,7 @@ logger: default: info ``` -</div> +{% endtip %} ## Triggering events @@ -180,11 +178,11 @@ turn_on_light: For more examples, visit the [Scripts section](https://community.home-assistant.io/c/projects/scripts) in our forum. -## Services +## Actions -Available services: `reload`. +Available actions: `reload`. -### Service `python_script.reload` +### Action `python_script.reload` Reload all available python_scripts from the `<config>/python_scripts` folder, as a quicker alternative to restarting Home Assistant. @@ -192,4 +190,4 @@ Use this when creating a new Python script, or after updating the `<config>/pyth You don't have to call this service when you change an existing Python script. -This service takes no service data attributes. +This service takes no data attributes. diff --git a/source/_integrations/qbittorrent.markdown b/source/_integrations/qbittorrent.markdown index 7a1cdd61ac16..6e81aab3dac6 100644 --- a/source/_integrations/qbittorrent.markdown +++ b/source/_integrations/qbittorrent.markdown @@ -35,14 +35,14 @@ The qBittorrent integration will add the following sensors: - `sensor.qbittorrent_inactive_torrents`: The current inactive torrents in qBittorrent. - `sensor.qbittorrent_paused_torrents`: The current paused torrents in qBittorrent. -## Services +## Actions -### Service `qbittorrent.get_torrents` +### Action `qbittorrent.get_torrents` -This service populates [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) +This action populates [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with a dictionary of torrents based on the provided filter. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ---------------------------------------------- | --------------------------------------------------- | | `device` | no | The device you'd like to check the torrents of | all, active, inactive, paused, downloading, seeding | | `torrent_filter` | no | The type of torrents you want in the response | all, active, inactive, paused, downloading, seeding | @@ -56,12 +56,12 @@ response_variable: torrents The response data contains the field `torrents` which contains a dictionary of torrents. The names of the torrents are the keys. -### Service `qbittorrent.get_all_torrents` +### Action `qbittorrent.get_all_torrents` -This service populates [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) +This action populates [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with a dictionary of torrents based on the provided filter. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | --------------------------------------------- | --------------------------------------------------- | | `torrent_filter` | no | The type of torrents you want in the response | all, active, inactive, paused, downloading, seeding | diff --git a/source/_integrations/qld_bushfire.markdown b/source/_integrations/qld_bushfire.markdown index e918803c3d47..d9e6675eebd9 100644 --- a/source/_integrations/qld_bushfire.markdown +++ b/source/_integrations/qld_bushfire.markdown @@ -33,13 +33,11 @@ of each entity. The data is updated every 5 minutes. -<div class='note'> - +{% note %} The material used by this integration is provided under the [Creative Commons Attribution 4.0 license](https://creativecommons.org/licenses/by/4.0/legalcode). It has only been modified for the purpose of presenting the material in Home Assistant. Please refer to the [creator's copyright notice](https://www.qfes.qld.gov.au/copyright) for more information. - -</div> +{% endnote %} ## Configuration diff --git a/source/_integrations/qvr_pro.markdown b/source/_integrations/qvr_pro.markdown index a18c1eb7e0bb..5af0a812251a 100644 --- a/source/_integrations/qvr_pro.markdown +++ b/source/_integrations/qvr_pro.markdown @@ -64,6 +64,6 @@ Enabling the QVR Pro camera platform will add all QVR Pro channels by default. Please see `exclude_channels` if you would like to exclude specific channels from showing up in Home Assistant. -<p class="note warning"> +{% important %} The QVR Pro user must have Surveillance Management permission. -</p> +{% endimportant %} diff --git a/source/_integrations/rachio.markdown b/source/_integrations/rachio.markdown index 8fea2943ac26..7e47cf49c96a 100644 --- a/source/_integrations/rachio.markdown +++ b/source/_integrations/rachio.markdown @@ -40,11 +40,9 @@ They will be automatically added if the Rachio integration is loaded. 3. Click **Get API Key**. 4. Copy the API key from the dialog that opens. -<div class='note'> - +{% important %} In order for Rachio switches and sensors to update, your Home Assistant instance must be accessible from the internet, either via Home Assistant Cloud or another method. See the [Remote Access documentation](/docs/configuration/remote/) for more information. The smart hose timers use polling and don't require external access to be setup. - -</div> +{% endimportant %} {% include integrations/config_flow.md %} @@ -79,30 +77,30 @@ Once configured, a switch will be added for every zone that is enabled on every A [calendar](https://www.home-assistant.io/integrations/calendar/) entity will be added for each smart hose timer base station on the account, which will show past and future events for all enabled schedules. An upcoming event can be deleted from the calendar, which will trigger a skip of that event. -## Services +## Actions -### Service `rachio.start_watering` +### Action `rachio.start_watering` -Allows starting one zone on a sprinkler controller, any number of smart hose timer valves, or a schedule. To sequentially start multiple zones on a sprinkler controller, use the `start_multiple_zone_schedule` service below. +Allows starting one zone on a sprinkler controller, any number of smart hose timer valves, or a schedule. To sequentially start multiple zones on a sprinkler controller, use the `start_multiple_zone_schedule` action below. -Service data attribute | Optional | Description | +Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Individual zone, schedule, or multiple smart hose timer valves to run. A smart hose timer base station device can also be selected to run all valves on the given base. | `duration` | yes | Duration in minutes to run the zone or valves. Leave empty for schedules. -<div class='note'> -The services below only apply to sprinkler controllers and will not be shown if only smart hose timers are on the account. -</div> +{% note %} +The actions below only apply to sprinkler controllers and will not be shown if only smart hose timers are on the account. +{% endnote %} -### Service `rachio.start_multiple_zone_schedule` +### Action `rachio.start_multiple_zone_schedule` Allows a list of zones to be passed with a corresponding list of durations to create a custom schedule directly from Home Assistant. -<div class='note'> +{% note %} It is not currently possible to have zones from multiple controllers in the same custom schedule. -</div> +{% endnote %} - Service data attribute | Optional | Description | + Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | List of zones to run. Will be run in the order listed. | `duration` | no | Duration in minutes to run the zones. If a list of durations is provided, each duration will apply to the corresponding zone listed above. Alternatively, one duration can be provided and will be used for all zones. @@ -139,43 +137,43 @@ script: duration: 20 ``` -### Service `rachio.set_zone_moisture_percent` +### Action `rachio.set_zone_moisture_percent` Set the zone moisture percentage for a zone or group of zones. -Rachio allows for setting the moisture percentage of a zone or group of zones. As Rachio only uses moisture levels for zones in a Flex Daily schedule, this service is only available when at least one zone is part of a Flex Daily schedule. +Rachio allows for setting the moisture percentage of a zone or group of zones. As Rachio only uses moisture levels for zones in a Flex Daily schedule, this action is only available when at least one zone is part of a Flex Daily schedule. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String, list or group of zones to set moisture percentage. | `percent` | no | Integer of the desired moisture percentage. Accepts 0-100. -### Service `rachio.pause_watering` +### Action `rachio.pause_watering` Pause a currently running schedule. -This service will not be available if only a Generation 1 controller is on the account, as these controllers do not support pause or resume. +This action will not be available if only a Generation 1 controller is on the account, as these controllers do not support pause or resume. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `devices` | yes | Name of the controller(s) to pause. If not given, will pause all running controllers on the account. | `duration` | yes | Duration in minutes to pause. Accepts 1-60. Defaults to 60 minutes if not specified. -### Service `rachio.resume_watering` +### Action `rachio.resume_watering` Resume a currently paused schedule. -This service will not be available if only a Generation 1 controller is on the account, as these controllers do not support pause or resume. +This action will not be available if only a Generation 1 controller is on the account, as these controllers do not support pause or resume. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `devices` | yes | Name of the controller(s) to resume. If not given, will resume all paused controllers on the account. -### Service `rachio.stop_watering` +### Action `rachio.stop_watering` Stops all currently running schedules. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `devices` | yes | Name of the controller(s) to stop. If not given, will stop all running controllers on the account. diff --git a/source/_integrations/rainbird.markdown b/source/_integrations/rainbird.markdown index 1b7878599e21..de6a3b4fdc61 100644 --- a/source/_integrations/rainbird.markdown +++ b/source/_integrations/rainbird.markdown @@ -37,7 +37,7 @@ There is currently support for the following device types within Home Assistant: ## Configuration options The integration has a configuration option to change the default amount of time that the irrigation -will run when turning on a zone switch (default is 6 minutes). This can be overridden with a service call (see below). +will run when turning on a zone switch (default is 6 minutes). This can be overridden with an action (see below). ## Binary sensor @@ -57,16 +57,16 @@ The Rain Delay Number Entity lets you set and view the number of days, if any, Switches are automatically added for all available zones of configured controllers. -## Services +## Actions -The integration exposes services to give additional control over a Rain Bird device. +The integration exposes actions to give additional control over a Rain Bird device. ### `rainbird.start_irrigation` -Start a Rain Bird zone for a set number of minutes. This service accepts a Rain Bird sprinkler +Start a Rain Bird zone for a set number of minutes. This action accepts a Rain Bird sprinkler zone switch entity and allows a custom duration unlike the switch. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------- | | `entity_id` | no | The Rain Bird Sprinkler zone switch to turn on. | | `duration` | no | Number of minutes for this zone to be turned on. | diff --git a/source/_integrations/rainmachine.markdown b/source/_integrations/rainmachine.markdown index 65b22f725705..e41ed1a0701a 100644 --- a/source/_integrations/rainmachine.markdown +++ b/source/_integrations/rainmachine.markdown @@ -43,14 +43,14 @@ Note that some entities are disabled by default. If you are missing a sensor or The integration has two configuration options: -1. "Default Zone Run Time": sets a default duration when turning on a zone switch (default: 600 seconds). This can be overriden with a service call (see below). +1. "Default Zone Run Time": sets a default duration when turning on a zone switch (default: 600 seconds). This can be overriden with an action (see below). 2. "Use Run Times from App": if enabled, will use the zone-specific run times from the last time the zone was turned on manually in the RainMachine App – this allows you to set per-zone default times using the RainMachine app instead of the same default time for all zones. -## Services +## Actions -Services accept either device IDs or entity IDs, depending on the nature of the service: +Actions accept either device IDs or entity IDs, depending on the nature of the action: -- Services that require a device ID as a target: +- Actions that require a device ID as a target: - `rainmachine.pause_watering` - `rainmachine.push_flow_meter_data` - `rainmachine.push_weather_data` @@ -58,7 +58,7 @@ Services accept either device IDs or entity IDs, depending on the nature of the - `rainmachine.stop_all` - `rainmachine.unpause_watering` - `rainmachine.unrestrict_watering` -- Services that require an entity ID as a target (note that the correct entity ID type must be provided, such as a program for a program-related service) +- Action that require an entity ID as a target (note that the correct entity ID type must be provided, such as a program for a program-related action) - `rainmachine.start_program` - `rainmachine.start_zone` - `rainmachine.stop_program` @@ -68,7 +68,7 @@ Services accept either device IDs or entity IDs, depending on the nature of the Pause all watering activities for a number of seconds. After the pause is complete, the previous watering activities will resume. Note that controllers can only be paused for a maximum of 12 hours. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------ | | `seconds` | no | The number of seconds to pause | @@ -76,7 +76,7 @@ Pause all watering activities for a number of seconds. After the pause is comple Push Flow Meter data from Home Assistant to the RainMachine device. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------- | | `value` | no | The flow meter value to send. May be any positive number. | | `unit_of_measurement` | yes | The flow meter units to send. String must be one of "clicks", "gal", "litre", or "m3" (default: "litre"). | @@ -90,7 +90,7 @@ Local Weather Push service should be enabled from Settings > Weather > Developer See details of RainMachine API here: <https://rainmachine.docs.apiary.io/#reference/weather-services/parserdata/post> -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------- | | `timestamp` | no | UNIX Timestamp for the Weather Data. If omitted, the RainMachine device's local time at the time of the call is used. | | `mintemp` | no | Minimum Temperature (°C) | @@ -111,7 +111,7 @@ See details of RainMachine API here: Restrict any and all watering activities from staring for a time period. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------ | | `duration` | no | The time period to restrict (e.g., "01:00:00") | @@ -123,7 +123,7 @@ Start a RainMachine program. Start a RainMachine zone for a set number of seconds. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------- | | `zone_run_time` | yes | The number of seconds to run; defaults to 600 seconds | diff --git a/source/_integrations/random.markdown b/source/_integrations/random.markdown index 0d5b6d63a14d..8c5233691948 100644 --- a/source/_integrations/random.markdown +++ b/source/_integrations/random.markdown @@ -23,7 +23,7 @@ The `random` integration simply creates random values or state. This can be usef ## Configuration -The preferred way to configure random helpers is via the user interface at **{% my helpers title="Settings > Devices & Services > Helpers" %}** and select the add button; next, select the {% my config_flow_start domain=page.ha_domain title=page.title %} option. +The preferred way to configure random helpers is via the user interface at **{% my helpers title="Settings > Devices & services > Helpers" %}** and select the add button; next, select the {% my config_flow_start domain=page.ha_domain title=page.title %} option. To be able to add Helpers via the user interface, you should have `default_config:` in your {% term "`configuration.yaml`" %}. It should already be there by default unless you removed it. If you removed `default_config:` from your configuration, you must add `random:` to your {% term "`configuration.yaml`" %} first, then you can use the UI. diff --git a/source/_integrations/raspyrfm.markdown b/source/_integrations/raspyrfm.markdown index 1f4553176fc8..670564b865d2 100644 --- a/source/_integrations/raspyrfm.markdown +++ b/source/_integrations/raspyrfm.markdown @@ -94,11 +94,9 @@ Depending on the control unit the channel configuration can have varying formats Initially, the state of a switch is unknown. When the switch is turned on or off (via frontend) the state is known and will be shown in the frontend. -<div class='note warning'> - +{% note %} Note that due to the way those cheap RC units work it is **not possible to query their current state**. Therefore the only way to preserve a consistent state within Home Assistant is to only use Home Assistant as the controller. - -</div> +{% endnote %} ## Full example diff --git a/source/_integrations/recollect_waste.markdown b/source/_integrations/recollect_waste.markdown index ad999774d78e..2485027b2a81 100644 --- a/source/_integrations/recollect_waste.markdown +++ b/source/_integrations/recollect_waste.markdown @@ -26,8 +26,8 @@ webcal://recollect.a.ssl.fastly.net/api/places/PLACE_ID/services/SERVICE_ID/even The default frequency for pulling data from ReCollect Waste is once a day (86400 seconds). -<div class='note warning'> +{% warning %} The ReCollect Waste sensor uses the ReCollect API <strong>URL</strong> to obtain data and not an official API from ReCollect. Use at your own risk. -</div> +{% endwarning %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/recorder.markdown b/source/_integrations/recorder.markdown index 2a217e69b815..0b7fe99df666 100644 --- a/source/_integrations/recorder.markdown +++ b/source/_integrations/recorder.markdown @@ -14,11 +14,9 @@ ha_integration_type: system This integration is by default enabled as dependency of the [`history`](/integrations/history/) integration. -<div class='note'> - +{% important %} This integration constantly saves data. If you use the default configuration, the data will be saved on the media Home Assistant is installed on. In case of Raspberry Pi with an SD card, it might affect your system's reaction time and life expectancy of the storage medium (the SD card). It is therefore recommended to set the [commit_interval](/integrations/recorder#commit_interval) to higher value, e.g. 30s, limit the amount of stored data (e.g., by excluding devices) or store the data elsewhere (e.g., another system). - -</div> +{% endimportant %} Home Assistant uses [SQLAlchemy](https://www.sqlalchemy.org/), which is an Object Relational Mapper (ORM). This makes it possible to use a number of database solutions. @@ -32,11 +30,9 @@ Although SQLAlchemy supports database solutions in addition to the ones supporte The default, and recommended, database engine is [SQLite](https://www.sqlite.org/) which does not require any configuration. The database is stored in your Home Assistant configuration directory ('/config/') and is named `home-assistant_v2.db`. -<div class='note'> - +{% caution %} Changing database used by the recorder may result in losing your existing history. Migrating data is not supported. - -</div> +{% endcaution %} To change the defaults for the `recorder` integration in your installation, add the following to your {% term "`configuration.yaml`" %} file: @@ -66,12 +62,12 @@ recorder: default: 3 type: integer auto_purge: - description: Automatically purge the database every night at 04:12 local time. Purging keeps the database from growing indefinitely, which takes up disk space and can make Home Assistant slow. If you disable `auto_purge` it is recommended that you create an automation to call the [`recorder.purge`](#service-purge) periodically. + description: Automatically purge the database every night at 04:12 local time. Purging keeps the database from growing indefinitely, which takes up disk space and can make Home Assistant slow. If you disable `auto_purge` it is recommended that you create an automation to call the [`recorder.purge`](#action-purge) periodically. required: false default: true type: boolean auto_repack: - description: Automatically repack the database every second sunday after the auto purge. Without a repack, the database may not decrease in size even after purging, which takes up disk space and can make Home Assistant slow. If you disable `auto_repack` it is recommended that you create an automation to call the [`recorder.purge`](#service-purge) periodically. This flag has no effect if `auto_purge` is disabled. + description: Automatically repack the database every second sunday after the auto purge. Without a repack, the database may not decrease in size even after purging, which takes up disk space and can make Home Assistant slow. If you disable `auto_repack` it is recommended that you create an automation to call the [`recorder.purge`](#action-purge) periodically. This flag has no effect if `auto_purge` is disabled. required: false default: true type: boolean @@ -168,7 +164,7 @@ recorder: - sensor.last_boot # Comes from 'systemmonitor' sensor platform - sun.sun # Don't record sun data event_types: - - call_service # Don't record service calls + - call_service # Don't record actions ``` Defining domains and entities to record by using the `include` configuration (i.e. allowlist) is convenient if you have a lot of entities in your system and your `exclude` lists possibly get very large, so it might be better just to define the entities or domains to record. @@ -201,24 +197,24 @@ recorder: - sensor.weather_* ``` -## Services +## Actions -### Service `purge` +### Action `purge` -Call the service `recorder.purge` to start a purge task which deletes events and states older than x days, according to `keep_days` service data. +Perform the action `recorder.purge` to start a purge task which deletes events and states older than x days, according to `keep_days` action data. Note that purging will not immediately decrease disk space usage but it will significantly slow down further growth. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `keep_days` | yes | The number of history days to keep in recorder database (defaults to the integration `purge_keep_days` configuration) | | `repack` | yes | When using SQLite or PostgreSQL this will rewrite the entire database. When using MySQL or MariaDB it will optimize or recreate the events and states tables. This is a heavy operation that can cause slowdowns and increased disk space usage while it runs. Only supported by SQLite, PostgreSQL, MySQL and MariaDB. | | `apply_filter` | yes | Apply entity_id and event_type filter in addition to time based purge. Useful in combination with `include` / `exclude` filter to remove falsely added states and events. Combine with `repack: true` to reduce database size. | -### Service `purge_entities` +### Action `purge_entities` -Call the service `recorder.purge_entities` to start a task that purges events and states from the recorder database that match any of the specified `entity_id`, `domains`, and `entity_globs` fields. At least one of the three selection criteria fields must be provided. +Perform the action `recorder.purge_entities` to start a task that purges events and states from the recorder database that match any of the specified `entity_id`, `domains`, and `entity_globs` fields. At least one of the three selection criteria fields must be provided. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------- | | `entity_id` | yes | A list of entity_ids that should be purged from the recorder database. | | `domains` | yes | A list of domains that should be purged from the recorder database. | @@ -242,23 +238,21 @@ action: mode: single ``` -### Service `disable` +### Action `disable` -Call the service `recorder.disable` to stop saving events and states to the database. +Perform the action `recorder.disable` to stop saving events and states to the database. -### Service `enable` +### Action `enable` -Call the service `recorder.enable` to start again saving events and states to the database. This is the opposite of `recorder.disable`. +Perform the action `recorder.enable` to start again saving events and states to the database. This is the opposite of `recorder.disable`. ## Custom database engines -<div class='note'> - +{% warning %} SQLite is the most tested, and newer version of Home Assistant are highly optimized to perform well when using SQLite. When choosing another option, you should be comfortable in the role of the database administrator, including making backups of the external database. - -</div> +{% endwarning %} Here are examples to use with the [`db_url`](#db_url) configuration option. @@ -302,42 +296,34 @@ PostgreSQL (Custom socket dir): `postgresql://@/DB_NAME?host=/path/to/dir` {% endconfiguration_basic %} -<div class='note'> - +{% note %} Some installations of MariaDB/MySQL may require an ALTERNATE_PORT (3rd-party hosting providers or parallel installations) to be added to the SERVER_IP, e.g., `mysql://user:password@SERVER_IP:ALTERNATE_PORT/DB_NAME?charset=utf8mb4`. +{% endnote %} -</div> - -<div class='note'> - +{% note %} When using a MariaDB or MySQL server, adding `+pymysql` to the URL will use the pure Python MySQL library, which is slower but may be required if the C MySQL library is not available. When using the official Docker image, the C MySQL library will always be available. `pymysql` is most commonly used with `venv` where the C MySQL library is not installed. +{% endnote %} -</div> - -<div class='note'> - +{% tip %} Unix Socket connections always bring performance advantages over TCP, if the database is on the same host as the `recorder` instance (i.e., `localhost`). +{% endtip %} -</div> - -<div class='note warning'> - +{% note %} If you want to use Unix Sockets for PostgreSQL you need to modify the `pg_hba.conf`. See [PostgreSQL](#postgresql) - -</div> +{% endnote %} ### Database startup -If you are running a database server instance on the same server as Home Assistant then you must ensure that this service starts before Home Assistant. For a Linux instance running Systemd (Raspberry Pi, Debian, Ubuntu and others) you should edit the service file. +If you are running a database server instance on the same server as Home Assistant then you must ensure that this action starts before Home Assistant. For a Linux instance running Systemd (Raspberry Pi, Debian, Ubuntu and others) you should edit the service file. To help facilitate this, db_max_retry and db_retry_wait variables have been added to ensure the recorder retries the connection to your database enough times, for your database to start up. ```bash sudo nano /etc/systemd/system/home-assistant@homeassistant.service ``` -and add the service for the database, for example, PostgreSQL: +and add the action for the database, for example, PostgreSQL: ```txt [Unit] @@ -357,9 +343,9 @@ Not all Python bindings for the chosen database engine can be installed directly ### MariaDB and MySQL -<div class='note warning'> +{% warning %} MariaDB versions before 10.5.17, 10.6.9, 10.7.5, and 10.8.4 suffer from a performance regression which can result in the system becoming overloaded while querying history data or purging the database. -</div> +{% endwarning %} Make sure the default character set of your database server is set to `utf8mb4` (see [MariaDB documentation](https://mariadb.com/kb/en/setting-character-sets-and-collations/#example-changing-the-default-character-set-to-utf-8)). If you are in a virtual environment, don't forget to activate it before installing the `mysqlclient` Python package described below. diff --git a/source/_integrations/reddit.markdown b/source/_integrations/reddit.markdown index 457b4ebcf1d6..051c52ee4331 100644 --- a/source/_integrations/reddit.markdown +++ b/source/_integrations/reddit.markdown @@ -20,9 +20,9 @@ The Reddit sensor integrates data from [Reddit](https://reddit.com/) to monitor To set up this sensor, you will need to generate a `client_id` and `client_secret` for the user account you will use to connect. Follow the first steps in [this Wiki page](https://github.com/reddit-archive/reddit/wiki/OAuth2-Quick-Start-Example). -<div class='note'> +{% important %} This integration does not support Reddit's two-factor authentication. If you use two-factor authentication for your Reddit account, create a separate Reddit account without two-factor authentication for use with Home Assistant. -</div> +{% endimportant %} ## Configuration diff --git a/source/_integrations/remember_the_milk.markdown b/source/_integrations/remember_the_milk.markdown index 5a5063690f8f..2c232ed2c007 100644 --- a/source/_integrations/remember_the_milk.markdown +++ b/source/_integrations/remember_the_milk.markdown @@ -69,7 +69,7 @@ The task creation supports the "smart syntax", so to create a task with the tag **Note:** At the moment, smart syntax is *not* supported when updating tasks. All smart syntax commands are ignored during the update and will end up as normal text in the name of the task. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | -------------------------------------------------------------------------------------------- | --------------------------- | | name | no | Name of the new task, you can use the smart syntax here. | "do this ^today #from_hass" | | id | yes | Identifier for the task you're creating, can be used to update or complete the task later on | "myid" | @@ -80,7 +80,7 @@ Complete a tasks that was privously created from Home Assistant. You can not com If you have created your task with an `id`, calling `<account>_complete_task` with the parameter `id` will then complete your task. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | -------------------------------------------------- | ------- | | id | no | Identifier that was defined when creating the task | "myid" | diff --git a/source/_integrations/remote.markdown b/source/_integrations/remote.markdown index 75d0f0c453e3..4e77e02927ef 100644 --- a/source/_integrations/remote.markdown +++ b/source/_integrations/remote.markdown @@ -11,23 +11,23 @@ ha_codeowners: ha_integration_type: entity --- -Keeps track which remotes are in your environment, their state and allows you to control them. +Keeps track of the remotes in your environment. Captures their state and allows you to control them. - Maintains a state per remote and a combined state `all_remotes`. -- Registers services `remote/turn_on`, `remote/turn_off`, `remote/toggle`, and `remote/send_command` to control remotes. +- Registers actions `remote/turn_on`, `remote/turn_off`, `remote/toggle`, and `remote/send_command` to control remotes. {% include integrations/building_block_integration.md %} -### Use the services +### Use the actions -Go to the **Developer Tools**, then to **Call Service** in the frontend, and choose `remote/turn_on`, `remote/turn_off`, or `remote/toggle` from the list of available services (**Available services:** on the left). Enter something like the sample below into the **Service Data** field and hit **Call Service**. +Go to the **Developer Tools** and open the **Actions** tab. From the **Actions** dropdown, choose `remote/turn_on`, `remote/turn_off`, or `remote/toggle`. Under target, select the target device. If you are in YAML mode, enter something like the sample below into the **Data** field. Once you are done, select **Perform action**. ```json {"entity_id":"remote.family_room"} ``` -| Service data attribute | Optional | Description | -| ---------------------- | -------- | ----------------------------------------------- | -| `entity_id` | yes | Only act on a specific remote, else target all. | +| Data attribute | Optional | Description | +| -------------- | -------- | ----------------------------------------------- | +| `entity_id` | yes | Only act on a specific remote, else target all. | See the platform documentation for each type of remote for more detailed examples. diff --git a/source/_integrations/remote_rpi_gpio.markdown b/source/_integrations/remote_rpi_gpio.markdown index 23d816ca6037..8e25bf1bfb4f 100644 --- a/source/_integrations/remote_rpi_gpio.markdown +++ b/source/_integrations/remote_rpi_gpio.markdown @@ -112,9 +112,9 @@ invert_logic: For more details about the GPIO layout, visit the Wikipedia [article](https://en.wikipedia.org/wiki/Raspberry_Pi#J8_header_and_general_purpose_input-output_(GPIO)) about the Raspberry Pi. -<div class='note warning'> +{% note %} Note that a pin managed by Home Assistant is expected to be exclusive to Home Assistant. -</div> +{% endnote %} A common question is what does port refer to? This number is the actual GPIO #, not the pin #. For example, if you have a relay connected to pin 11 its GPIO # is 17. diff --git a/source/_integrations/renault.markdown b/source/_integrations/renault.markdown index 97e0dce72c8d..84e7d51731b7 100644 --- a/source/_integrations/renault.markdown +++ b/source/_integrations/renault.markdown @@ -38,31 +38,31 @@ This integration provides the following platforms: All vehicles linked to the account should then get added as devices, with sensors added as linked entity. -## Services +## Actions -### Service `renault.ac_start` +### Action `renault.ac_start` Start A/C on vehicle. - | Service data attribute | Required | Description | Example | + | Data attribute | Required | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `vehicle`| yes | device_id of the vehicle | | | `temperature` | yes | Target A/C temperature in °C | | | `when` | no | Timestamp for the start of the A/C (optional - defaults to now) | `2020-05-01T17:45:00` | -### Service `renault.ac_cancel` +### Action `renault.ac_cancel` Cancel A/C on vehicle. - | Service data attribute | Required | Description | + | Data attribute | Required | Description | | ---------------------- | -------- | ----------- | | `vehicle`| yes | device_id of the vehicle | -### Service `renault.charge_set_schedules` +### Action `renault.charge_set_schedules` Update charge schedule on vehicle. - | Service data attribute | Required | Description | Example | + | Data attribute | Required | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `vehicle`| yes | device_id of the vehicle | | `schedules` | yes | Schedule details. Can be a single schedule or a list of schedules | see [example below](#schedule_example) | diff --git a/source/_integrations/renson.markdown b/source/_integrations/renson.markdown index 7cb36d90462c..600f598ac866 100644 --- a/source/_integrations/renson.markdown +++ b/source/_integrations/renson.markdown @@ -29,32 +29,32 @@ The Renson integration pulls in data from the Renson Endura delta device. Most o {% include integrations/config_flow.md %} -## Services +## Actions -### Service `renson.set_timer_level` +### Action `renson.set_timer_level` Set the ventilation timer. - | Service data attribute | Required | Description | Example | + | Data attribute | Required | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `timer_level`| yes | Level setting | | | `minutes` | yes | Time of the timer (0 will disable the timer) | | -### Service `renson.set_breeze` +### Action `renson.set_breeze` Set the breeze function of the ventilation system. - | Service data attribute | Required | Description | Example | + | Data attribute | Required | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `breeze_level`| no | Ventilation level when breeze function is activated | | | `temperature` | no | Temperature when the breeze function should be activated in °C | | | `activate` | yes | Activate or disable the breeze feature | `2020-05-01T17:45:00` | -### Service `renson.set_pollution_settings` +### Action `renson.set_pollution_settings` Set all the pollution settings of the ventilation system. - | Service data attribute | Required | Description | Example | + | Data attribute | Required | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `day_pollution_level`| no | Ventilation level when pollution is detected in the day | | | `night_pollution_level` | no | Ventilation level when pollution is detected in the night | | diff --git a/source/_integrations/reolink.markdown b/source/_integrations/reolink.markdown index 12671cf58019..5b6ffaef6a5c 100644 --- a/source/_integrations/reolink.markdown +++ b/source/_integrations/reolink.markdown @@ -147,11 +147,11 @@ Depending on the supported features of the camera, button entities are added for **Guard set current position** will set the current position as the new guard position. -### Service reolink.ptz_move +### Action reolink.ptz_move -Some Reolink <abbr title="pan, tilt, and zoom">PTZ</abbr> cameras can move at different speeds. For those cameras, the `reolink.ptz_move` service can be used in combination with the **PTZ left**, **right**, **up**, **down**, **zoom in**, or **zoom out** entity which allows specifying the speed attribute. If the <abbr title="pan, tilt, and zoom">PTZ</abbr> button entities for a specific camera are not shown under **Choose entity** under **targets** of the `reolink.ptz_move` service, it means that this camera does not support custom <abbr title="pan, tilt, and zoom">PTZ</abbr> speeds. +Some Reolink <abbr title="pan, tilt, and zoom">PTZ</abbr> cameras can move at different speeds. For those cameras, the `reolink.ptz_move` action can be used in combination with the **PTZ left**, **right**, **up**, **down**, **zoom in**, or **zoom out** entity which allows specifying the speed attribute. If the <abbr title="pan, tilt, and zoom">PTZ</abbr> button entities for a specific camera are not shown under **Choose entity** under **targets** of the `reolink.ptz_move` action, it means that this camera does not support custom <abbr title="pan, tilt, and zoom">PTZ</abbr> speeds. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Name of the Reolink <abbr title="pan, tilt, and zoom">PTZ</abbr> button entity to control. For example, `button.trackmix_ptz_left`. | | `speed` | no | <abbr title="pan, tilt, and zoom">PTZ</abbr> move speed. For example `10`. | @@ -175,9 +175,9 @@ Depending on the supported features of the camera, select entities are added for ## Siren entities If the camera supports a siren, a siren entity will be created. -When using the siren turn-on service, the siren will continue to sound until the siren turn-off service is called. +When using the siren turn-on action, the siren will continue to sound until the siren turn-off action is called. -In some camera models, there is a delay of up to 5 seconds between the turn-off command and the sound stopping. The siren turn-on service supports setting a volume and a duration (no turn-off service call is needed in that case). +In some camera models, there is a delay of up to 5 seconds between the turn-off command and the sound stopping. The siren turn-on action supports setting a volume and a duration (no turn-off action call is needed in that case). ## Switch entities @@ -249,7 +249,7 @@ Recordings up to 1 month old can be viewed in Home Assistant. ## Tested models -The following models have been tested and confirmed to work: +The following models have been tested and confirmed to work with a direct link to Home Assistant: - C1 Pro* - C2 Pro* @@ -278,6 +278,7 @@ The following models have been tested and confirmed to work: - [RLC-820A](https://reolink.com/product/rlc-820a/) - [RLC-822A](https://reolink.com/product/rlc-822a/) - [RLC-823A](https://reolink.com/product/rlc-823a/) +- [RLC-830A](https://reolink.com/product/rlc-830a/) - [RLC-833A](https://reolink.com/product/rlc-833a/) - [RLC-1212A](https://reolink.com/product/rlc-1212a/) - [RLC-1224A](https://reolink.com/product/rlc-1224a/) @@ -289,15 +290,30 @@ The following models have been tested and confirmed to work: - [Reolink Duo 2 WiFi](https://reolink.com/product/reolink-duo-wifi/) - [Reolink Duo 3 PoE](https://reolink.com/product/reolink-duo-3-poe/) - Reolink Duo Floodlight ([PoE](https://reolink.com/product/reolink-duo-floodlight-poe/) and [Wi-Fi](https://reolink.com/product/reolink-duo-floodlight-wifi/)) +- [Reolink Home Hub](https://reolink.com/product/reolink-home-hub/) - Reolink TrackMix ([PoE](https://reolink.com/product/reolink-trackmix-poe/) and [Wi-Fi](https://reolink.com/product/reolink-trackmix-wifi/)) - Reolink Video Doorbell ([PoE](https://reolink.com/product/reolink-video-doorbell/) and [Wi-Fi](https://reolink.com/product/reolink-video-doorbell-wifi/)) *These models are discontinued and not sold anymore, they will continue to work with Home Assistant. -Battery-powered cameras are not yet supported. +### Tested battery-powered models + +Battery-powered Reolink cameras can be used with Home Assistant with the help of a [Reolink Home Hub](https://reolink.com/product/reolink-home-hub/). The Home Hub will act as a bridge between the battery-powered cameras and Home Assistant, conserving the battery life. All features of the battery-powered cameras will be available just like regular-powered cameras. Viewing the camera stream in Home Assistant will keep the battery camera awake during viewing, consuming battery life. Therefore, ensure you do not use the camera stream on a dashboard that is constantly being viewed, like a wall panel dashboard. You can check proper operation by ensuring that the "Sleep status" entity will go to "Sleeping" if the battery camera is not being actively used. + +The following battery-powered models have been tested and confirmed to work through the Reolink Home Hub: + +- [Argus 3 Pro](https://reolink.com/product/argus-3-pro/) +- [Argus 4 Pro](https://reolink.com/product/argus-4-pro/) +- [Argus Eco Ultra](https://reolink.com/product/argus-eco-ultra/) +- [Argus Track](https://reolink.com/product/argus-track/) +- [Reolink Doorbell Battery](https://reolink.com/roadmap/) + +Reolink provides [this larger list of battery camera models](https://support.reolink.com/hc/en-us/articles/32379509281561-Reolink-Home-Hub-Compatibility/) which are compatible with the Home Hub and should work with Home Assistant. + +### Models only compatible using a NVR/Home Hub The following models are lacking the HTTP web server API and can, therefore, not work directly with this integration. -However, these cameras can work with this integration through an NVR in which the NVR is connected to Home Assistant. +However, these cameras can work with this integration through an NVR or Home Hub in which the NVR/Home Hub is connected to Home Assistant. - E1 Pro - E1 diff --git a/source/_integrations/rest.markdown b/source/_integrations/rest.markdown index 89cabafaa428..1ceb59b5bcc3 100644 --- a/source/_integrations/rest.markdown +++ b/source/_integrations/rest.markdown @@ -186,8 +186,6 @@ binary_sensor: type: list {% endconfiguration %} -<div class='note'> - +{% important %} Use either `resource` or `resource_template`. - -</div> +{% endimportant %} diff --git a/source/_integrations/rest_command.markdown b/source/_integrations/rest_command.markdown index 2811b1bce985..f3167df602c6 100644 --- a/source/_integrations/rest_command.markdown +++ b/source/_integrations/rest_command.markdown @@ -11,7 +11,7 @@ ha_codeowners: - '@jpbede' --- -This {% term integration %} can expose regular REST commands as services. Services can be called from a [script] or in [automation]. +This {% term integration %} can expose regular REST commands as actions. Actions can be called from a [script] or in [automation]. [script]: /integrations/script/ [automation]: /getting-started/automation/ @@ -28,7 +28,7 @@ rest_command: {% configuration %} service_name: - description: The name used to expose the service. E.g., in the above example, it would be 'rest_command.example_request'. + description: The name used to expose the action. E.g., in the above example, it would be 'rest_command.example_request'. required: true type: map keys: @@ -77,7 +77,7 @@ service_name: ### Basic example which uses PUT method and payload encoded as form data -This example implements 2 REST commands to add service calls for the missing shuffle functionality of the iTunes integration. +This example implements 2 REST commands to add actions for the missing shuffle functionality of the iTunes integration. ```yaml rest_command: @@ -95,7 +95,7 @@ rest_command: ### Using REST command Response in automations -REST commands provide a service response in a dictionary containing `status` (containing the HTTP response code), and `content` containing the response body as text or JSON. This response can be accessed in automations using [`response_variable`](/docs/scripts/service-calls#use-templates-to-handle-response-data). +REST commands provide an action response in a dictionary containing `status` (containing the HTTP response code) and `content` containing the response body as text or JSON. This response can be accessed in automations using [`response_variable`](/docs/scripts/service-calls#use-templates-to-handle-response-data). The following example shows how the REST command response may be used in automations. In this case, checking the [Traefik API](https://doc.traefik.io/traefik/operations/api/) for errors. @@ -144,7 +144,7 @@ rest_command: ### Using templates to change the payload based on entities -The commands can be dynamic, using templates to insert values of other entities. Service call support variables for doing things with templates. +The commands can be dynamic, using templates to insert values of other entities. Actions support variables for doing things with templates. In this example, uses [templates](/docs/configuration/templating/) for dynamic parameters. @@ -169,7 +169,7 @@ rest_command: ### How to test your new REST command -Call the new service from [developer tools](/docs/tools/dev-tools/) in the sidebar with some `data` like: +Call the new action from [developer tools](/docs/tools/dev-tools/) in the sidebar with some `data` like: ```json { diff --git a/source/_integrations/rflink.markdown b/source/_integrations/rflink.markdown index 4479a40d2c1d..22f0842d6101 100644 --- a/source/_integrations/rflink.markdown +++ b/source/_integrations/rflink.markdown @@ -26,9 +26,9 @@ The 433 MHz spectrum is used by many manufacturers mostly using their own protoc RFLink Gateway supports a number of RF frequencies, using a wide range of low-cost hardware. [Their website](https://www.rflink.nl) provides details for various RF transmitters, receivers and transceiver modules for 433MHz, 868MHz and 2.4 GHz. -<div class='note'> -Note: Versions later than R44 add support for Ikea Ansluta, Philips Living Colors Gen1 and MySensors devices. -</div> +{% note %} +Versions later than R44 add support for IKEA Ansluta, Philips Living Colors Gen1 and MySensors devices. +{% endnote %} A complete list of devices supported by RFLink can be found [here](https://www.rflink.nl/devlist.php). @@ -105,15 +105,13 @@ Other methods of exposing the serial interface over TCP are possible (eg: ESP826 Tested with Wifi serial bridge [esp-link V2.2.3](https://github.com/jeelabs/esp-link/releases/tag/v2.2.3) running on a NodeMCU (ESP8266 Wifi module) with ESP8266 TXD0 (pin D10) and RXD0 (pin D9) connected to Arduino MEGA 2560 RX (Pin 2) and TX (Pin 3) respectively. -<div class='note warning'> - +{% tip %} Due to different logic levels, a voltage level shifter is required between the 3.3V NodeMCU and 5V Arduino MEGA 2560 pins. The BSS138 bidirectional logic level converter has been tested for serial pins and the [link](https://aliexpress.com/item/32238089139.html) is recommended for the CC2500 transceiver (used for IKEA Ansluta and Philips Living Colors) +{% endtip %} -</div> - -<div class='note'> +{% tip %} When re-flashing the Arduino MEGA, disconnect the ESP8266 to avoid programming difficulties. -</div> +{% endtip %} ```yaml # Example configuration.yaml entry diff --git a/source/_integrations/rfxtrx.markdown b/source/_integrations/rfxtrx.markdown index a1c876e043b5..f69773c858bd 100644 --- a/source/_integrations/rfxtrx.markdown +++ b/source/_integrations/rfxtrx.markdown @@ -91,7 +91,7 @@ connection: &rfxtrx ## Settings options -To configure options for RFXtrx integration go to **Settings** -> **Devices & Services** and press **Options** on the RFXtrx card. +To configure options for RFXtrx integration, go to **Settings** > **Devices & services** and select **Options** on the RFXtrx card. <img src='/images/integrations/rfxtrx/options.png' /> @@ -177,9 +177,9 @@ Some protocols, like `undecoded`, cannot be enabled in non-volatile memory and m To configure device options, select a device from the list under *Select device to configure*. After pressing *Submit* a window with device options are presented based on the device type. -<div class='note warning'> +{% important %} If a device is missing from the list, close the options window and either make sure the device sents a command or manually re-add the device by event code. -</div> +{% endimportant %} #### Off delay @@ -335,11 +335,11 @@ automation: entity_id: scene.welcomescene ``` -## Services +## Actions - `rfxtrx.send`: Send a custom event using the RFXtrx device. -### Service: Send +### Action: Send Simulate a button being pressed: @@ -353,8 +353,8 @@ action: Alternatively: -- Go to: {% my developer_call_service title="Developer tools -> Services" service="rfxtrx.send" %} -- Select: `RFXCOM RFXtrx: Send` from the Service drop-down menu. +- Go to: {% my developer_call_service title="**Developer tools** > **Actions**" service="rfxtrx.send" %} +- Select: `RFXCOM RFXtrx: Send` from the **Action** drop-down menu. ```yaml service: rfxtrx.send diff --git a/source/_integrations/ring.markdown b/source/_integrations/ring.markdown index 9726760b5870..ab8109775ac9 100644 --- a/source/_integrations/ring.markdown +++ b/source/_integrations/ring.markdown @@ -41,9 +41,9 @@ There is currently support for the following device types within Home Assistant: - [Switch](#switch) - [Light](#light) -<p class='note'> +{% note %} This integration does NOT allow for live viewing of your Ring camera within Home Assistant. -</p> +{% endnote %} {% include integrations/config_flow.md %} @@ -57,9 +57,9 @@ Once you have enabled the [Ring integration](/integrations/ring), you can start ## Camera -<div class='note'> +{% important %} Please note that downloading and playing Ring video will require a Ring Protect plan. -</div> +{% endimportant %} Once you have enabled the [Ring integration](/integrations/ring), you can start using the camera platform. Currently, it supports doorbell and stickup cameras. diff --git a/source/_integrations/risco.markdown b/source/_integrations/risco.markdown index 68925be1ba72..f2992d5cdefa 100644 --- a/source/_integrations/risco.markdown +++ b/source/_integrations/risco.markdown @@ -27,13 +27,13 @@ This integration connects with Risco Alarms, in one of two ways: The integration will connect with your alarm over [Risco Cloud](https://riscocloud.com/). This is easiest to configure, and is widely supported, but is cloud based, and requires polling. -<div class='note'> +{% important %} As of January 2021, Risco have implemented charges for use of their Cloud Features. -</div> +{% endimportant %} -<div class='note warning'> +{% tip %} It is recommended to use a regular (non-owner) account with the Risco app/website, and use a different regular account with the integration. Risco has restrictions on concurrent uses by different users, especially if they have different permission levels. -</div> +{% endtip %} 4 sensors will be created to store events, depending on the category (Status, Alarm, Trouble and Other). Each sensor has the event timestamp as the state, and other event information in attributes. diff --git a/source/_integrations/roborock.markdown b/source/_integrations/roborock.markdown index 20983271ff5b..1472b0f7d915 100644 --- a/source/_integrations/roborock.markdown +++ b/source/_integrations/roborock.markdown @@ -15,7 +15,6 @@ ha_iot_class: Local Polling ha_release: 2023.5 ha_config_flow: true ha_codeowners: - - '@humbertogontijo' - '@Lash-L' ha_domain: roborock ha_platforms: @@ -41,7 +40,7 @@ Once you log in with your Roborock account, the integration will automatically d {% include integrations/config_flow.md %} -## Entities +## Robovac entities Roborock devices have a variety of features that are supported on some devices but not on others. Only entities that your device supports will be added to your integration. @@ -133,6 +132,39 @@ Reset air filter - The air filter is expected to be replaced every 150 hours. You can see all the maps within your Roborock account. Keep in mind that they are device-specific. The maps require the cloud API to communicate as the maps are seemingly stored on the cloud. If someone can figure out a way around this - contributions are always welcome. +## Dyad entities + +Roborock wet/dry vacuums currently expose some entities through an MQTT connection - it is currently cloud dependent. + +### Sensor + +Status - The current status of your vacuum. This typically describes the action that is currently being run. For example, 'drying' or 'charging'. + +Battery - The current charge of your device. + +Filter time left - how long until Roborock recommends cleaning/replacing your filter. + +Brush time left - how long until Roborock recommends cleaning/replacing your brush. + +Error - the current error of the device - if one exists - "None" otherwise. + +Total cleaning time - how long you have cleaned with your wet/dry vacuum. + + +## Zeo Entities + +Roborock Zeo One currently exposes some entities through an MQTT connection - it is currently cloud dependent. + +### Sensor + +State - The current state of your washing machine. For example, 'washing' or 'rinsing'. + +Countdown - Countdown for how long until the machine starts. + +Washing left - The amount of time until your machine is done washing. + +Error - The current error of the Zeo, if one exists. + ## FAQ ### Can I use the Mi home app with this integration? @@ -156,20 +188,33 @@ We are working on adding a lot of features to the core integration. We have reve ### How can I clean a specific room? We plan to make the process simpler in the future, but for now, it is a multi-step process. 1. Make sure to first name the rooms in the Roborock app; otherwise, they won't appear in the debug log. -2. Go to {% my developer_call_service service="roborock.get_maps" title="**Developer Tools** > **Services** > **Roborock: Get maps**" %}. Select your vacuum as the entity. Note that room IDs and names are only updated on the currently selected map. If you don't see the rooms you expect, you should select the other map through your app or through the `load_multi_map` service. -You will get a response like this: -```json -vacuum.s7_roborock: - maps: - - flag: 0 - name: Downstairs - rooms: - "16": Kitchen - "17": Living room -``` -3. Go back to {% my developer_call_service service="vacuum.send_command" title="**Developer Tools** > **Services** > **Vacuum: Send Command**" %} then type `app_segment_clean` as your command and `segments` with a list of the 2-digit IDs you want to clean. Then, add `repeat` with a number (ranging from 1 to 3) to determine how many times you want to clean these areas. +2. Go to {% my developer_call_service service="roborock.get_maps" title="**Developer Tools** > **Actions** > **Roborock: Get Maps**" %}. Select your vacuum as the entity. Note that room IDs and names are only updated on the currently selected map. + + - **Request**: Your request should look like: + + ```yaml + service: roborock.get_maps + target: + entity_id: vacuum.s7_roborock + data: {} + ``` + + - **Result**: You will get a response like this: + + ```json + vacuum.s7_roborock: + maps: + - flag: 0 + name: Downstairs + rooms: + "16": Kitchen + "17": Living room + ``` + +3. Go back to {% my developer_call_service service="vacuum.send_command" title="**Developer Tools** > **Actions** > **Vacuum: Send Command**" %} then type `app_segment_clean` as your command and `segments` with a list of the 2-digit IDs you want to clean. Then, add `repeat` with a number (ranging from 1 to 3) to determine how many times you want to clean these areas. Example: + ```yaml service: vacuum.send_command data: diff --git a/source/_integrations/rocketchat.markdown b/source/_integrations/rocketchat.markdown index b9c1f8f3b278..1d2c7cf6dc31 100644 --- a/source/_integrations/rocketchat.markdown +++ b/source/_integrations/rocketchat.markdown @@ -32,7 +32,7 @@ notify: room: YOUR_ROOM_NAME ``` -- `name` (*Optional*): Name displayed in the frontend. The notifier will bind to the service `notify.NOTIFIER_NAME`. +- `name` (*Optional*): Name displayed in the frontend. The notifier will bind to the `notify.NOTIFIER_NAME` action. - `url` (*Required*): The URL of your Rocket.Chat instance. - `username` (*Required*): The Rocket.Chat username. - `password` (*Required*): The Rocker.Chat password. diff --git a/source/_integrations/roku.markdown b/source/_integrations/roku.markdown index 479a2252b0bd..c5fdf9feca07 100644 --- a/source/_integrations/roku.markdown +++ b/source/_integrations/roku.markdown @@ -76,7 +76,7 @@ At the moment, the following buttons are supported: - volume_mute - volume_up -A typical service call for pressing several buttons looks like this. +A typical action for pressing several buttons looks like this. ```yaml service: remote.send_command @@ -95,9 +95,9 @@ When the Home Assistant Roku integration is enabled and a Roku device has been c ## Source Automation -The `media_player.select_source` service may be used to launch specific applications/streaming channels on your Roku device. +The `media_player.select_source` action may be used to launch specific applications/streaming channels on your Roku device. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `entity_id` | no | Target a specific media player. | | `source` | no | An application name or application ID. | Prime Video @@ -132,9 +132,9 @@ Alternatively, you can make a manual HTTP request (GET) to `http://ROKU_IP:8060/ ## TV Channel Tuning -The `media_player.play_media` service may be used to tune to specific channels on your Roku TV device with OTA antenna. +The `media_player.play_media` action may be used to tune to specific channels on your Roku TV device with OTA antenna. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `entity_id` | no | Target a specific media player. | | `media_content_id` | no | A channel number. | 5.1 @@ -154,9 +154,9 @@ action: ## Content Deeplinking -The `media_player.play_media` service may be used to deep link to content within an application. +The `media_player.play_media` action may be used to deep-link to content within an application. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `entity_id` | no | Target a specific media player. | | `media_content_id` | no | A media identifier. | 291097 @@ -190,13 +190,13 @@ Content IDs are unique to each streaming service and vary in format but are ofte | Spotify | 22297 | open.spotify.com/playlist/5xddIVAtLrZKtt4YGLM1SQ | spotify:playlist:5xddIVAtLrZKtt4YGLM1SQ | playlist | YouTube | 837 | youtu.be/6ZMXE5PXPqU | 6ZMXE5PXPqU | live -## Services +## Actions -### Service `roku.search` +### Action `roku.search` -This service allows you to emulate opening the search screen and entering the search keyword. +This action allows you to emulate opening the search screen and entering the search keyword. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `entity_id` | yes | The entities to search on. | media_player.roku | `keyword` | no | The keyword to search for. | Space Jam diff --git a/source/_integrations/romy.markdown b/source/_integrations/romy.markdown index efda02b6c374..5b8607ee1815 100644 --- a/source/_integrations/romy.markdown +++ b/source/_integrations/romy.markdown @@ -27,9 +27,9 @@ This integration currently supports the following models: {% include integrations/config_flow.md %} -## Services +## Actions -Currently supported services are: +Currently supported actions are: - `start` - `pause` diff --git a/source/_integrations/roomba.markdown b/source/_integrations/roomba.markdown index d758f4a9e929..461a3e44e61b 100644 --- a/source/_integrations/roomba.markdown +++ b/source/_integrations/roomba.markdown @@ -29,19 +29,15 @@ The **Roomba** {% term integrations %} allows you to control your [iRobot Roomba <img src='/images/screenshots/more-info-dialog-roomba.png' /> </p> -<div class='note'> - +{% note %} This {% term integrations %} has been tested and confirmed to be working with the iRobot Roomba s9+, Roomba 980, Roomba 960, Roomba 890, and Braava jet m6 models, but should also work fine with any Wi-Fi enabled Roomba or Braava like the 690. For auto-discovery, you will need to initiate a Roomba reboot. For example, by holding the clean button for up to 20 seconds on an i7 or 980. [More information about rebooting your robot](https://homesupport.irobot.com/s/article/9087). - -</div> +{% endnote %} {% include integrations/config_flow.md %} -<div class='note'> - +{% warning %} The Roomba's MQTT server only allows a single connection. Enabling continuous mode will force the App to connect via the cloud to your Roomba. For more information, refer to the [Roomba 980 repository](https://github.com/NickWaterton/Roomba980-Python#firmware-2xx-notes). - -</div> +{% endwarning %} ## Integration entities @@ -75,11 +71,9 @@ For Home Assistant Container, the following command retrieves the BLID (username docker exec -it CONTAINER_NAME_OR_ID python -c 'import roombapy.entry_points; roombapy.entry_points.password()' ROOMBA_IP ``` -<div class='note'> - +{% note %} The command to retrieve the credentials does not need any additional software to be installed because it uses the built-in [roombapy](https://github.com/pschmitt/roombapy) package and [password](https://github.com/pschmitt/roombapy/blob/1.6.1/roomba/entry_points.py#L20) function deployed with Home Assistant. - -</div> +{% endnote %} #### Retrieving credentials from the cloud with dorita980 diff --git a/source/_integrations/roon.markdown b/source/_integrations/roon.markdown index 57587a60ca0e..f3d2131b692e 100644 --- a/source/_integrations/roon.markdown +++ b/source/_integrations/roon.markdown @@ -21,20 +21,20 @@ This integration uses Roon Core, a Roon application that runs on a machine on yo ## Configuration -1. From the Home Assistant front-end, go to {% my integrations title="**Settings** > **Devices & Services**" %}. Select the **Roon** integration. Then, select **Configure**. +1. From the Home Assistant front-end, go to {% my integrations title="**Settings** > **Devices & services**" %}. Select the **Roon** integration. Then, select **Configure**. 2. Home Assistant will then try to find your Roon Core - if it is successful it will display `Authorize HomeAssistant in Roon`. Select **Submit** and skip to step 4. 3. If your Roon Core is not automatically found, enter the `Hostname` or `IP address` for the Roon Core machine when requested and select **Submit**. 4. Home Assistant will then contact your Roon Core and ask to be authorized. You will need to enable this extension in the Room Application. Go to **Settings** and then **Extensions**. There, you will see an entry for Home Assistant with a button next to it. Select **Enable**. 5. Roon core will then provide Home Assistant with the details of your media players. 6. In Home Assistant you can then pick an area for each of your music players, and add them to Home Assistant. -## Services +## Actions -### Service `media_player.play_media` +### Action `media_player.play_media` Roon uses a path based on the roon browser hierarchy to specify which media to play. You can find this by using the media browser, or by following the examples below. If roon can't follow the path you will find an error in the log that will show which part of the path roon could not follow, and the possibilities at that point. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------- | | `entity_id` | yes | Target a specific media player. To target all media players, use `all`. | | `media_content_id` | no | A path to specify the media you want to play, see examples below. | @@ -42,18 +42,18 @@ Roon uses a path based on the roon browser hierarchy to specify which media to p For example to play the album Harvest by Neil Young you should set `media_content_id` to `Library/Artists/Neil Young/Harvest` and to play BBC Radio 4 you would set `media_content_id` to `My Live Radio/BBC Radio 4` -### Service `roon.transfer` +### Action `roon.transfer` Transfer playback from one player to another. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------- | | `entity_id` | yes | id of the source player. | | `transfer_id` | no | id of the destination player. | ## Roon endpoint volume control via Home Assistant -For media players that are not fully integrated into roon, it is possible to use Home Assistant to implement a volume control service. This allows the native Roon apps to change the volume of an endpoint via automation in Home Assistant. +For media players that are not fully integrated into roon, it is possible to use Home Assistant to implement a volume control action. This allows the native Roon apps to change the volume of an endpoint via automation in Home Assistant. For example if you have an amplifier where the volume can be controlled by Home Assistant (perhaps via an integration, or using an IR Blaster) you can have the roon apps use these to change volume. @@ -71,7 +71,7 @@ The Roon volume control will now show plus and minus buttons rather than a volum Clicking on the plus and minus buttons in Roon can now trigger an automation in the volume control entity matching the media_player in Home Assistant. -In this autimation you can use Home Assistant services to provide `volume_up` and `volume_down`. +In this autimation you can use Home Assistant actions to provide `volume_up` and `volume_down`. Here is an example automation using an IR blaster to control `media_player_study` diff --git a/source/_integrations/route53.markdown b/source/_integrations/route53.markdown index 0dd1966bb036..17516970a6a7 100644 --- a/source/_integrations/route53.markdown +++ b/source/_integrations/route53.markdown @@ -14,7 +14,7 @@ related: With the `route53` {% term integration %} can you keep your AWS Route53 DNS records up to date. -The integration will run every hour, but can also be started manually by using the service `route53.update_records` under services. +The integration will run every hour, but can also be started manually by using the `route53.update_records` action. Please note that this platform uses the API from [ipify.org](https://www.ipify.org/) to set the public IP address. @@ -108,8 +108,8 @@ ttl: default: 300 {% endconfiguration %} -## Services +## Actions -### Service `route53.update_records` +### Action `route53.update_records` -Use this service to manually trigger an update of the DNS records. +Use this action to manually trigger an update of the DNS records. diff --git a/source/_integrations/rpi_camera.markdown b/source/_integrations/rpi_camera.markdown index ce1437823663..1b6e6c6ba67e 100644 --- a/source/_integrations/rpi_camera.markdown +++ b/source/_integrations/rpi_camera.markdown @@ -16,9 +16,9 @@ related: The `rpi_camera` {% term integration %} allows you to integrate the Raspberry Pi camera into Home Assistant. This integration uses the application [`raspistill`](https://www.raspberrypi.org/documentation/usage/camera/raspicam/raspistill.md) to store the image from camera. -<div class='note'> +{% important %} This integration is only available on Home Assistant Core installation types. Unfortunately, it cannot be used with Home Assistant OS, Supervised or Container. -</div> +{% endimportant %} ## Configuration diff --git a/source/_integrations/ruckus_unleashed.markdown b/source/_integrations/ruckus_unleashed.markdown index 225742c2f531..0cadb84fcfa5 100644 --- a/source/_integrations/ruckus_unleashed.markdown +++ b/source/_integrations/ruckus_unleashed.markdown @@ -24,7 +24,7 @@ There is currently support for the following device types within Home Assistant: ## Configuration -To add a Ruckus Unleashed device to your installation, go to **Settings** -> **Devices & Services**, click the `+` button, then select **Ruckus** from the list of integrations. +To add a Ruckus Unleashed device to your installation, go to **Settings** -> **Devices & services**, click the `+` button, then select **Ruckus** from the list of integrations. It is required to configure the IP address of your **master access point**. See the section Access Points on the management web interface. And perhaps consider to set a preferred master (Admin & Services>System>System Info>Preferred master). diff --git a/source/_integrations/russound_rio.markdown b/source/_integrations/russound_rio.markdown index c422c5176d48..c9fd3113135e 100644 --- a/source/_integrations/russound_rio.markdown +++ b/source/_integrations/russound_rio.markdown @@ -8,39 +8,14 @@ ha_iot_class: Local Push ha_domain: russound_rio ha_platforms: - media_player +ha_codeowners: + - '@noahhusby' +ha_config_flow: true ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file --- The `russound_rio` {% term integration %} allows you to control Russound devices that make use of the RIO protocol. The platform automatically discovers all enabled zones and sources. Each zone is added as a media player device with the enabled sources available as inputs. Media information is supported if the selected source reports it. -To add a device to your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -media_player: - - platform: russound_rio - host: 192.168.1.10 - name: Russound -``` - -{% configuration %} -host: - description: The IP of the TCP gateway. - required: true - type: string -port: - description: The port of the TCP gateway. - required: false - default: 9621 - type: integer -name: - description: The name of the device. - required: true - type: string -{% endconfiguration %} +{% include integrations/config_flow.md %} diff --git a/source/_integrations/sabnzbd.markdown b/source/_integrations/sabnzbd.markdown index 521d5e46b5e1..677df8dce38f 100644 --- a/source/_integrations/sabnzbd.markdown +++ b/source/_integrations/sabnzbd.markdown @@ -45,29 +45,29 @@ This integration will create these sensors: - `monthly_total`: GB downloaded this month. (disabled by default) -## Services +## Actions -Available services: +Available actions: - `pause`: Pause the download queue. - `resume`: Resume the download queue. - `set_speed`: Set the download queue speed limit. -### Service `sabnzbd.pause` +### Action `sabnzbd.pause` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `api_key` | no | The SABnzbd API key of the service instance (unique per SABnzbd integration). | -### Service `sabnzbd.resume` +### Action `sabnzbd.resume` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `api_key` | no | The SABnzbd API key of the service instance (unique per SABnzbd integration). | -### Service `sabnzbd.set_speed` +### Action `sabnzbd.set_speed` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `speed` | yes | Sets the download speed limit. If specified as a number with no units, will be interpreted as a percent. If units are provided (e.g., 500K) will be interpreted absolutely. Defaults to 100 | | `api_key` | no | The SABnzbd API key of the service instance (unique per SABnzbd integration). | diff --git a/source/_integrations/samsungtv.markdown b/source/_integrations/samsungtv.markdown index bb8bed2e9c25..1bbef85a59c4 100644 --- a/source/_integrations/samsungtv.markdown +++ b/source/_integrations/samsungtv.markdown @@ -53,7 +53,7 @@ Any other [actions](/docs/automation/action/) to power on the device can be conf #### Changing channels -Changing channels can be done by calling the `media_player.play_media` service +Changing channels can be done by calling the `media_player.play_media` action with the following payload: ```yaml @@ -69,7 +69,7 @@ Some older models also expose the installed applications through the WebSocket, ### Remote -The integration supports the `remote` platform. The remote allows you to send key commands to your TV with the `remote.send_command` service. The supported keys vary between TV models. +The integration supports the `remote` platform. The remote allows you to send key commands to your TV with the `remote.send_command` action. The supported keys vary between TV models. {% details "Full keycodes list" %} diff --git a/source/_integrations/scene.markdown b/source/_integrations/scene.markdown index 2624c9c06858..917a069ce33a 100644 --- a/source/_integrations/scene.markdown +++ b/source/_integrations/scene.markdown @@ -23,17 +23,17 @@ The scene entity is stateless, as in, it cannot have a state like the `on` or Every scene entity does keep track of the timestamp of when the last time the scene entity was called via the Home Assistant UI or called via -a service call. +an action. ## Scenes created by integrations -Some integrations like [Philips Hue](/integrations/hue), [MQTT](/integrations/mqtt), and [KNX](/integrations/knx) provide scenes. You can activate them from the Home Assistant UI or via as service calls. In this case, the integration provides the preferred states to restore. +Some integrations like [Philips Hue](/integrations/hue), [MQTT](/integrations/mqtt), and [KNX](/integrations/knx) provide scenes. You can activate them from the Home Assistant UI or via as an action. In this case, the integration provides the preferred states to restore. ## Creating a scene You can create scenes that capture the states you want certain entities to be. For example, a scene can specify that light A should be turned on and light B should be bright red. -Scenes can be created and managed via the user interface using the [Scene Editor](/docs/scene/editor/). They can also be manually configured via {% term "`configuration.yaml`" %}. Note that the entity data is not service call parameters, it's a representation of the wanted state: +Scenes can be created and managed via the user interface using the [Scene Editor](/docs/scene/editor/). They can also be manually configured via {% term "`configuration.yaml`" %}. Note that entity data is not an action parameter; it's a representation of the wanted state: ```yaml # Example configuration.yaml entry @@ -86,7 +86,7 @@ As you can see, there are two ways to define the states of each `entity_id`: - Define the `state` directly with the entity. Be aware, that `state` needs to be defined. - Define a complex state with its attributes. You can see all attributes available for a particular entity under `developer-tools -> state`. -Scenes can be activated using the service `scene.turn_on` (there is no 'scene.turn_off' service). +Scenes can be activated using the `scene.turn_on` action (there is no `scene.turn_off` action). ```yaml # Example automation @@ -104,7 +104,7 @@ automation: ## Applying a scene without defining it -With the `scene.apply` service you are able to apply a scene without first defining it via configuration. Instead, you pass the states as part of the service data. The format of the data is the same as the `entities` field in a configuration. +With the `scene.apply` action you are able to apply a scene without first defining it via configuration. Instead, you pass the states as part of the action data. The format of the data is the same as the `entities` field in a configuration. ```yaml # Example automation @@ -129,7 +129,7 @@ automation: ## Using scene transitions -Both the `scene.apply` and `scene.turn_on` services support setting a transition, +Both the `scene.apply` and `scene.turn_on` actions support setting a transition, which enables you to smoothen the transition to the scene. This is an example of an automation that sets a romantic scene, in which the @@ -157,11 +157,11 @@ only lights to have a transition set. ## Reloading scenes -Whenever you make a change to your scene configuration, you can call the `scene.reload` service to reload the scenes. +Whenever you make a change to your scene configuration, you can call the `scene.reload` action to reload the scenes. ## Creating scenes on the fly -Create a new scene without having to configure it by calling the `scene.create` service. This scene will be discarded after reloading the configuration. +Create a new scene without having to configure it by calling the `scene.create` action. This scene will be discarded after reloading the configuration. You need to pass a `scene_id` in lowercase and with underscores instead of spaces. You also may want to specify the entities in the same format as when configuring the scene. You can also take a snapshot of the current state by using the `snapshot_entities` parameter. In this case, you have to specify the `entity_id` of all entities you want to take a snapshot of. `entities` and `snapshot_entities` can be combined but you have to use at least one of them. @@ -194,11 +194,11 @@ automation: ## Deleting dynamically created scenes -Any scene that you have created with the `scene.create` service can also be deleted on demand with the `scene.delete` service. +Any scene that you have created with the `scene.create` action can also be deleted on demand with the `scene.delete` action. You will need to pass in the `entity_id` of such a scene. As opposed to the `scene_id` used for creation, the `entity_id` must also include the `scene` domain. -If the scene was not previously created by `scene.create`, the service call will fail and an error will appear in the logs. +If the scene was not previously created by `scene.create`, the action will fail and an error will appear in the logs. ```yaml # Example automation diff --git a/source/_integrations/scene.mqtt.markdown b/source/_integrations/scene.mqtt.markdown index a2e7212481c9..f7ec95cbeace 100644 --- a/source/_integrations/scene.mqtt.markdown +++ b/source/_integrations/scene.mqtt.markdown @@ -177,11 +177,9 @@ unique_id: type: string {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/schedule.markdown b/source/_integrations/schedule.markdown index 9c3fd47268bc..1a9194ed7a23 100644 --- a/source/_integrations/schedule.markdown +++ b/source/_integrations/schedule.markdown @@ -17,7 +17,7 @@ Home Assistant that can be used to trigger or make decisions in your automations and scripts. The preferred way to configure a schedule is via the user interface at -**{% my helpers title="Settings > Devices & Services > Helpers." %}** Click the add button +**{% my helpers title="Settings > Devices & services > Helpers." %}** Click the add button and then choose the **{% my config_flow_start domain=schedule title="Schedule" %}** option, or click the My button below. {% include integrations/config_flow.md %} @@ -118,10 +118,10 @@ trigger: entity_id: climate.thermostat ``` -### Services +### Actions -Available service: `schedule.reload`. +Available action: `schedule.reload`. #### schedule.reload -`schedule.reload` service allows one to reload the schedule's configuration without restarting Home Assistant itself. +`schedule.reload` action allows one to reload the schedule's configuration without restarting Home Assistant itself. diff --git a/source/_integrations/schluter.markdown b/source/_integrations/schluter.markdown index a966bf1a7e0b..c97f59da4519 100644 --- a/source/_integrations/schluter.markdown +++ b/source/_integrations/schluter.markdown @@ -18,9 +18,9 @@ related: The `schluter` {% term integration %} allows you to integrate your [Schluter-DITRA-HEAT-E-WiFi](https://www.schluter.com/schluter-us/en_US/ditra-heat-wifi) electric floor heating thermostat in Home Assistant. -<div class='note'> +{% important %} You will need to create a Schluter DITRA-HEAT account and register your thermostat with it. This can be done via the thermostat touchscreen, where an email will be sent to you to confirm your account. -</div> +{% endimportant %} ## Configuration diff --git a/source/_integrations/scrape.markdown b/source/_integrations/scrape.markdown index 4853f4e7a42d..855d43b264dd 100644 --- a/source/_integrations/scrape.markdown +++ b/source/_integrations/scrape.markdown @@ -184,7 +184,7 @@ scrape: ### Available implementations -Get the counter for all our implementations from the integrations page under {% my integrations title="**Settings** > **Devices & Services**" %}. +Get the counter for all our implementations from the integrations page under {% my integrations title="**Settings** > **Devices & services**" %}. {% raw %} diff --git a/source/_integrations/screenlogic.markdown b/source/_integrations/screenlogic.markdown index 9d8bae43ec64..d249edcb17d8 100644 --- a/source/_integrations/screenlogic.markdown +++ b/source/_integrations/screenlogic.markdown @@ -32,17 +32,17 @@ The Pentair ScreenLogic integration allows you to integrate your Pentair Intelli ## Options -ScreenLogic options are set via **Settings** -> **Devices & Services** -> **Pentair ScreenLogic** -> **Options**. +ScreenLogic options are set via **Settings** > **Devices & services** > **Pentair ScreenLogic** > **Options**. -= Seconds between scans - How many seconds between each polling of the ScreenLogic gateway. -## Services +## Actions ### `screenlogic.set_color_mode` Sets the operation of any connected color-capable lights. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------- | | `config_entry` | no | Integration entry_id of the ScreenLogic instance you wish to set the color mode on. | | `color_mode` | no | The color mode to set. Valid values are listed below. | @@ -51,7 +51,7 @@ Sets the operation of any connected color-capable lights. Begins super chlorination, running for the specified period or 24 hours if none is specified. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------- | | `config_entry` | no | Integration entry_id of the ScreenLogic instance you wish to start super chlorination on. | | `runtime` | yes | Number of hours to run super chlorination for. Defaults to 24 hours. | @@ -60,7 +60,7 @@ Begins super chlorination, running for the specified period or 24 hours if none Stops super chlorination. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------- | | `config_entry` | no | Integration entry_id of the ScreenLogic instance you wish to stop super chlorination on. | diff --git a/source/_integrations/script.markdown b/source/_integrations/script.markdown index 339c872932ca..dc9f74f08157 100644 --- a/source/_integrations/script.markdown +++ b/source/_integrations/script.markdown @@ -11,7 +11,7 @@ ha_domain: script ha_integration_type: system --- -The script integration allows users to specify a sequence of actions to be executed by Home Assistant. These are run when you turn the script on. The script integration will create an entity for each script and allow them to be controlled via services. +The script integration allows users to specify a sequence of actions to be executed by Home Assistant. These are run when you turn the script on. The script integration will create an entity for each script and allow them to be controlled via actions. Scripts can be created via YAML configuration (described below) or via {% my scripts title="the UI" %}. @@ -36,11 +36,9 @@ script: {% endraw %} -<div class='note'> - +{% important %} Script names (e.g., `message_temperature` in the example above) are not allowed to contain capital letters, or dash (minus) characters, i.e., `-`. The preferred way to separate words for better readability is to use underscore (`_`) characters. - -</div> +{% endimportant %} {% configuration %} alias: @@ -52,7 +50,7 @@ icon: required: false type: string description: - description: A description of the script that will be displayed in the Services tab under Developer Tools. + description: A description of the script that will be displayed in the **Actions** tab under **Developer tools**. required: false default: '' type: string @@ -90,7 +88,7 @@ fields: type: boolean default: false example: - description: An example value. This will only be shown in table of options available in the Services tab of the Developer Tools. + description: An example value. This will only be shown in table of options available in the **Actions** tab of the **Developer tools**. type: string default: description: The default value for this field, as shown in the UI. @@ -137,7 +135,7 @@ Mode | Description ### Passing variables to scripts -As part of the service, variables can be passed along to a script so they become available within templates in that script. +As part of the action, variables can be passed along to a script so they become available within templates in that script. To configure a script to accept variables using the UI, the variables can be added as fields in the script editor. 1. In the script editor, in the 3-dots menu, select **Add fields**. @@ -172,7 +170,7 @@ script: ``` {% endraw %} -Aside from the automation editor UI, variables can be passed to scripts within the service data. This can be used either by calling the script directly or the generic `script.turn_on` service. The difference is described in [Waiting for Script to Complete](#waiting-for-script-to-complete). All service data will be made available as variables in templates, even if not specified as fields in the script. This example shows how to call the script directly: +Aside from the automation editor UI, variables can be passed to scripts within the action data. This can be used either by calling the script directly or the generic `script.turn_on` action. The difference is described in [Waiting for Script to Complete](#waiting-for-script-to-complete). All action data will be made available as variables in templates, even if not specified as fields in the script. This example shows how to call the script directly: {% raw %} ```yaml @@ -191,7 +189,7 @@ automation: ``` {% endraw %} -This example shows using `script.turn_on` service: +This example shows using `script.turn_on` action: {% raw %} ```yaml @@ -215,21 +213,21 @@ automation: -<div class='note'> +{% note %} Script variables that may be used by templates include the following: - those provided from the configuration as fields -- those that are passed as data when started from a service, +- those that are passed as data when started from an action, - the `this` variable the value of which is a dictionary of the current script's state. -</div> +{% endnote %} ### Waiting for Script to Complete When calling a script "directly" (e.g., `script.NAME`) the calling script will wait for the called script to finish. If any errors occur that cause the called script to abort, the calling script will be aborted as well. -When calling a script (or multiple scripts) via the `script.turn_on` service the calling script does _not_ wait. It starts the scripts, in the order listed, and continues as soon as the last script is started. +When calling a script (or multiple scripts) via the `script.turn_on` action the calling script does _not_ wait. It starts the scripts, in the order listed, and continues as soon as the last script is started. Any errors that occur in the called scripts that cause them to abort will _not_ affect the calling script. <p class='img'> diff --git a/source/_integrations/scsgate.markdown b/source/_integrations/scsgate.markdown index 22f6debf8ba6..733c29caef4f 100644 --- a/source/_integrations/scsgate.markdown +++ b/source/_integrations/scsgate.markdown @@ -88,11 +88,9 @@ devices: type: string {% endconfiguration %} -<div class='note'> - +{% note %} **Known limitation:** It is not possible to know the current state of the cover. - -</div> +{% endnote %} ### Light diff --git a/source/_integrations/select.markdown b/source/_integrations/select.markdown index 1c1f06510277..d65640f3b7e4 100644 --- a/source/_integrations/select.markdown +++ b/source/_integrations/select.markdown @@ -17,19 +17,19 @@ a limited set of selectable options for the entity. {% include integrations/building_block_integration.md %} -## Services +## Actions -The select entity exposes additional services to control the entity in, for example, -automation or scripts. These services can be created via the UI, but are +The select entity exposes additional actions to control the entity in, for example, +automation or scripts. These actions can be created via the UI, but are also available in YAML (for which examples are provided below). -### Service `select.select_first` +### Action `select.select_first` -The {% my developer_call_service service="select.select_first" %} service +The {% my developer_call_service service="select.select_first" %} action changes the selected option of the select entity to the first option in the list of options available. -This service does not have additional options. +This action does not have additional options. {% my developer_call_service badge service="select.select_first" %} @@ -41,13 +41,13 @@ target: entity_id: select.my_entity ``` -### Service `select.select_last` +### Action `select.select_last` -The {% my developer_call_service service="select.select_last" %} service changes +The {% my developer_call_service service="select.select_last" %} action changes the selected option of the select entity to the last option in the list of options available. -This service does not have additional options. +This action does not have additional options. {% my developer_call_service badge service="select.select_last" %} @@ -59,9 +59,9 @@ target: entity_id: select.my_entity ``` -### Service `select.select_next` +### Action `select.select_next` -The {% my developer_call_service service="select.select_next" %} service changes +The {% my developer_call_service service="select.select_next" %} action changes the selected option of the select entity to the next option in the list of options available. If the current select option is unknown, the first option in the list is selected instead. @@ -69,7 +69,7 @@ in the list is selected instead. In case the current select option is the last option in the list, it will by default, cycle back the first option and select that one instead. This cycle behavior can be disabled by setting the `cycle` option to `false` in the -service call data. +action data. {% my developer_call_service badge service="select.select_next" %} @@ -90,13 +90,13 @@ data: cycle: false ``` -### Service `select.select_option` +### Action `select.select_option` -The {% my developer_call_service service="select.select_option" %} service +The {% my developer_call_service service="select.select_option" %} action changes the selected option to a specific desired option provided in the -service call using the required `option` service call data. +action using the required `option` action data. -The service call will not succeed if the selected option is not available in +The action call will not succeed if the selected option is not available in the list of options for the targeted entity. {% my developer_call_service badge service="select.select_option" %} @@ -111,9 +111,9 @@ data: option: "example_option" ``` -### Service `select.select_previous` +### Action `select.select_previous` -The {% my developer_call_service service="select.select_previous" %} service +The {% my developer_call_service service="select.select_previous" %} action changes the selected option of the select entity to the previous option in the list of options available. If the current select option is unknown, the last option in the list is selected instead. @@ -121,7 +121,7 @@ last option in the list is selected instead. In case the current select option is the first option in the list, it will by default, cycle back the last option and select that one instead. This cycle behavior can be disabled by setting the `cycle` option to `false` in the -service call data. +action data. {% my developer_call_service badge service="select.select_previous" %} diff --git a/source/_integrations/select.mqtt.markdown b/source/_integrations/select.mqtt.markdown index 5ed057fbe405..dcd782ccb384 100644 --- a/source/_integrations/select.mqtt.markdown +++ b/source/_integrations/select.mqtt.markdown @@ -186,8 +186,6 @@ value_template: type: template {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} diff --git a/source/_integrations/sendgrid.markdown b/source/_integrations/sendgrid.markdown index d1f0ca729c07..401d8eff45c9 100644 --- a/source/_integrations/sendgrid.markdown +++ b/source/_integrations/sendgrid.markdown @@ -37,7 +37,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string diff --git a/source/_integrations/sense.markdown b/source/_integrations/sense.markdown index a622c5f10acc..72c60f33a325 100644 --- a/source/_integrations/sense.markdown +++ b/source/_integrations/sense.markdown @@ -47,8 +47,6 @@ Binary sensors are created for each of the devices detected by your Sense monito Sensors are created for each of the devices detected by your Sense monitor to show their power usage in Watts. -<div class='note'> - +{% note %} The [Emulated Kasa](/integrations/emulated_kasa) integration can be used to expose devices in Home Assistant to the Sense Monitor by emulating TP-Link Kasa Smart Plugs. - -</div> +{% endnote %} diff --git a/source/_integrations/sensibo.markdown b/source/_integrations/sensibo.markdown index c62f885ba021..66ce6489eafe 100644 --- a/source/_integrations/sensibo.markdown +++ b/source/_integrations/sensibo.markdown @@ -39,11 +39,12 @@ Integrates [Sensibo](https://sensibo.com) devices into Home Assistant. ## Prerequisites Please click [here](https://home.sensibo.com/me/api) and register to obtain the API key. -<div class="note"> + +{% tip %} If you create the API key using a dedicated user (and not your main user), then in the Sensibo app log you will be able to distinguish between actions done in the app and actions done by Home Assistant. -</div> +{% endtip %} {% include integrations/config_flow.md %} @@ -136,25 +137,25 @@ For climate devices, these switches are available: Support to enable/disable a timer to delay a start or stop (depending on the current state) of your device. -The switch uses a timer of 60 minutes delay. You can choose a custom delay using the custom `sensibo.enable_timer` service. See [Timer](#timer). +The switch uses a timer of 60 minutes delay. You can choose a custom delay using the custom `sensibo.enable_timer` action. See [Timer](#timer). Support to enable/disable Climate React -Usage of the Climate React switch requires that the service has been configured previously in the app or by using the custom `sensibo.enable_climate_react` service. See [Climate React](#climate-react) +Usage of the Climate React switch requires that the action has been configured previously in the app or by using the custom `sensibo.enable_climate_react` action. See [Climate React](#climate-react) For Pure devices, this integration provides support to enable/disable Pure Boost. -To customize the settings of Pure Boost, you can use the custom `sensibo.enable_pure_boost` service. See [Pure Boost](#pure-boost) +To customize the settings of Pure Boost, you can use the custom `sensibo.enable_pure_boost` action. See [Pure Boost](#pure-boost) -## Custom services +## Custom actions ### Full state -You can send a full state command to Sensibo instead of single commands using the service `sensibo.full_state`. +You can send a full state command to Sensibo instead of single commands using the `sensibo.full_state` action. All fields are required to be according to Sensibo API specifications and are case-sensitive. -To see the options for each field to use this service: +To see the options for each field to use this action: 1. Switch to the relevant HVAC mode (not all HVAC modes have the same options). 2. Retrieve the options for `fan_modes` and `swing_modes` from the climate entity's attributes. @@ -162,29 +163,29 @@ To see the options for each field to use this service: ### Assume state -For devices which are also controlled in other ways or often goes out of sync with Sensibo there is a `sensibo.assume_state` service. +For devices which are also controlled in other ways or often goes out of sync with Sensibo there is a `sensibo.assume_state` action. -With this service you can tell Sensibo if your device is currently running or not without sending a new command to you device. +With this action you can tell Sensibo if your device is currently running or not without sending a new command to you device. ### Pure Boost -You can configure your Pure Boost settings using the services `sensibo.enable_pure_boost`. +You can configure your Pure Boost settings using the `sensibo.enable_pure_boost` action. -- Enable Pure Boost will enable the service with configured settings +- Enable Pure Boost will enable the action with configured settings Using Geo integration for Pure Boost is only possible by pre-configuration of Presence within the app. ### Timer -You can enable a timer with a custom delay using the service `sensibo.enable_timer` that is provided. +You can enable a timer with a custom delay using the `sensibo.enable_timer` action that is provided. ### Climate React -You can configure your Climate React settings using the services `sensibo.enable_climate_react`. +You can configure your Climate React settings using the `sensibo.enable_climate_react` action. -- Configuring this service also turns Climate React on +- Configuring this action also turns Climate React on -When using the service, the state needs to be set to precisely what Sensibo API expects. The first time it's recommended to use the app to configure it. From that point, you can see what the API requires and how to write from the Climate React switch attribute. +When using the action, the state needs to be set to precisely what Sensibo API expects. The first time it's recommended to use the app to configure it. From that point, you can see what the API requires and how to write from the Climate React switch attribute. Example for low threshold state: diff --git a/source/_integrations/sensor.mqtt.markdown b/source/_integrations/sensor.mqtt.markdown index e8b9a637cce4..ebc059543e47 100644 --- a/source/_integrations/sensor.mqtt.markdown +++ b/source/_integrations/sensor.mqtt.markdown @@ -350,7 +350,11 @@ mqtt: {% endraw %} -The state and the attributes of the sensor by design do not update in a synchronous manner if they share the same MQTT topic. Temporal mismatches between the state and the attribute data may occur if both the state and the attributes are changed simultaneously by the same MQTT message. An automation that triggers on any state change of the sensor will also trigger both on the change of the state or a change of the attributes. Such automations will be triggered twice if both the state and the attributes change. Please use a [MQTT trigger](/docs/automation/trigger/#mqtt-trigger) and process the JSON in the automation directly via the {% raw %}`{{ trigger.payload_json }}`{% endraw %} [trigger data](/docs/automation/templating/#mqtt) for automations that must synchronously handle multiple JSON values within the same MQTT message. +{% warning %} +If `json_attributes_topic` and `state_topic` share the same topic, a state update will happen only once, unless the state update did not change the state or `force_update` was set to `true`. + +Setting up MQTT sensor's with extra state attributes that contain values that change at every update, like timestamps, or enabling the `force_update` option, is discouraged, as this will trigger state writes for every update. This can have a serious impact on the total system performance. A better option is creating separate sensors instead. +{% endwarning %} ### Usage of `entity_id` in the template diff --git a/source/_integrations/sensor.rest.markdown b/source/_integrations/sensor.rest.markdown index 0187568e5fe0..94a9c6108a44 100644 --- a/source/_integrations/sensor.rest.markdown +++ b/source/_integrations/sensor.rest.markdown @@ -151,11 +151,9 @@ verify_ssl: default: True {% endconfiguration %} -<div class='note'> - +{% important %} Use either `resource` or `resource_template`. - -</div> +{% endimportant %} `curl` can help you identify the variable you want to display in your Home Assistant frontend. The example below shows the JSON response of a device that is running with [aREST](https://arest.io/). diff --git a/source/_integrations/sentry.markdown b/source/_integrations/sentry.markdown index 5370225c8e7a..60360e6a6ac6 100644 --- a/source/_integrations/sentry.markdown +++ b/source/_integrations/sentry.markdown @@ -13,11 +13,9 @@ ha_domain: sentry ha_integration_type: service --- -<div class='note warning'> - - The free Sentry account allows 5000 events per month. Depending on the amount of events sent to Sentry, you will either have to upgrade your Sentry account or have a period without data flowing from Home Assistant to Sentry. - -</div> +{% important %} +The free Sentry account allows 5000 events per month. Depending on the amount of events sent to Sentry, you will either have to upgrade your Sentry account or have a period without data flowing from Home Assistant to Sentry. +{% endimportant %} The Sentry integration in Home Assistant integrates with [Sentry](https://sentry.io/) to capture both logged errors as well as unhandled exceptions in Home Assistant. @@ -46,6 +44,6 @@ The Sentry integration provides settings to: - Ability to send out events originating from third-party Python packages. - Enable performance tracing and tune the tracing sample rate used. -To change the settings, go to {% my integrations title="**Settings** > **Devices & Services**" %}. Select the **Sentry** integration. Then, select **Options**. +To change the settings, go to {% my integrations title="**Settings** > **Devices & services**" %}. Select the **Sentry** integration. Then, select **Options**. After changing the Sentry settings, you'll need to restart Home Assistant in order to make them effective. diff --git a/source/_integrations/seventeentrack.markdown b/source/_integrations/seventeentrack.markdown index 0d589bf49605..8ed82d5d3aef 100644 --- a/source/_integrations/seventeentrack.markdown +++ b/source/_integrations/seventeentrack.markdown @@ -16,11 +16,9 @@ ha_integration_type: service The seventeentrack {% term integration %} allows users to get package data tied to their [17track.net](https://www.17track.net) account. The integration creates both summary sensors, which show the number of packages in a current state (e.g., "In Transit"), as well as individual sensors for each package within the account. -<div class='note warning'> - +{% important %} Although the 17track.net website states that account passwords cannot be longer than 16 characters, users can technically set longer-than-16-character passwords. These passwords **will not** work with the used API. Therefore, please ensure that your 17track.net password does not exceed 16 characters. - -</div> +{% endimportant %} {% include integrations/config_flow.md %} @@ -75,14 +73,14 @@ content: > {% endraw %} -## Services +## Actions -### Service `seventeentrack.get_packages` +### Action `seventeentrack.get_packages` -The `seventeentrack.get_packages` service allows you to query the 17track API for the latest package data. +The `seventeentrack.get_packages` action allows you to query the 17track API for the latest package data. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|---------------------------------------------| | `config_entry_id` | No | The ID of the 17Track service config entry. | | `package_state` | yes | A list of the package states. | diff --git a/source/_integrations/sharkiq.markdown b/source/_integrations/sharkiq.markdown index 1d38e4187fe8..b8eeb4cdc5b6 100644 --- a/source/_integrations/sharkiq.markdown +++ b/source/_integrations/sharkiq.markdown @@ -19,9 +19,9 @@ The `sharkiq` integration allows you to control your [Shark IQ](https://www.shar {% include integrations/config_flow.md %} -## Services +## Actions -Currently supported [`vacuum`](/integrations/vacuum/) services are: +Currently supported [`vacuum`](/integrations/vacuum/) actions are: - `start` - `pause` @@ -31,7 +31,8 @@ Currently supported [`vacuum`](/integrations/vacuum/) services are: - `set_fan_speed` ### Room Targeting -In addition to the [`vacuum`](/integrations/vacuum/) services, this integration supports room targeting. + +In addition to the [`vacuum`](/integrations/vacuum/) actions, this integration supports room targeting. This allows you to select specific rooms that you want cleaned, instead of doing a whole-home clean. ```yaml @@ -43,11 +44,11 @@ data: target: entity_id: vacuum.my_vacuum ``` -**Important Note:** The list of rooms must be written _exactly_ as they appear in the Shark Clean app. If you want exact names that the service will understand, +**Important Note:** The list of rooms must be written _exactly_ as they appear in the Shark Clean app. If you want exact names that the action will understand, look for the `Rooms` attribute of your Shark Robot Vacuum in Home Assistant. This will be populated with the rooms that the robot has configured, as they will be -understood by the service. +understood by the action. -If you want to use the area selector in the service's UI, you need to format the area names exactly as they appear in the vacuum's `Rooms` attribute. You may also check the attribute using Home Assistant's [Developer Tools](https://www.home-assistant.io/docs/tools/dev-tools/). +If you want to use the area selector in the action's UI, you need to format the area names exactly as they appear in the vacuum's `Rooms` attribute. You may also check the attribute using Home Assistant's [Developer Tools](https://www.home-assistant.io/docs/tools/dev-tools/). <p class='img'> <img src='/images/integrations/sharkiq/sharkiq-room-service-attributes.png' /> </p> @@ -58,4 +59,4 @@ If you want to use the area selector in the service's UI, you need to format the If the integration frequently disconnects and you have an ad blocker runner like [Pi-hole](https://pi-hole.net/) or [AdGuard](https://adguard.com) add `ads-field.aylanetworks.com` to the Allow list . This domain is needed for the connection and can be part of the automatic blocking because of `ads` being part of the subdomain. -If `pause` does not work for you, then it is not supported by your vacuum. The `stop` service will provide similar functionality. +If `pause` does not work for you, then it is not supported by your vacuum. The `stop` action will provide similar functionality. diff --git a/source/_integrations/shell_command.markdown b/source/_integrations/shell_command.markdown index 280cf33f7ab7..2944aad72dbc 100644 --- a/source/_integrations/shell_command.markdown +++ b/source/_integrations/shell_command.markdown @@ -12,7 +12,7 @@ ha_domain: shell_command ha_integration_type: integration --- -This integration can expose regular shell commands as services. Services can be called from a [script] or in [automation]. +This integration can expose regular shell commands as actions. Actions can be called from a [script] or in [automation]. Shell commands aren't allowed for a camel-case naming, please use lowercase naming only and separate the names with underscores. Note that the shell command process will be terminated after 60 seconds, full stop. There is no option to alter this behavior, this is by design because Home Assistant is not intended to manage long-running external processes. @@ -24,7 +24,7 @@ Note that the shell command process will be terminated after 60 seconds, full st ```yaml # Example configuration.yaml entry -# Exposes service shell_command.restart_pow +# Exposes action shell_command.restart_pow shell_command: restart_pow: touch ~/.pow/restart.txt ``` @@ -38,7 +38,7 @@ alias: The commands can be dynamic, using templates to insert values for arguments. When using templates, shell_command runs in a more secure environment which doesn't allow any shell helpers like automatically expanding the home dir `~` or using pipe symbols to run multiple commands. Similarly, only content after the first space can be generated by a template. This means the command name itself cannot be generated by a template, but it must be literally provided. -Any service data passed into the service call to activate the shell command will be available as a variable within the template. +Any action data passed into the action to activate the shell command will be available as a variable within the template. `stdout` and `stderr` output from the command are both captured and will be logged by setting the [log level](/integrations/logger/) to debug. @@ -46,17 +46,15 @@ Any service data passed into the service call to activate the shell command will The `command` is executed within the [configuration directory](/docs/configuration/). -<div class='note'> - +{% tip %} If you are using [Home Assistant Operating System](https://github.com/home-assistant/operating-system), the commands are executed in the `homeassistant` container context. So if you test or debug your script, it might make sense to do this in the context of this container to get the same runtime environment. - -</div> +{% endtip %} A `0` exit code means the commands completed successfully without error. In case a command results in a non `0` exit code or is terminated after a timeout of 60 seconds, the result is logged to Home Assistant log. ## Response -Shell commands provide a service response in a dictionary containing `stdout`, `stderr`, and `returncode`. These can be used in automations to act upon the command results using [`response_variable`](/docs/scripts/service-calls#use-templates-to-handle-response-data). +Shell commands provide an action response in a dictionary containing `stdout`, `stderr`, and `returncode`. These can be used in automations to act upon the command results using [`response_variable`](/docs/scripts/service-calls#use-templates-to-handle-response-data). ## Examples diff --git a/source/_integrations/shelly.markdown b/source/_integrations/shelly.markdown index 818196d5fe98..89408053cd65 100644 --- a/source/_integrations/shelly.markdown +++ b/source/_integrations/shelly.markdown @@ -9,8 +9,10 @@ ha_category: - Event - Light - Number + - Select - Sensor - Switch + - Text - Update - Valve ha_release: 0.115 @@ -34,8 +36,10 @@ ha_platforms: - event - light - number + - select - sensor - switch + - text - update - valve ha_integration_type: device @@ -74,9 +78,9 @@ Generation 2 and 3 devices use the `RPC` protocol to communicate with the integr `ws://` + `Home_Assistant_local_ip_address:Port` + `/api/shelly/ws` (for example: `ws://192.168.1.100:8123/api/shelly/ws`), click **Apply** to save the settings. In case your installation is set up to use SSL encryption (HTTP**S** with certificate), an additional `s` needs to be added to the WebSocket protocol, too, so that it reads `wss://` (for example: `wss://192.168.1.100:8123/api/shelly/ws`). -<div class="note"> +{% note %} Integration is communicating directly with the device; cloud connection is not needed. -</div> +{% endnote %} ## Bluetooth Support @@ -226,11 +230,9 @@ You can also create automations using YAML, for example: Generation 2 and 3 devices use the values `btn_down`, `btn_up`, `single_push`, `double_push`, `triple_push` and `long_push` as `click_type`. -<div class="note"> - +{% note %} Not all devices support all input events. You can check on [Shelly API Reference](https://shelly-api-docs.shelly.cloud/) website what types of Shelly input events your device supports. - -</div> +{% endnote %} ## Appliance type (generation 1) @@ -251,15 +253,13 @@ Shelly lights supporting light transition: - Shelly RGBW2 - Shelly Vintage -<div class="note"> - +{% note %} The firmware limits the transition time to 5 seconds. +{% endnote %} -</div> - -## Device services +## Device actions -The integration offers device services which can be triggered by a configuration button. +The integration offers device actions which can be triggered by a configuration button. ### OTA firmware update @@ -306,6 +306,22 @@ shelly: coap_port: 12345 ``` +## Virtual components + +Shelly generation 2 devices (Pro models with firmware 1.4.0 or later) and generation 3 devices allow the creation of virtual components. Virtual components are a special set of components that do not initially exist on the device and are dynamically created by the user to interact with Shelly scripts. You can add virtual components to the device configuration in the **Components** section in the device's web panel. + +The integration supports the following virtual components: + +- `boolean` in `toggle` mode, for which a `switch` platform entity is created +- `boolean` in `label` mode, for which a `binary_sensor` platform entity is created +- `enum` in `dropdown` mode, for which a `select` platform entity is created +- `enum` in `label` mode, for which a `sensor` platform entity is created +- `number` in `field` mode, for which a `number` platform entity in `box` mode is created +- `number` in `slider` mode, for which a `number` platform entity in `slider` mode is created +- `number` in `label` mode, for which a `sensor` platform entity is created +- `text` in `field` mode, for which a `text` platform entity is created +- `text` in `label` mode, for which a `sensor` platform entity is created + ## Additional info Shelly devices rely on [SNTP](https://en.wikipedia.org/wiki/Network_Time_Protocol#SNTP) for features like power measurement. @@ -325,4 +341,4 @@ Please check from the device Web UI that the configured server is reachable. - Generation 1 "Shelly 4Pro" and "Shelly Sense" are not supported (devices based on old CoAP v1 protocol) - Before set up, battery-powered devices must be woken up by pressing the button on the device. - For battery-powered devices, the `update` platform entities only inform about the availability of firmware updates but are not able to trigger the update process. -- Using the `homeassistant.update_entity` service for an entity belonging to a battery-powered device is not possible because most of the time these devices are sleeping (are offline). +- Using the `homeassistant.update_entity` action for an entity belonging to a battery-powered device is not possible because most of the time these devices are sleeping (are offline). diff --git a/source/_integrations/shopping_list.markdown b/source/_integrations/shopping_list.markdown index 533e88d4f92a..64e03878be16 100644 --- a/source/_integrations/shopping_list.markdown +++ b/source/_integrations/shopping_list.markdown @@ -20,59 +20,59 @@ Your shopping list will be accessible from the sidebar, and you can optionally a {% include integrations/config_flow.md %} -## Services +## Actions -You can add or remove items from your shopping list by using the following services. +You can add or remove items from your shopping list by using the following actions. -### Service `shopping_list.add_item` +### Action `shopping_list.add_item` Add an item to the shopping list. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------- | | `name` | no | Name of the item to add. Example: "Milk" | -### Service `shopping_list.remove_item` +### Action `shopping_list.remove_item` Remove the first item with matching name from the shopping list. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------- | | `name` | no | Name of the item to remove. Example: "Milk" | -### Service `shopping_list.complete_item` +### Action `shopping_list.complete_item` Mark the first item with matching name as completed in the shopping list. It does not remove the item. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------ | | `name` | no | Name of the item to mark as completed. Example: "Milk" | -### Service `shopping_list.incomplete_item` +### Action `shopping_list.incomplete_item` Mark the first item with matching name as incomplete in the shopping list. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------- | | `name` | no | Name of the item to mark as incomplete. Example: "Milk" | -### Service `shopping_list.complete_all` +### Action `shopping_list.complete_all` Mark all items as completed in the shopping list (without removing them from the list). -### Service `shopping_list.incomplete_all` +### Action `shopping_list.incomplete_all` Mark all items as incomplete in the shopping list. -### Service `shopping_list.clear_completed_items` +### Action `shopping_list.clear_completed_items` Clear completed items from the shopping list. -### Service `shopping_list.sort` +### Action `shopping_list.sort` Sort all items by name in the shopping list. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------- | | `reverse` | yes | Whether to sort in reverse (_descending_) order. (default: `False`) | diff --git a/source/_integrations/sighthound.markdown b/source/_integrations/sighthound.markdown index da19dd85e209..a3a33ab76e8b 100644 --- a/source/_integrations/sighthound.markdown +++ b/source/_integrations/sighthound.markdown @@ -20,7 +20,7 @@ This {% term integration %} adds an image processing entity where the state of t If `save_file_folder` is configured, on each new detection of a person, an annotated image with the name `sighthound_{camera_name}_latest.jpg` is saved in the configured folder if it doesn't already exist, and overwritten if it does exist. The saved image shows the bounding box around detected people and can be displayed on the Home Assistant front end using a [Local File](/integrations/local_file/) camera, and used in notifications. If `save_timestamped_file` is configured as `true`, then the annotated image is saved with a file name that includes the time of detection. -**Note** that by default the {% term integration %} will not automatically scan images, but requires you to call the `image_processing.scan` service, e.g., using an automation triggered by motion. +**Note** that by default the {% term integration %} will not automatically scan images, but requires you to call the `image_processing.scan` action, e.g., using an automation triggered by motion. ## Configuration @@ -73,11 +73,11 @@ To verify the integration, check if a new entity is appeared as `image_processin ## Process an Image -When you want to process an image, you have to call `image_processing.scan` service and listen to the `sighthound.person_detected` and/or `sighthound.vehicle_detected` events. +When you want to process an image, you have to call `image_processing.scan` action and listen to the `sighthound.person_detected` and/or `sighthound.vehicle_detected` events. An example using two automations: -- The first automation is triggered, when a motion is detected. It calls the `image_processing.scan` service to send the camera image to the sighthound server for processing. +- The first automation is triggered, when a motion is detected. It calls the `image_processing.scan` action to send the camera image to the sighthound server for processing. - The second automation is triggered by a `sighthound.vehicle_detected` event. It sends a notification to a phone. diff --git a/source/_integrations/signal_messenger.markdown b/source/_integrations/signal_messenger.markdown index 2cbb794eda66..04e7fc66d585 100644 --- a/source/_integrations/signal_messenger.markdown +++ b/source/_integrations/signal_messenger.markdown @@ -51,7 +51,7 @@ To obtain the Signal Messenger group ids, follow [this guide]( https://github.co {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false type: string default: notify @@ -70,57 +70,32 @@ recipients: {% endconfiguration %} -## Sending messages to Signal to trigger events - -You can use Signal Messenger REST API as a Home Assistant trigger. In this example, we will make a simple chatbot. If you write anything to your Signal account linked to Signal Messenger REST API, the automation gets triggered, with the condition that the number (attribute source) is correct, to take action by sending a Signal notification back with a "Message received!". - -To accomplish this, make sure the addon's `mode` parameter is set to `native` or `normal`, and edit the configuration of Home Assistant, adding a [RESTful resource](/integrations/rest/) as follows: - -```yaml -- resource: "http://127.0.0.1:8080/v1/receive/<number>" - headers: - Content-Type: application/json - sensor: - - name: "Signal message received" - value_template: "{{ value_json[0].envelope.dataMessage.message }}" #this will fetch the message - json_attributes_path: $[0].envelope - json_attributes: - - source #using attributes you can get additional information, in this case, the phone number. - ``` -You can create an automation as follows: - -```yaml -... -trigger: - - platform: state - entity_id: - - sensor.signal_message_received - attribute: source - to: "<yournumber>" -action: - - service: notify.signal - data: - message: "Message received!" -``` +## Notification action -## Examples +### Examples -A few examples on how to use this integration as actions in automations. +A few examples on how to use this integration to send notifications from automations. -### Text message +#### Text message ```yaml ... action: service: notify.NOTIFIER_NAME data: - message: "That's an example that sends a simple text message to the recipients specified in the configuration.yaml" + message: "That's an example that sends a simple text message to the recipients specified in the configuration.yaml. If text mode is 'styled', you can use *italic*, **bold** or ~strikethrough~ ." + ## Optional + data: + text_mode: styled ``` -### Text message with an attachment +| Attribute | Optional | Default |Description | +| ----------- | -------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `text_mode` | *optional* | normal | Accepted values are `normal` or `styled`. If set to `styled`, additional text formatting is enabled (*`*italic*`*, **`**bold**`**, and ~~`~strikethrough~`~~). | -This example assumes you have an image stored in the default `www`-folder in Home Assistant Operating System. +#### Text message with an attachment +This example assumes you have an image stored in the default `www`-folder in Home Assistant Operating System. ```yaml ... @@ -131,13 +106,15 @@ action: data: attachments: - "/config/www/surveillance_camera.jpg" + text_mode: styled ``` -### Text message with an attachment from a URL +| Data attribute | Optional | Default |Description | +| ----------- | -------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `attachments` | **required** | - | List of paths of files to be attached. | +| `text_mode` | *optional* | normal | Accepted values are `normal` or `styled`. If set to `styled`, additional text formatting is enabled (*`*italic*`*, **`**bold**`**, and ~~`~strikethrough~`~~). | -To attach files from outside of Home Assistant, the URLs must be added to the [`allowlist_external_urls`](/integrations/homeassistant/#allowlist_external_urls) list. - -Note there is a 50MB size limit for attachments retrieved via URLs. You can also set `verify_ssl` to `false` to ignore SSL errors (default `true`). +#### Text message with an attachment from a URL ```yaml ... @@ -149,4 +126,51 @@ action: verify_ssl: false urls: - "http://homeassistant.local/api/frigate/notifications/<event-id>/thumbnail.jpg" + text_mode: styled +``` + +| Data attribute | Optional | Default |Description | +| ----------- | -------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `urls` | **required** | - | List of URLs of files to be attached. | +| `verify_ssl` | *optional* | true | Accepted values are `true`, `false`. You can set it to `false` to ignore SSL errors. | +| `text_mode` | *optional* | normal | Accepted values are `normal` or `styled`. If set to `styled`, additional text formatting is enabled (*`*italic*`*, **`**bold**`**, and ~~`~strikethrough~`~~). | + +**Notes:** + +- To attach files from outside of Home Assistant, the URLs must be reachable and added to the [`allowlist_external_urls`](/integrations/homeassistant/#allowlist_external_urls) list. + +- There is a 50MB size limit for attachments retrieved via URLs. + +## Sending messages to Signal to trigger events + +You can use the Signal Messenger REST API as a Home Assistant trigger. In this example, we will make a simple chatbot. If you write anything to your Signal account linked to Signal Messenger REST API, the automation gets triggered, with the condition that the number (attribute source) is correct, to take action by sending a Signal notification back with a "Message received!". + +To accomplish this, make sure the addon's `mode` parameter is set to `native` or `normal`, and edit the configuration of Home Assistant, adding a [RESTful resource](/integrations/rest/) as follows: + +```yaml +- resource: "http://127.0.0.1:8080/v1/receive/<number>" + headers: + Content-Type: application/json + sensor: + - name: "Signal message received" + value_template: "{{ value_json[0].envelope.dataMessage.message }}" #this will fetch the message + json_attributes_path: $[0].envelope + json_attributes: + - source #using attributes you can get additional information, in this case, the phone number. + ``` + +You can create an automation as follows: + +```yaml +... +trigger: + - platform: state + entity_id: + - sensor.signal_message_received + attribute: source + to: "<yournumber>" +action: + - service: notify.signal + data: + message: "Message received!" ``` diff --git a/source/_integrations/simplefin.markdown b/source/_integrations/simplefin.markdown new file mode 100644 index 000000000000..de88c0a8767d --- /dev/null +++ b/source/_integrations/simplefin.markdown @@ -0,0 +1,31 @@ +--- +title: Simplefin +description: Instructions on the SimpleFIN Integration for personal finance. +ha_category: + - Sensor +ha_iot_class: Cloud Polling +ha_release: 2024.8 +ha_codeowners: + - '@jeeftor' + - '@scottg489' +ha_domain: simplefin +ha_config_flow: true +ha_platforms: + - sensor +ha_dhcp: false +ha_integration_type: integration +--- + +[SimpleFIN](http://simplefin.org) allows users to share read-only financial data. This is a paid service although it is quite affordable ($1.50 a month). + +{% include integrations/config_flow.md %} + + + +## Setup Guide + +Within the SimpleFIN Interface, you can create a **Claim Token**, a one-time token that can be exchanged for an **Access URL**. You can enter either a **Claim Token** or an **Access URL** as a configuration element for this integration. + +### Accounts & Devices + +Each financial institution you setup will configured as a **Device** within Home Assistant. And any associated accounts will be linked to these devices. diff --git a/source/_integrations/simplepush.markdown b/source/_integrations/simplepush.markdown index 8b31502e8545..4bc267a8cf0e 100644 --- a/source/_integrations/simplepush.markdown +++ b/source/_integrations/simplepush.markdown @@ -28,7 +28,7 @@ If you enter your password and salt (as defined in the Simplepush app settings) ## Notifications -Simplepush can send a notification by calling the [`notify` service](/integrations/notify/). +Simplepush can send a notification by calling the [`notify` action](/integrations/notify/). You can specify the `event` under the `data` key. Events can be used to customize the notification behavior. diff --git a/source/_integrations/simplisafe.markdown b/source/_integrations/simplisafe.markdown index e72ee5f143f1..89b1de506a5c 100644 --- a/source/_integrations/simplisafe.markdown +++ b/source/_integrations/simplisafe.markdown @@ -48,19 +48,19 @@ SimpliSafe offers several [monitoring plans](https://support.simplisafe.com/arti ## Getting an Authorization Code -<div class='note warning'> +{% important %} You must have multi-factor authentication (MFA) enabled on your SimpliSafe account for the below instructions to work. Without MFA enabled, you will never receive the correct authorization code! -</div> +{% endimportant %} SimpliSafe authenticates users via its web app. Due to technical limitations, there is a manual step when adding the integration. For in-depth guidance, refer to step 6 of [the `simplisafe-python` documentation on authentication](https://simplisafe-python.readthedocs.io/en/latest/usage.html#authentication). -## Services +## Actions ### `simplisafe.remove_pin` Remove a SimpliSafe PIN (by label or PIN value). -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------- | | `label_or_pin` | no | The PIN label or value to remove | @@ -68,7 +68,7 @@ Remove a SimpliSafe PIN (by label or PIN value). Set a SimpliSafe PIN. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------- | | `label` | no | The label to show in the SimpliSafe UI | | `pin` | no | The PIN value to use | @@ -77,7 +77,7 @@ Set a SimpliSafe PIN. Set one or more system properties. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------- | | `alarm_duration` | yes | The number of seconds a triggered alarm should sound | | `chime_volume` | yes | The volume of the door chime | diff --git a/source/_integrations/simulated.markdown b/source/_integrations/simulated.markdown index 8da759c5b2fb..38de30ef4f32 100644 --- a/source/_integrations/simulated.markdown +++ b/source/_integrations/simulated.markdown @@ -13,6 +13,10 @@ ha_platforms: ha_integration_type: integration --- +{% warning %} +The `simulated` integration has been deprecated and will be removed in 2025.1 +{% endwarning %} + The `simulated` sensor platform provides a simulated sensor that generates a time-varying signal `V(t)` given by the [function](https://en.wikipedia.org/wiki/Sine_wave): ```text diff --git a/source/_integrations/sinch.markdown b/source/_integrations/sinch.markdown index 745e63551353..3f7fdb340277 100644 --- a/source/_integrations/sinch.markdown +++ b/source/_integrations/sinch.markdown @@ -37,7 +37,7 @@ notify: {% configuration %} name: - description: "Setting the optional parameter name allows multiple notifiers to be created. The default value is `Sinch`. The notifier will bind to the service `notify.NOTIFIER_NAME`." + description: "Setting the optional parameter name allows multiple notifiers to be created. The default value is `Sinch`. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: false type: string service_plan_id: @@ -49,7 +49,7 @@ api_key: required: true type: string default_recipient: - description: "A single or multiple phone numbers. This is where you want to send your SMS notification messages by default (when not specifying `target` in the service call), e.g., `09171234567` or `[09171234567, 09177654321]`." + description: "A single or multiple phone numbers. This is where you want to send your SMS notification messages by default (when not specifying `target` in the action), e.g., `09171234567` or `[09171234567, 09177654321]`." required: false type: [string, list] sender: diff --git a/source/_integrations/siren.markdown b/source/_integrations/siren.markdown index 617cf044e105..2ca11f5044df 100644 --- a/source/_integrations/siren.markdown +++ b/source/_integrations/siren.markdown @@ -16,21 +16,21 @@ The Siren integration is built for the controlling and monitoring of siren/chime {% include integrations/building_block_integration.md %} -## Services +## Actions -### siren services +### Siren actions -Available services: `siren.turn_on`, `siren.turn_off`, `siren.toggle` +Available actions: `siren.turn_on`, `siren.turn_off`, `siren.toggle` -### Service `siren.turn_on` +### Action `siren.turn_on` Turn the siren on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of sirens to control. -There are three optional input parameters that can be passed into the service call depending on whether or not your device supports them. Check the device's integration documentation for more details. +There are three optional input parameters that can be passed into the action depending on whether or not your device supports them. Check the device's integration documentation for more details. | Parameter Name | Input Type | Notes | |---------------- |-------------------------|-------------------------------------------------------------------------------------| @@ -38,18 +38,18 @@ There are three optional input parameters that can be passed into the service ca | `duration` | `integer` | | | `volume_level` | `float` between 0 and 1 | | -### Service `siren.turn_off` +### Action `siren.turn_off` Turn the siren off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of sirens to control. -### Service `siren.toggle` +### Action `siren.toggle` Toggle the siren on/off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of sirens to control. diff --git a/source/_integrations/siren.mqtt.markdown b/source/_integrations/siren.mqtt.markdown index f9887db48d44..efc26dc6f757 100644 --- a/source/_integrations/siren.mqtt.markdown +++ b/source/_integrations/siren.mqtt.markdown @@ -69,16 +69,16 @@ available_tones: required: false type: list command_template: - description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate a custom payload to send to `command_topic`. The variable `value` will be assigned with the configured `payload_on` or `payload_off` setting. The siren turn on service parameters `tone`, `volume_level` or `duration` can be used as variables in the template. When operation in optimistic mode the corresponding state attributes will be set. Turn on parameters will be filtered if a device misses the support. + description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate a custom payload to send to `command_topic`. The variable `value` will be assigned with the configured `payload_on` or `payload_off` setting. The siren turn on action parameters `tone`, `volume_level` or `duration` can be used as variables in the template. When operation in optimistic mode the corresponding state attributes will be set. Turn on parameters will be filtered if a device misses the support. required: false type: template command_off_template: - description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate a custom payload to send to `command_topic` when the siren turn off service is called. By default `command_template` will be used as template for service turn off. The variable `value` will be assigned with the configured `payload_off` setting. + description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate a custom payload to send to `command_topic` when the siren turn off action is called. By default `command_template` will be used as template for action turn off. The variable `value` will be assigned with the configured `payload_off` setting. required: false type: template command_topic: description: > - The MQTT topic to publish commands to change the siren state. Without command templates, a default JSON payload like `{"state":"ON", "tone": "bell", "duration": 10, "volume_level": 0.5 }` is published. When the siren turn on service is called, the startup parameters will be added to the JSON payload. The `state` value of the JSON payload will be set to the the `payload_on` or `payload_off` configured payload. + The MQTT topic to publish commands to change the siren state. Without command templates, a default JSON payload like `{"state":"ON", "tone": "bell", "duration": 10, "volume_level": 0.5 }` is published. When the siren turn on action is performed, the startup parameters will be added to the JSON payload. The `state` value of the JSON payload will be set to the the `payload_on` or `payload_off` configured payload. required: false type: string device: @@ -219,12 +219,12 @@ state_value_template: required: false type: template support_duration: - description: Set to `true` if the MQTT siren supports the `duration` service turn on parameter and enables the `duration` state attribute. + description: Set to `true` if the MQTT siren supports the `duration` turn on action parameter and enables the `duration` state attribute. required: false type: boolean default: true support_volume_set: - description: Set to `true` if the MQTT siren supports the `volume_set` service turn on parameter and enables the `volume_level` state attribute. + description: Set to `true` if the MQTT siren supports the `volume_set` turn on action parameter and enables the `volume_level` state attribute. required: false type: boolean default: true @@ -234,11 +234,9 @@ unique_id: type: string {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/slack.markdown b/source/_integrations/slack.markdown index e8f50dc093fd..f4e3f9e7cb60 100644 --- a/source/_integrations/slack.markdown +++ b/source/_integrations/slack.markdown @@ -94,7 +94,7 @@ Icon/Username: One of the easiest ways to send a message, is to create a script. You can paste in YAML and make changes in the GUI. -You can call this script as a service. +You can call this script as an action. 1. Go to Home Assistant Settings > Automations and Scenes > Scripts > Add Script 2. Click the three dots in the top right, and pick 'Edit in YAML'. Paste in the contents below. @@ -133,9 +133,9 @@ One sensor entity will be created: - **Do Not Disturb Timer**: The amount of time left for Do Not Disturb status. -### Slack Service Data +### Slack action data -The following attributes can be placed inside the `data` key of the service call for extended functionality: +The following attributes can be placed inside the `data` key of the action for extended functionality: | Attribute | Optional | Description | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/source/_integrations/slimproto.markdown b/source/_integrations/slimproto.markdown index 797e259a1d22..604865c7265e 100644 --- a/source/_integrations/slimproto.markdown +++ b/source/_integrations/slimproto.markdown @@ -18,11 +18,9 @@ The SlimProto integration allows you to control a [Squeezebox](https://en.wikipe {% include integrations/config_flow.md %} -<div class='note'> - +{% note %} This integration talks directly to the player running the "SLIM" protocol, effectively turning Home Assistant into the Media Server so you will not need an external Media Server like Logitech Media Server or Roon. This means that the media you want to play is available in/from Home Assistant itself, for example by using the [Radio Browser](/integrations/radio_browser) integration or the custom [Music Assistant](https://github.com/music-assistant/hass-music-assistant) integration. - -</div> +{% endnote %} ## Basic support only diff --git a/source/_integrations/smappee.markdown b/source/_integrations/smappee.markdown index c6179f9d08ac..09b2bca6d1a6 100644 --- a/source/_integrations/smappee.markdown +++ b/source/_integrations/smappee.markdown @@ -72,7 +72,7 @@ smappee: client_secret: YOUR_CLIENT_SECRET ``` -Once Home Assistant restarted, go to Settings > Devices & Services and select the Smappee integration. You will be redirected to a login page and be able to select the locations you would like to use within Home Assistant. +Once Home Assistant restarted, go to **Settings** > **Devices & services** and select the Smappee integration. You will be redirected to a login page and be able to select the locations you would like to use within Home Assistant. Using the Smappee cloud integration allows you to access your Smappee monitor and other shared devices from outside your local network. Additionally a number of (binary) sensor entities become available as well. diff --git a/source/_integrations/smart_meter_texas.markdown b/source/_integrations/smart_meter_texas.markdown index b65b70c4c22e..85bf3412c52d 100644 --- a/source/_integrations/smart_meter_texas.markdown +++ b/source/_integrations/smart_meter_texas.markdown @@ -30,8 +30,8 @@ Any Texas electricity consumer can register an account. - Your meter number - Your ESIID (Electric Service Identifier) -<div class='note'> +{% note %} Due to API limits, this sensor refreshes once per hour. The limit is 24 meter readings per calendar day. -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/smartthings.markdown b/source/_integrations/smartthings.markdown index 61030e8608c6..102a4dec54d7 100644 --- a/source/_integrations/smartthings.markdown +++ b/source/_integrations/smartthings.markdown @@ -16,8 +16,6 @@ ha_category: ha_release: 0.87 ha_iot_class: Cloud Push ha_config_flow: true -ha_codeowners: - - '@andrewsayre' ha_domain: smartthings ha_platforms: - binary_sensor @@ -82,11 +80,9 @@ After completing the prerequisite steps above, you are ready to setup the integr 4. Select **Close Window** or close it manually. 5. Back in Home Assistant select **Finish**. -<div class='note info'> - +{% note %} If you want to integrate additional SmartThings accounts or locations, repeat the steps above. - -</div> +{% endnote %} ## Removal instructions diff --git a/source/_integrations/smarttub.markdown b/source/_integrations/smarttub.markdown index 35e1af34b58f..2ac8168aadec 100644 --- a/source/_integrations/smarttub.markdown +++ b/source/_integrations/smarttub.markdown @@ -32,44 +32,44 @@ The `smarttub` integration allows you to view and control hot tubs which use the {% include integrations/config_flow.md %} -## Services +## Actions -### Service `smarttub.set_primary_filtration` +### Action `smarttub.set_primary_filtration` -This service allows you to update the settings for the primary filtration cycle +This action allows you to update the settings for the primary filtration cycle on a hot tub. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `entity_id` | no | The entity to update. | sensor.jacuzzi_j_335_primary_filtration_cycle | `duration` | no | The desired duration of the primary filtration cycle, in hours. | 4 | `start_hour` | no | The desired starting hour of the day for the primary filtration cycle. | 2 (i.e. 02:00 or 2:00am) -### Service `smarttub.set_secondary_filtration` +### Action `smarttub.set_secondary_filtration` -This service allows you to update the settings for the secondary filtration +This action allows you to update the settings for the secondary filtration cycle on a hot tub. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `entity_id` | no | The entity to update. | sensor.jacuzzi_j_335_secondary_filtration_cycle | `mode` | no | The desired secondary filtration mode. Can be frequent, infrequent or away. | away -### Service `smarttub.snooze_reminder` +### Action `smarttub.snooze_reminder` -This service allows you to temporarily suppress a maintenance reminder on a hot tub. +This action allows you to temporarily suppress a maintenance reminder on a hot tub. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `entity_id` | no | The entity to update. | binary_sensor.jacuzzi_j_335_refresh_water_reminder | `days` | no | The number of days to snooze the reminder (minimum 10). | 10 -### Service `smarttub.reset_reminder` +### Action `smarttub.reset_reminder` -This service allows you to reset a maintenance reminder on a hot tub. +This action allows you to reset a maintenance reminder on a hot tub. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `entity_id` | no | The entity to update. | binary_sensor.jacuzzi_j_335_refresh_water_reminder | `days` | no | The number of days when reminder should trigger next (minimum 30). | 180 diff --git a/source/_integrations/smhi.markdown b/source/_integrations/smhi.markdown index 3027a93dcfe7..7d2b23fd2ae3 100644 --- a/source/_integrations/smhi.markdown +++ b/source/_integrations/smhi.markdown @@ -26,10 +26,8 @@ There is currently support for the following device types within Home Assistant: The SMHI weather service is free under the Creative Commons Attribution 4.0, international license. Weather data will be pulled once every 30 minutes. -<div class='note warning'> - +{% important %} Only location close to Sweden can be added. See [SMHI.se area](https://opendata.smhi.se/apidocs/metfcst/geographic_area.html) for more details what locations are supported. - -</div> +{% endimportant %} Details about the API are available in the [SMHI API documentation](https://opendata.smhi.se/apidocs/metfcst/index.html). diff --git a/source/_integrations/smtp.markdown b/source/_integrations/smtp.markdown index d89b6be3e199..6372fe5e4622 100644 --- a/source/_integrations/smtp.markdown +++ b/source/_integrations/smtp.markdown @@ -28,7 +28,7 @@ Check your email provider configuration or help pages to get the correct SMTP se {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false type: string default: notify @@ -37,7 +37,7 @@ sender: required: true type: string recipient: - description: Default email address of the recipient of the notification. This can be a recipient address or a list of addresses for multiple recipients.<br>This is where you want to send your email notifications by default (when not specifying `target` in the service call). Any email address(es) specified in the service call's `target` field will override this recipient content. + description: Default email address of the recipient of the notification. This can be a recipient address or a list of addresses for multiple recipients.<br>This is where you want to send your email notifications by default (when not specifying `target` in the action). Any email address(es) specified in the action's `target` field will override this recipient content. required: true type: [list, string] server: @@ -105,7 +105,7 @@ A notify integration will be created using the name without spaces. In the above mode: single ``` -The optional `target` field is used to specify recipient(s) for this specific service call. When `target` field is not used, this message will be sent to default recipient(s), in this example, morning@example.com. +The optional `target` field is used to specify recipient(s) for this specific action. When `target` field is not used, this message will be sent to default recipient(s), specified in the `recipient` part of the smtp notifier in `configuration.yaml`. Line breaks can be added in the body part of the email by using `\r\n`, for instance `message: "Rise and shine\r\n\r\nIt's a brand new day!"` Another example attaching images stored locally in a script: @@ -132,11 +132,9 @@ The optional `html` field makes a custom text/HTML multi-part message, allowing The optional `images` field adds image attachments to the email. If `html` is defined, the images need to be added to the message in-line as described above (and as shown in the example below). If `html` is not defined, images will be added as separate attachments. -<div class='note info'> - +{% important %} When adding images, make sure the folders containing the attachments are added to `allowlist_external_dirs`.<br>See: [Setup basic documentation](/integrations/homeassistant/#allowlist_external_dirs) - -</div> +{% endimportant %} ```yaml burglar: diff --git a/source/_integrations/snapcast.markdown b/source/_integrations/snapcast.markdown index d0d9f38ba0a8..252e4d52b0f4 100644 --- a/source/_integrations/snapcast.markdown +++ b/source/_integrations/snapcast.markdown @@ -18,48 +18,48 @@ The Snapcast integration allows you to control [Snapcast](https://github.com/bad {% include integrations/config_flow.md %} -## Services +## Actions -The snapcast integration provides a few services registered under the media_player integration. +The snapcast integration provides a few actions registered under the media_player integration. -### Service `snapcast.snapshot` +### Action `snapcast.snapshot` -Take a snapshot of what is currently playing on one or more speakers. This service, and the following one, are useful if you want to play a doorbell or notification sound and resume playback afterwards. +Take a snapshot of what is currently playing on one or more speakers. This action, and the following one, are useful if you want to play a doorbell or notification sound and resume playback afterwards. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | The speakers to snapshot. -### Service `snapcast.restore` +### Action `snapcast.restore` Restore a previously taken snapshot of one or more speakers. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of `entity_id`s that should have their snapshot restored. -### Service `snapcast.join` +### Action `snapcast.join` Group players together under a single group. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `master` | no | Entity ID of the player to synchronize to. | `entity_id` | yes | String or list of `entity_id`s to join to the master. -### Service `snapcast.unjoin` +### Action `snapcast.unjoin` Remove one or more speakers from their group of speakers. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of `entity_id`s to separate from their coordinator speaker. -### Service `snapcast.set_latency` +### Action `snapcast.set_latency` Set the latency of a speaker. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of `entity_id`s for which latency will be adjusted. | `latency` | no | Latency in ms. diff --git a/source/_integrations/snips.markdown b/source/_integrations/snips.markdown index ecba5b734d4b..f62e2bb1c8dd 100644 --- a/source/_integrations/snips.markdown +++ b/source/_integrations/snips.markdown @@ -9,11 +9,9 @@ ha_iot_class: Local Push ha_integration_type: integration --- -<div class='note warning'> - +{% warning %} The Snips Console no longer available due to acquisition by Sonos. For more details, read the [announcement on the Snips forum](http://web.archive.org/web/20200109164247/https://forum.snips.ai/t/important-message-regarding-the-snips-console/4145). - -</div> +{% endwarning %} The [Snips Voice Platform](https://www.snips.ai) allows users to add powerful voice assistants to their Raspberry Pi devices without compromising on privacy. It runs 100% on-device, and does not require an internet connection. It features Hotword Detection, Automatic Speech Recognition (ASR), Natural Language Understanding (NLU) and Dialog Management. @@ -81,7 +79,7 @@ Note that if you already have an assistant installed and wish to replace it then Make sure that a microphone is plugged to the Raspberry Pi. If you are having trouble setting up audio, we have written a guide on [Raspberry Pi Microphones](https://docs.snips.ai/articles/raspberrypi/hardware/microphones). -Start the Snips Voice Platform by starting the `snips-*` services: +Start the Snips Voice Platform by starting the `snips-*` actions: ```bash sudo systemctl start "snips-*" @@ -194,19 +192,19 @@ SetTimer: ### Sending TTS Notifications -You can send TTS notifications to Snips using the `snips.say` and `snips.say_action` services. `say_action` starts a session and waits for user response, "Would you like me to close the garage door?", "Yes, close the garage door". +You can send TTS notifications to Snips using the `snips.say` and `snips.say_action` actions. `say_action` starts a session and waits for user response, "Would you like me to close the garage door?", "Yes, close the garage door". -#### Service `snips.say` +#### Action `snips.say` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|--------------------------------------------------------| | `text` | no | Text to say. | | `site_id` | yes | Site to use to start session. | | `custom_data` | yes | custom data that will be included with all messages in this session. | -#### Service `snips.say_action` +#### Action `snips.say_action` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|--------------------------------------------------------| | `text` | no | Text to say. | | `site_id` | yes | Site to use to start session. | diff --git a/source/_integrations/snmp.markdown b/source/_integrations/snmp.markdown index b447e6ea7b41..0c5a4a5e1d1c 100644 --- a/source/_integrations/snmp.markdown +++ b/source/_integrations/snmp.markdown @@ -26,9 +26,9 @@ There is currently support for the following device types within Home Assistant: - [Sensor](#sensor) - [Switch](#switch) -<div class='note warning'> +{% important %} This device tracker needs SNMP to be enabled on the router. It could be that you need to install the SNMP support manually. -</div> +{% endimportant %} ## Presence detection diff --git a/source/_integrations/snooz.markdown b/source/_integrations/snooz.markdown index 85f256e01f4c..fb79504b599c 100644 --- a/source/_integrations/snooz.markdown +++ b/source/_integrations/snooz.markdown @@ -46,19 +46,19 @@ Devices are exposed as Fan entities with a persistent connection to the device. Fan speed percentage is mapped to the device volume level. -<div class='note'> +{% note %} Speed percentages less than 10 have no effect - they all map to a value of 1 on the device. -</div> +{% endnote %} -## Services +## Actions -### Service `snooz.transition_on` +### Action `snooz.transition_on` Transition the volume level over the specified duration. If the device is powered off, the transition will start at the lowest volume level. {% my developer_call_service badge service="snooz.transition_on" %} -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `duration` | yes | Number of seconds to transition to target volume. | `volume` | yes | Percentage volume level. If not specified, the volume on the device is used. @@ -79,17 +79,17 @@ automation: duration: 120 ``` -### Service `snooz.transition_off` +### Action `snooz.transition_off` Transition the volume level to the lowest setting over the specified duration, then power off the device. -<div class='note'> +{% note %} Once the transition completes, the volume level is restored to the value before the transition started. -</div> +{% endnote %} {% my developer_call_service badge service="snooz.transition_off" %} -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `duration` | yes | Number of seconds to complete the transition. diff --git a/source/_integrations/solaredge_local.markdown b/source/_integrations/solaredge_local.markdown index 2cb916032544..31ce73e4f7ae 100644 --- a/source/_integrations/solaredge_local.markdown +++ b/source/_integrations/solaredge_local.markdown @@ -24,13 +24,13 @@ Only specific models support the local API. The local API is available on invert You can check if the local API works by finding the IP address of your inverter and visiting it in a browser. If it supports the local API, you'll see an HTML page with the SolarEdge logo and a "Commissioning" menu. -<div class='note'> +{% warning %} Recent firmware updates have disabled the local API on many inverters. Please enter the IP address of your inverter in a browser before attempting to use this integration. If the local API is enabled, you'll see a web page with the SolarEdge logo and a "Commissioning" menu. See [this issue](https://github.com/jbuehl/solaredge/issues/124) and [this issue](https://github.com/drobtravels/solaredge-local/issues/24) for additional details. If your inverter does not support the local API, you can use the [cloud based version](/integrations/solaredge/) -</div> +{% endwarning %} ## Configuration diff --git a/source/_integrations/solarlog.markdown b/source/_integrations/solarlog.markdown index 9f572099284b..d5772baf68f9 100644 --- a/source/_integrations/solarlog.markdown +++ b/source/_integrations/solarlog.markdown @@ -9,6 +9,7 @@ ha_iot_class: Local Polling ha_config_flow: true ha_codeowners: - '@Ernst79' + - '@dontinelli' ha_domain: solarlog ha_platforms: - sensor @@ -22,9 +23,9 @@ When activating the interface, a red warning triangle with security information The `solarlog` integration uses the default host address "http://solar-log" if you don't specify a host. If your device isn't accessible on this address, use its IP Address instead. -<div class='note warning'> +{% important %} The open JSON interface is deactivated by default. To activate the open JSON interface, a user password must first be set. The password isn't needed for accessing the open JSON interface. -</div> +{% endimportant %} {% include integrations/config_flow.md %} @@ -66,6 +67,7 @@ The following sensors are available in the library: | consumption_month | kWh | Total consumption for the month from all of the consumption meters. | | consumption_year | kWh | Total consumption for the year from all of the consumption meters. | | consumption_total | kWh | Accumulated total consumption from all consumption meters. | +| self_consumption_year | kWh | Accumulated total self-consumption. | | installed_peak_power | W | Installed solar peak power. | | alternator_loss | W | Altenator loss (equals to power_dc - power_ac) | | capacity | % | Capacity (equals to power_dc / total power) | @@ -73,6 +75,6 @@ The following sensors are available in the library: | power_available | W | Available power (equals to power_ac - consumption_ac) | | usage | % | Usage (equals to consumption_ac / power_ac) | -<div class='note'> +{% note %} The solarlog integration is using the solarlog_cli pypi package to get the data from your Solar-Log device. The last five sensors are not reported by your Solar-Log device directly, but are computed by the library. -</div> +{% endnote %} diff --git a/source/_integrations/somfy_mylink.markdown b/source/_integrations/somfy_mylink.markdown index 1ab9db325077..6499eedf3c58 100644 --- a/source/_integrations/somfy_mylink.markdown +++ b/source/_integrations/somfy_mylink.markdown @@ -18,4 +18,4 @@ The `Somfy MyLink` integration is used as an interface to a compatible Somfy MyL {% include integrations/config_flow.md %} -If any of your devices are reversed, they can be adjusted in **Settings** -> **Devices & Services** -> **Somfy MyLink** >> `Options`. +If any of your devices are reversed, they can be adjusted in **Settings** > **Devices & services** > **Somfy MyLink** > **Options**. diff --git a/source/_integrations/songpal.markdown b/source/_integrations/songpal.markdown index 93667c4c949d..7347c594930c 100644 --- a/source/_integrations/songpal.markdown +++ b/source/_integrations/songpal.markdown @@ -28,21 +28,21 @@ A few notes: - The quick start-up mode has to be enabled in order to turn the device on. - Supports currently only one output terminal, i.e., the volume control works only on the first volume controller as reported by the backend library. - Some devices, e.g., HT-XT3, do not support decreasing the volume step-by-step correctly. -- Feel free to improve the available services! +- Feel free to improve the available actions! {% include integrations/config_flow.md %} See [python-songpal's documentation](https://github.com/rytilahti/python-songpal#locating-the-endpoint) how to get your API endpoint. -## Services +## Actions -In addition to the general [media player services](/integrations/media_player/#services), the following services are provided: +In addition to the general [media player actions](/integrations/media_player/#actions), the following actions are provided: -### Service `songpal/set_sound_setting` +### Action `songpal/set_sound_setting` For a list of available settings and their values use [`songpal sound`](https://github.com/rytilahti/python-songpal#sound-settings) command. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|--------------------------------------------------| | `entity_id` | yes | Target entity. To target all songpal devices, use `all` | | `name` | no | Configuration variable, e.g., `nightmode` | diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown index 53e329f020e9..1ce31422b091 100644 --- a/source/_integrations/sonos.markdown +++ b/source/_integrations/sonos.markdown @@ -51,11 +51,9 @@ Battery sensors are fully supported for the `Sonos Roam` and `Sonos Move` device For each speaker with a battery, a `sensor` showing the current battery charge level and a `binary_sensor` showing the power state of the speaker are created. The `binary_sensor` reports if the speaker is currently powered by an external source and its `power_source` attribute shows which specific source is providing the current power. This source attribute can be one of `BATTERY`, `SONOS_CHARGING_RING` if using wireless charging, or `USB_POWER` if charging via USB cable. Note that the Roam will report `SONOS_CHARGING_RING` even when using a generic Qi charger. -<div class='note'> - +{% note %} The battery sensors rely on working change events or updates will be delayed. S1 battery sensors **require** working events to report any data. See more details in [Advanced use](#advanced-use). - -</div> +{% endnote %} ### Alarm support notes @@ -69,9 +67,9 @@ The microphone can only be enabled/disabled from physical buttons on the Sonos d The favorites sensor provides the names and `media_content_id` values for each of the favorites saved to My Sonos in the native Sonos app. This sensor is intended for users that need to access the favorites in a custom template. For most users, accessing favorites by using the Media Browser functionality and "Play media" script/automation action is recommended. -When calling the `media_player.play_media` service, the `media_content_type` must be set to "favorite_item_id" and the `media_content_id` must be set to just the key portion of the favorite item. +When calling the `media_player.play_media` action, the `media_content_type` must be set to "favorite_item_id" and the `media_content_id` must be set to just the key portion of the favorite item. -Example service call using the item id: +Example action using the item id: ```yaml service: media_player.play_media @@ -115,26 +113,23 @@ Example templates: {% endraw %} -<div class='note'> - +{% tip %} The Sonos favorites sensor (`sensor.sonos_favorites`) is disabled by default. It can be found and enabled from the entities associated with the Sonos integration on your {% my integrations %} page. - -</div> - +{% endtip %} ## Playing media -Sonos accepts a variety of `media_content_id` formats in the `media_player.play_media` service, but most commonly as URIs. For example, both Spotify and Tidal share links can be provided as-is. Playback of [music hosted on a Plex server](/integrations/plex#sonos-playback) is possible. Direct HTTP/HTTPS links to local or remote media files can also be used if the Sonos device can reach the URI directly, but specific media encoding support may vary. +Sonos accepts a variety of `media_content_id` formats in the `media_player.play_media` action, but most commonly as URIs. For example, both Spotify and Tidal share links can be provided as-is. Playback of [music hosted on a Plex server](/integrations/plex#sonos-playback) is possible. Direct HTTP/HTTPS links to local or remote media files can also be used if the Sonos device can reach the URI directly, but specific media encoding support may vary. Music services which require an account (e.g., Spotify) must first be configured using the Sonos app. Playing TTS (text-to-speech) or audio files as alerts (e.g., a doorbell or alarm) is possible by setting the `announce` argument to `true`. Using `announce` will play the provided media URL as an overlay, gently lowering the current music volume and automatically restoring to the original level when finished. An optional `volume` argument can also be provided in the `extra` dictionary to play the alert at a specific volume level. Note that older Sonos hardware or legacy firmware versions ("S1") may not fully support these features. Additionally, see [Network Requirements](#network-requirements) for use in restricted networking environments. -An optional `enqueue` argument can be added to the service call. If `replace` or not provided then the queue will be replaced and the item will be replaced. If `add` the item will be appended to the queue. If `next` the item will be added into the queue to play next. If `play`, the item will be added into the queue and played immediately. +An optional `enqueue` argument can be added to the action. If `replace` or not provided then the queue will be replaced and the item will be replaced. If `add` the item will be appended to the queue. If `next` the item will be added into the queue to play next. If `play`, the item will be added into the queue and played immediately. ### Examples: -Below is an example service call that plays an audio file from a web server on the local network (like the Home Assistant built-in webserver) using the `announce` feature and its associated (optional) `volume` parameter: +Below is an example action that plays an audio file from a web server on the local network (like the Home Assistant built-in webserver) using the `announce` feature and its associated (optional) `volume` parameter: ```yaml service: media_player.play_media @@ -148,7 +143,7 @@ data: volume: 20 ``` -The standard `tts.<source>_say` services do not accept the `volume` parameter directly. To set the `volume` for a TTS announcement, you can use a TTS Media Source URL with the standard `media_player.play_media` service: +The standard `tts.<source>_say` actions do not accept the `volume` parameter directly. To set the `volume` for a TTS announcement, you can use a TTS Media Source URL with the standard `media_player.play_media` action: ```yaml service: media_player.play_media target: @@ -162,7 +157,7 @@ data: volume: 80 ``` -Sonos can also play music or playlists from Spotify. Both Spotify URIs and URLs can be used directly. An example service call using a playlist URI: +Sonos can also play music or playlists from Spotify. Both Spotify URIs and URLs can be used directly. An example action using a playlist URI: ```yaml service: media_player.play_media @@ -174,7 +169,7 @@ data: enqueue: true ``` -An example service call using a Spotify URL: +An example action using a Spotify URL: ```yaml service: media_player.play_media @@ -272,66 +267,62 @@ data: enqueue: play ``` -## Services +## Actions -The Sonos integration makes various custom services available in addition to the [standard media player services](/integrations/media_player/#services). +The Sonos integration makes various custom actions available in addition to the [standard media player actions](/integrations/media_player/#actions). -### Service `sonos.snapshot` +### Action `sonos.snapshot` -Take a snapshot of what is currently playing on one or more speakers. This service, and the following one, are useful if you want to play a doorbell or notification sound and resume playback afterwards. - -<div class='note'> +Take a snapshot of what is currently playing on one or more speakers. This action, and the following one, are useful if you want to play a doorbell or notification sound and resume playback afterwards. +{% note %} The queue is not snapshotted and must be left untouched until the restore. Using `media_player.play_media` is safe and can be used to play a notification sound, including [TTS](/integrations/tts/) announcements. +{% endnote %} -</div> - -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | The speakers to snapshot. To target all Sonos devices, use `all`. | `with_group` | yes | Should we also snapshot the group layout and the state of other speakers in the group, defaults to true. -### Service `sonos.restore` +### Action `sonos.restore` Restore a previously taken snapshot of one or more speakers. -<div class='note'> - +{% note %} The playing queue is not snapshotted. Using `sonos.restore` on a speaker that has replaced its queue will restore the playing position, but in the new queue! +{% endnote %} -</div> - -<div class='note'> +{% note %} A cloud queue cannot be restarted. This includes queues started from within Spotify and queues controlled by Amazon Alexa. -</div> +{% endnote %} -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of `entity_id`s that should have their snapshot restored. To target all Sonos devices, use `all`. | `with_group` | yes | Should we also restore the group layout and the state of other speakers in the group, defaults to true. -### Service `sonos.set_sleep_timer` +### Action `sonos.set_sleep_timer` Sets a timer that will turn off a speaker by tapering the volume down to 0 after a certain amount of time. Protip: If you set the sleep_time value to 0, then the speaker will immediately start tapering the volume down. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of `entity_id`s that will have their timers set. | `sleep_time` | no | Integer number of seconds that the speaker should wait until it starts tapering. Cannot exceed 86399 (one day). -### Service `sonos.clear_sleep_timer` +### Action `sonos.clear_sleep_timer` Clear the sleep timer on a speaker, if one is set. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of `entity_id`s that will have their timers cleared. Must be a coordinator speaker. -### Service `sonos.update_alarm` +### Action `sonos.update_alarm` Update an existing Sonos alarm. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of `entity_id`s that will have their timers cleared. Must be a coordinator speaker. | `alarm_id` | no | Integer that is used in Sonos to refer to your alarm. @@ -340,21 +331,21 @@ Update an existing Sonos alarm. | `enabled` | yes | Boolean for whether or not to enable this alarm. | `include_linked_zones` | yes | Boolean that defines if the alarm also plays on grouped players. -### Service `sonos.play_queue` +### Action `sonos.play_queue` Starts playing the Sonos queue. Force start playing the queue, allows switching from another stream (such as radio) to playing the queue. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of `entity_id`s that will start playing. It must be the coordinator if targeting a group. | `queue_position` | yes | Position of the song in the queue to start playing from, starts at 0. -### Service `sonos.remove_from_queue` +### Action `sonos.remove_from_queue` Removes an item from the queue. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of `entity_id`s that will remove an item from the queue. It must be the coordinator if targeting a group. | `queue_position` | yes | Position in the queue to remove. diff --git a/source/_integrations/soundtouch.markdown b/source/_integrations/soundtouch.markdown index 3bef62deaa53..6cfb4fcadf54 100644 --- a/source/_integrations/soundtouch.markdown +++ b/source/_integrations/soundtouch.markdown @@ -51,43 +51,43 @@ You can use TTS services like [Google text-to-speech](/integrations/google_trans A workaround if you want to publish your Home Assistant installation on Internet in SSL is to configure an HTTPS Web Server as a reverse proxy ([NGINX](/docs/ecosystem/nginx/) for example) and let your Home Assistant configuration in HTTP on your local network. The SoundTouch devices will be available to access the TTS files in HTTP in local and your configuration will be in HTTPS on the Internet. -## Services +## Actions -### Service `play_everywhere` +### Action `play_everywhere` Create a multi-room (zone) from a master and play same content on all other devices (slaves) -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `master` | no | `entity_id` of the master device -### Service `create_zone` +### Action `create_zone` Create a multi-room (zone) from a master and play on selected slaves -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `master` | no | `entity_id` of the master device| | `slaves` | no | List of slaves `entity_id` | -### Service `add_zone_slave` +### Action `add_zone_slave` Add slave(s) to an existing zone -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------ | | `master` | no | `entity_id` of the master device | | `slaves` | no | List of slaves `entity_id` to add| -### Service `remove_zone_slave` +### Action `remove_zone_slave` Remove slave(s) from an existing zone. Removing the last slave will destroy the zone. You will need to create a new zone in order to be able to add slave(s) again -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------- | | `master` | no | `entity_id` of the master device | | `slaves` | no | List of slaves `entity_id` to remove | diff --git a/source/_integrations/speedtestdotnet.markdown b/source/_integrations/speedtestdotnet.markdown index f624baddf6d5..1a3294f62135 100644 --- a/source/_integrations/speedtestdotnet.markdown +++ b/source/_integrations/speedtestdotnet.markdown @@ -22,7 +22,7 @@ The Speedtest.net integration uses the [Speedtest.net](https://speedtest.net/) w Most Speedtest.net servers require TCP port 8080 outbound to function. Without this port open you may experience significant delays or no results at all. See note on their [help page](https://www.speedtest.net/help). -By default, a speed test will be run every hour. You can disable polling using system options and use the `update_entity` service to automate the speed test frequency. +By default, a speed test will be run every hour. You can disable polling using system options and use the `update_entity` action to automate the speed test frequency. {% include common-tasks/define_custom_polling.md %} diff --git a/source/_integrations/spider.markdown b/source/_integrations/spider.markdown index 0177666ea1b8..975b2535d5ff 100644 --- a/source/_integrations/spider.markdown +++ b/source/_integrations/spider.markdown @@ -27,12 +27,12 @@ There is currently support for the following device types within Home Assistant: {% include integrations/config_flow.md %} -<div class='note warning'> +{% note %} This integration is not affiliated with Itho Daalderop Spider and retrieves data from the endpoints of the mobile application. Use at your own risk. -</div> +{% endnote %} ### Climate -<div class='note'> +{% note %} Although this integration lets you change the operation mode to heating or cooling, it doesn't necessarily mean your boiler can. Spider is not aware of your current situation. -</div> +{% endnote %} diff --git a/source/_integrations/spotify.markdown b/source/_integrations/spotify.markdown index 71f561e9c998..8a25596683a4 100644 --- a/source/_integrations/spotify.markdown +++ b/source/_integrations/spotify.markdown @@ -132,7 +132,7 @@ The Spotify API cannot initiate playback to a device not already known to the Sp ## Playing Spotify playlists You can send playlists to Spotify using the `"media_content_type": "playlist"`, which is part of the -[media_player.play_media](/integrations/media_player/#service-media_playerplay_media) service, for example: +[media_player.play_media](/integrations/media_player/#action-media_playerplay_media) action, for example: ```yaml # Example script to play playlist diff --git a/source/_integrations/sql.markdown b/source/_integrations/sql.markdown index 171807c3fa24..b2dea2735e55 100644 --- a/source/_integrations/sql.markdown +++ b/source/_integrations/sql.markdown @@ -248,6 +248,12 @@ SELECT pg_database_size('dsmrreader')/1024/1024 as db_size; Use `db_size` as column for value. Replace `dsmrreader` with the correct name of your database. +{% tip %} +The unit of measurement returned by the above query is `MiB`, please configure this correctly. + +Set the device class to `Data size` so you can use UI unit conversion. +{% endtip %} + #### MariaDB/MySQL Change `table_schema="homeassistant"` to the name that you use as the database name, to ensure that your sensor will work properly. @@ -257,6 +263,12 @@ SELECT table_schema "database", Round(Sum(data_length + index_length) / POWER(10 ``` Use `value` as column for value. +{% tip %} +The unit of measurement returned by the above query is `MiB`, please configure this correctly. + +Set the device class to `Data size` so you can use UI unit conversion. +{% endtip %} + #### SQLite If you are using the `recorder` integration then you don't need to specify the location of the database. For all other cases, add `sqlite:////path/to/database.db` as Database URL. @@ -266,19 +278,31 @@ SELECT ROUND(page_count * page_size / 1024 / 1024, 1) as size FROM pragma_page_c ``` Use `size` as column for value. +{% tip %} +The unit of measurement returned by the above query is `MiB`, please configure this correctly. + +Set the device class to `Data size` so you can use UI unit conversion. +{% endtip %} + #### MS SQL Use the same Database URL as for the `recorder` integration. Change `DB_NAME` to the name that you use as the database name, to ensure that your sensor will work properly. Be sure `username` has enough rights to access the sys tables. Example Database URL: `"mssql+pyodbc://username:password@SERVER_IP:1433/DB_NAME?charset=utf8&driver=FreeTDS"` -<div class='note info'> +{% note %} Connecting with MSSQL requires "pyodbc" to be installed on your system, which can only be done on systems using the Home Assistant Core installation type to be able to install the necessary dependencies. "pyodbc" has special requirements which need to be pre-installed before installation, see the ["pyodbc" wiki](https://github.com/mkleehammer/pyodbc/wiki/Install) for installation instructions -</div> +{% endnote %} ```sql SELECT TOP 1 SUM(m.size) * 8 / 1024 as size FROM sys.master_files m INNER JOIN sys.databases d ON d.database_id=m.database_id WHERE d.name='DB_NAME'; ``` Use `size` as column for value. + +{% tip %} +The unit of measurement returned by the above query is `MiB`, please configure this correctly. + +Set the device class to `Data size` so you can use UI unit conversion. +{% endtip %} diff --git a/source/_integrations/squeezebox.markdown b/source/_integrations/squeezebox.markdown index 3ee425685425..ad080d0cf2a7 100644 --- a/source/_integrations/squeezebox.markdown +++ b/source/_integrations/squeezebox.markdown @@ -1,6 +1,6 @@ --- -title: Squeezebox (Logitech Media Server) -description: Instructions on how to integrate a Logitech Squeezebox player into Home Assistant. +title: Squeezebox (Lyrion Music Server) +description: Instructions on how to integrate a Squeezebox player into Home Assistant. ha_category: - Media player ha_release: pre 0.7 @@ -15,17 +15,19 @@ ha_platforms: ha_integration_type: integration --- -The Squeezebox integration allows you to control a [Logitech Squeezebox](https://en.wikipedia.org/wiki/Squeezebox_%28network_music_player%29) music player from Home Assistant. This lets you control Squeezebox hardware like the Classic, Transporter, Duet, Boom, Radio and Touch and of software players like [Squeezelite](https://github.com/ralph-irving/squeezelite), [SoftSqueeze](http://softsqueeze.sourceforge.net/), [SqueezePlayer](https://play.google.com/store/apps/details?id=de.bluegaspode.squeezeplayer) and [SqueezeSlave](https://forums.slimdevices.com/showthread.php?93607-ANNOUNCE-Squeezeslave-1-2-released). +The Squeezebox integration allows you to control music players from the [Lyrion Music Server](https://lyrion.org/) (LMS) ecosystem. Lyrion Music Server was previously known as [Logitech Media Server](https://en.wikipedia.org/wiki/Squeezebox_%28network_music_player%29). + +The Squeezebox music player ecosystem, which can be controlled through this integration, includes hardware audio players from Logitech, including [Squeezebox 3rd Generation, Squeezebox Boom, Squeezebox Receiver, Transporter, Squeezebox2, Squeezebox and SLIMP3](https://lms-community.github.io/players-and-controllers/hardware-comparison/), and many software emulators like [Squeezelite, SqueezeSlave, SoftSqueeze and SqueezePlay](https://sourceforge.net/projects/lmsclients/files/). {% include integrations/config_flow.md %} -<div class='note'> -This platform uses the web interface of the Logitech Media Server (LMS) to send commands. The default port of the web interface is 9000. It is the same port that you use to access the LMS through your web browser. -</div> +{% note %} +This platform uses the web interface of the Lyrion Music Server (LMS) to send commands. The default port of the web interface is 9000. It is the same port that you use to access the LMS through your web browser. +{% endnote %} -<div class='note'> -The integration now supports Logitech Media Servers behind an HTTPS reverse proxy. Please note that Logitech Media Server natively only supports HTTP traffic. Unless you have configured a reverse proxy, do not select the `https` option. If you have configured a reverse proxy, remember to update the port number. -</div> +{% note %} +The integration now supports Lyrion Music Servers behind an HTTPS reverse proxy. Please note that Lyrion Music Server natively only supports HTTP traffic. Unless you have configured a reverse proxy, do not select the `https` option. If you have configured a reverse proxy, remember to update the port number. +{% endnote %} The Logitech Transporter which have two digital inputs can be activated using a script. The following example turns on the Transporter and activates the toslink input interface: @@ -44,19 +46,19 @@ transporter_toslink: media_content_type: "music" ``` -### Service `call_method` +### Action `call_method` Call a custom Squeezebox JSON-RPC API. -See documentation for this interface on `http://HOST:PORT/html/docs/cli-api.html?player=` where HOST and PORT are the host name and port for your Logitech Media Server. +See documentation for this interface on `http://HOST:PORT/html/docs/cli-api.html?player=` where HOST and PORT are the host name and port for your Lyrion Music Server. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name(s) of the Squeezebox entities where to run the API method. -| `command` | no | Command to pass to Logitech Media Server (p0 in the CLI documentation). -| `parameters` | yes | Array of additional parameters to pass to Logitech Media Server (p1, ..., pN in the CLI documentation). +| `command` | no | Command to pass to Lyrion Music Server (p0 in the CLI documentation). +| `parameters` | yes | Array of additional parameters to pass to Lyrion Music Server (p1, ..., pN in the CLI documentation). -This service can be used to integrate any Squeezebox action to an automation. +This action can be used to integrate any Squeezebox action to an automation. It can also be used to target a Squeezebox from IFTTT (or Dialogflow, Alexa...). @@ -68,19 +70,19 @@ For example, to play an album from your collection, create an IFTTT applet like This can work with title search and basically any thing. The same wouldn't have worked by calling directly Squeezebox server as IFTTT cannot escape the text field. -### Service `call_query` +### Action `call_query` Call a custom Squeezebox JSON-RPC API. The result of the query will be stored in the 'query_result' attribute of the player. -See documentation for this interface on `http://HOST:PORT/html/docs/cli-api.html?player=` where HOST and PORT are the host name and port for your Logitech Media Server. +See documentation for this interface on `http://HOST:PORT/html/docs/cli-api.html?player=` where HOST and PORT are the host name and port for your Lyrion Music Server. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name(s) of the Squeezebox entities where to run the API method. -| `command` | no | Command to pass to Logitech Media Server (p0 in the CLI documentation). -| `parameters` | yes | Array of additional parameters to pass to Logitech Media Server (p1, ..., pN in the CLI documentation). +| `command` | no | Command to pass to Lyrion Music Server (p0 in the CLI documentation). +| `parameters` | yes | Array of additional parameters to pass to Lyrion Music Server (p1, ..., pN in the CLI documentation). -This service can be used to integrate a Squeezebox query into an automation. For example, in a Python script, you can get a list of albums available by an artist like this: +This action can be used to integrate a Squeezebox query into an automation. For example, in a Python script, you can get a list of albums available by an artist like this: `hass.services.call("squeezebox", "call_query", { "entity_id": "media_player.kitchen", "command": "albums", "parameters": ["0", "20", "search:beatles", "tags:al"] })` To work with the results: `result = hass.states.get("media_player.kitchen").attributes['query_result']` diff --git a/source/_integrations/starline.markdown b/source/_integrations/starline.markdown index f8be1291e3ce..40cf25ef66d2 100644 --- a/source/_integrations/starline.markdown +++ b/source/_integrations/starline.markdown @@ -35,44 +35,42 @@ This integration provides the following platforms: - Sensors: Battery level, SIM card balance, GSM signal level, GPS satellites count, fuel volume, mileage, OBD errors, interior temperature and engine temperature. - Switches: Start/stop engine, heater (webasto), additional channel, and service mode. - Buttons: Sound the horn. -- Services: Update the state, set update frequency. More details can be found [here](#services). +- Actions: Update the state, set update frequency. More details can be found [here](#actions). ## Prerequisites Create a new application in the [StarLine developer profile](https://my.starline.ru/developer). -<div class='note'> - +{% note %} The integration makes API calls to StarLine servers to retrieve data. It gets only the latest set of values that are valid for the moment of the API call. This means that the integration does not retrieve or store values, StarLine events, or parameters between the API calls. You can make up to 1000 API calls per day, which means you could make one approximately every 86 seconds. By default, the state of integration will be updated every 3 minutes and OBD information will be updated every 3 hours, making 488 calls per day. It is not recommended to set an update interval of less than 90 seconds. - -</div> +{% endnote %} {% include integrations/config_flow.md %} -## Services +## Actions ### Update the state -The service `starline.update_state` fetches the last state of the device from the StarLine server. +The `starline.update_state` action fetches the last state of the device from the StarLine server. -This service does not require any attributes. +This action does not require any attributes. ### Set scan interval -The service `starline.set_scan_interval` sets update frequency for entities. +The `starline.set_scan_interval` action sets update frequency for entities. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `scan_interval` | no | Update frequency in seconds. ### Set scan OBD interval -The service `starline.set_scan_obd_interval` sets update frequency for OBD information. +The `starline.set_scan_obd_interval` action sets update frequency for OBD information. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `scan_interval` | no | Update frequency in seconds. diff --git a/source/_integrations/starlingbank.markdown b/source/_integrations/starlingbank.markdown index fa3ea9e7a67e..f068d52e58e3 100644 --- a/source/_integrations/starlingbank.markdown +++ b/source/_integrations/starlingbank.markdown @@ -26,9 +26,9 @@ You can find more information about Starling Bank at [their website](https://www Once you have your own Starling bank account you will need to sign up for a Starling developer account [here](https://developer.starlingbank.com/signup). You won't need to do any development but you will need to get a "Personal Access Token" that will allow the integration to access your account balance. -<div class='note info'> - You control what access is granted using this token. This integration only needs very basic access (see below). -</div> +{% note %} +You control what access is granted using this token. This integration only needs very basic access (see below). +{% endnote %} Once you've signed up: diff --git a/source/_integrations/starlink.markdown b/source/_integrations/starlink.markdown index b2f3a251ac2f..a6a1319420b8 100644 --- a/source/_integrations/starlink.markdown +++ b/source/_integrations/starlink.markdown @@ -67,7 +67,7 @@ The Starlink integration allows you to integrate your [Starlink](https://www.sta ### Device tracker -- Device location - Tracks the location of Dishy. Note you need to allow location access on the local network via the Starlink app for this to work. This is disabled by default in the Starlink app and is thus disabled by default in Home Assistant. +- Device location - Tracks the latitude, longitude, and altitude of Dishy. You need to allow location access on the local network via the Starlink app for this to work. This is disabled by default in the Starlink app and is thus disabled by default in Home Assistant. ### Time diff --git a/source/_integrations/statistics.markdown b/source/_integrations/statistics.markdown index 1de46f9a0419..8c3c9f3d58a8 100644 --- a/source/_integrations/statistics.markdown +++ b/source/_integrations/statistics.markdown @@ -2,6 +2,7 @@ title: Statistics description: Instructions on how to integrate statistical sensors into Home Assistant. ha_category: + - Helper - Sensor - Utility ha_iot_class: Local Polling @@ -10,22 +11,45 @@ ha_quality_scale: internal ha_codeowners: - '@ThomDietrich' ha_domain: statistics +ha_config_flow: true ha_platforms: - sensor -ha_integration_type: integration +ha_integration_type: helper +ha_config_flow: true --- -The `statistics` sensor platform observes the state of a source sensor and provides aggregated statistical characteristics about its recent past. This integration can be useful in automations, e.g., to trigger an action when the air humidity in the bathroom settles after a hot shower or when the number of brewed coffee over a day gets too high. +The `statistics` integration observes the state of a source sensor and provides aggregated statistical characteristics about its recent past. This integration can be useful in automation, for example, to trigger an action when the air humidity in the bathroom settles after a hot shower or when the number of brewed coffees over a day gets too high. The statistics sensor updates with every update of the source sensor, for which the numeric `sensor` and `binary_sensor` are supported. The time period and/or number of recent state changes, which should be considered, must be given in configuration. Check the configuration section below for details. Assuming the [`recorder`](/integrations/recorder/) integration is running, historical sensor data is read from the database on startup and is available immediately after a restart of the platform. If the [`recorder`](/integrations/recorder/) integration is *not* running, it can take some time for the sensor to start reporting data because some characteristics calculations require more than one source sensor value. -<div class='note tip'> - +{% tip %} The `statistics` integration is different to [Long-term Statistics](https://developers.home-assistant.io/docs/core/entity/sensor/#long-term-statistics). More details on the differences can be found in the [2021.8.0 release notes](/blog/2021/08/04/release-20218/#long-term-statistics). - -</div> +{% endtip %} + +{% include integrations/config_flow.md %} + +Further information about these configuration options can be found under the [YAML configuration](#yaml-configuration) + +{% configuration_basic %} +Name: + description: The name the sensor should have. +Entity: + description: The entity that provides the input. Numeric `sensor` and `binary_sensor` are supported. +State_characteristic: + description: List of statistical characteristics to choose from. +Sampling size: + description: Maximum number of source sensor measurements stored. +Max age: + description: Maximum age of source sensor measurements stored. +Keep last sample: + description: Defines whether the most recent sampled value should be preserved regardless of the "Max age" setting. +Percentile: + description: Only relevant in combination with the percentile characteristic. Must be a value between 1 and 99. +Precision: + description: Defines the number of decimal places of the calculated sensor value. +{% endconfiguration_basic %} ## Characteristics @@ -90,7 +114,7 @@ A statistics sensor presents the following attributes for context about its inte | `buffer_usage_ratio` | Only when `sampling_size` is defined. Ratio (0.0-1.0) of the configured buffer size used by the stored source sensor measurements. A low number can indicate an unwanted mismatch between the configured limits and the source sensor behavior. The value 1.0 represents a full buffer, value 0 stands for an empty one. | `source_value_valid` | True/false indication whether the source sensor supplies valid values to the statistics sensor (judged by the last value received). -## Configuration +## YAML configuration Define a statistics sensor by adding lines similar to the following examples to your `configuration.yaml`: diff --git a/source/_integrations/steam_online.markdown b/source/_integrations/steam_online.markdown index 2c638e73d660..32ba8c8dce7e 100644 --- a/source/_integrations/steam_online.markdown +++ b/source/_integrations/steam_online.markdown @@ -18,13 +18,11 @@ The Steam integration will allow you to track the online status of public [Steam {% include integrations/config_flow.md %} -<div class='note'> - +{% important %} Steam has a friends list privacy feature that interferes with easily adding sensors to track friends' activities. Setting the friends list to Public during initial setup will allow the integration to see them for easy adding. It is **not** necessary to keep the friends list Public. Go to your profile, select "Edit Profile", "Privacy Settings". - -</div> +{% endimportant %} <p class='img'> <img src='/images/screenshots/steam_privacy_settings.png' /> diff --git a/source/_integrations/stiebel_eltron.markdown b/source/_integrations/stiebel_eltron.markdown index c870878c00f8..e58d2a1af09e 100644 --- a/source/_integrations/stiebel_eltron.markdown +++ b/source/_integrations/stiebel_eltron.markdown @@ -73,11 +73,9 @@ hub: type: string {% endconfiguration %} -<div class='note'> - +{% important %} This integration requires the [Modbus](/integrations/modbus/) integration to be set up to work - -</div> +{% endimportant %} Full configuration example including modbus setup shown below: diff --git a/source/_integrations/streamlabswater.markdown b/source/_integrations/streamlabswater.markdown index a5bc1e8de08a..60efd1ecec58 100644 --- a/source/_integrations/streamlabswater.markdown +++ b/source/_integrations/streamlabswater.markdown @@ -16,11 +16,9 @@ ha_integration_type: integration The StreamLabs Water integration is used to interact with [StreamLabs water monitoring devices](https://www.streamlabswater.com/) in order to retrieve usage information and manage the away mode of the device. The [StreamLabs Water API](https://developer.streamlabswater.com) is used to retrieve daily, monthly, and yearly water usage along with the current away mode. -<div class='note'> - +{% important %} Access to the StreamLabs Water API is not free, you must have a StreamPlus™ subscription level that enables API access. Visit [https://streamlabswater.com/subscription](https://streamlabswater.com/subscription) for more information. - -</div> +{% endimportant %} There is currently support for the following device types within Home Assistant: @@ -31,11 +29,11 @@ In preparation for using this integration you will need to request an API key fo {% include integrations/config_flow.md %} -## Service `set_away_mode` +## Action `set_away_mode` -You can use the service `streamlabswater.set_away_mode` to set the mode to `home` or `away`. The away mode will only be changed for the configured location. +You can use the `streamlabswater.set_away_mode` action to set the mode to `home` or `away`. The away mode will only be changed for the configured location. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|------------------------------------------------------------------------------------| | `away_mode` | no | String, must be `away` or `home`. | | `location_id` | yes | String, location id to change away mode for. Defaults to first available location. | diff --git a/source/_integrations/subaru.markdown b/source/_integrations/subaru.markdown index 60c91c162ad6..2a319f288197 100644 --- a/source/_integrations/subaru.markdown +++ b/source/_integrations/subaru.markdown @@ -41,9 +41,9 @@ In addition to the telematics generational differences, there are two levels of {% include integrations/config_flow.md %} -<p class='note'> +{% important %} If your account includes multiple vehicles, the same PIN will be used for all vehicles. Ensure that you have configured all vehicles in your account to have the same PIN. -</p> +{% endimportant %} ## Sensors @@ -64,15 +64,15 @@ Available sensors will vary by model, year, and subscription type. The integrati ## Lock This integration supports remote locking and unlocking of vehicle doors. If doors are remotely unlocked, they will automatically relock if a door is not opened within a minute. There is no remote notification of this automatic relock. -<p class='note'> +{% note %} The current lock status is always unknown due to the fact that the Subaru API does not report this data. -</p> +{% endnote %} ### Unlock specific door -In addition to the standard services built into the lock entity, this integration also provides a `subaru.unlock_specific_door` service to specify a door to unlock. +In addition to the standard actions built into the lock entity, this integration also provides a `subaru.unlock_specific_door` action to specify a door to unlock. -The service requires the `door` parameter which may be set to one of the following: +The action requires the `door` parameter which may be set to one of the following: - `all`: unlocks all doors - `driver`: unlocks only the driver's door @@ -86,13 +86,13 @@ Tracks the most recently reported location of the vehicle. The vehicle reports i Subaru integration options are set via: -**Settings** -> **Devices & Services** -> **Subaru** -> **Options**. +**Settings** -> **Devices & services** -> **Subaru** -> **Options**. - **Enable vehicle polling *[Default: off]*:** When enabled, vehicle polling will send a remote command to your vehicle every 2 hours to obtain new sensor data. This involves "waking" your vehicle and requesting that it send new data to Subaru servers. Without vehicle polling, new sensor data is only received when the vehicle automatically pushes data (normally after engine shutdown). This option only applies to vehicles with Security Plus subscriptions because it uses a "locate" command to request the data. -<p class='note warning'> +{% warning %} Vehicle polling draws power from the 12V battery. Long term use without driving may drain the battery resulting in the inability to start. -</p> +{% endwarning %} ## FAQ - Troubleshooting @@ -127,4 +127,4 @@ Vehicle polling draws power from the 12V battery. Long term use without driving **Q:** Should I enable the vehicle polling option? -**A:** Probably not. One use case is if you have a PHEV and want to monitor your charging progress. Otherwise, the data isn't going to change much after you've shutdown your vehicle (tire pressures are only updated when the vehicle is in motion). A future revision will expose vehicle polling as a service to enable incorporation into automations. +**A:** Probably not. One use case is if you have a PHEV and want to monitor your charging progress. Otherwise, the data isn't going to change much after you've shutdown your vehicle (tire pressures are only updated when the vehicle is in motion). A future revision will expose vehicle polling as an action to enable incorporation into automations. diff --git a/source/_integrations/sun.markdown b/source/_integrations/sun.markdown index 05c886ab639e..e637a4d806f7 100644 --- a/source/_integrations/sun.markdown +++ b/source/_integrations/sun.markdown @@ -57,7 +57,7 @@ sun: ## Automation trigger -The sun's event listener will call the service when the sun rises or sets with +The sun's event listener will perform the action when the sun rises or sets with an offset. The sun trigger need to have the type 'sun', which event (sunset or sunrise) and an optional offset. diff --git a/source/_integrations/surepetcare.markdown b/source/_integrations/surepetcare.markdown index 459af80e85a2..b7d239e7d465 100644 --- a/source/_integrations/surepetcare.markdown +++ b/source/_integrations/surepetcare.markdown @@ -24,13 +24,13 @@ The Sure Petcare integration allows you to get information on your Sure Petcare {% include integrations/config_flow.md %} -## Services +## Actions -### Service `surepetcare.set_lock_state` +### Action `surepetcare.set_lock_state` -This service lets you change the locking state of a flap. +This action lets you change the locking state of a flap. -| Service data attribute | Required | Type | Description | +| Data attribute | Required | Type | Description | | ---------------------- | -------- | -------- | ----------- | | `flap_id` | `True` | integer | Flap ID to change - see below for instructions on finding device ID | `lock_state` | `True` | string | New state to change the flap to @@ -48,11 +48,11 @@ The `flap_id` can be found following these instructions: - `locked_out` - flap is 'out only' - pets can go out, but not back in. - `locked_all` - flap is locked both ways. -### Service `surepetcare.set_pet_location` +### Action `surepetcare.set_pet_location` -This service lets you set the pet location. +This action lets you set the pet location. -| Service data attribute | Required | Type | Description | +| Data attribute | Required | Type | Description | | ---------------------- | -------- | -------- | ----------- | | `name` | yes | string | Pet name | `location` | yes | string | Pet location diff --git a/source/_integrations/swiss_hydrological_data.markdown b/source/_integrations/swiss_hydrological_data.markdown index efdff4639610..9b5ab53ec153 100644 --- a/source/_integrations/swiss_hydrological_data.markdown +++ b/source/_integrations/swiss_hydrological_data.markdown @@ -57,8 +57,8 @@ Sensors are exposing additional values through their attributes for all availabl - `min-24h`: The minimum measurement for the last 24 hours. - `station_update`: There is a time span between the sensor update in Home Assistant and the updates from the stations. Include those information if you are building automations based on the discharge of a water body. -<div class='note info'> - The sensors don't show the latest measurement, but those from the last hour due to the source of data. Some stations also don't provide data for certain measurements. -</div> +{% note %} +The sensors don't show the latest measurement, but those from the last hour due to the source of data. Some stations also don't provide data for certain measurements. +{% endnote %} The hydrological measurements are coming from the [Swiss Federal Office for the Environment (Bundesamt für Umwelt - Abt. Hydrologie)](https://www.hydrodaten.admin.ch/) and are updated every 10 minutes. diff --git a/source/_integrations/swisscom.markdown b/source/_integrations/swisscom.markdown index b7147f397a8f..7e6ac5557fb6 100644 --- a/source/_integrations/swisscom.markdown +++ b/source/_integrations/swisscom.markdown @@ -16,9 +16,9 @@ related: The `swisscom` {% term integration %} offers presence detection by looking at connected devices to an [Internet-Box](https://www.swisscom.ch/en/residential/help/device/internet-router.html) router from [Swisscom](https://www.swisscom.ch) which is an Internet provider in Switzerland. -<div class='note'> +{% note %} There are three models of Internet-Box (light, standard and plus). The platform has only been tested on the Internet-Box plus but the others should work as well because they have the same web interface. -</div> +{% endnote %} To use an Internet-Box router in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/switch.markdown b/source/_integrations/switch.markdown index dfd32c369da3..39c63f02fa58 100644 --- a/source/_integrations/switch.markdown +++ b/source/_integrations/switch.markdown @@ -21,7 +21,7 @@ related: Keeps track which switches are in your environment, their state and allows you to control them. - Maintains a state per switch and a combined state `all_switches`. -- Registers services `switch.turn_on`, `switch.turn_off`, and `switch.toggle` to control switches. +- Registers actions `switch.turn_on`, `switch.turn_off`, and `switch.toggle` to control switches. {% include integrations/building_block_integration.md %} @@ -35,14 +35,14 @@ Keeps track which switches are in your environment, their state and allows you t - **outlet**: A switch for a power outlet. - **switch**: A generic switch. -## Use the services +## Using the actions -In the frontend open the sidebar. At the bottom, under **Developer Tools**, click **Services**. From the Service dropdown menu choose `switch.turn_on` or `switch.turn_off` from the list of available services. In the Entity dropdown menu choose or enter the entity ID you want to work with. This will enter something like the sample below into the **Service Data** field. Now hit **CALL SERVICE**. +In the frontend open **Settings**. Select **Developer tools**, click **Actions**. From the **Action** dropdown menu choose `switch.turn_on` or `switch.turn_off` from the list of available actions. In the Entity dropdown menu choose or enter the entity ID you want to work with. This will enter something like the sample below into the **data** field. Now select **Perform action**. ```json {"entity_id":"switch.livingroom_pin2"} ``` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | String or list of strings that point at `entity_id`s of switches. To target all switches, set `entity_id` to `all`. | diff --git a/source/_integrations/switch.mqtt.markdown b/source/_integrations/switch.mqtt.markdown index 267ffcf1ef3e..1aade14aeffb 100644 --- a/source/_integrations/switch.mqtt.markdown +++ b/source/_integrations/switch.mqtt.markdown @@ -64,6 +64,10 @@ availability_topic: description: The MQTT topic subscribed to receive availability (online/offline) updates. Must not be used together with `availability`. required: false type: string +command_template: + description: Defines a [template](/docs/configuration/templating/#using-templates-with-the-mqtt-integration) to generate the payload to send to `command_topic`. The switch command template accepts the parameters `value`. The `value` parameter will contain the configured value for either `payload_on` or `payload_off`. + required: false + type: template command_topic: description: The MQTT topic to publish commands to change the switch state. required: true @@ -215,11 +219,9 @@ value_template: type: template {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/switch.rest.markdown b/source/_integrations/switch.rest.markdown index 17bb503a0e7a..fc16207d8a4e 100644 --- a/source/_integrations/switch.rest.markdown +++ b/source/_integrations/switch.rest.markdown @@ -98,9 +98,9 @@ verify_ssl: default: true {% endconfiguration %} -<div class='note warning'> +{% important %} Make sure that the URL matches exactly your endpoint or resource. -</div> +{% endimportant %} ## Example diff --git a/source/_integrations/switch.template.markdown b/source/_integrations/switch.template.markdown index c5c067d5e750..6f6ed17a8f48 100644 --- a/source/_integrations/switch.template.markdown +++ b/source/_integrations/switch.template.markdown @@ -3,10 +3,20 @@ title: "Template Switch" description: "Instructions on how to integrate Template Switches into Home Assistant." ha_category: - Switch + - Helper ha_release: 0.13 ha_iot_class: Local Push ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' ha_domain: template +ha_config_flow: true +ha_platforms: + - switch +ha_integration_type: helper +related: + - docs: /docs/configuration/ + title: Configuration file --- The `template` platform creates switches that combines components. @@ -15,7 +25,19 @@ For example, if you have a garage door with a toggle switch that operates the mo This can simplify the GUI and make it easier to write automations. -## Configuration +{% include integrations/config_flow.md %} + +{% important %} +To be able to add **{% my helpers title="Helpers" %}** via the user interface, you should have `default_config:` in your {% term "`configuration.yaml`" %}. It should already be there by default unless you removed it. +{% endimportant %} + +{% note %} +Configuration using our user interface provides a more limited subset of options, making this integration more accessible while covering most use cases. + +If you need more specific features for your use case, the manual [YAML-configuration section](#yaml-configuration) of this integration might provide them. +{% endnote %} + +## YAML Configuration To enable Template Switches in your installation, add the following to your {% term "`configuration.yaml`" %} file: @@ -145,7 +167,7 @@ switch: ### Multiple actions for turn_on or turn_off -This example shows multiple service calls for turn_on and turn_off. +This example shows multiple actions for turn_on and turn_off. {% raw %} diff --git a/source/_integrations/switch_as_x.markdown b/source/_integrations/switch_as_x.markdown index cb06a2442d16..cb8a0e6cd8f0 100644 --- a/source/_integrations/switch_as_x.markdown +++ b/source/_integrations/switch_as_x.markdown @@ -48,6 +48,6 @@ Type: ## **Change device type of a switch** from the existing entity -Where compatible, **Change device type of a switch** will appear on entity properties. A list of entities can be found in **{% my entities title="Settings > Devices & Services > Entities" %}**. +Where compatible, **Change device type of a switch** will appear on entity properties. A list of entities can be found in **{% my entities title="Settings > Devices & services > Entities" %}**. ![Entity properties example](/images/integrations/switch_as_x/Entities_Properties.png) diff --git a/source/_integrations/switchbot.markdown b/source/_integrations/switchbot.markdown index 22f37ebc1043..4ac2743686e7 100644 --- a/source/_integrations/switchbot.markdown +++ b/source/_integrations/switchbot.markdown @@ -62,7 +62,8 @@ Some SwitchBot devices need to be configured within the app before being control - [Indoor/Outdoor Meter](https://switch-bot.com/pages/switchbot-indoor-outdoor-thermo-hygrometer) (WoIOSensorTH) - [Motion Sensor (WoPresence)](https://switch-bot.com/pages/switchbot-motion-sensor) - Plug Mini (WoPlug), both the original (model W1901400) and HomeKit-enabled (model W1901401) -- [Lock (WoLock)](https://switch-bot.com/pages/switchbot-lock) (currently the Pro model is not supported) +- [Lock (WoLock)](https://switch-bot.com/pages/switchbot-lock) +- [Lock Pro (WoLockPro)](https://www.switch-bot.com/pages/switchbot-lock-pro) - [Blind Tilt (WoBlindTilt)](https://switch-bot.com/pages/switchbot-blind-tilt) - [Hub 2 (WoHub2)](https://switch-bot.com/pages/switchbot-hub-2) (currently only supports retrieving sensor data, does not yet support device control) @@ -77,7 +78,7 @@ There are three attributes available on the SwitchBot entity to give you more in - `Retry count`: How many times to retry sending commands to your SwitchBot devices. -## SwitchBot Lock +## SwitchBot Lock / SwitchBot Lock Pro The integration currently only uses the primary lock state; in dual lock mode, not all things might work properly. @@ -94,9 +95,9 @@ Password: description: SwitchBot account password {% endconfiguration_basic %} -<div class='note warning'> +{% important %} This integration doesn't support SSO accounts (Login with Google, etc.) only username and password accounts. -</div> +{% endimportant %} ### Enter the lock encryption key manually @@ -121,11 +122,11 @@ The blind tilt is exposed as a cover entity with control of the tilt position on | 50% | Fully Open | | 0% | Closed Down | -The close button will close the blinds to the closest closed position (either 0% or 100%), and defaults to closing down if the blinds are fully open. Because Home Assistant believes 100% is open, the default cards will disable the open button when the tilt is at 100%, but the service call will still work and open the blind to 50%. +The close button will close the blinds to the closest closed position (either 0% or 100%), and defaults to closing down if the blinds are fully open. Because Home Assistant believes 100% is open, the default cards will disable the open button when the tilt is at 100%, but the action will still work and open the blind to 50%. ### Simple cover template entity -Some integrations may expose your SwitchBot Blind Tilt to other services which expect that 100% is open and 0% is fully closed. Using a [Cover Template](/integrations/cover.template), a proxy entity can be created which will be open at 100% and closed at 0%. This template entity is limited to closing in one direction. +Some integrations may expose your SwitchBot Blind Tilt to other actions which expect that 100% is open and 0% is fully closed. Using a [Cover Template](/integrations/cover.template), a proxy entity can be created which will be open at 100% and closed at 0%. This template entity is limited to closing in one direction. {% raw %} diff --git a/source/_integrations/switchbot_cloud.markdown b/source/_integrations/switchbot_cloud.markdown index 3bacae231bbf..afac48dd1384 100644 --- a/source/_integrations/switchbot_cloud.markdown +++ b/source/_integrations/switchbot_cloud.markdown @@ -44,10 +44,10 @@ Please note, device names configured in the SwitchBot app are transferred into H ## Important considerations -<div class='note warning'> +{% note %} Each sensor will request a status update from the SwitchBot Cloud API once every 10 minutes (600 seconds). The SwitchBot Cloud API limits users to 10,000 requests per day. -</div> +{% endnote %} -<div class='note warning'> +{% warning %} For IR Appliances, the state is inferred from previous commands in Home Assistant and might not reflect reality if you use other ways to control the device. -</div> +{% endwarning %} diff --git a/source/_integrations/switcher_kis.markdown b/source/_integrations/switcher_kis.markdown index a45354cbc1df..abe24ecd0e26 100644 --- a/source/_integrations/switcher_kis.markdown +++ b/source/_integrations/switcher_kis.markdown @@ -59,28 +59,28 @@ For Switcher power control devices (Switcher Power Plug, Switcher Touch, Switche *Currently not supported for Switcher Power Plug -## Services +## Actions For Switcher power control devices (Switcher Touch, Switcher V2/V4) the integration provides the following sensors: -### Service: `switcher_kis.set_auto_off` +### Action: `switcher_kis.set_auto_off` -You can use the `switcher_kis.set_auto_off` service to set the auto-off configuration setting for the device. +You can use the `switcher_kis.set_auto_off` action to set the auto-off configuration setting for the device. Meaning the device will turn itself off when reaching the auto-off configuration limit. -| Service Field | Mandatory | Description | Example | +| Data attribute | Mandatory | Description | Example | | ------------- | --------- | -------------------------------------------------------------------------------------- | -------------------------- | | `entity_id` | Yes | Name of the entity id associated with the integration, used for permission validation | switch.switcher_kis_boiler | | `auto_off` | Yes | Time period string containing hours and minutes | "02:30" | -### Service: `switcher_kis.turn_on_with_timer` +### Action: `switcher_kis.turn_on_with_timer` -You can use the `switcher_kis.turn_on_with_timer` service to turn on the switcher device with timer. +You can use the `switcher_kis.turn_on_with_timer` action to turn on the switcher device with timer. Meaning the device will turn itself off when timer ends. Note: This does not affect the auto off timer. -| Service Field | Mandatory | Description | Example | +| Data attribute | Mandatory | Description | Example | | ------------- | --------- | -------------------------------------------------------------------------------------- | -------------------------- | | `entity_id` | Yes | Name of the entity id associated with the integration, used for permission validation | switch.switcher_kis_boiler | | `timer_minutes` | Yes | Integer containing timer minutes (valid range 1 to 150) | 90 | diff --git a/source/_integrations/synology_chat.markdown b/source/_integrations/synology_chat.markdown index d11fad1f9195..bb0a16bddcb2 100644 --- a/source/_integrations/synology_chat.markdown +++ b/source/_integrations/synology_chat.markdown @@ -31,7 +31,7 @@ notify: {% configuration %} name: - description: "Setting the parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`." + description: "Setting the parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: true type: string verify_ssl: @@ -47,7 +47,7 @@ resource: To use notifications, please see the [getting started with automation page](/getting-started/automation/). -A full example of a service call: +A full example of an action: ```json {"message": "This is a test message", diff --git a/source/_integrations/synology_dsm.markdown b/source/_integrations/synology_dsm.markdown index e94ea8c6a076..14fffc05fb45 100644 --- a/source/_integrations/synology_dsm.markdown +++ b/source/_integrations/synology_dsm.markdown @@ -31,21 +31,17 @@ The Synology DSM integration provides access to various statistics from your [Sy {% include integrations/config_flow.md %} -<div class='note warning'> - +{% warning %} This sensor will wake up your Synology NAS if it's in hibernation mode. You can change the scan interval within the configuration options (default is 15 min). Having cameras or the Home mode toggle from [Surveillance Station](https://www.synology.com/en-us/surveillance) will fetch every 30 seconds. Disable those entities if you don't want your NAS to be fetched as frequently. +{% endwarning %} -</div> - -<div class='note'> - +{% important %} When SSDP is activated on a NAS with two or more NICs with different IP addresses on the same subnet an adoption loop will occur. The NAS will be detected several times with different IP addresses and the integration will adopt the "newly" detected IP causing a reload. To resolve this either <a href="https://kb.synology.com/en-id/DSM/help/DSM/AdminCenter/file_service_advanced_introduction?version=7" target="_blank">deactivate SSDP on the NAS</a> or use NIC bonding so that only one IP address is present. - -</div> +{% endimportant %} ## Separate User Configuration @@ -61,9 +57,9 @@ If you have the "Enforce 2-step verification for the following users" option che Make sure to log out of your "normal" user's account and then login with the separate user you created specifically for Home Assistant. DSM will walk you through the process of setting up the one-time password for this user which you'll then be able to use in Home Assistant's frontend configuration screen. -<div class='note'> +{% note %} If you denied access to all locations and applications it is normal to receive a message indicating you do not have access to DSM when trying to login with this separate user. As noted above, you do not need access to the DSM and Home Assistant will still be able to read statistics from your NAS. -</div> +{% endnote %} ## Sensors @@ -99,11 +95,9 @@ Entities reporting status, total size (TB), used size (TB), % of volume used, av Entity reporting the security status of the NAS. -<div class='note'> - +{% note %} The security status corresponds with the analysis of the DSM Security Advisor, e.g., an `outOfDate` state for the `Update` attribute not only reflects the update status of the installed DSM version but also the status of the installed DSM packages. - -</div> +{% endnote %} ### Disk sensors diff --git a/source/_integrations/syslog.markdown b/source/_integrations/syslog.markdown index 024e87613054..253c2564a4e6 100644 --- a/source/_integrations/syslog.markdown +++ b/source/_integrations/syslog.markdown @@ -28,7 +28,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string diff --git a/source/_integrations/system_bridge.markdown b/source/_integrations/system_bridge.markdown index 3a5ada8f4dbf..974b1fdfade3 100644 --- a/source/_integrations/system_bridge.markdown +++ b/source/_integrations/system_bridge.markdown @@ -101,7 +101,7 @@ This integration is available as a media source to use with the media browser in The integration provides an update component, which will notify you when a new version of the app is available. -## Services +## Actions ### Notifications `notify.system_bridge_hostname` @@ -163,11 +163,11 @@ Here is an example action that will open a URL in the device's browser: This is an object containing the `source` and `volume` (0-100). The source must be a URL to a playable audio file (an MP3 for example). -### Service `system_bridge.get_process_by_id` +### Action `system_bridge.get_process_by_id` Returns a process by its pid. -{% my developer_call_service service="system_bridge.get_process_by_id" title="Show service in your Home Assistant instance." %} +{% my developer_call_service service="system_bridge.get_process_by_id" title="Show action in your Home Assistant instance." %} ```yaml service: system_bridge.get_process_by_id @@ -190,11 +190,11 @@ username: hostname\user working_directory: null ``` -### Service `system_bridge.get_processes_by_name` +### Action `system_bridge.get_processes_by_name` Returns a count and a list of processes matching the name provided. -{% my developer_call_service service="system_bridge.get_processes_by_name" title="Show service in your Home Assistant instance." %} +{% my developer_call_service service="system_bridge.get_processes_by_name" title="Show action in your Home Assistant instance." %} ```yaml service: system_bridge.get_processes_by_name @@ -219,11 +219,11 @@ processes: working_directory: null ``` -### Service `system_bridge.open_path` +### Action `system_bridge.open_path` Open a URL or file on the server using the default application. -{% my developer_call_service service="system_bridge.open_path" title="Show service in your Home Assistant instance." %} +{% my developer_call_service service="system_bridge.open_path" title="Show action in your Home Assistant instance." %} ```yaml service: system_bridge.open_path @@ -242,11 +242,11 @@ data: message: Path opened ``` -### Service `system_bridge.open_url` +### Action `system_bridge.open_url` Open a URL or file on the server using the default application. -{% my developer_call_service service="system_bridge.open_url" title="Show service in your Home Assistant instance." %} +{% my developer_call_service service="system_bridge.open_url" title="Show action in your Home Assistant instance." %} ```yaml service: system_bridge.open_url @@ -265,11 +265,11 @@ data: message: URL opened ``` -### Service`system_bridge.send_keypress` +### Action`system_bridge.send_keypress` Send a keypress to the server. -{% my developer_call_service service="system_bridge.send_keypress" title="Show service in your Home Assistant instance." %} +{% my developer_call_service service="system_bridge.send_keypress" title="Show action in your Home Assistant instance." %} ```yaml service: system_bridge.send_keypress @@ -288,11 +288,11 @@ data: message: Key pressed ``` -### Service `system_bridge.send_text` +### Action `system_bridge.send_text` Sends text for the server to type. -{% my developer_call_service service="system_bridge.send_text" title="Show service in your Home Assistant instance." %} +{% my developer_call_service service="system_bridge.send_text" title="Show action in your Home Assistant instance." %} ```yaml service: system_bridge.send_text @@ -311,7 +311,7 @@ data: message: Text entered ``` -### Service `system_bridge.power_command` +### Action `system_bridge.power_command` Sends power command to the system. @@ -324,7 +324,7 @@ Supported commands are: - `shutdown` - `sleep` -{% my developer_call_service service="system_bridge.power_command" title="Show service in your Home Assistant instance." %} +{% my developer_call_service service="system_bridge.power_command" title="Show action in your Home Assistant instance." %} ```yaml service: system_bridge.power_command diff --git a/source/_integrations/system_log.markdown b/source/_integrations/system_log.markdown index 130b085f3c15..29dc0ab2ad4a 100644 --- a/source/_integrations/system_log.markdown +++ b/source/_integrations/system_log.markdown @@ -33,17 +33,17 @@ fire_event: default: false {% endconfiguration %} -## Services +## Actions -### Service `clear` +### Action `clear` -To manually clear the system log, call this service. +To manually clear the system log, use this action. -### Service `write` +### Action `write` Write a log entry -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------ | | `message` | no | Message to log | | `level` | yes | Log level: debug, info, warning, error, critical. Defaults to 'error'. | @@ -103,19 +103,19 @@ automation: ### Conditional Messages -This automation will create a persistent notification whenever an error or warning is logged that has the word "service" in the message: +This automation will create a persistent notification whenever an error or warning is logged that has the word "action" in the message: {% raw %} ```yaml automation: - - alias: "Create notifications for 'service' errors" + - alias: "Create notifications for 'action' errors" trigger: platform: event event_type: system_log_event condition: condition: template - value_template: '{{ "service" in trigger.event.data.message[0] }}' + value_template: '{{ "action" in trigger.event.data.message[0] }}' action: service: persistent_notification.create data: diff --git a/source/_integrations/systemmonitor.markdown b/source/_integrations/systemmonitor.markdown index 9f0a633c0eb8..63ea25a6954f 100644 --- a/source/_integrations/systemmonitor.markdown +++ b/source/_integrations/systemmonitor.markdown @@ -59,7 +59,7 @@ memory usage, CPU usage, and running processes. ## Add `process` binary sensor -The `process` binary sensor needs to be configured by the config entry options. Go to **{% my integrations title="Settings > Devices & Services" %}**, select the **System Monitor** integration and click **Configure** to select which `process` binary sensors should be created. +The `process` binary sensor needs to be configured by the config entry options. Go to **{% my integrations title="Settings > Devices & services" %}**, select the **System Monitor** integration and click **Configure** to select which `process` binary sensors should be created. ## Disk usage diff --git a/source/_integrations/tado.markdown b/source/_integrations/tado.markdown index fef0583f767b..bf5ec209245d 100644 --- a/source/_integrations/tado.markdown +++ b/source/_integrations/tado.markdown @@ -57,34 +57,34 @@ Polling Tado API for presence information will happen at most once every 30 seco Beware that the Tado (v2) API does not provide GPS location of devices, only a bearing, therefore Home Assistant only uses `home`/`not-home` status. -## Services +## Actions -### Service `tado.set_climate_timer` +### Action `tado.set_climate_timer` -You can use the service `tado.set_climate_timer` to set your Tado climate device, for example a radiator valve, to switch on for a set time period. +You can use the `tado.set_climate_timer` action to set your Tado climate device, for example a radiator valve, to switch on for a set time period. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------- | | `entity_id` | yes | String, Name of entity e.g., `climate.heating` | | `temperature` | no | String, The required target temperature e.g., `20.5` | | `time_period` | yes | Time Period, Period of time the boost should last for e.g., `01:30:00` | | `overlay` | yes | Override your defaults setting. NB dont set this and the time period | -### Service `tado.set_water_heater_timer` +### Action `tado.set_water_heater_timer` -You can use the service `tado.set_water_heater_timer` to set your water heater to switch on for a set time period. +You can use the `tado.set_water_heater_timer` action to set your water heater to switch on for a set time period. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------- | | `entity_id` | yes | String, Name of entity e.g., `water_heater.hot_water` | | `time_period` | no | Time Period, Period of time the boost should last for e.g., `01:30:00` | | `temperature` | yes | String, The required target temperature e.g., `20.5` | -### Service `tado.set_climate_temperature_offset` +### Action `tado.set_climate_temperature_offset` -You can use the service `tado.set_climate_temperature_offset` to set the temperature offset for Tado climate devices. +You can use the `tado.set_climate_temperature_offset` action to set the temperature offset for Tado climate devices. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------- | | `entity_id` | yes | String, Name of entity e.g., `climate.heating` | | `offset` | no | Float, Offset you would like to set | @@ -143,11 +143,11 @@ automation: ``` {% endraw %} -### Service `tado.add_meter_reading` +### Action `tado.add_meter_reading` -You can use the service `tado.add_meter_reading` to add your meter readings to Tado Energy IQ. With Energy IQ, you can track your energy consumption and take control of your heating expenses. +You can use the `tado.add_meter_reading` action to add your meter readings to Tado Energy IQ. With Energy IQ, you can track your energy consumption and take control of your heating expenses. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------- | | `config_entry` | no | String, Config entry to add meter readings to. | | `reading` | no | Integer, Reading in m³ or kWh without decimals. | diff --git a/source/_integrations/tag.markdown b/source/_integrations/tag.markdown index f74e3d8d8d12..579b20eef674 100644 --- a/source/_integrations/tag.markdown +++ b/source/_integrations/tag.markdown @@ -9,8 +9,6 @@ ha_codeowners: - '@dmulcahey' ha_domain: tag ha_quality_scale: internal -ha_platforms: - - event ha_integration_type: integration --- @@ -29,9 +27,9 @@ The easiest way to get started with tags is to use NFC tags ([stickers](https:// <lite-youtube videoid="Xc120lClUgA" videotitle="Writing a tag (iOS)" posterquality="maxresdefault"></lite-youtube> -<div class='note' data-title='for iPhone users'> +{% important %} Only iPhone XS, XR and iPhone 11 or later support background NFC tag reading. -</div> +{% endimportant %} <lite-youtube videoid="xE7wm1bxRLs" videotitle="Writing a tag (Android)" posterquality="maxresdefault"></lite-youtube> diff --git a/source/_integrations/tailscale.markdown b/source/_integrations/tailscale.markdown index b1fa85a9ffda..279db85f5897 100644 --- a/source/_integrations/tailscale.markdown +++ b/source/_integrations/tailscale.markdown @@ -23,16 +23,14 @@ The Tailscale integration integrates the [Tailscale](https://www.tailscale.com) with Home Assistant; giving you the possibility to monitor and automate on the state of the devices in your Tailscale VPN network (Tailnet). -<div class="note"> - +{% important %} This integration **DOES NOT** make your Home Assistant accessible via Tailscale VPN remotely! 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/). - -</div> +{% endimportant %} ## Prerequisites diff --git a/source/_integrations/tankerkoenig.markdown b/source/_integrations/tankerkoenig.markdown index 2e2c37659d9b..a13e991a25ff 100755 --- a/source/_integrations/tankerkoenig.markdown +++ b/source/_integrations/tankerkoenig.markdown @@ -25,6 +25,6 @@ To use this sensor you need an API key from tankerkoenig. Go to [tankerkoenig AP {% include integrations/config_flow.md %} -<div class='note'> +{% important %} The Terms & Conditions of tankerkoenig.de specify that the API is not meant for massive data fetching, but it does not explicitly mention a limit. Having a maximum of 10 monitored fuel stations is recommended, and a warning will be issued otherwise. -</div> +{% endimportant %} diff --git a/source/_integrations/technove.markdown b/source/_integrations/technove.markdown index 0693a8012166..1516bdfaaf52 100644 --- a/source/_integrations/technove.markdown +++ b/source/_integrations/technove.markdown @@ -12,6 +12,7 @@ ha_codeowners: - '@Moustachauve' ha_platforms: - binary_sensor + - number - sensor - switch ha_integration_type: device @@ -32,6 +33,14 @@ The {% term integration %} adds the following binary sensors: - Static IP - Connected / Not Connected - Update - Up-to-date / Update available +## Number + +The {% term integration %} adds the following number entity: + +| Name | Description | +| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| max current | Determines the maximum current limit that the charging station can provide to the vehicle. Note: this value can only be set when the power-sharing mode is not enabled. | + ## Sensors The {% term integration %} adds the following sensors: @@ -50,4 +59,6 @@ The {% term integration %} adds the following sensors: The {% term integration %} adds the following switch: -- Auto-charge mode +| Name | Description | +| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Auto-charge mode | When enabled, vehicles will start charging automatically when plugged in. When turned off, charging will need to be manually started each time a vehicle is plugged in. Note: Disabling auto-charge mode does not interrupt an ongoing charging session. | diff --git a/source/_integrations/tedee.markdown b/source/_integrations/tedee.markdown index e56c479960c2..31d5afd42536 100644 --- a/source/_integrations/tedee.markdown +++ b/source/_integrations/tedee.markdown @@ -31,6 +31,10 @@ This integration interacts with your [Tedee](https://tedee.com) locks by communi If you do not own the bridge, you can still add your locks to Home Assistant through the [HomeKit device integration](/integrations/homekit_controller/). Communication will happen over Bluetooth in that case, and features will be limited. +{% note %} +The integration will try to configure callbacks to receive near-real-time push updates from your bridge about your lock state changes. For this to work properly, the bridge must be able to reach your Home Assistant instance. It will prefer the configured `internal_url`, so ensure this address is reachable from your bridge on your network. +{% endnote %} + {% include integrations/config_flow.md %} {% configuration_basic %} diff --git a/source/_integrations/telegram.markdown b/source/_integrations/telegram.markdown index c534277d85b0..a1aa109c4e25 100644 --- a/source/_integrations/telegram.markdown +++ b/source/_integrations/telegram.markdown @@ -58,8 +58,8 @@ To create your first [Telegram bot](https://core.telegram.org/bots#how-do-i-crea 5. From the conversation with BotFather, select the link to open a chat with your new bot. 6. In the chat with the new bot, enter `/start`. -7. Test the service: - - Go to [**Developer tools** > **Services** > **YAML mode**](https://my.home-assistant.io/redirect/developer_call_service/?service=homeassistant.turn_on). +7. Test the action: + - Go to [**Developer tools** > **Actions** > **YAML mode**](https://my.home-assistant.io/redirect/developer_call_service/?service=homeassistant.turn_on). - Paste this into the YAML file: - Replace the `service` and the `message` with your data. @@ -68,7 +68,7 @@ To create your first [Telegram bot](https://core.telegram.org/bots#how-do-i-crea data: message: "Yay! A message from Home Assistant." ``` - - Select **Call service**. You should now get a message. + - Select **Perform action**. You should now get a message. 8. You can do more with this. Check out the configuration descriptions and examples below. @@ -118,9 +118,9 @@ $ python3 123456789 ``` -<div class='note'> +{% tip %} If you want to add new chat IDs then you will need to disable the active configuration to actually see the result with the IDs, otherwise you may only get empty results array. -</div> +{% endtip %} **Method 4:** You can also get the chat ID from the Home Assistant logs. If you have set up the bot already, you can send a message to your bot from an unauthorized ID and you will see an error entry in the log containing the ID. @@ -160,7 +160,7 @@ Refer to the platforms mentioned in the {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: notify type: string @@ -267,7 +267,7 @@ inline_keyboard: type: list {% endconfiguration %} -<div class='note'> +{% important %} Since Home Assistant version 0.48 you have to [whitelist the source folder](/integrations/homeassistant/#allowlist_external_dirs) of the file you want to include in the notification. @@ -280,7 +280,7 @@ homeassistant: - /home/kenji/data ``` -</div> +{% endimportant %} ### Video support diff --git a/source/_integrations/telegram_bot.markdown b/source/_integrations/telegram_bot.markdown index 92cd8dbba847..39a3c55949c3 100644 --- a/source/_integrations/telegram_bot.markdown +++ b/source/_integrations/telegram_bot.markdown @@ -11,19 +11,19 @@ ha_integration_type: integration Use Telegram on your mobile or desktop device to send and receive messages or commands to/from your Home Assistant. -This integration creates notification services to send, or edit previously sent, messages from a [Telegram Bot account](https://core.telegram.org/bots) configured either with the [polling](/integrations/telegram_polling) platform or with the [webhooks](/integrations/telegram_webhooks) one, and trigger events when receiving messages. +This integration creates notification actions to send, or edit previously sent, messages from a [Telegram Bot account](https://core.telegram.org/bots) configured either with the [polling](/integrations/telegram_polling) platform or with the [webhooks](/integrations/telegram_webhooks) one, and trigger events when receiving messages. If you don't need to receive messages, you can use the [broadcast](/integrations/telegram_broadcast) platform instead. -## Notification services +## Notification actions -Available services: `send_message`, `send_photo`, `send_video`, `send_animation`, `send_voice`, `send_sticker`, `send_document`, `send_location`, `edit_message`, `edit_caption`, `edit_replymarkup`, `answer_callback_query`, `delete_message` and `leave_chat`. +Available actions: `send_message`, `send_photo`, `send_video`, `send_animation`, `send_voice`, `send_sticker`, `send_document`, `send_location`, `edit_message`, `edit_caption`, `edit_replymarkup`, `answer_callback_query`, `delete_message` and `leave_chat`. -### Service `telegram_bot.send_message` +### Action `telegram_bot.send_message` Send a notification. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | -------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `message` | no | Message body of the notification. | | `title` | yes | Optional title for your notification. Will be composed as '%title\n%message'. | @@ -39,11 +39,11 @@ Send a notification. | `reply_to_message_id` | yes | Mark the message as a reply to a previous message. In `telegram_callback` handling, for example, you can use {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %} | | `message_thread_id` | yes | Send the message to a specific topic or thread. -### Service `telegram_bot.send_photo` +### Action `telegram_bot.send_photo` Send a photo. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `url` | no | Remote path to an image. | | `file` | no | Local path to an image. | @@ -64,11 +64,11 @@ Send a photo. | `reply_to_message_id` | yes | Mark the message as a reply to a previous message. In `telegram_callback` handling, for example, you can use {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %} | | `message_thread_id` | yes | Send the message to a specific topic or thread. -### Service `telegram_bot.send_video` +### Action `telegram_bot.send_video` Send a video. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `url` | no | Remote path to a video. | | `file` | no | Local path to a video. | @@ -88,11 +88,11 @@ Send a video. | `reply_to_message_id` | yes | Mark the message as a reply to a previous message. In `telegram_callback` handling, for example, you can use {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %} | | `message_thread_id` | yes | Send the message to a specific topic or thread. -### Service `telegram_bot.send_animation` +### Action `telegram_bot.send_animation` Send an animation. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `url` | no | Remote path to a GIF or H.264/MPEG-4 AVC video without sound. | | `file` | no | Local path to a GIF or H.264/MPEG-4 AVC video without sound. | @@ -113,11 +113,11 @@ Send an animation. | `reply_to_message_id` | yes | Mark the message as a reply to a previous message. In `telegram_callback` handling, for example, you can use {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %} | | `message_thread_id` | yes | Send the message to a specific topic or thread. -### Service `telegram_bot.send_voice` +### Action `telegram_bot.send_voice` Send a voice message. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `url` | no | Remote path to a voice message. | | `file` | no | Local path to a voice message. | @@ -137,11 +137,11 @@ Send a voice message. | `reply_to_message_id` | yes | Mark the message as a reply to a previous message. In `telegram_callback` handling, for example, you can use {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %} | | `message_thread_id` | yes | Send the message to a specific topic or thread. -### Service `telegram_bot.send_sticker` +### Action `telegram_bot.send_sticker` Send a sticker. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `url` | no | Remote path to a static .webp or animated .tgs sticker. | | `file` | no | Local path to a static .webp or animated .tgs sticker. | @@ -161,11 +161,11 @@ Send a sticker. | `reply_to_message_id` | yes | Mark the message as a reply to a previous message. In `telegram_callback` handling, for example, you can use {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %} | | `message_thread_id` | yes | Send the message to a specific topic or thread. -### Service `telegram_bot.send_document` +### Action `telegram_bot.send_document` Send a document. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `url` | no | Remote path to a document. | | `file` | no | Local path to a document. | @@ -186,11 +186,11 @@ Send a document. | `reply_to_message_id` | yes | Mark the message as a reply to a previous message. In `telegram_callback` handling, for example, you can use {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %} | | `message_thread_id` | yes | Send the message to a specific topic or thread. -### Service `telegram_bot.send_location` +### Action `telegram_bot.send_location` Send a location. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `latitude` | no | The latitude to send. | | `longitude` | no | The longitude to send. | @@ -204,11 +204,11 @@ Send a location. | `reply_to_message_id` | yes | Mark the message as a reply to a previous message. In `telegram_callback` handling, for example, you can use {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %} | | `message_thread_id` | yes | Send the message to a specific topic or thread. -### Service `telegram_bot.send_poll` +### Action `telegram_bot.send_poll` Send a poll. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `question` | no | Poll question, 1-300 characters. | | `options` | no | List of answer options, 2-10 strings 1-100 characters each. | @@ -221,11 +221,11 @@ Send a poll. | `reply_to_message_id` | yes | Mark the message as a reply to a previous message. In `telegram_callback` handling, for example, you can use {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %} | | `message_thread_id` | yes | Send the message to a specific topic or thread. -### Service `telegram_bot.edit_message` +### Action `telegram_bot.edit_message` Edit a previously sent message in a conversation. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | -------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `message_id` | no | Id of the message to edit. When answering a callback from a pressed button, the id of the origin message is in: {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %}. You can use `"last"` to refer to the last message sent to `chat_id`. | | `chat_id` | no | The chat_id where to edit the message. | @@ -235,11 +235,11 @@ Edit a previously sent message in a conversation. | `disable_web_page_preview` | yes | True/false for disable link previews for links in the message. | | `inline_keyboard` | yes | List of rows of commands, comma-separated, to make a custom inline keyboard with buttons with associated callback data or external URL (https-only). Example: `["/button1, /button2", "/button3"]` or `[[["Text btn1", "/button1"], ["Text btn2", "/button2"]], [["Google link", "https://google.com"]]]` | -### Service `telegram_bot.edit_caption` +### Action `telegram_bot.edit_caption` Edit the caption of a previously sent message. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | -------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `message_id` | no | Id of the message to edit. When answering a callback from a pressed button, the id of the origin message is in: {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %}. You can use `"last"` to refer to the last message sent to `chat_id`. | | `chat_id` | no | The chat_id where to edit the caption. | @@ -247,41 +247,41 @@ Edit the caption of a previously sent message. | `disable_web_page_preview` | yes | True/false for disable link previews for links in the message. | | `inline_keyboard` | yes | List of rows of commands, comma-separated, to make a custom inline keyboard with buttons with associated callback data or external URL (https-only). Example: `["/button1, /button2", "/button3"]` or `[[["Text btn1", "/button1"], ["Text btn2", "/button2"]], [["Google link", "https://google.com"]]]` | -### Service `telegram_bot.edit_replymarkup` +### Action `telegram_bot.edit_replymarkup` Edit the inline keyboard of a previously sent message. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | -------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `message_id` | no | Id of the message to edit. When answering a callback from a pressed button, the id of the origin message is in: {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %}. You can use `"last"` to refer to the last message sent to `chat_id`. | | `chat_id` | no | The chat_id where to edit the reply_markup. | | `disable_web_page_preview` | yes | True/false for disable link previews for links in the message. | | `inline_keyboard` | yes | List of rows of commands, comma-separated, to make a custom inline keyboard with buttons with associated callback data or external URL (https-only). Example: `["/button1, /button2", "/button3"]` or `[[["Text btn1", "/button1"], ["Text btn2", "/button2"]], [["Google link", "https://google.com"]]]` | -### Service `telegram_bot.answer_callback_query` +### Action `telegram_bot.answer_callback_query` Respond to a callback query originated by clicking on an online keyboard button. The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- | | `message` | no | Unformatted text message body of the notification. | | `callback_query_id` | no | Unique id of the callback response. In the `telegram_callback` event data: {% raw %}`{{ trigger.event.data.id }}`{% endraw %} | | `show_alert` | yes | True/false for show a permanent notification. Defaults to False. | -### Service `telegram_bot.delete_message` +### Action `telegram_bot.delete_message` Delete a previously sent message in a conversation. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `message_id` | no | Id of the message to delete. When answering a callback from a pressed button, the id of the origin message is in: {% raw %}`{{ trigger.event.data.message.message_id }}`{% endraw %}. You can use `"last"` to refer to the last message sent to `chat_id`. | | `chat_id` | no | The chat_id where to delete the message. | -### Service `telegram_bot.leave_chat` +### Action `telegram_bot.leave_chat` Remove the bot from the chat group where it was added. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------- | | `chat_id` | no | The chat_id from where to remove the bot. | diff --git a/source/_integrations/telegram_broadcast.markdown b/source/_integrations/telegram_broadcast.markdown index 483b75a94f39..4ef98a5522ac 100644 --- a/source/_integrations/telegram_broadcast.markdown +++ b/source/_integrations/telegram_broadcast.markdown @@ -9,7 +9,7 @@ ha_domain: telegram_bot Telegram implementation to support **sending messages only**. Your Home Assistant instance does not have to be exposed to the internet and there is no polling to receive messages or commands sent to the bot. -Information on how to send a message via the service `telegram_bot.send_message` can be found [here](/integrations/telegram_bot/#service-telegram_botsend_message). +Information on how to send a message via the `telegram_bot.send_message` action can be found [here](/integrations/telegram_bot/#action-telegram_botsend_message). ## Configuration @@ -27,7 +27,7 @@ telegram_bot: {% configuration %} allowed_chat_ids: - description: A list of ids representing the users and group chats to which messages can be send. Default the message will be send to the first alllowed chat_id. By using the `target` service data attribute the message can be send to other chat_ids from the list. + description: A list of ids representing the users and group chats to which messages can be send. Default the message will be send to the first alllowed chat_id. By using the `target` action data attribute the message can be send to other chat_ids from the list. required: true type: list api_key: diff --git a/source/_integrations/tellduslive.markdown b/source/_integrations/tellduslive.markdown index fff4e120dc73..e62e25fa8d65 100644 --- a/source/_integrations/tellduslive.markdown +++ b/source/_integrations/tellduslive.markdown @@ -29,11 +29,9 @@ related: The `tellduslive` {% term integration %} let you connect to the [Telldus Live](https://live.telldus.com) API. It's cloud platform that connects to your Tellstick Net or Tellstick ZNet connected gear at home. -<div class='note'> - -Note that you need a [Telldus Premium](https://telldus.com/en/telldus-premium/) subscription to access the Cloud API (https://telldus.com/en/important-announcement-english/). - -</div> +{% important %} +You need a [Telldus Premium](https://telldus.com/en/telldus-premium/) subscription to access the Cloud API (https://telldus.com/en/important-announcement-english/). +{% endimportant %} Local API supports only one device at this stage. Local API is only supported with the Znet Lite products, the older hardware (such as Tellstick Net) does not support local API. diff --git a/source/_integrations/template.markdown b/source/_integrations/template.markdown index 570377f2a6d0..be48fee45da9 100644 --- a/source/_integrations/template.markdown +++ b/source/_integrations/template.markdown @@ -34,6 +34,9 @@ ha_platforms: - weather ha_integration_type: helper ha_config_flow: true +related: + - docs: /docs/configuration/ + title: Configuration file --- The `template` integration allows creating entities which derive their values from other data. This is done by specifying [templates](/docs/configuration/templating/) for properties of an entity, like the name or the state. @@ -49,17 +52,27 @@ Sensors, binary (on/off) sensors, buttons, images, numbers and selects are cover - [Vacuum](/integrations/vacuum.template/) - [Weather](/integrations/weather.template/) -Sensor and binary sensor can be configured using [UI](#ui-configuration) or [YAML](#yaml-configuration) file. +Sensor, binary sensor, button, image and select can be configured using [UI](#ui-configuration) or [YAML](#yaml-configuration) file. -Button, image, number, and select template entities are defined in your YAML configuration files under the `template:` key and cannot be configured via the UI. You can define multiple configuration blocks as a list. Each block defines sensor/binary sensor/number/select entities and can contain an optional update trigger. +Number template entities are defined in your YAML configuration files under the `template:` key and cannot be configured via the UI. You can define multiple configuration blocks as a list. Each block defines sensor/binary sensor/number/select entities and can contain an optional update trigger. _For old sensor/binary sensor configuration format, [see below](#legacy-binary-sensor-configuration-format)._ ## UI configuration -Sensor template and binary sensor template can be configured using the user interface at **{% my helpers title="Settings > Devices & Services > Helpers" %}**. Select the **+ Add helper** button and then select the **{% my config_flow_start domain=page.ha_domain title=page.title %}** helper. +Sensor template, binary sensor template, button template, image template and select template can be configured using the user interface at **{% my helpers title="Settings > Devices & services > Helpers" %}**. Select the **+ Add helper** button and then select the **{% my config_flow_start domain=page.ha_domain title=page.title %}** helper. +{% include integrations/config_flow.md %} + +{% important %} To be able to add **{% my helpers title="Helpers" %}** via the user interface, you should have `default_config:` in your {% term "`configuration.yaml`" %}. It should already be there by default unless you removed it. +{% endimportant %} + +{% note %} +Configuration using our user interface provides a more limited subset of options, making this integration more accessible while covering most use cases. + +If you need more specific features for your use case, the manual [YAML-configuration section](#yaml-configuration) of this integration might provide them. +{% endnote %} ## YAML configuration @@ -125,7 +138,7 @@ unique_id: required: false type: string action: - description: Define actions to be executed when the trigger fires. Optional. Variables set by the action script are available when evaluating entity templates. This can be used to interact with anything via services, in particular services with [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data). [See action documentation](/docs/automation/action). + description: Define actions to be executed when the trigger fires. Optional. Variables set by the action script are available when evaluating entity templates. This can be used to interact with anything using actions, in particular actions with [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data). [See action documentation](/docs/automation/action). required: false type: list sensor: @@ -418,9 +431,9 @@ State-based and trigger-based template entities have the special template variab When there are entities present in the template and no triggers are defined, the template will be re-rendered when one of the entities changes states. To avoid this taking up too many resources in Home Assistant, rate limiting will be automatically applied if too many states are observed. -<p class='note'> +{% tip %} <a href='#trigger-based-template-sensors'>Define a trigger</a> to avoid a rate limit and get more control over entity updates. -</p> +{% endtip %} When `states` is used in a template by itself to iterate all states on the system, the template is re-rendered each time any state changed event happens if any part of the state is accessed. When merely counting states, the template @@ -453,7 +466,7 @@ template: {% endraw %} -If the template accesses every state on the system, a rate limit of one update per minute is applied. If the template accesses all states under a specific domain, a rate limit of one update per second is applied. If the template only accesses specific states, receives update events for specifically referenced entities, or the `homeassistant.update_entity` service is used, no rate limit is applied. +If the template accesses every state on the system, a rate limit of one update per minute is applied. If the template accesses all states under a specific domain, a rate limit of one update per second is applied. If the template only accesses specific states, receives update events for specifically referenced entities, or the `homeassistant.update_entity` action is used, no rate limit is applied. ### Considerations @@ -731,7 +744,7 @@ template: ### State based select - Control Day/Night mode of a camera -This show how a state based template select can be used to call a service. +This show how a state based template select can be used to perform an action. {% raw %} @@ -771,9 +784,9 @@ template: {% endraw %} -### Trigger based handling of service response data +### Trigger based handling of action response data -This example demonstrates how to use an `action` to call a [service with response data](/docs/scripts/service-calls/#use-templates-to-handle-response-data) +This example demonstrates how to use an `action` to call a [action with response data](/docs/scripts/service-calls/#use-templates-to-handle-response-data) and use the response in a template. {% raw %} diff --git a/source/_integrations/tensorflow.markdown b/source/_integrations/tensorflow.markdown index 356134cd4676..c3d3c7861f44 100644 --- a/source/_integrations/tensorflow.markdown +++ b/source/_integrations/tensorflow.markdown @@ -14,9 +14,9 @@ related: The TensorFlow image processing {% term integration %} allows you to detect and recognize objects in a camera image using [TensorFlow](https://www.tensorflow.org/). The state of the entity is the number of objects detected, and recognized objects are listed in the `summary` attribute along with quantity. The `matches` attribute provides the confidence `score` for recognition and the bounding `box` of the object for each detection category. -<div class='note'> +{% important %} This integration is only available on Home Assistant Core installation types. Unfortunately, it cannot be used with Home Assistant OS, Supervised or Container. -</div> +{% endimportant %} ## Prerequisites @@ -194,7 +194,7 @@ image_processing: ## Optimizing resources -[Image processing components](/integrations/image_processing/) process the image from a camera at a fixed period given by the `scan_interval`. This leads to excessive processing if the image on the camera hasn't changed, as the default `scan_interval` is 10 seconds. You can override this by adding to your configuration `scan_interval: 10000` (setting the interval to 10,000 seconds), and then call the `image_processing.scan` service when you actually want to perform processing. +[Image processing components](/integrations/image_processing/) process the image from a camera at a fixed period given by the `scan_interval`. This leads to excessive processing if the image on the camera hasn't changed, as the default `scan_interval` is 10 seconds. You can override this by adding to your configuration `scan_interval: 10000` (setting the interval to 10,000 seconds), and then call the `image_processing.scan` action when you actually want to perform processing. ```yaml # Example advanced configuration.yaml entry diff --git a/source/_integrations/tesla_fleet.markdown b/source/_integrations/tesla_fleet.markdown new file mode 100644 index 000000000000..50a50d01a176 --- /dev/null +++ b/source/_integrations/tesla_fleet.markdown @@ -0,0 +1,112 @@ +--- +title: Tesla Fleet +description: Instructions on how to integrate the Tesla Fleet API within Home Assistant. +ha_category: + - Car + - Sensor +ha_release: 2024.8 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_codeowners: + - '@Bre77' +ha_domain: tesla_fleet +ha_platforms: + - sensor +ha_integration_type: integration +--- + +The Tesla Fleet API {% term integration %} exposes various sensors from Tesla vehicles and energy sites. + +## Prerequisites + +You must have a [Tesla](https://tesla.com) account and a Tesla vehicle, PowerWall, Solar, or Wall Connector. + +{% include integrations/config_flow.md %} + +## Scopes + +When connecting your Tesla account to Home Assistant, you **must** select the `Vehicle Information` or `Energy Product Information` scope. It is recommended you select all scopes for full functionality. + +## Rate limits + +Tesla restricts open-source integrations to the ["Discovery tier"](https://developer.tesla.com/docs/fleet-api#membership-levels) which only allows for 200 vehicle data requests per day. The integration will stop polling for vehicle updates when it hits this limit, and will wait the appropriate time specified in the **Retry-After** header. + +## Entities + +These are the entities available in the Tesla Fleet integration. Not all entities are enabled by default, and not all values are always available. + +### Vehicles + +|Domain|Name|Enabled| +|---|---|---| +|Sensor|Battery level|Yes| +|Sensor|Battery range|Yes| +|Sensor|Charge cable|No| +|Sensor|Charge energy added|Yes| +|Sensor|Charge rate|Yes| +|Sensor|Charger current|Yes| +|Sensor|Charger power|Yes| +|Sensor|Charger voltage|Yes| +|Sensor|Charging|Yes| +|Sensor|Distance to arrival|Yes| +|Sensor|Driver temperature setting|No| +|Sensor|Estimate battery range|No| +|Sensor|Exterior color|No| +|Sensor|Fast charger type|No| +|Sensor|Ideal battery range|No| +|Sensor|Inside temperature|Yes| +|Sensor|Odometer|No| +|Sensor|Outside temperature|Yes| +|Sensor|Passenger temperature setting|No| +|Sensor|Power|No| +|Sensor|Roof color|No| +|Sensor|Scheduled charging mode|No| +|Sensor|Scheduled charging start time|No| +|Sensor|Scheduled departure time|No| +|Sensor|Shift state|No| +|Sensor|Speed|No| +|Sensor|State of charge at arrival|No| +|Sensor|Time at arrival|Yes| +|Sensor|Time at full charge|Yes| +|Sensor|Time to arrival|Yes| +|Sensor|Time to full charge|Yes| +|Sensor|Tire pressure front left|No| +|Sensor|Tire pressure front right|No| +|Sensor|Tire pressure last measured front left|No| +|Sensor|Tire pressure last measured front right|No| +|Sensor|Tire pressure last measured rear left|No| +|Sensor|Tire pressure last measured rear right|No| +|Sensor|Tire pressure rear left|No| +|Sensor|Tire pressure rear right|No| +|Sensor|Traffic delay|No| +|Sensor|Usable battery level|No| + +### Energy sites + +|Domain|Name|Enabled| +|---|---|---| +|Sensor|Battery power|Yes| +|Sensor|Energy left|Yes| +|Sensor|Generator power|No| +|Sensor|Grid power|Yes| +|Sensor|Grid services power|Yes| +|Sensor|Island status|Yes| +|Sensor|Load power|Yes| +|Sensor|Percentage charged|Yes| +|Sensor|Solar power|Yes| +|Sensor|Total pack energy|No| +|Sensor|VPP backup reserve|Yes| +|Sensor|Version|Yes| + +### Wall connector + +|Domain|Name|Enabled| +|---|---|---| +|Sensor|Fault state|No| +|Sensor|Power|Yes| +|Sensor|State|Yes| +|Sensor|Vehicle|Yes| + +## Vehicle sleep + +Constant API polling will prevent most Model S and Model X vehicles manufactured before 2021 from sleeping, so the integration will stop polling these vehicles for 15 minutes, after 15 minutes of inactivity. You can call the `homeassistant.update_entity` service to force polling the API, which will reset the timer. diff --git a/source/_integrations/teslemetry.markdown b/source/_integrations/teslemetry.markdown index fadb630072dc..45ab4cfc6e7f 100644 --- a/source/_integrations/teslemetry.markdown +++ b/source/_integrations/teslemetry.markdown @@ -21,6 +21,7 @@ ha_config_flow: true ha_codeowners: - '@Bre77' ha_domain: teslemetry +ha_quality_scale: platinum ha_platforms: - binary_sensor - button @@ -91,6 +92,7 @@ These are the entities available in the Teslemetry integration. Not all entities |Device tracker|Route|Yes| |Cover|Charge port door|Yes| |Cover|Frunk|Yes| +|Cover|Sunroof|No| |Cover|Trunk|Yes| |Cover|Vent windows|Yes| |Lock|Charge cable lock|Yes| @@ -179,6 +181,8 @@ These are the entities available in the Teslemetry integration. Not all entities |Sensor|Total pack energy|No| |Sensor|VPP backup reserve|Yes| |Sensor|Version|Yes| +|Select|Allow export|Yes| +|Select|Operation mode|Yes| |Switch|Allow charging from grid|Yes| |Switch|Storm watch|Yes| @@ -193,4 +197,74 @@ These are the entities available in the Teslemetry integration. Not all entities ## Vehicle sleep -Constant API polling will prevent most Model S and Model X vehicles manufactured before 2021 from sleeping, so the Teslemetry integration will stop polling these vehicles for 15 minutes, after 15 minutes of inactivity. You can call the `homeassistant.update_entity` service to force polling the API, which will reset the timer. +Constant API polling will prevent most Model S and Model X vehicles manufactured before 2021 from sleeping, so the Teslemetry integration will stop polling these vehicles for 15 minutes, after 15 minutes of inactivity. You can call the `homeassistant.update_entity` action to force polling the API, which will reset the timer. + +## Actions + +Teslemetry provides various custom actions to interact with the Tesla Fleet API directly. + +### Navigate to coordinates + +`teslemetry.navigation_gps_request` + +| Field | Description | Example | +|---------------|----------------------------|----------------------------------| +| device_id | The vehicle's device ID | 0d462c0c4c0b064b1a91cdbd1ffcbd31 | +| gps | Dictionary of coordinates | | +| gps.latitude | Latitude in degrees | -27.9699373 | +| gps.longitude | Longitude in degrees | 153.4081865 | +| order | Order for this destination | 1 | + +### Set scheduled charging + +`teslemetry.set_scheduled_charging` + +| Field | Description | Example | +|-----------|---------------------------------------|----------------------------------| +| device_id | The vehicle's device ID | 0d462c0c4c0b064b1a91cdbd1ffcbd31 | +| enable | Enable or disable scheduled charging | true | +| time | Time to start charging in HH:MM | 6:00 | + +### Set scheduled departure + +`teslemetry.set_scheduled_departure` + +| Field | Description | Example | +|---------------------------------|-------------------------------------------|----------------------------------| +| device_id | The vehicle's device ID | 0d462c0c4c0b064b1a91cdbd1ffcbd31 | +| enable | Enable or disable scheduled departure | true | +| preconditioning_enabled | Enable preconditioning | true | +| preconditioning_weekdays_only | Enable preconditioning on weekdays only | false | +| departure_time | Planned departure time (HH:MM) | 6:00 | +| off_peak_charging_enabled | Enable off-peak charging | false | +| off_peak_charging_weekdays_only | Enable off-peak charging on weekdays only | false | +| end_off_peak_time | Time to complete charging by (HH:MM) | 5:00 | + +### Valet Mode + +`teslemetry.valet_mode` + +| Field | Description | Example | +|---------------|------------------------------|----------------------------------| +| device_id | The vehicle's device ID | 0d462c0c4c0b064b1a91cdbd1ffcbd31 | +| enable | Enable or disable valet mode | true | +| pin | 4-digit pin | 1234 | + +### Speed Limit + +`teslemetry.speed_limit` + +| Field | Description | Example | +|---------------|-------------------------------|----------------------------------| +| device_id | The vehicle's device ID | 0d462c0c4c0b064b1a91cdbd1ffcbd31 | +| enable | Enable or disable speed limit | true | +| pin | 4-digit pin | 1234 | + +### Time of use + +`teslemetry.time_of_use` + +| Field | Description | Example | +|---------------|------------------------------|------------------------------------------------------------------------------------------------------------------| +| device_id | The energy site's device ID | 0d462c0c4c0b064b1a91cdbd1ffcbd31 | +| tou_settings | Time of use settings | See [Tesla Fleet API documentation](https://developer.tesla.com/docs/fleet-api#time_of_use_settings) for details | diff --git a/source/_integrations/tessie.markdown b/source/_integrations/tessie.markdown index cae04d9e9277..05956de91ddf 100644 --- a/source/_integrations/tessie.markdown +++ b/source/_integrations/tessie.markdown @@ -39,11 +39,11 @@ The Tessie integration exposes various commands and sensors from the Tesla vehic ## Prerequisites -You must have a [Tessie](https://my.tessie.com/) account and [access token](https://my.tessie.com/settings/api). +You must have a [Tessie](https://my.tessie.com/) account, generate a [Tessie Access Token](https://my.tessie.com/settings/api) and grant Tessie access to your Tesla vehicle by generating a [Tesla Virtual Key](https://www.tesla.com/_ak/tessie.com). {% include integrations/config_flow.md %} -## Entities +## Vehicle entities ### Binary sensor @@ -109,7 +109,8 @@ The integration will create a cover entity to control various aspects of your ve - Open/Close trunk - Open/Close charge port - Open frunk -- Vent/Closing windows +- Vent/Close windows +- Vent/Close sunroof ### Device tracker @@ -138,6 +139,10 @@ The integration will create number entities to control: The integration will create a select entity to control each of the seat heaters. It allows you to set each seat heater to Off, Low, Medium, or High. +For vehicles equipped with cooled (ventilated) seats, a select entity will also be added to control each cooled seat. + +Heated seats: + - Front left - Front right - Rear center (if installed) @@ -146,6 +151,11 @@ The integration will create a select entity to control each of the seat heaters. - Third row left (if installed) - Third row right (if installed) +Cooled seats: + +- Front left +- Front right + ### Sensor The integration will create sensor entities for a variety of metrics related to your vehicles: @@ -203,3 +213,44 @@ The integration will create switch entities to control various aspects of your v ### Update The integration will show vehicle software updates and their installation progress. Updates can only be installed from Home Assistant after they have finished downloading. + +## Energy entities + +### Binary sensor + +- Backup capable +- Grid services enabled +- Grid services active + +### Number + +- Backup reserve +- Off grid reserve + +### Select + +- Allow export +- Operation mode + +### Sensor + +- Battery power +- Energy left +- Generator power +- Grid power +- Grid services power +- Load power +- Percentage charged +- Solar power +- Total pack energy +- Version +- Vehicle +- <abbr title="Virtual power plant">VPP</abbr> backup reserve +- Fault state code +- Power +- State code + +### Switch + +- Allow charging from grid +- Storm watch diff --git a/source/_integrations/text.markdown b/source/_integrations/text.markdown index f0f1d21390fe..5dc8495d7b57 100644 --- a/source/_integrations/text.markdown +++ b/source/_integrations/text.markdown @@ -17,17 +17,17 @@ The Text integration is built for the controlling and monitoring of text values If you are looking for a way to create a text entity, please take a look at the [Text helper](/integrations/input_text). -## Services +## Actions -### text services +### Text actions -Available services: `text.set_value` +Available actions: `text.set_value` -### Service `text.set_value` +### Action `text.set_value` Set the textual value of the text entity. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings that point at `entity_id`'s of texts to control. | `value` | no | The new text value to set. diff --git a/source/_integrations/text.mqtt.markdown b/source/_integrations/text.mqtt.markdown index 28154b23ab7e..c8b36f76dff8 100644 --- a/source/_integrations/text.mqtt.markdown +++ b/source/_integrations/text.mqtt.markdown @@ -189,11 +189,9 @@ value_template: type: template {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/thread.markdown b/source/_integrations/thread.markdown index 590f18d89300..a35d83e29afa 100644 --- a/source/_integrations/thread.markdown +++ b/source/_integrations/thread.markdown @@ -121,7 +121,7 @@ Follow these steps if you want to turn Home Assistant into a Thread border route Find out if you already have Thread networks: -- Go to {% my integrations title="**Settings** > **Devices & Services**" %}. +- Go to {% my integrations title="**Settings** > **Devices & services**" %}. - If you do not see a **Thread** integration, add it. - Then, select **Configure** and check if you see any Thread networks on the overview page. - Case 1: If you do not have any Thread networks yet, follow [Case 1: Make Home Assistant your first Thread network](#case-1-making-home-assistant-your-first-thread-network) @@ -131,12 +131,10 @@ Find out if you already have Thread networks: Follow these steps if you want to turn Home Assistant into a Thread border router using the Thread radio of Yellow, Connect ZBT-1, or another compatible radio and you do not have any third-party Thread networks present yet. This will automatically create a new Thread network with the name `ha-thread-xxxx`. The last for digits are a network-specific identifier (PAN ID). -Note: To add Matter devices to this Thread network, an Android phone is required. Adding Matter devices to this Thread network using an iOS phone is not yet supported. - #### Prerequisites - Device with a Thread-capable radio, such as Home Assistant Yellow, Connect ZBT-1, or another compatible radio -- Android phone +- Android phone or iPhone - No third-party Thread networks present #### To make Home Assistant your first Thread network @@ -147,7 +145,7 @@ Note: To add Matter devices to this Thread network, an Android phone is required 2. Make sure the Home Assistant Thread network is defined as preferred network. - This should happen automatically, but check to be sure. - - Go to {% my integrations title="**Settings** > **Devices & Services**" %}, select the **Thread** integration. + - Go to {% my integrations title="**Settings** > **Devices & services**" %}, select the **Thread** integration. - Then, select **Configure**. - You should see the Home Assistant logo under **Preferred network**. @@ -155,9 +153,12 @@ Note: To add Matter devices to this Thread network, an Android phone is required 3. Before you can add Matter-based Thread devices, your phone needs to know the credentials of your newly created Thread network. - To share the credentials with your Android phone, open the Home Assistant Companion app. - - In the Companion app, go to **Settings** > **Companion app** > **Troubleshooting**, then select **Sync Thread credentials**. - - Follow the instructions on screen. - - **Result**: You will see a confirmation stating that Thread credentials from Home Assistant have been added to this device. + - In the Companion app, go to **Settings** > **Companion app** > **Troubleshooting**, then select **Sync Thread credentials**. + - Follow the instructions on screen. + - **Result**: You will see a confirmation stating that Thread credentials from Home Assistant have been added to this device. + - To share the credentials with your iPhone, open the Home Assistant Companion app. + - Go to {% my integrations title="**Settings** > **Devices & services**" %}, select the **Thread** integration. + - At the bottom of the preferred network box, select **Send credentials to phone**. 4. To add Matter-based Thread devices, follow the steps on [Adding a matter device to Home Assistant](/integrations/matter/#adding-a-matter-device-to-home-assistant). ### Case 2: Creating a HA border router when there is an existing network @@ -180,9 +181,10 @@ Note: the steps and images here show the process with a Google Thread network. B 1. Make sure you have an Android/iPhone phone and your phone is in the same Wi-Fi network as your Google border router. 2. First you need to import the Thread credentials of your Google thread network. - - In the companion app, go to {% my integrations title="**Settings** > **Devices & Services**" %}, select the **Thread** integration. - - Then, select **Configure** and **Import Credentials**. - - **Result**: You should see a notification that the credentials are imported. + - In the companion app, go to {% my integrations title="**Settings** > **Devices & services**" %}, select the **Thread** integration. + - On Android, select **Configure** and **Import Credentials**. + - **Result**: You should see a notification that the credentials are imported. + - On iOS, select **Send credentials to Home Assistant**. 3. Refresh the screen. - You should now see an <img width="30px" src='/images/integrations/thread/information-outline.png'> icon, indicating that Home Assistant now has the credentials of that network. 4. Select **Make preferred network**. @@ -220,11 +222,9 @@ Home Assistant discovers all Thread border routers in your network because they The intention of the **Preferred network** in Home Assistant is that it will be used as the default network when adding Thread⁻based devices. -<div class="note"> - +{% note %} The **preferred network** function isn't completely implemented yet. In particular, when adding {% term Matter %} devices through the companion apps, the preferred network of the mobile device is being used. - -</div> +{% endnote %} #### Making a network your preferred network diff --git a/source/_integrations/tibber.markdown b/source/_integrations/tibber.markdown index dba887df9d2b..3cf70034794b 100644 --- a/source/_integrations/tibber.markdown +++ b/source/_integrations/tibber.markdown @@ -35,7 +35,7 @@ Go to [developer.tibber.com/settings/accesstoken](https://developer.tibber.com/s ## Notifications -Tibber can send a notification by calling the [`notify.send_message` service](/integrations/notify/). It will send a notification to all devices registered in the Tibber account. +Tibber can send a notification by calling the [`notify.send_message` action](/integrations/notify/). It will send a notification to all devices registered in the Tibber account. To use notifications, please see the [getting started with automation page](/getting-started/automation/). @@ -83,15 +83,15 @@ If you have a Tibber Pulse it will also show the electricity consumption in real </div> -## Services +## Actions -The hourly prices are exposed using [service calls](/docs/scripts/service-calls/). The services populate [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with price data. +The hourly prices are exposed using [actions](/docs/scripts/service-calls/). The actions populate [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with price data. -### Service `tibber.get_prices` +### Action `tibber.get_prices` Fetches hourly energy prices including price level. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `start` | yes | Start time to get prices. Defaults to today 00:00:00 | 2024-01-01 00:00:00 | | `end` | yes | End time to get prices. Defaults to tomorrow 00:00:00 | 2024-01-01 00:00:00 | diff --git a/source/_integrations/time.markdown b/source/_integrations/time.markdown index ae448329bfd6..2dca6838d211 100644 --- a/source/_integrations/time.markdown +++ b/source/_integrations/time.markdown @@ -17,17 +17,17 @@ The Time integration is built for the controlling and monitoring of times on dev If you are looking for a way to create a similar entity, please take a look at the [Date/Time helper](/integrations/input_datetime). -## Services +## Actions -### time services +### Time actions -Available services: `time.set_value` +Available actions: `time.set_value` -### Service `time.set_value` +### Action `time.set_value` Set a new value for the time entity. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings that point at `entity_id`'s of times to control. | `time` | no | New time value to set. diff --git a/source/_integrations/timer.markdown b/source/_integrations/timer.markdown index cefa8f42d82d..fdde30fb13b5 100644 --- a/source/_integrations/timer.markdown +++ b/source/_integrations/timer.markdown @@ -12,19 +12,17 @@ ha_integration_type: helper The `timer` integration aims to simplify automations based on (dynamic) durations. -When a timer finishes or gets canceled the corresponding events are fired. This allows you to differentiate if a timer has switched from `active` to `idle` because the given duration has elapsed or it has been canceled. To control timers in your automations you can use the services mentioned below. When calling the `start` service on a timer that is already running, it resets the duration it will need to finish and restarts the timer without triggering a canceled or finished event. This, for example, makes it easy to create timed lights that get triggered by motion. Starting a timer triggers a started event unless the timer is paused, in that case, it triggers a restarted event. +When a timer finishes or gets canceled the corresponding events are fired. This allows you to differentiate if a timer has switched from `active` to `idle` because the given duration has elapsed or it has been canceled. To control timers in your automations you can use the actions mentioned below. When calling the `start` action on a timer that is already running, it resets the duration it will need to finish and restarts the timer without triggering a canceled or finished event. This, for example, makes it easy to create timed lights that get triggered by motion. Starting a timer triggers a started event unless the timer is paused, in that case, it triggers a restarted event. -<div class='note'> - +{% note %} Timers will be restored to their correct state and time on Home Assistant startup and restarts when configured with the `restore` option. However, automations using the `timer.finished` event **will not** trigger if the timer expires when Home Assistant is not running. - -</div> +{% endnote %} ## Configuration -The preferred way to configure timer helpers is via the user interface at **{% my helpers title="Settings > Devices & Services > Helpers" %}** and click the add button; next choose the {% my config_flow_start domain=page.ha_domain title=page.title %} option. +The preferred way to configure timer helpers is via the user interface at **{% my helpers title="Settings > Devices & services > Helpers" %}** and click the add button; next choose the {% my config_flow_start domain=page.ha_domain title=page.title %} option. To be able to add Helpers via the user interface you should have `default_config:` in your {% term "`configuration.yaml`" %}, it should already be there by default unless you removed it. If you removed `default_config:` from your configuration, you must add `timer:` to your `configuration.yaml` first, then you can use the UI. @@ -84,58 +82,58 @@ Pick an icon from [Material Design Icons](https://pictogrammers.com/library/mdi/ | `timer.restarted` | Fired when a timer has been restarted | | `timer.paused` | Fired when a timer has been paused | -## Services +## Actions -### Service `timer.start` +### Action `timer.start` Starts or restarts a timer with the provided duration. If no duration is given, it will either restart with its initial value, or continue a paused timer with the remaining duration. If a new duration is provided, this will be the duration for the timer until it finishes or is canceled, which then will reset the duration back to the original configured value. The duration can be specified as a number of seconds or the easier to read `01:23:45` format. You can also use `entity_id: all` and all active timers will be started. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name of the entity to take action, e.g., `timer.timer0`. | | `duration` | yes | Duration in seconds or `01:23:45` format until the timer finishes. | -### Service `timer.change` +### Action `timer.change` Change an active timer. This changes the duration of the timer with the duration given. You can also use `entity_id: all` and all active timers will be changed. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name of the entity to take action, e.g., `timer.timer0`. | | `duration` | no | Duration in seconds or `00:00:00` to add or subtract from the running timer. | -### Service `timer.pause` +### Action `timer.pause` -Pause a running timer. This will retain the remaining duration for later continuation. To resume a timer use the `timer.start` service without passing a duration. You can also use `entity_id: all` and all active timers will be paused. +Pause a running timer. This will retain the remaining duration for later continuation. To resume a timer use the `timer.start` action without passing a duration. You can also use `entity_id: all` and all active timers will be paused. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name of the entity to take action, e.g., `timer.timer0`. | -### Service `timer.cancel` +### Action `timer.cancel` Cancel an active timer. This resets the duration to the last known initial value without firing the `timer.finished` event. You can also use `entity_id: all` and all active timers will be canceled. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name of the entity to take action, e.g., `timer.timer0`. | -### Service `timer.finish` +### Action `timer.finish` Manually finish a running timer earlier than scheduled. You can also use `entity_id: all` and all active timers will be finished. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | Name of the entity to take action, e.g., `timer.timer0`. | -### Service `timer.reload` +### Action `timer.reload` -Reload `timer`'s configuration without restarting Home Assistant itself. This service takes no service data attributes. +Reload `timer`'s configuration without restarting Home Assistant itself. This action takes no data attributes. -### Use the service +### Using the action -Navigate to **Developer Tools** -> **Services** and select the `timer.start` service, then click the **Fill Example Data** button. Now change the `entity_id` and `duration` and click **Call Service** button. +Navigate to **Developer Tools** > **Actions** and select the `timer.start` action, then click the **Fill Example Data** button. Now change the `entity_id` and `duration` and select **Perform action** button. ## Examples diff --git a/source/_integrations/todo.markdown b/source/_integrations/todo.markdown index 8799cfc8e9af..402ba758179b 100644 --- a/source/_integrations/todo.markdown +++ b/source/_integrations/todo.markdown @@ -42,16 +42,16 @@ item to a pre-configured to-do list. {% my blueprint_import badge blueprint_url="https://community.home-assistant.io/t/add-to-do-item/699193" %} -## Services +## Actions Some to-do list integrations allow Home Assistant to manage the to-do items in the list. The -services provided by some to-do list entities are described below or you can read more about [Service Calls](/docs/scripts/service-calls/). +actions provided by some to-do list entities are described below or you can read more about [actions](/docs/scripts/service-calls/). -### Service `todo.get_items` +### Action `todo.get_items` Get to-do items from a to-do list. A to-do list `target` is selected with a [target selector](/docs/blueprint/selectors/#target-selector). The `data` payload supports the following fields: -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------------------------------------- | --------------------------- | | `status` | yes | Only return to-do items with this status. | `needs_action`, `completed` | @@ -66,11 +66,11 @@ data: - needs_action ``` -### Service `todo.add_item` +### Action `todo.add_item` Add a new to-do item. A to-do list `target` is selected with a [Target Selector](/docs/blueprint/selectors/#target-selector) and the `data` payload supports the following fields: -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ---------------------------------------------------------------- | ------------------------------------------------------------ | | `item` | no | the name of the to-do Item. | Submit income tax return | | `due_date` | yes | The date the to-do item is expected to be completed. | 2024-04-10 | @@ -79,7 +79,7 @@ Add a new to-do item. A to-do list `target` is selected with a [Target Selector] Only one of `due_date` or `due_datetime` may be specified. -This is a full example of service call in YAML: +This is a full example in YAML: ```yaml service: todo.add_item @@ -91,11 +91,11 @@ data: description: "Collect all necessary documents and submit the final return." ``` -### Service `todo.update_item` +### Action `todo.update_item` Update a to-do item. A to-do list `target` is selected with a [Target Selector](/docs/blueprint/selectors/#target-selector) and the `data` payload supports the following fields: -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------------------------------------------------------------- | ------------------------------------------------------------ | | `item` | no | The name of the to-do Item to update. | Submit income tax return | | `rename` | yes | The new name of the to-do Item. | Something else | @@ -104,7 +104,7 @@ Update a to-do item. A to-do list `target` is selected with a [Target Selector]( | `due_datetime` | yes | The date and time the to-do item is expected to be completed. | 2024-04-10 23:00:00 | | `description` | yes | A more complete description than the one provided by the summary. | Collect all necessary documents and submit the final return. | -At least one of `rename` or `status` is required. Only one of `due_date` or `due_datetime` may be specified. This is a full example of a service call that updates the status and the name of a to-do item. +At least one of `rename` or `status` is required. Only one of `due_date` or `due_datetime` may be specified. This is a full example that updates the status and the name of a to-do item. ```yaml service: todo.update_item @@ -116,15 +116,15 @@ data: status: "completed" ``` -### Service `todo.remove_item` +### Action `todo.remove_item` Removing a to-do item. A to-do list `target` is selected with a [Target Selector](/docs/blueprint/selectors/#target-selector), and the `data` payload supports the following fields: -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | --------------------------- | ------------------------ | | `item` | no | The name of the to-do item. | Submit income tax return | -This is a full example of a service call that deletes a to-do Item with the specified name. +This is a full example that deletes a to-do Item with the specified name. ```yaml service: todo.remove_item @@ -134,11 +134,11 @@ data: item: "Submit income tax return" ``` -### Service `todo.remove_completed_items` +### Action `todo.remove_completed_items` Removes all completed to-do items. A to-do list `target` is selected with a [Target Selector](/docs/blueprint/selectors/#target-selector). -This is a full example of a service call that deletes all completed to-do items. +This is a full example that deletes all completed to-do items. ```yaml service: todo.remove_completed_items diff --git a/source/_integrations/todoist.markdown b/source/_integrations/todoist.markdown index 6c50a7b9c59f..1bcda7114226 100644 --- a/source/_integrations/todoist.markdown +++ b/source/_integrations/todoist.markdown @@ -115,7 +115,7 @@ Home Assistant does its best to [determine what task in each project is "most" i ## To-do list entity See the [todo](/integrations/todo/) integration for details on how to manage -items on the Todoist to-do list, including services for creating and +items on the Todoist to-do list, including actions for creating and deleting to-do items. Todoist completed to-do items are not visible in Home Assistant because they @@ -151,12 +151,12 @@ the Todoist UI. - **due_today**: Whether the reported task is due today. -## Services +## Actions -You may use the services from the [todo](/integrations/todo/) integration for +You may use the actions from the [todo](/integrations/todo/) integration for creating, updating, or deleting to-do items on the to-do list. -Todoist also comes with an additional service, `todoist.new_task` that offers +Todoist also comes with an additional action, `todoist.new_task` that offers more advanced attributes when creating a Todoist task. You can specify labels and a project, or you can leave them blank, and the task will go to your **Inbox** project. @@ -186,6 +186,8 @@ Here are two example JSON payloads resulting in the same task: - **content** (*Required*): The name of the task you want to create. +- **description** (*Optional*): A description of the task. + - **project** (*Optional*): The project to put the task in. - **labels** (*Optional*): Any labels you want to add to the task, separated by commas. diff --git a/source/_integrations/totalconnect.markdown b/source/_integrations/totalconnect.markdown index 80db768bbe4e..4f80c0c882ef 100644 --- a/source/_integrations/totalconnect.markdown +++ b/source/_integrations/totalconnect.markdown @@ -82,7 +82,7 @@ sudo apt install libxml2-dev libxmlsec1-dev The integration provides an alarm control panel for each Total Connect location. It uses the name of your location from Total Connect. For example, if your location name in Total Connect is "Home", Home Assistant will use `alarm_control_panel.home`. -The alarm control panel supports the following services: `alarm_arm_away`, `alarm_arm_home`, `alarm_arm_night`, and `alarm_disarm`. The integration also provides unique services for `totalconnect.arm_home_instant` and `totalconnect.arm_away_instant` which arms the system with zero entry delay, triggering the alarm instantly if an entry/exit zone is faulted. +The alarm control panel supports the following actions: `alarm_arm_away`, `alarm_arm_home`, `alarm_arm_night`, and `alarm_disarm`. The integration also provides unique actions for `totalconnect.arm_home_instant` and `totalconnect.arm_away_instant` which arms the system with zero entry delay, triggering the alarm instantly if an entry/exit zone is faulted. The `triggered` state also provides a state attribute called `triggered_source` giving more detail on what triggered the alarm: diff --git a/source/_integrations/tplink.markdown b/source/_integrations/tplink.markdown index 7d6708816e42..b0acb969c4c9 100644 --- a/source/_integrations/tplink.markdown +++ b/source/_integrations/tplink.markdown @@ -2,8 +2,14 @@ title: TP-Link Smart Home description: Instructions on integrating TP-Link Smart Home Devices to Home Assistant. ha_category: + - Binary sensor + - Button + - Climate + - Fan - Hub - Light + - Number + - Select - Sensor - Switch ha_release: 0.89 @@ -11,13 +17,18 @@ ha_iot_class: Local Polling ha_config_flow: true ha_codeowners: - '@rytilahti' - - '@thegardenmonkey' - '@bdraco' - '@sdb9696' ha_domain: tplink ha_platforms: + - binary_sensor + - button + - climate - diagnostics + - fan - light + - number + - select - sensor - switch ha_dhcp: true @@ -36,108 +47,44 @@ If you have an older device that does not currently require authentication, you ## Supported Devices -See [Supported Devices in python-kasa](https://github.com/python-kasa/python-kasa#supported-devices) for an up to date list. +See [Supported Devices in python-kasa](https://python-kasa.readthedocs.io/en/stable/SUPPORTED.html) for an up to date list that includes hardware and firmware versions. Devices not listed below may work but if you encounter issues submit a bug report to [python-kasa](https://github.com/python-kasa/python-kasa). -### Not requiring authentication +### Supported Kasa devices -#### Plugs +- **Plugs**: EP10, EP25[^1], HS100[^2], HS103, HS105, HS110, KP100, KP105, KP115, KP125, KP125M[^1], KP401 +- **Power Strips**: EP40, HS107, HS300, KP200, KP303, KP400 +- **Wall Switches**: ES20M, HS200, HS210, HS220, KP405, KS200M, KS205[^1], KS220M, KS225[^1], KS230, KS240[^1] +- **Bulbs**: KL110, KL120, KL125, KL130, KL135, KL50, KL60, LB110 +- **Light Strips**: KL400L5, KL420L5, KL430 +- **Hubs**: KH100[^1] +- **Hub-Connected Devices[^3]**: KE100[^1] -- HS100 -- HS103 -- HS105 -- HS107 -- HS110 -- KP100 -- KP105 -- KP115 -- KP125 -- KP401 -- EP10 -- EP25 (Hardware version < 2.6) +### Supported Tapo[^1] devices -#### Power Strips +- **Plugs**: P100, P110, P115, P125M, P135, TP15 +- **Power Strips**: P300, TP25 +- **Wall Switches**: S500D, S505, S505D +- **Bulbs**: L510B, L510E, L530E +- **Light Strips**: L900-10, L900-5, L920-5, L930-5 +- **Hubs**: H100 +- **Hub-Connected Devices[^3]**: T110, T300, T310, T315 -- EP40 -- HS300 -- KP303 -- KP200 -- KP400 -- KP405 +[^1]: Requires authentication +[^2]: Newer versions require authentication +[^3]: Devices may work across TAPO/KASA branded hubs -#### Wall switches +## Light effects -- ES20M -- HS200 -- HS210 -- HS220 -- KS200M -- KS220M -- KS230 +If light effects are supported by a device they can be selected from the bottom of the light card. +They are currently not supported on Kasa bulbs. -#### Bulbs +### Random Effect - Action `tplink.random_effect` -- EP40 -- LB100 -- LB110 -- LB120 -- LB130 -- LB230 -- KL50 -- KL60 -- KL110 -- KL120 -- KL125 -- KL130 -- KL135 +Light strips allow setting a random effect. -#### Light strips - -- KL400 -- KL420 -- KL430 - -### Requiring authentication - -#### Plugs - -- EP25 (Hardware version >= 2.6) -- KP125M -- P110 -- P115 -- HS100 (UK Hardware version 4.1 with firmware 1.1.0) - -#### Wall switches - -- KS205 -- KS225 - -#### Bulbs - -- L510B -- L530E -- TL135E - -#### Light strips - -- L900-5 -- L900-10 -- L920 - -#### Power Strips - -- P300 - -## Light strip effects - -Light strip effects are currently only supported for the device types not requiring authentication. - -### Random Effect - Service `tplink.random_effect` - -The light strips allow setting a random effect. - -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | The entity_id of the light strip to set the effect on | | `init_states` | Initial HSV sequence | @@ -154,7 +101,7 @@ The light strips allow setting a random effect. | `random_seed` | Random seed | ```yaml -#Example Service Call +#Example action service: tplink.random_effect target: entity_id: @@ -182,11 +129,11 @@ data: random_seed: 80 ``` -### Sequence Effect - Service `tplink.sequence_effect` +### Sequence Effect - Action `tplink.sequence_effect` -The light strips allow setting a sequence effect. +Light strips allow setting a sequence effect. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | ----------- | | `entity_id` | The entity_id of the light strip to set the effect on | | `sequence` | List of HSV sequences (Max 16) | @@ -199,7 +146,7 @@ The light strips allow setting a sequence effect. | `direction` | Direction | ```yaml -#Example Service Call +#Example action service: tplink.sequence_effect target: entity_id: diff --git a/source/_integrations/tplink_lte.markdown b/source/_integrations/tplink_lte.markdown index 68cae3a7c4eb..89e99f6d3c96 100644 --- a/source/_integrations/tplink_lte.markdown +++ b/source/_integrations/tplink_lte.markdown @@ -12,9 +12,9 @@ ha_platforms: ha_integration_type: integration --- -The TP-Link LTE integration for Home Assistant makes it possible to send SMS's from the TP-Link LTE router. Phone numbers have to be pre-defined as part of the YAML configuration, and each phone number will turn up as additional notify service in Home Assistant. The integration adds a new notify service for each adds a notification service to Home Assistant that can be used to send SMSs provides a notification service that will send an SMS. Tested only with TL-MR6400 v4. +The TP-Link LTE integration for Home Assistant makes it possible to send SMS's from the TP-Link LTE router. Phone numbers have to be pre-defined as part of the YAML configuration, and each phone number will turn up as additional notify action in Home Assistant. The integration adds a new notify action for each adds a notification action to Home Assistant that can be used to send SMSs provides a notification action that will send an SMS. Tested only with TL-MR6400 v4. -The integration provides a notification service that will send an SMS. +The integration provides a notification action that will send an SMS. ## Configuration @@ -42,7 +42,7 @@ password: required: true type: string notify: - description: A list of notification services connected to this specific host. + description: A list of notification targets connected to this specific host. required: false type: list keys: @@ -51,7 +51,7 @@ notify: required: true type: [string, list] name: - description: The name of the notification service. + description: The name of the notification action. required: false default: notify type: string diff --git a/source/_integrations/tplink_omada.markdown b/source/_integrations/tplink_omada.markdown index 6baa624c0786..37dacac97dc2 100644 --- a/source/_integrations/tplink_omada.markdown +++ b/source/_integrations/tplink_omada.markdown @@ -12,6 +12,7 @@ ha_codeowners: ha_domain: tplink_omada ha_platforms: - binary_sensor + - device_tracker - switch - update ha_integration_type: hub diff --git a/source/_integrations/tplink_tapo.markdown b/source/_integrations/tplink_tapo.markdown index b5a64c39ce9b..90dd40eb4663 100644 --- a/source/_integrations/tplink_tapo.markdown +++ b/source/_integrations/tplink_tapo.markdown @@ -2,8 +2,14 @@ title: Tapo description: Connect and control your Tapo devices using the TP-Link Smart Home integration ha_category: + - Binary sensor + - Button + - Climate + - Fan - Hub - Light + - Number + - Select - Sensor - Switch ha_domain: tplink_tapo @@ -13,13 +19,18 @@ ha_supporting_domain: tplink ha_supporting_integration: TP-Link Smart Home ha_codeowners: - '@rytilahti' - - '@thegardenmonkey' - '@bdraco' - '@sdb9696' ha_config_flow: true ha_platforms: + - binary_sensor + - button + - climate - diagnostics + - fan - light + - number + - select - sensor - switch ha_iot_class: Local Polling diff --git a/source/_integrations/traccar.markdown b/source/_integrations/traccar.markdown index ebbbd02e73e5..863a985c7b33 100644 --- a/source/_integrations/traccar.markdown +++ b/source/_integrations/traccar.markdown @@ -17,11 +17,9 @@ ha_integration_type: integration `Traccar` uses GPS for tracking and has support for over 1500 different types of devices. You can use the [Traccar Client](https://www.traccar.org/client/) app on a smartphone via `webhook`. -<div class="note"> - - Looking for documentation on how to communicate with a Traccar Server? See the [Traccar Server](/integrations/traccar_server/) integration documentation. - -</div> +{% tip %} +Looking for documentation on how to communicate with a Traccar Server? See the [Traccar Server](/integrations/traccar_server/) integration documentation. +{% endtip %} To configure Traccar Client, you must set it up via the integrations panel in the configuration screen. This will give you the webhook URL to use during mobile device configuration. This URL has to be set in the Traccar app. diff --git a/source/_integrations/traccar_server.markdown b/source/_integrations/traccar_server.markdown index 63454beef58b..3cd49328783c 100644 --- a/source/_integrations/traccar_server.markdown +++ b/source/_integrations/traccar_server.markdown @@ -20,11 +20,9 @@ ha_integration_type: integration Traccar uses GPS for tracking and has support for over 1500 different types of devices. You can use the Traccar Server integration to communicate with your own [Traccar Server](https://www.traccar.org/server/), which is also available as [Home Assistant add-on](https://my.home-assistant.io/redirect/supervisor_addon/?addon=a0d7b954_traccar). -<div class="note"> - - Looking for documentation on how to setup the Traccar Client with webhooks in Home Assistant? See the [Traccar Client](/integrations/traccar/) integration documentation. - -</div> +{% tip %} +Looking for documentation on how to setup the Traccar Client with webhooks in Home Assistant? See the [Traccar Client](/integrations/traccar/) integration documentation. +{% endtip %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/tractive.markdown b/source/_integrations/tractive.markdown index dee5a9b53177..e4706ae773ce 100644 --- a/source/_integrations/tractive.markdown +++ b/source/_integrations/tractive.markdown @@ -30,9 +30,9 @@ To use the integration you must be a premium tractive client. {% include integrations/config_flow.md %} -<div class="note"> +{% important %} Due to Tractive API limitations, trackers (pets) that are shared from another account to your account are not visible in Home Assistant. You need to configure all Tractive accounts from which trackers (pets) come from with Home Assistant. -</div> +{% endimportant %} ## Integration entities diff --git a/source/_integrations/tradfri.markdown b/source/_integrations/tradfri.markdown index e3ffea134993..cd51168b9018 100644 --- a/source/_integrations/tradfri.markdown +++ b/source/_integrations/tradfri.markdown @@ -29,13 +29,15 @@ The IKEA TRÅDFRI integration allows you to connect your IKEA Trådfri Gateway t You will be prompted to configure the gateway through the Home Assistant interface. The configuration process is very simple: when prompted, enter the security key printed on the sticker on the bottom of the IKEA Trådfri Gateway, then click *configure*. -<div class='note'> +{% tip %} If you see an "Unable to connect" message, restart the gateway and try again. Don't forget to assign a permanent IP address to your IKEA Trådfri Gateway on your router or DHCP server. -</div> +{% endtip %} -<div class='note'> - There is currently no native support for the Dirigera hub released in October, 2022. -</div> +{% note %} +There is currently no dedicated core integration for the Dirigera hub released in October 2022. + +The Dirigera hub can, however, be integrated directly via the [HomeKit device](/integrations/homekit_controller/) integration. This configuration even provides events for motion sensors and buttons, which the original integration lacks. +{% endnote %} ## Troubleshooting @@ -53,13 +55,13 @@ Then restart Home Assistant. When prompted, enter the security key and click *co ### Compilation issues -<div class='note'> - This does not apply to Home Assistant running in Docker Containers, including the default Home Assistant install. -</div> +{% note %} +This does not apply to Home Assistant running in Docker Containers, including the default Home Assistant install. +{% endnote %} Please make sure you have `autoconf` installed (`$ sudo apt-get install autoconf`) if you want to use this integration. Also, installing some dependencies might take considerable time (more than one hour) on slow devices. ## Known limitations -- The TRÅDFRI Shortcut button, Remotes and motion sensor only send information about their battery status, no events, to Home Assistant and thus can't be used to automate with. If you want to automate with these devices, you need to use something like [ZHA](/integrations/zha/). +- The TRÅDFRI Shortcut button, Remotes and motion sensor only send information about their battery status, no events, to Home Assistant and thus can't be used to automate with. If you want to automate with these devices, you need to use something like [ZHA](/integrations/zha/), or the [HomeKit device](/integrations/homekit_controller) integration as mentioned above. - The groups you find in the app are not imported into Home Assistant as they are known to cause stability issues. We recommend that you use the native [light groups](/integrations/light.group/) instead. diff --git a/source/_integrations/transmission.markdown b/source/_integrations/transmission.markdown index f2b88eef5bf4..3ef10140a379 100644 --- a/source/_integrations/transmission.markdown +++ b/source/_integrations/transmission.markdown @@ -78,43 +78,43 @@ Example of an automation that notifies on successful download and removes the to {% endraw %} -## Services +## Actions -All Transmission services require integration `entry_id`. To find it, go to Developer Tools -> Services. Choose the desired service and select your integration from dropdown. Then switch to YAML mode to see `entry_id`. +All Transmission actions require integration `entry_id`. To find it, go to **Developer tools** > **Actions**. Choose the desired action and select your integration from dropdown. Then switch to YAML mode to see `entry_id`. -### Service `add_torrent` +### Action `add_torrent` Adds a new torrent to download. It can either be a URL (HTTP, HTTPS or FTP), magnet link or a local file (make sure that the path is [white listed](/integrations/homeassistant/#allowlist_external_dirs)). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------ | | `entry_id` | no | The integration entry_id | | `torrent` | no | Torrent to download | -### Service `remove_torrent` +### Action `remove_torrent` Removes a torrent from the client. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------- | | `entry_id` | no | The integration entry_id | | `id` | no | ID of the torrent, can be found in the `torrent_info` attribute of the `*_torrents` sensors | | `delete_data` | yes | Delete torrent data (Default: false) | -### Service `start_torrent` +### Action `start_torrent` Starts a torrent. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------- | | `entry_id` | no | The integration entry_id | | `id` | no | ID of the torrent, can be found in the `torrent_info` attribute of the `*_torrents` sensors | -### Service `stop_torrent` +### Action `stop_torrent` Stops a torrent. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------- | | `entry_id` | no | The integration entry_id | | `id` | no | ID of the torrent, can be found in the `torrent_info` attribute of the `*_torrents` sensors | diff --git a/source/_integrations/tts.markdown b/source/_integrations/tts.markdown index e0258a107865..0267d53b77f2 100644 --- a/source/_integrations/tts.markdown +++ b/source/_integrations/tts.markdown @@ -31,13 +31,13 @@ Text-to-speech (TTS) enables Home Assistant to speak to you. See all [TTS integrations](https://www.home-assistant.io/integrations/#text-to-speech) using this building block for ways to use it in your automations. If you are using the Home Assistant voice assistant, [Assist](https://www.home-assistant.io/voice_control/), Assist is using TTS when replying to you. Another way to use TTS is by using [TTS with Home Assistant Cloud](https://www.nabucasa.com/config/tts/). -## Services +## Actions -### Service speak +### Action speak -Modern platforms will create entities under the `tts` domain, where each entity represents one text-to-speech service provider. These entities may be used as targets for the `tts.speak` service. +Modern platforms will create entities under the `tts` domain, where each entity represents one text-to-speech service provider. These entities may be used as targets for the `tts.speak` action. -The `tts.speak` service supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`, and the media player that should output the sound is selected with `media_player_entity_id`. +the `tts.speak` action supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`, and the media player that should output the sound is selected with `media_player_entity_id`. ```yaml service: tts.speak @@ -48,9 +48,9 @@ data: message: "May the force be with you." ``` -### Service say (legacy) +### Action say (legacy) -The `say` service supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`. Since release 0.92, service name can be defined in configuration `service_name` option. +The `say` action supports `language` and on some platforms also `options` for settings, e.g., _voice, motion, speed, etc_. The text that should be spoken is set with `message`. Since release 0.92, action name can be defined in configuration `service_name` option. Say to all `media_player` entities: @@ -96,7 +96,7 @@ data: ## Cache -The integration cache can be controlled with the `cache` option in the service call to `speak` or `say`. A long time cache will be located on the file system. The in-memory cache for fast responses to media players will be auto-cleaned after a short period. +The integration cache can be controlled with the `cache` option in the action to `speak` or `say`. A long time cache will be located on the file system. The in-memory cache for fast responses to media players will be auto-cleaned after a short period. ## REST API @@ -131,11 +131,9 @@ $ curl -X POST -H "Authorization: Bearer <ACCESS TOKEN>" \ ## Troubleshooting -<div class='note'> - +{% important %} Depending on your setup, you might need to set an external URL (`external_url`) inside the [configuration](/integrations/homeassistant/#external_url). - -</div> +{% endimportant %} The following sections describe some of the problems encountered with media devices. @@ -143,7 +141,7 @@ The following sections describe some of the problems encountered with media devi This problem occurs when your Home Assistant instance is configured to be accessed through SSL, and you are using a self-signed certificate on your internal URL. -The `tts` service will send an `https://` URL to the media device, which will check the certificate, and reject it. So it won't play your file. If you could make the device accept your certificate, it would play the file. However, many media devices do not allow changing settings to accept self-signed certificates. Ultimately, your option may be to serve files to local devices as `http://` rather than `https://`. +The `tts` action will send an `https://` URL to the media device, which will check the certificate, and reject it. So it won't play your file. If you could make the device accept your certificate, it would play the file. However, many media devices do not allow changing settings to accept self-signed certificates. Ultimately, your option may be to serve files to local devices as `http://` rather than `https://`. ### Google cast devices @@ -151,6 +149,6 @@ The Google cast devices (Google Home, Chromecast, etc.) present the following pr - They [reject self-signed certificates](#self-signed-certificates). -- 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. +- 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` action 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 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. diff --git a/source/_integrations/twilio_call.markdown b/source/_integrations/twilio_call.markdown index 5c5a12516f20..3f5fe26096ce 100644 --- a/source/_integrations/twilio_call.markdown +++ b/source/_integrations/twilio_call.markdown @@ -34,7 +34,7 @@ from_number: required: true type: string name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: "`notify`" type: string @@ -42,7 +42,7 @@ name: ### Usage -Twilio is a notification platform and thus can be controlled by calling the notify service [as described here](/integrations/notify/). It will send a notification to all E.164 phone numbers in the notification **target**. See the notes above regarding the `from_number` configuration variable for information about formatting phone numbers. +Twilio is a notification platform and thus can be controlled by calling the notify action [as described here](/integrations/notify/). It will send a notification to all E.164 phone numbers in the notification **target**. See the notes above regarding the `from_number` configuration variable for information about formatting phone numbers. ```yaml # Example automation notification entry diff --git a/source/_integrations/twilio_sms.markdown b/source/_integrations/twilio_sms.markdown index bcfadebe6466..3160b47a6f79 100644 --- a/source/_integrations/twilio_sms.markdown +++ b/source/_integrations/twilio_sms.markdown @@ -29,11 +29,11 @@ notify: {% configuration %} from_number: - description: An [E.164](https://en.wikipedia.org/wiki/E.164) formatted phone number, like +14151234567. See [Twilio's guide to formatting phone numbers](https://support.twilio.com/hc/en-us/articles/223183008-Formatting-International-Phone-Numbers) for more information. Alternatively, a sender ID can be used instead of a phone number. The sender ID must be formatted according to Twilio's guidelines. See [Twilio's guide to sender ID](https://support.twilio.com/hc/en-us/articles/223181348-Getting-started-with-Alphanumeric-Sender-ID) for more information. Do keep in mind that not all countries support sender ID. See [Twilio's page of supported countries](https://support.twilio.com/hc/en-us/articles/223133767-International-support-for-Alphanumeric-Sender-ID) for more information. + description: An [E.164](https://en.wikipedia.org/wiki/E.164) formatted phone number, like +14151234567. See [Twilio's guide to formatting phone numbers](https://help.twilio.com/articles/223183008) for more information. Alternatively, a sender ID can be used instead of a phone number. The sender ID must be formatted according to Twilio's guidelines. See [Twilio's guide to sender ID](https://help.twilio.com/articles/223181348-Getting-started-with-Alphanumeric-Sender-ID) for more information. Do keep in mind that not all countries support sender ID. See [Twilio's page of supported countries](https://help.twilio.com/articles/223133767-International-support-for-Alphanumeric-Sender-ID) for more information. required: true type: string name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: "`notify`" type: string @@ -41,7 +41,7 @@ name: ### Usage -Twilio is a notification platform and thus can be controlled by calling the notify service [as described here](/integrations/notify/). It will send a notification to all E.164 phone numbers in the notification **target**. See the notes above regarding the `from_number` configuration variable for information about formatting phone numbers. It's also possible to use `whatsapp:+123456789` for sending notifications to a Whatsapp user. +Twilio is a notification platform and thus can be controlled by calling the notify action [as described here](/integrations/notify/). It will send a notification to all E.164 phone numbers in the notification **target**. See the notes above regarding the `from_number` configuration variable for information about formatting phone numbers. It's also possible to use `whatsapp:+123456789` for sending notifications to a Whatsapp user. Media can be included with messages by setting the optional `media_url` variable. Only `.gif`, `.png`, or `.jpeg` content are supported, according to the Twilio documentation and this feature is [only supported in the US and Canada.][mms] diff --git a/source/_integrations/twitter.markdown b/source/_integrations/twitter.markdown index 9d58565e48e2..485759ba5147 100644 --- a/source/_integrations/twitter.markdown +++ b/source/_integrations/twitter.markdown @@ -52,7 +52,7 @@ notify: {% configuration %} name: - description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the service `notify.NOTIFIER_NAME`. + description: Setting the optional parameter `name` allows multiple notifiers to be created. The notifier will bind to the `notify.NOTIFIER_NAME` action. required: false default: "`notify`" type: string diff --git a/source/_integrations/uk_transport.markdown b/source/_integrations/uk_transport.markdown index 720e22c7c765..d9470de17c2d 100644 --- a/source/_integrations/uk_transport.markdown +++ b/source/_integrations/uk_transport.markdown @@ -16,11 +16,9 @@ related: The `uk_transport` {% term integration %} will display the time in minutes until the next departure in a specified direction from of a configured train station or bus stop. The sensor uses [transportAPI](https://www.transportapi.com/) to query live departure data and requires a developer application ID and key which can be obtained [here](https://developer.transportapi.com/). The [free tier](https://www.transportapi.com/blog/2022/08/introducing-the-home-use-plan-for-transportapi/) allows 30 requests a day, which is sufficient for a single sensor refreshing every 48 minutes. -<div class='note warning'> - +{% note %} Additional sensors can be added but at the expense of a reduced refresh rate. 2 sensors can be updated every 2*48 = 96 minutes, and so on. Calculating and setting this rate is automatically handles by the integration. - -</div> +{% endnote %} Queries are entered as a list, with the two transport modes available being `bus` and `train`. @@ -157,6 +155,6 @@ template: ## Managing API requests -If you wish to manage the rate of API requests (e.g., to disable requests when you aren't interested in travel, so that you can request updates more frequently when you do travel) set a really long `scan_interval` in the configuration options, and use the service `homeassistant.update_entity` to request the update of an {% term entity %}, rather than waiting for the next scheduled update. +If you wish to manage the rate of API requests (e.g., to disable requests when you aren't interested in travel, so that you can request updates more frequently when you do travel) set a really long `scan_interval` in the configuration options, and use the `homeassistant.update_entity` action to request the update of an {% term entity %}, rather than waiting for the next scheduled update. Powered by [transportAPI](https://www.transportapi.com/) diff --git a/source/_integrations/unifi.markdown b/source/_integrations/unifi.markdown index fd7752e55a94..520d77a517ad 100644 --- a/source/_integrations/unifi.markdown +++ b/source/_integrations/unifi.markdown @@ -34,7 +34,7 @@ There is currently support for the following device types within Home Assistant: - [Button](#button) - [Image](#image) - [Presence detection](#presence-detection) -- [Services](#services) +- [Actions](#actions) - [Switch](#switch) - [Sensor](#sensor) - [Firmware updates](#firmware-updates) @@ -53,7 +53,7 @@ The UniFi Network application allows you to create multiple users on it besides ### UniFi OS -For UniFi OS a local-only user needs to be created. A user who uses the Ubiquiti cloud will not work. You can do this in the manage users section on the UniFi OS dashboard. Make sure to give it the right permissions for the functions you want to use. Note the Dream Machine Pro and Cloud Key Gen2 plus updated to UniFi OS needs the port to be 443. +For UniFi OS a local-only user needs to be created. A user who uses the Ubiquiti cloud will not work. You can do this in the manage users section on the UniFi OS dashboard. Make sure to give it the right permissions for the functions you want to use. Note the Dream Machine Pro and Cloud Key Gen2 plus updated to UniFi OS needs the port to be 443. For some self hosted servers the port will be 8443. ### Conflicts with MQTT @@ -94,17 +94,17 @@ If Home Assistant and the UniFi Network application are running on separate mach [Related Issue](https://github.com/home-assistant/home-assistant/issues/10507) -## Services +## Actions -### Service unifi.reconnect_client +### Action unifi.reconnect_client Try to get a wireless client to reconnect to the network. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------- | | `device_id` | No | String representing a device ID related to a UniFi Network {% term integration %} . | -### Service unifi.remove_clients +### Action unifi.remove_clients Clean up clients on the UniFi Network application that has only been associated with the Network application for a short period of time. The difference between first seen and last seen needs to be less than 15 minutes and the client can not have a fixed IP, hostname or name associated with it. diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 4b3db8e8dda8..5b69044eb6b9 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -6,6 +6,7 @@ ha_category: - Button - Camera - Doorbell + - Event - Hub - Light - Lock @@ -20,15 +21,13 @@ ha_ssdp: true ha_release: 2022.2 ha_iot_class: Local Push ha_config_flow: true -ha_quality_scale: platinum -ha_codeowners: - - '@bdraco' ha_domain: unifiprotect ha_platforms: - binary_sensor - button - camera - diagnostics + - event - light - lock - media_player @@ -58,13 +57,11 @@ UCKP with Firmware v1.x **do NOT run UniFi OS**, you must upgrade to firmware [` The absolute **minimal** software version is [`v1.20.0`](https://community.ui.com/releases/UniFi-Protect-Application-1-20-0/d43c0905-3fb4-456b-a7ca-73aa830cb011) for UniFi Protect. If you have an older version, you will get errors trying to set up the integration. However, the general advice is the latest 2 minor versions of UniFi Protect and hardware supported by those are supported. -<div class='note warning'> - +{% important %} **Early Access and Release Candidate versions are not supported by Home Assistant.** Using Early Access Release Candidate versions of UniFi Protect or UniFi OS will likely cause your UniFi Protect {% term integration %} to break unexpectedly. If you choose to opt into either the Early Access or the Release Candidate release channel and anything breaks in Home Assistant, you will need to wait until that version goes to the official Stable Release channel before it is expected to work. - -</div> +{% endimportant %} ### Local user @@ -102,32 +99,28 @@ check that this is done. To check and enable the feature: All known UniFi Protect devices should be supported. Each UniFi Protect device will get a variety of entities added for each of the different {% term entity %} platforms. -<div class='note'> - +{% note %} **Permissions**: The below sections on the features available to your Home Assistant instance assume you have full write access to each device. If the user you are using has limited access to some devices, you will get fewer entities and in many cases, get a read-only sensor instead of an editable switch/select/number {% term entity %}. - -</div> +{% endnote %} ### UniFi Protect cameras -<div class='note'> - +{% note %} **Smart Detections**: The following cameras have Smart Detections: - All "AI" series cameras. This includes the [AI 360](https://store.ui.com/collections/unifi-protect/products/unifi-protect-ai-360) and the [AI Bullet](https://store.ui.com/collections/unifi-protect/products/uvc-ai-bullet). - All "G4" series cameras. This includes the [G4 Doorbell](https://store.ui.com/collections/unifi-protect/products/uvc-g4-doorbell), [G4 Bullet](https://store.ui.com/collections/unifi-protect/products/uvc-g4-bullet), [G4 Pro](https://store.ui.com/collections/unifi-protect/products/uvc-g4-pro) and [G4 Instant](https://store.ui.com/collections/unifi-protect/products/camera-g4-instant). G3 Series cameras do _not_ have Smart detections. - -</div> +{% endnote %} Each UniFi Protect camera will get a device in Home Assistant with the following: - **Camera** - A camera for each camera channel and RTSP(S) combination found for each camera (up to 7). Only the highest resolution RTSPS camera {% term entity %} will be enabled by default. - If your camera is a G4 Doorbell Pro, an additional camera {% term entity %} will be added for the Package Camera. The Package Camera {% term entity %} will _not_ have streaming capabilities regardless of whether RTSPS is enabled on the channel or not. This is due to the Package Camera having a very low FPS that does not make it compatible with HLS streaming. -- **Media Player** - If your camera has a speaker, you will get a media player {% term entity %} that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say Service](/integrations/tts/#service-say). +- **Media Player** - If your camera has a speaker, you will get a media player {% term entity %} that allows you to play audio to your camera's speaker. Any audio file URI that is playable by FFmpeg will be able to be played to your speaker, including via the [TTS Say action](/integrations/tts/#action-say). - **Privacy Mode** - If your camera allows for Privacy Masks, there will be a configuration switch to toggle a "Privacy Mode" that disables recording, microphone, and a black privacy zone over the whole camera. - **Sensors** - Sensors include "Is Dark", "Motion Detected", detected object sensors (if the camera supports smart detections), and "Doorbell Chime" (if the camera has a chime). Several diagnostics sensors are added including sensors on uptime, network connection stats, and storage stats. Doorbells will also have a "Voltage" sensor for troubleshooting electrical issues. - There is one detected object sensor per Smart Detection supported by the camera and a combined sensor for if _any_ object is detected. @@ -223,40 +216,40 @@ Below are the accepted identifiers to resolve media. Since events do not necessa | `{nvr_id}:event:{event_id}` | MP4 video clip for specific event. | | `{nvr_id}:eventthumb:{event_id}` | JPEG thumbnail for specific event. | -## Services +## Actions -### Service unifiprotect.add_doorbell_text +### Action unifiprotect.add_doorbell_text Adds a new custom message for Doorbells. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------- | | `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect instances. | | `message` | No | New custom message to add for Doorbells. Must be less than 30 characters. | -### Service unifiprotect.remove_doorbell_text +### Action unifiprotect.remove_doorbell_text Removes an existing message for Doorbells. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------- | | `device_id` | No | Any device from the UniFi Protect instance you want to change. In case you have multiple Protect instances. | | `message` | No | Existing custom message to remove for Doorbells. | -### Service unifiprotect.set_chime_paired_doorbells +### Action unifiprotect.set_chime_paired_doorbells Use to set the paired doorbell(s) with a smart chime. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------- | | `device_id` | No | The device ID of the Chime you want to pair or unpair doorbells to. | | `doorbells` | Yes | A target selector for any number of doorbells you want to pair to the chime. No value means unpair all. | -### Service unifiprotect.remove_privacy_zone +### Action unifiprotect.remove_privacy_zone Use to remove a privacy zone from a camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------- | | `device_id` | No | Camera you want to remove privacy zone from. | | `name` | No | The name of the zone to remove. | @@ -265,7 +258,7 @@ Use to remove a privacy zone from a camera. The {% term integrations %} provides two proxy views to proxy media content from your Home Assistant instance so you can access thumbnails and video clips from within the context of Home Assistant without having to expose your UniFi Protect NVR Console. As with the media identifiers, all IDs are UniFi Protect IDs as they may not map to specific Home Assistant entities depending on how you have configured your {% term integrations %}. -These URLs work great when trying to send notifications. Home Assistant will automatically sign the URLs and make them safe for external consumption if used in an {% term automation %} or [notify service](/integrations/notify/). +These URLs work great when trying to send notifications. Home Assistant will automatically sign the URLs and make them safe for external consumption if used in an {% term automation %} or [notify action](/integrations/notify/). | View URL | Description | | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -299,5 +292,5 @@ If you get errors while authenticating or fetching data for `NvrError... 404 - R Similarly, a `502 Bad Gateway` also means that your UniFi Protect application may not be running. ```log -pyunifiprotect.NvrError: Fetching Camera List failed: 404 - Reason: Not Found +uiprotect.NvrError: Fetching Camera List failed: 404 - Reason: Not Found ``` diff --git a/source/_integrations/universal.markdown b/source/_integrations/universal.markdown index 2ecac991410e..d6b85486a78f 100644 --- a/source/_integrations/universal.markdown +++ b/source/_integrations/universal.markdown @@ -84,7 +84,7 @@ state_template: required: false type: template commands: - description: "Media player commands to be overridden. Almost all media player service commands may be overridden. Example entries are `turn_on`, `turn_off`, `select_source`, `volume_set`, `volume_up`, `volume_down`, `volume_mute`, `media_play`, `media_pause`, `media_stop`, `media_previous_track`, `media_next_track` and `play_media` (refer to the [`media_player` documentation](/integrations/media_player/) to see the full list)." + description: "Media player commands to be overridden. Almost all media player action commands may be overridden. Example entries are `turn_on`, `turn_off`, `select_source`, `volume_set`, `volume_up`, `volume_down`, `volume_mute`, `media_play`, `media_pause`, `media_stop`, `media_previous_track`, `media_next_track` and `play_media` (refer to the [`media_player` documentation](/integrations/media_player/) to see the full list)." required: false type: string attributes: @@ -111,7 +111,7 @@ Using `active_child_template` will allow you to specify an active {% term entity It is recommended that the command `turn_on`, the command `turn_off`, and the attribute `state` all be provided together. The `state` attribute indicates if the media player is on or off. If `state` indicates the media player is off, this status will take precedence over the states of the children. If all the children are idle/off and `state` is on, the Universal Media Player's state will be on. If not provided, the `toggle` command will delegate to `turn_on` or `turn_off` based on the `state`. -It is also recommended that the command `volume_up`, the command `volume_down`, the command `volume_mute`, and the attribute `is_volume_muted` all be provided together. The attribute `is_volume_muted` should return either True or the on state when the volume is muted. The `volume_mute` {% term service %} should toggle the mute setting. +It is also recommended that the command `volume_up`, the command `volume_down`, the command `volume_mute`, and the attribute `is_volume_muted` all be provided together. The attribute `is_volume_muted` should return either True or the on state when the volume is muted. The `volume_mute` {% term action %} should toggle the mute setting. When providing `select_source` as a command, it is recommended to also provide the attributes `source`, and `source_list`. The `source` attribute is the currently select source, while the `source_list` attribute is a list of all available sources. diff --git a/source/_integrations/upb.markdown b/source/_integrations/upb.markdown index f5c3fc787b6e..9f5d7028b8a3 100644 --- a/source/_integrations/upb.markdown +++ b/source/_integrations/upb.markdown @@ -58,9 +58,9 @@ The `event_data` contains the following: - `rate`: The rate for link to transition to the new level. `rate` is -1 for the default transition rate. -## Services +## Actions -Besides the standard services provided by the Home Assistant [Light](/integrations/light/) and [Scene](/integrations/scene) integrations, the following extra services are provided by the UPB integration: +Besides the standard actions provided by the Home Assistant [Light](/integrations/light/) and [Scene](/integrations/scene) integrations, the following extra actions are provided by the UPB integration: - `upb.light_fade_start` - `upb.light_fade_stop` @@ -73,7 +73,7 @@ Besides the standard services provided by the Home Assistant [Light](/integratio ### Rate transition time -Both standard and custom services that take a `transition` or a `rate` for changing brightness levels take time in seconds. The UPB +Both standard and custom actions that take a `transition` or a `rate` for changing brightness levels take time in seconds. The UPB system only offers a discrete set of transition times. As such, the transition time requested is changed to the closest time based on the table below. Note that this table does not apply to blink rates, only to brightness transition times. @@ -96,77 +96,77 @@ the table below. Note that this table does not apply to blink rates, only to bri | 22.5 minutes | 45 minutes | 30 minutes | 45 minutes | ∞ | 1 hour -### Service `upb.light_fade_start` +### Action `upb.light_fade_start` Starts a transition of a light to the specified level. Lights that are not dimmable ignore the fade start command. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | UPB light which to start fading operation. | `brightness` | no* | Integer between 0 and 255 for how bright the light should be, where 0 means the light is off, 1 is the minimum brightness and 255 is the maximum brightness. *Only one of `brightness` and `brightness_pct` may be used. | `brightness_pct`| no* | Number between 0 and 100 in percentage that specifies how bright the light should be, where 0 means the light is off, 1 is the minimum brightness and 100 is the maximum brightness. *Only one of `brightness` and `brightness_pct` may be used. | `rate` | yes | Number that represents the time (in seconds) the light should take to transition to the new state. See section on "Rate Transition Time" for how this time value is interpreted. -### Service `upb.light_fade_stop` +### Action `upb.light_fade_stop` Stop a light when transitioning from one light level to another. Stops either a fade or a goto (goto occurs when using a `light.turn_on` or `light.turn_off`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | UPB light which to stop fading operation. -### Service `upb.light_blink` +### Action `upb.light_blink` Start a light blinking. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | UPB light which to blink. | `rate` | no | Number between 0 and 4.25 that represents the time (in seconds) the rate the light blinks. Note the UPB implementation limits the blink rate to no faster than 1/3 of a second. -### Service `upb.scene_deactivate` +### Action `upb.scene_deactivate` Deactivate a scene. The term “deactivate” is a general UPB term that usually means to turn to the OFF state, but each individual device manufacturer can define it differently for their device. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | UPB scene to deactivate. -### Service `upb.scene_goto` +### Action `upb.scene_goto` Starts a transition of a scene to the specified level. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | UPB scene to transition. | `brightness` | no* | Integer between 0 and 255 for how bright the scene should be, where 0 means the scene is off, 1 is the minimum brightness and 255 is the maximum brightness. *Only one of `brightness` and `brightness_pct` may be used. | `brightness_pct`| no* | Number between 0 and 100 in percentage that specifies how bright the scene should be, where 0 means the scene is off, 1 is the minimum brightness and 100 is the maximum brightness. *Only one of `brightness` and `brightness_pct` may be used. | `rate` | yes | Number that represents the time (in seconds) the light should take to transition to the new state. See section on "Rate Transition Time" for how this time value is interpreted. -### Service `upb.scene_fade_start` +### Action `upb.scene_fade_start` Starts a transition of a scene to the specified level. Lights within the scene that are not dimmable ignore the fade start command. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | UPB scene to transition. | `brightness` | no* | Integer between 0 and 255 for how bright the scene should be, where 0 means the scene is off, 1 is the minimum brightness and 255 is the maximum brightness. *Only one of `brightness` and `brightness_pct` may be used. | `brightness_pct`| no* | Number between 0 and 100 in percentage that specifies how bright the scene should be, where 0 means the scene is off, 1 is the minimum brightness and 100 is the maximum brightness. *Only one of `brightness` and `brightness_pct` may be used. | `rate` | yes | Number that represents the time (in seconds) the light should take to transition to the new state. See section on "Rate Transition Time" for how this time value is interpreted. -### Service `upb.scene_fade_stop` +### Action `upb.scene_fade_stop` Stop a scene when transitioning from one light level to another. Stops either a fade or a goto. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | UPB scene which to stop fading operation. -### Service `upb.scene_blink` +### Action `upb.scene_blink` Start a scene blinking. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | UPB scene which to blink. | `rate` | no | Number between 0 and 4.25 that represents the time (in seconds) the rate the scene blinks. Note the UPB implementation limits the blink rate to no faster than 1/3 of a second. diff --git a/source/_integrations/upc_connect.markdown b/source/_integrations/upc_connect.markdown index 6a7833b97172..3138140f85ca 100644 --- a/source/_integrations/upc_connect.markdown +++ b/source/_integrations/upc_connect.markdown @@ -19,9 +19,9 @@ related: The `upc_connect` {% term integration %} offers presence detection by looking at connected devices to a [Connect Box](https://www.upc.ch/en/internet/learn-about-internet/) from [Liberty Global](https://www.libertyglobal.com) (also known as UPC Cablecom in Switzerland) which is an Internet provider in Switzerland, Austria, the Netherlands (under Ziggo) and Hungary (under Vodafone). -<div class='note'> +{% important %} This integration works by logging into the router with a password. The router can only have one active session at any time, so if you want to access your router settings then stop Home Assistant first. -</div> +{% endimportant %} To use a Connect Box in your installation, add the following to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} diff --git a/source/_integrations/update.markdown b/source/_integrations/update.markdown index 6b67d7f775fa..977602351c58 100644 --- a/source/_integrations/update.markdown +++ b/source/_integrations/update.markdown @@ -26,9 +26,9 @@ provided by an integration to the {% term entity %}. For example, the version th available, a summary of the release notes, and even links that provide more information on the available update. -Lastly, there are two services available for the update {% term entity %}. If possible and +Lastly, there are two actions available for the update {% term entity %}. If possible and made available by the integration providing the update {% term entity %}, triggering -the actual update from Home Assistant. The other service exposed allows for +the actual update from Home Assistant. The other action exposed allows for skipping the offered update. {% include integrations/building_block_integration.md %} @@ -64,22 +64,22 @@ The following device classes are supported for update entities: to be set. - **`firmware`**: This update {% term integration %} provides firmwares. -## Services +## Actions -The update {% term entity %} exposes two services that can be used to install or skip +The update {% term entity %} exposes two actions that can be used to install or skip an offered software update. -### Service {% my developer_call_service service="update.install" %} +### Action {% my developer_call_service service="update.install" %} -The {% my developer_call_service service="update.install" %} service can be used +The {% my developer_call_service service="update.install" %} action can be used to install an offered update to the device or service. -This service is only available for an update {% term entity %} if an {% term integration %} provides -this capability. Additionally, if allowed by the {% term integration %}, the service +This action is only available for an update {% term entity %} if an {% term integration %} provides +this capability. Additionally, if allowed by the {% term integration %}, the action provides for installing a specific version and even could make a backup before installing the update. -#### Service data attributes +#### Action data attributes {% configuration_basic %} entity_id (required): @@ -90,7 +90,7 @@ backup: description: "If set to `true`, a backup will be made before installing the update. Availability of this attribute is dependent on the {% term integration %}." {% endconfiguration_basic %} -Example service call: +Example action: ```yaml service: update.install @@ -99,9 +99,9 @@ target: - update.my_light_bulb ``` -### Service {% my developer_call_service service="update.skip" %} +### Action {% my developer_call_service service="update.skip" %} -The {% my developer_call_service service="update.skip" %} service can be used +The {% my developer_call_service service="update.skip" %} action can be used to skip an offered update to the device or service. After skipping an offered update, the {% term entity %} will return to the `off` state, @@ -115,19 +115,19 @@ target: ``` Even if an update is skipped and shows as `off` (meaning no update), if there -is a newer version available, calling the `update.install` service on the entity +is a newer version available, calling the `update.install` action on the entity will still install the latest version. -### Service {% my developer_call_service service="update.clear_skipped" %} +### Action {% my developer_call_service service="update.clear_skipped" %} -The {% my developer_call_service service="update.clear_skipped" %} service can +The {% my developer_call_service service="update.clear_skipped" %} action can be used to remove skipped version marker of a previously skipped an offered update to the device or service. After skipping an offered update, the {% term entity %} will return to the `off` state, but will not return to it until a newer version becomes available again. -Using the `update.clear_skipped` service, the skipped version marker can be +Using the `update.clear_skipped` action, the skipped version marker can be removed and thus the entity will return to the `on` state and the update notification will return. diff --git a/source/_integrations/update.mqtt.markdown b/source/_integrations/update.mqtt.markdown index 9c2fa1614685..63167874b2ab 100644 --- a/source/_integrations/update.mqtt.markdown +++ b/source/_integrations/update.mqtt.markdown @@ -202,11 +202,9 @@ value_template: type: template {% endconfiguration %} -<div class='note warning'> - +{% important %} Make sure that your topic matches exactly. `some-topic/` and `some-topic` are different topics. - -</div> +{% endimportant %} ## Examples diff --git a/source/_integrations/utility_meter.markdown b/source/_integrations/utility_meter.markdown index 68389b49637f..98922f0e2e12 100644 --- a/source/_integrations/utility_meter.markdown +++ b/source/_integrations/utility_meter.markdown @@ -22,11 +22,11 @@ The **Utility Meter** {% term integration %} provides functionality to track con From a user perspective, utility meters operate in cycles (usually monthly) for billing purposes. This sensor will track a source sensor values, automatically resetting the meter based on the configured cycle. On reset an attribute will store the previous meter value, providing the means for comparison operations (e.g., "did I spend more or less this month?") or billing estimation (e.g., through a sensor template that multiplies the metered value per the charged unit amount). -Some utility providers have different tariffs according to time/resource availability/etc. The utility meter enables you to define the various tariffs supported by your utility provider and accounts your consumptions in accordance. When tariffs are defined a new {% term entity %} will show up indicating the current tariff. In order to change the tariff, the user must call a service, usually through an automation that can be based in time or other external source (eg. a REST sensor). +Some utility providers have different tariffs according to time/resource availability/etc. The utility meter enables you to define the various tariffs supported by your utility provider and accounts for your consumption accordingly. When tariffs are defined a new {% term entity %} will show up, indicating the current tariff. In order to change the tariff, the user must perform an action, usually through an automation that can be based on time or other external sources (for example, a REST sensor). -<div class='note'> +{% note %} Sensors created with this {% term integration %} are persistent, so values are retained across restarts of Home Assistant. The first cycle for each sensor will be incomplete; a sensor tracking daily usage will start to be accurate the next day after the {% term integration %} was activated. A sensor tracking monthly usage will present accurate data starting the first of the next month after being added to Home Assistant. -</div> +{% endnote %} {% include integrations/config_flow.md %} {% configuration_basic %} @@ -137,9 +137,9 @@ always_available: type: boolean {% endconfiguration %} -<p class='note warning'> +{% important %} When using the `offset` configuration parameter, the defined period must not be longer than 28 days. -</p> +{% endimportant %} ### Time period dictionary example @@ -151,23 +151,23 @@ offset: minutes: 0 ``` -## Services +## Actions -Some of the services are only available if tariffs are configured. +Some of the actions are only available if tariffs are configured. -### Service `utility_meter.reset` +### Action `utility_meter.reset` Reset the Utility Meter. All sensors tracking tariffs will be reset to 0. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings that point at `entity_id`s of utility_meters. -### Service `utility_meter.calibrate` +### Action `utility_meter.calibrate` Calibrate the Utility Meter. Change the value of a given sensor. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | no | String or list of strings that point at `entity_id`s of utility_meters. | `value` | no | Number | Value to calibrate the sensor with | diff --git a/source/_integrations/uvc.markdown b/source/_integrations/uvc.markdown index cd44234fc1f0..997db67b53e7 100644 --- a/source/_integrations/uvc.markdown +++ b/source/_integrations/uvc.markdown @@ -64,6 +64,6 @@ ssl: default: false {% endconfiguration %} -<div class='note'> +{% important %} When using an API_KEY to access cameras controlled by Ubiquiti's NVR Software, the associated user account MUST have at least Administrator privileges within the NVR Software in order for new cameras to be added into Home Assistant. Once the entities have been created in Home Assistant, privileges for the user account can be lowered. -</div> +{% endimportant %} diff --git a/source/_integrations/v2c.markdown b/source/_integrations/v2c.markdown index ce99158aff46..352d85f456bd 100644 --- a/source/_integrations/v2c.markdown +++ b/source/_integrations/v2c.markdown @@ -11,6 +11,7 @@ ha_codeowners: ha_domain: v2c ha_platforms: - binary_sensor + - diagnostics - number - sensor - switch diff --git a/source/_integrations/vacuum.markdown b/source/_integrations/vacuum.markdown index 98910b52b040..9bf1d849c1f4 100644 --- a/source/_integrations/vacuum.markdown +++ b/source/_integrations/vacuum.markdown @@ -15,74 +15,74 @@ The **Vacuum** {% term integration %} enables the ability to control home cleani {% include integrations/building_block_integration.md %} -## Services +## Actions -Available services: `start`, `pause`, `stop`, `return_to_base`, `locate`, `clean_spot`, `set_fan_speed` and `send_command`. +Available actions: `start`, `pause`, `stop`, `return_to_base`, `locate`, `clean_spot`, `set_fan_speed` and `send_command`. -Before calling one of these services, make sure your vacuum platform supports it. +Before calling one of these actions, make sure your vacuum platform supports it. -### Service `vacuum.start` +### Action `vacuum.start` Start or resume a cleaning task. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific vacuum. Use `entity_id: all` to target all. | -### Service `vacuum.pause` +### Action `vacuum.pause` Pause a cleaning task. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific vacuum. Use `entity_id: all` to target all. | -### Service `vacuum.stop` +### Action `vacuum.stop` Stop the current activity of the vacuum. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific vacuum. Use `entity_id: all` to target all. | -### Service `vacuum.return_to_base` +### Action `vacuum.return_to_base` Tell the vacuum to return home. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific vacuum. Use `entity_id: all` to target all. | -### Service `vacuum.locate` +### Action `vacuum.locate` Locate the vacuum cleaner robot. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific vacuum. Use `entity_id: all` to target all. | -### Service `vacuum.clean_spot` +### Action `vacuum.clean_spot` Tell the vacuum cleaner to do a spot clean-up. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific vacuum. Use `entity_id: all` to target all. | -### Service `vacuum.set_fan_speed` +### Action `vacuum.set_fan_speed` Set the fan speed of the vacuum. The `fanspeed` can be a label, as `balanced` or `turbo`, or be a number; it depends on the `vacuum` platform. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | | `entity_id` | yes | Only act on specific vacuum. Use `entity_id: all` to target all. | | `fan_speed` | no | Platform dependent vacuum cleaner fan speed, with speed steps, like 'medium', or by percentage, between 0 and 100. | -### Service `vacuum.send_command` +### Action `vacuum.send_command` Send a platform-specific command to the vacuum cleaner. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------- | | `entity_id` | yes | Only act on specific vacuum. Use `entity_id: all` to target all. | | `command` | no | Command to execute. | diff --git a/source/_integrations/vacuum.mqtt.markdown b/source/_integrations/vacuum.mqtt.markdown index 1a902f5a6f11..35858a77df69 100644 --- a/source/_integrations/vacuum.mqtt.markdown +++ b/source/_integrations/vacuum.mqtt.markdown @@ -268,7 +268,7 @@ If params are provided service sends JSON as payload with such structure: } ``` -Service trigger example: +Action trigger example: ```yaml - alias: "Push command based on sensor" diff --git a/source/_integrations/vacuum.template.markdown b/source/_integrations/vacuum.template.markdown index da6037747446..31b23d28f285 100644 --- a/source/_integrations/vacuum.template.markdown +++ b/source/_integrations/vacuum.template.markdown @@ -3,14 +3,23 @@ title: "Template vacuum" description: "Instructions how to setup template vacuums within Home Assistant." ha_category: - Vacuum + - Helper ha_release: 0.96 ha_iot_class: Local Push ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' ha_domain: template +ha_platforms: + - vacuum +ha_integration_type: helper +related: + - docs: /docs/configuration/ + title: Configuration file --- The `template` platform creates vacuums that combine integrations and provides the -ability to run scripts or invoke services for each of the start, pause, stop, +ability to run scripts or invoke actions for each of the start, pause, stop, return_to_base, clean_spot, locate and set_fan_speed commands of a vacuum. To enable Template Vacuums in your installation, add the following to your diff --git a/source/_integrations/vallox.markdown b/source/_integrations/vallox.markdown index 66479c717028..a4bf430dcf33 100644 --- a/source/_integrations/vallox.markdown +++ b/source/_integrations/vallox.markdown @@ -57,7 +57,7 @@ The date platform allows you to set the filter change date. ## Profile switching -For convenient switching of ventilation profiles in the GUI, just click on the `Vallox` fan {% term entity %} to get a drop-down menu to select from. Alternatively, the service `fan/set_preset_mode` can be used. +For convenient switching of ventilation profiles in the GUI, just click on the `Vallox` fan {% term entity %} to get a drop-down menu to select from. Alternatively, the action `fan/set_preset_mode` can be used. The four standard Vallox profiles are supported: @@ -66,28 +66,28 @@ The four standard Vallox profiles are supported: - `Boost` - `Fireplace` -## Fan services +## Fan actions -### Service `vallox.set_profile_fan_speed_home` +### Action `vallox.set_profile_fan_speed_home` Set the fan speed of the `Home` profile. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|-------------------------------------------------| | `fan_speed` | no | Fan speed in %. `Integer`, between 0 and 100. | -### Service `vallox.set_profile_fan_speed_away` +### Action `vallox.set_profile_fan_speed_away` Set the fan speed of the `Away` profile. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|-------------------------------------------------| | `fan_speed` | no | Fan speed in %. `Integer`, between 0 and 100. | -### Service `vallox.set_profile_fan_speed_boost` +### Action `vallox.set_profile_fan_speed_boost` Set the fan speed of the `Boost` profile. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |------------------------|----------|-------------------------------------------------| | `fan_speed` | no | Fan speed in %. `Integer`, between 0 and 100. | diff --git a/source/_integrations/valve.markdown b/source/_integrations/valve.markdown index 3bab9def981b..a4c02af8f0aa 100644 --- a/source/_integrations/valve.markdown +++ b/source/_integrations/valve.markdown @@ -30,14 +30,14 @@ The following device classes are supported for valves: - **water**: Valve that controls the flow of water through a system. - **gas**: Valve that controls the flow of gas through a system. -## Services +## Actions -### Valve control services +### Valve control actions All valves respond to `valve.open`, `valve.close`, and `valve.toggle`. Valves that allow setting a specific position may also be controlled with `valve.set_position` and `valve.stop`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of valves. Use `entity_id: all` to target all. @@ -54,11 +54,11 @@ automation: entity_id: valve.demo ``` -### Service `valve.set_position` +### Action `valve.set_position` Set the position of one or multiple valves if they support setting a specific position. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of valves. Use `entity_id: all` to target all. | `position` | no | Integer between 0 (fully closed) and 100 (fully open). diff --git a/source/_integrations/valve.mqtt.markdown b/source/_integrations/valve.mqtt.markdown index d1c05dab5342..379c0d3e88ec 100644 --- a/source/_integrations/valve.mqtt.markdown +++ b/source/_integrations/valve.mqtt.markdown @@ -38,7 +38,7 @@ Example of a JSON state update: {"state": "opening", "position": 10} ``` -The wanted position value or `payload_stop` will be published to `command_topic` to control the valve when the services `valve.open`, `value.close`, or `value.set_position` are called. +The wanted position value or `payload_stop` will be published to `command_topic` to control the valve when the actions `valve.open`, `value.close`, or `value.set_position` are called. To use your MQTT valve in your installation, add the following to your {% term "`configuration.yaml`" %} file: @@ -215,16 +215,16 @@ payload_open: type: string default: OPEN payload_stop: - description: The command payload that stops the valve. When not configured, the valve will not support the `valve.stop` service. + description: The command payload that stops the valve. When not configured, the valve will not support the `valve.stop` action. required: false type: string position_closed: - description: Number which represents closed position. The valve's position will be scaled to the(`position_closed`...`position_open`) range when a service is called and scaled back when a value is received. + description: Number which represents closed position. The valve's position will be scaled to the(`position_closed`...`position_open`) range when an action is performed and scaled back when a value is received. required: false type: integer default: 0 position_open: - description: Number which represents open position. The valve's position will be scaled to (`position_closed`...`position_open`) range when a service is called and scaled back when a value is received. + description: Number which represents open position. The valve's position will be scaled to (`position_closed`...`position_open`) range when an is performed and scaled back when a value is received. required: false type: integer default: 100 @@ -277,13 +277,11 @@ value_template: type: template {% endconfiguration %} -<div class="note"> - +{% note %} MQTT valve expects position values to be in the range of 0 to 100, where 0 indicates a closed position and 100 indicates a fully open position. If `position_open` or `position_closed` are set to a different range (for example, 40 to 140), when sending a command to the device, the range will be adjusted to the device range. For example, position 0 will send a value of 40 to device. When the device receives a position payload, it will be adjusted back to the 0 to 100 range. In our example, the device value of 40 will report valve position 0. `position_open` and `position_closed` can also be used to reverse the direction of the device: If `position_closed` is set to 100 and `position_open` is set to `0`, the device operation will be inverted. For example, when setting the position to 40, a value of 60 will be sent to the device. - -</div> +{% endnote %} ## Examples diff --git a/source/_integrations/velbus.markdown b/source/_integrations/velbus.markdown index 6e3ca159b32b..f44f9d73f0f5 100644 --- a/source/_integrations/velbus.markdown +++ b/source/_integrations/velbus.markdown @@ -41,35 +41,35 @@ The port string used in the user interface or the configuration file can have 2 - For a TCP/IP device: `127.0.0.1:3678` - For the VMBSIG module: `tls://192.168.1.9:27015` -## Services +## Actions - `velbus.sync clock`: Synchronize Velbus time to local clock. - `velbus.scan`: Scan the bus for new devices. - `velbus.set_memo_text`: Show memo text on Velbus display modules. - `velbus.clear_cache`: Clear the full velbuscache or the cache for one module only. -### Service `velbus.sync_clock` +### Action `velbus.sync_clock` -You can use the service `velbus.sync_clock` to synchronize the clock of the Velbus modules to the clock of the machine running Home Assistant. This is the same as the 'sync clock' button at the VelbusLink software. +You can use the `velbus.sync_clock` action to synchronize the clock of the Velbus modules to the clock of the machine running Home Assistant. This is the same as the 'sync clock' button at the VelbusLink software. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------- | | `interface` | no | The port used to connect to the bus (the same one as used during configuration). | -### Service `velbus.scan` +### Action `velbus.scan` -You can use the service `velbus.scan` to synchronize the modules between the bus and Home Assistant. This is the same as the 'scan' button at the VelbusLink software. +You can use the `velbus.scan` action to synchronize the modules between the bus and Home Assistant. This is the same as the 'scan' button at the VelbusLink software. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------- | | `interface` | no | The port used to connect to the bus (the same one as used during configuration). | -### Service `velbus.set_memo_text` +### Action `velbus.set_memo_text` -You can use the service `velbus.set_memo_text` to provide the memo text to be displayed at Velbus modules like VMBGPO(D) and VMBELO. +You can use the `velbus.set_memo_text` action to provide the memo text to be displayed at Velbus modules like VMBGPO(D) and VMBELO. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------- | | `interface` | no | The port used to connect to the bus (the same one as used during configuration). | | `address` | no | The module address in decimal format, which is displayed at the device list at the integration page. | @@ -89,12 +89,12 @@ script: service: velbus.set_memo_text ``` -### Service `velbus.clear_cache` +### Action `velbus.clear_cache` -You can use the service `velbus.clear_cache` to clear the cache of one module or the full cache. Once the clear happens, the integration will start a new scan. -Use this service when you make changes to your configuration via velbuslink. +You can use the `velbus.clear_cache` action to clear the cache of one module or the full cache. Once the clear happens, the integration will start a new scan. +Use this action when you make changes to your configuration via velbuslink. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------- | | `interface` | no | The port used to connect to the bus (the same one used during configuration). | | `address` | no | The module address in decimal format, which is displayed on the device list on the integration page, if provided the service will only clear the cache for this model, without an address, the full velbuscache will be cleared. | diff --git a/source/_integrations/velux.markdown b/source/_integrations/velux.markdown index 430906870ca8..b5cdc1373ad5 100644 --- a/source/_integrations/velux.markdown +++ b/source/_integrations/velux.markdown @@ -37,9 +37,9 @@ During configuration, you will be asked for a hostname and password: You must complete the configuration within 5 minutes of rebooting the KLF 200 gateway while the access point is still available. -## Services +## Actions -### Service `velux.reboot_gateway` +### Action `velux.reboot_gateway` Reboots the configured KLF 200 Gateway. diff --git a/source/_integrations/vera.markdown b/source/_integrations/vera.markdown index e14368dc7863..a4a0ce160f6f 100644 --- a/source/_integrations/vera.markdown +++ b/source/_integrations/vera.markdown @@ -50,11 +50,9 @@ and will be automatically added when HA connects to your Vera controller. {% include integrations/config_flow.md %} -<div class='note'> - - It is recommended to assign a static IP address to your Vera Controller. This ensures that it won't change IP addresses, so you won't have to change the `vera_controller_url` if it reboots and comes up with a different IP address. See your router's manual for details on how to set this up. If you need the MAC address of your Vera, check the label on the bottom. - -</div> +{% tip %} +It is recommended to assign a static IP address to your Vera Controller. This ensures that it won't change IP addresses, so you won't have to change the `vera_controller_url` if it reboots and comes up with a different IP address. See your router's manual for details on how to set this up. If you need the MAC address of your Vera, check the label on the bottom. +{% endtip %} ## Options diff --git a/source/_integrations/verisure.markdown b/source/_integrations/verisure.markdown index cb57920dab8f..999243609bd9 100644 --- a/source/_integrations/verisure.markdown +++ b/source/_integrations/verisure.markdown @@ -38,6 +38,8 @@ There is currently support for the following device types within Home Assistant: {% include integrations/config_flow.md %} +{% include integrations/option_flow.md %} + ## Alarm control panel The Verisure alarm control panel platform allows you to control your [Verisure](https://www.verisure.com/) Alarms. @@ -65,7 +67,7 @@ automation: {% endraw %} -## Services +## Actions | Service | Description | | ------- | ----------- | @@ -73,6 +75,10 @@ automation: | enable_autolock | Enables autolock function for a specific lock. | | smartcam_capture | Capture a new image from a specific smartcam. | +## Binary sensor + +- Ethernet status + ## Lock | method state attribute | Description | @@ -89,5 +95,9 @@ Some users have reported that this integration currently doesn't work in the fol - France - Ireland -- Italy +- Italy - Sweden + +## Troubleshooting + +If you get an error message stating something like *"The code for lock.XXX doesn't match pattern `^\d{0}$`."*, make sure the number of digits for your code matches the number defined in the [configuration options](#options). diff --git a/source/_integrations/vesync.markdown b/source/_integrations/vesync.markdown index 4ac1d489d52b..2b9649b65019 100644 --- a/source/_integrations/vesync.markdown +++ b/source/_integrations/vesync.markdown @@ -74,9 +74,9 @@ the configuration section below. {% include integrations/config_flow.md %} -## Services +## Actions -| Service | Description | +| Action | Description | |---------|-------------| | `update_devices` | Poll Vesync server to find and add any new devices | diff --git a/source/_integrations/viaggiatreno.markdown b/source/_integrations/viaggiatreno.markdown index 37446605202d..e96cacca7207 100644 --- a/source/_integrations/viaggiatreno.markdown +++ b/source/_integrations/viaggiatreno.markdown @@ -22,11 +22,9 @@ The first is available just looking at the [ViaggiaTreno](http://viaggiatreno.it `http://www.viaggiatreno.it/infomobilita/resteasy/viaggiatreno/autocompletaStazione/<Station name>` (e.g., `http://www.viaggiatreno.it/infomobilita/resteasy/viaggiatreno/autocompletaStazione/ROMA` will list all station names (with ids) that starts with *ROMA*). -<div class='note'> - -Note that the `station_id` is referred to the train's **departing station**. If a train number does not match with the station id, no data will be returned to the sensor. - -</div> +{% note %} +The `station_id` is referred to the train's **departing station**. If a train number does not match with the station id, no data will be returned to the sensor. +{% endnote %} Then add the data to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} @@ -54,15 +52,13 @@ train_name: type: string {% endconfiguration %} -<div class='note'> +{% note %} In a future implementation, the station name could be used to automatically search best-matching station id, without the need to specify it. -</div> +{% endnote %} The public timetables are coming from [ViaggiaTreno](http://viaggiatreno.it). -<div class='note'> - +{% note %} Instructions (in Italian) for the API are available at: https://github.com/bluviolin/TrainMonitor/wiki/API-del-sistema-Viaggiatreno - -</div> +{% endnote %} diff --git a/source/_integrations/vicare.markdown b/source/_integrations/vicare.markdown index 43b5a2d53c91..78b39c0a5f8c 100644 --- a/source/_integrations/vicare.markdown +++ b/source/_integrations/vicare.markdown @@ -64,22 +64,22 @@ The {% term integration %} polls the Viessmann API every 60 seconds and will wor A note about the current temperature attribute: Viessmann devices with room temperature sensing will show the current room temperature via `current_temperature`. All other devices will show the current supply temperature of the heating circuit. -### Supported services `climate.vicare_heating` +### Supported actions `climate.vicare_heating` -The following services of the [Climate integration](/integrations/climate/) are provided by the ViCare {% term integration %}: `set_temperature`, `set_hvac_mode`, `set_preset_mode` +The following actions of the [Climate integration](/integrations/climate/) are provided by the ViCare {% term integration %}: `set_temperature`, `set_hvac_mode`, `set_preset_mode` -#### Service `set_temperature` +#### Action `set_temperature` Sets the target temperature to the given temperature. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. To target all entities, use `all` keyword instead of entity_id. | `temperature` | no | Desired target temperature Note that `set_temperature` will always affect the current normal temperature or, if a preset is set, the temperature of the preset (i.e., Viessman program like eco or comfort). -#### Service `climate.set_hvac_mode` +#### Action `climate.set_hvac_mode` Set HVAC mode for the climate device. The following modes are supported: @@ -91,26 +91,26 @@ The `climate.vicare_heating` {% term integration %} has the following mapping of | `heat` | `ForcedNormal` | Permanently set heating to normal temperature. | `auto` | `DHWandHeating` | Switches between reduced and normal temperature as by the heating schedule programmed in your device -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. To target all entities, use `all` keyword instead of entity_id. | `hvac_mode` | no | New value of HVAC mode -#### Service `climate.set_vicare_mode` +#### Action `climate.set_vicare_mode` -Set the mode for the climate device as defined by Viessmann (see [set_hvac_mode](#service-climateset_hvac_mode) for a mapping to Home Assistant Climate modes. This allows more-fine grained control of the heating modes. +Set the mode for the climate device as defined by Viessmann (see [set_hvac_mode](#action-climateset_hvac_mode) for a mapping to Home Assistant Climate modes. This allows more-fine grained control of the heating modes. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. To target all entities, use `all` keyword instead of entity_id. | `vicare_mode` | no | New value of ViCare mode. For supported values see the `vicare_modes` attribute of the climate {% term entity %}. -#### Service `set_preset_mode` +#### Action `set_preset_mode` Sets the preset mode. Supported preset modes are *eco* and *comfort*. These are identical to the respective Viessmann programs and are only active temporarily for 8 hours. Eco mode reduces the target temperature by 3°C, whereas Comfort mode sets the target temperature to a configurable value. Please consult your heating device manual for more information. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. To target all entities, use `all` keyword instead of entity_id. | `preset_mode` | no | New value of preset mode. @@ -119,15 +119,15 @@ Eco mode reduces the target temperature by 3°C, whereas Comfort mode sets the t It is not possible to turn on/off water heating via the water heater {% term integration %} since this would conflict with the operation modes of the heating {% term integration %}. Therefore the operation mode of that {% term integration %} is just available as an attribute and cannot be modified. -### Supported services `water_heater.vicare_water` +### Supported actions `water_heater.vicare_water` -The following services of the [water heater integration](/integrations/water_heater/) are provided by the ViCare {% term integration %}: `set_temperature` +The following actions of the [water heater integration](/integrations/water_heater/) are provided by the ViCare {% term integration %}: `set_temperature` -#### Service `set_temperature` +#### Action `set_temperature` Sets the target temperature of domestic hot water to the given temperature. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at `entity_id`'s of climate devices to control. | `temperature` | no | New target temperature for water heater diff --git a/source/_integrations/vilfo.markdown b/source/_integrations/vilfo.markdown index ef9daff5aaa1..040162eb5648 100644 --- a/source/_integrations/vilfo.markdown +++ b/source/_integrations/vilfo.markdown @@ -26,8 +26,6 @@ It currently supports reporting the current load of the device in percent and th The access token for the API can be obtained through the Vilfo web-UI in the pane named "general". Visit [the official API documentation](https://www.vilfo.com/apidocs/#header-authorization) for more information on how to find your token. -<div class="note warning"> - +{% important %} In version 1.0.13 of the Vilfo firmware, access tokens are invalidated when a new login to the web UI is made. To prevent web UI logins from interfering with the API calls, you can create a separate user solely for API purposes and use its access token. - -</div> +{% endimportant %} diff --git a/source/_integrations/vivotek.markdown b/source/_integrations/vivotek.markdown index 0f2923769a49..fe1b558498eb 100644 --- a/source/_integrations/vivotek.markdown +++ b/source/_integrations/vivotek.markdown @@ -102,17 +102,17 @@ camera: stream_path: live2.sdp ``` -### Services +### Actions -Once loaded, the `camera` platform will expose services that can be called to perform various actions. +Once loaded, the `camera` platform will expose actions that can be called to perform various actions. -Available services: `enable_motion_detection`, `disable_motion_detection`, `snapshot`, and `play_stream`. +Available actions: `enable_motion_detection`, `disable_motion_detection`, `snapshot`, and `play_stream`. -#### Service `play_stream` +#### Action `play_stream` Play a live stream from a camera to selected media player(s). Requires [`stream`](/integrations/stream) {% term integration %} to be set up. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------ | | `entity_id` | no | Name of {% term entity %} to fetch stream from, e.g., `camera.front_door_camera`. | | `media_player` | no | Name of media player to play stream on, e.g., `media_player.living_room_tv`. | @@ -129,27 +129,27 @@ action: media_player: media_player.chromecast ``` -#### Service `enable_motion_detection` +#### Action `enable_motion_detection` Enable motion detection in a camera. Currently, this will enable the first event configured on the camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------- | | `entity_id` | yes | Name(s) of entities to enable motion detection, e.g., `camera.front_door_camera`. | -#### Service `disable_motion_detection` +#### Action `disable_motion_detection` Disable the motion detection in a camera. Currently, this will disable the first event configured on the camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------- | | `entity_id` | yes | Name(s) of entities to disable motion detection, e.g., `camera.front_door_camera`. | -#### Service `snapshot` +#### Action `snapshot` Take a snapshot from a camera. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Name(s) of entities to create a snapshot from, e.g., `camera.front_door_camera`. | | `filename` | no | Template of a file name. Variable is `entity_id`, e.g., {% raw %}`/tmp/snapshot_{{ entity_id }}`{% endraw %}. | diff --git a/source/_integrations/vizio.markdown b/source/_integrations/vizio.markdown index d845eb8ffa83..a2a24363cc15 100644 --- a/source/_integrations/vizio.markdown +++ b/source/_integrations/vizio.markdown @@ -24,11 +24,9 @@ If `zeroconf` discovery is enabled, your device will get discovered automaticall ### Install `pyvizio` locally -<div class='note'> - +{% note %} If the `pip3` command is not found, try `pip` instead - -</div> +{% endnote %} - To install, run `pip3 install pyvizio` in your terminal. - If `pyvizio` is already installed locally, make sure you are using the latest version by running `pip3 install --upgrade pyvizio` in your terminal. @@ -214,11 +212,11 @@ The list of apps that are provided by default is statically defined [here](https pyvizio --ip=0 get-apps-list ``` -## Service `vizio.update_setting` +## Action `vizio.update_setting` -This service allows you to update a setting on a given VIZIO device. You will need to know the type of setting and the name of the setting to call this service. You can determine this by using the SmartCast app and going to device settings for your target device. The setting type is the lowercase version of the first menu item you'd select (e.g., display, audio, system), and the setting name is what you see in the app, but spaces are replaced with underscores and it is also all lowercase (e.g., AV delay would be called `av_delay`). +This action allows you to update a setting on a given VIZIO device. You will need to know the type of setting and the name of the setting to perform this action. You can determine this by using the SmartCast app and going to device settings for your target device. The setting type is the lowercase version of the first menu item you'd select (e.g., display, audio, system), and the setting name is what you see in the app, but spaces are replaced with underscores and it is also all lowercase (e.g., AV delay would be called `av_delay`). -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | | `entity_id` | yes | The devices to update a setting for. | `media_player.vizio_smartcast` | `setting_type` | no | The type of setting. | `audio` diff --git a/source/_integrations/vlc.markdown b/source/_integrations/vlc.markdown index 9097c3a5e8be..ac1462f1452b 100644 --- a/source/_integrations/vlc.markdown +++ b/source/_integrations/vlc.markdown @@ -16,11 +16,9 @@ related: The `vlc` platform allows you to control [VLC media player](https://www.videolan.org/vlc/index.html). -<div class='note'> - +{% important %} The **VLC media player** {% term integration %}, is currently only available for installations that are based on the Home Assistant Core in a Python virtual environment. - -</div> +{% endimportant %} ## Configuration @@ -46,7 +44,7 @@ arguments: Only the "music" media type is supported for now. -This service will control a background VLC instance, therefore you cannot use this to control a VLC instance launched on your desktop, unlike the Kodi media player for example. +This action will control a background VLC instance, therefore you cannot use this to control a VLC instance launched on your desktop, unlike the Kodi media player for example. ## Full configuration diff --git a/source/_integrations/vlc_telnet.markdown b/source/_integrations/vlc_telnet.markdown index babb8d34bb76..e6a6e656bc26 100644 --- a/source/_integrations/vlc_telnet.markdown +++ b/source/_integrations/vlc_telnet.markdown @@ -17,7 +17,7 @@ ha_integration_type: integration The **VLC media player via Telnet** {% term integration %} allows you to control a [VLC media player](https://www.videolan.org/vlc/index.html) using the built in telnet interface. -This service will control any instance of VLC player on the network with the telnet interface activated. +This action will control any instance of VLC player on the network with the telnet interface activated. To activate the telnet interface on your VLC Player please read the [official VLC documentation](https://wiki.videolan.org/Documentation:Modules/telnet/). Also remember to add a firewall rule allowing inbound connections for the port used in the device running VLC. In case the VLC is running on a host with a locale other than English, you may get some errors during the volume change. @@ -26,9 +26,9 @@ Consider to set the locale to `en_US` before starting VLC. {% include integrations/config_flow.md %} -## Services +## Actions -When using the `media_player.play_media` service, only the "music" media type is supported for now. +When using the `media_player.play_media` action, only the "music" media type is supported for now. ## Home Assistant add-on diff --git a/source/_integrations/vodafone_station.markdown b/source/_integrations/vodafone_station.markdown index 7229ac0e6c32..09c4df3df52f 100644 --- a/source/_integrations/vodafone_station.markdown +++ b/source/_integrations/vodafone_station.markdown @@ -22,9 +22,9 @@ ha_quality_scale: silver The **Vodafone Station** {% term integration %} allows you to control your [Vodafone Station](https://www.vodafone.it/privati/area-supporto/assistenza-dispositivi/vodafone-station.html) based router. -<div class="note"> +{% note %} The integration supports only Sercomm models so far. -</div> +{% endnote %} There is support for the following platform types within Home Assistant: @@ -37,7 +37,7 @@ There is support for the following platform types within Home Assistant: ## Integration options It is possible to change some behaviors through the {% term integration %} options. -To change the settings, go to {% my integrations title="**Settings** > **Devices & Services**" %}. On the **Vodafone Station** integration, select the cogwheel. Then select **Configure**. +To change the settings, go to {% my integrations title="**Settings** > **Devices & services**" %}. On the **Vodafone Station** integration, select the cogwheel. Then select **Configure**. - **Consider home**: Number of seconds that must elapse before considering a disconnected device "not at home". diff --git a/source/_integrations/volumio.markdown b/source/_integrations/volumio.markdown index 909c7b4b839b..f69335b6b1e6 100644 --- a/source/_integrations/volumio.markdown +++ b/source/_integrations/volumio.markdown @@ -19,6 +19,6 @@ The **Volumio** {% term integration %} allows you to control a [Volumio](https:/ {% include integrations/config_flow.md %} -<div class='note'> +{% note %} Volumio versions 2.799 and below do not have a unique id when manually configured, so you will not be able to rename your {% term entity %} or add your device to an area. If discovery does not work for you, it is advised to upgrade Volumio before configuring. -</div> +{% endnote %} diff --git a/source/_integrations/vultr.markdown b/source/_integrations/vultr.markdown index abd76fbe334d..62f370a35b9f 100644 --- a/source/_integrations/vultr.markdown +++ b/source/_integrations/vultr.markdown @@ -31,9 +31,9 @@ There is currently support for the following device types within Home Assistant: Obtain your API key from your [Vultr Account](https://my.vultr.com/settings/#settingsapi). -<div class='note'> +{% important %} Ensure you allow the public IP of Home Assistant under the Access Control heading. -</div> +{% endimportant %} To integrate your Vultr subscriptions with Home Assistant, add the following section to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} @@ -59,11 +59,9 @@ The `vultr` binary sensor platform allows you to monitor your [Vultr](https://ww To use this binary sensor, you first have to set up your Vultr hub. -<div class='note'> - +{% note %} The following examples assume a subscription that has an ID of `123456` and a label of `Web Server` - -</div> +{% endnote %} Minimal `configuration.yaml` (produces `binary_sensor.vultr_web_server`): @@ -103,11 +101,9 @@ The `vultr` sensor platform will allow you to view current bandwidth usage and p To use this sensor, you must set up your Vultr hub. -<div class='note'> - +{% note %} The following examples assume a subscription that has an ID of `123456` and a label of `Web Server` - -</div> +{% endnote %} Minimal {% term "`configuration.yaml`" %} (produces `sensor.vultr_web_server_current_bandwidth_used` and `sensor.vultr_web_server_pending_charges`): diff --git a/source/_integrations/wake_on_lan.markdown b/source/_integrations/wake_on_lan.markdown index 74624f6b7531..f45759c148dd 100644 --- a/source/_integrations/wake_on_lan.markdown +++ b/source/_integrations/wake_on_lan.markdown @@ -33,21 +33,21 @@ To use this {% term integration %} in your installation, add the following to yo wake_on_lan: ``` -### Integration services +### Actions -Available services: `send_magic_packet`. +Available actions: `send_magic_packet`. -#### Service `wake_on_lan.send_magic_packet` +#### Action `wake_on_lan.send_magic_packet` Send a _magic packet_ to wake up a device with 'Wake on LAN' capabilities. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------- | | `mac` | no | MAC address of the device to wake up. | | `broadcast_address` | yes | Optional broadcast IP where to send the magic packet. | | `broadcast_port` | yes | Optional port where to send the magic packet. | -Sample service data: +Sample action data: ```json { @@ -55,10 +55,10 @@ Sample service data: } ``` -<div class='note'> +{% note %} This usually only works if the target device is connected to the same network. Routing the magic packet to a different subnet requires a special configuration on your router or may not be possible. -The service to route the packet is most likely named "IP Helper". It may support Wake on LAN, but not all routers support this. -</div> +The action to route the packet is most likely named "IP Helper". It may support Wake on LAN, but not all routers support this. +{% endnote %} ## Switch @@ -143,7 +143,7 @@ shell_command: A switch defined with the `wake_on_lan` platform will render in the UI with both 'on' and 'off' clickable actions. If you don't intend to use the `turn_off` functionality, then using a virtual button & automation will look cleaner and less confusing. It will only have one action. 1. First, define a new helper button. - - Go to **{% my helpers title="Settings > Devices & Services > Helpers" %}** and select the **+ Create helper** button. Choose **Button** and give it a name. A button named "Wake PC" will render like this: + - Go to **{% my helpers title="Settings > Devices & services > Helpers" %}** and select the **+ Create helper** button. Choose **Button** and give it a name. A button named "Wake PC" will render like this: ![image](https://github.com/home-assistant/home-assistant.io/assets/252209/10e468a0-45c8-4ee7-b69d-596db3845b14) @@ -157,7 +157,7 @@ A switch defined with the `wake_on_lan` platform will render in the UI with both - input_button.wake_pc ``` -3. For the action, select **Call service** and choose **Wake on LAN: Send magic packet**. +3. For the action, select **Perform action** and choose **Wake on LAN: Send magic packet**. 4. Type in the target MAC address. - Do not change the broadcast port unless you've configured your device to listen to a different port. - Continuing our example, the action YAML looks like this: diff --git a/source/_integrations/water_heater.markdown b/source/_integrations/water_heater.markdown index be9c62129d1e..e0fa0cc490ad 100644 --- a/source/_integrations/water_heater.markdown +++ b/source/_integrations/water_heater.markdown @@ -20,23 +20,21 @@ water_heater: platform: demo ``` -## Services +## Actions -### Water heater control services +### Water heater control actions -Available services: `water_heater.set_temperature`, `water_heater.turn_away_mode_on`, `water_heater.turn_away_mode_off`, `water_heater.set_operation_mode` +Available actions: `water_heater.set_temperature`, `water_heater.turn_away_mode_on`, `water_heater.turn_away_mode_off`, `water_heater.set_operation_mode` -<div class='note'> +{% tip %} +Not all water heater actions may be available for your platform. Be sure to check the available actions Home Assistant has enabled by checking **Developer Tools** > **Actions**. +{% endtip %} -Not all water heater services may be available for your platform. Be sure to check the available services Home Assistant has enabled by checking **Developer Tools** -> **Services**. - -</div> - -### Service `water_heater.set_temperature` +### Action `water_heater.set_temperature` Sets target temperature of water heater device. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at the `entity_id` of water heater devices to control. Use `entity_id: all` to target all. | `temperature` | no | New target temperature for water heater @@ -58,11 +56,11 @@ automation: operation_mode: eco ``` -### Service `water_heater.set_operation_mode` +### Action `water_heater.set_operation_mode` Set operation mode for water heater device -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at the `entity_id` of water heater devices to control. Use `entity_id: all` to target all. | `operation_mode` | no | New value of operation mode. For a list of possible modes, refer to the integration documentation. @@ -82,11 +80,11 @@ automation: operation_mode: eco ``` -### Service `water_heater.set_away_mode` +### Action `water_heater.set_away_mode` Turn away mode on or off for water heater device -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of strings that point at the `entity_id` of water heater devices to control. Use `entity_id: all` to target all. | `away_mode` | no | New value of away mode. 'on'/'off' or True/False diff --git a/source/_integrations/water_heater.mqtt.markdown b/source/_integrations/water_heater.mqtt.markdown index 884c1252c186..2ca786923164 100644 --- a/source/_integrations/water_heater.mqtt.markdown +++ b/source/_integrations/water_heater.mqtt.markdown @@ -214,7 +214,7 @@ power_command_template: required: false type: template power_command_topic: - description: The MQTT topic to publish commands to change the water heater power state. Sends the payload configured with `payload_on` if the water heater is turned on via the `water_heater.turn_on`, or the payload configured with `payload_off` if the water heater is turned off via the `water_heater.turn_off` service. Note that `optimistic` mode is not supported through `water_heater.turn_on` and `water_heater.turn_off` services. When called, these services will send a power command to the device but will not optimistically update the state of the water heater. The water heater device should report its state back via `mode_state_topic`. + description: The MQTT topic to publish commands to change the water heater power state. Sends the payload configured with `payload_on` if the water heater is turned on via the `water_heater.turn_on`, or the payload configured with `payload_off` if the water heater is turned off via the `water_heater.turn_off` action. Note that `optimistic` mode is not supported through `water_heater.turn_on` and `water_heater.turn_off` actions. When called, these actions will send a power command to the device but will not optimistically update the state of the water heater. The water heater device should report its state back via `mode_state_topic`. required: false type: string precision: diff --git a/source/_integrations/watttime.markdown b/source/_integrations/watttime.markdown index a3b545eb8fcb..147a31e5d200 100644 --- a/source/_integrations/watttime.markdown +++ b/source/_integrations/watttime.markdown @@ -38,9 +38,9 @@ Note that the `org` value can be anything you like – it doesn't need to repres ## Sensors -<div class='note info'> +{% note %} The sensors available to you will depend on the type of WattTime subscription you have. You can reach out to WattTime to upgrade your subscription via [their website](https://www.watttime.org/contact/). -</div> +{% endnote %} | Name | Subscription Level | Meaning | | ------------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------- | diff --git a/source/_integrations/waze_travel_time.markdown b/source/_integrations/waze_travel_time.markdown index 7f67081ae283..9961d70d43a3 100644 --- a/source/_integrations/waze_travel_time.markdown +++ b/source/_integrations/waze_travel_time.markdown @@ -25,12 +25,12 @@ Notes: - The string inputs for `Substring *` allow you to force the {% term integration %} to use a particular route or avoid a particular route in its time travel calculation. These inputs are case insensitive and matched against the description of the route. - When using the `Avoid Toll Roads?`, `Avoid Subscription Roads?` and `Avoid Ferries?` options, be aware that Waze will sometimes still route you over toll roads or ferries if a valid vignette/subscription is assumed. Default behavior is that Waze will route you over roads having subscription options. It is therefor best is to set both `Avoid Toll Roads?` and `Avoid Subscription Roads?` or `Avoid Ferries?` if needed and experiment to ensure the desired outcome. -## Service `waze_travel_time.get_travel_times` +## Action `waze_travel_time.get_travel_times` This service populates [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with route alternatives and travel times between two locations. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `origin` | no | The origin of the route | "51.330436, 3.802043" | | `destination` | no | The destination of the route | "51.330436, 3.802043" | @@ -53,7 +53,7 @@ data: response_variable: routes ``` -{% details "Example service response" %} +{% details "Example action response" %} ```yaml waze_travel_time.get_travel_times: diff --git a/source/_integrations/weather.markdown b/source/_integrations/weather.markdown index a589f9c0b0e7..86b1fe5e58dd 100644 --- a/source/_integrations/weather.markdown +++ b/source/_integrations/weather.markdown @@ -68,12 +68,12 @@ wind_speed: 35.17 wind_speed_unit: km/h ``` -## Service `weather.get_forecasts` +## Action `weather.get_forecasts` -This service populates [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data) +This action populates [response data](/docs/scripts/service-calls#use-templates-to-handle-response-data) with a mapping of weather services and their associated forecasts. -| Service data attribute | Optional | Description | Example | +| Data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | --------| | `type` | no | The type of forecast, must be one of `daily`, `twice_daily`, or `hourly`. The default is `daily`. | daily @@ -144,7 +144,7 @@ template: {% enddetails %} -{% details "Example service response" %} +{% details "Example action response" %} ```yaml weather.tomorrow_io_home_nowcast: diff --git a/source/_integrations/weather.template.markdown b/source/_integrations/weather.template.markdown index 690843bdc26d..f5ded2771bec 100644 --- a/source/_integrations/weather.template.markdown +++ b/source/_integrations/weather.template.markdown @@ -3,10 +3,19 @@ title: "Template Weather Provider" description: "Instructions on how to integrate Template Weather provider into Home Assistant." ha_category: - Weather + - Helper ha_release: 2021.3 ha_iot_class: "Local Push" -ha_qa_scale: internal +ha_quality_scale: internal +ha_codeowners: + - '@home-assistant/core' ha_domain: template +ha_platforms: + - weather +ha_integration_type: helper +related: + - docs: /docs/configuration/ + title: Configuration file --- The `template` integrations creates weather provider that combines integrations and an existing weather provider into a fused weather provider. diff --git a/source/_integrations/weatherflow.markdown b/source/_integrations/weatherflow.markdown index 9135a8c4a814..de3389f3f619 100644 --- a/source/_integrations/weatherflow.markdown +++ b/source/_integrations/weatherflow.markdown @@ -18,9 +18,9 @@ ha_integration_type: hub The **WeatherFlow** {% term integration %} is a local-only {% term integration %} that reads weather data from all [WeatherFlow Tempest](https://weatherflow.com/tempest-weather-system/) compatible weather station on the local network. -<div class='note'> +{% note %} You may see slight deviations between the values reported in Home Assistant and the values in the WeatherFlow App. This is because the WeatherFlow app considers both forecasts and neighboring weather stations in addition to the local data used in this {% term integration %}. -</div> +{% endnote %} {% include integrations/config_flow.md %} diff --git a/source/_integrations/webmin.markdown b/source/_integrations/webmin.markdown index 46fc3c8ed7bd..4a0e32ca59fd 100644 --- a/source/_integrations/webmin.markdown +++ b/source/_integrations/webmin.markdown @@ -19,6 +19,14 @@ ha_platforms: This {% term integration %} provides sensors for monitoring the CPU and memory usage of your server. +## Prerequisites + +For best security, create a specific Webmin user for Home Assistant with a strong password and only "Can accept RPC calls" permission (under "Permissions for all modules") and remove the "Can accept RPC calls" permission for all other users. + +{% note %} +Be aware that the Webmin API ignores any 2FA set up via the frontend, e.g. it is even with enabled 2FA possible to use the API with only username and password. +{% endnote %} + {% include integrations/config_flow.md %} ## Sensors diff --git a/source/_integrations/webostv.markdown b/source/_integrations/webostv.markdown index 347450df7463..95365bbd38c1 100644 --- a/source/_integrations/webostv.markdown +++ b/source/_integrations/webostv.markdown @@ -38,9 +38,9 @@ Common for webOS 3.0 and higher would be to use WakeOnLan feature. To use this f On newer models (2017+), WakeOnLan may need to be enabled in the TV settings by going to Settings > General > Mobile TV On > Turn On Via WiFi [instructions](https://support.quanticapps.com/hc/en-us/articles/115005985729-How-to-turn-on-my-LG-Smart-TV-using-the-App-WebOS-). -<div class='note'> +{% important %} This usually only works if the TV is connected to the same network. Routing the WakeOnLan packet to a different subnet requires special configuration on your router or may not be possible. -</div> +{% endimportant %} You can create an automation from the user interface, from the device create a new automation and select the **Device is requested to turn on** automation. Automations can also be created using an automation action: @@ -66,9 +66,9 @@ Any other [actions](/docs/automation/action/) to power on the device can be conf It is possible to select which sources will be available to the media player. When the TV is powered on press the **CONFIGURE** button in the {% term integration %} card and select the sources to enable. If you don't select any source the media player will offer all of the sources of the TV. -## Change channel through play_media service +## Change channel through play_media action -The `play_media` service can be used in a script to switch to the specified TV channel. It selects the best matching channel according to the `media_content_id` parameter: +The `play_media` action can be used in a script to switch to the specified TV channel. It selects the best matching channel according to the `media_content_id` parameter: 1. Channel number *(i.e., '1' or '6')* 2. Exact channel name *(i.e., 'France 2' or 'CNN')* @@ -102,29 +102,29 @@ The behavior of the next and previous buttons is different depending on the acti ### Sound output The current sound output of the TV can be found under the state attributes. -To change the sound output, the following service is available: +To change the sound output, the following action is available: -#### Service `webostv.select_sound_output` +#### Action `webostv.select_sound_output` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------- | | `entity_id` | no | Target a specific webostv media player. | | `sound_output` | no | Name of the sound output to switch to. | ### Generic commands and buttons -Available services: `button`, `command` +Available actions: `button`, `command` -### Service `webostv.button` +### Action `webostv.button` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Target a specific webostv media player. | | `button` | no | Name of the button. Known possible values are `LEFT`, `RIGHT`, `DOWN`, `UP`, `HOME`, `MENU`, `BACK`, `ENTER`, `DASH`, `INFO`, `ASTERISK`, `CC`, `EXIT`, `MUTE`, `RED`, `GREEN`, `BLUE`, `YELLOW`, `VOLUMEUP`, `VOLUMEDOWN`, `CHANNELUP`, `CHANNELDOWN`, `PLAY`, `PAUSE`, `NETFLIX`, `GUIDE`, `AMAZON`, `0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9` | -### Service `webostv.command` +### Action `webostv.command` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `entity_id` | no | Target a specific webostv media player. | | `command` | no | Endpoint for the command, e.g., `system.launcher/open`. The full list of known endpoints is available at <https://github.com/bendavid/aiopylgtv/blob/master/aiopylgtv/endpoints.py> | diff --git a/source/_integrations/wemo.markdown b/source/_integrations/wemo.markdown index 20642c35cbd7..ab342fcdd27b 100644 --- a/source/_integrations/wemo.markdown +++ b/source/_integrations/wemo.markdown @@ -122,18 +122,18 @@ There are several attributes which can be used for automations and templates: | `target_humidity` | An integer that indicates the desired relative humidity percentage (this is constrained to the humidity settings of the device, which are 45, 50, 55, 60, and 100). | `water level` | String that indicates whether the water level is Good, Low, or Empty. -### Services +### Actions -There are several services which can be used for automations and control of the humidifier: +There are several actions which can be used for automations and control of the humidifier: -| Service | Description | +| Action | Description | | --------- | ----------- | -| `set_speed` | Calling this service sets the fan speed (entity_id and speed are required parameters, and speed must be one of the following: off, low, medium, or high). When selecting low for the speed, this will map to the WeMo humidifier speed of minimum. When selecting high for the speed, this will map to the WeMo humidifier speed of maximum. The WeMo humidifier speeds of low and high are unused due to constraints on which fan speeds Home Assistant supports. -| `toggle` | Calling this service will toggle the humidifier between on and off states. -| `turn_off` | Calling this service will turn the humidifier off (entity_id is required). -| `turn_on` | Calling this service will turn the humidifier on and set the speed to the last used speed (defaults to medium, entity_id is required). -| `wemo.set_humidity` | Calling this service will set the desired relative humidity setting on the device (entity_id is a required list of 1 or more entities to set humidity on, and target_humidity is a required float value between 0 and 100 (this value will be rounded down and mapped to one of the valid desired humidity settings of 45, 50, 55, 60, or 100 that are supported by the WeMo humidifier)). -| `wemo.reset_filter_life` | Calling this service will reset the humdifier's filter lifetime back to 100% (entity_id is a required list of 1 or more entities to reset the filter lifetime on). Call this service when you change the filter on your humidifier. +| `set_speed` | Performing this action sets the fan speed (entity_id and speed are required parameters, and speed must be one of the following: off, low, medium, or high). When selecting low for the speed, this will map to the WeMo humidifier speed of minimum. When selecting high for the speed, this will map to the WeMo humidifier speed of maximum. The WeMo humidifier speeds of low and high are unused due to constraints on which fan speeds Home Assistant supports. +| `toggle` | Performing this action will toggle the humidifier between on and off states. +| `turn_off` | Performing this action will turn the humidifier off (entity_id is required). +| `turn_on` | Performing this action will turn the humidifier on and set the speed to the last used speed (defaults to medium, entity_id is required). +| `wemo.set_humidity` | Performing this action will set the desired relative humidity setting on the device (entity_id is a required list of 1 or more entities to set humidity on, and target_humidity is a required float value between 0 and 100 (this value will be rounded down and mapped to one of the valid desired humidity settings of 45, 50, 55, 60, or 100 that are supported by the WeMo humidifier)). +| `wemo.reset_filter_life` | Performing this action will reset the humdifier's filter lifetime back to 100% (entity_id is a required list of 1 or more entities to reset the filter lifetime on). Call this action when you change the filter on your humidifier. ## Long press events and triggers diff --git a/source/_integrations/whirlpool.markdown b/source/_integrations/whirlpool.markdown index 7ef99e50b5dd..436491918336 100644 --- a/source/_integrations/whirlpool.markdown +++ b/source/_integrations/whirlpool.markdown @@ -32,17 +32,18 @@ The following appliances are confirmed to be working, but other models that use Climate: -- SPIW309A2WF/SPIW312A2WF -- SPIW409A2WF +- Whirlpool SPIW309A2WF / SPIW312A2WF +- Whirlpool SPIW409A2WF Washer: -- WTW6120HW2 -- MHW8630HW0 +- Whirlpool WTW6120HW2 +- Whirlpool WTW8127LW1 +- Maytag MHW8630HW0 Dryer: -- Not confirmed +- Whirlpool WGD8127LW3 {% include integrations/config_flow.md %} @@ -54,10 +55,10 @@ The `whirlpool` sensor platform integrates Whirlpool Washer and Dryer systems in The `whirlpool` climate platform integrates Whirlpool air conditioning systems into Home Assistant, allowing control of the appliance trough the user interface. The current inside temperature is also displayed on the thermostat card. -The following services are also available: +The following actions are also available: -- [**set_hvac_mode**](/integrations/climate/#service-climateset_hvac_mode) (`off`, `heat`, `cool`, `fan_only`) -- [**target temperature**](/integrations/climate#service-climateset_temperature) -- [**turn on/off**](/integrations/climate#service-climateturn_on) -- [**fan mode**](/integrations/climate#service-climateset_fan_mode) (`low`, `medium`, `high`) -- [**swing mode**](/integrations/climate#service-climateset_swing_mode) (`off`, `horizontal`) +- [**set_hvac_mode**](/integrations/climate/#action-climateset_hvac_mode) (`off`, `heat`, `cool`, `fan_only`) +- [**target temperature**](/integrations/climate#action-climateset_temperature) +- [**turn on/off**](/integrations/climate#action-climateturn_on) +- [**fan mode**](/integrations/climate#action-climateset_fan_mode) (`low`, `medium`, `high`) +- [**swing mode**](/integrations/climate#action-climateset_swing_mode) (`off`, `horizontal`) diff --git a/source/_integrations/wilight.markdown b/source/_integrations/wilight.markdown index eff11b3a57bb..4271a0abf166 100644 --- a/source/_integrations/wilight.markdown +++ b/source/_integrations/wilight.markdown @@ -38,17 +38,17 @@ There is currently support for the following device types within Home Assistant: The **WiLight** {% term integration %} allows you to control your Fans from within Home Assistant. -### Fan services +### Fan actions -There are several services which can be used for automations and control of the fan: +There are several actions which can be used for automations and control of the fan: -| Service | Description | +| Action | Description | | --------- | ----------- | -| `set_percentage` | Calling this service sets the fan speed (`entity_id` and `percentage` are required parameters). Percentage must be in the range 0-100, percentage = 0 turns off the fan. There are three speed levels 33%, 66% and 100%. Adjusting to intermediate levels goes to the next higher level. -| `set_direction` | Calling this service will set the fan direction (`entity_id` and `direction` are required parameters, and direction must be one of the following: forward or reverse). Calling this service will turn the fan on. -| `toggle` | Calling this service will toggle the fan between on and off states (`entity_id` is required). -| `turn_off` | Calling this service will turn the fan off (`entity_id` is required). -| `turn_on` | Calling this service will turn the fan on and set the speed and direction to the last used ones (defaults to high and forward, `entity_id` is required). +| `set_percentage` | Calling this action sets the fan speed (`entity_id` and `percentage` are required parameters). Percentage must be in the range 0-100, percentage = 0 turns off the fan. There are three speed levels 33%, 66% and 100%. Adjusting to intermediate levels goes to the next higher level. +| `set_direction` | Calling this action will set the fan direction (`entity_id` and `direction` are required parameters, and direction must be one of the following: forward or reverse). Calling this action will turn the fan on. +| `toggle` | Calling this action will toggle the fan between on and off states (`entity_id` is required). +| `turn_off` | Calling this action will turn the fan off (`entity_id` is required). +| `turn_on` | Calling this action will turn the fan on and set the speed and direction to the last used ones (defaults to high and forward, `entity_id` is required). ## Irrigation @@ -57,26 +57,26 @@ There are two switch types for Irrigation: `watering switch` and `pause switch`. A `watering switch` can turn on and off the irrigation valve, while the `pause switch` can disable / enable the action of a `watering switch`. `Triggers` activate (turn on) the `watering switch` (irrigation valve) at the programmed time. The trigger can be set to run on a day of the week or only once (today). -### Irrigation services +### Irrigation actions -There are several services which can be used for automations and control of the Irrigation: +There are several actions which can be used for automations and control of the Irrigation: - For `watering switch`: -| Service | Description | +| Action | Description | | --------- | ----------- | -| `turn_off` | Calling this service will turn the irrigation valve off (`entity_id` is required). -| `turn_on` | Calling this service will turn the irrigation valve on (`entity_id` is required). -| `set_watering_time` | Calling this service sets the watering time (`entity_id` and `watering_time` are required parameters), `watering_time` must be in the range 1-1800 seconds. -| `set_trigger` | Calling this service sets the trigger_1, trigger_2, trigger_3 or trigger_4 (`entity_id`, `trigger_index` and `trigger` are required parameters), `trigger_index` must be between 1 and 4 and `trigger` must be according Trigger rules (see below). +| `turn_off` | Calling this action will turn the irrigation valve off (`entity_id` is required). +| `turn_on` | Calling this action will turn the irrigation valve on (`entity_id` is required). +| `set_watering_time` | Calling this action sets the watering time (`entity_id` and `watering_time` are required parameters), `watering_time` must be in the range 1-1800 seconds. +| `set_trigger` | Calling this action sets the trigger_1, trigger_2, trigger_3 or trigger_4 (`entity_id`, `trigger_index` and `trigger` are required parameters), `trigger_index` must be between 1 and 4 and `trigger` must be according Trigger rules (see below). - For `pause switch`: -| Service | Description | +| Action | Description | | --------- | ----------- | -| `turn_off` | Calling this service will turn the pause switch off, enabling watering switch (`entity_id` is required). -| `turn_on` | Calling this service will turn the pause switch on, disabling watering switch (`entity_id` is required). -| `set_pause_time` | Calling this service sets the pause time (`entity_id` and `pause_time` are required parameters), `pause_time` must be in the range 1-24 hours. +| `turn_off` | Performing this action will turn the pause switch off, enabling watering switch (`entity_id` is required). +| `turn_on` | Performing this action will turn the pause switch on, disabling watering switch (`entity_id` is required). +| `set_pause_time` | Performing this action sets the pause time (`entity_id` and `pause_time` are required parameters), `pause_time` must be in the range 1-24 hours. Trigger rules: - String with 8 decimal characters ("0" to "9"). diff --git a/source/_integrations/wled.markdown b/source/_integrations/wled.markdown index 513f700efaab..76c6c4f7b985 100644 --- a/source/_integrations/wled.markdown +++ b/source/_integrations/wled.markdown @@ -15,7 +15,6 @@ ha_codeowners: ha_domain: wled ha_zeroconf: true ha_platforms: - - binary_sensor - button - diagnostics - light @@ -130,7 +129,7 @@ Keep Master Light: ### Activating random effect -You can automate changing the effect using a service call like this: +You can automate changing the effect using an action like this: {% raw %} @@ -165,7 +164,7 @@ data: ### Activating a preset Activating a preset is an easy way to set a WLED light to a specific -configuration. Here is an example service call to set a WLED light +configuration. Here is an example action to set a WLED light to a preset called My Preset: ```yaml @@ -183,8 +182,8 @@ to a preset called My Preset: An automation to turn on a WLED light and select a specific palette and set intensity, and speed can be created by first calling the `light.turn_on` -service, then calling the `select.select_option` service to select the -palette, then call the `number.set_value` service to set the intensity +service, then calling the `select.select_option` action to select the +palette, then call the `number.set_value` action to set the intensity and again to set the speed. Here is an example of all of these put together into an automation: diff --git a/source/_integrations/workday.markdown b/source/_integrations/workday.markdown index ca831ad2e0cb..13fabe530e42 100644 --- a/source/_integrations/workday.markdown +++ b/source/_integrations/workday.markdown @@ -31,11 +31,9 @@ Check the [country list](https://github.com/dr-prodigy/python-holidays#available The keyword "Holidays" is used for public holidays identified by the holidays module and holidays added by the "Add holidays" configuration option. -<div class='note warning'> - +{% important %} Take note of the "Holidays" keyword. Your first instinct might be to add it to the "Excludes" configuration, thinking it means skipping the holidays. But it is meant to exclude the days in the holiday list from the workdays. So, when you exclude "Holidays" and a workday falls on that day, that workday is excluded, and the sensor will be **off**. If you want every workday flagged with no regard to holidays, ensure that there is something in your "Excludes" configuration _other_ than "Holidays". - -</div> +{% endimportant %} ## Specific field information @@ -49,12 +47,12 @@ Remove holidays will take dates formatted with `YYYY-MM-DD`, a date range format The offset can be used to see if future days are workdays. For example, put `1` to see if tomorrow is a workday. -## Service `workday.check_date` +## Action `workday.check_date` -This service populates [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) +This action populates [Response Data](/docs/scripts/service-calls#use-templates-to-handle-response-data) providing feedback if the date is a workday or not. -| Service data attribute | Required | Description | Example | +| Data attribute | Required | Description | Example | | ---------------------- | -------- | ----------- | --------| | `check_date` | yes | Date to test if workday or not. | 2022-03-10 diff --git a/source/_integrations/worldclock.markdown b/source/_integrations/worldclock.markdown index 920dbf0523a1..bee4e95e9b46 100644 --- a/source/_integrations/worldclock.markdown +++ b/source/_integrations/worldclock.markdown @@ -9,6 +9,7 @@ ha_quality_scale: internal ha_codeowners: - '@fabaff' ha_domain: worldclock +ha_config_flow: true ha_platforms: - sensor ha_integration_type: integration @@ -19,37 +20,15 @@ related: The `worldclock` {% term integration %} simply displays the current time in a different time zone. -## Configuration +{% include integrations/config_flow.md %} -To enable this {% term integration %} in your installation, add the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} - -```yaml -# Example configuration.yaml entry -sensor: - - platform: worldclock - time_zone: America/New_York -``` - -{% configuration %} -time_zone: - description: The resource or endpoint that contains the value. - required: true - type: string -name: +{% configuration_basic %} +Timezone: + description: Select a valid timezone from the list. +Name: description: The name of the sensor, e.g., the city. - required: false - type: string - default: Worldclock Sensor -time_format: - description: The time format. - required: false - type: string - default: "%H:%M" -{% endconfiguration %} - -For valid time zones, check the **TZ** column in the [Wikipedia overview](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones), or get the full list from the [pytz](https://pypi.python.org/pypi/pytz) module. +Time format: + description: The time format, defaults to "%H:%M" which represents hour and minute. +{% endconfiguration_basic %} -```shell -python3 -c "import pytz;print(pytz.all_timezones)" -``` +For valid time zones, check the **TZ** column in the [Wikipedia overview](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). diff --git a/source/_integrations/wsdot.markdown b/source/_integrations/wsdot.markdown index b66261904494..528719387804 100644 --- a/source/_integrations/wsdot.markdown +++ b/source/_integrations/wsdot.markdown @@ -87,9 +87,9 @@ Some common examples include: 98 HOV Bellevue-Seattle via I-90 (WB REV) ``` -<div class='note info'> +{% note %} WSDOT does provide information about ferry schedules, mountain passes, tolls, etc. but so far only Travel Time data is available in this platform. -</div> +{% endnote %} Here's an example of the sensor in use: diff --git a/source/_integrations/xbox.markdown b/source/_integrations/xbox.markdown index 7db8af298f24..6654bdfdb764 100644 --- a/source/_integrations/xbox.markdown +++ b/source/_integrations/xbox.markdown @@ -28,23 +28,21 @@ Home Assistant authenticates with Xbox Live through OAuth2 using the Home Assist Note that for the media player and remote entities to be added your Xbox will need to have remote features enabled via **Settings -> Devices & connections -> Remote features** (you may need to upgrade your controller firmware). -<div class='note'> - +{% important %} Because it uses the Home Assistant Cloud account linking service you **must** have either `cloud:` or `default_config:` in your {% term "`configuration.yaml`" %}. - -</div> +{% endimportant %} ## Media player The Xbox media player platform will create media player entities for each console linked to your Microsoft account. These entities will display the active app and playback controls as well as a media browser implementation, allowing you to launch any installed application. -### Service `play_media` +### Action `play_media` Launches an application on the Xbox console using the application's product ID. Also supports "Home" and "TV" to navigate to the dashboard or Live TV respectively. You can find Product IDs using the **{% my developer_events title="Developer Tools -> Events" %}** tab and listening to the `call_service` event. In a new browser tab, navigate to the media browser for your console and click on an App/Game to see the product ID in the event. -| Service data attribute | Description | +| Data attribute | Description | | ---------------------- | --------------------------------------| | `entity_id` | `entity_id` of the Xbox media player | | `media_content_id` | "Home"/"TV"/{product_id} | @@ -68,9 +66,9 @@ media_content_id: "9WZDNCRFJ3TJ" # Netflix The Xbox remote platform will create Remote entities for each console linked to your Microsoft Account. These entities will allow you to turn on/off and send controller or text input to your console. -### Service `send_command` +### Action `send_command` -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------- | | `entity_id` | no | `entity_id` of the Xbox remote. | | `command` | no | List of the controller commands or text input to be sent.<br />Commands: A, B, X, Y, Up, Down, Left, Right | @@ -271,15 +269,15 @@ Just like the binary sensors, the Xbox sensor platform automatically keeps track The Xbox media source platform allows you to use the Media Browser panel to view both your own, and community, gameclips or screenshots for games that you have installed on any of your consoles. As with any other media source {% term integration %}, you are also able to send these clips to supported media players like Chromecast. -<div class="note"> +{% important %} It can take up to a couple of days for newly installed applications to appear in the media browser. -</div> +{% endimportant %} ## Manual configuration -<div class="note"> +{% warning %} These steps are not required, nor will they be supported if issues are encountered. -</div> +{% endwarning %} If you prefer not to use the Home Assistant account linking service, you may manually configure a local implementation if your instance is exposed externally over HTTPS using the following steps: diff --git a/source/_integrations/xiaomi.markdown b/source/_integrations/xiaomi.markdown index 7737c0efdb36..bdaa7eb0e543 100644 --- a/source/_integrations/xiaomi.markdown +++ b/source/_integrations/xiaomi.markdown @@ -27,25 +27,21 @@ In order to integrate the camera with Home Assistant, it is necessary to install Once installed, please ensure that you have enabled FTP. -<div class='note warning'> - +{% warning %} Currently, version 0.1.4-beta2 of the custom firmware is the highest supported. Firmwares higher than this version use [Pure-FTPd](https://www.pureftpd.org/project/pure-ftpd), which has a bug that prevents FFmpeg from correctly rendering video files. +{% endwarning %} -</div> - -<div class='note warning'> - +{% important %} Raspbian users: Don't forget to install `ffmpeg` support on your platform, otherwise, you'll not see video. +{% endimportant %} -</div> +{% note %} +The live stream writing by the camera is not a supported format when Home Assistant reads through FTP for Yi 720p and Xiaofang Cameras, so this platform retrieves the video which was saved 1 minute earlier. +{% endnote %} -<div class='note warning'> -The live stream writing by the camera is not a supported format when the hass reads through FTP for Yi 720p and Xiaofang Cameras, so this platform retrieves the video which was saved 1 minute earlier. -</div> - -<div class='note warning'> +{% tip %} If you enabled RTSP server, you can connect to your camera via other Home Assistant camera platforms. However, this RTSP server disables the ability to use the supremely-useful Mi Home app. In order to maintain both Home Assistant compatibility _and_ the native app, this platform retrieves videos via FTP. -</div> +{% endtip %} ## Configuring the platform @@ -93,11 +89,9 @@ ffmpeg_arguments: type: string {% endconfiguration %} -<div class='note'> - +{% important %} The default for `path:` will not work with all cameras. It may be needed that you add that key with the exact path for your device. - -</div> +{% endimportant %} ## Image quality diff --git a/source/_integrations/xiaomi_aqara.markdown b/source/_integrations/xiaomi_aqara.markdown index f21ca6dbd275..b8211a00d8fc 100644 --- a/source/_integrations/xiaomi_aqara.markdown +++ b/source/_integrations/xiaomi_aqara.markdown @@ -66,7 +66,7 @@ Please note, there are two versions of the hub: v1 and v2. v1 can be used with H Follow the setup process using your phone and Mi-Home app. From here you will be able to retrieve the key (password) from within the app following [this tutorial](https://www.domoticz.com/wiki/Xiaomi_Gateway_(Aqara)#Adding_the_Xiaomi_Gateway_to_Domoticz). -To enable {{ page.title }} in your installation, go to **Settings** -> **Devices & Services**. Xiaomi Aqara gateways should be discovered automatically and should show up in the overview. Hit configure and go through the steps to specify the optional settings. If your aqara gateway does not show up automatically, click the + icon in the lower right. Then search for "xiaomi_aqara" and enter the setup. Multiple gateways can be configured by simply repeating the setup multiple times. +To enable {{ page.title }} in your installation, go to **Settings** > **Devices & services**. Xiaomi Aqara gateways should be discovered automatically and should show up in the overview. Hit configure and go through the steps to specify the optional settings. If your Aqara gateway does not show up automatically, click the + icon in the lower right. Then, search for "xiaomi_aqara" and enter the setup. Multiple gateways can be configured by simply repeating the setup multiple times. {% configuration %} interface: @@ -84,15 +84,15 @@ name: type: string {% endconfiguration %} -### Services +### Actions -The gateway provides the following services: +The gateway provides the following actions: -#### Service `xiaomi_aqara.play_ringtone` +#### Action `xiaomi_aqara.play_ringtone` Play a specific ringtone. The version of the gateway firmware must be `1.4.1_145` at least. Take a look at the examples below. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|-------------------------------------------------------| | `gw_mac` | no | MAC address of the Xiaomi Aqara Gateway | | `ringtone_id` | no | One of the allowed ringtone ids | @@ -128,27 +128,27 @@ Allowed values of the `ringtone_id` are: - 29 - Thinker - Custom ringtones (uploaded by the Mi Home app) starting from 10001 -#### Service `xiaomi_aqara.stop_ringtone` +#### Action `xiaomi_aqara.stop_ringtone` Stops a playing ringtone immediately. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|-------------------------------------------------------| | `gw_mac` | no | MAC address of the Xiaomi Aqara Gateway | -#### Service `xiaomi_aqara.add_device` +#### Action `xiaomi_aqara.add_device` Enables the join permission of the Xiaomi Aqara Gateway for 30 seconds. A new device can be added afterwards by pressing the pairing button once. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|-------------------------------------------------------| | `gw_mac` | no | MAC address of the Xiaomi Aqara Gateway | -#### Service `xiaomi_aqara.remove_device` +#### Action `xiaomi_aqara.remove_device` Removes a specific device. The removal is required if a device shall be paired with another gateway. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|-------------------------------------------------------| | `gw_mac` | no | MAC address of the Xiaomi Aqara Gateway | | `device_id` | no | Hardware address of the device to remove | diff --git a/source/_integrations/xiaomi_miio.markdown b/source/_integrations/xiaomi_miio.markdown index e8726da6a4f1..0e9084bcba82 100644 --- a/source/_integrations/xiaomi_miio.markdown +++ b/source/_integrations/xiaomi_miio.markdown @@ -57,11 +57,9 @@ and [Xiaomi IR Remote](#xiaomi-ir-remote). Please read the linked sections for t Devices need to be set up using the Mi Home app and not vendor-specific apps (e.g. Roborock). -<div class='note'> - +{% note %} For more complex network setups (e.g. VLANs), reference the [following documentation](https://python-miio.readthedocs.io/en/latest/troubleshooting.html#discover-devices-across-subnets) for additional information. - -</div> +{% endnote %} {% include integrations/config_flow.md %} @@ -958,9 +956,9 @@ These models use newer MiOT communication protocol. | Clean Mode | Turn on/off the clean mode | | Dry Mode | Turn on/off the dry mode | -<div class='note'> +{% note %} Clean mode and Motor speed can only be set when the device is turned on. -</div> +{% endnote %} ### Air Humidifier CB (zhimi.humidifier.cb1) @@ -1194,57 +1192,57 @@ Clean mode and Motor speed can only be set when the device is turned on. | Child Lock | Turn on/off the Child Lock | | Ionizer | Turn on/off the Ionizer | -### Platform Services +### Actions -### Service `humidifier.set_humidity` +### Action `humidifier.set_humidity` Set the target humidity. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO humidifier entity. | | `humidity` | no | Target humidity | -### Service `humidifier.set_mode` +### Action `humidifier.set_mode` Set the humidifier operation mode. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO humidifier entity. | | `mode` | no | The Xiaomi miIO operation mode | -### Service `fan.set_percentage` +### Action `fan.set_percentage` Set the fan speed percentage. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | | `percentage` | no | Fan speed. Percentage speed setting | -### Service `fan.set_preset_mode` +### Action `fan.set_preset_mode` Set the fan operation mode. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | | `preset_mode` | no | The Xiaomi miIO operation mode | -### Service `xiaomi_miio.fan_reset_filter` (Air Purifier 2 only) +### Action `xiaomi_miio.fan_reset_filter` (Air Purifier 2 only) Reset the filter lifetime and usage. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | -### Service `xiaomi_miio.fan_set_extra_features` (Air Purifier only) +### Action `xiaomi_miio.fan_set_extra_features` (Air Purifier only) Set the extra features. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO fan entity. | | `features` | no | Integer, known values are 0 and 1. | @@ -1426,9 +1424,9 @@ Note there are at least 4 versions of the Xiaomi IR Remote (ChuangmiIr) which ca For now, pronto hex codes only work on the first version (`chuangmi.ir.v2`). -### Platform Services +### Actions -The Xiaomi IR Remote Platform registers four services. +The Xiaomi IR Remote Platform registers four actions. ### `remote.send_command` @@ -1456,7 +1454,7 @@ Used to turn remote's blue LED off. The `xiaomi_miio` vacuum platform allows you to control the state of your [Xiaomi Mi Robot Vacuum](https://www.mi.com/roomrobot/). -Currently supported services are: +Currently supported actions are: - `start` - `pause` @@ -1471,9 +1469,9 @@ Currently supported services are: - `xiaomi_goto` - `remote_control_*` (of your robot) -### Platform Services +### Actions -In addition to all of the services provided by the `vacuum` {% term integration %} (`start`, `pause`, `stop`, `return_to_base`, `locate`, `set_fan_speed` and `send_command`), the `xiaomi_miio` platform introduces specific services to access the remote control mode of the robot. These are: +In addition to all of the actions provided by the `vacuum` {% term integration %} (`start`, `pause`, `stop`, `return_to_base`, `locate`, `set_fan_speed` and `send_command`), the `xiaomi_miio` platform introduces specific actions to access the remote control mode of the robot. These are: - `xiaomi_miio.vacuum_clean_zone` - `xiaomi_miio.vacuum_clean_segment` @@ -1483,11 +1481,11 @@ In addition to all of the services provided by the `vacuum` {% term integration - `xiaomi_miio.vacuum_remote_control_move` - `xiaomi_miio.vacuum_remote_control_move_step` -### Service `xiaomi_miio.vacuum_clean_zone` +### Action `xiaomi_miio.vacuum_clean_zone` Start the cleaning operation in the areas selected for the number of repeats indicated. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Only act on a specific robot | | `zone` | no | List of zones. Each zone is an array of four integer values. These values represent two sets of x- and y-axis coordinates that describe the beginning and ending points of a square or rectangle cleaning zone. For example, `[[23510,25311,25110,26361]]` creates a box that starts in one corner at the 23510, 25311 (x- and y-axis) coordinates and then is expanded diagonally to the 25110, 26361 coordinates to create a rectangular cleaning zone. | @@ -1565,11 +1563,11 @@ automation: - 26496 ``` -### Service `xiaomi_miio.vacuum_clean_segment` +### Action `xiaomi_miio.vacuum_clean_segment` Clean the specified segment/room. A room is identified by a number. Instructions on how to find the valid room numbers and determine what rooms they map to, read the section [Retrieving room numbers](#retrieving-room-numbers). -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------- | | `entity_id` | no | Only act on a specific robot | | `segments` | no | List of segment numbers or one single segment number. | @@ -1626,50 +1624,50 @@ automation: segments: [1, 1] ``` -### Service `xiaomi_miio.vacuum_goto` +### Action `xiaomi_miio.vacuum_goto` Go the specified coordinates. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------- | | `entity_id` | no | Only act on a specific robot | | `x_coord` | no | X-coordinate, integer value. The dock is located at x-coordinate 25500. | | `y_coord` | no | Y-coordinate, integer value. The dock is located at y-coordinate 25500. | -Note: If your vacuum is in motion and does not respond to the `xiaomi_miio.vacuum_goto` command, call the `vacuum.pause` or `vacuum.stop` service first. +Note: If your vacuum is in motion and does not respond to the `xiaomi_miio.vacuum_goto` command, call the `vacuum.pause` or `vacuum.stop` action first. -### Service `xiaomi_miio.vacuum_remote_control_start` +### Action `xiaomi_miio.vacuum_remote_control_start` Start the remote control mode of the robot. You can then move it with `remote_control_move`; when done, call `remote_control_stop`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------- | | `entity_id` | no | Only act on a specific robot | -### Service `xiaomi_miio.vacuum_remote_control_stop` +### Action `xiaomi_miio.vacuum_remote_control_stop` Exit the remote control mode of the robot. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------- | | `entity_id` | no | Only act on a specific robot | -### Service `xiaomi_miio.vacuum_remote_control_move` +### Action `xiaomi_miio.vacuum_remote_control_move` Remote control the robot. Please ensure you first set it in remote control mode with `remote_control_start`. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------- | | `entity_id` | no | Only act on a specific robot | | `velocity` | no | Speed: between -0.29 and 0.29 | | `rotation` | no | Rotation: between -179 degrees and 179 degrees | | `duration` | no | The number of milliseconds that the robot should move for | -### Service `xiaomi_miio.vacuum_remote_control_move_step` +### Action `xiaomi_miio.vacuum_remote_control_move_step` Enter remote control mode, make one move, stop, and exit remote control mode. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | --------------------------------------------------------- | | `entity_id` | no | Only act on a specific robot | | `velocity` | no | Speed: between -0.29 and 0.29 | @@ -1728,10 +1726,10 @@ Water Shortage\*\*: {% endconfiguration_basic %} -<div class="note"> -* Needs to be manually enabled once the {% term integration %} has been added. <br> -** Only enabled if the vacuum has a mop. -</div> +{% note %} +\* Needs to be manually enabled once the {% term integration %} has been added. <br> +\*\* Only enabled if the vacuum has a mop. +{% endnote %} ### Attributes @@ -1819,7 +1817,7 @@ miiocli roborockvacuum --ip <ip of the vacuum> --token <your vacuum token> get_r ``` It will return the full mapping of room numbers to user-defined names as a list of (number,name) tuples. -Alternatively, one can just test the clean_segment service with a number and see which room it cleans. +Alternatively, one can just test the `clean_segment` action with a number and see which room it cleans. It seems to be the case that Numbers 1..15 are used to number the initial segmentation done by the vacuum cleaner itself. Numbers 16 and upwards numbers rooms from the users manual editing. @@ -1911,71 +1909,71 @@ Supported models: `philips.light.moonlight` - brand_sleep - brand -### Platform Services +### Actions -### Service `xiaomi_miio.light_set_scene` +### Action `xiaomi_miio.light_set_scene` Set one of the 4 available fixed scenes. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | | `scene` | no | Scene, between 1 and 4. | -### Service `xiaomi_miio.light_set_delayed_turn_off` +### Action `xiaomi_miio.light_set_delayed_turn_off` Delayed turn off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | | `time_period` | no | Time period for the delayed turn off. | -### Service `xiaomi_miio.light_reminder_on` (Eyecare Smart Lamp 2 only) +### Action `xiaomi_miio.light_reminder_on` (Eyecare Smart Lamp 2 only) Enable the eye fatigue reminder/notification. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | -### Service `xiaomi_miio.light_reminder_off` (Eyecare Smart Lamp 2 only) +### Action `xiaomi_miio.light_reminder_off` (Eyecare Smart Lamp 2 only) Disable the eye fatigue reminder/notification. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | -### Service `xiaomi_miio.light_night_light_mode_on` (Eyecare Smart Lamp 2 only) +### Action `xiaomi_miio.light_night_light_mode_on` (Eyecare Smart Lamp 2 only) Turn the smart night light mode on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | -### Service `xiaomi_miio.light_night_light_mode_off` (Eyecare Smart Lamp 2 only) +### Action `xiaomi_miio.light_night_light_mode_off` (Eyecare Smart Lamp 2 only) Turn the smart night light mode off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | -### Service `xiaomi_miio.light_eyecare_mode_on` (Eyecare Smart Lamp 2 only) +### Action `xiaomi_miio.light_eyecare_mode_on` (Eyecare Smart Lamp 2 only) Turn the eyecare mode on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | -### Service `xiaomi_miio.light_eyecare_mode_off` (Eyecare Smart Lamp 2 only) +### Action `xiaomi_miio.light_eyecare_mode_off` (Eyecare Smart Lamp 2 only) Turn the eyecare mode off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------ | | `entity_id` | no | Only act on a specific Xiaomi miIO light entity. | @@ -2025,38 +2023,38 @@ Supported models: `lumi.acpartner.v3` (the socket of the `acpartner.v1` and `v2` - Attributes - Load power -### Platform Services +### Actions -### Service `xiaomi_miio.switch_set_wifi_led_on` (Power Strip only) +### Action `xiaomi_miio.switch_set_wifi_led_on` (Power Strip only) Turn the wifi LED on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | -### Service `xiaomi_miio.switch_set_wifi_led_off` (Power Strip only) +### Action `xiaomi_miio.switch_set_wifi_led_off` (Power Strip only) Turn the wifi LED off. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | -### Service `xiaomi_miio.switch_set_power_price` (Power Strip) +### Action `xiaomi_miio.switch_set_power_price` (Power Strip) Set the power price. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | | `price` | no | Power price, between 0 and 999. | -### Service `xiaomi_miio.switch_set_power_mode` (Power Strip V1 only) +### Action `xiaomi_miio.switch_set_power_mode` (Power Strip V1 only) Set the power mode. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------- | | `entity_id` | no | Only act on a specific Xiaomi miIO switch entity. | | `mode` | no | Power mode, valid values are 'normal' and 'green' | @@ -2107,7 +2105,7 @@ If you are on a Windows or macOS device, you can use the [Get MiHome devices tok ### Alternative methods -<div class='note'> +{% note %} If using an Android device to retrieve the Access Token only `v5.4.49` of Mi Home is confirmed working (December 2019). Use `v5.4.49` of Mi Home locate a text file under the `Smarthome/logs` folder where the 32 character token is stored. There will likely be several text files in this directory, search all of them for the word 'token' and you should find it there. Be advised that the latest version of Mi Home does not store the token in clear text. <br/> <br/> @@ -2119,7 +2117,7 @@ These instructions are written for the Mi Home app - not for the new RoboRock ap <br/> <br/> This token (32 hexadecimal characters) is required for the Xiaomi Mi Robot Vacuum, Mi Robot 2 (Roborock) Vacuum, Xiaomi Philips Lights and Xiaomi IR Remote. -</div> +{% endnote %} ### Android (not rooted) diff --git a/source/_integrations/xiaomi_tv.markdown b/source/_integrations/xiaomi_tv.markdown index c2ce0557419c..cdcb1a5f619e 100644 --- a/source/_integrations/xiaomi_tv.markdown +++ b/source/_integrations/xiaomi_tv.markdown @@ -30,9 +30,9 @@ media_player: - platform: xiaomi_tv ``` -<div class='note warning'> +{% important %} When starting or restarting Home Assistant make sure your TV is off. This is a flaw in the TV itself. -</div> +{% endimportant %} {% configuration %} host: @@ -58,6 +58,6 @@ media_player: name: YOUR_TV_NAME ``` -<div class='note info'> +{% note %} The platform will never turn your TV off. Instead, it will be put to sleep and woken up. This can be useful, because the selected source of the TV will remain the same. It will essentially turn your TV into a dumb TV. -</div> +{% endnote %} diff --git a/source/_integrations/xmpp.markdown b/source/_integrations/xmpp.markdown index d0c56ce2f034..555f5dde5db3 100644 --- a/source/_integrations/xmpp.markdown +++ b/source/_integrations/xmpp.markdown @@ -38,7 +38,7 @@ notify: {% configuration %} name: - description: "Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the service `notify.NOTIFIER_NAME`." + description: "Setting the optional parameter `name` allows multiple notifiers to be created. The default value is `notify`. The notifier will bind to the `notify.NOTIFIER_NAME` action." required: false type: string default: notify @@ -75,13 +75,10 @@ room: type: string {% endconfiguration %} -<div class='note'> - - Pre Home Assistant 0.81 `sleekxmpp` was used to connect to XMPP servers. `sleekxmpp` as of version 1.3.2, does not support > TLS v1. If you are running your own XMPP server (e.g., Prosody, ejabberd) make sure to allow using TLS v1. - - Home Assistant after 0.81 uses `slixmpp`, which also supports TLS v1.1 and TLS v1.2. - -</div> +{% note %} +Pre Home Assistant 0.81 `sleekxmpp` was used to connect to XMPP servers. `sleekxmpp` as of version 1.3.2, does not support > TLS v1. If you are running your own XMPP server (e.g., Prosody, ejabberd) make sure to allow using TLS v1. +Home Assistant after 0.81 uses `slixmpp`, which also supports TLS v1.1 and TLS v1.2. +{% endnote %} All Jabber IDs (JID) must include the domain. Make sure that the password matches the account provided as sender. @@ -110,13 +107,11 @@ Number 1 shows a classical, text-only message. The Title is optional, although i You can send images or files from locally stored files or remote web locations via Jabber's HTTP Upload feature. To send files and images, your jabber server must support [XEP_0363](https://xmpp.org/extensions/xep-0363.html). -<div class='note'> - +{% note %} Be aware that images are uploaded onto the Jabber server of your provider. They reside there un-encrypted and could be accessed by the server admins. Usually images are deleted after a few days.<br> <br> Home Assistant supports TLS encryption to ensure transport encryption. TLS is enforced by default. You can disable it with the [`tls`](#tls) flag -- which is not recommended. - -</div> +{% endnote %} Number 2 sends only an image, retrieved from the URL. The TLS connection to get the image is also not verified (use with caution). diff --git a/source/_integrations/xs1.markdown b/source/_integrations/xs1.markdown index f4109033faa6..acac7ed0caa2 100644 --- a/source/_integrations/xs1.markdown +++ b/source/_integrations/xs1.markdown @@ -61,17 +61,17 @@ password: ## Supported device types -<div class='note warning'> +{% note %} This {% term integration %} currently only covers part of the device types supported by the XS1 gateway, unsupported types are simply ignored. -</div> +{% endnote %} ### Sensors Any type of sensor is supported. -<div class='note warning'> +{% note %} If you are using climate devices the "current temp" sensor will be automatically used by the actuator (if named correctly). To make this work have a look at the actuator description below. -</div> +{% endnote %} ### Actuators diff --git a/source/_integrations/yale_smart_alarm.markdown b/source/_integrations/yale_smart_alarm.markdown index 262eb62a20d1..5529cb6603e4 100644 --- a/source/_integrations/yale_smart_alarm.markdown +++ b/source/_integrations/yale_smart_alarm.markdown @@ -37,7 +37,7 @@ There is currently support for the following device types within Home Assistant: ## Alarm control panel -Services provided are `armed_away`, `armed_home`, and `disarmed`. +Actions provided are `armed_away`, `armed_home`, and `disarmed`. No code is required to operate the alarm. diff --git a/source/_integrations/yalexs_ble.markdown b/source/_integrations/yalexs_ble.markdown index 9f3e212e1674..f07016c40b16 100644 --- a/source/_integrations/yalexs_ble.markdown +++ b/source/_integrations/yalexs_ble.markdown @@ -61,7 +61,7 @@ Some locks only send push updates when they have an active HomeKit pairing. If y One easy way to fix this is to create a new/second home in the Apple Home app and add the lock to that new home. Push updates should occur as intended after the lock is added. -Alternatively, call the `homeassistant.update_entity` service to force the {% term integration %} to update the lock state, or enable the always connected option. +Alternatively, call the `homeassistant.update_entity` action to force the {% term integration %} to update the lock state, or enable the always connected option. {% include integrations/option_flow.md %} @@ -94,13 +94,13 @@ The iOS app will only save the offline key to your device's filesystem if Auto-U The Android app will only save the offline key to your device's filesystem if Auto-Unlock has been enabled and used at least once. Auto-Unlock can be disabled once the key has been loaded. -Root access is required to read the `key` and `slot` stored in `/data/data/com.august.luna/shared_prefs/PeripheralInfoCache.xml` +Root access is required to copy the `ModelDatabase.db` from `/data/data/com.august.bennu/databases`. Once copied, you can use [DB Browser for SQLite](https://sqlitebrowser.org/) to open the `ModelDatabase.db`, navigate to the table `LockData` and find the column `offlineKeys`. There, you will find a JSON that includes the `key` and `slot` properties. ### Android - Yale Home The Android app will only save the offline key to your device's filesystem if Auto-Unlock has been enabled and used at least once. Auto-Unlock can be disabled once the key has been loaded. -Root access is required to copy the `ModelDatabase.sql` from `/data/data/com.assaabloy.yale/databases`. Once copied, you can use [DB Broser for SQLite](https://sqlitebrowser.org/) to open the `ModelDatabase.sql`, navigate to the table `LockData` and find the column `offlineKeys`.There, you will find a JSON that includes the `key` and `slot` properties. +Root access is required to copy the `ModelDatabase.sql` from `/data/data/com.assaabloy.yale/databases`. Once copied, you can use [DB Browser for SQLite](https://sqlitebrowser.org/) to open the `ModelDatabase.sql`, navigate to the table `LockData` and find the column `offlineKeys`. There, you will find a JSON that includes the `key` and `slot` properties. ## Troubleshooting diff --git a/source/_integrations/yamaha.markdown b/source/_integrations/yamaha.markdown index d184c62eddbf..f7761731c1f4 100644 --- a/source/_integrations/yamaha.markdown +++ b/source/_integrations/yamaha.markdown @@ -70,7 +70,7 @@ zone_names: - Media players created by Yamaha support powering on/off, mute, volume control and source selection. Playback controls, for instance play and stop are available for sources that supports it. -- The `play_media` service is implemented for `NET RADIO` source +- The `play_media` action is implemented for `NET RADIO` source only. The `media_id` is a `>` separated string of the menu path on the vtuner service. For instance `Bookmarks>Internet>WAMC 90.3 FM`. MusicCast devices use the path `Radio>Favorites>WAMC 90.3 FM`. @@ -127,30 +127,30 @@ script: ``` -### Service `enable_output` +### Action `enable_output` Enable or disable an output port (HDMI) on the receiver. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ------------------------------------------------------------------------- | | `entity_id` | yes | String or list of strings that point at `entity_id`s of Yamaha receivers. | | `port` | no | Port to enable or disable, e.g., `hdmi1`. | | `enabled` | no | To enable set true, otherwise set to false. | -### Service `menu_cursor` +### Action `menu_cursor` Control the menu cursor. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------- | | `entity_id` | yes | String or list of strings that point at `entity_id`s of Yamaha receivers. | | `cursor` | no | Name of the cursor key to press: `up`, `down`, `left`, `right`, `select`, `return` | -### Service `select_scene` +### Action `select_scene` Select a scene on the receiver. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------- | | `entity_id` | yes | String or list of strings that point at `entity_id`s of Yamaha receivers. | | `scene` | no | Scene to select, e.g., `BD/DVD Movie Viewing`, `TV Viewing`, `NET Audio Listening` or `Radio Listening`. | diff --git a/source/_integrations/yamaha_musiccast.markdown b/source/_integrations/yamaha_musiccast.markdown index 796363c7516c..3a9832899308 100644 --- a/source/_integrations/yamaha_musiccast.markdown +++ b/source/_integrations/yamaha_musiccast.markdown @@ -27,20 +27,20 @@ Supported devices are listed on their [site](https://usa.yamaha.com/products/con ## Grouping functionality -The Yamaha MusicCast {% term integration %} implements the grouping services. There are some limitations in the MusicCast system for grouping: +The Yamaha MusicCast {% term integration %} implements the grouping actions. There are some limitations in the MusicCast system for grouping: - It is not possible to let mediaplayer entities of the same device (e.g., different zones) be in distinct groups. - If a non-main zone is the master of a group, it is not possible to let other mediaplayers of the same device join this group. ## Play media functionality -The MusicCast {% term integration %} supports the Home Assistant media browser for all streaming services, your device supports. For services such as Deezer, you have to log in using the official MusicCast app. In addition, local HTTP URLs can be played back using this service. This includes the Home Assistant text-to-speech services. +The MusicCast {% term integration %} supports the Home Assistant media browser for all streaming services, your device supports. For services such as Deezer, you have to log in using the official MusicCast app. In addition, local HTTP URLs can be played back using this action. This includes the Home Assistant text-to-speech actions. -It is also possible to recall NetUSB presets using the play media service. To do so "presets:<preset_num>" has to be used as `media_content_id` in the service call. +It is also possible to recall NetUSB presets using the play media action. To do so "presets:<preset_num>" has to be used as `media_content_id` in the action. ### Examples: -This is an example service call that plays an audio file from a web server on the local network (like the Home Assistant built-in webserver): +This is an example action that plays an audio file from a web server on the local network (like the Home Assistant built-in webserver): ```yaml service: media_player.play_media diff --git a/source/_integrations/yandextts.markdown b/source/_integrations/yandextts.markdown index 2d6d2066f2f0..964742b394a9 100644 --- a/source/_integrations/yandextts.markdown +++ b/source/_integrations/yandextts.markdown @@ -16,9 +16,9 @@ related: The `yandextts` text-to-speech {% term integration %} uses [Yandex SpeechKit](https://tech.yandex.com/speechkit/) text-to-speech engine to read a text with natural sounding voices. -<div class='note warning'> +{% important %} This integration is working only with old API keys. For the new API keys, this integration cannot be used. -</div> +{% endimportant %} ## Configuration diff --git a/source/_integrations/yardian.markdown b/source/_integrations/yardian.markdown index 5e227b1fc4f3..86a353e0769a 100644 --- a/source/_integrations/yardian.markdown +++ b/source/_integrations/yardian.markdown @@ -27,13 +27,13 @@ During the configuration, you will have to manually set the **Host** and the **A ![Yardian Host/Token Location](/images/integrations/yardian/yardian_config_flow.jpg) -## Services +## Actions ### yardian.start_irrigation -Start a zone for a given number of minutes. This service accepts an Yardian Zone switch {% term entity %} and allows a given duration. +Start a zone for a given number of minutes. This action accepts an Yardian Zone switch {% term entity %} and allows a given duration. -| Service Data Attribute | Optional | Description | +| Data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------- | | `entity_id` | yes | The Yardian Zone switch to turn on. | | `duration` | no | Number of minutes for this zone to be turned on. | diff --git a/source/_integrations/yeelight.markdown b/source/_integrations/yeelight.markdown index 381ca2440e57..fb7caebfde6d 100644 --- a/source/_integrations/yeelight.markdown +++ b/source/_integrations/yeelight.markdown @@ -33,7 +33,7 @@ There is support for the following device types within Home Assistant: ### Custom effects -Custom effects can only be set up through YAML configuration. To turn on the effect you can use [light.turn_on](/integrations/light/#service-lightturn_on) service. +Custom effects can only be set up through YAML configuration. To turn on the effect you can use [light.turn_on](/integrations/light/#action-lightturn_on) action. Possible transitions are `RGBTransition`, `HSVTransition`, `TemperatureTransition`, `SleepTransition`. @@ -156,7 +156,7 @@ Per default, the bulb limits the number of requests per minute to 60, a limitati ### Initial setup -<div class='note'> +{% important %} Before trying to control your light through Home Assistant, you have to set up your bulb using the Yeelight app. ( [Android](https://play.google.com/store/apps/details?id=com.yeelight.cherry&hl=fr), [IOS](https://itunes.apple.com/us/app/yeelight/id977125608?mt=8) ). In the bulb property, you have to enable "LAN Control" (previously called "Developer mode"). LAN Control may only be available with the latest firmware installed on your bulb. Firmware can be updated in the application after connecting the bulb. @@ -165,13 +165,13 @@ Currently, there is no official way to change LAN mode. However, some methods mi - [Desktop app](https://community.home-assistant.io/t/the-easiest-method-to-enable-lan-developer-mode-on-xiaomi-bulb/727360) - CLI using the python-miio library: [1](https://community.home-assistant.io/t/integrate-mi-smart-led-bulb-easy-steps/312174), [2](https://community.home-assistant.io/t/integrate-mi-smart-led-bulb-warm-white-xmbgdp01ylk/290404) -</div> +{% endimportant %} ### Supported models -<div class='note warning'> +{% note %} This {% term integration %} is tested to work with the following models. If you have a different model and it is working, please let us know. -</div> +{% endnote %} | Model ID | Model number | Product name | |------------|--------------|--------------------------------------------------| @@ -210,84 +210,84 @@ This {% term integration %} is tested to work with the following models. If you | ?, may be `ceilb` | YLXD013-C | Yeelight Arwen Ceiling Light 550C | | `ceilb` | YLXD013 | Yeelight Arwen Ceiling Light 450S | -## Services +## Actions -### Service `yeelight.set_mode` +### Action `yeelight.set_mode` Set an operation mode. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------------------------------------------| | `entity_id` | yes | Only act on specific lights. | | `mode` | no | Operation mode. Valid values are 'last', 'normal', 'rgb', 'hsv', 'color_flow', 'moonlight'. | -### Service `yeelight.start_flow` +### Action `yeelight.start_flow` Start flow with specified transitions -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------------------------------------------| | `entity_id` | yes | Only act on specific lights. | | `count` | yes | The number of times to run this flow (0 to run forever). | | `action` | yes | The action to take after the flow stops. Can be 'recover', 'stay', 'off'. Default 'recover' | | `transitions` | no | Array of transitions. See [custom effects](#custom-effects). | -### Service `yeelight.set_color_scene` +### Action `yeelight.set_color_scene` Changes the light to the specified RGB color and brightness. If the light is off, it will be turned on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------------------------------------------| | `entity_id` | yes | Only act on specific lights. | | `rgb_color` | no | A list containing three integers between 0 and 255 representing the RGB color you want the light to be. Three comma-separated integers that represent the color in RGB, within square brackets.| | `brightness` | no | The brightness value to set (1-100). | -### Service `yeelight.set_hsv_scene` +### Action `yeelight.set_hsv_scene` Changes the light to the specified HSV color and brightness. If the light is off, it will be turned on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------------------------------------------| | `entity_id` | yes | Only act on specific lights. | | `hs_color` | no | A list containing two floats representing the hue and saturation of the color you want the light to be. Hue is scaled 0-360, and saturation is scaled 0-100. | | `brightness` | no | The brightness value to set (1-100). | -### Service `yeelight.set_color_temp_scene` +### Action `yeelight.set_color_temp_scene` Changes the light to the specified color temperature. If the light is off, it will be turned on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------------------------------------------| | `entity_id` | yes | Only act on specific lights. | | `kelvin` | no | Color temperature in Kelvin. | | `brightness` | no | The brightness value to set (1-100). | -### Service `yeelight.set_color_flow_scene` +### Action `yeelight.set_color_flow_scene` -Starts a color flow. Difference between this and [yeelight.start_flow](#service-yeelightstart_flow), this service call uses different a Yeelight API call. If the light was off, it will be turned on. There might be some firmware differences in handling complex flows, etc. +Starts a color flow. Difference between this and [yeelight.start_flow](#action-yeelightstart_flow), this action uses different a Yeelight API call. If the light was off, it will be turned on. There might be some firmware differences in handling complex flows, etc. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------------------------------------------| | `entity_id` | yes | Only act on specific lights. | | `count` | yes | The number of times to run this flow (0 to run forever). | | `action` | yes | The action to take after the flow stops. Can be 'recover', 'stay', 'off'. Default 'recover' | | `transitions` | no | Array of transitions. See [custom effects](#custom-effects). | -### Service `yeelight.set_auto_delay_off_scene` +### Action `yeelight.set_auto_delay_off_scene` Turns the light on to the specified brightness and sets a timer to turn it back off after the given number of minutes. If the light is off, it will be turned on. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------------------------------------------| | `entity_id` | yes | Only act on specific lights. | | `minutes` | no | The minutes to wait before automatically turning the light off. | | `brightness` | no | The brightness value to set (1-100). | -### Service `yeelight.set_music_mode` +### Action `yeelight.set_music_mode` Enable or disable music_mode. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | |---------------------------|----------|---------------------------------------------------------------------------------------------| | `entity_id` | yes | Only act on specific lights. | | `music_mode` | no | Use 'true' or 'false' to enable / disable music_mode. | diff --git a/source/_integrations/yeelightsunflower.markdown b/source/_integrations/yeelightsunflower.markdown index f372a993488a..5ffbbad3af4c 100644 --- a/source/_integrations/yeelightsunflower.markdown +++ b/source/_integrations/yeelightsunflower.markdown @@ -18,9 +18,9 @@ related: The `yeelightsunflower` {% term integration %} allows you to control your Yeelight Sunflower light bulbs with Home Assistant. -<div class='note warning'> +{% note %} The "Yeelight Sunflower" bulbs are not the same as the "Yeelight WiFi" bulbs. -</div> +{% endnote %} To enable your lights, add the following lines to your {% term "`configuration.yaml`" %} file. {% include integrations/restart_ha_after_config_inclusion.md %} @@ -39,6 +39,6 @@ host: type: string {% endconfiguration %} -<div class='note'> +{% note %} When the hub is loaded, your lights will appear as devices with their Zigbee IDs as part of the entity name. -</div> +{% endnote %} diff --git a/source/_integrations/yi.markdown b/source/_integrations/yi.markdown index 74542d108b55..b8225a874ee8 100644 --- a/source/_integrations/yi.markdown +++ b/source/_integrations/yi.markdown @@ -31,27 +31,21 @@ If you have a 2019/2020 version camera use [yi-hack-MStar GitHub project](https: Once installed, please ensure that you have enabled FTP and Telnet on your device. -<div class='note warning'> - +{% important %} Currently, version 0.1.4-beta2 of the custom firmware is the highest supported without having to make additional modifications. Firmwares higher than this version use [Pure-FTPd](https://www.pureftpd.org/project/pure-ftpd), which has a bug that prevents FFmpeg from correctly rendering video files. To use higher firmware versions you must also follow [this workaround](https://github.com/shadow-1/yi-hack-v3/issues/129#issuecomment-361723075) to revert back to ftpd. +{% endimportant %} -</div> - -<div class='note warning'> - +{% tip %} If you use a version higher than 0.1.4-beta2, you can simply solve the FTP issue by creating a symlink to `/tmp` in the `/home/yi-hack-v4` directory (the directory name can be different depending on the version which you use). For example, access the Yi camera via SSH and type command: `ln -s /tmp tmp`. +{% endtip %} -</div> - -<div class='note warning'> -Raspbian users: don't forget to install ffmpeg support on your platform, otherwise, you'll not see video. -</div> - -<div class='note warning'> +{% important %} +Raspbian users: don't forget to install FFmpeg support on your platform, otherwise, you'll not see video. +{% endimportant %} +{% tip %} Some alternative Yi firmwares enable an experimental RTSP server, which will allow you to connect to your camera via other Home Assistant camera platforms. However, this RTSP server disables the ability to use the supremely-useful Yi Home app. In order to maintain both Home Assistant compatibility _and_ the native app, this platform retrieves videos via FTP. - -</div> +{% endtip %} ### Changing the FTP password diff --git a/source/_integrations/yolink.markdown b/source/_integrations/yolink.markdown index e84ad1c4a671..8db515e50c3b 100644 --- a/source/_integrations/yolink.markdown +++ b/source/_integrations/yolink.markdown @@ -37,16 +37,16 @@ Integrates [YoLink](https://www.yosmart.com/) Devices into Home Assistant. {% details "Using custom application credentials" %} Home Assistant will use account linking provided by Nabu Casa for authenticating with YoLink, this service is provided for free and does not require a Nabu Casa subscription. The steps below are thus not required. -If you want to use separate credentials, please contact <service@yosmart.com> to obtain a `client_id` and `client_secret`. Then you can add your credentials via application credentials. Settings > Devices & Services > click the menu (three dots at the top right of the screen) and then **Application Credentials**. Enter your credentials in the pop-up window. +If you want to use separate credentials, please contact <service@yosmart.com> to obtain a `client_id` and `client_secret`. Then you can add your credentials via application credentials. Settings > Devices & services > click the menu (three dots at the top right of the screen) and then **Application Credentials**. Enter your credentials in the pop-up window. {% enddetails %} -## Services +## Actions ### `Play on SpeakerHub` -With this service, you can convert text to speech for playback on SpeakerHub. +With this action, you can convert text to speech for playback on SpeakerHub. -Service data attribute | Optional | Description +Data attribute | Optional | Description -|-|- `target_device` | no| SpeakerHub device ID for audio playback. `message` | no| Text for speech conversion. @@ -108,3 +108,4 @@ The integration is tested and verified for the following devices from YoLink: - YS5006-UC (FlowSmart Control) - YS5007-UC (FlowSmart Meter) - YS5008-UC (FlowSmart All-in-One) +- YS8017-UC (Thermometer) diff --git a/source/_integrations/zabbix.markdown b/source/_integrations/zabbix.markdown index fe5ef0103791..5a6b2bf3b3f7 100644 --- a/source/_integrations/zabbix.markdown +++ b/source/_integrations/zabbix.markdown @@ -144,9 +144,9 @@ zabbix: The `zabbix` sensor platform let you monitor the current count of active triggers for your [Zabbix](https://www.zabbix.com/) monitoring instance. -<div class='note'> +{% important %} You must have the <a href="#configuration">Zabbix integration</a> configured to use those sensors. -</div> +{% endimportant %} To set it up, add the following information to your {% term "`configuration.yaml`" %} file: diff --git a/source/_integrations/zamg.markdown b/source/_integrations/zamg.markdown index 421903af56b8..aab75757c850 100644 --- a/source/_integrations/zamg.markdown +++ b/source/_integrations/zamg.markdown @@ -48,6 +48,6 @@ This integration provides the following sensors: |Precipitation|Precipitation in mm| |Snow|Snow in cm| -<div class='note'> +{% note %} Not every station supports every sensor. -</div> +{% endnote %} diff --git a/source/_integrations/zeversolar.markdown b/source/_integrations/zeversolar.markdown index 8a8ca34b17f3..9bb135cfd0db 100644 --- a/source/_integrations/zeversolar.markdown +++ b/source/_integrations/zeversolar.markdown @@ -7,6 +7,7 @@ ha_release: 2023.2 ha_iot_class: Local Polling ha_domain: zeversolar ha_platforms: + - diagnostics - sensor ha_config_flow: true ha_integration_type: device diff --git a/source/_integrations/zha.markdown b/source/_integrations/zha.markdown index a66bbe450caf..886a8e4f1e72 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -133,14 +133,15 @@ Some other Zigbee coordinator hardware may not support a firmware that is capabl - [ZiGate-Ethernet (Ethernet gateway board for PiZiGate)](https://zigate.fr/produit/zigate-ethernet/) - [ZiGate + WiFi Pack](https://zigate.fr/produit/zigatev2-pack-wifi/) -#### Warning about Wi-Fi-based Zigbee-to-Serial bridges/gateways +#### Warning about using Zigbee Coordinator over Wi-Fi/WAN/VPN -<div class="note warning"> +{% caution %} +Be aware that using a Zigbee Coordinator via a Serial-Proxy-Server (also known as Serial-to-IP bridge or Ser2Net remote adapter) over a Wi-Fi, WAN, or VPN connection is not recommended. -The **EZSP** protocol requires a stable connection to the serial port. With _ITEAD Sonoff ZBBridge_ connecting over the WiFi network -it is expected to see `NCP entered failed state. Requesting APP controller restart` in the logs. This is a normal part of the operation and indicates there was a drop in communication between ZHA and Sonoff bridge. +Serial protocols used by the Zigbee Coordinator do not have enough robustness, resilience, or fault tolerance to handle packet loss and latency delays that can occur over unstable connections. -</div> +A Zigbee Coordinator requires a stable local connection to its serial port interface with no drops in communication between it and the Zigbee gateway application running on the host computer. +{% endcaution %} ## Configuration - GUI @@ -214,6 +215,7 @@ Some devices can be auto-discovered, which can simplify the ZHA setup process. T | [XZG - Universal Firmware for Zigbee Gateway](https://xzg.xyzroe.cc/) | Zeroconf | xzg.local. | | [SMLIGHT SLZB-06 POE Zigbee LAN WiFi USB Adapter](https://smlight.tech/product/slzb-06/) | Zeroconf | slzb-06.local. | | [ZigStar UZG Universal Zigbee Gateway (UZG-01)](https://uzg.zig-star.com) | Zeroconf | uzg-01._tcp.local. | +| [cod.m Zigbee Coordinator](https://docs.codm.de/zigbee/coordinator/) | Zeroconf | czc._tcp.local. | | [ZigStar LAN/POE Coordinators](https://zig-star.com/projects/zigbee-gw-lan/) | Zeroconf | zigstargw.local. | | [Tube's CC2652P2 USB-powered Zigbee to Ethernet Serial Coordinator)](https://www.tubeszb.com/) | Zeroconf | tube_zb_gw_cc2652p2.local. | | [Tube's CC2652P2 PoE-powered Zigbee to Ethernet Serial Coordinator)](https://www.tubeszb.com/) | Zeroconf | tube_zb_gw_cc2652p2_poe.local. | @@ -221,6 +223,16 @@ Some devices can be auto-discovered, which can simplify the ZHA setup process. T Additional devices in the [Known working Zigbee radio modules](#known-working-zigbee-radio-modules) list may be discoverable, however, only devices that have been confirmed discoverable are listed above. +### OTA updates of Zigbee device firmware + +The ZHA integration has the ability to perform OTA (over-the-air) firmware updates of Zigbee devices. This feature is enabled by default. As it uses standard [Update](/integrations/update/) entities in Home Assistant, users will get a UI notification if and when an OTA firmware update is available for a specific device, with an option to initiate the update or ignore that specific update for the device. + +To see OTA updates for a device, it's required that it both supports OTA updates and that firmware images for the device are publicly provided by the manufacturer. For this reason, ZHA currently only includes OTA providers for a few manufacturers that provide these updates publicly. This includes IKEA, Inovelli, Ledvacnce/OSRAM, SALUS/Computime, Sonoff/iTead, and Third Reality. + +{% warning %} +Before updating a device, you should search for any disadvantages or if you even need to install an available update. Some firmware updates can break features you might use (e.g. group binding for IKEA devices). Some updates might also require changes to ZHA. In rare cases, you can even brick devices by installing a firmware update. +{% endwarning %} + ## Configuration - YAML For more advanced configuration, you can modify {% term "`configuration.yaml`" %} and restart Home Assistant @@ -241,46 +253,26 @@ custom_quirks_path: type: string {% endconfiguration %} -### OTA firmware updates +### Advanced OTA configuration -The ZHA {% term integration %} has the ability to automatically download and perform OTA (Over-The-Air) firmware updates of Zigbee devices if the OTA firmware provider source URL for updates is available. OTA firmware updating is set to disabled (`false`) in the configuration by default. +The default configuration for OTA firmware updates is chosen by ZHA developers, so normal users should not need to change any configuration. Most of the config options listed in the zigpy section are just meant for development or advanced users. -Online OTA providers for firmware updates are currently only available for IKEA, LEDVANCE/OSRAM, SALUS/Computime, and INOVELLI devices. Support for OTA updates from other manufacturers could be supported in the future if they publish their firmware images publicly. +Further advanced configuration options are only provided in the [zigpy project's developers documentation](https://github.com/zigpy/zigpy). -To enable OTA firmware updates for the ZHA {% term integration %} you need to add the following configuration to your {% term "`configuration.yaml`" %} and restart Home Assistant: +However, if you want to disable OTA updates for a specific manufacturer, you can add the following lines to your `configuration.yaml` and restart Home Assistant. ```yaml zha: zigpy_config: ota: - ikea_provider: true # Auto update Trådfri devices - ledvance_provider: true # Auto update LEDVANCE/OSRAM devices - salus_provider: true # Auto update SALUS/Computime devices - inovelli_provider: true # Auto update INOVELLI devices - thirdreality_provider: true # Auto update 3REALITY devices - #otau_directory: /path/to/your/ota/folder # Utilize .ota files to update everything else + ikea_provider: false # Disable OTA update downloads for Trådfri devices + inovelli_provider: false # Disable OTA update downloads for INOVELLI devices + ledvance_provider: false # Disable OTA update downloads for LEDVANCE/OSRAM devices + salus_provider: false # Disable OTA update downloads for SALUS/Computime devices + sonoff_provider: false # Disable OTA update downloads for Sonoff (ITead) devices + thirdreality_provider: false # Disable OTA update downloads for 3REALITY devices ``` -You can choose if the IKEA, LEDVANCE, SALUS, INOVELLI or THIRDREALITY provider should be set to enabled (`true`) or disabled (`false`) individually. After the OTA firmware upgrades are finished, you can set these to `false` again if you do not want ZHA to automatically download and perform OTA firmware upgrades in the future. - -Note that the `otau_directory` setting is optional and can be used for any firmware files you have downloaded yourself, for any device type and manufacturer. For example, Philips Hue firmwares manually downloaded from [here](https://github.com/Koenkk/zigbee-OTA/blob/master/index.json) and/or [here](https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/OTA-Image-Types---Firmware-versions) added to the `otau_directory` can be flashed, although a manual `zha.issue_zigbee_cluster_command` command currently (as of 2021.3.3) must be issued against the IEEE of the Philips Hue device under Developer Tools->Services, e.g.: - -```yaml -service: zha.issue_zigbee_cluster_command -data: - ieee: "xx:xx:xx:xx:xx:xx:xx:xx" - endpoint_id: 1 - cluster_id: 25 - cluster_type: out - command: 0 - command_type: client - args: - - 0 - - 100 -``` - -Note: `cluster_id: 25` may also be `cluster_id: 0x0019`. The two are synonymous. - ### Defining Zigbee channel to use Tip! Before considering to change to an other Zigbee channel on an existing Zigbee network, it is highly recommended that you read through the two segments under the [troubleshooting](#troubleshooting) section below about "*Best practices to avoid pairing/connection difficulties*" and "*Zigbee interference avoidance and network range/coverage optimization*". These sections provide prerequisite information and advice on how to achieve the best possible Zigbee network in your environment. @@ -319,13 +311,13 @@ zha: `{ieee}` is the device hardware address which can be read from the Home Assistant UI when looking at _Device info_. From device info, you can find the `{endpoint_id}` by viewing the _Zigbee device signature_. -## Services +## Actions -### Service `zha.permit` +### Action `zha.permit` -To add new devices to the network, call the `permit` service on the `zha` domain. Do this by clicking the Service icon in Developer tools and typing `zha.permit` in the **Service** dropdown box. Next, follow the device instructions for adding, scanning or factory reset. +To add new devices to the network, call the `permit` action on the `zha` domain. Do this by clicking the **Actions** tab in **Developer tools** and typing `zha.permit` in the **Action** dropdown box. Next, follow the device instructions for adding, scanning or factory reset. -This service opens network for joining new devices. +This action opens network for joining new devices. | Data | Optional | Description | | ---------- | -------- | ------------------------------------------------------------------------------ | @@ -341,52 +333,51 @@ from the same group: | `install_code` | install_code | Install Code of the joining device. Use with `src_ieee` | | `qr_code` | qr_code | QR code containing IEEE and Install Code of the joining ZB3 device | -<div class='note'> +{% note %} Currently `qr_code` supports QR Install Codes from: - Aqara - Bosch - Consciot - Embrighten +{% endnote %} -</div> - -### Service `zha.remove` +### Action `zha.remove` -This service removes an existing device from the network. You can find the IEEE address of the device on the device card of Zigbee devices. An example of an IEEE address data parameter format is `00:0d::6f:00:05:7d:2d:34`. +This action removes an existing device from the network. You can find the IEEE address of the device on the device card of Zigbee devices. An example of an IEEE address data parameter format is `00:0d::6f:00:05:7d:2d:34`. | Data | Optional | Description | | ------ | -------- | ------------------------------------ | | `ieee` | no | IEEE address of the device to remove | -### Service `zha.set_lock_user_code` +### Action `zha.set_lock_user_code` -This service sets a lock code on a Zigbee lock. +This action sets a lock code on a Zigbee lock. | Data | Optional | Description | | ----------- | -------- | -------------------------------------------------------------------------- | | `code_slot` | no | Which lock code slot to store the code. Ex. 1-32 will work for Kwikset 954 | | `user_code` | no | Code to set on the lock. Ex. Kwikset accepts numbers 4-8 digits in length | -### Service `zha.clear_lock_user_code` +### Action `zha.clear_lock_user_code` -This service clears a lock code from a Zigbee lock. +This action clears a lock code from a Zigbee lock. | Data | Optional | Description | | ----------- | -------- | ----------------------------- | | `code_slot` | no | Which lock code slot to clear | -### Service `zha.enable_lock_user_code` +### Action `zha.enable_lock_user_code` -This service enables a lock code on a Zigbee lock. +This action enables a lock code on a Zigbee lock. | Data | Optional | Description | | ----------- | -------- | ------------------------------ | | `code_slot` | no | Which lock code slot to enable | -### Service `zha.disable_lock_user_code` +### Action `zha.disable_lock_user_code` -This service disables a lock code on a Zigbee lock. +This action disables a lock code on a Zigbee lock. | Data | Optional | Description | | ----------- | -------- | ------------------------------- | @@ -398,7 +389,7 @@ Tip! It is highly recommended that you read through the two segments under the t **To add a new Zigbee device:** -1. Go to {% my integrations title="**Settings** > **Devices & Services**" %}. +1. Go to {% my integrations title="**Settings** > **Devices & services**" %}. 2. Select the **Zigbee Home Automation** {% term integration %}. Then, select **Configure**. 3. To start a scan for new devices, on the bottom right corner of the screen, select **Add device**. 4. Reset your Zigbee devices to factory default settings according to the device instructions provided by the manufacturer (e.g., turn on/off lights up to 10 times; switches usually have a reset button/pin). It might take a few seconds for the devices to appear. You can click on **Show logs** for more verbose output. @@ -424,16 +415,29 @@ In this theoretical example, a CC2652-based Zigbee coordinator has three CC2530 In practice, you will likely need to add a lot more Zigbee router devices than in this example in order to extend the coverage of the network to reach that many devices. -## Binding and unbinding +## Zigbee groups and binding devices -ZHA supports binding and unbinding. Binding is an action in Zigbee which defines relations between two Zigbee devices, specific endpoints, and cluster id. It provides a mechanism for attaching an endpoint on one Zigbee node to one or more endpoints on another Zigbee node or Zigbee group (a group of Zigbee devices). +ZHA supports Zigbee groups and binding devices to each other. These features can be used separately or combined. For example, binding a remote to a bulb or group has the benefit of faster response time and smoother control, as the remote directly controls the bound devices. -Binding is a "target destination" in form of a device address or group ID, endpoint, and cluster. For example, binding a Zigbee device like a remote to a Zigbee lightbulb, switch or group of lightbulbs allows direct control of the "target" device (light, switch, shade) from the "remote" Zigbee device, bypassing ZHA. This means that the remote can control the lightbulb/group of lightbulbs even when the Zigbee coordinator is not available. -Binding is only supported within the same cluster, for example, "output cluster id 6" (on/off cluster) of a remote, can be only bound to an "input cluster id 6" on the target device -- light, switch. +### Zigbee group -Note that not all devices support binding as it depends on the Zigbee implementation of the device itself. Also, by default ZHA binds remotes to the coordinator, so the coordinator can receive ZCL commands from the remotes and originate zha_events. However, some remotes, for example, the Philips RWL021 can only be bound to a single destination and it is not possible to make this switch to bind to other destinations like a device or groups unless you first unbind the remote from the coordinator. After you unbind the remote from the ZHA coordinator you can then bind it directly to any other Zigbee device or a group. +A Zigbee group enables the grouping of multiple Zigbee lights, switches, and fans. This allows you to control those devices with only one command/entity. -Binding a remote directly to a bulb or group has the benefit of faster response time and smoother control. This greatly improves user feedback experience functions like dimming as the remote then directly dims the lightbulb and thus does not have to make the software roundtrip via the ZHA coordinator. +{% note %} +While using a native Zigbee group instead of Home Assistant's [Group](/integrations/group/) integration can improve the visual responsiveness, the broadcast commands issued can flood the Zigbee network if issued repeatedly. +{% endnote %} + +To create a Zigbee Group, press the "Configure" button on the ZHA integration config page. At the top, choose "Groups" and select "Create Group". Set a group name and choose which devices to include in the group. + +The group should consist of products of the same device type (e.g. all lights, switches, or fans), and at least two devices must be added to a Zigbee group before a group entity is created. + +### Zigbee binding and unbinding + +Binding is an on-device feature for Zigbee devices. It provides a mechanism for attaching an endpoint of one Zigbee device to an endpoint of another Zigbee device or to a Zigbee group. + +For example, binding a "target destination" Zigbee device like a remote to a Zigbee light bulb, switch or group of light bulbs allows direct control of the "target" device (light, switch, shade) from the "remote" Zigbee device, bypassing ZHA. This means that the remote can control the light bulb or group even when ZHA is not active. + +Note that not all devices support binding. By default, ZHA binds remotes to the coordinator, so click events are forwarded to HA. As some remotes can only be bound to a single destination, you might need to unbind the remote from the coordinator before binding it to another device or group. ## Zigbee backup and restore in ZHA @@ -455,7 +459,7 @@ Follow this guide if you have a Zigbee Home Assistant (ZHA) network running and ### To migrate to a new Zigbee coordinator radio inside ZHA -1. Go to **{% my integrations title="Settings > Devices & Services" %}** and select the ZHA {% term integration %}. Then select **Configure**. +1. Go to **{% my integrations title="Settings > Devices & services" %}** and select the ZHA {% term integration %}. Then select **Configure**. 2. Under **Network settings**, select **Migrate radio**. 3. Reconfiguration of ZHA will start. Select **Submit**. 4. Under **Migrate or re-configure**, select **Migrate to a new radio**. @@ -491,7 +495,7 @@ Note that ZHA only supports connecting a single dedicated Zigbee Coordinator rad Any Zigbee device can only be connected to a single Zigbee Coordinator (only one Zigbee gateway). This is a limitation in the current (as well as previous) Zigbee protocol specifications, governed by the [CSA (Connectivity Standards Alliance)](https://csa-iot.org/all-solutions/zigbee/). As such, it is a limit that applies to all Zigbee implementations, not just the ZHA implementation. -Support for commissioning Zigbee 3.0 devices via "Install Code" or "QR Code" via the 'zha.permit' service has so far only been implemented for 'ezsp' (Silicon Labs EmberZNet) or 'znp' (Texas Instruments) radio type in ZHA. Other radio types are missing support in their respective [radio libraries for zigpy](https://github.com/zigpy/) or manufacturer's firmware commands/APIs. +Support for commissioning Zigbee 3.0 devices via "Install Code" or "QR Code" via the `zha.permit` action has so far only been implemented for 'ezsp' (Silicon Labs EmberZNet) or 'znp' (Texas Instruments) radio type in ZHA. Other radio types are missing support in their respective [radio libraries for zigpy](https://github.com/zigpy/) or manufacturer's firmware commands/APIs. ZHA does currently not support devices that can only use the ZGP ("Zigbee Green Power") profile which is used in a few batteryless self-powered or energy harvesting devices, (such as for example; Philips Hue Click, Philips Hue Tap, and some "Friends of Hue" partnership switches). @@ -529,7 +533,7 @@ Note that submitting a new "device support request" does not guarantee that some ### Best practices to avoid pairing/connection difficulties -If you are having problems pairing a device to then ZHA integratuon then it is recommomended to verify that you try to follow recommended best practices to avoid pairing and/or connection issues: +If you experience problems pairing a device, verify that you follow best practices to avoid pairing/connection issues: - Check that your setup and environment are optimized to avoid interference. - As interference avoidance is an extremely important topic on its own, please read and follow the tips in the separate section below about Zigbee interference avoidance and network range/coverage optimization. @@ -626,7 +630,7 @@ When reporting potential bugs related to the ZHA integration on the issues track 1. Debug logs for the issue, see [debug logging](#debug-logging). 2. Exact model and firmware of the Zigbee radio (Zigbee Coordinator adapter) being used. 3. If the issue is related to a specific Zigbee device, provide both the **Zigbee Device Signature** and the **Diagnostics** information. - - Both the **Zigbee Device Signature** and the **Diagnostics** information can be found under {% my integrations title="**Settings** > **Devices & Services**" %}. Select the **Zigbee Home Automation** integration. Then, select **Configure** > **Devices** (pick your device). Select **Zigbee Device Signature** and **Download Diagnostics**, respectively. + - Both the **Zigbee Device Signature** and the **Diagnostics** information can be found under {% my integrations title="**Settings** > **Devices & services**" %}. Select the **Zigbee Home Automation** integration. Then, select **Configure** > **Devices** (pick your device). Select **Zigbee Device Signature** and **Download Diagnostics**, respectively. Note: Please also make sure you give it your best effort to follow the recommended best practices for avoiding both [pairing/connection difficulties](#best-practices-to-avoid-pairingconnection-difficulties) and [Zigbee interference](#zigbee-interference-avoidance-and-network-rangecoverage-optimization), (which helps free up time for developers). @@ -718,3 +722,11 @@ services: restart: always network_mode: host ``` + +### EZSP error and other log messages + +#### NCP entered failed state + +When you see `NCP entered failed state. Requesting APP controller restart` in logs during normal operation, it indicates a drop in communication between ZHA and the serial interface of the Silabs EmberZNet Zigbee Coordinator. + +The EZSP (EmberZNet Serial Protocol) interface used by Silicon Labs EmberZNet Zigbee Coordinator adapters requires a stable connection to the serial port; therefore, it is not recommended to use a connection over Wi-Fi, WAN, VPN, etc. diff --git a/source/_integrations/zone.markdown b/source/_integrations/zone.markdown index b3411912a37c..42414203291f 100644 --- a/source/_integrations/zone.markdown +++ b/source/_integrations/zone.markdown @@ -66,7 +66,7 @@ icon: required: false type: string passive: - description: To only use the zone for automation and hide it from the frontend and not use the zone for device tracker name. + description: To only use the zone for automation and hide it from the frontend and not use the zone for device tracker state. required: false type: boolean default: false @@ -78,10 +78,9 @@ To find the latitude/longitude of a certain place you can use [Google Maps](http If no configuration is given, the `zone` integration will create a zone for home. This zone will use location provided in the `configuration.yaml` file and have a radius of 100 meters. To override this, create a zone configuration in `configuration.yaml` (see above) and name it **'Home'**. Overriding the Home zone via the UI is not supported. -<div class='note'> - +{% note %} Devices that are in the zone **'Home'** will not appear on the map in the Home Assistant UI. To apply the changes to the **'Home'** `zone`, you must restart Home Assistant. -</div> +{% endnote %} ## Icons diff --git a/source/_integrations/zoneminder.markdown b/source/_integrations/zoneminder.markdown index 7959118599af..ce1e6ce2359f 100644 --- a/source/_integrations/zoneminder.markdown +++ b/source/_integrations/zoneminder.markdown @@ -93,11 +93,11 @@ zoneminder: password: YOUR_PASSWORD ``` -### Service +### Action -Once loaded, the `zoneminder` platform will expose a service (`set_run_state`) that can be used to change the current run state of ZoneMinder. +Once loaded, the `zoneminder` platform will expose an action (`set_run_state`) that can be used to change the current run state of ZoneMinder. -| Service data attribute | Optional | Description | +| Data attribute | Optional | Description | | :--------------------- | :------- | :-------------------------------- | | `id` | no | Host of the ZoneMinder instance. | | `name` | no | Name of the new run state to set. | @@ -172,11 +172,9 @@ monitored_conditions: The `zoneminder` switch platform allows you to toggle the current function of all cameras attached to your [ZoneMinder](https://www.zoneminder.com) instance. -<div class='note'> - +{% important %} You must have the [ZoneMinder integration](/integrations/zoneminder/) configured to use this and if ZoneMinder authentication is enabled the account specified in the integration configuration must have "Edit" permission for "System". - -</div> +{% endimportant %} To enable this switch, add the following lines to your {% term "`configuration.yaml`" %} file: @@ -199,6 +197,6 @@ command_off: type: string {% endconfiguration %} -<div class='note'> +{% note %} The default functions installed by ZoneMinder are: None, Monitor, Modect, Record, Mocord, Nodect. -</div> +{% endnote %} diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown index e046f2b36908..ffd31290e907 100644 --- a/source/_integrations/zwave_js.markdown +++ b/source/_integrations/zwave_js.markdown @@ -76,7 +76,7 @@ Use this My button: {% my config_flow_start badge domain="zwave_js" %}, or follow these steps: - Browse to your Home Assistant instance. -- Go to **{% my integrations title="Settings > Devices & Services" %}**. +- Go to **{% my integrations title="Settings > Devices & services" %}**. - In the bottom right, select the **{% my config_flow_start icon domain="zwave_js" %}** button. - From the list, select **Z-Wave**. @@ -94,13 +94,13 @@ Use this My button: - You successfully installed the Z-Wave integration and the Z-Wave JS add-on. - You can now [add](/integrations/zwave_js/#adding-a-new-device-to-the-z-wave-network) devices to the Z-Wave network. -<p class='note'> +{% note %} While your Z-Wave mesh is permanently stored on your dongle, the additional metadata is not. When the Z-Wave integration starts up the first time, it will interview your entire Z-Wave network. Depending on the number of devices paired with the Z-Wave dongle, this can take a while. You can speed up this process by manually waking up your battery-powered devices. Most of the time, this is a button press on those devices (see their manual). It is not necessary to exclude and re-include devices from the mesh. -</p> +{% endnote %} ### Adding a new device to the Z-Wave network -1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & Services**" %}. +1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & services**" %}. 2. Select the Z-Wave integration. Then select **Configure**. 3. Select **Add device**. - The Z-Wave controller is now in inclusion mode. @@ -119,7 +119,7 @@ While your Z-Wave mesh is permanently stored on your dongle, the additional meta ### Removing a device from the Z-Wave network -1. In Home Assistant, go to {% my integrations title="**Settings** > **Devices & Services**" %}. +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**. - The Z-Wave controller is now in exclusion mode. @@ -133,7 +133,7 @@ The Z-Wave integration provides several special entities, some of which are avai ### Entities available for every Z-Wave device 1. **Node status** sensor: This sensor shows the node status for a given Z-Wave device. The sensor is disabled by default. The available node statuses are explained in the [Z-Wave JS documentation](https://zwave-js.github.io/node-zwave-js/#/api/node?id=status). They can be used in state change automations. For example to ping a device when it is dead, or refresh values when it wakes up. -2. **Ping** button: This button can be pressed to ping a device. It is an alternative to the `zwave_js.ping` service. +2. **Ping** button: This button can be pressed to ping a device. It is an alternative to the `zwave_js.ping` action. 3. **Controller/node statistics** sensors: Z-Wave JS collects statistics about communications between [nodes](https://zwave-js.github.io/node-zwave-js/#/api/node?id=quotstatistics-updatedquot) and the [controller](https://zwave-js.github.io/node-zwave-js/#/api/controller?id=quotstatistics-updatedquot). The statistics can be used to troubleshoot RF issues in your environment. These statistics are available in the network configuration and device info panels. But they are also available as sensors which are disabled by default. ### Conditional entities @@ -142,7 +142,7 @@ The Z-Wave integration provides several special entities, some of which are avai ## Using advanced features (UI only) -While the integration aims to provide as much functionality as possible through existing Home Assistant constructs (entities, states, automations, services, etc.), there are some features that are only available through the UI. +While the integration aims to provide as much functionality as possible through existing Home Assistant constructs (entities, states, automations, actions, etc.), there are some features that are only available through the UI. All of these features can be accessed either in the Z-Wave integration configuration panel or in a Z-Wave device's device panel. @@ -179,7 +179,7 @@ The following features can be accessed from the device panel of any Z-Wave devic ![Z-Wave device panel](/images/integrations/z-wave/z-wave-device-info.png) -- **Configure:** Provides an easy way to look up and update configuration parameters for the device. While there is an existing service for setting configuration parameter values, this UI may sometimes be quicker to use for one-off changes. +- **Configure:** Provides an easy way to look up and update configuration parameters for the device. While there is an existing action for setting configuration parameter values, this UI may sometimes be quicker to use for one-off changes. - **Re-interview:** Forces the device to go through the interview process again so that Z-Wave-JS can discover all of its capabilities. Can be helpful if you don't see all the expected entities for your device. - **Rebuild routes:** Forces the device to rediscover its optimal route back to the controller. Use this if you think you are experiencing unexpected delays or RF issues with your device. Your device may be less responsive during this process. - **Remove failed:** Forces the controller to remove the device from the controller. Can be used when a device has failed and it can't go through the normal exclusion process. @@ -187,13 +187,13 @@ The following features can be accessed from the device panel of any Z-Wave devic - **Update:** Updates a device's firmware using a manually uploaded firmware file. Only some devices support this feature (controllers and devices with the Firmware Update Metadata Command Class). - **Download diagnostics:** Exports a JSON file describing the entities of this specific device. -## Services +## Actions -### Service `zwave_js.set_config_parameter` +### Action `zwave_js.set_config_parameter` -This service will update a configuration parameter. To update multiple partial parameters in a single call, use the `zwave_js.bulk_set_partial_config_parameters` service. +This action will update a configuration parameter. To update multiple partial parameters in a single call, use the `zwave_js.bulk_set_partial_config_parameters` action. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Entity (or list of entities) to set the configuration parameter on. At least one `entity_id`, `device_id`, or `area_id` must be provided. | | `device_id` | no | Device ID (or list of device IDs) to set the configuration parameter on. At least one `entity_id`, `device_id`, or `area_id` must be provided. | @@ -244,11 +244,11 @@ data: value: "Blink" ``` -### Service `zwave_js.bulk_set_partial_config_parameters` +### Action `zwave_js.bulk_set_partial_config_parameters` -This service will bulk set multiple partial configuration parameters. Be warned that correctly using this service requires advanced knowledge of Z-Wave. +This action will bulk set multiple partial configuration parameters. Be warned that correctly using this action requires advanced knowledge of Z-Wave. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Entity (or list of entities) to bulk set partial configuration parameters on. At least one `entity_id`, `device_id`, or `area_id` must be provided. | | `device_id` | no | Device ID (or list of device IDs) to bulk set partial configuration parameters on. At least one `entity_id`, `device_id`, or `area_id` must be provided. | @@ -260,11 +260,9 @@ This service will bulk set multiple partial configuration parameters. Be warned Let's use parameter 21 for [this device](https://devices.zwave-js.io/?jumpTo=0x031e:0x000a:0x0001:0.0) as an example to show how partial parameters can be bulk set. In this case, we want to set `0xff` to `127`, `0x7f00` to `10`, and `0x8000` to `1` (or the raw value of `4735`). -<div class='note'> - -When using the dictionary format to map the partial parameter to values, the cached values for the missing partial parameters will be used. So in examples 2, 3, 4, and 5, the service would use the cached value for partial parameters `0xff0000`, `0x3f000000`, and `0x40000000` because new values haven't been specified. If you send the raw integer value, it is assumed that you have calculated the full value, so in example 1, partial parameters `0xff0000`, `0x3f000000`, and `0x40000000` would all be set to `0`. - -</div> +{% note %} +When using the dictionary format to map the partial parameter to values, the cached values for the missing partial parameters will be used. So in examples 2, 3, 4, and 5, the action would use the cached value for partial parameters `0xff0000`, `0x3f000000`, and `0x40000000` because new values haven't been specified. If you send the raw integer value, it is assumed that you have calculated the full value, so in example 1, partial parameters `0xff0000`, `0x3f000000`, and `0x40000000` would all be set to `0`. +{% endnote %} Example 1: @@ -333,20 +331,20 @@ data: "Quick Strip Effect Intensity Scale": "Fine" ``` -### Service `zwave_js.refresh_value` +### Action `zwave_js.refresh_value` -This service will refresh the value(s) for an entity. This service will generate extra traffic on your Z-Wave network and should be used sparingly. Updates from devices on battery may take some time to be received. +This action will refresh the value(s) for an entity. This action will generate extra traffic on your Z-Wave network and should be used sparingly. Updates from devices on battery may take some time to be received. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `entity_id` | yes | Entity or list of entities to refresh values for. | | `refresh_all_values` | no | Whether all values should be refreshed. If `false`, only the primary value will be refreshed. If `true`, all watched values will be refreshed. | -### Service `zwave_js.set_value` +### Action `zwave_js.set_value` -This service will set a value on a Z-Wave device. It is for advanced use cases where you need to modify the state of a node and can't do it using native Home Assistant entity functionality. Be warned that correctly using this service requires advanced knowledge of Z-Wave. The service provides minimal validation and blindly calls the Z-Wave JS API, so if you are having trouble using it, it is likely because you are providing an incorrect value somewhere. To set a config parameter, you should use the `zwave_js.set_config_parameter` or `zwave_js.bulk_set_partial_config_parameters` services instead of this one. +This action will set a value on a Z-Wave device. It is for advanced use cases where you need to modify the state of a node and can't do it using native Home Assistant entity functionality. Be warned that correctly using this action requires advanced knowledge of Z-Wave. The action provides minimal validation and blindly calls the Z-Wave JS API, so if you are having trouble using it, it is likely because you are providing an incorrect value somewhere. To set a config parameter, you should use the `zwave_js.set_config_parameter` or `zwave_js.bulk_set_partial_config_parameters` action instead of this one. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Entity (or list of entities) to set the value on. At least one `entity_id`, `device_id`, or `area_id` must be provided. | | `device_id` | no | Device ID (or list of device IDs) to set the value on. At least one `entity_id`, `device_id`, or `area_id` must be provided. | @@ -357,18 +355,18 @@ This service will set a value on a Z-Wave device. It is for advanced use cases w | `endpoint` | no | ID of Endpoint that you want to set the value for. | | `value` | yes | The new value that you want to set. | | `options` | no | Set value options map. Refer to the Z-Wave JS documentation for more information on what options can be set. | -| `wait_for_result` | no | Boolean that indicates whether or not to wait for a response from the node. If not included in the payload, the integration will decide whether to wait or not. If set to `true`, note that the service call can take a while if setting a value on an asleep battery device. | +| `wait_for_result` | no | Boolean that indicates whether or not to wait for a response from the node. If not included in the payload, the integration will decide whether to wait or not. If set to `true`, note that the action can take a while if setting a value on an asleep battery device. | -### Service `zwave_js.multicast_set_value` +### Action `zwave_js.multicast_set_value` -This service will set a value on multiple Z-Wave devices using multicast. It is for advanced use cases where you need to set the same value on multiple nodes simultaneously. Be warned that correctly using this service requires advanced knowledge of Z-Wave. The service provides minimal validation beyond what is necessary to properly call the Z-Wave JS API, so if you are having trouble using it, it is likely because you are providing an incorrect value somewhere. +This action will set a value on multiple Z-Wave devices using multicast. It is for advanced use cases where you need to set the same value on multiple nodes simultaneously. Be warned that correctly using this action requires advanced knowledge of Z-Wave. The action provides minimal validation beyond what is necessary to properly call the Z-Wave JS API, so if you are having trouble using it, it is likely because you are providing an incorrect value somewhere. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Entity (or list of entities) to set the value on via multicast. At least two `entity_id` or `device_id` must be resolved if not broadcasting the command. | | `device_id` | no | Device ID (or list of device IDs) to set the value on via multicast. At least two `entity_id` or `device_id` must be resolved if not broadcasting the command. | | `area_id` | no | Area ID (or list of area IDs) for devices/entities to set the value on via multicast. At least two `entity_id` or `device_id` must be resolved if not broadcasting the command. | -| `broadcast` | no | Boolean that indicates whether you want the message to be broadcast to all nodes on the network. If you have only one Z-Wave network configured, you do not need to provide a `device_id` or `entity_id` when this is set to true. When you have multiple Z-Wave networks configured, you MUST provide at least one `device_id` or `entity_id` so the service knows which network to target. | +| `broadcast` | no | Boolean that indicates whether you want the message to be broadcast to all nodes on the network. If you have only one Z-Wave network configured, you do not need to provide a `device_id` or `entity_id` when this is set to true. When you have multiple Z-Wave networks configured, you MUST provide at least one `device_id` or `entity_id` so the action knows which network to target. | | `command_class` | yes | ID of Command Class that you want to set the value for. | | `property` | yes | ID of Property that you want to set the value for. | | `property_key` | no | ID of Property Key that you want to set the value for. | @@ -376,11 +374,11 @@ This service will set a value on multiple Z-Wave devices using multicast. It is | `value` | yes | The new value that you want to set. | | `options` | no | Set value options map. Refer to the Z-Wave JS documentation for more information on what options can be set. | -### Service `zwave_js.invoke_cc_api` +### Action `zwave_js.invoke_cc_api` -Call this service to use the Command Class API directly. In most cases, the `zwave_js.set_value` service will accomplish what you need to, but some Command Classes have API commands that can't be accessed via that service. Refer to the [Z-Wave JS Command Class documentation](https://zwave-js.github.io/node-zwave-js/#/api/CCs/index) for the available APIs and arguments. Be sure to know what you are doing when calling this service. +Leverage this action to use the Command Class API directly. In most cases, the `zwave_js.set_value` action will accomplish what you need to, but some Command Classes have API commands that can't be accessed via that action. Refer to the [Z-Wave JS Command Class documentation](https://zwave-js.github.io/node-zwave-js/#/api/CCs/index) for the available APIs and arguments. Be sure to know what you are doing when calling this action. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Entity (or list of entities) to ping. At least one `entity_id`, `device_id`, or `area_id` must be provided. If `endpoint` is specified, that endpoint will be used to make the CC API call for all devices, otherwise the primary value endpoint will be used for each entity. | | `device_id` | no | Device ID (or list of device IDs) to ping. At least one `entity_id`, `device_id`, or `area_id` must be provided. If `endpoint` is specified, that endpoint will be used to make the CC API call for all devices, otherwise the root endpoint (0) will be used for each device. | @@ -390,12 +388,12 @@ Call this service to use the Command Class API directly. In most cases, the `zwa | `method_name` | yes | The name of the method that is being called from the CC API. | | `parameters` | yes | A list of parameters to pass to the CC API method. | -### Service `zwave_js.refresh_notifications` +### Action `zwave_js.refresh_notifications` -This service will refresh the notifications of a given type on a device that +This action will refresh the notifications of a given type on a device that supports the Notification Command Class. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ------------------------------------------------------ | | `entity_id` | no | Entity (or list of entities) to refresh notifications for. At least one `entity_id`, `device_id`, or `area_id` must be provided. | | `device_id` | no | Device ID (or list of device IDs) to refresh notifications for. At least one `entity_id`, `device_id`, or `area_id` must be provided. | @@ -403,21 +401,21 @@ supports the Notification Command Class. | `notification_type` | yes | The type of notification to refresh. | | `notification_event` | no | The notification event to refresh. | -### Service `zwave_js.reset_meter` +### Action `zwave_js.reset_meter` -This service will reset the meters on a device that supports the Meter Command Class. +This action will reset the meters on a device that supports the Meter Command Class. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------- | | `entity_id` | yes | Entity (or list of entities) for the meters you want to reset. | | `meter_type` | no | If supported by the device, indicates the type of meter to reset. Not all devices support this option. | | `value` | no | If supported by the device, indicates the value to reset the meter to. Not all devices support this option. | -### Service `zwave_js.set_lock_configuration` +### Action `zwave_js.set_lock_configuration` -This service will set the configuration of a lock. +This action will set the configuration of a lock. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | no | Lock entity or list of entities to set the usercode. | | `operation_type` | yes | Lock operation type, one of `timed` or `constant`. | @@ -427,23 +425,23 @@ This service will set the configuration of a lock. | `twist_assist` | no | Enable Twist Assist. | | `block_to_block` | no | Enable block-to-block functionality. | -### Service `zwave_js.set_lock_usercode` +### Action `zwave_js.set_lock_usercode` -This service will set the usercode of a lock to X at code slot Y. +This action will set the usercode of a lock to X at code slot Y. Valid usercodes are at least 4 digits. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ---------------------------------------------------- | | `entity_id` | no | Lock entity or list of entities to set the usercode. | | `code_slot` | yes | The code slot to set the usercode into. | | `usercode` | yes | The code to set in the slot. | -### Service `zwave_js.clear_lock_usercode` +### Action `zwave_js.clear_lock_usercode` -This service will clear the usercode of a lock in code slot X. +This action will clear the usercode of a lock in code slot X. Valid code slots are between 1-254. -| Service Data Attribute | Required | Description | +| Data attribute | Required | Description | | ---------------------- | -------- | ------------------------------------------------------ | | `entity_id` | no | Lock entity or list of entities to clear the usercode. | | `code_slot` | yes | The code slot to clear the usercode from. | @@ -746,21 +744,17 @@ This method provides the same server application and UI as the Z-Wave JS UI add- This is considered a very advanced use case. In this case you run the Z-Wave JS Server or Z-Wave JS UI NodeJS application directly. Installation and maintaining this is out of scope for this document. See the [Z-Wave JS server](https://github.com/zwave-js/zwave-js-server) or [Z-Wave JS UI](https://github.com/zwave-js/zwave-js-ui/) GitHub repository for information. -<div class='note info'> - +{% note %} [Supported Z-Wave dongle](/docs/z-wave/controllers/#supported-z-wave-usb-sticks--hardware-modules). The Z-Wave controller dongle should be connected to the same host as where the Z-Wave JS server is running. In the configuration for the Z-Wave JS server, you need to provide the path to this stick. It's recommended to use the `/dev/serial-by-id/yourdevice` version of the path to your stick, to make sure the path doesn't change over reboots. The most common known path is `/dev/serial/by-id/usb-0658_0200-if00`. +{% endnote %} -</div> - -<div class='note info'> - +{% note %} **Network keys** are used to connect securely to compatible devices. The network keys consist of 32 hexadecimal characters, for example, `2232666D100F795E5BB17F0A1BB7A146` (do not use this one, pick a random one). Without network keys security enabled devices cannot be added securely and will not function correctly. You must provide these network keys in the configuration part of the Z-Wave JS Server. For new installations, unique default keys will be auto-generated for you by the Z-Wave JS add-on. You can also generate those network keys in the Settings section of Z-Wave JS UI. Make sure that you keep a backup of these keys in a safe place. You will need to enter the same keys to be able to access securely paired devices. - -</div> +{% endnote %} ### Installing and configuring the Z-Wave integration in Home Assistant @@ -887,13 +881,13 @@ Your device might not send automatic status updates to the controller. While the Z-Wave does not automatically poll devices on a regular basis. Polling can quickly lead to network congestion and should be used very sparingly and only where necessary. -- We provide a `zwave_js.refresh_value` service to allow you to manually poll a value, for example from an automation that only polls a device when there is motion in that same room. If you **really** need polling, you can enable this in Z-Wave JS UI but not in the official add-on. +- We provide a `zwave_js.refresh_value` action to allow you to manually poll a value, for example from an automation that only polls a device when there is motion in that same room. If you **really** need polling, you can enable this in Z-Wave JS UI but not in the official add-on. - Z-Wave JS UI allows you to configure scheduled polling on a per-value basis, which you can use to keep certain values updated. It also allows you to poll individual values on-demand from your automations, which should be preferred over blindly polling all the time if possible. -<div class='note warning'> +{% warning %} Polling should only be used as a last resort. You must use it with care and accept the negative impact on your network. Z-Wave is a very low speed network and poll requests can easily flood your network and slow down your commands. -</div> +{% endwarning %} ### My device is recognized as Unknown Manufacturer and/or some functions don't work with the Z-Wave integration @@ -905,7 +899,7 @@ If the interview is complete, then the device does not yet have a device file fo When trying to determine why something isn't working as you expect, or when reporting an issue with the integration, it is helpful to know what Z-Wave JS sees as the current state of your Z-Wave network. To get a dump of your current network state, follow these steps: -1. Go to {% my integrations title="**Settings** > **Devices & Services**" %}. +1. Go to {% my integrations title="**Settings** > **Devices & services**" %}. 2. Select the **Z-Wave** integration. Then, select the three dots. 3. From the dropdown menu, select **Download diagnostics**. @@ -935,11 +929,11 @@ The log level will be reset to its previous value for the integration, library, ##### Enable Z-Wave JS logging manually, or via an automation -Set the log level for `zwave_js_server` to `debug`. This can either be done in your `configuration.yaml` in the `logger` section, or using the `logger.set_level` service. When the integration detects that the log level has been set to `debug`, it will also set the Z-Wave JS logs to `debug` if the level isn't already `verbose`, `debug`, or `silly` and will include those logs in the Home Assistant logs. The Z-Wave JS logs can be found under the logger name `zwave_js_server.server`. +Set the log level for `zwave_js_server` to `debug`. This can either be done in your `configuration.yaml` in the `logger` section, or using the `logger.set_level` action. When the integration detects that the log level has been set to `debug`, it will also set the Z-Wave JS logs to `debug` if the level isn't already `verbose`, `debug`, or `silly` and will include those logs in the Home Assistant logs. The Z-Wave JS logs can be found under the logger name `zwave_js_server.server`. ##### Disable Z-Wave JS logging manually, or via an automation -Set the log level for `zwave_js_server` to a level higher than `debug`. This can either be done in your `configuration.yaml` in the `logger` section, or using the `logger.set_level` service. The Z-Wave JS logs will no longer be included in the Home Assistant logs, and if the log level of Z-Wave JS was changed by the integration, it will automatically change back to its original level. +Set the log level for `zwave_js_server` to a level higher than `debug`. This can either be done in your `configuration.yaml` in the `logger` section, or using the `logger.set_level` action. The Z-Wave JS logs will no longer be included in the Home Assistant logs, and if the log level of Z-Wave JS was changed by the integration, it will automatically change back to its original level. ## Z-Wave terminology diff --git a/source/_integrations/zwave_me.markdown b/source/_integrations/zwave_me.markdown index 66f9d3e34958..ad4d306c0d64 100644 --- a/source/_integrations/zwave_me.markdown +++ b/source/_integrations/zwave_me.markdown @@ -70,18 +70,14 @@ Example of connecting to Z-Way via remote access find.z-wave.me: - API Token: /112f7a4a-0051-cc2b-3b61-1898181b9950 -<div class='note warning'> +{% warning %} +To grant access only to certain devices, create a new user and select the necessary devices from the list. Then use the API token of that user. It is suggested **not to use the API token of the admin**. +{% endwarning %} - To grant access only to certain devices, create a new user and select the necessary devices from the list. Then use the API token of that user. It is suggested **not to use the API token of the admin**. -</div> - - -<div class='note info'> - - You can use Z-Wave.Me UI with its enhanced Z-Wave network diagnostics tools together with the Home Assistant UI. - -</div> +{% tip %} +You can use Z-Wave.Me UI with its enhanced Z-Wave network diagnostics tools together with the Home Assistant UI. +{% endtip %} ## Hardware requirements diff --git a/source/_layouts/category_index.html b/source/_layouts/category_index.html index 764a9f5c15fb..38178510d906 100644 --- a/source/_layouts/category_index.html +++ b/source/_layouts/category_index.html @@ -1,17 +1,16 @@ --- title: "Blog index" layout: page +feedback: false --- <div id="archive-list"> {% for post in site.categories[page.category] %} - {% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %} - {% unless year == this_year %} - {% assign year = this_year %} - <h2>{{ year }}</h2> - {% endunless %} - <article> - {% include blog/archive_post.html %} - </article> + {% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %} + {% unless year == this_year %} + {% assign year = this_year %} + <h2>{{ year }}</h2> + {% endunless %} + {% include blog/archive_post.html %} {% endfor %} </div> diff --git a/source/_layouts/default.html b/source/_layouts/default.html index 6e10e3d03a08..bba0fd7fd718 100644 --- a/source/_layouts/default.html +++ b/source/_layouts/default.html @@ -1,45 +1,72 @@ +{% assign url_parts = page.url | split: '/' %} +{% assign root = url_parts[1] %} +{% assign doc = url_parts[2] %} + {% include site/head.html %} - <body {% if page.body_id %} id="{{ page.body_id }}"{% elsif page.layout == "landingpage" %} id="landingpage"{% endif %}> - <header class='site-header'> + <body {% if page.body_id %} id="{{ page.body_id }}"{% elsif page.layout == "landingpage" %} id="landingpage"{% endif %} class="{% if root == 'docs' or root == 'dashboards' or root == 'voice_control' or root == 'installation' or root == 'getting-started' or root == 'common-tasks' %}documentation-page{% endif %}{% if root == 'integrations' %}integration-page{% endif %}{% if root == 'blog' %}blog-post{% endif %}"> + <header class='site-header {% if page.dark_header %}dark{% endif %}'> {% include site/header.html %} </header> <div class="page-content"> - {% if page.hero_unit %} - {% include site/hero_unit.html %} - {% endif %} - - <div class="grid-wrapper"> - <div class="grid grid-center"> - {% if page.is_post and page.sidebar == false %} - <div class="grid__item four-fifths lap-one-whole palm-one-whole"> - {% elsif page.is_homepage or page.layout == "landingpage" %} - <div class="grid__item one-whole"> - {% else %} - <div class="grid__item two-thirds lap-one-whole palm-one-whole"> - {% endif %} - - {% if page.is_homepage or page.layout == "landingpage" %} - {{ content }} + {% if page.hero_unit %} + {% include site/hero_unit.html %} + {% endif %} + + <div class="grid-wrapper"> + <div class="grid grid-center"> + + {% if page.toc %} + {%- unless page.no_toc -%} + <aside id="toc-bar" class="grid__item desk-wide-one-sixth"> + <section class="aside-module grid__item one-whole"> + <div class='section'> + <h1 class="title epsilon">{% icon "mdi:toc" %} On this page</h1> + {{ content | toc_only }} + </div> + </section> + </aside> + {%- endunless -%} + {% endif %} + + {% if page.is_post and page.sidebar == false %} + <div class="grid__item four-fifths desk-wide-three-quarters lap-one-whole palm-one-whole"> + {% elsif page.no_toc == true %} + <div class="grid__item one-whole desk-wide-three-quarters"> + {% elsif page.is_homepage or page.layout == "landingpage" %} + <div class="grid__item one-whole"> + {% elsif doc=="categories" %} + <div class="grid__item two-thirds desk-wide-three-quarters lap-one-whole palm-one-whole"> {% else %} - {{ content | output_modder }} + <div class="grid__item two-thirds desk-wide-seven-twelfths lap-one-whole palm-one-whole"> {% endif %} - </div> - {% unless page.sidebar == false or page.layout == "landingpage" %} - <aside id="sidebar" class="grid__item one-third lap-one-whole palm-one-whole"> - {% include site/sidebar.html %} - </aside> - {% endunless %} + {% if page.is_homepage or page.layout == "landingpage" %} + {{ content }} + {% else %} + {{ content | output_modder }} + {% endif %} + </div> + + + {% unless page.sidebar == false or page.layout == "landingpage" %} + {% if root == 'integrations' %} + <aside id="integration-sidebar" class="grid__item one-third desk-wide-one-quarter lap-one-whole palm-one-whole"> + {% else %} + <aside id="sidebar" class="grid__item one-third desk-wide-one-quarter lap-one-whole palm-one-whole"> + {% endif %} + {% include site/sidebar.html %} + </aside> + {% endunless %} + </div> </div> - </div> - <footer> - {% include site/footer.html %} - </footer> + <footer> + {% include site/footer.html %} + </footer> - </div> + </div> {% include javascripts/scripts.html %} </body> </html> diff --git a/source/_layouts/page.html b/source/_layouts/page.html index fb1122d4cff6..93b24d3e7f03 100644 --- a/source/_layouts/page.html +++ b/source/_layouts/page.html @@ -5,9 +5,26 @@ <article class="page"> {% if page.title and page.show_title != false and page.layout != "landingpage" %} <header> + {% assign crumbs = page.url | split: '/' %} + {% if crumbs.size > 2 %} + <div class="breadcrumbs"> + <a href="/">Home</a> + {% for crumb in crumbs offset: 1 %} + {% if forloop.last %} + ▸ + {% else %} + {% assign crumb_limit = forloop.index | plus: 1 %} + ▸ <a href="{% for crumb in crumbs limit: crumb_limit %}{{ crumb | append: '/' }}{% endfor %}">{{ crumb | replace:'docs','documentation' | replace:'-',' ' | replace:'_',' ' | capitalize }}</a> + {% endif %} + {% endfor %} + </div> + {% endif %} <h1 class="title indent"> - {% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title - }}{% endif %} + {% if page.title contains "Category:" %} + {{ page.title | replace: "-", " " | replace: "Category: ", "" }} + {% else %} + {% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %} + {% endif %} </h1> </header> {% if page.collection == "integrations" %} @@ -31,7 +48,6 @@ <h1 class="title indent"> </div> {% endif %} {% endif %} - <hr class="divider" /> {% endif %} {{ content }} diff --git a/source/_layouts/post.html b/source/_layouts/post.html index 13c1891201c9..52c0b58573ca 100644 --- a/source/_layouts/post.html +++ b/source/_layouts/post.html @@ -1,6 +1,7 @@ --- layout: default is_post: true +feedback: false --- <article class="post"> diff --git a/source/_posts/2015-02-07-looking-at-the-past.markdown b/source/_posts/2015-02-07-looking-at-the-past.markdown index 109ac5eed652..f34c56fdee16 100644 --- a/source/_posts/2015-02-07-looking-at-the-past.markdown +++ b/source/_posts/2015-02-07-looking-at-the-past.markdown @@ -27,9 +27,9 @@ The history component will be enabled for new users by default. For current user </a> </p> -<div class='note'> +{% note %} Events are saved in a local database. Google Graphs is used to draw the graph. Drawing is happening 100% in your browser - no data is transferred to anyone at any time. -</div> +{% endnote %} <!--more--> diff --git a/source/_posts/2015-05-14-release-notes.markdown b/source/_posts/2015-05-14-release-notes.markdown index 12515d545dea..2bf1f025d26a 100644 --- a/source/_posts/2015-05-14-release-notes.markdown +++ b/source/_posts/2015-05-14-release-notes.markdown @@ -16,9 +16,9 @@ This release includes a significant startup boost for the frontend and a fix for I would like to give a big shout out to our newest contributor [fabaff](https://github.com/fabaff) for taking the time to improve the documentation. -<div class='note'> +{% note %} To update to the latest version, run <code>scripts/update</code>. Please report any issues on <a href='https://github.com/home-assistant/home-assistant/issues'>GitHub</a>. -</div> +{% endnote %} <!--more--> diff --git a/source/_posts/2015-06-10-release-notes.markdown b/source/_posts/2015-06-10-release-notes.markdown index 9ceaf1507b38..711fbe78f740 100644 --- a/source/_posts/2015-06-10-release-notes.markdown +++ b/source/_posts/2015-06-10-release-notes.markdown @@ -20,9 +20,9 @@ A big improvement has been brought this release by wind-rider. He took the time <img src='/images/screenshots/media_player-card.png' /> Example of the new media player cards </p> -<div class='note'> +{% note %} To update to the latest version, run <code>scripts/update</code>. Please report any issues on <a href='https://github.com/home-assistant/home-assistant/issues'>GitHub</a>. -</div> +{% endnote %} <!--more--> diff --git a/source/_posts/2015-07-11-ip-cameras-arduino-kodi-efergy-support.markdown b/source/_posts/2015-07-11-ip-cameras-arduino-kodi-efergy-support.markdown index 3e51e162e102..19eec4c3267f 100644 --- a/source/_posts/2015-07-11-ip-cameras-arduino-kodi-efergy-support.markdown +++ b/source/_posts/2015-07-11-ip-cameras-arduino-kodi-efergy-support.markdown @@ -29,9 +29,9 @@ camera: still_image_url: http://194.218.96.92/jpg/image.jpg ``` -<div class='note'> +{% note %} To update to the latest version, run <code>scripts/update</code>. Please report any issues on <a href='https://github.com/home-assistant/home-assistant/issues'>GitHub</a>. -</div> +{% endnote %} <!--more--> diff --git a/source/_posts/2015-08-26-laundry-automation-with-moteino-mqtt-and-home-assistant.markdown b/source/_posts/2015-08-26-laundry-automation-with-moteino-mqtt-and-home-assistant.markdown index 0b9e8d24a785..2b9f8b754291 100644 --- a/source/_posts/2015-08-26-laundry-automation-with-moteino-mqtt-and-home-assistant.markdown +++ b/source/_posts/2015-08-26-laundry-automation-with-moteino-mqtt-and-home-assistant.markdown @@ -53,9 +53,9 @@ Materials used: Home Assistant Configuration: -<div class='note'> +{% note %} The automation and script syntax here is using a deprecated and no longer supported format. -</div> +{% endnote %} ```yaml mqtt: diff --git a/source/_posts/2015-12-13-setup-encryption-using-lets-encrypt.markdown b/source/_posts/2015-12-13-setup-encryption-using-lets-encrypt.markdown index d245bfdeb4b9..503dfbaf8f11 100644 --- a/source/_posts/2015-12-13-setup-encryption-using-lets-encrypt.markdown +++ b/source/_posts/2015-12-13-setup-encryption-using-lets-encrypt.markdown @@ -9,9 +9,9 @@ categories: How-To og_image: /images/blog/2015-12-lets-encrypt/letsencrypt-secured-fb.png --- -<div class='note'> +{% note %} The instructions in this blog post are outdated. Please have a look at the <a href='/blog/2017/09/27/effortless-encryption-with-lets-encrypt-and-duckdns/'>new instructions</a>. -</div> +{% endnote %} Exposing your Home Assistant instance outside of your network always has been tricky. You have to set up port forwarding on your router and most likely add a dynamic DNS service to work around your ISP changing your IP. After this you would be able to use Home Assistant from anywhere but there is one big red flag: no encryption. diff --git a/source/_posts/2016-02-11-classifying-the-internet-of-things.markdown b/source/_posts/2016-02-11-classifying-the-internet-of-things.markdown index 3fef64c8dfa7..91bf551bbf9d 100644 --- a/source/_posts/2016-02-11-classifying-the-internet-of-things.markdown +++ b/source/_posts/2016-02-11-classifying-the-internet-of-things.markdown @@ -28,7 +28,7 @@ We want our users to get the best home automation experience out there and this <th>Description</th> </tr> <tr> - <td><i class="icon-adjust"></i></td> + <td><iconify-icon icon="mdi:circle-half-full"></iconify-icon></td> <td style='white-space: nowrap;'>Assumed State</td> <td> We are unable to get the state of the device. Best we can do is to assume the state based on our last command. @@ -36,7 +36,7 @@ We want our users to get the best home automation experience out there and this </tr> <tr> - <td><i class="icon-cloud-upload"></i></td> + <td><iconify-icon icon="mdi:cloud-upload"></iconify-icon></td> <td>Cloud Polling</td> <td> Integration of this device happens via the cloud and requires an active internet connection. Polling the state means that an update might be noticed later. @@ -44,7 +44,7 @@ We want our users to get the best home automation experience out there and this </tr> <tr> - <td><i class="icon-cloud-download"></i></td> + <td><iconify-icon icon="mdi:cloud-download"></iconify-icon></td> <td>Cloud Push</td> <td> Integration of this device happens via the cloud and requires an active internet connection. Home Assistant will be notified as soon as a new state is available. @@ -52,7 +52,7 @@ We want our users to get the best home automation experience out there and this </tr> <tr> - <td><i class="icon-download-alt"></i></td> + <td><iconify-icon icon="mdi:download-network-outline"></iconify-icon></td> <td>Local Polling</td> <td> Offers direct communication with device. Polling the state means that an update might be noticed later. @@ -60,7 +60,7 @@ We want our users to get the best home automation experience out there and this </tr> <tr> - <td><i class="icon-upload-alt"></i></td> + <td><iconify-icon icon="mdi:upload-network-outline"></iconify-icon></td> <td>Local Push</td> <td> Offers direct communication with device. Home Assistant will be notified as soon as a new state is available. diff --git a/source/_posts/2016-05-26-ibeacons-how-to-track-things-that-cant-track-themselves-part-ii.markdown b/source/_posts/2016-05-26-ibeacons-how-to-track-things-that-cant-track-themselves-part-ii.markdown index 200a33e60326..8583cf89773c 100644 --- a/source/_posts/2016-05-26-ibeacons-how-to-track-things-that-cant-track-themselves-part-ii.markdown +++ b/source/_posts/2016-05-26-ibeacons-how-to-track-things-that-cant-track-themselves-part-ii.markdown @@ -34,9 +34,9 @@ So if you put an iBeacon on your keys or in your car - then you can track them. It’s easier to set up OwnTracks and HA to track a mobile beacon than the fixed beacon I discussed in Part 1, because you only need to tell OwnTracks about your iBeacon. You don’t need to configure HA at all. -<div class='note warning'> +{% warning %} OwnTracks currently only supports mobile beacons on iOS. -</div> +{% endwarning %} You set up the beacon the same way as we discussed in part 1. The only difference is that instead of calling the region the name of a location (eg -drive) you call it the name of the device you want to track (eg -keys). Remember the leading ‘-’ that makes the connection more reliable. diff --git a/source/_posts/2016-07-28-esp8266-and-micropython-part1.markdown b/source/_posts/2016-07-28-esp8266-and-micropython-part1.markdown index c993c4996461..7577fd3967c9 100644 --- a/source/_posts/2016-07-28-esp8266-and-micropython-part1.markdown +++ b/source/_posts/2016-07-28-esp8266-and-micropython-part1.markdown @@ -54,11 +54,11 @@ Type "help()" for more information. >>> ``` -<div class='note'> +{% note %} The public build of the firmware may be different than the firmware distributed to the backers of the Kickstarter campaign. Especially in regard of the [available modules](http://docs.micropython.org/en/latest/esp8266/quickref.html), turned on debug messages, and alike. Also, the WebREPL may not be started by default. -</div> +{% endnote%} Connect a LED to pin 5 (or another pin of your choosing) to check if the ESP8266 is working as expected. @@ -116,11 +116,11 @@ If you reboot, you should see your current IP address in the terminal. First let's create a little consumer for Home Assistant sensor's state. The code to place in `main.py` is a mixture of code from above and the [RESTful API](https://developers.home-assistant.io/docs/api/rest/) of Home Assistant. If the temperature in the kitchen is higher than 20 °C then the LED connected to pin 5 is switched on. -<div class='note'> +{% warning %} If a module is missing then you need to download it from the [MicroPython Library overview](https://github.com/micropython/micropython-lib) and upload it to the ESP8266 with `webrepl_cli.py` manually. -</div> +{% endwarning %} ```python # Sample code to request the state of a Home Assistant entity. diff --git a/source/_posts/2017-02-04-babyphone.markdown b/source/_posts/2017-02-04-babyphone.markdown index 8c094b2ff11e..829c532c944d 100644 --- a/source/_posts/2017-02-04-babyphone.markdown +++ b/source/_posts/2017-02-04-babyphone.markdown @@ -20,11 +20,9 @@ We need an IP camera that can capture sound in the baby's room. It is also possi Next, we attach a `ffmpeg_noise` binary sensor to our IP camera. The sensor has an output `option` that allows us to send the output to an [icecast2](http://icecast.org/) server for playing over speakers integrated with Home Assistant. We can use the binary sensor in our automation. You can ignore the icecast2 setup if you don't want to play the audio after the noise sensor trigger. -<div class='note'> - +{% note %} We change the platform name for binary sensor in 0.38 from `ffmpeg` to `ffmpeg_noise`. Also all service going to component and was rename from `binary_sensor.ffmpeg_xy` to `ffmpeg.xy`. - -</div> +{% endnote %} On Raspbian Jessie, you can setup [FFmpeg](/integrations/ffmpeg) and install an [icecast2](http://icecast.org/) server using: diff --git a/source/_posts/2017-05-01-home-assistant-on-raspberry-pi-zero-in-30-minutes.markdown b/source/_posts/2017-05-01-home-assistant-on-raspberry-pi-zero-in-30-minutes.markdown index 11fed002e758..662449c3e837 100644 --- a/source/_posts/2017-05-01-home-assistant-on-raspberry-pi-zero-in-30-minutes.markdown +++ b/source/_posts/2017-05-01-home-assistant-on-raspberry-pi-zero-in-30-minutes.markdown @@ -13,11 +13,11 @@ og_image: /images/blog/2017-05-hassbian-pi-zero/home_assistant_plus_rpi_600x315. <img src="/images/blog/2017-05-hassbian-pi-zero/home_assistant_plus_rpi_600x315.png" /> </p> -<div class='note warning'> +{% warning %} ***This article is very outdated*** guide. If you follow it you will be installing a very outdated version of Hassbian, on a hardware platform only suitable for testing. ***We strongly recommend you do not follow this article***. -</div> +{% endwarning %} Saw the [announcement](/blog/2017/04/30/hassbian-1.21-its-about-time/) yesterday for HASSbian 1.21 and got super excited? diff --git a/source/_posts/2017-05-20-automation-editor-zwave-panel-ocr.markdown b/source/_posts/2017-05-20-automation-editor-zwave-panel-ocr.markdown index 1a6d7b85b816..6b5db6cf0bbd 100644 --- a/source/_posts/2017-05-20-automation-editor-zwave-panel-ocr.markdown +++ b/source/_posts/2017-05-20-automation-editor-zwave-panel-ocr.markdown @@ -36,11 +36,11 @@ On the Z-Wave front a lot has happened. The biggest one is that we have a major </p> Thanks to the work by the Python Open Z-Wave team we are now able to install it on demand from PyPi! There is no longer a need to pre-compile it yourself. This should give us the guarantee that we work with the Python Open Z-Wave version that the code expects. -<div class='note warning'> +{% warning %} If you have a security key set in your Open Z-Wave `options.xml`, copy `options.xml` to your Home Assistant configuration directory. This is the only place where options will get persisted. -</div> +{% endwarning %} Next to that [@armills] has lead the charge and managed to get full test coverage for Z-Wave! Thanks for all the hard work! diff --git a/source/_posts/2017-06-20-things-you-should-know-about-senic-covi.markdown b/source/_posts/2017-06-20-things-you-should-know-about-senic-covi.markdown index 3f036bd83988..941dc6d6bb10 100644 --- a/source/_posts/2017-06-20-things-you-should-know-about-senic-covi.markdown +++ b/source/_posts/2017-06-20-things-you-should-know-about-senic-covi.markdown @@ -15,11 +15,11 @@ categories: Public-Service-Announcement *Original post:* <!--more--> -<div class='note'> +{% note %} TL;DR: We are not affiliated with Senic or their COVI product. We will not support their users and you will get a subpar Home Assistant experience by using their product. **Furthermore, we cannot guarantee stability or security if you use Senic products.** -</div> +{% endnote %} Recently Home Assistant has been made aware of a product by [Senic] that will be launching later today on [Kickstarter][kickstarter] ([screenshot][ks-backup]). Senic is not new in the IoT business, we have had support for their first product (Nuimo) since last September. Their new product, COVI, uses Home Assistant as its core home automation codebase. This is great, that is what open source is all about. However, they also use our name and logo in their Kickstarter, with the press and in their [developer documentation] ([screenshot][docs-backup]) to give the appearance of being affiliated with Home Assistant, against our wishes. Which is not great, at all. diff --git a/source/_posts/2017-08-12-release-51.markdown b/source/_posts/2017-08-12-release-51.markdown index 699d239dede4..5b1858296264 100644 --- a/source/_posts/2017-08-12-release-51.markdown +++ b/source/_posts/2017-08-12-release-51.markdown @@ -13,9 +13,9 @@ og_image: /images/blog/2017-08-0.51/components.png <a href='/integrations/#version/0.51'><img src='/images/blog/2017-08-0.51/components.png' style='border: 0;box-shadow: none;'></a> -<div class='note warning'> +{% important %} This release has to do a one time database migration which can take a long time on big databases (20 minutes). During this time the frontend will not work. Do not stop Home Assistant while it is in progress. -</div> +{% endimportant %} Release 0.51 is around the corner and it contains some really great updates. diff --git a/source/_posts/2017-09-25-new-hassio-build-system.markdown b/source/_posts/2017-09-25-new-hassio-build-system.markdown index c36f833953d7..864f355af9c8 100644 --- a/source/_posts/2017-09-25-new-hassio-build-system.markdown +++ b/source/_posts/2017-09-25-new-hassio-build-system.markdown @@ -7,9 +7,9 @@ author: Pascal Vizeli categories: Technology --- -<div class='note'> +{% note %} This is going to be a technical post for Hass.io add-on developers and people that run locally build add-ons (not the default). -</div> +{% endnote %} Two months ago we [introduced Hass.io][intro], allowing our users to easily install, update and manage their Home Assistant installation. In this short time we've seen great adoption from the community. Around 20% of our users are choosing Hass.io as their method of running Home Assistant today. We've also seen many add-ons being made available on [the forums][addon-repos]. There are currently 14 reposities full of add-ons being shared! @@ -17,11 +17,11 @@ Hass.io is built on top of Docker, a container runtime. One thing that Docker di This change only impacts people that build add-ons or use add-ons that are built locally. You can check if your add-on is building locally on the detail page of add-ons. -<div class='note'> +{% tip %} If you are an add-on developer, read [the documentation][publishing-addons] on how to publish your add-ons to Docker Hub. This will greatly improve the user experience. -</div> +{% endtip %} ### Template changes diff --git a/source/_posts/2017-11-18-release-58.markdown b/source/_posts/2017-11-18-release-58.markdown index aed37c86d4c7..4d3857a436ca 100644 --- a/source/_posts/2017-11-18-release-58.markdown +++ b/source/_posts/2017-11-18-release-58.markdown @@ -13,9 +13,9 @@ og_image: /images/blog/2017-11-0.58/components.png <a href='/integrations/#version/0.58'><img src='/images/blog/2017-11-0.58/components.png' style='border: 0;box-shadow: none;'></a> -<div class='note'> +{% note %} The Hass.io release of 0.58 will be delayed by a couple of days because Pascal is moving this weekend. -</div> +{% endnote %} ## Translation update @@ -38,9 +38,9 @@ frontend: javascript_version: latest ``` -<div class='note'> +{% important %} For Custom UI users: your custom UI will need to be updated before it can work with the new version of the frontend. -</div> +{% endimportant %} ### System log enhanced diff --git a/source/_posts/2018-08-17-release-76.markdown b/source/_posts/2018-08-17-release-76.markdown index b4ea6741b8a3..e0e645d97d07 100644 --- a/source/_posts/2018-08-17-release-76.markdown +++ b/source/_posts/2018-08-17-release-76.markdown @@ -11,9 +11,9 @@ categories: og_image: /images/blog/2018-08-0.76/components.png --- -<div class='note'> +{% note %} This release has a migration, initial startup can take ~20 minutes (depends on size DB) -</div> +{% endnote %} This release includes a database migration to allow us to store context in the database. This will make it possible in the future to introduce attribution. For example, we'll be able to say which user opened the garage door or which automation triggered the party mode at 3am. diff --git a/source/_posts/2018-10-01-release-79.markdown b/source/_posts/2018-10-01-release-79.markdown index c3674ae3a927..17e7fafb7b70 100644 --- a/source/_posts/2018-10-01-release-79.markdown +++ b/source/_posts/2018-10-01-release-79.markdown @@ -11,11 +11,9 @@ categories: og_image: /images/blog/2018-09-release-0.79/components.png --- -<div class='note'> - +{% note %} In case you missed it two weeks ago, check [our plans for the future](/blog/2018/09/17/thinking-big/). - -</div> +{% endnote %} <a href='/integrations/#version/0.79'><img src='/images/blog/2018-09-release-0.79/components.png' style='border: 0;box-shadow: none;'></a> diff --git a/source/_posts/2018-12-17-logitech-harmony-removes-local-api.markdown b/source/_posts/2018-12-17-logitech-harmony-removes-local-api.markdown index 9d7fdd124a0b..6dc41a2bb561 100644 --- a/source/_posts/2018-12-17-logitech-harmony-removes-local-api.markdown +++ b/source/_posts/2018-12-17-logitech-harmony-removes-local-api.markdown @@ -79,9 +79,9 @@ We will be releasing a hot fix today to migrate our integration to another local ### Reverting the software update -<div class='note'> +{% note %} If you're using Home Assistant, consider upgrading to 0.84.4 instead of downgrading your hub. -</div> +{% endnote %} If you have already updated your Harmony Hub to v4.15.206, you have probably noticed that Home Assistant and other products communicating with the local API have stopped working. Don’t worry, it’s (still?) possible to downgrade to a previous version using the following steps (source: [Reddit 1](https://www.reddit.com/r/homeassistant/comments/a6u6ep/psa_harmony_hub_firmware_v415206_breaksremoves/), [Reddit 2](https://www.reddit.com/r/homeassistant/comments/a6u6ep/psa_harmony_hub_firmware_v415206_breaksremoves/eby89t8/)): @@ -95,8 +95,8 @@ If you have already updated your Harmony Hub to v4.15.206, you have probably not 6. Steps 1-4 will be displayed for completing a Factory Reset. We are only doing Step 1. "Restore" here means "Rollback". 7. Connect your Harmony hub to the PC via micro-USB. Within a few minutes, it will be detected by MyHarmony and display Remote Model, Firmware Version, and Hardware revision. The Restore 1. button will be enabled. -8. Click "Restore" and wait. (Now is the first time that it actually describes that it's a rollback!) -9. When it completes, you should be on Firmware Version 4.15.193. Disconnect the hub from the PC and return it to its original location. +1. Click "Restore" and wait. (Now is the first time that it actually describes that it's a rollback!) +2. When it completes, you should be on Firmware Version 4.15.193. Disconnect the hub from the PC and return it to its original location. And the final, important step: eliminate the ability for the Harmony hub to access these domains, or the internet altogether. I used 1. DD-WRT's Access Restrictions feature to disable all internet access, because my specific implementation is entirely intranet-based. YMMV. - svcs.myharmony.com - content.dhg.myharmony.com diff --git a/source/_posts/2019-01-09-release-85.markdown b/source/_posts/2019-01-09-release-85.markdown index 2711923ffd31..61f5f7b4a965 100644 --- a/source/_posts/2019-01-09-release-85.markdown +++ b/source/_posts/2019-01-09-release-85.markdown @@ -13,11 +13,9 @@ og_image: /images/blog/2019-01-release-85/components.png <a href='/integrations/#version/0.85'><img src='/images/blog/2019-01-release-85/components.png' style='border: 0;box-shadow: none;'></a> -<div class='note warning'> - +{% warning %} Slugify changed, which can impact entity ID creation if the entities had names with either a `-` or characters outside of A-Z and the integration has no unique IDs. We now better handle the characters and substitute it with an alternative instead of removing that character. - -</div> +{% endwarning %} Read this breaking change warning? 👆 Good. Let's get started. This is the first release of 2019 and it covers a whopping 4 weeks, as we skipped the last release of the year to focus on friends and family. This is going to be a great year and we're planning a lot of cool stuff. If you haven't seen it yet, check the [State of the Union](/blog/2018/11/16/state-of-the-union/) to see what we have planned. diff --git a/source/_posts/2020-09-15-home-assistant-tags.markdown b/source/_posts/2020-09-15-home-assistant-tags.markdown index 10966220ba80..e7b17e55bafd 100644 --- a/source/_posts/2020-09-15-home-assistant-tags.markdown +++ b/source/_posts/2020-09-15-home-assistant-tags.markdown @@ -29,9 +29,9 @@ Thanks to [@David-Development](https://github.com/david-development) for the NFC <iframe width="853" height="480" src="https://www.youtube-nocookie.com/embed/Xc120lClUgA" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> </div> -<div class='note' data-title='for iPhone users'> +{% note %} Only iPhone XS, XR and iPhone 11 or later support background NFC tag reading. -</div> +{% endnote %} ## Standalone Tag Reader diff --git a/source/_posts/2021-03-18-nabu-casa-has-acquired-esphome.markdown b/source/_posts/2021-03-18-nabu-casa-has-acquired-esphome.markdown index b843abce42f9..096312e5e95e 100644 --- a/source/_posts/2021-03-18-nabu-casa-has-acquired-esphome.markdown +++ b/source/_posts/2021-03-18-nabu-casa-has-acquired-esphome.markdown @@ -18,7 +18,7 @@ Today I'm happy to announce that [ESPHome](https://esphome.io) is from now on un Otto started ESPHome three years ago to make programming ESP devices as easy as possible. With ESPHome, users write simple YAML files in which you describe what components are attached to what pins of the ESP device. ESPHome will then make this available in Home Assistant. No extra work necessary. Super simple. -{% details Example ESPHome configuration %} +{% details "Example ESPHome configuration" %} The following ESPHome YAML example will program your ESP device. When you plug it in, it will make the light on pin 16 available in Home Assistant. diff --git a/source/_posts/2021-08-24-supervisor-update.markdown b/source/_posts/2021-08-24-supervisor-update.markdown index 31f6f2f03010..40b58f87a348 100644 --- a/source/_posts/2021-08-24-supervisor-update.markdown +++ b/source/_posts/2021-08-24-supervisor-update.markdown @@ -22,9 +22,9 @@ The functionality of it does not change, this is just a rename to make it more u ## Supervised installations -<div class='note'> +{% note %} Having a supervisor does not make it a supervised installation, Home Assistant Operating System also has this, the information below does not apply to Home Assistant Operating System. -</div> +{% endnote %} While we try not to break supervised installations, we do have a few things we need to change. These adjustments you have to manually apply to your installation. Without these adjustments you will start to see warnings in your logs, and your installation will eventually be marked as unsupported. diff --git a/source/_posts/2022-06-01-release-20226.markdown b/source/_posts/2022-06-01-release-20226.markdown index dab203dcdceb..f20107847204 100644 --- a/source/_posts/2022-06-01-release-20226.markdown +++ b/source/_posts/2022-06-01-release-20226.markdown @@ -177,7 +177,7 @@ or a reminder 15 minutes before a meeting. <img class="no-shadow" src='/images/blog/2022-06/calendar-offset.png' alt='Screenshot showing the calendar trigger using an offset'> -<div class='note' data-title=" / Pro-tip!"> +{% tip %} <b>Use the calendar trigger to schedule anything in your home!</b><br> <br> Create a calendar and add events to it as a schedule, for example, for your @@ -186,7 +186,7 @@ or a reminder 15 minutes before a meeting. <br> This way, you can create complex schedules with repeating patterns and schedule exceptions, with the ease of using your calendar. -</div> +{% endtip %} ## Improved scene editor diff --git a/source/_posts/2023-12-06-release-202312.markdown b/source/_posts/2023-12-06-release-202312.markdown index 750f3a8b5474..c77c89d1b081 100644 --- a/source/_posts/2023-12-06-release-202312.markdown +++ b/source/_posts/2023-12-06-release-202312.markdown @@ -70,12 +70,10 @@ Don't forget to [join our release party live stream on YouTube](https://www.yout ## A beautiful new login page -<div class='note'> - +{% note %} This feature has been disabled in Home Assistant 2023.12.3. [Read more about it here](/blog/2023/12/14/disabling-new-login-page-functionality/). - -</div> +{% endnote %} The login page of Home Assistant has been redesigned to be more modern and diff --git a/source/_posts/2024-03-04-dashboard-chapter-1.markdown b/source/_posts/2024-03-04-dashboard-chapter-1.markdown index 054af96181fb..245f64728843 100644 --- a/source/_posts/2024-03-04-dashboard-chapter-1.markdown +++ b/source/_posts/2024-03-04-dashboard-chapter-1.markdown @@ -88,9 +88,9 @@ For our new Sections view, we are making these sections as the base unit of the ### Getting started with Sections -<div class='note warning'> - The new Sections view is experimental! Please do not build your daily dashboard on top of it yet! -</div> +{% warning %} +The new Sections view is experimental! Please do not build your daily dashboard on top of it yet! +{% endwarning %} <p class='img'> <img width="66%" src="/images/blog/2024-03-dashboard-chapter-1/sections-create-new-view.png" alt="The Create New View configuration screen"/> @@ -99,9 +99,9 @@ For our new Sections view, we are making these sections as the base unit of the To get started with the new Sections view, create a new view on your dashboard and choose **Sections (experimental)** as the view type. We currently do not have the option to migrate your current dashboard over yet. -<div class='note info'> - If you are using the default dashboard, please read about how to <a href="/dashboards/#get-started-with-your-own-dashboard">create a new dashboard</a>. -</div> +{% note %} +If you are using the default dashboard, please read about how to <a href="/dashboards/#get-started-with-your-own-dashboard">create a new dashboard</a>. +{% endnote %} <p class='img'> <img src="/images/blog/2024-03-dashboard-chapter-1/sections-blank-sections-view.png" alt="A new dashboard view laid out in Sections"/> diff --git a/source/_posts/2024-03-06-release-20243.markdown b/source/_posts/2024-03-06-release-20243.markdown index cfb97237b577..d00d4489bfe5 100644 --- a/source/_posts/2024-03-06-release-20243.markdown +++ b/source/_posts/2024-03-06-release-20243.markdown @@ -114,9 +114,9 @@ of a section by default at the moment. Moreover, we have tweaked our "Add Cards" dialogs to recommend Tile cards by default when the sections view type is in use. -<div class='note warning'> - The new Sections view is experimental! Please do not build your daily dashboard on top of it yet! We are releasing this early so that we can collect your feedback. -</div> +{% warning %} +The new Sections view is experimental! Do not build your daily dashboard on top of it yet! We are releasing this early so that we can collect your feedback. +{% endwarning %} To get started with the new Sections view type, create a new view on your dashboard and select **Sections (experimental)** as the view type. diff --git a/source/_posts/2024-05-09-music-assistant-2.markdown b/source/_posts/2024-05-09-music-assistant-2.markdown index 0b6d8785b13f..37ff03adee43 100644 --- a/source/_posts/2024-05-09-music-assistant-2.markdown +++ b/source/_posts/2024-05-09-music-assistant-2.markdown @@ -11,7 +11,7 @@ og_image: /images/blog/2024-05-music-assistant/art.jpg --- <p><img src='/images/blog/2024-05-music-assistant/art.jpg' class='no-shadow' /></p> -Today, exactly five years ago, I, Marcel, started working on [Music Assistant <i class="icon-external-link"></i>](https://music-assistant.io/). What began as a quick script, to sync my playlists so I could switch between streaming providers, grew into a beast on its own. +Today, exactly five years ago, I, Marcel, started working on [Music Assistant](https://music-assistant.io/). What began as a quick script, to sync my playlists so I could switch between streaming providers, grew into a beast on its own. Music Assistant is what I’d like to call a “music library manager” – it gives you full control of playing YOUR music on your players. Just like Home Assistant centralizes all your devices and services to work together, Music Assistant does the same with your music sources and smart audio-playing devices. @@ -28,9 +28,9 @@ To just play with Music Assistant without reading what it is (yes, we know you!) <p class="img"><img src='/images/blog/2024-05-music-assistant/how-it-works.jpg'/>From source to Music Assistant to speaker</p> #### Connect and play anywhere -Music Assistant allows you to quickly connect some of the <a href="https://music-assistant.io/music-providers/">most popular streaming providers <i class="icon-external-link"></i></a> like Spotify and Tidal, with your local media files. Importing your liked tracks, artists, albums, and playlists, all displayed with the correct artwork. +Music Assistant allows you to quickly connect some of the <a href="https://music-assistant.io/music-providers/">most popular streaming providers</a> like Spotify and Tidal, with your local media files. Importing your liked tracks, artists, albums, and playlists, all displayed with the correct artwork. -It supports the most ubiquitous <a href="https://music-assistant.io/player-support/">streaming protocols and devices <i class="icon-external-link"></i></a> like Airplay, Cast and DLNA, letting you play media on almost any device - if an old speaker doesn’t support new services, Music Assistant can bring it back to life. +It supports the most ubiquitous <a href="https://music-assistant.io/player-support/">streaming protocols and devices</a> like Airplay, Cast and DLNA, letting you play media on almost any device - if an old speaker doesn’t support new services, Music Assistant can bring it back to life. [Read more...](#freedom-of-choice) @@ -53,11 +53,11 @@ After many years of development and testing with the amazing community, we can f <p class="img"><img src='/images/blog/2024-05-music-assistant/start-me-up.png'/></p> -Even though Music Assistant is an HA Add-on, it can be installed from start to finish via [HACS <i class="icon-external-link"></i>](https://hacs.xyz/). You simply install the integration, which will automatically install and manage the add-on for you. The integration allows you to control your devices with automations and voice control. +Even though Music Assistant is an HA Add-on, it can be installed from start to finish via [HACS](https://hacs.xyz/). You simply install the integration, which will automatically install and manage the add-on for you. The integration allows you to control your devices with automations and voice control. {% my supervisor_addon badge addon="d5369777_music_assistant" repository_url="https://github.com/music-assistant/home-assistant-addon" %} -_Music Assistant is distributed as a <a href="https://www.home-assistant.io/addons">Home Assistant add-on</a> – our way to easily extend your Home Assistant installation with third party applications. To install it as a Docker container, follow the <a href="https://music-assistant.io/installation/#tertiary-installation-method-docker-image">MA installation instructions <i class="icon-external-link"></i></a>._ +_Music Assistant is distributed as a <a href="https://www.home-assistant.io/addons">Home Assistant add-on</a> – our way to easily extend your Home Assistant installation with third party applications. To install it as a Docker container, follow the <a href="https://music-assistant.io/installation/#tertiary-installation-method-docker-image">MA installation instructions</a>._ ## Fight the power <h3 style="margin-top: -1em; opacity: .67;">Why Music Assistant?</h3> @@ -103,7 +103,7 @@ When you search in Music Assistant, it searches all your libraries. Every stream ## We are family <h3 style="margin-top: -1em; opacity: .67;">Built for Home Assistant</h3> -Music Assistant has always been closely linked to Home Assistant (more on that below). I now even work for [Nabu Casa <i class="icon-external-link"></i>](https://www.nabucasa.com/), partly because of my work on Music Assistant (but now I’m the Matter guy).  +Music Assistant has always been closely linked to Home Assistant (more on that below). I now even work for [Nabu Casa](https://www.nabucasa.com/), partly because of my work on Music Assistant (but now I’m the Matter guy).  <p class="img"><img src='/images/blog/2024-05-music-assistant/we-are-family.png'/></p> @@ -111,9 +111,9 @@ Because of this strong link, Home Assistant seamlessly links with Music Assistan ## Liner notes -So, I started working on Music Assistant [exactly five years ago <i class="icon-external-link"></i>](<https://github.com/music-assistant/server/commit/75adea9721fa1f1b7225515087c81edd979fcc8f>), at first for my own personal use. It started as a learning exercise - thanks to it, I learned asyncio Python programming as well as the Vue frontend framework. I had the project on GitHub just to host the code, but it was not really meant to be used by others. +So, I started working on Music Assistant [exactly five years ago](<https://github.com/music-assistant/server/commit/75adea9721fa1f1b7225515087c81edd979fcc8f>), at first for my own personal use. It started as a learning exercise - thanks to it, I learned asyncio Python programming as well as the Vue frontend framework. I had the project on GitHub just to host the code, but it was not really meant to be used by others. -At some point, it became clear to me that there was a real demand, and I posted some info on how to install it, which gained a little attention. In June 2022, we released the 1.0 version of Music Assistant, and it was still in rough shape but already suitable for many users. We even organized a Livestream, “[Let’s get Loud <i class="icon-external-link"></i>](https://www.youtube.com/watch?v=SEH-DxOsywg)” hosted by Home Assistant, to promote [audio support for ESPHome <i class="icon-external-link"></i>](https://esphome.io/components/media_player/i2s_audio.html) and the super cool things you can build when you combine these three open-source projects. +At some point, it became clear to me that there was a real demand, and I posted some info on how to install it, which gained a little attention. In June 2022, we released the 1.0 version of Music Assistant, and it was still in rough shape but already suitable for many users. We even organized a Livestream, “[Let’s get Loud](https://www.youtube.com/watch?v=SEH-DxOsywg)” hosted by Home Assistant, to promote [audio support for ESPHome](https://esphome.io/components/media_player/i2s_audio.html) and the super cool things you can build when you combine these three open-source projects. Version 1.0 was not everything we hoped it would be. It had some structural bugs, specifically running as a custom component in Home Assistant. HA was created to give you the best experience for automating your home; it was never optimized for real-time audio streaming. On top of that, at some point, the dependencies of both projects got so conflicted that Music Assistant stopped working completely in the March 2023 release of HA. @@ -121,6 +121,6 @@ Six months after its initial version 1.0 launch, the project was beginning to lo So, the Music Assistant Server was born. It is a standalone application that you can run in docker (or Home Assistant add-on), all connected to HA via a HACS integration. The project was split up into multiple self-contained parts.  -Music Assistant Server has its own web interface, a modern interface written in Vue. Thanks to HA's add-on system, this web interface can be securely accessed from HA. The web interface is a Progressive Web App (PWA), so you can also visit it directly and [install it on your device <i class="icon-external-link"></i>](https://support.google.com/chrome/answer/9658361?hl=en-GB&co=GENIE.Platform=Desktop). We also have an (experimental) [desktop app <i class="icon-external-link"></i>](https://music-assistant.io/companion-app/). +Music Assistant Server has its own web interface, a modern interface written in Vue. Thanks to HA's add-on system, this web interface can be securely accessed from HA. The web interface is a Progressive Web App (PWA), so you can also visit it directly and [install it on your device](https://support.google.com/chrome/answer/9658361?hl=en-GB&co=GENIE.Platform=Desktop). We also have an (experimental) [desktop app](https://music-assistant.io/companion-app/). Over the past year, we have been iterating on this with an impressive number of beta testers. So, while technically this is a 2.0 release, to me personally this is the first real release, as this is finally something that feels good and has the right foundation. What is also super is that we attracted contributors to the project, folks helping create and maintain music integrations while providing support or translations. Even more exciting there are some really big features and streaming services on the horizon. My sincere thanks to everyone who has helped bring this release home. diff --git a/source/_posts/2024-06-05-release-20246.markdown b/source/_posts/2024-06-05-release-20246.markdown index b59967029d11..473c57862ac3 100644 --- a/source/_posts/2024-06-05-release-20246.markdown +++ b/source/_posts/2024-06-05-release-20246.markdown @@ -68,6 +68,7 @@ Enjoy the release! - [2024.6.1 - June 7](#202461---june-7) - [2024.6.2 - June 11](#202462---june-11) - [2024.6.3 - June 15](#202463---june-15) + - [2024.6.4 - June 21](#202464---june-21) - [Need help? Join the community!](#need-help-join-the-community) - [Backward-incompatible changes](#backward-incompatible-changes) - [All changes](#all-changes) @@ -800,6 +801,82 @@ every Friday. [@starkillerOG]: https://github.com/starkillerOG [@tronikos]: https://github.com/tronikos +### 2024.6.4 - June 21 + +- UniFi temp fix to handle runtime data ([@Kane610] - [#120031]) +- Fix for Synology DSM shared images ([@lodesmets] - [#117695]) +- Fix Jewish Calendar unique id migration ([@tsvi] - [#119683]) +- Fix model import in Spotify ([@jjlawren] - [#119747]) +- Add Kasa Dimmer to Matter TRANSITION_BLOCKLIST ([@dubstomp] - [#119751]) +- Bump py-canary to v0.5.4 ([@0bmay] - [#119793]) +- Pin tenacity to 8.3.0 ([@cdce8p] - [#119815]) +- Bump aiozoneinfo to 0.2.0 ([@bdraco] - [#119845]) +- Fix up ecobee windspeed unit ([@bjpetit] - [#119870]) +- Bump hdate to 0.10.9 ([@tsvi] - [#119887]) +- Bump weatherflow4py to 0.2.21 ([@jeeftor] - [#119889]) +- Bump babel to 2.15.0 ([@gjohansson-ST] - [#119006]) +- Bump python-holidays to 0.51 ([@gjohansson-ST] - [#119918]) +- Fix Onkyo zone volume ([@arturpragacz] - [#119949]) +- Bump plugwise to v0.37.4.1 ([@bouwew] - [#119963]) +- Always create a new HomeAssistant object when falling back to recovery mode ([@emontnemery] - [#119969]) +- Fix Hydrawise volume unit bug ([@thomaskistler] - [#119988]) +- Fix songpal crash for soundbars without sound modes ([@BestPig] - [#119999]) +- Bump env-canada to 0.6.3 ([@gwww] - [#120035]) +- Bump aioimaplib to 1.1.0 ([@jbouwh] - [#120045]) +- Update AEMET-OpenData to v0.5.2 ([@Noltari] - [#120065]) +- Bump intents to 2024.6.21 ([@synesthesiam] - [#120106]) +- Update pydrawise to 2024.6.4 ([@thomaskistler] - [#119868]) + +[#117695]: https://github.com/home-assistant/core/pull/117695 +[#118400]: https://github.com/home-assistant/core/pull/118400 +[#119006]: https://github.com/home-assistant/core/pull/119006 +[#119096]: https://github.com/home-assistant/core/pull/119096 +[#119376]: https://github.com/home-assistant/core/pull/119376 +[#119683]: https://github.com/home-assistant/core/pull/119683 +[#119742]: https://github.com/home-assistant/core/pull/119742 +[#119747]: https://github.com/home-assistant/core/pull/119747 +[#119751]: https://github.com/home-assistant/core/pull/119751 +[#119793]: https://github.com/home-assistant/core/pull/119793 +[#119815]: https://github.com/home-assistant/core/pull/119815 +[#119845]: https://github.com/home-assistant/core/pull/119845 +[#119868]: https://github.com/home-assistant/core/pull/119868 +[#119870]: https://github.com/home-assistant/core/pull/119870 +[#119887]: https://github.com/home-assistant/core/pull/119887 +[#119889]: https://github.com/home-assistant/core/pull/119889 +[#119918]: https://github.com/home-assistant/core/pull/119918 +[#119949]: https://github.com/home-assistant/core/pull/119949 +[#119963]: https://github.com/home-assistant/core/pull/119963 +[#119969]: https://github.com/home-assistant/core/pull/119969 +[#119988]: https://github.com/home-assistant/core/pull/119988 +[#119999]: https://github.com/home-assistant/core/pull/119999 +[#120028]: https://github.com/home-assistant/core/pull/120028 +[#120031]: https://github.com/home-assistant/core/pull/120031 +[#120035]: https://github.com/home-assistant/core/pull/120035 +[#120045]: https://github.com/home-assistant/core/pull/120045 +[#120065]: https://github.com/home-assistant/core/pull/120065 +[#120106]: https://github.com/home-assistant/core/pull/120106 +[@0bmay]: https://github.com/0bmay +[@BestPig]: https://github.com/BestPig +[@Kane610]: https://github.com/Kane610 +[@Noltari]: https://github.com/Noltari +[@arturpragacz]: https://github.com/arturpragacz +[@bdraco]: https://github.com/bdraco +[@bjpetit]: https://github.com/bjpetit +[@bouwew]: https://github.com/bouwew +[@cdce8p]: https://github.com/cdce8p +[@dubstomp]: https://github.com/dubstomp +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gwww]: https://github.com/gwww +[@jbouwh]: https://github.com/jbouwh +[@jeeftor]: https://github.com/jeeftor +[@jjlawren]: https://github.com/jjlawren +[@lodesmets]: https://github.com/lodesmets +[@synesthesiam]: https://github.com/synesthesiam +[@thomaskistler]: https://github.com/thomaskistler +[@tsvi]: https://github.com/tsvi + ## Need help? Join the community! Home Assistant has a great community of users who are all more than willing diff --git a/source/_posts/2024-06-26-voice-chapter-7.markdown b/source/_posts/2024-06-26-voice-chapter-7.markdown new file mode 100644 index 000000000000..64c6aad513c9 --- /dev/null +++ b/source/_posts/2024-06-26-voice-chapter-7.markdown @@ -0,0 +1,123 @@ +--- +layout: post +title: "Voice Chapter 7 - Supercharged wake words and timers" +description: "MicroWakeWord v2 brings huge improvements, and we introduce advanced timers." +date: 2024-06-26 00:00:01 +date_formatted: "June 26, 2024" +author: Mike Hansen +comments: true +categories: Assist +og_image: /images/blog/2024-06-voice-chapter-7/art.jpg +--- +This chapter might be one of the most feature-packed yet, bringing the highly requested timer feature and major improvements to wake words, along with experimental technology that even outclasses big tech's voice assistants. + +<lite-youtube videoid="nLLO4u2Tbbo" videotitle="Voice - Chapter 7 live stream"></lite-youtube> + +Welcome to Voice Chapter 7, on today's menu: + +- [Big things for microWakeWord](#big-things-for-microwakeword) +- [Timers are here!](#timers-are-here) +- [Timers control devices](#timers-control-devices) +- [AI in control](#ai-in-control) +- [Expand an LLM with scripts](#expand-an-llm-with-scripts) +- [Enhanced Media Control](#enhanced-media-control) +- [Easier updates for your voice assistant](#easier-updates-for-your-voice-assistant) + +<!--more--> + +## Big things for microWakeWord + +At the beginning of this year wake word detection could only run on Home Assistant itself. Voice devices would pass on all audio to Home Assistant, which would listen out for supported wake words like "Hey Jarvis" or "Okay Nabu".  This had the downside that your device, let's say a Raspberry Pi, could only support a handful of voice satellites, and there would always be a delay in responses. We knew the benefits of wake word detection running on-device, but there was a lack of good open source options. + +[Kevin Ahrendt](https://github.com/kahrendt), a former mathematics professor, took up the task and created [microWakeWord](https://github.com/kahrendt/microWakeWord) in his spare time. It is a wake word engine optimized to run fast and reliably on microcontrollers. It was made for ESPHome, but it is available standalone and under the Apache 2.0 open source license. No one will ever have to pay for wake words ever again. + +In our [Chapter 6 Livestream](https://www.youtube.com/live/NQIv3nsu7dE?si=9RZy-LpcRLiMjGg3&t=863) we did a deep dive into how this voice processing is possible on such lean hardware (we're talking late-90s PC levels of RAM and CPU power). It was in this last chapter where we launched [v1 of microWakeWord](/blog/2024/02/21/voice-chapter-6/), which at the time could only run on ESP32-S3 chips. A lot has happened since then, and it's all *awesome*. + +### microWakeWord and Kevin join the team <!-- omit in toc --> + +We are proud to announce that microWakeWord has become a collaboration partner of the [Open Home Foundation](https://www.openhomefoundation.org/) (OHF). The foundation owns and supports Home Assistant, ESPHome, and our Text-to-Speech engine, Piper. The collaboration partner status recognizes microWakeWord as an important technology for the Open Home. + +Nabu Casa, the company behind Home Assistant Cloud, has no investors and its sole purpose is to serve the Open Home Foundation. The money it earns is used to hire developers to work on Home Assistant and other Open Home projects. They have been a driving force behind voice development and are building their own [ESPHome-based voice hardware](/blog/2024/06/12/roadmap-2024h1/#current-priority-2-make-assist-easier-to-start-with), to allow anyone to enjoy a privacy-focused voice assistant. + +Kevin's contributions have already been incredibly valuable to our work with Voice. That's why we're super stoked to announce that Kevin has joined Nabu Casa, where he will initially focus on microWakeWord and voice handling in ESPHome. + +To support this work on Home Assistant, ESPHome, voice assistants, and more, consider subscribing to [Home Assistant Cloud](https://www.nabucasa.com/). + +### 3x wake words and 2x accuracy <!-- omit in toc --> + +Kevin has been hard at work on improving microWakeWord, and we're happy to announce version 2, which will be included in the next ESPHome release. It runs a lot faster and with improved accuracy. + +<p class='img'><lite-youtube videoid="LbS3Udx36H8" videotitle="Multiple wake words on a single esp32 device"></lite-youtube> +$13 Atom Echo running two wake words on-device!</p> + +When we say the new model is faster, we mean a lot faster. Not only does it now run on the normal ESP32 chips, those chips can now run **three wake words at the same time**! We haven't added this feature to Home Assistant yet, but expect to be able to trigger your Dutch and English voice assistants, each with their own wake words. + +The new performance doesn't come at the cost of accuracy - it's the opposite. **The new model performs twice as well** as microWakeWord v1, especially when you take advantage of its [voice activity detection](https://en.wikipedia.org/wiki/Voice_activity_detection) feature. We would love to benchmark our models against commercial competitors, but "false acceptances per hour" are considered by most companies to be a trade secret and not published. + +<img src='/images/blog/2024-06-voice-chapter-7/mWW-v1-vs-v2.png' style='border: 0;box-shadow: none;' alt="Picovoice benchmark microWakeWord v1 vs v2"> + +The graph above gives the results from the Picovoice benchmark, which uses hundreds of samples of the wake word from real speakers spread out over 24 hours with realistic background noise mixed in. Spoken English sentences that don't contain the wake word are layered in to test false acceptances, ie. triggering when the wake word wasn't actually said. We can increase the model's confidence level, which makes it less likely to have a false trigger, but also less likely to accept a wake word. Across the board v2 outperforms v1, and in good circumstances it outperforms v1 by nearly double! + +Next for microWakeWord is to improve the accuracy for non-native English speakers. It will require us to collect recordings of people around the world saying the wake words. We're working on a website to allow anyone to easily participate directly from their phone. + +## Timers are here! + +Ask and you shall receive - in February this year [we asked our community](https://community.home-assistant.io/t/poll-what-do-you-use-your-voice-assistant-for-what-do-you-expect-it-to-do-multiple-selections/693669) what features they want from a voice assistant, and next to controlling devices and responding to wake words, timers were the third most requested. This is just one example of how [our roadmap](/blog/2024/06/12/roadmap-2024h1/) is helping us spot gaps and build solutions. + +First the important bits: **yes, you can have multiple timers**. These short-lived timers allow users to be reminded of something after a period of time. For example, if you're boiling eggs, you can set a timer to remind you to take the eggs out. Each timer has a duration, and optionally a name. + +Users can use their voice to create, cancel, pause, resume, and change the duration of a timer: + + - "Create a timer for 5 minutes" + - "Create a 15-minute timer for pizza" + - "Cancel my timer" + - "Add 2 minutes to my 5-minute timer" + - "Subtract 3 minutes from my pizza timer" + +When you give timers a name, it is easier to distinguish when you have multiple running as you can now reference it by name or duration ("cancel pizza timer" or "cancel 15-minute timer"). + +<p class='img'><lite-youtube videoid="v3mNdTsX4J0" videotitle="Voice timers with countdown text and loading bar"></lite-youtube>Timers running on an S3 Box, with countdown text and a loading bar!</p> + +Timers are available today on ESPHome and Wyoming voice satellites that are connected to the latest version of Home Assistant. If you use the firmware we provided for the Atom Echo Dev Kit or the ESP32-S3 Box 3, update to the latest version for timer support. + +## Timers control devices + +While working on timers, we thought: why limit our users to just playing a beeping sound after the clock ticks down. What if any command could be executed with a timed delay? + +<p class='img'><lite-youtube videoid="rgf5t3vn7TQ" videotitle="Using timers to control devices"></lite-youtube>A timer controlling a light</p> + +That's why in this release, users can now allow **any voice command** to be executed with a timed delay: "turn off the lights in 10 minutes". When the time is up, the text of the voice command is processed by the same voice assistant that heard the delayed command. Just be careful, unlike regular voice timers, these delayed commands cannot be canceled or modified. + + - Turn off the lights in 5 minutes + - Pause TV in 10 minutes + - Open the blinds in 5 minutes + +Large language models (LLMs) are also able to create delayed commands, for instance saying "I'm going to bed early tonight", might lead the LLM to send itself a delayed command to start the bedtime routine sooner. + +## AI in control + +Speaking of LLMs, our Home Assistant 2024.6 update allows [AI agents to control your devices](/blog/2024/06/05/release-20246/#voice--assist). This is part of our broader AI strategy we outlined [in a recent blog](/blog/2024/06/07/ai-agents-for-the-smart-home/). It will be an important part of the future smart home, and Home Assistant will be the best platform for AI because of its focus on privacy and choice. We know it is not for everyone, nor is it ready for mass adoption, but we are making it available to experiment with. Give it a try on your voice hardware today, with device control currently available on both [Google AI](/integrations/google_generative_ai_conversation/) and [OpenAI](/integrations/openai_conversation/). + +## Expand an LLM with scripts + +To make it easier to expand the things that LLMs can do, Home Assistant 2024.7 (coming next week), will allow LLMs to access approved scripts. This lets you precisely control what the LLM will do in specific situations while retaining flexibility and natural language processing AI's are so good at. + +<img src='/images/blog/2024-06-voice-chapter-7/voice-script.png' alt="Exposing voice scripts to Assist in Home Assistant Voice settings" class='no-shadow'> + +For example, telling an LLM conversation agent that you're leaving the house may result in some unexpected behavior, such as turning off devices you want to be left on. To fix this, create a "leaving home" script that does exactly what you want and expose it to Assist. You could also add fields into the script, which help further guide the LLM, like giving it different behaviors for short or long trips away from home. Now when you say something like "I'm heading out for a couple of minutes", using the script it will lock the door, but not turn off the air conditioning. + +## Enhanced Media Control + +Assist can now control media players with simple commands like "pause", "resume", "next", and "set volume to 100%". While simple on the surface, a lot of complexity is hidden underneath. Consider a living room with two media players: a smart speaker that is paused and a TV that is playing. If the user says "pause", the TV will be paused since it is the only media player that is currently playing. However, if the user then says "resume", Assist will only resume the TV because it was the last media player paused. + +<p class='img'><lite-youtube videoid="pFmwY-k5IcU" videotitle="Demo of media player commands of Home Assistant Assist"></lite-youtube>Media control in action</p> + +Media players can be targeted by name ("pause TV") or by area ("resume music in the kitchen"). When not provided, the area and floor of the voice satellite are used to determine which media player(s) to target. So "pause" will look for media players that are playing in the current area, followed by the current floor. + +## Easier updates for your voice assistant + +Our voice satellites are powered by ESPHome, our open source framework for making private, secure, and reliable smart home devices of all kinds. We are regularly improving our voice capabilities in updates and we want our users to have easy access to these new features. + +With the latest version of ESPHome we have introduced [Over-the-Air updates](https://esphome.io/changelog/2024.6.0.html#ota-platforms). Following our upcoming Home Assistant 2024.7 release, users building a [ready-made voice satellite projects](https://esphome.io/projects/?type=voice) (such as the Atom Echo or S3 Box), will be able to update the device directly from Home Assistant without requiring the ESPHome add-on. These devices can download their firmware directly from the web, no building required. + +*If you stuck around all the way to the end, don't forget to check out the [Chapter 7 live stream](https://www.youtube.com/watch?v=nLLO4u2Tbbo) for even more on voice!* \ No newline at end of file diff --git a/source/_posts/2024-07-03-release-20247.markdown b/source/_posts/2024-07-03-release-20247.markdown new file mode 100644 index 000000000000..a765abbb957d --- /dev/null +++ b/source/_posts/2024-07-03-release-20247.markdown @@ -0,0 +1,1074 @@ +--- +layout: post +title: "2024.7: Time to resize your cards!" +description: "Home Assistant 2024.7! With timers support for Assist, resize cards on your dashboard, expose scripts to OpenAI ChatGPT and Google Gemini, taking control of blueprint-based automations, and much more." +date: 2024-07-03 00:00:00 +date_formatted: "July 3, 2024" +author: Franck Nijhof +author_twitter: frenck +comments: true +categories: + - Release-Notes + - Core +og_image: /images/blog/2024-07/social.png +--- + +<a href='/integrations/#version/2024.7'><img src='/images/blog/2024-07/social.png' style='border: 0;box-shadow: none;'></a> + +Home Assistant 2024.7! 🎉 + +Get ready for a really nice release with something interesting for everyone! 🤗 + +And not just that, I bring you these release notes from our refreshed website 🤩 +that [Madelena] and [yours truly] have been spontaneously working on over the +past few days. We hope you like it! ❤️ + +Some fantastic additions to [Assist](/voice_control): Timers! +and the ability to expose your scripts to LLMs. In case you missed it, +it has been covered and demonstrated live in our recent +[Voice - Chapter 7 livestream!](https://www.youtube.com/watch?v=nLLO4u2Tbbo) +which you definitely should watch. 📺 + +The [sections view](/dashboards/sections/) becomes more feature-rich with +every release, and this time, the [ability to resize cards](#resize-the-cards-on-your-dashboard) +is added. Absolutely the highlight of the release for me! + +My second favorite highlight for this release is the ability to +[take control of blueprint-based automations](#take-control-of-blueprint-based-automations). +There are so many [amazing blueprints out there](https://community.home-assistant.io/c/blueprints-exchange/53/l/top?period=yearly), +and many are perfect, but sometimes they fit 90% of what you need. Being able +to take control of that last 10% is just amazing! + +Enjoy the release! + +../Frenck + +[yours truly]: https://github.com/frenck +[Madelena]: https://github.com/Madelena + +<!--more--> + +- [Resize the cards on your dashboard](#resize-the-cards-on-your-dashboard) +- [Data tables improvements](#data-tables-improvements) +- [Voice \& Assist](#voice--assist) + - [Timers are here!](#timers-are-here) + - [Expand an LLM using your scripts](#expand-an-llm-using-your-scripts) +- [Take control of blueprint-based automations](#take-control-of-blueprint-based-automations) +- [Integrations](#integrations) + - [New integrations](#new-integrations) + - [Noteworthy improvements to existing integrations](#noteworthy-improvements-to-existing-integrations) + - [Integrations reaching platinum quality level](#integrations-reaching-platinum-quality-level) + - [Now available to set up from the UI](#now-available-to-set-up-from-the-ui) + - [Farewell to the following](#farewell-to-the-following) +- [ESPHome update entities for ready-made projects](#esphome-update-entities-for-ready-made-projects) +- [Other noteworthy changes](#other-noteworthy-changes) + - [Link your template entity to an existing device](#link-your-template-entity-to-an-existing-device) + - [Change the radius of your home zone](#change-the-radius-of-your-home-zone) +- [Patch releases](#patch-releases) + - [2024.7.1 - July 5](#202471---july-5) + - [2024.7.2 - July 10](#202472---july-10) +- [Need help? Join the community!](#need-help-join-the-community) +- [Backward-incompatible changes](#backward-incompatible-changes) +- [All changes](#all-changes) + +Don't forget to [join our release party live stream on YouTube](https://www.youtube.com/watch?v=Snk6oslMQFc) +3 July 2024, at 20:00 GMT / 12:00 PST / 21:00 CEST! + +<lite-youtube videoid="Snk6oslMQFc" videotitle="Home Assistant 2024.7 Release Party"></lite-youtube> + +## Resize the cards on your dashboard + +As [part of our roadmap](/blog/2024/06/12/roadmap-2024h1/#dashboards), we're +continuing to make dashboard organization and customization easier and more +intuitive. This month, we add the ability to [resize the cards] on your +dashboard! + +<img src='/images/blog/2024-07/dashboard-resize-cards-example.png' style='border: 0;box-shadow: none;' alt='Screenshot showing several cards at different sizes.'> + +Resizing is done with a very nice slider interface, found in the card editing +menu under the new **Layout** tab, where you can preview your changes. Make +small 1x1 buttons or give a [map] the space it needs. This is only available on +our experimental [sections view], which was recently released with drag-and-drop. + +<img src='/images/blog/2024-07/dashboard-resize-card.png' style='border: 0;box-shadow: none;' alt='Screenshot showing the card edit diaglog, with the new layout tag and its card resize capabilities.'> + +It works with [every card], which gives users a lot of freedom. Most cards have +been given a built-in minimum and maximum size, to make it easier to get your +layouts just right. If you mess up the look of a card, luckily we have included +a revert button {% icon "mdi:restore" %} in the +top left corner 😉. + +[every card]: /dashboards/cards/ +[map]: /dashboards/map/ +[part of our roadmap]: /blog/2024/06/12/roadmap-2024h1/#dashboards +[resize the cards]: /dashboards/cards/#resizing-a-card +[sections view]: /blog/2024/03/06/release-20243/#a-new-experimental-sections-view + +## Data tables improvements + +Like the [last release] and [release before that], we keep improving our data +tables. We use data tables to organize information in our settings pages, +including our devices and automations pages. + +With this release, we add the final big piece of the puzzle: The ability to +customize the columns shown! 😎 + +<img src='/images/blog/2024-07/data-tables-customize-columns.png' style='border: 0;box-shadow: none;' alt='Screenshot showing the dialog that allow customizing the order and visibility of data table columns available on the device page.'> + +By selecting the cog {% icon "mdi:cog" %} in +the top right, you can not only customize the columns shown by toggling +visibility {% icon "mdi:eye" %}, but you +can also change the order of the columns by +dragging {% icon "mdi:drag" %} them around. +Making it even easier to show the data you want, in the order you want it. + +Your customized columns and view are stored in your browser, so you only have +to set them up once. They will be remembered the next time you visit the page. + +[last release]: /blog/2024/06/05/release-20246/#data-tables-improvements +[release before that]: /blog/2024/05/01/release-20245/#more-features-for-our-data-tables + +## Voice & Assist + +This month, we're thrilled to bring more enhancements to [Assist's] out-of-the-box +capabilities. We've added support for timers ⏲️ — our third most requested +feature for voice control — and the powerful ability to expose your +{% term scripts %} to LLMs (like [ChatGPT] and [Google Gemini]) as well! 💪 + +If you missed it, be sure to check out our recent Voice - Chapter 7 livestream +from June 26th, where we showcased all these exciting developments. You can +[read more in our blog post here] and [watch the full livestream on YouTube]. 🎙️ + +[Assist's]: /voice_control/ +[ChatGPT]: /integrations/openai_conversation/ +[Google Gemini]: /integrations/google_generative_ai_conversation +[read more in our blog post here]: /blog/2024/06/26/voice-chapter-7/ +[watch the full livestream on YouTube]: https://www.youtube.com/watch?v=nLLO4u2Tbbo + +### Timers are here! + +You asked, and we listened! As of this release, timers are available. This +feature allows you to create, cancel, pause, resume, and adjust timers using +your voice, making everyday tasks like cooking much easier. And yes, you can +set multiple timers at once! 🎉 + +[Read more about timers in the Chapter 7 blog post](/blog/2024/06/26/voice-chapter-7/#timers-are-here). + +<p class='img'><lite-youtube videoid="v3mNdTsX4J0" videotitle="Voice timers with countdown text and loading bar"></lite-youtube>Timers running on an S3 Box, with countdown text and a loading bar!</p> + +{% note %} +Timers are available today on [ESPHome] and [Wyoming voice satellites]. +To take advantage of this new feature, update these devices to the latest +version. +{% endnote %} + +[ESPHome]: https://esphome.io/projects/ +[Wyoming voice satellites]: https://github.com/rhasspy/wyoming-satellite + +### Expand an LLM using your scripts + +You can now expand LLM capabilities by allowing them access to (your choice) +of your {% term scripts %}. This feature lets you precisely control what the +LLM does in specific situations, while still benefiting from the flexibility +and natural language processing that AIs excel at. + +For example, you can create a _"leaving home"_ script that performs the actions +you want and [expose it to Assist]. This ensures that commands like +_"I'm heading out for a couple of minutes"_ will run your predefined script, +such as locking the door without turning off the air conditioning. + +[Read more about expanding LLMs with script in the Chapter 7 blog post](/blog/2024/06/26/voice-chapter-7/#expand-an-llm-with-scripts). + +[expose it to Assist]: /voice_control/voice_remote_expose_devices/ + +## Take control of blueprint-based automations + +{% term Blueprints %} are amazing; they allow you to use {% term automations %} +and {% term scripts %} created and shared by other awesome Home Assistant users. +Most are easy to use and set up, but what if that great blueprint you've been +using just needs a little tweak? Just that tiny change to make it perfect for +your home? + +Well, now you can! 🎉 + +<img src='/images/blog/2024-07/blueprint-automation-take-control.png' style='border: 0;box-shadow: none;' alt='Screenshot showing a blueprint-based automation that can be taken of using the "Take control" option in the three-dotted menu.'> + +You can now [take full control over the automations created from a blueprint](/docs/automation/using_blueprints/#editing-an-imported-blueprint). +By taking control {% icon "mdi:file-edit" %}, +Home Assistant will convert the blueprint automation into a regular, +stand-alone, automation. This allows you to make any tweak you want, +without having to re-invent the wheel. + +<img src='/images/blog/2024-07/blueprint-automation-preview.png' style='border: 0;box-shadow: none;' alt='Screenshot showing a preview of how a converted blueprint automation would look like before you take control.'> + +The cool thing is that it shows you a preview of how the converted automation +would look like before you take over. This way, you can see what you are getting +into before you actually do it. + +{% tip %} +Looking for some inspiration for your next automation?<br /> +Check out the [Blueprint exchange on the Home Assistant Community Forum](https://community.home-assistant.io/c/blueprints-exchange/53/l/top?period=yearly). +{% endtip %} + +## 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: + +- **[Aquacell]**, added by [@Jordi1990] + Monitor your [AquaCell water-softener] from Home Assistant. +- **[ista EcoTrend]**, added by [@tr4nt0r] + The ista EcoTrend integration allows you to import your monthly heating, + hot water, and water consumption and costs from the ista EcoTrend service. +- **[Mealie]**, added by [@joostlek] + Mealie is a [self-hosted recipe manager] and meal planner. This integration + will pull in your meal plan as calendars in Home Assistant. +- **[Knocki]**, added by [@joostlek] + [Knocki](https://knocki.com/) is a smart device that turns any surface into a + remote control, which you can now use in Home Assistant to trigger + {% term automations %}. + +[@joostlek]: https://github.com/joostlek +[@Jordi1990]: https://github.com/Jordi1990 +[@tr4nt0r]: https://github.com/tr4nt0r +[AquaCell water-softener]: https://www.aquacell-waterontharder.nl/aquacell +[Aquacell]: /integrations/aquacell +[ista EcoTrend]: /integrations/ista_ecotrend +[Knocki]: /integrations/knocki +[Mealie]: /integrations/mealie +[self-hosted recipe manager]: https://mealie.io/ + +### 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: + +- The **[Matter]** integration now provides number entities that allow you to + configure the behavior of your Matter lights, thanks [@jvmahon]! +- The **[TP-Link Smart Home]** integration has been fully modernized by + [@rytilahti], [@sdb9696], and [@bdraco]! It adds support for many new devices + (like hubs) and unlocks many new features in Home Assistant, including + light effects and presets, firmware updates, and so much more! +- [@tronikos] has added support for integrating the camera from the tablet + running **[Fully Kiosk Browser]**. Furthermore, there's now an image entity + for taking screenshots, the ability to send notifications and text-to-speech + messages to the tablet, and the media player can now play videos! Nice! +- The **[Android TV Remote]** integration now supports browsing your apps + directly from the media browser, thanks [@tronikos]! +- We've seen a lot of improvements to the **[UniFi Protect]** integration, + thanks to [@bdraco]. [@wfltaylor] chipped in as well, adding support for + animal detection sensors. 🐶🐱🐰 +- The **[Android Debug Bridge]** integration now supports remote entities, + allowing you to remotely control your Android TV. Thanks [@ollo69]! +- The **[Reolink]** integration has seen a lot of improvements, thanks to + [@starkillerOG]. Added support for manual recording, software updates + for more cameras, playback of the auto track lens, and support for + their battery-powered cameras through the [Reolink Home Hub]. 🎥 +- The **[Bang & Olufsen]** integration now supports announcements, and support + for Tidal has been added too! Nice work [@mj23000]! +- [@joostlek] added the event entity to the **[Nanoleaf]** integration, allowing + you to trigger automations when you touch your [Nanoleaf panels]. Nice! +- If you have a [Roborock Dyad] vacuum, you are in luck as they are now + supported by the **[Roborock]** integration. Awesome [@Lash-L]! +- The **[SwitchBot]** integration added support for the [SwitchBot Lock Pro]. + Good work [@szclsya]! + +[@bdraco]: https://github.com/bdraco +[@joostlek]: https://github.com/joostlek +[@jvmahon]: https://github.com/jvmahon +[@Lash-L]: https://github.com/Lash-L +[@mj23000]: https://github.com/mj23000 +[@ollo69]: https://github.com/ollo69 +[@rytilahti]: https://github.com/rytilahti +[@sdb9696]: https://github.com/sdb9696 +[@starkillerOG]: https://github.com/starkillerOG +[@szclsya]: https://github.com/szclsya +[@tronikos]: https://github.com/tronikos +[@wfltaylor]: https://github.com/wfltaylor +[Android Debug Bridge]: /integrations/androidtv +[Android TV Remote]: /integrations/androidtv_remote +[Bang & Olufsen]: /integrations/bang_olufsen +[Fully Kiosk Browser]: /integrations/fully_kiosk +[Matter]: /integrations/matter +[Nanoleaf panels]: https://nanoleaf.me +[Nanoleaf]: /integrations/nanoleaf +[Reolink Home Hub]: https://reolink.com/product/reolink-home-hub/ +[Reolink]: /integrations/reolink +[Roborock Dyad]: https://global.roborock.com/pages/roborock-dyad-pro-combo +[Roborock]: /integrations/roborock +[SwitchBot Lock Pro]: https://www.switch-bot.com/products/switchbot-lock-pro +[SwitchBot]: /integrations/switchbot +[TP-Link Smart Home]: /integrations/tplink +[UniFi Protect]: /integrations/unifiprotect + +### Integrations reaching platinum quality level + +The following {% term integrations %} have reached the platinum 🏆 level on our +[integration quality scale](/docs/quality_scale). These integrations are +the best of the best and give you an excellent out-of-the-box experience. + +- **[ESPHome][esphome-integration]**, done by [@jesserockz] & [@bdraco] +- **[pyLoad]**, done by [@tr4nt0r] +- **[Teslemetry]**, done by [@Bre77] + +Congratulations to all the developers who worked on these integrations! + +[@Bre77]: https://github.com/Bre77 +[@jesserockz]: https://github.com/jesserockz +[@tr4nt0r]: https://github.com/tr4nt0r +[esphome-integration]: /integrations/esphome +[pyLoad]: /integrations/pyload +[Teslemetry]: /integrations/teslemetry + +### 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 integrations are now available via the Home Assistant UI: + +- **[Feedreader]**, done by [@mib1185] +- **[Generic Hygrostat]**, done by [@elupus] +- **[Generic Thermostat]**, done by [@elupus] +- **[Intergas InComfort/Intouch Lan2RF gateway]**, done by [@jbouwh] +- **[Music Player Daemon (MPD)]**, done by [@joostlek] +- **[One-Time Password (OTP)]**, done by [@tr4nt0r] +- **[pyLoad]**, done by [@tr4nt0r] +- **[Statistics]**, done by [@gjohansson-ST] + +[@elupus]: https://github.com/elupus +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@jbouwh]: https://github.com/jbouwh +[@joostlek]: https://github.com/joostlek +[@mib1185]: https://github.com/mib1185 +[@tr4nt0r]: https://github.com/tr4nt0r +[@tr4nt0r]: https://github.com/tr4nt0r +[Feedreader]: /integrations/feedreader +[Generic Hygrostat]: /integrations/generic_hygrostat +[Generic Thermostat]: /integrations/generic_thermostat +[Intergas InComfort/Intouch Lan2RF gateway]: /integrations/incomfort +[Music Player Daemon (MPD)]: /integrations/mpd +[One-Time Password (OTP)]: /integrations/otp +[pyLoad]: /integrations/pyload +[Statistics]: /integrations/statistics + +### Farewell to the following + +The following {% term integrations %} are no longer available as +of this release: + +- **Aladdin Connect** has been removed, as Home Assistant cannot use the + upstream library at this time. +- **Unify Circuit** was deprecated in Home Assistant 2024.5 and has now been + removed. + +## ESPHome update entities for ready-made projects + +Our sister project, [ESPHome] received a brand new logo this month! 🎉 + +<img style='border: 0;box-shadow: none; padding-bottom: 16px' src='https://esphome.io/_static/logo-text-on-light.svg' alt='Logo of ESPHome'> + +Looks familiar, right? 😃 That is because ESPHome has [been donated] to the +[Open Home Foundation] by [Nabu Casa]. The same foundation that the Home +Assistant project is part of. + +Besides the new logo, ESPHome has added a new feature that works with this +release of Home Assistant: The ability for makers of +[ready-made devices or projects] running on ESPHome, to [provide updates] +for their devices directly to Home Assistant. + +This means that if you have a device that is powered-by or [Made for ESPHome], +and the maker of that device provides updates for it, you can now update that +device directly from Home Assistant; without the need for you to build, adopt, +or set up the ESPHome software yourself! 😎 + +These two new features—updating from Home Assistant, and the ESPHome +integration reaching the platinum quality level 🏆—make it easier for new +users and creators to use this powerful platform to build a more Open Home. + +[been donated]: https://esphome.io/changelog/2024.6.0.html#esphome-branding +[ESPHome]: https://esphome.io +[Made for ESPHome]: https://esphome.io/guides/made_for_esphome +[Nabu Casa]: https://www.nabucasa.com +[Open Home Foundation]: https://www.openhomefoundation.org/blog/announcing-the-open-home-foundation/ +[provide updates]: https://esphome.io/changelog/2024.6.0.html#update-entities +[ready-made devices or projects]: https://esphome.io/projects/ + +## Other noteworthy changes + +There are many more improvements in this release; here are some of the other +noteworthy changes this release: + +- It is now actually possible to change the username of your Home Assistant + account, thanks [@edenhaus] & [@bramkragten]! +- Home Assistant will now raise a repair issue if an automation can't be set up + (for example, because of YAML syntax errors). Thanks [@emontnemery]! +- We now show additional entity categories on the device page, grouping + [notification] entities in a "Notification" category. Furthermore, all + [Assist]-related entities, like [conversation agents and text-to-speech] + entities, are now grouped in an "Assist" category. Thanks [@balloob]! +- [Assist] now has _"Previous"_ media player intent, adding to the list + of new intents we [added last release]. Nice [@OzGav]! +- [Trend helpers] are now automatically linked to the same device as the source + entity they are based on. Thanks [@dougiteixeira]! +- The [generic thermostat] and [generic hygrostat] are now available via the + UI, allowing you to create a thermostat or hygrostat based on existing + switches and sensors. Thanks [@elupus]! + +[@balloob]: https://github.com/balloob +[@bramkragten]: https://github.com/bramkragten +[@dougiteixeira]: https://github.com/dougiteixeira +[@edenhaus]: https://github.com/edenhaus +[@elupus]: https://github.com/elupus +[@emontnemery]: https://github.com/emontnemery +[@OzGav]: https://github.com/OzGav +[added last release]: /blog/2024/06/05/release-20246/#improved-media-player-commands +[Assist]: /voice_control/ +[conversation agents and text-to-speech]: /integrations/#voice +[generic hygrostat]: /integrations/generic_hygrostat +[generic thermostat]: /integrations/generic_thermostat +[notification]: /integrations/notify +[Trend helpers]: /integrations/trend + +### Link your template entity to an existing device + +[Template entities] are an advanced and powerful way to create your own +{% term entities %} in Home Assistant based on any calculation or logic you +can imagine. + +One of the [most requested features] for {% term template %} entities is the +ability to assign and link them to an existing {% term device %}. Thanks +to [@dougiteixeira], you can now do just that! 🎉 + +<img src='/images/blog/2024-07/templates-link-to-device.png' style='border: 0;box-shadow: none;' alt='Screenshot showing you can select a device the template can be linked to, when adding a new template helper.'> + +Assigning a template entity to an existing device can be very useful if you have +a template that calculates an additional sensor value for a device. For example, +in the screenshot above, a template helper calculates the sum of two sensors +and is linked to the device that has those sensors. + +{% note %} +This feature is only available for template entities that are created +from the UI. +{% endnote %} + +[Template entities]: /integrations/template +[@dougiteixeira]: https://github.com/dougiteixeira +[most requested features]: https://community.home-assistant.io/t/why-cant-we-add-template-entities-to-existing-devices/467149 + +### Change the radius of your home zone + +{% term Zones %} in Home Assistant are a great way to define locations on your +map, such as your work, and trigger automations based on your location. The most +powerful zone is undoubtedly the home zone, which you can use to determine +if someone is home, coming home, or leaving. + +Until now, the radius of the home zone was fixed at 100 meters, which was not +always ideal for everyone. Although it could be changed using YAML, as of this +release, you can now change the radius of your home zone directly from the +Home Assistant user interface! + +<img class="no-shadow" src='/images/docs/configuration/change_location_radius.webp' alt='Screenrecording of how you can now change the radius of the home zone.'><br/> + +{% important %} +If you have currently configured and overridden your home zone using YAML +configuration, this new feature will not be available to you. You can remove +the YAML configuration and restart Home Assistant to enable UI control. +{% endimportant %} + +## Patch releases + +We will also release patch releases for Home Assistant 2024.7 in July. These +patch releases only contain bug fixes. Our goal is to release a patch release +every Friday. + +### 2024.7.1 - July 5 + +- Improve redaction for stream error messages ([@allenporter] - [#120867]) +- Add device class translations in Random ([@dougiteixeira] - [#120890]) +- Fix locking/unlocking transition state in Matter lock platform ([@marcelveldt] - [#121099]) +- Fix HmIP-ESI GAS sensor DeviceClass ([@ChristophCaina] - [#121106]) +- Starline: Fix "Error updating SLNet token" message in Log ([@Chupaka] - [#121122]) +- Bump inkbird-ble to 0.5.8 ([@bdraco] - [#121134]) +- Fix broken pathlib import in august integration ([@mweinelt] - [#121135]) +- Bump velbusaio to 2024.7.5 ([@Cereal2nd] - [#121156]) +- Fix `pulse counter frequency` sensors for Shelly Plus Uni ([@bieniu] - [#121178]) +- Bump youless library version 2.1.2 ([@gjong] - [#121181]) +- Bump python-kasa to 0.7.0.3 ([@sdb9696] - [#121183]) +- Fix Matter light discovery schema for DimmerSwitch ([@marcelveldt] - [#121185]) +- Listen for attribute changes of OnOff cluster in appliances ([@marcelveldt] - [#121198]) +- Bump anova-wifi to 0.15.0 ([@Lash-L] - [#121222]) +- Fix work area sensor in Husqvarna Automower ([@Thomas55555] - [#121228]) +- Revert Homematic IP Cloud unique ID changes ([@hahn-th] - [#121231]) +- Bump deebot-client to 8.1.1 ([@edenhaus] - [#121241]) +- Fix WebOS TV media player status when OFF after IDLE ([@thecode] - [#121251]) +- Bump aioaquacell to 0.1.8 ([@Jordi1990] - [#121253]) +- Bump aiowebostv to 0.4.2 ([@thecode] - [#121258]) +- Bump python-holidays to 0.52 ([@gjohansson-ST] - [#121283]) +- Fix tplink light effect behaviour when activating a scene ([@sdb9696] - [#121288]) +- Update frontend to 20240705.0 ([@bramkragten] - [#121295]) + +[#120579]: https://github.com/home-assistant/core/pull/120579 +[#120867]: https://github.com/home-assistant/core/pull/120867 +[#120890]: https://github.com/home-assistant/core/pull/120890 +[#121099]: https://github.com/home-assistant/core/pull/121099 +[#121106]: https://github.com/home-assistant/core/pull/121106 +[#121122]: https://github.com/home-assistant/core/pull/121122 +[#121134]: https://github.com/home-assistant/core/pull/121134 +[#121135]: https://github.com/home-assistant/core/pull/121135 +[#121156]: https://github.com/home-assistant/core/pull/121156 +[#121178]: https://github.com/home-assistant/core/pull/121178 +[#121181]: https://github.com/home-assistant/core/pull/121181 +[#121183]: https://github.com/home-assistant/core/pull/121183 +[#121185]: https://github.com/home-assistant/core/pull/121185 +[#121198]: https://github.com/home-assistant/core/pull/121198 +[#121222]: https://github.com/home-assistant/core/pull/121222 +[#121228]: https://github.com/home-assistant/core/pull/121228 +[#121231]: https://github.com/home-assistant/core/pull/121231 +[#121241]: https://github.com/home-assistant/core/pull/121241 +[#121251]: https://github.com/home-assistant/core/pull/121251 +[#121253]: https://github.com/home-assistant/core/pull/121253 +[#121258]: https://github.com/home-assistant/core/pull/121258 +[#121283]: https://github.com/home-assistant/core/pull/121283 +[#121288]: https://github.com/home-assistant/core/pull/121288 +[#121295]: https://github.com/home-assistant/core/pull/121295 +[@Cereal2nd]: https://github.com/Cereal2nd +[@ChristophCaina]: https://github.com/ChristophCaina +[@Chupaka]: https://github.com/Chupaka +[@Jordi1990]: https://github.com/Jordi1990 +[@Lash-L]: https://github.com/Lash-L +[@Thomas55555]: https://github.com/Thomas55555 +[@allenporter]: https://github.com/allenporter +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@bramkragten]: https://github.com/bramkragten +[@dougiteixeira]: https://github.com/dougiteixeira +[@edenhaus]: https://github.com/edenhaus +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gjong]: https://github.com/gjong +[@hahn-th]: https://github.com/hahn-th +[@marcelveldt]: https://github.com/marcelveldt +[@mweinelt]: https://github.com/mweinelt +[@sdb9696]: https://github.com/sdb9696 +[@thecode]: https://github.com/thecode + +### 2024.7.2 - July 10 + +- Remove legacy foreign key constraint from sqlite states table ([@bdraco] - [#120779]) +- Direct Users to App-Specific Passwords for iCloud integration to prevent MFA spam ([@rcmaehl] - [#120945]) +- LLM to handle int attributes ([@ahaverty] - [#121037]) +- Fix empty list in kodi media_player ([@TermeHansen] - [#121250]) +- Fix ombi configuration validation ([@temesinko] - [#121314]) +- Bump anova-wifi to 0.17.0 ([@Lash-L] - [#121337]) +- Fix initial Wall Connector values in Tessie ([@Bre77] - [#121353]) +- Bump psutil to 6.0.0 ([@gjohansson-ST] - [#121385]) +- Fix unnecessary logging of turn on/off feature flags in Climate ([@gjohansson-ST] - [#121387]) +- Fix timezone issue in smhi weather ([@gjohansson-ST] - [#121389]) +- Fix feature flag in climate ([@gjohansson-ST] - [#121398]) +- Allow current empty feeds to be configured in Feedreader ([@mib1185] - [#121421]) +- Fix MPD config flow ([@joostlek] - [#121431]) +- Sort mealie mealplans ([@joostlek] - [#121433]) +- Fix Mealie URL field ([@joostlek] - [#121434]) +- Bump pymodbus to 3.6.9 ([@janiversen] - [#121445]) +- Bump jaraco.abode to 5.2.1 ([@jaraco] - [#121446]) +- Bump yalexs to 6.4.2 ([@bdraco] - [#121467]) +- Bump xiaomi-ble to 0.30.1 ([@joostlek] - [#120743]) +- Bump xiaomi-ble to 0.30.2 ([@ov1d1u] - [#121471]) +- Include hass device ID in mobile app get_config webhook ([@balloob] - [#121496]) +- Fix person tracking in unifiprotect ([@bdraco] - [#121528]) +- Remove homematic state_class from GAS_POWER sensor ([@ChristophCaina] - [#121533]) +- Update vehicle to 2.2.2 ([@frenck] - [#121556]) +- Update tailscale to 0.6.1 ([@frenck] - [#121557]) +- Fix upb config flow connect ([@gwww] - [#121571]) +- Bump pyenphase to 1.20.6 ([@catsmanac] - [#121583]) +- Allow ambilight when we have connection (philips_js) ([@elupus] - [#121620]) +- Update frontend to 20240710.0 ([@piitaya] - [#121651]) +- Small fix in velbus cover for the assumed states ([@Cereal2nd] - [#121656]) +- Block icloud3 custom integration from breaking the recorder ([@frenck] - [#121658]) +- Handle errors in Fully Kiosk camera ([@tronikos] - [#121659]) +- Block places <=2.7.0 custom integration from breaking the recorder ([@frenck] - [#121662]) +- Fix state for Matter Locks (including optional door sensor) ([@marcelveldt] - [#121665]) +- Matter lock state follow-up ([@marcelveldt] - [#121669]) +- Block variable <=3.4.4 custom integration from breaking the recorder ([@frenck] - [#121670]) + +[#120579]: https://github.com/home-assistant/core/pull/120579 +[#120743]: https://github.com/home-assistant/core/pull/120743 +[#120779]: https://github.com/home-assistant/core/pull/120779 +[#120945]: https://github.com/home-assistant/core/pull/120945 +[#121037]: https://github.com/home-assistant/core/pull/121037 +[#121250]: https://github.com/home-assistant/core/pull/121250 +[#121289]: https://github.com/home-assistant/core/pull/121289 +[#121314]: https://github.com/home-assistant/core/pull/121314 +[#121337]: https://github.com/home-assistant/core/pull/121337 +[#121353]: https://github.com/home-assistant/core/pull/121353 +[#121385]: https://github.com/home-assistant/core/pull/121385 +[#121387]: https://github.com/home-assistant/core/pull/121387 +[#121389]: https://github.com/home-assistant/core/pull/121389 +[#121398]: https://github.com/home-assistant/core/pull/121398 +[#121421]: https://github.com/home-assistant/core/pull/121421 +[#121431]: https://github.com/home-assistant/core/pull/121431 +[#121433]: https://github.com/home-assistant/core/pull/121433 +[#121434]: https://github.com/home-assistant/core/pull/121434 +[#121445]: https://github.com/home-assistant/core/pull/121445 +[#121446]: https://github.com/home-assistant/core/pull/121446 +[#121467]: https://github.com/home-assistant/core/pull/121467 +[#121471]: https://github.com/home-assistant/core/pull/121471 +[#121496]: https://github.com/home-assistant/core/pull/121496 +[#121528]: https://github.com/home-assistant/core/pull/121528 +[#121533]: https://github.com/home-assistant/core/pull/121533 +[#121556]: https://github.com/home-assistant/core/pull/121556 +[#121557]: https://github.com/home-assistant/core/pull/121557 +[#121571]: https://github.com/home-assistant/core/pull/121571 +[#121583]: https://github.com/home-assistant/core/pull/121583 +[#121620]: https://github.com/home-assistant/core/pull/121620 +[#121651]: https://github.com/home-assistant/core/pull/121651 +[#121656]: https://github.com/home-assistant/core/pull/121656 +[#121658]: https://github.com/home-assistant/core/pull/121658 +[#121659]: https://github.com/home-assistant/core/pull/121659 +[#121662]: https://github.com/home-assistant/core/pull/121662 +[#121665]: https://github.com/home-assistant/core/pull/121665 +[#121669]: https://github.com/home-assistant/core/pull/121669 +[#121670]: https://github.com/home-assistant/core/pull/121670 +[@Bre77]: https://github.com/Bre77 +[@Cereal2nd]: https://github.com/Cereal2nd +[@ChristophCaina]: https://github.com/ChristophCaina +[@Lash-L]: https://github.com/Lash-L +[@TermeHansen]: https://github.com/TermeHansen +[@ahaverty]: https://github.com/ahaverty +[@balloob]: https://github.com/balloob +[@bdraco]: https://github.com/bdraco +[@catsmanac]: https://github.com/catsmanac +[@elupus]: https://github.com/elupus +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gwww]: https://github.com/gwww +[@janiversen]: https://github.com/janiversen +[@jaraco]: https://github.com/jaraco +[@joostlek]: https://github.com/joostlek +[@marcelveldt]: https://github.com/marcelveldt +[@mib1185]: https://github.com/mib1185 +[@ov1d1u]: https://github.com/ov1d1u +[@piitaya]: https://github.com/piitaya +[@rcmaehl]: https://github.com/rcmaehl +[@temesinko]: https://github.com/temesinko +[@tronikos]: https://github.com/tronikos + +## Need help? Join the community! + +Home Assistant has a great community of users who are all more than willing +to help each other out. So, join us! + +Our very active [Discord chat server](/join-chat) is an excellent place to be +at, and don't forget to join our amazing [forums](https://community.home-assistant.io/). + +Found a bug or issue? Please report it in our [issue tracker](https://github.com/home-assistant/core/issues), +to get it fixed! Or, check [our help page](/help) for guidance for more +places you can go. + +Are you more into email? [Sign-up for our Building the Open Home Newsletter](/newsletter) +to get the latest news about features, things happening in our community and +other news about building an Open Home; straight into your inbox. + +## Backward-incompatible changes + +We do our best to avoid making changes to existing functionality that might +unexpectedly impact your Home Assistant installation. Unfortunately, sometimes, +it is inevitable. + +We always make sure to document these changes to make the transition as easy as +possible for you. This release has the following backward-incompatible changes: + +{% details "Authentication" %} + +The legacy API password (`legacy_api_password`) authentication provider that +was deprecated in Home Assistant 2023.12, has been removed. + +([@edenhaus] - [#119976]) ([documentation](/integrations/auth)) + +[@edenhaus]: https://github.com/edenhaus +[#119976]: https://github.com/home-assistant/core/pull/119976 + +{% enddetails %} + +{% details "Azure DevOps" %} + +All attributes of the "latest build" sensor are now deprecated; each now has +a dedicated sensor entity available. If you use these attributes in your +automations or scripts, you need to adjust these to use one of the +new sensors instead. + +([@timmo001] - [#114948]) ([documentation](/integrations/azure_devops)) + +[@timmo001]: https://github.com/timmo001 +[#114948]: https://github.com/home-assistant/core/pull/114948 + +{% enddetails %} + +{% details "Blink" %} + +The previously deprecated Blink update service has now been removed. + +([@gjohansson-ST] - [#119919]) ([documentation](/integrations/blink)) + +[@gjohansson-ST]: https://github.com/gjohansson-ST +[#119919]: https://github.com/home-assistant/core/pull/119919 + +{% enddetails %} + +{% details "BMW Connected Drive" %} + +The charging mode and charging status sensors have been updated to use lowercase +state values. If you use these sensors in your automations or scripts, +you must update them to use the new lowercase values. + +([@rikroe] - [#118751]) ([documentation](/integrations/bmw_connected_drive)) + +[@rikroe]: https://github.com/rikroe +[#118751]: https://github.com/home-assistant/core/pull/118751 + +{% enddetails %} + +{% details "Calendar" %} + +Calendar service `list_events` was deprecated in favor of `get_events` in +Home Assistant 2023.12 and has now been removed. + +Use the new `get_events` service to retrieve events from `calendar` entities +instead. + +([@gjohansson-ST] - [#118663]) ([documentation](/integrations/calendar)) + +[@gjohansson-ST]: https://github.com/gjohansson-ST +[#118663]: https://github.com/home-assistant/core/pull/118663 + +{% enddetails %} + +{% details "ComEd Hourly Pricing" %} + +The unit of measurement for the ComEd Hourly Pricing integration has been +corrected from `c` to `¢/kWh`. + +([@themaxgross] - [#115594]) ([documentation](/integrations/comed_hourly_pricing)) + +[@themaxgross]: https://github.com/themaxgross +[#115594]: https://github.com/home-assistant/core/pull/115594 + +{% enddetails %} + +{% details "DNS IP" %} + +The attribute names `Resolver` and `Querytype` have been renamed to +`resolver` and `querytype`. If you use these in any automations or scripts, +you need to update them to use the new lowercase names. + +([@gjohansson-ST] - [#119727]) ([documentation](/integrations/dnsip)) + +[@gjohansson-ST]: https://github.com/gjohansson-ST +[#119727]: https://github.com/home-assistant/core/pull/119727 + +--- + +The attributes `resolver`, `querytype`, and `ip_addresses` for the DNS IP +sensor are excluded from the recorder and no longer stored in history. + +([@gjohansson-ST] - [#119726]) ([documentation](/integrations/dnsip)) + +[@gjohansson-ST]: https://github.com/gjohansson-ST +[#119726]: https://github.com/home-assistant/core/pull/119726 + +{% enddetails %} + +{% details "Fast.com" %} + +The previously deprecated `speedtest` service from `fastdotcom` has been removed. +Use the [`homeassistant.update_entity` service](/common-tasks/general/#defining-a-custom-polling-interval) +to refresh and run a speedtest manually instead. + +([@gjohansson-ST] - [#119780]) ([documentation](/integrations/fastdotcom)) + +[@gjohansson-ST]: https://github.com/gjohansson-ST +[#119780]: https://github.com/home-assistant/core/pull/119780 + +{% enddetails %} + +{% details "Intergas InComfort/Intouch Lan2RF gateway" %} + +Based on the boiler display code or fault code, the boiler status +has been refactored to be signified and unique so we can start supporting +localization. + +Depending on the old status texts, automations or scripts might break. +You need to ensure your automations and scripts are updated to use the new +status values. + +The new display codes are: + +- 0: `opentherm` +- 15: `boiler_ext` +- 24: `frost` +- 37: `central_heating_rf` +- 51: `tapwater_int` +- 85: `sensortest` +- 102: `central_heating` +- 126: `standby` +- 153: `postrun_boiler` +- 170: `service` +- 204: `tapwater` +- 231: `postrun_ch` +- 240: `boiler_int` +- 255: `buffer` + +The new fault codes are: + +- 0: `sensor_fault_after_self_check` +- 1: `cv_temperature_too_high` +- 2: `s1_and_s2_interchanged` +- 4: `no_flame_signal` +- 5: `poor_flame_signal` +- 6: `flame_detection_fault` +- 8: `incorrect_fan_speed` +- 10: `sensor_fault_s1` +- 11: `sensor_fault_s1` +- 12: `sensor_fault_s1` +- 13: `sensor_fault_s1` +- 14: `sensor_fault_s1` +- 20: `sensor_fault_s2` +- 21: `sensor_fault_s2` +- 22: `sensor_fault_s2` +- 23: `sensor_fault_s2` +- 24: `sensor_fault_s2` +- 27: `shortcut_outside_sensor_temperature` +- 29: `gas_valve_relay_faulty` +- 30: `gas_valve_relay_faulty` + +([@jbouwh] - [#119207]) ([documentation](/integrations/incomfort)) + +[@jbouwh]: https://github.com/jbouwh +[#119207]: https://github.com/home-assistant/core/pull/119207 + +{% enddetails %} + +{% details "La Marzocco" %} + +On March 19th, 2024, La Marzocco released a machine firmware update, v3.5-rc5, +together with a new version of the La Marzocco Home App. + +Once the app update is installed, the previous scheduling functionality is +removed from the app, and a new scheduling mode is shown. This mode is disabled +until the machine's firmware has also been updated. + +Similarly, if the machine's firmware is updated before the app, the previous +scheduling functionality does not work. + +The previous calendar and auto on/off switches are replaced with calendars +and switches per schedule. + +([@zweckj] - [#113935]) ([documentation](/integrations/lamarzocco)) + +[@zweckj]: https://github.com/zweckj +[#113935]: https://github.com/home-assistant/core/pull/113935 + +{% enddetails %} + +{% details "Logitech Harmony Hub" %} + +The harmony switch entities that were deprecated since Home Assistant 2024.1, +have now been removed. + +([@joostlek] - [#119206]) ([documentation](/integrations/harmony)) + +[@joostlek]: https://github.com/joostlek +[#119206]: https://github.com/home-assistant/core/pull/119206 + +{% enddetails %} + +{% details "OpenWeatherMap" %} + +The now obsolete forecast sensors have been removed. They have been +fully replaced by `weather.get_forecasts` service. + +([@freekode] - [#119922]) ([documentation](/integrations/openweathermap)) + +[@freekode]: https://github.com/freekode +[#119922]: https://github.com/home-assistant/core/pull/119922 + +{% enddetails %} + +{% details "Shelly" %} + +The switch entity for controlling a Shelly Gas Valve Add-on has been removed, +and a valve entity has taken its place. If you use the switch entity +in your automations or scripts, you must update them to use the new +valve entity. + +([@bieniu] - [#119817]) ([documentation](/integrations/shelly)) + +[@bieniu]: https://github.com/bieniu +[#119817]: https://github.com/home-assistant/core/pull/119817 + +{% enddetails %} + +{% details "SimpliSafe" %} + +SimpliSafe no longer contains functionality to set a code for use within Home +Assistant. This was a virtual code that was not used by the SimpliSafe system. + +([@bachya] - [#118759]) ([documentation](/integrations/simplisafe)) + +[@bachya]: https://github.com/bachya +[#118759]: https://github.com/home-assistant/core/pull/118759 + +{% enddetails %} + +{% details "SQL" %} + +An SQL query generating several columns output was putting the additional +attributes on the SQL sensor. + +From now on, these are still shown as state attributes but are no longer +recorded in the database as attributes on this particular sensor +(as the data for these attributes are already present in the database +from where they come). + +([@gjohansson-ST] - [#120170]) ([documentation](/integrations/sql)) + +[@gjohansson-ST]: https://github.com/gjohansson-ST +[#120170]: https://github.com/home-assistant/core/pull/120170 + +{% enddetails %} + +{% details "Sun WEG" %} + +The new API version this integration now uses doesn't provide the kWh per kWP +information, so that sensor is no longer available. + +([@rokam] - [#118435]) ([documentation](/integrations/sunweg)) + +[@rokam]: https://github.com/rokam +[#118435]: https://github.com/home-assistant/core/pull/118435 + +{% enddetails %} + +{% details "Swiss public transport" %} + +Swiss public transport no longer provides additional state attributes; since +the release of Home Assistant 2023.12, all information has been moved to +dedicated individual sensors. + +([@miaucl] - [#120256]) ([documentation](/integrations/swiss_public_transport)) + +[@miaucl]: https://github.com/miaucl +[#120256]: https://github.com/home-assistant/core/pull/120256 + +{% enddetails %} + +{% details "Tami4 Edge / Edge+" %} + +Due to upstream API changes, the UV & filter's last replaced date has been +removed. + +Additionally, `uv_status` & `filter_status` sensor entities have been changed +to `uv_installed` and `filter_installed`. + +([@Guy293] - [#119158]) ([documentation](/integrations/tami4)) + +[@Guy293]: https://github.com/Guy293 +[#119158]: https://github.com/home-assistant/core/pull/119158 + +{% enddetails %} + +{% details "UniFi Protect" %} + +The set default doorbell text service (`set_default_doorbell_text`) has been +removed. UI has removed this functionality in UI Protect 4.x. + +It is still possible to set a custom message using the other services +(`unifiprotect.add_doorbell_text` and `unifiprotect.remove_doorbell_text`, +and setting it via the `select` entity), but there is no longer a default. + +([@bdraco] - [#119695]) ([documentation](/integrations/unifiprotect)) + +[@bdraco]: https://github.com/bdraco +[#119695]: https://github.com/home-assistant/core/pull/119695 + +{% enddetails %} + +{% details "Utility Meter" %} + +The source entity, period, and CRON pattern entity state attributes have been +removed from the sensor entity and moved to the integration diagnostics. + +Note that these values are constant throughout the lifetime of a utility meter. + +([@dgomes] - [#118637]) ([documentation](/integrations/utility_meter)) + +[@dgomes]: https://github.com/dgomes +[#118637]: https://github.com/home-assistant/core/pull/118637 + +{% enddetails %} + +{% details "Weather" %} + +Weather service `get_forecast` was deprecated in favor of `get_forecasts` in +Home Assistant 2023.12 and has now been removed. + +Use the new `get_forecasts` service to retrieve forecast information +from `weather` entities instead. + +([@gjohansson-ST] - [#118664]) ([documentation](/integrations/weather)) + +[@gjohansson-ST]: https://github.com/gjohansson-ST +[#118664]: https://github.com/home-assistant/core/pull/118664 + +{% enddetails %} + +{% details "WLED" %} + +The previously deprecated firmware binary sensor has been removed. +Use the provided update entity for your WLED device instead. + +([@frenck] - [#119984]) ([documentation](/integrations/wled)) + +[@frenck]: https://github.com/frenck +[#119984]: https://github.com/home-assistant/core/pull/119984 + +{% enddetails %} + +{% details "Z-Wave" %} + +With this release, you will need to update your `zwave-js-server` instance. + +You must use `zwave-js-server` 1.36.0 or greater (schema 36). +- If you use the Z-Wave JS add-on, you need at least version 0.6.0. +- If you use the Z-Wave JS UI add-on, you need at least version [3.8.2](https://github.com/hassio-addons/addon-zwave-js-ui/releases/tag/v3.8.2). +- If you use the Z-Wave JS UI Docker container, you need at least version [9.14.2](https://github.com/zwave-js/zwave-js-ui/releases/tag/v9.14.2). +- If you run your own Docker container or some other installation method, you will need to update your zwave-js-server instance to at least 1.36.0. + +([@raman325]) ([documentation](/integrations/zwave_js)) + +[@raman325]: https://github.com/raman325 + +{% enddetails %} + +If you are a custom integration developer and want to learn about changes and +new features available for your integration: Be sure to follow our +[developer blog][devblog]. The following are the most notable for this release: + +- [Excluding all state attributes from recording using MATCH_ALL](https://developers.home-assistant.io/blog/2024/06/22/excluding-state-attributes-from-recording-match-all) +- [Forwarding setup to config entry platforms](https://developers.home-assistant.io/blog/2024/06/12/async_forward_entry_setups/) +- [Making http path registration async safe with `async_register_static_paths`](https://developers.home-assistant.io/blog/2024/06/18/async_register_static_paths) + +[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 2024.7](/changelogs/core-2024.7) diff --git a/source/_redirects b/source/_redirects index 157d74fc4dbf..2c750b8cdc24 100644 --- a/source/_redirects +++ b/source/_redirects @@ -310,7 +310,7 @@ layout: null /docs/z-wave/events /integrations/zwave_js#events /docs/z-wave/installation /integrations/zwave_js#configuration /docs/z-wave/query-stage /integrations/zwave_js -/docs/z-wave/services /integrations/zwave_js#services +/docs/z-wave/services /integrations/zwave_js#actions /ecosystem/ios/notifications https://companion.home-assistant.io/docs/notifications/notifications-basic /ecosystem/notebooks https://data.home-assistant.io /ecosystem/notebooks/api https://data.home-assistant.io @@ -490,6 +490,7 @@ layout: null # Removed integrations /integrations/alarmdotcom /more-info/removed-integration 301 +/integrations/aladdin_connect /more-info/removed-integration 301 /integrations/almond /more-info/removed-integration 301 /integrations/ambee /more-info/removed-integration 301 /integrations/ambiclimate /more-info/removed-integration 301 @@ -517,6 +518,7 @@ layout: null /integrations/dht /more-info/removed-integration 301 /integrations/digitalloggers /more-info/removed-integration 301 /integrations/discovery /more-info/removed-integration 301 +/integrations/dte_energy_bridge /more-info/removed-integration 301 /integrations/duke_energy /more-info/removed-integration 301 /integrations/dyson /more-info/removed-integration 301 /integrations/edp_redy /more-info/removed-integration 301 diff --git a/source/addons/index.html b/source/addons/index.html index 43732ee5fd5e..06a215021390 100644 --- a/source/addons/index.html +++ b/source/addons/index.html @@ -27,13 +27,13 @@ Click on an add-on you are interested in, to read the documentation or to install the add-on. </p> -<p class="note"> - Add-ons are only available if you've used the Home Assistant Operating System or - Home Assistant Supervised <a href="/installation">installation</a> method. If you - installed Home Assistant using any other method then you cannot use add-ons. - Often you can achieve the same manually, refer to the documentation by the - vendor of the application you'd like to install. -</p> +{% important %} +Add-ons are only available if you've used the Home Assistant Operating System or +Home Assistant Supervised <a href="/installation">installation</a> method. If you +installed Home Assistant using any other method then you cannot use add-ons. +Often you can achieve the same manually, refer to the documentation by the +vendor of the application you'd like to install. +{% endimportant %} <p> Check the Home Assistant forums for diff --git a/source/blog/index.html b/source/blog/index.html index 98b97250ee19..1d716b58f24a 100644 --- a/source/blog/index.html +++ b/source/blog/index.html @@ -2,21 +2,25 @@ layout: default regenerate: true blog_index: true +feedback: false --- - {% assign index = true %} - {% for post in paginator.posts %} - <article class="listing"> - {% include blog/post/article.html %} - </article> - <hr> - {% endfor %} - <div class="pagination"> - {% if paginator.next_page %} - <a class="btn pull-left" href="{{paginator.next_page_path}}">← Older</a> - {% endif %} +{% assign index = true %} +<h1 class="title indent">Blog</h1> - {% if paginator.previous_page %} - <a class="btn pull-right" href="{{paginator.previous_page_path}}">Newer →</a> - {% endif %} - </div> +{% for post in paginator.posts %} +<article class="listing"> + {% include blog/post/article.html %} +</article> +<hr> +{% endfor %} + +<div class="pagination"> + {% if paginator.next_page %} + <a class="btn pull-left" href="{{paginator.next_page_path}}">← Older</a> + {% endif %} + + {% if paginator.previous_page %} + <a class="btn pull-right" href="{{paginator.previous_page_path}}">Newer →</a> + {% endif %} +</div> diff --git a/source/blueprints/integrations/conversation_notify_agent_agenda.yaml b/source/blueprints/integrations/conversation_notify_agent_agenda.yaml new file mode 100644 index 000000000000..0aab5d650c35 --- /dev/null +++ b/source/blueprints/integrations/conversation_notify_agent_agenda.yaml @@ -0,0 +1,151 @@ +## Copied on June 21, 2024 from allenporter: https://raw.githubusercontent.com/allenporter/home-assistant-config/f35038615cf022b989f65a640ff342195dddae5d/config/blueprints/automation/allenporter/notify_agent_agenda.yaml +blueprint: + name: Conversation agent Agenda Notification + description: + Conversation agent generates a notification based on the upcoming calendar + agenda, location, and weather information. + domain: automation + input: + notify_time: + name: Notification time + description: Time the automation is triggered to send the notification. + selector: + time: {} + default: 07:00:00 + notify_service: + name: Notify service name + description: + The name of the notify service where the notification should be + sent. + selector: + text: {} + default: notify.notify + notify_target: + name: Notify target + description: The target of the notify service. + selector: + text: {} + default: + calendar_entity: + name: Calendar + description: The calendar entity to use for finding upcoming calendar events. + selector: + entity: + multiple: false + filter: + - domain: + - calendar + calendar_duration: + name: Calendar Event duration + description: How many hours ahead to look for upcoming calendar events. + selector: + duration: + default: + hours: 18 + weather_entity: + name: Weather Entity + description: The weather entity to use for upcoming weather forecast. + selector: + entity: + multiple: false + filter: + - domain: + - weather + zone_entity: + name: Home Zone Entity + description: + The zone entity to use to determine approximate location for understanding + typical weather. + selector: + entity: + multiple: false + filter: + - domain: + - zone + conversation_agent: + name: Conversation Agent + selector: + conversation_agent: + prompt: + name: Conversation Agent Prompt + selector: + text: + multiline: true + type: text + default: |- + Please generate text for a notification that will be sent to the users + smartphone with helpful information. + + You are a helpful personal agent that generates text for the user: + - Your answers are helpful, friendly, warm, insightful. + - Your answers are not technical, and do not include Home Assistant internal details such as entities in responses. + - Your messages help the user prepare for their day, for example: + - Making note of unusual weather for the location and time of year (but not mundane details like "0% chance of precipitation") + - How much time remaining until their first meeting + - Anything that may be special or unique, such as celebrating a birthday + +trigger: + platform: time + at: !input notify_time + +action: + - variables: + weather_entity: !input weather_entity + calendar_entity: !input calendar_entity + zone_entity: !input zone_entity + calendar_duration: !input calendar_duration + prompt: !input prompt + - alias: Fetch Weather Forecast + service: weather.get_forecasts + data: + type: hourly + target: + entity_id: + - "{{ weather_entity }}" + response_variable: daily_forecast + - variables: + forecast_entity: "{{ daily_forecast[weather_entity] }}" + forecast: "{{ forecast_entity.forecast[0] }}" + - alias: Fetch Calendar Agenda + service: calendar.get_events + data: + duration: !input calendar_duration + target: + entity_id: !input calendar_entity + response_variable: events_response + - alias: "Conversation Agent Notification Text" + service: conversation.process + data: + text: |- + Time: {{ now().strftime("%A %B %d %H:%M %p") }} + {%- if weather_entity is defined %} + {%- set temperature_unit = state_attr(weather_entity, 'temperature_unit') -%} + Forecast: {{ forecast.condition }} ({{ forecast.temperature }}{{ temperature_unit }}, {{ forecast.precipitation }}% precipitation) + {%- endif %} + + Calendar "{{ state_attr(calendar_entity, 'friendly_name') }}" events for the next {{ calendar_duration.hours }}: + {%- set agenda = (events_response | items | first)[1] %} + {%- if agenda.events %} + {%- for event in agenda.events %} + - Summary: {{ event.summary }} + Start-End: {% if event.start is defined %}{{ event.start }} to {{ event.end }}{% else %}All Day{% endif %} + {%- if event.description is defined %} + Description: {{ event.description }} + {% endif -%} + {%- if event.location is defined %} + Location: {{ event.location }} + {% endif -%} + {%- endfor %} + {%- else %} + - No upcoming events. + {%- endif %} + + {{ prompt }} + agent_id: !input conversation_agent + response_variable: agent + - alias: "Send notification" + service: !input notify_service + data: + target: !input notify_target + title: "{{ now().strftime('%A') }} Agenda" + message: "{{ agent.response.speech.plain.speech }}" \ No newline at end of file diff --git a/source/changelogs/core-2024.6.markdown b/source/changelogs/core-2024.6.markdown index f4aaef38ad1d..e7b68b96522a 100644 --- a/source/changelogs/core-2024.6.markdown +++ b/source/changelogs/core-2024.6.markdown @@ -1421,6 +1421,82 @@ For a summary in a more readable format: [@starkillerOG]: https://github.com/starkillerOG [@tronikos]: https://github.com/tronikos +## Release 2024.6.4 - June 21 + +- UniFi temp fix to handle runtime data ([@Kane610] - [#120031]) +- Fix for Synology DSM shared images ([@lodesmets] - [#117695]) +- Fix Jewish Calendar unique id migration ([@tsvi] - [#119683]) +- Fix model import in Spotify ([@jjlawren] - [#119747]) +- Add Kasa Dimmer to Matter TRANSITION_BLOCKLIST ([@dubstomp] - [#119751]) +- Bump py-canary to v0.5.4 ([@0bmay] - [#119793]) +- Pin tenacity to 8.3.0 ([@cdce8p] - [#119815]) +- Bump aiozoneinfo to 0.2.0 ([@bdraco] - [#119845]) +- Fix up ecobee windspeed unit ([@bjpetit] - [#119870]) +- Bump hdate to 0.10.9 ([@tsvi] - [#119887]) +- Bump weatherflow4py to 0.2.21 ([@jeeftor] - [#119889]) +- Bump babel to 2.15.0 ([@gjohansson-ST] - [#119006]) +- Bump python-holidays to 0.51 ([@gjohansson-ST] - [#119918]) +- Fix Onkyo zone volume ([@arturpragacz] - [#119949]) +- Bump plugwise to v0.37.4.1 ([@bouwew] - [#119963]) +- Always create a new HomeAssistant object when falling back to recovery mode ([@emontnemery] - [#119969]) +- Fix Hydrawise volume unit bug ([@thomaskistler] - [#119988]) +- Fix songpal crash for soundbars without sound modes ([@BestPig] - [#119999]) +- Bump env-canada to 0.6.3 ([@gwww] - [#120035]) +- Bump aioimaplib to 1.1.0 ([@jbouwh] - [#120045]) +- Update AEMET-OpenData to v0.5.2 ([@Noltari] - [#120065]) +- Bump intents to 2024.6.21 ([@synesthesiam] - [#120106]) +- Update pydrawise to 2024.6.4 ([@thomaskistler] - [#119868]) + +[#117695]: https://github.com/home-assistant/core/pull/117695 +[#118400]: https://github.com/home-assistant/core/pull/118400 +[#119006]: https://github.com/home-assistant/core/pull/119006 +[#119096]: https://github.com/home-assistant/core/pull/119096 +[#119376]: https://github.com/home-assistant/core/pull/119376 +[#119683]: https://github.com/home-assistant/core/pull/119683 +[#119742]: https://github.com/home-assistant/core/pull/119742 +[#119747]: https://github.com/home-assistant/core/pull/119747 +[#119751]: https://github.com/home-assistant/core/pull/119751 +[#119793]: https://github.com/home-assistant/core/pull/119793 +[#119815]: https://github.com/home-assistant/core/pull/119815 +[#119845]: https://github.com/home-assistant/core/pull/119845 +[#119868]: https://github.com/home-assistant/core/pull/119868 +[#119870]: https://github.com/home-assistant/core/pull/119870 +[#119887]: https://github.com/home-assistant/core/pull/119887 +[#119889]: https://github.com/home-assistant/core/pull/119889 +[#119918]: https://github.com/home-assistant/core/pull/119918 +[#119949]: https://github.com/home-assistant/core/pull/119949 +[#119963]: https://github.com/home-assistant/core/pull/119963 +[#119969]: https://github.com/home-assistant/core/pull/119969 +[#119988]: https://github.com/home-assistant/core/pull/119988 +[#119999]: https://github.com/home-assistant/core/pull/119999 +[#120028]: https://github.com/home-assistant/core/pull/120028 +[#120031]: https://github.com/home-assistant/core/pull/120031 +[#120035]: https://github.com/home-assistant/core/pull/120035 +[#120045]: https://github.com/home-assistant/core/pull/120045 +[#120065]: https://github.com/home-assistant/core/pull/120065 +[#120106]: https://github.com/home-assistant/core/pull/120106 +[@0bmay]: https://github.com/0bmay +[@BestPig]: https://github.com/BestPig +[@Kane610]: https://github.com/Kane610 +[@Noltari]: https://github.com/Noltari +[@arturpragacz]: https://github.com/arturpragacz +[@bdraco]: https://github.com/bdraco +[@bjpetit]: https://github.com/bjpetit +[@bouwew]: https://github.com/bouwew +[@cdce8p]: https://github.com/cdce8p +[@dubstomp]: https://github.com/dubstomp +[@emontnemery]: https://github.com/emontnemery +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gwww]: https://github.com/gwww +[@jbouwh]: https://github.com/jbouwh +[@jeeftor]: https://github.com/jeeftor +[@jjlawren]: https://github.com/jjlawren +[@lodesmets]: https://github.com/lodesmets +[@synesthesiam]: https://github.com/synesthesiam +[@thomaskistler]: https://github.com/thomaskistler +[@tsvi]: https://github.com/tsvi + [#101731]: https://github.com/home-assistant/core/pull/101731 [#101786]: https://github.com/home-assistant/core/pull/101786 [#103844]: https://github.com/home-assistant/core/pull/103844 diff --git a/source/changelogs/core-2024.7.markdown b/source/changelogs/core-2024.7.markdown new file mode 100644 index 000000000000..8c15b2b61fb0 --- /dev/null +++ b/source/changelogs/core-2024.7.markdown @@ -0,0 +1,2726 @@ +--- +title: Full changelog for Home Assistant Core 2024.7 +description: Detailed changelog for the Home Assistant Core 2024.7 release +replace_regex: \s\(\[?[a-z0-9\-\s_]+\]?\)$ +--- + +These are all the changes included in the Home Assistant Core 2024.7 release. + +For a summary in a more readable format: +[Release notes blog for this release](/blog/2024/07/03/release-20247/). + +## All changes + +- Bump version to 2024.7.0dev0 ([@frenck] - [#118399]) +- Improve type hints in tests (a-h) ([@epenet] - [#118379]) +- Improve type hints in tests (i-p) ([@epenet] - [#118380]) +- Improve type hints in tests (q-z) ([@epenet] - [#118381]) +- Adjust type hint for request_mock.Mocker in pylint plugin ([@epenet] - [#118458]) +- Add check for usefixtures decorator in pylint plugin ([@epenet] - [#118456]) +- Cleanup mock_get_source_ip from tests ([@epenet] - [#118459]) +- Fix special case in pylint type hint plugin ([@epenet] - [#118454]) +- Bump refoss to v1.2.1 ([@ashionky] - [#118450]) +- Move evohome constants to separate module ([@zxdavb] - [#118471]) +- Add tests for Tractive integration ([@bieniu] - [#118470]) +- Use const instead of literal string in HVV integration ([@tsvi] - [#118479]) +- Bang & Olufsen sort supported media_player features alphabetically ([@mj23000] - [#118476]) +- Fix a typo in hassfest ([@emontnemery] - [#118482]) +- Add XML support to RESTful binary sensor ([@2sheds] - [#110062]) +- Add allow_negative configuration option to DurationSelector ([@ronweikamp] - [#116134]) +- Add time based integration trigger to Riemann sum integral helper sensor ([@ronweikamp] - [#110685]) +- Fix incorrect `zeroconf` type hint in tests ([@epenet] - [#118465]) +- Fix typing and streamline code in One-Time Password integration ([@tr4nt0r] - [#118511]) +- Add Google Assistant SDK diagnostics ([@tronikos] - [#118513]) +- Improve type hints for mock_bluetooth/enable_bluetooth ([@epenet] - [#118484]) +- Bang & Olufsen fix straggler from previous PR ([@mj23000] - [#118488]) +- Pass the message as an exception argument in Tractive integration ([@bieniu] - [#118534]) +- Move evohome helper functions to separate module ([@zxdavb] - [#118497]) +- Drop single-use constant from pylint plugin ([@epenet] - [#118540]) +- Code quality improvements in emoncms integration ([@alexandrecuer] - [#118468]) +- Small performance improvement to pylint plugin ([@epenet] - [#118475]) +- Check fixtures for type hints in pylint plugin ([@epenet] - [#118313]) +- Adjust "hass" type hint for test fixtures in pylint plugin ([@epenet] - [#118548]) +- Bump `brother` backend library to version `4.2.0` ([@bieniu] - [#118557]) +- Move OSO Energy base entity class to separate module ([@osohotwateriot] - [#118563]) +- Prevent time.sleep calls from blocking the event loop ([@bdraco] - [#118561]) +- Log directory blocking I/O functions that run in the event loop ([@bdraco] - [#118529]) +- Remove duplicate getattr call in entity wrap_attr ([@bdraco] - [#118558]) +- Add state translation to Reolink AI detections ([@starkillerOG] - [#118560]) +- Improve typing in Zengge ([@joostlek] - [#118547]) +- Improve UniFi config flow tests ([@Kane610] - [#118587]) +- Improve typing in Zabbix ([@joostlek] - [#118545]) +- Cleanup pylint ignore in melnor tests ([@epenet] - [#118564]) +- Don't prompt user to verify still image if none was provided in generic camera ([@davet2001] - [#118599]) +- Bump `nettigo_air_monitor` library to version `3.2.0` ([@bieniu] - [#118600]) +- Bump ruff to 0.4.7 ([@autinerd] - [#118612]) +- Add new codeowner for emoncms integration ([@alexandrecuer] - [#118609]) +- Update typing-extensions to 4.12.1 ([@cdce8p] - [#118615]) +- Update mypy-dev to 1.11.0a5 ([@cdce8p] - [#118519]) +- Fix incorrect `patch` type hint in main conftest ([@epenet] - [#118461]) +- Use more efficient chunked_or_all for recorder table managers ([@bdraco] - [#118646]) +- Add support for the DS18B20 temperature sensor to Nettigo Air Monitor integration ([@bieniu] - [#118601]) +- Remove config flow import from fastdotcom ([@gjohansson-ST] - [#118665]) +- Clean up Husqvarna Automower number platform ([@Thomas55555] - [#118641]) +- Add BaseEntity for apsystems integration ([@mawoka-myblock] - [#117514]) +- Refactor incomfort platform attributes ([@jbouwh] - [#118667]) +- Add type hints for pytest.LogCaptureFixture in test fixtures ([@epenet] - [#118687]) +- Add type hints for MqttMockHAClient in test fixtures ([@epenet] - [#118683]) +- Bump github/codeql-action from 3.25.6 to 3.25.7 (@dependabot - [#118680]) +- Add error message to device registry helper ([@epenet] - [#118676]) +- Add type hints for FrozenDateTimeFactory in test fixtures ([@epenet] - [#118690]) +- Add type hints for AiohttpClientMocker in test fixtures ([@epenet] - [#118691]) +- Add type hints for Recorder in test fixtures ([@epenet] - [#118685]) +- Remove unused fixture from elmax tests ([@epenet] - [#118684]) +- Fix incorrect blueprint type hints in tests ([@epenet] - [#118694]) +- Add type hints for ClientSessionGenerator in test fixtures ([@epenet] - [#118689]) +- Add type hints for hass_storage in test fixtures ([@epenet] - [#118682]) +- Add type hints for list[Device] in test fixtures ([@epenet] - [#118681]) +- Add type hints for requests_mock.Mocker in test fixtures ([@epenet] - [#118678]) +- Use ULID instead of UUID for config entry id and flow ID ([@emontnemery] - [#118677]) +- Update codeowners incomfort integration ([@jbouwh] - [#118700]) +- Allow removal of myuplink device from GUI ([@astrandb] - [#117009]) +- Update the codeowners of the incomfort integration ([@zxdavb] - [#118706]) +- Add Monzo config reauth ([@JakeMartin-ICL] - [#117726]) +- Add HDR type attribute to Kodi ([@starkillerOG] - [#109603]) +- Bump python-MotionMount to 2.0.0 ([@RJPoelstra] - [#118719]) +- Fix incorrect type hint in dremel_3d_printer tests ([@epenet] - [#118709]) +- Bump pytrydan to 0.7.0 ([@dgomes] - [#118726]) +- Add type hints for TTS test fixtures ([@epenet] - [#118704]) +- Add type hints for MockAgent in conversation tests ([@epenet] - [#118701]) +- Migrate recorder instance to use HassKey ([@bdraco] - [#118673]) +- Convert mqtt to use a timer instead of task sleep loop ([@bdraco] - [#118666]) +- Small speed up to read-only database sessions ([@bdraco] - [#118674]) +- Migrate Intergas InComfort/Intouch Lan2RF gateway YAML to config flow ([@jbouwh] - [#118642]) +- Add device info to incomfort entities ([@jbouwh] - [#118741]) +- Speed up statistics_during_period websocket api ([@bdraco] - [#118672]) +- Add os.walk to asyncio loop blocking detection ([@bdraco] - [#118769]) +- Don't require code to arm SimpliSafe ([@bachya] - [#118759]) +- Add type hints for FixtureRequest in tests ([@epenet] - [#118779]) +- Add ista EcoTrend integration ([@tr4nt0r] - [#118360]) +- Azure DevOps build sensor attributes to new sensors ([@timmo001] - [#114948]) +- Remove duplicate code in emoncms ([@alexandrecuer] - [#118610]) +- Bump dawidd6/action-download-artifact from 3.1.4 to 4 (@dependabot - [#118772]) +- Deduplicate light services.yaml ([@emontnemery] - [#118738]) +- Cleanup unused FixtureRequest in tests ([@epenet] - [#118780]) +- Move entity_registry_enabled_by_default to decorator [q-z] ([@epenet] - [#118793]) +- Make Ruuvi a brand ([@joostlek] - [#118786]) +- Make Weatherflow a brand ([@joostlek] - [#118785]) +- Bang & Olufsen add overlay/announce play_media functionality ([@mj23000] - [#113434]) +- Add tests for BMW binary_sensor and lock ([@rikroe] - [#118436]) +- Move mock_hass_config fixture to decorator ([@epenet] - [#118807]) +- Move entity_registry_enabled_by_default to decorator [a-p] ([@epenet] - [#118794]) +- Move enable_bluetooth fixture to decorator ([@epenet] - [#118803]) +- Move None bluetooth fixtures to decorator ([@epenet] - [#118802]) +- Fix incorrect current_request_with_host type hint ([@epenet] - [#118809]) +- Add remote entity to AndroidTV ([@ollo69] - [#103496]) +- Move current_request_with_host fixture to decorator ([@epenet] - [#118810]) +- blebox: update codeowners ([@riokuu] - [#118817]) +- Fix device name not set on all incomfort platforms ([@jbouwh] - [#118827]) +- Bump youless dependency version to 2.1.0 ([@gjong] - [#118820]) +- Use fixtures in UniFi update tests ([@Kane610] - [#118818]) +- Use fixtures in UniFi switch tests ([@Kane610] - [#118831]) +- Remove useless threading locks in mqtt ([@bdraco] - [#118737]) +- Ensure config entries are not unloaded while their platforms are setting up ([@bdraco] - [#118767]) +- Add Reolink serial number to device info of IPC camera ([@starkillerOG] - [#118834]) +- Add diagnostic to V2C ([@dgomes] - [#118823]) +- Bump github/codeql-action from 3.25.7 to 3.25.8 (@dependabot - [#118850]) +- Add more typing to DSMR Reader ([@erwindouna] - [#118852]) +- Move enable_custom_integrations fixture to decorator ([@epenet] - [#118844]) +- Move enable_bluetooth fixture to decorator ([@epenet] - [#118849]) +- Add data coordinator to incomfort integration ([@jbouwh] - [#118816]) +- Detach name from unique id in incomfort ([@joostlek] - [#118862]) +- Bump blebox-uniapi fom 2.2.2 to 2.4.2 ([@swistakm] - [#118836]) +- Add new sensors to blebox ([@swistakm] - [#118837]) +- Add entity descriptions to incomfort binary sensor ([@joostlek] - [#118863]) +- Remove obsolete polling from incomfort water heater ([@joostlek] - [#118860]) +- Introduce incomfort boiler entity ([@joostlek] - [#118861]) +- Update coverage to 7.5.3 ([@cdce8p] - [#118870]) +- Rename esphome fixture ([@epenet] - [#118865]) +- Add binary "sleeping" sensor to Reolink ([@starkillerOG] - [#118774]) +- Allow more input params to webhook generate_url helper ([@zweckj] - [#112334]) +- Fix Ezviz last alarm picture ([@DeKaN] - [#112074]) +- Add state and device class to incomfort ([@joostlek] - [#118877]) +- Add entity translations to incomfort ([@joostlek] - [#118876]) +- Use fixtures in UniFi service tests ([@Kane610] - [#118838]) +- Add support for sending telegram messages to topics ([@r-xyz] - [#112715]) +- Add more unit-based sensor descriptions to myuplink ([@astrandb] - [#113104]) +- Address Webhook `async_generate_url` review ([@zweckj] - [#118910]) +- Bump bthome-ble to 3.9.1 ([@Ernst79] - [#118907]) +- Always do thread safety check when writing state ([@bdraco] - [#118886]) +- Avoid additional timestamp conversion to set state ([@bdraco] - [#118885]) +- Bump pyecotrend_ista to 3.2.0 ([@tr4nt0r] - [#118924]) +- Bump xiaomi-ble to 0.29.0 ([@kvakulo] - [#118895]) +- Add return type hints in tests (k-z) ([@epenet] - [#118942]) +- Bump cryptography to 42.0.8 ([@bdraco] - [#118889]) +- Fix some minor typos in ista EcoTrend integration ([@tr4nt0r] - [#118949]) +- Ignore nested functions when enforcing type hints in tests ([@epenet] - [#118948]) +- Centralize duplicate fixtures in rainforest_raven tests ([@epenet] - [#118945]) +- Bump ruff to 0.4.8 ([@autinerd] - [#118894]) +- Improve type hints in rainforest_raven tests ([@epenet] - [#118950]) +- Load fixture with decorator to avoid variable not accessed error ([@tr4nt0r] - [#118954]) +- Add return type hints in tests (a-i) ([@epenet] - [#118939]) +- Fix type hints in google tests ([@epenet] - [#118941]) +- Add type hints to hdmi_cec assert_state function ([@epenet] - [#118940]) +- Address post-merge review comments from Vallox reconfigure support PR ([@slovdahl] - [#118903]) +- Migrate myuplink to runtime_data ([@astrandb] - [#118960]) +- Remove unused constant in Tag ([@gjohansson-ST] - [#118966]) +- Update mypy-dev to 1.11.0a6 ([@cdce8p] - [#118881]) +- Import Generator from typing_extensions (1) ([@cdce8p] - [#118986]) +- Import Generator from typing_extensions (2) ([@cdce8p] - [#118989]) +- Unhide facebook tests ([@epenet] - [#118867]) +- Move socket_enabled fixture to decorator ([@epenet] - [#118847]) +- Import Generator from typing_extensions (3) ([@cdce8p] - [#118990]) +- Move mock_bluetooth* fixtures to decorator ([@epenet] - [#118846]) +- Import Generator from typing_extensions (5) ([@cdce8p] - [#118993]) +- Import Generator from typing_extensions (4) ([@cdce8p] - [#118992]) +- Improve type hints in apple_tv tests ([@epenet] - [#118980]) +- Increment ci cache version ([@cdce8p] - [#118998]) +- Only entity verify state writable once after success unless hass is missing ([@bdraco] - [#118896]) +- Move evohome's API broker to the coordinator module ([@zxdavb] - [#118565]) +- Set username as entry title in Bring integration ([@tr4nt0r] - [#118974]) +- Fully mock the ring_doorbell api and remove requests_mock ([@sdb9696] - [#113140]) +- Add extra sensor to the Jewish Calendar integration ([@gedaliahknizhnik] - [#116734]) +- Use fixtures in UniFi diagnostics tests ([@Kane610] - [#118905]) +- Use fixtures in UniFi image tests ([@Kane610] - [#118887]) +- Add Aquacell integration ([@Jordi1990] - [#117117]) +- Use torrent id to identify torrents that should trigger events ([@engrbm87] - [#118897]) +- Add the missing humidity value to the Accuweather daily forecast ([@bieniu] - [#119013]) +- Fix Generator annotations in tests (2) ([@cdce8p] - [#119019]) +- Fix Generator annotations in tests (1) ([@cdce8p] - [#119018]) +- Improve type hints in airnow tests ([@epenet] - [#119038]) +- Remove unused request fixtures ([@epenet] - [#119044]) +- Ignore deprecation warning in python-holidays ([@gjohansson-ST] - [#119007]) +- Ecovacs get_positions service ([@lnx85] - [#118572]) +- Add photovoltaic sensors to ViCare integration ([@CFenner] - [#113664]) +- Improve type hints in zamg tests ([@epenet] - [#119042]) +- Improve type hints in motionblinds_ble tests ([@epenet] - [#119049]) +- Improve type hints in kaleidescape tests ([@epenet] - [#119040]) +- Improve type hints in azure_event_hub tests ([@epenet] - [#119047]) +- Bump dawidd6/action-download-artifact from 4 to 5 (@dependabot - [#118851]) +- Enable retrieving sensor data from WoHub2 device and update pySwitchbot to 0.47.2 ([@huyuwei1996] - [#118567]) +- Align weatherflow_cloud weather conditions with Home Assistant supported conditions ([@jeeftor] - [#114497]) +- Improve type hints in homekit_controller tests ([@epenet] - [#119053]) +- Remove unused caplog fixtures in tests ([@epenet] - [#119056]) +- Improve type hints in config tests ([@epenet] - [#119055]) +- Add type hints to current_request_with_host in tests ([@epenet] - [#119054]) +- Add type hint to mock_async_zeroconf in test fixtures ([@epenet] - [#119057]) +- Bump aiowithings to 3.0.1 ([@joostlek] - [#118854]) +- Use fixtures in UniFi sensor tests ([@Kane610] - [#118921]) +- Add mute_toggle to roon volume events ([@pavoni] - [#114171]) +- Refine sensor descriptions for APCUPSD ([@yuxincs] - [#114137]) +- Move mock_async_zeroconf to decorator in homekit tests ([@epenet] - [#119060]) +- Bump solax from 3.1.0 to 3.1.1 ([@Darsstar] - [#118888]) +- Improve type hints in arcam_fmj tests ([@epenet] - [#119072]) +- Improve type hints in airvisual test fixtures ([@epenet] - [#119079]) +- Add template Base64 decode encoding parameter ([@paulusbrand] - [#116603]) +- Improve type hints in assist_pipeline tests ([@epenet] - [#119066]) +- Fix incorrect type hints in azure_data_explorer tests ([@epenet] - [#119065]) +- Add previous track intent ([@OzGav] - [#113222]) +- Bump home-assistant-bluetooth to 1.12.1 ([@bdraco] - [#119026]) +- Move mock_async_zeroconf to decorator in zeroconf tests ([@epenet] - [#119063]) +- Move mock_zeroconf to decorator in tests ([@epenet] - [#119061]) +- Add support for common references in strings.json ([@emontnemery] - [#118783]) +- Use fixtures in UniFi device tracker tests ([@Kane610] - [#118912]) +- Update typing-extensions to 4.12.2 ([@cdce8p] - [#119098]) +- Improve the reliability of tests in Tessie ([@Bre77] - [#118596]) +- Add Tuya based bluetooth lights ([@rwalker777] - [#119103]) +- Add intelligent language matching for Google Assistant SDK Agents ([@t0bst4r] - [#112600]) +- Bump sunweg to 3.0.1 ([@rokam] - [#118435]) +- Require KNX boolean service descriptor selectors ([@farmio] - [#118597]) +- Add support for segmental measurements in Withings ([@joostlek] - [#119126]) +- Improve withings diagnostics ([@joostlek] - [#119128]) +- Use translation placeholders in AccuWeather ([@bieniu] - [#118760]) +- Add icon translations to AccuWeather ([@bieniu] - [#119134]) +- Change BMW select and sensor enums to lowercase ([@rikroe] - [#118751]) +- Add type hints for service_calls fixture in pylint plugin ([@epenet] - [#118356]) +- Refactor Zeversolar init tests ([@NECH2004] - [#118551]) +- Adjust BMW enum sensors translations ([@rikroe] - [#118754]) +- Add new security keys to zwave_js config flow ([@raman325] - [#115835]) +- Update Home Assistant base image to 2024.06.0 ([@frenck] - [#119147]) +- Fix failing UniFi tests related to utcnow ([@Kane610] - [#119131]) +- Enable Ruff PT012 ([@autinerd] - [#113957]) +- Add ZHA XZG firmware discovery ([@xyzroe] - [#116828]) +- Use runtime_data for enigma2 ([@autinerd] - [#119154]) +- Remove old UniFi test infrastructure ([@Kane610] - [#119160]) +- Fix Tami4 component breaking API changes ([@Guy293] - [#119158]) +- Make supported_features of manual alarm_control_panel configurable ([@tronikos] - [#119122]) +- Remove Netgear LTE yaml import ([@tkdrob] - [#119180]) +- Add myself as codeowner for `amazon_polly` ([@jschlyter] - [#119189]) +- Fix sia custom bypass arming in night mode ([@etnoy] - [#119168]) +- Rewrite the UniFi button entity tests ([@Kane610] - [#118771]) +- Migrate august to use yalexs 5.2.0 ([@bdraco] - [#119178]) +- Remove Harmony switches ([@joostlek] - [#119206]) +- Bump incomfort backend library to v0.6.0 ([@jbouwh] - [#119207]) +- Rework UniFi tests to not use runtime data ([@Kane610] - [#119202]) +- Add config flow to MPD ([@joostlek] - [#117907]) +- Improve demo config flow and add tests ([@emontnemery] - [#118481]) +- Create DWD device with unique_id instead of entry_id ([@joostlek] - [#116498]) +- Bump incomfort backend client to v0.6.1 ([@jbouwh] - [#119209]) +- Add reconfigure step for google_travel_time ([@eifinger] - [#115178]) +- Update links between config entry and device on sensor change in integral ([@elupus] - [#119213]) +- Add cabin overheat protection entity to Teslemetry ([@Bre77] - [#118449]) +- Use a listcomp for history results ([@bdraco] - [#119188]) +- Reduce overhead to reduce statistics ([@bdraco] - [#119187]) +- Fix - Remove unneeded assert in teslemetry test ([@jbouwh] - [#119219]) +- Bump monzopy to 1.3.0 ([@JakeMartin-ICL] - [#119225]) +- Improve type hints in ambient_station tests ([@epenet] - [#119230]) +- Improve type hints in amberelectric tests ([@epenet] - [#119229]) +- Fixture cleanup in UniFi tests ([@Kane610] - [#119227]) +- Bump pyschlage to 2024.6.0 ([@dknowles2] - [#119233]) +- Bump reolink-aio to 0.9.2 ([@starkillerOG] - [#119236]) +- Add Reolink manual record switch ([@starkillerOG] - [#119232]) +- Add boiler entity state translations for incomfort water_heater entities ([@jbouwh] - [#119211]) +- Add model to Teslemetry Wall Connectors ([@Bre77] - [#119251]) +- Fix nest to cancel event listener on config entry unload ([@allenporter] - [#119257]) +- google_travel_time: Merge user_input validation ([@eifinger] - [#119221]) +- Improve type hints in blackbird tests ([@epenet] - [#119262]) +- Moves V2C from hass.data to config_entry.runtime_data ([@dgomes] - [#119165]) +- Improve type hints in blueprint tests ([@epenet] - [#119263]) +- Improve type hints in axis tests ([@epenet] - [#119260]) +- Improve type hints in camera tests ([@epenet] - [#119264]) +- Use device_registry fixture in webostv tests ([@epenet] - [#119269]) +- Use service_calls fixture in bthome tests ([@epenet] - [#119268]) +- Improve incomfort boiler state strings ([@jbouwh] - [#119270]) +- Use service_calls fixture in scaffold ([@epenet] - [#119266]) +- Use relative imports in tests [a-i] ([@epenet] - [#119280]) +- Use service_calls fixture in arcam_fmj tests ([@epenet] - [#119274]) +- Fix root-import pylint warning in dlna_dmr tests ([@epenet] - [#119286]) +- Use relative imports in tests [j-r] ([@epenet] - [#119282]) +- Use relative imports in tests [s-z] ([@epenet] - [#119283]) +- Avoid references to websocket_api.const in core and other components ([@epenet] - [#119285]) +- Change qBittorrent lib to qbittorrentapi ([@Sebclem] - [#113394]) +- Don't run tests if lint-ruff-format fails ([@epenet] - [#119291]) +- Use service_calls fixture in helper tests ([@epenet] - [#119275]) +- Use Registry fixture in zwave_js tests ([@epenet] - [#119277]) +- Fix root-import pylint warning in components ([@epenet] - [#119294]) +- Fix namespace-import pylint warning in components ([@epenet] - [#119299]) +- Add code_format_template to template locks ([@chammp] - [#106947]) +- Add support for animal detection in unifiprotect ([@wfltaylor] - [#116290]) +- Log errors in Intent.async_handle ([@tronikos] - [#119182]) +- bump aiobotocore to 2.13.0 ([@chemelli74] - [#119297]) +- Add HVACAction to incomfort climate devices ([@jbouwh] - [#119315]) +- Fix incomfort water heater return translated fault code ([@jbouwh] - [#119311]) +- Migrate lamarzocco to lmcloud 1.1 ([@zweckj] - [#113935]) +- Improve type hints in registry helper tests ([@epenet] - [#119302]) +- Improve type hints in aiohttp_client helper tests ([@epenet] - [#119300]) +- Use runtime_data in Husqvarna Automower ([@cyr-ius] - [#119309]) +- Add OSO Energy temperature sensors ([@osohotwateriot] - [#119301]) +- Improve incomfort binary sensors ([@jbouwh] - [#119292]) +- Refactor helpers and bump Teslemetry ([@Bre77] - [#119246]) +- Add options flow to enigma2 ([@autinerd] - [#115795]) +- Add price service call to Tibber ([@basbruss] - [#117366]) +- Update Airzone Cloud to v0.5.2 and add fan speeds to Zones ([@Noltari] - [#119314]) +- Migrate august to use yalexs 6.0.0 ([@bdraco] - [#119321]) +- Fix enigma2 option flow ([@jbouwh] - [#119335]) +- Speed up generating large stats results ([@bdraco] - [#119210]) +- Move runtime_data deletion after unload ([@JakeMartin-ICL] - [#119224]) +- Allow source sensor to be changed in threshold helper ([@elupus] - [#119157]) +- Bump incomfort backend client to v0.6.2 ([@jbouwh] - [#119330]) +- Fix typo in Ecovacs integration ([@middlingphys] - [#119346]) +- Add Xiaomi Air Purifier Pro H EU (zhimi.airpurifier.vb2) ([@Ishima] - [#119149]) +- Customize incomfort binary sensor icons ([@jbouwh] - [#119331]) +- Bump aioesphomeapi to 24.6.0 ([@jesserockz] - [#119348]) +- OpenAI to respect custom conversation IDs ([@balloob] - [#119307]) +- Avoid cross-domain imports in scrape tests ([@epenet] - [#119351]) +- Use absolute import in roborock tests ([@epenet] - [#119353]) +- Ignore some pylint errors in component tests ([@epenet] - [#119352]) +- Fix namespace-import pylint warning in shelly tests ([@epenet] - [#119349]) +- Fix typo in Tibber service description ([@Betacart] - [#119354]) +- Fix pointless-string-statement pylint warning in emulated_hue tests ([@epenet] - [#119368]) +- Ignore c-extension-no-member pylint warnings in tests ([@epenet] - [#119378]) +- Allow importing typing helper in core files ([@emontnemery] - [#119377]) +- Fix typo in auth ([@emontnemery] - [#119388]) +- Fix missing checks in core config test ([@emontnemery] - [#119387]) +- Fix pylint warnings in xiaomi tests ([@epenet] - [#119373]) +- Fix import-outside-toplevel pylint warnings in tests ([@epenet] - [#119389]) +- Fix pylint warnings in testing config custom components ([@epenet] - [#119370]) +- Fix non-parent-init-called pylint warning in google_assistant tests ([@epenet] - [#119367]) +- Fix typo in pylint plugin ([@epenet] - [#119362]) +- Improve type hints in yaml util tests ([@epenet] - [#119358]) +- Fix confusing-with-statement pylint warnings ([@epenet] - [#119364]) +- Fix import pylint warning in core tests ([@epenet] - [#119359]) +- Bump pyElectra to 1.2.3 ([@jafar-atili] - [#119369]) +- Fix use-maxsplit-arg pylint warnings in tests ([@epenet] - [#119366]) +- Fix consider-using-with pylint warnings in matrix tests ([@epenet] - [#119365]) +- Improve type hints and fix pylint warnings in util tests ([@epenet] - [#119355]) +- Use statistic tables' duration attribute instead of magic numbers ([@emontnemery] - [#119356]) +- Add switch to Tuya thermostat: child_lock ([@Sese-Schneider] - [#113052]) +- Fix incorrect constants in streamlabswater tests ([@epenet] - [#119399]) +- Drop use of deprecated constant in zha tests ([@epenet] - [#119397]) +- Fix incorrect constants in google_travel_time tests ([@epenet] - [#119395]) +- Fix import-outside-toplevel pylint warnings in core tests ([@epenet] - [#119394]) +- Remove deprecated imports in config tests ([@epenet] - [#119393]) +- Fix unnecessary-dunder-call pylint warnings in tests ([@epenet] - [#119379]) +- Support shared keys starting with period in services.yaml ([@emontnemery] - [#118789]) +- Ignore no-name-in-module warnings in tests ([@epenet] - [#119401]) +- Fix pointless-exception-statement warning in tests ([@epenet] - [#119402]) +- Fix use-implicit-booleaness-not-len warnings in tests ([@epenet] - [#119407]) +- Fix unspecified-encoding warnings in tests ([@epenet] - [#119405]) +- Ignore misplaced-bare-raise warnings in tests ([@epenet] - [#119403]) +- Adjust nacl import in tests ([@epenet] - [#119392]) +- Restructure and setup dedicated coordinator for Azure DevOps ([@timmo001] - [#119199]) +- Add support for Tuya non-standard contact sensors ([@dkrahmer] - [#115557]) +- Migrate lamarzocco to entry.runtime_data ([@zweckj] - [#119425]) +- Ignore broad-exception-raised pylint warnings in tests ([@epenet] - [#119468]) +- Ignore attribute-defined-outside-init pylint warnings in tests ([@epenet] - [#119470]) +- Use pytest.mark.parametrize in airthings_ble tests ([@epenet] - [#119461]) +- Ignore undefined-loop-variable pylint warnings in zha tests ([@epenet] - [#119476]) +- Fix arguments-renamed pylint warning in tests ([@epenet] - [#119473]) +- Store runtime data inside the config entry in Dremel 3D Printer ([@tkdrob] - [#119441]) +- Fix consider-using-tuple pylint warnings in core tests ([@epenet] - [#119463]) +- Fix bad-chained-comparison pylint warning in tests ([@epenet] - [#119477]) +- Store runtime data inside the config entry in Google Sheets ([@tkdrob] - [#119438]) +- Remove redundant logging from evohome ([@zxdavb] - [#119482]) +- Forward Z-Wave JS `node found` event to frontend ([@AlCalzone] - [#118866]) +- Translation support for device automation extra fields ([@farmio] - [#115892]) +- Migrate AirGradient to runtime_data ([@joostlek] - [#119491]) +- Fix typo in Camera.turn_on ([@tronikos] - [#119386]) +- Store transmission coordinator in runtime_data ([@engrbm87] - [#119502]) +- Fix consider-using-tuple pylint warnings in component tests ([@epenet] - [#119464]) +- Fix consider-using-enumerate warnings in tests ([@epenet] - [#119506]) +- Ignore existing fixme pylint warnings in tests ([@epenet] - [#119500]) +- Fix consider-using-dict-items warnings in tests ([@epenet] - [#119497]) +- Migrate Airtouch4 to runtime_data ([@joostlek] - [#119493]) +- Store runtime data inside the config entry in Google Mail ([@tkdrob] - [#119439]) +- Store runtime data inside the config entry in Goalzero ([@tkdrob] - [#119440]) +- Support reconfigure flow in Brother integration ([@bieniu] - [#117298]) +- Migrate Airzone cloud to runtime_data ([@joostlek] - [#119495]) +- Migrate Airzone to runtime_data ([@joostlek] - [#119494]) +- Migrate unifiprotect to use entry.runtime_data ([@bdraco] - [#119507]) +- Fix attribute-defined-outside-init pylint warnings in tests ([@epenet] - [#119471]) +- Store runtime data inside the config entry in Dlink ([@tkdrob] - [#119442]) +- Fix broad-exception-raised in component tests ([@epenet] - [#119467]) +- Ignore super-init-not-called pylint warnings in tests ([@epenet] - [#119474]) +- Fix attribute-defined-outside-init pylint warning in anova tests ([@epenet] - [#119472]) +- Fix deprecated-typing-alias pylint warnings in zha tests ([@epenet] - [#119453]) +- Fix redefined-argument-from-local pylint warning in tests ([@epenet] - [#119475]) +- Remove unreachable sensor code in unifiprotect ([@bdraco] - [#119501]) +- Remove pointless TODO in recorder tests ([@epenet] - [#119490]) +- Refactor adding entities to unifiprotect ([@bdraco] - [#119512]) +- Add UniFi sensor for number of clients connected to a device ([@Kane610] - [#119509]) +- Add Danfoss Ally thermostat and derivatives to ZHA ([@Caius-Bonus] - [#86907]) +- Refactor unifiprotect media_source to remove type ignores ([@bdraco] - [#119516]) +- Simplify unifiprotect device removal code ([@bdraco] - [#119517]) +- Fix typo in lovelace ([@emontnemery] - [#119523]) +- Fix typos in collection helper ([@emontnemery] - [#119524]) +- Remove useless delegation in unifiprotect ([@bdraco] - [#119514]) +- Add state icons to incomfort water_heater entities ([@jbouwh] - [#119527]) +- Ignore too-many-nested-blocks warning in zha tests ([@epenet] - [#119479]) +- Fix contextmanager-generator-missing-cleanup warning in tests ([@epenet] - [#119478]) +- Device automation extra fields translation for Z-Wave-JS ([@farmio] - [#119529]) +- Device automation extra fields translation for LCN ([@farmio] - [#119519]) +- Fix typo in google_assistant ([@emontnemery] - [#119522]) +- Return override target temp for incomfort climate ([@jbouwh] - [#119528]) +- Add missing attribute translations to water heater entity component ([@jpbede] - [#119531]) +- Remove steam temp sensor for Linea Mini ([@zweckj] - [#119423]) +- Remove `async_late_forward_entry_setups` and instead implicitly hold the lock ([@bdraco] - [#119088]) +- Fix dangerous-default-value in nest tests ([@epenet] - [#119561]) +- Fix dangerous-default-value in zha tests ([@epenet] - [#119560]) +- Ensure asyncio blocking checks are undone after tests run ([@bdraco] - [#119542]) +- Bump dawidd6/action-download-artifact from 5 to 6 (@dependabot - [#119565]) +- Bump github/codeql-action from 3.25.8 to 3.25.9 (@dependabot - [#119567]) +- Fix unnecessary-lambda warnings in tests ([@epenet] - [#119563]) +- Store runtime data inside the config entry in Tautulli ([@tkdrob] - [#119552]) +- Bump actions/checkout from 4.1.6 to 4.1.7 (@dependabot - [#119566]) +- Fix dangerous-default-value warnings in switchbot tests ([@epenet] - [#119575]) +- Fix dangerous-default-value warnings in integration tests ([@epenet] - [#119574]) +- Fix dangerous-default-value warnings in version tests ([@epenet] - [#119577]) +- Fix dangerous-default-value warnings in canary tests ([@epenet] - [#119578]) +- Fix dangerous-default-value warnings in automation tests ([@epenet] - [#119576]) +- Classify more ecowitt power supply sensors as diagnostics ([@wgrant] - [#119555]) +- Improve code readability ([@matrixd2] - [#119558]) +- Fix dangerous-default-value warnings in cloud tests ([@epenet] - [#119585]) +- Bump deebot-client to 8.0.0 ([@edenhaus] - [#119515]) +- Store Mikrotik coordinator in runtime_data ([@engrbm87] - [#119594]) +- Fix dangerous-default-value warnings in deconz tests ([@epenet] - [#119599]) +- Fix import-outside-toplevel pylint warnings in zha tests ([@epenet] - [#119451]) +- Fix dangerous-default-value warnings in lastfm tests ([@epenet] - [#119601]) +- Fix dangerous-default-value warnings in fronius tests ([@epenet] - [#119600]) +- Use send_json_auto_id in some collection tests ([@emontnemery] - [#119570]) +- Fix dangerous-default-value warnings in greeneye_monitor tests ([@epenet] - [#119581]) +- Fix dangerous-default-value warnings in mqtt tests ([@epenet] - [#119584]) +- Fix dangerous-default-value warnings in subaru tests ([@epenet] - [#119604]) +- Store islamic prayer times coordinator in runtime_data ([@engrbm87] - [#119612]) +- Fix dangerous-default-value warnings in tessie tests ([@epenet] - [#119605]) +- Fix dangerous-default-value warnings in auth tests ([@epenet] - [#119597]) +- Fix dangerous-default-value warnings in environment_canada tests ([@epenet] - [#119586]) +- Fix attribute-defined-outside-init in harmony tests ([@epenet] - [#119614]) +- Store imap coordinator in runtime_data ([@engrbm87] - [#119611]) +- Ignore unnecessary-lambda warnings in tests ([@epenet] - [#119564]) +- Fix dangerous-default-value warnings in panasonic_viera tests ([@epenet] - [#119602]) +- Fix consider-using-with warnings in core tests ([@epenet] - [#119606]) +- Fix dangerous-default-value warnings in cloudflare tests ([@epenet] - [#119598]) +- Fix dangerous-default-value warnings in plex tests ([@epenet] - [#119603]) +- Fix dangerous-default-value warnings in rituals_perfume_genie tests ([@epenet] - [#119590]) +- Fix dangerous-default-value warnings in aussie broadband tests ([@epenet] - [#119596]) +- Fix dangerous-default-value warnings in control4 tests ([@epenet] - [#119592]) +- Fix dangerous-default-value warnings in homematicip_cloud tests ([@epenet] - [#119583]) +- Fix dangerous-default-value warnings in ezviz tests ([@epenet] - [#119589]) +- Fix dangerous-default-value warnings in nzbget tests ([@epenet] - [#119580]) +- Fix dangerous-default-value warnings in core tests ([@epenet] - [#119568]) +- Reduce duplicate code in unifiprotect ([@bdraco] - [#119624]) +- Bump aioautomower to 2024.6.0 ([@Thomas55555] - [#119625]) +- Cleanup Reolink firmware update entity ([@starkillerOG] - [#119239]) +- Wait for background tasks in Shelly tests ([@thecode] - [#119636]) +- Migrate library to PyLoadAPI 1.1.0 in pyLoad integration ([@tr4nt0r] - [#116053]) +- Use the existing api client for unifiprotect repairs if available ([@bdraco] - [#119640]) +- Dispatch unifiprotect websocket messages based on model ([@bdraco] - [#119633]) +- Remove obsolete device links in Utility Meter helper ([@dougiteixeira] - [#119328]) +- Fix blocking IO calls in mqtt client setup ([@jbouwh] - [#119647]) +- Bump python-fullykiosk to 0.0.13 ([@tronikos] - [#119544]) +- Use single list for Shelly non-sleeping platforms ([@thecode] - [#119540]) +- Allow arm levels be in order for google assistant ([@elupus] - [#119645]) +- Fix Yolink device incorrect state ([@matrixd2] - [#119658]) +- Improve error messages when config entry is in wrong state ([@emontnemery] - [#119591]) +- Adjust incorrect unnecessary-lambda pylint disable statement in demo tests ([@epenet] - [#119666]) +- Add missing return type to some test functions ([@epenet] - [#119665]) +- Fix blocking I/O in CachingStaticResource ([@bdraco] - [#119663]) +- Tweak logging statements in tests ([@epenet] - [#119664]) +- Store Glances coordinator in runtime_data ([@engrbm87] - [#119607]) +- Add missing argument type to core tests ([@epenet] - [#119667]) +- Reduce recorder overhead when entity filter is empty ([@bdraco] - [#119631]) +- Rename collection.CollectionChangeSet to collection.CollectionChange ([@emontnemery] - [#119532]) +- Add missing argument type hints to recorder tests ([@epenet] - [#119672]) +- Add missing argument type hints to component tests ([@epenet] - [#119671]) +- Force full CI on all root test files ([@epenet] - [#119673]) +- Bump github/codeql-action from 3.25.9 to 3.25.10 (@dependabot - [#119669]) +- Bump codecov/codecov-action from 4.4.1 to 4.5.0 (@dependabot - [#119668]) +- Move fixtures to decorators in core tests ([@epenet] - [#119675]) +- Add firmware update entities for Reolink IPC channel cameras ([@starkillerOG] - [#119637]) +- Split binary sensor classes in unifiprotect ([@bdraco] - [#119696]) +- Refactor unifiprotect switch to match other platforms ([@bdraco] - [#119698]) +- Fix pyload async_update SensorEntity raising exceptions ([@tr4nt0r] - [#119655]) +- Remove set default doorbell text service from unifiprotect ([@bdraco] - [#119695]) +- Reduce code needed to check unifiprotect attrs ([@bdraco] - [#119706]) +- Add work area sensor for Husqvarna Automower ([@Thomas55555] - [#119704]) +- Prefer mp4 playback in Reolink ([@starkillerOG] - [#119630]) +- Envisalink add arming as a state to alarm control panel ([@jaym25] - [#119702]) +- Update aioazuredevops to 2.1.1 ([@timmo001] - [#119720]) +- Add open state support to matter lock ([@piitaya] - [#119682]) +- Bump ruff to 0.4.9 ([@autinerd] - [#119721]) +- Device automation extra fields translation for KNX ([@farmio] - [#119518]) +- Bring back auto on off switches to lamarzocco ([@zweckj] - [#119421]) +- Add unique IDs to config entries for Teslemetry ([@Bre77] - [#115616]) +- Moves diagnostic information from attributes to diagnostic in Utility Meter ([@dgomes] - [#118637]) +- Make the radius of the home zone configurable ([@emontnemery] - [#119385]) +- Improve logging use of deprecated `schema` option for mqtt vacuum ([@jbouwh] - [#119724]) +- Store runtime data inside the config entry in Efergy ([@tkdrob] - [#119551]) +- Cleanup unifiprotect entity model ([@bdraco] - [#119746]) +- Reolink extend diagnostic data ([@starkillerOG] - [#119745]) +- Cleanup Shelly entry unload ([@thecode] - [#119748]) +- Migrate unifiprotect to use has_entity_name ([@bdraco] - [#119759]) +- Track primary integration ([@balloob] - [#119741]) +- Speed up getting conversation agent languages ([@balloob] - [#119554]) +- Fix precision for unifiprotect sensors ([@bdraco] - [#119781]) +- Bump uiprotect to 1.12.0 ([@bdraco] - [#119763]) +- Reduce duplicate code in unifiprotect entities ([@bdraco] - [#119779]) +- Move unifiprotect services register to async_setup ([@bdraco] - [#119786]) +- Add some suggested units to unifiprotect sensors ([@bdraco] - [#119790]) +- Cleanup unifiprotect ProtectData object ([@bdraco] - [#119787]) +- Remove not used group class method ([@jbouwh] - [#119798]) +- Increase unifiprotect polling interval to 60s ([@bdraco] - [#119800]) +- Bump uiprotect to 1.12.1 ([@bdraco] - [#119799]) +- Remove beat (internet time) from time_date ([@gjohansson-ST] - [#119785]) +- Add device trackers to tplink_omada ([@MarkGodwin] - [#115601]) +- Bump uiprotect to 1.17.0 ([@bdraco] - [#119802]) +- Remove YAML import from System monitor ([@gjohansson-ST] - [#119782]) +- Remove YAML import from streamlabswater ([@gjohansson-ST] - [#119783]) +- Remove deprecated speedtest service from Fast.com ([@gjohansson-ST] - [#119780]) +- Add number input for apsystems ([@mawoka-myblock] - [#118825]) +- Add support for Tuya energy data for WKCZ devices ([@azerty9971] - [#119635]) +- Fix consider-using-tuple warning in tplink_omada tests ([@epenet] - [#119814]) +- Remove create_list from StorageCollectionWebsocket.async_setup ([@emontnemery] - [#119508]) +- Bump reolink-aio to 0.9.3 ([@starkillerOG] - [#119820]) +- Remove deprecated import swiss public transport import flow ([@joostlek] - [#119813]) +- Avoid touching internals in Radarr tests ([@joostlek] - [#119821]) +- Store runtime data inside the config entry in Radarr ([@tkdrob] - [#119749]) +- Migrate Emoncms to external library ([@alexandrecuer] - [#119772]) +- Add tests of frontend.add_extra_js_url ([@emontnemery] - [#119826]) +- Add frontend.remove_extra_js_url ([@emontnemery] - [#119831]) +- Use "Button" label to name Matter event ([@jvmahon] - [#119768]) +- Remove the switch entity for Shelly Gas Valve ([@bieniu] - [#119817]) +- Bump uiprotect to 1.18.1 ([@bdraco] - [#119848]) +- Fix Dremel 3D printer tests ([@joostlek] - [#119853]) +- Run Radarr movie coordinator first refresh in background ([@tkdrob] - [#119827]) +- Fix homekit_controller haa fixture ([@bdraco] - [#119855]) +- Remove legacy get forecast service from Weather ([@gjohansson-ST] - [#118664]) +- Use the humidity value in Shelly Wall Display climate entity ([@bieniu] - [#119830]) +- Bump xiaomi_ble to 0.30.0 ([@ChristophCaina] - [#119859]) +- Bump uiprotect to 0.19.0 ([@bdraco] - [#119863]) +- Handle general update failure in Sense ([@tkdrob] - [#119739]) +- Store runtime data inside the config entry in Sense ([@tkdrob] - [#119740]) +- Add esphome native device update entities ([@jesserockz] - [#119339]) +- Bump aioautomower to 2024.6.1 ([@Thomas55555] - [#119871]) +- Inline primary integration ([@balloob] - [#119860]) +- Fix blocking I/O in the event loop when registering static paths ([@bdraco] - [#119629]) +- Replace Solarlog unmaintained library ([@dontinelli] - [#117484]) +- Add update coordinator to Netgear LTE ([@tkdrob] - [#115474]) +- Store runtime data inside the config entry in Lidarr ([@tkdrob] - [#119548]) +- Gracefully disconnect MQTT entry if entry is reloaded ([@jbouwh] - [#119753]) +- Ignore use-implicit-booleaness-not-comparison pylint warnings in tests ([@epenet] - [#119876]) +- Centralize lidarr device creation ([@joostlek] - [#119822]) +- Store runtime data inside the config entry in Steam ([@tkdrob] - [#119881]) +- Fix hass-component-root-import warning in esphome tests ([@epenet] - [#119883]) +- Move fixtures to decorators in netgear_lte tests ([@epenet] - [#119882]) +- Store runtime data inside the config entry in Deluge ([@tkdrob] - [#119549]) +- Improve type hints in data_entry_flow tests ([@epenet] - [#119877]) +- Add Tidal play_media support to Bang & Olufsen ([@mj23000] - [#119838]) +- Bump lmcloud to 1.1.13 ([@zweckj] - [#119880]) +- Update cover intent response ([@balloob] - [#119756]) +- Add WS command for subscribing to storage collection changes ([@emontnemery] - [#119481]) +- Add WS command frontend/subscribe_extra_js ([@emontnemery] - [#119833]) +- Add myself as codeowner for Nanoleaf ([@joostlek] - [#119892]) +- Small cleanup to unifiprotect entity descriptions ([@bdraco] - [#119904]) +- Remove useless function get_ufp_event from unifiprotect ([@bdraco] - [#119906]) +- Fix typo in KEY_ALLOW_CONFIGRED_CORS ([@bdraco] - [#119905]) +- Extract coordinator to separate module in Nanoleaf ([@joostlek] - [#119896]) +- Fix late group platform registration ([@jbouwh] - [#119789]) +- Add type hints to MockGroup and MockUser in tests ([@epenet] - [#119897]) +- Update airgradient names to NOx index and VOC index ([@MallocArray] - [#119152]) +- Bump airgradient to 0.5.0 ([@joostlek] - [#119911]) +- Add button platform to Husqvarna Automower ([@Thomas55555] - [#119856]) +- DNS IP custom ports for IPv4 ([@HarvsG] - [#113993]) +- Remove YAML import for Suez Water ([@gjohansson-ST] - [#119923]) +- Allow removal of a Switcher device ([@thecode] - [#119927]) +- Remove deprecated blink refresh service ([@gjohansson-ST] - [#119919]) +- Register Z-Wave services on integration setup ([@frenck] - [#119924]) +- Add more airgradient configuration entities ([@joostlek] - [#119191]) +- Small cleanups to august ([@bdraco] - [#119912]) +- Cleanup code to add august sensors ([@bdraco] - [#119929]) +- Add pulse counter frequency sensors to Shelly ([@bieniu] - [#119898]) +- Reduce duplicate code in august to create entities ([@bdraco] - [#119934]) +- Small cleanups to august ([@bdraco] - [#119931]) +- Update yalexs to 6.1.0 ([@bdraco] - [#119910]) +- Cleanup august dataclasses ([@bdraco] - [#119938]) +- Bump yalexs to 6.3.0 to move camera logic to the lib ([@bdraco] - [#119941]) +- Remove code slated for deletion in integral ([@elupus] - [#119935]) +- Reduce duplicate code in baf for entities with descriptions ([@bdraco] - [#119945]) +- Combine statements that return the same result in august binary_sensor ([@bdraco] - [#119944]) +- Reduce code needed to set august unique ids ([@bdraco] - [#119942]) +- Deprecate register_static_path in favor of async_register_static_paths ([@bdraco] - [#119895]) +- Make use_device_name a cached_property in the base entity class ([@bdraco] - [#119758]) +- Bump sqlalchemy to 2.0.31 ([@bdraco] - [#119951]) +- Address review on comment group registry maintenance ([@jbouwh] - [#119952]) +- Update default pylint.importStrategy in dev container ([@epenet] - [#119900]) +- Small cleanups to august ([@bdraco] - [#119950]) +- Bump airgradient to 0.6.0 ([@joostlek] - [#119962]) +- Clean up config option tests in UniFi device tracker tests ([@Kane610] - [#119978]) +- Fix flaky todoist test ([@jbouwh] - [#119954]) +- Clean weather tests ([@gjohansson-ST] - [#119916]) +- Improve typing in core tests ([@epenet] - [#119958]) +- Tweak type annotations of energy websocket handlers ([@emontnemery] - [#119957]) +- Remove deprecated WLED binary sensor platform ([@frenck] - [#119984]) +- Address Hydrawise review ([@PeteRager] - [#119965]) +- Update yalexs to 6.4.0 ([@bdraco] - [#119987]) +- Move Nanoleaf event canceling ([@joostlek] - [#119909]) +- Unifi break out switch availability test to separate test ([@Kane610] - [#119990]) +- Use aiohttp.ClientSession in EmoncmsClient ([@alexandrecuer] - [#119989]) +- Remove legacy_api_password auth provider ([@edenhaus] - [#119976]) +- Use MockHAClientWebSocket.send_json_auto_id in blueprint tests ([@emontnemery] - [#119956]) +- Remove circuit integration ([@gjohansson-ST] - [#119921]) +- Fix Sonos album images with special characters not displaying in media browser UI ([@PeteRager] - [#118249]) +- Update PySwitchbot to 0.48.0 ([@szclsya] - [#119998]) +- Only (re)subscribe MQTT topics using the debouncer ([@jbouwh] - [#119995]) +- Add config flow to One-Time Password (OTP) integration ([@tr4nt0r] - [#118493]) +- Add Sensor for Refoss Integration ([@ashionky] - [#116965]) +- Use runtimedata in nanoleaf ([@joostlek] - [#120009]) +- Small clean up for Refoss sensor platform ([@joostlek] - [#120015]) +- Fix hass-component-root-import warnings in otp tests ([@epenet] - [#120019]) +- Change meteoalarm scan interval ([@mikosoft83] - [#119194]) +- Enable pylint on tests ([@epenet] - [#119279]) +- Bump aiounifi to v79 ([@Kane610] - [#120033]) +- Bump uiprotect to 1.19.2 ([@bdraco] - [#120048]) +- Cleanup unifiprotect subscriptions logic ([@bdraco] - [#120049]) +- Add support for Switchbot Lock Pro ([@szclsya] - [#119326]) +- Fix unifiprotect smart detection when end is set ([@bdraco] - [#120027]) +- Disable generic unifiprotect object sensors by default ([@bdraco] - [#120059]) +- Make preset list indicate whether the current mount position matches a preset in Vogel's Motionmount ([@RJPoelstra] - [#118731]) +- Add Bang olufsen init testing ([@mj23000] - [#119834]) +- Bump actions/checkout from 4.1.6 to 4.1.7 (@dependabot - [#120063]) +- Fix translation key in config flow of One-Time Password (OTP) integration ([@tr4nt0r] - [#120053]) +- Bump zwave-js-server-python to 0.57.0 ([@raman325] - [#120047]) +- Update pydantic to 1.10.17 ([@cdce8p] - [#119430]) +- Update aioairzone to v0.7.7 ([@Noltari] - [#120067]) +- Add unique_id to One-Time Password (OTP) ([@tr4nt0r] - [#120050]) +- Bump anyio to 4.4.0 ([@bdraco] - [#120061]) +- Make UniFi services handle unloaded config entry ([@Kane610] - [#120028]) +- Fix calculation in Refoss ([@joostlek] - [#120069]) +- Add Ambient Weather brand ([@thomaskistler] - [#115898]) +- Revert "Temporary pin CI to Python 3.12.3" ([@epenet] - [#119454]) +- Add sensor tests for APSystems ([@joostlek] - [#117512]) +- Add MockPlatform type hints in tests ([@epenet] - [#120012]) +- Add Mealie integration ([@joostlek] - [#119678]) +- Raise repair issues when automations can't be set up ([@emontnemery] - [#120010]) +- Add icons to One-Time Password (OTP) ([@tr4nt0r] - [#120066]) +- Add Siemes and Millisiemens as additional units of conductivity and enable conversion between conductivity units ([@dontinelli] - [#118728]) +- Add MockModule type hints in tests ([@epenet] - [#120007]) +- Add event entity to Nanoleaf ([@joostlek] - [#120013]) +- Remove legacy list event calendar service ([@gjohansson-ST] - [#118663]) +- Store runtime data inside the config entry in Litter Robot ([@tkdrob] - [#119547]) +- Fix charge behavior in Tessie ([@Bre77] - [#119546]) +- Make attribute names in dnsip lowercase (for translation) ([@gjohansson-ST] - [#119727]) +- Add type hints in automation tests ([@epenet] - [#120077]) +- Add entities with no data in Tessie ([@Bre77] - [#119550]) +- Check Reolink IPC channels for firmware repair issue ([@starkillerOG] - [#119241]) +- Avoid constructing unifiprotect enabled callable when unused ([@bdraco] - [#120074]) +- Adjust CI job for Check pylint on tests ([@epenet] - [#120080]) +- Bump pyecotrend-ista to 3.3.1 ([@tr4nt0r] - [#120037]) +- Fix unit of measurement for Comed Hourly Pricing ([@themaxgross] - [#115594]) +- Improve UniFi device tracker client tests ([@Kane610] - [#119982]) +- OpenWeatherMap remove obsolete forecast sensors ([@freekode] - [#119922]) +- Tuya's light POS actually means "opposite state" ([@igorsantos07] - [#119948]) +- Add unrecorded attributes in dnsip ([@gjohansson-ST] - [#119726]) +- Bump uiprotect to 1.19.3 ([@bdraco] - [#120079]) +- Bump aiomealie to 0.4.0 ([@joostlek] - [#120076]) +- Add MockToggleEntity type hints in tests ([@epenet] - [#120075]) +- Add additional tests for solarlog ([@dontinelli] - [#119928]) +- Calculate device class as soon as it is known in integral ([@elupus] - [#119940]) +- Remove legacy template hass config option ([@gjohansson-ST] - [#119925]) +- Move transmission services registration to async_setup ([@engrbm87] - [#119593]) +- Add one UniFi sensor test to validate entity attributes ([@Kane610] - [#119914]) +- System information: apply sentence-style capitalization ([@c0ffeeca7] - [#119893]) +- Move coordinator store to entry runtime data for Azure DevOps ([@timmo001] - [#119408]) +- Update mypy dev 1.11.0a8 ([@cdce8p] - [#120032]) +- Samsung AC Wind Mode ([@cermakjn] - [#119750]) +- Pin codecov-cli to v0.6.0 ([@TheJulianJES] - [#120084]) +- Generate and keep conversation id for Wyoming satellite ([@synesthesiam] - [#118835]) +- Add reauth flow to ista EcoTrend integration ([@tr4nt0r] - [#118955]) +- Add Home Connect child lock ([@erwindouna] - [#118544]) +- Support tuya diivoo dual zone irrigationkit (ggq) ([@neturmel] - [#115090]) +- Reduce line length for unique id ([@timmo001] - [#120086]) +- Add ZHA cod.m coordinator discovery ([@tsmt09] - [#115471]) +- Add solarlog reconfigure flow ([@dontinelli] - [#119913]) +- Add playback of autotrack lens to Reolink ([@starkillerOG] - [#119829]) +- Remove rstrip from ecobee binary_sensor __init__ ([@bjpetit] - [#118062]) +- Fix removed exception InternalServerError in ista EcoTrend integration ([@tr4nt0r] - [#120089]) +- Fix solarlog client close ([@cdce8p] - [#120092]) +- Improve type hints in Config entry oauth2 tests ([@epenet] - [#120090]) +- Add device linking and stale device link clean up helpers ([@dougiteixeira] - [#119761]) +- Bump motionblindsble to 0.1.0 ([@LennP] - [#120093]) +- Fix `for` in climate hvac_mode_changed trigger ([@karwosts] - [#116455]) +- Add entity ids to grouped hue light ([@marcelveldt] - [#113053]) +- MelCloud add diagnostics platform ([@erwindouna] - [#115962]) +- Add camera entity in Fully Kiosk Browser ([@tronikos] - [#119483]) +- Add backflush sensor to lamarzocco ([@zweckj] - [#119888]) +- Fix Husqvarna Automower schedule switch turning back on ([@Thomas55555] - [#117692]) +- Improve type hints in core helper tests ([@epenet] - [#120096]) +- Add number platform to Matter integration ([@jvmahon] - [#119770]) +- Allow opting out of warnings when removing unknown frontend panel ([@emontnemery] - [#119824]) +- Refactor sensor platform of Pyload integration ([@tr4nt0r] - [#119716]) +- Update aioairzone-cloud to v0.5.3 ([@Noltari] - [#120100]) +- Tado water heater code quality changes ([@ethemcemozkan] - [#119811]) +- Bum uv to 0.2.13 ([@edenhaus] - [#120101]) +- Include required name in reauth_confirm of Opower ([@tronikos] - [#119627]) +- Add sensor for self-consumption in solarlog ([@dontinelli] - [#119885]) +- Add Airzone Cloud air/floor demand binary sensors ([@Noltari] - [#120103]) +- Change Ambient Network timestamp updates ([@thomaskistler] - [#116941]) +- Fix Matter entity names ([@marcelveldt] - [#120038]) +- Refactor Tibber realtime entity creation ([@epenet] - [#118031]) +- Device automation extra fields translation for ZHA ([@farmio] - [#119520]) +- Also test if command can be send successfully in Husqvarna Automower ([@Thomas55555] - [#120107]) +- Add Knocki integration ([@joostlek] - [#119140]) +- Add Home Connect binary_sensor unit tests ([@beastie29a] - [#115323]) +- Fix Solarlog snapshot missing self-consumption sensor ([@TheJulianJES] - [#120111]) +- Update uiprotect to 1.20.0 ([@bdraco] - [#120108]) +- Add discovery for Z-Wave Meter Reset ([@AlCalzone] - [#119968]) +- Add DSMR MQTT subscribe error handling ([@erwindouna] - [#118316]) +- Add Matter discovery schemas for BooleanState sensors ([@lboue] - [#117870]) +- Adjust blocking I/O messages to provide developer help ([@bdraco] - [#120113]) +- Implement Android TV Remote browse media with apps and activity list ([@tronikos] - [#117126]) +- Add config flow to Feedreader ([@mib1185] - [#118047]) +- Use UID instead of MAC or channel for unique_ID in Reolink ([@starkillerOG] - [#119744]) +- Fix comparing end of event in unifiprotect ([@bdraco] - [#120124]) +- Add additional license plate test coverage to unifiprotect ([@bdraco] - [#120125]) +- Adjust hddtemp test Telnet patch location ([@cdce8p] - [#120121]) +- Fix race against is_smart_detected in unifiprotect ([@bdraco] - [#120133]) +- Platinum quality on Teslemetry ([@Bre77] - [#115191]) +- Extend component root imports in tests (2) ([@cdce8p] - [#120123]) +- Extend component root imports in tests (1) ([@cdce8p] - [#120122]) +- Sonos add tests for media_player.play_media favorite_item_id ([@PeteRager] - [#120120]) +- Sonos add tests for media_player.play_media library track ([@PeteRager] - [#120119]) +- Motionblinds Bluetooth options ([@LennP] - [#120110]) +- Add additional checks for Enpower supported feature ([@cgarwood] - [#117107]) +- Enable statistics for UniFi remaining power sensors ([@wittypluck] - [#120073]) +- Fix peco integration ([@IceBotYT] - [#117165]) +- Update pytest warnings filter ([@cdce8p] - [#120143]) +- Address late seventeentrack review ([@shaiu] - [#116792]) +- Ensure kraken tracked pairs can be deselected ([@eifinger] - [#117461]) +- Lyric: Only pull priority rooms when its an LCC device ([@dalinicus] - [#116876]) +- Update naming to reflect name change from Logitech Media Server to Lyrion Music Server ([@peteS-UK] - [#119480]) +- Add distinct import / export entities to Fronius ([@farmio] - [#116535]) +- Add discovery rule for a Z-Wave Basic CC sensor ([@raman325] - [#105134]) +- Melcloud add reconfigure flow ([@erwindouna] - [#115999]) +- Add support for VESKA-micro-inverter (VK-800) to tuya integration ([@jgaedicke] - [#115996]) +- Increase precision of Huisbaasje gas readings ([@Bouke] - [#120138]) +- Add sensor total production energy for Tuya ([@focabr] - [#113565]) +- Add Tuya reverse_energy_total and total_power sensors ([@meee1] - [#114801]) +- Support playback of videos in Fully Kiosk Browser ([@tronikos] - [#119496]) +- Add unique ID support to Flux ([@frenck] - [#120142]) +- Add GoodWe async_update support to number/select entities ([@mletenay] - [#116739]) +- Pass prompt as system_instruction for Gemini 1.5 models ([@tronikos] - [#120147]) +- Add support to consider device holiday and summer mode in AVM Fritz!Smarthome ([@mib1185] - [#119862]) +- Add coordinator to emoncms ([@alexandrecuer] - [#120008]) +- Add Tuya pool heating pumps ([@cRemE-fReSh] - [#118415]) +- Support todoist task description in new_task service ([@dsymonds] - [#116203]) +- Add the ability to bind the template helper entity to a device ([@dougiteixeira] - [#117753]) +- Add transparent command to opentherm_gw ([@GraceGRD] - [#116494]) +- Reload Risco on connection reset ([@OnFreund] - [#120150]) +- Expose altitude for Starlink device tracker ([@boswelja] - [#115508]) +- Add preview to Threshold config & option flow ([@jpbede] - [#117181]) +- Add sensors for Aprilaire integration ([@chamberlain2007] - [#113194]) +- Add sensors to Motionblinds BLE integration ([@LennP] - [#114226]) +- Add satel integra binary switches unique_id ([@david1024pl] - [#118660]) +- Add switches to Tuya dehumidifier: anion, filter_reset, and child_lock ([@vmonkey] - [#105200]) +- Mark ambilight as not available when off ([@elupus] - [#120155]) +- Add Jewish Calendar attributes for non-date sensors ([@SLaks] - [#116252]) +- Add the ability to change the source entity of the Derivative helper ([@dougiteixeira] - [#119754]) +- Add notify entities in Fully Kiosk Browser ([@tronikos] - [#119371]) +- Add re-auth flow to Bring integration ([@tr4nt0r] - [#115327]) +- Use the new device helpers in Integral ([@dougiteixeira] - [#120157]) +- Link the Trend helper entity to the source entity device ([@dougiteixeira] - [#119755]) +- Use the new device helpers in Threshold ([@dougiteixeira] - [#120158]) +- Update `test_device_cleaning` in Utiltity Meter. ([@dougiteixeira] - [#120161]) +- Update `test_device_cleaning` in Derivative ([@dougiteixeira] - [#120162]) +- Update `test_device_cleaning` in Template ([@dougiteixeira] - [#120163]) +- Add feature to generate OTP token in One-Time Password (OTP) integration ([@tr4nt0r] - [#120055]) +- Create auxHeatOnly switch in Ecobee integration ([@bjpetit] - [#116323]) +- Add valve entity to gardena ([@elupus] - [#120160]) +- Tuya curtain robot stuck in open state ([@rokam] - [#118444]) +- Add styled formatting option to Signal Messenger integration - Bump pysignalclirestapi to 0.3.24 ([@r-xyz] - [#117148]) +- Fix airnow timezone look up ([@iprak] - [#120136]) +- Add diagnostics support to Zeversolar integration ([@NECH2004] - [#118245]) +- Remove YAML import for lutron ([@gjohansson-ST] - [#120159]) +- Add tado climate swings and fan level ([@EtienneSOU] - [#117378]) +- Add config flow to generic thermostat ([@elupus] - [#119930]) +- Prioritize the correct CP2102N serial port on macOS ([@puddly] - [#116461]) +- Add service for Husqvarna Automower ([@Thomas55555] - [#117269]) +- Add new Islamic prayer times calculation methods ([@Yazanmy] - [#113763]) +- Update Home Assistant base image to 2024.06.1 ([@frenck] - [#120168]) +- Huisbaasje rebranded to EnergyFlip ([@Bouke] - [#120151]) +- Sonos add tests for media_player.play_media share link ([@PeteRager] - [#120169]) +- Add capability to exclude all attributes from recording ([@gjohansson-ST] - [#119725]) +- Add image entity (screenshot) in Fully Kiosk Browser ([@tronikos] - [#119622]) +- Don't record attributes in sql ([@gjohansson-ST] - [#120170]) +- Remove YAML import from homeworks ([@gjohansson-ST] - [#120171]) +- Remove YAML import from ping ([@gjohansson-ST] - [#120176]) +- Remove deprecated (moved) helpers from helpers.__init__ ([@gjohansson-ST] - [#120172]) +- Add reconfigure flow to Fronius ([@farmio] - [#116132]) +- Raise on incorrect suggested unit for sensor ([@gjohansson-ST] - [#120180]) +- Bump aioraven to 0.6.0 ([@cottsay] - [#120184]) +- Don't log Shelly push update failures if there are no errors ([@thecode] - [#120189]) +- Update uiprotect to 3.1.1 ([@bdraco] - [#120173]) +- Avoid Opower time gaps ([@tronikos] - [#117763]) +- Add template config_entry_attr function ([@balloob] - [#119899]) +- Bump pyloadapi to v1.2.0 ([@tr4nt0r] - [#120218]) +- Bump plugwise to v0.38.3 ([@bouwew] - [#120152]) +- Add config flow to pyLoad integration ([@tr4nt0r] - [#120135]) +- Remove YAML import for tado ([@gjohansson-ST] - [#120231]) +- Add config flow to generic hygrostat ([@elupus] - [#119017]) +- Add `DeviceInfo` to pyLoad integration ([@tr4nt0r] - [#120232]) +- Fix generic thermostat string ([@Virenbar] - [#120235]) +- Add string and icon translations to pyLoad integration ([@tr4nt0r] - [#120234]) +- Improve Jewish calendar entities ([@tsvi] - [#120236]) +- Fix issue in mqtt fixture calling disconnect handler ([@jbouwh] - [#120246]) +- Add number platform to AirGradient ([@joostlek] - [#120247]) +- Add airgradient param fixture ([@joostlek] - [#120241]) +- Bump yalexs to 6.4.1 ([@bdraco] - [#120248]) +- Bump uiprotect to 3.1.8 ([@bdraco] - [#120244]) +- Add Swiss public transport via stations ([@miaucl] - [#115891]) +- Add Aprilaire air cleaning and fresh air functionality ([@chamberlain2007] - [#120174]) +- Create a Jewish Calendar entity ([@tsvi] - [#120253]) +- Remove connection state handling from Idasen Desk ([@abmantis] - [#120242]) +- Bump async_upnp_client to 0.39.0 ([@StevenLooman] - [#120250]) +- Bump aioesphomeapi to 24.6.1 ([@bdraco] - [#120261]) +- LLM to handle decimal attributes ([@balloob] - [#120257]) +- mystrom: Add MAC and Config URL to devices ([@dbrgn] - [#120271]) +- Change suggested data rate unit to Mbit/s in pyLoad ([@tr4nt0r] - [#120275]) +- Adjust base entities in Husqvarna Automower ([@Thomas55555] - [#120258]) +- Add device info for Aemet ([@luca-angemi] - [#120243]) +- Replace custom validator from zwave_js with `from_dict` funcs ([@raman325] - [#120279]) +- Load local calendar ics in background thread to avoid timezone I/O in event loop ([@allenporter] - [#120276]) +- Migrate AEMET to has entity name ([@joostlek] - [#120284]) +- Remove "no API" prompt ([@balloob] - [#120280]) +- Add sensors to Airgradient ([@joostlek] - [#120286]) +- Improve Plugwise runtime-updating ([@bouwew] - [#120230]) +- Update mypy-dev to 1.11.0a9 ([@cdce8p] - [#120289]) +- Bump PyFlume to 0.8.7 ([@tronikos] - [#120288]) +- Ensure flume sees the most recent notifications ([@tronikos] - [#120290]) +- Add optional test fixture collection to enphase_envoy diagnostic report ([@catsmanac] - [#116242]) +- Typing improvements ([@cdce8p] - [#120297]) +- Remove hass_recorder test fixture ([@emontnemery] - [#120295]) +- Remove deprecated attributes from Swiss public transport integration ([@miaucl] - [#120256]) +- Bump jaraco.abode to 5.1.2 ([@jaraco] - [#117363]) +- Add coordinator to Knocki ([@joostlek] - [#120251]) +- Add button platform to AirGradient ([@joostlek] - [#119917]) +- Add DataUpdateCoordinator to pyLoad integration ([@tr4nt0r] - [#120237]) +- Improve type hints in simplisafe tests ([@epenet] - [#120303]) +- Improve type hints in canary tests ([@epenet] - [#120305]) +- Improve type hints in conversation tests ([@epenet] - [#120306]) +- Bump aiodhcpwatcher to 1.0.2 ([@bdraco] - [#120311]) +- Improve integration sensor tests ([@emontnemery] - [#120316]) +- Bump aiooui to 0.1.6 ([@bdraco] - [#120312]) +- Bump aionut to 4.3.3 ([@bdraco] - [#120313]) +- Bump uiprotect to 3.3.1 ([@bdraco] - [#120314]) +- Bump aiohttp-fast-zlib to 0.1.1 ([@bdraco] - [#120315]) +- Bump aiosteamist to 1.0.0 ([@bdraco] - [#120318]) +- Make sure ACK's are processed before mqtt tests are teared down ([@jbouwh] - [#120329]) +- Bump bluetooth-adapters to 0.19.2 ([@bdraco] - [#120324]) +- Remove create_create from StorageCollectionWebsocket.async_setup ([@emontnemery] - [#119489]) +- Bump govee-ble to 0.31.3 ([@bdraco] - [#120335]) +- Fix setup and tear down issues for mqtt discovery and config flow tests ([@jbouwh] - [#120333]) +- Use HassKey in homeassistant integration ([@epenet] - [#120332]) +- Replace deprecated attribute in abode ([@cdce8p] - [#120343]) +- Bump eq3btsmart to 1.1.9 ([@EuleMitKeule] - [#120339]) +- Bump bluetooth-data-tools to 1.19.3 ([@bdraco] - [#120323]) +- Bump habluetooth to 3.1.3 ([@bdraco] - [#120337]) +- Bump discovery30303 to 0.3.2 ([@bdraco] - [#120340]) +- Bump home-assistant-bluetooth to 1.12.2 ([@bdraco] - [#120338]) +- Bump led-ble to 1.0.2 ([@bdraco] - [#120347]) +- Bump bleak to 0.22.2 ([@bdraco] - [#120325]) +- Improve integration sensor tests ([@emontnemery] - [#120326]) +- Improve type hints in comfoconnect tests ([@epenet] - [#120345]) +- Improve type hints in config tests ([@epenet] - [#120346]) +- Bump aiozoneinfo to 0.2.1 ([@bdraco] - [#120319]) +- Bump async-interrupt to 1.1.2 ([@bdraco] - [#120321]) +- Add change username endpoint ([@edenhaus] - [#109057]) +- Update tenacity constraint ([@cdce8p] - [#120348]) +- Improve type hints in cloudflare tests ([@epenet] - [#120344]) +- Add additional sensors to pyLoad integration ([@tr4nt0r] - [#120309]) +- Set up mqtt tests from client fixture of mqtt entry setup fixture, not both ([@jbouwh] - [#120274]) +- Bump python-fullykiosk to 0.0.14 ([@cgarwood] - [#120361]) +- Bump pybalboa to 1.0.2 ([@natekspencer] - [#120360]) +- Bump justnimbus to 0.7.4 ([@kvanzuijlen] - [#120355]) +- Use runtime data in version ([@gjohansson-ST] - [#120363]) +- Deprecate DTE Energy Bridge ([@edenhaus] - [#120350]) +- Prioritize custom intents over builtin ([@synesthesiam] - [#120358]) +- Reduce the amount of data fetched in individual Hydrawise API calls ([@dknowles2] - [#120328]) +- Ensure config_entry is added to hass in tests ([@epenet] - [#120327]) +- Use HassKey in cloud integration ([@epenet] - [#120322]) +- Only raise Reolink re-auth flow when login fails 3 consecutive times ([@starkillerOG] - [#120291]) +- Deprecate Nanoleaf gesture device trigger ([@joostlek] - [#120078]) +- Make Bang & Olufsen products ignore .m3u media source files ([@mj23000] - [#120317]) +- Don't run timer callbacks for delayed commands ([@synesthesiam] - [#120367]) +- Fix pylint error in Google generative AI tests ([@synesthesiam] - [#120371]) +- Fix dlna_dms test RuntimeWarning ([@cdce8p] - [#120341]) +- Strip whitespace characters from token in One-Time-Passwort (OTP) integration ([@tr4nt0r] - [#120380]) +- Bump Bang & Olufsen mozart-open-api to 3.4.1.8.6 fixing blocking IO call ([@mj23000] - [#120369]) +- Use runtime_data in github ([@gjohansson-ST] - [#120362]) +- Remove humbertogontijo as Codeowner for Roborock ([@Lash-L] - [#120336]) +- Add button platform to pyLoad integration ([@tr4nt0r] - [#120359]) +- Update moehlenhoff-alpha2 to 1.3.1 ([@j-a-n] - [#120351]) +- Bump evohome-async to 0.4.20 ([@zxdavb] - [#120353]) +- Add test of get_all_descriptions resolving features ([@emontnemery] - [#120384]) +- Improve type hints in demo tests ([@epenet] - [#120387]) +- Improve type hints in device_tracker tests ([@epenet] - [#120390]) +- Improve type hints in diagnostics tests ([@epenet] - [#120391]) +- Move mqtt debouncer to mqtt utils ([@jbouwh] - [#120392]) +- Fix translation error in Reolink reauth flow ([@starkillerOG] - [#120385]) +- Improve type hints in device_automation tests ([@epenet] - [#120389]) +- Section support for data entry flows ([@emontnemery] - [#118369]) +- Update vallox_websocket_api to 5.3.0 ([@treetip] - [#120395]) +- Install libturbojpeg [ci] ([@cdce8p] - [#120397]) +- Add voluptuous type aliases ([@cdce8p] - [#120399]) +- Use VolDictType for service schemas ([@cdce8p] - [#120403]) +- Add services to Teslemetry ([@Bre77] - [#119119]) +- Improve async_register_admin_service schema typing ([@cdce8p] - [#120405]) +- Improve mqtt schema typing ([@cdce8p] - [#120407]) +- Migrate ESPHome to use entry.runtime_data ([@bdraco] - [#120402]) +- Improve type hints in dsmr tests ([@epenet] - [#120393]) +- Adjust imports in cloud tests ([@epenet] - [#120386]) +- Improve test coverage for ESPHome manager ([@bdraco] - [#120400]) +- Fix incorrect mocking in ESPHome tests ([@bdraco] - [#120410]) +- Improve websocket_api schema typing ([@cdce8p] - [#120411]) +- Add fixture to synchronize with debouncer in MQTT tests ([@jbouwh] - [#120373]) +- Use VolDictType to improve schema typing ([@cdce8p] - [#120417]) +- Apply all todoist custom project filters for calendar events ([@boralyl] - [#117454]) +- Small cleanups to ESPHome ([@bdraco] - [#120414]) +- Bump yalexs-ble to 2.4.3 ([@bdraco] - [#120428]) +- Refactor esphome platform setup to reduce boilerplate ([@bdraco] - [#120415]) +- Improve type hints in cloud tests ([@epenet] - [#120420]) +- Adjust imports in samsungtv tests ([@epenet] - [#120409]) +- Bump pywaze to 1.0.2 ([@eifinger] - [#120412]) +- Add reauth flow to pyLoad integration ([@tr4nt0r] - [#120376]) +- Add script llm tool ([@Shulyaka] - [#118936]) +- Improve type hints in deconz tests ([@epenet] - [#120388]) +- Bump uiprotect to 3.4.0 ([@bdraco] - [#120433]) +- Fix missing vol.Optional keyword ([@cdce8p] - [#120444]) +- Fix schema typing (1) ([@cdce8p] - [#120443]) +- Improve collection schema typing ([@cdce8p] - [#120441]) +- Improve intent schema typing ([@cdce8p] - [#120442]) +- Cleanup common mqtt tests ([@jbouwh] - [#120446]) +- Add import aliases for PLATFORM_SCHEMA ([@cdce8p] - [#120445]) +- Validate new device identifiers and connections ([@emontnemery] - [#120413]) +- Small cleanups to ESPHome manager reconnect shutdown ([@bdraco] - [#120401]) +- Support in service descriptions for input sections ([@emontnemery] - [#116100]) +- Fix gtfs typing ([@cdce8p] - [#120451]) +- Add WS command blueprint/substitute ([@emontnemery] - [#119890]) +- Fix invalid schemas ([@cdce8p] - [#120450]) +- Bump Knocki to 0.2.0 ([@joostlek] - [#120447]) +- Upgrade tplink with new platforms, features and device support ([@rytilahti] - [#120060]) +- Migrate Airgradient select entities to be config source dependent ([@joostlek] - [#120462]) +- Handle http connection errors to Prusa printers ([@agners] - [#120456]) +- Cleanup mqtt platform tests part 1 ([@jbouwh] - [#120470]) +- Bump python-roborock to 2.5.0 ([@Lash-L] - [#120466]) +- Bump pyinsteon to 1.6.3 to fix Insteon device status ([@teharris1] - [#120464]) +- Add @thomaskistler as an owner of hydrawise ([@thomaskistler] - [#120477]) +- Bump uiprotect to 3.7.0 ([@bdraco] - [#120471]) +- Improve vol.Invalid handling ([@cdce8p] - [#120480]) +- Improve SERVICE_TO_METHOD typing ([@cdce8p] - [#120474]) +- Bump wolf-comm to 0.0.9 ([@mtielen] - [#120473]) +- Improve schema typing (2) ([@cdce8p] - [#120475]) +- Improve config vol.Invalid typing ([@cdce8p] - [#120482]) +- Fix dropped unifiprotect motion events ([@bdraco] - [#120489]) +- Align deviceinfo entries in pyLoad integration ([@tr4nt0r] - [#120478]) +- Fix holiday using utc instead of local time ([@gjohansson-ST] - [#120432]) +- Add missing textselectors in `USER_DATA_SCHEMA` in pyLoad integration ([@tr4nt0r] - [#120479]) +- Remove unused translation strings in pyLoad integration ([@tr4nt0r] - [#120476]) +- Add Philips WiZ Lightbulbs to Matter TRANSITION_BLOCKLIST ([@Grubalex] - [#120461]) +- Make fetching integrations with requirements safer ([@bdraco] - [#120481]) +- Cleanup mqtt platform tests part 2 ([@jbouwh] - [#120490]) +- Deduplicate alarm_control_panel services.yaml ([@emontnemery] - [#118796]) +- Create repair when HA auth provider is running in legacy mode ([@edenhaus] - [#119975]) +- Handle availability in Idasen Desk height sensor ([@abmantis] - [#120277]) +- Allow timer management from any device ([@synesthesiam] - [#120440]) +- Fix issue where an MQTT device is removed linked to two config entries ([@jbouwh] - [#120430]) +- Bump dbus-fast to 2.22.1 ([@bdraco] - [#120491]) +- Add active watering time sensor to Hydrawise ([@thomaskistler] - [#120177]) +- Add unique_id to MPD ([@joostlek] - [#120495]) +- Cleanup mqtt platform tests part 3 ([@jbouwh] - [#120493]) +- Do not wait for Reolink firmware check ([@starkillerOG] - [#120377]) +- Add timezone testing in holiday ([@gjohansson-ST] - [#120497]) +- Verify default timezone is restored when test ends ([@emontnemery] - [#116216]) +- Add reconfiguration flow to pyLoad integration ([@tr4nt0r] - [#120485]) +- Remove Knocki triggers on runtime ([@joostlek] - [#120452]) +- Force alias when importing notify PLATFORM_SCHEMA ([@epenet] - [#120494]) +- Force alias when importing air_quality PLATFORM_SCHEMA ([@epenet] - [#120502]) +- Add switch platform to pyload integration ([@tr4nt0r] - [#120352]) +- Force alias when importing tts PLATFORM_SCHEMA ([@epenet] - [#120500]) +- Implement @plugwise_command for Plugwise Number platform ([@bouwew] - [#120503]) +- Switch onkyo to pyeiscp, making it local_push ([@arturpragacz] - [#120026]) +- Force alias when importing switch PLATFORM_SCHEMA ([@epenet] - [#120504]) +- Force alias when importing calendar PLATFORM_SCHEMA ([@epenet] - [#120512]) +- Force alias when importing alarm control panel PLATFORM_SCHEMA ([@epenet] - [#120505]) +- Rename sensor to finished downloads in pyLoad integration ([@tr4nt0r] - [#120483]) +- Force alias when importing binary sensor PLATFORM_SCHEMA ([@epenet] - [#120510]) +- Force alias when importing climate PLATFORM_SCHEMA ([@epenet] - [#120518]) +- Add exception translations for pyLoad integration ([@tr4nt0r] - [#120520]) +- Force alias when importing camera PLATFORM_SCHEMA ([@epenet] - [#120514]) +- Implement @plugwise_command for Plugwise Select platform ([@bouwew] - [#120509]) +- Force alias when importing device tracker PLATFORM_SCHEMA ([@epenet] - [#120523]) +- Simplify EVENT_STATE_REPORTED ([@emontnemery] - [#120508]) +- Force alias when importing humidifier PLATFORM_SCHEMA ([@epenet] - [#120526]) +- Force alias when importing geo location PLATFORM_SCHEMA ([@epenet] - [#120525]) +- Force alias when importing cover PLATFORM_SCHEMA ([@epenet] - [#120522]) +- Force alias when importing image processing PLATFORM_SCHEMA ([@epenet] - [#120527]) +- Improve schema typing (3) ([@cdce8p] - [#120521]) +- Add HmIP-ESI ([@hahn-th] - [#116863]) +- Force alias when importing event and fan PLATFORM_SCHEMA ([@epenet] - [#120524]) +- Improve Matter Server version incompatibility handling ([@agners] - [#120416]) +- Add diagnostics platform to pyLoad integration ([@tr4nt0r] - [#120535]) +- Force alias when importing remote PLATFORM_SCHEMA ([@epenet] - [#120533]) +- Refactor Tessie for future PR ([@Bre77] - [#120406]) +- Force alias when importing lock PLATFORM_SCHEMA ([@epenet] - [#120531]) +- Force alias when importing light PLATFORM_SCHEMA ([@epenet] - [#120529]) +- Force alias when importing scene PLATFORM_SCHEMA ([@epenet] - [#120534]) +- Force alias when importing sensor PLATFORM_SCHEMA ([@epenet] - [#120536]) +- Import DOMAIN constants for Plugwise and implement ([@bouwew] - [#120530]) +- Add learning offset select to Airgradient ([@joostlek] - [#120532]) +- Force alias when importing media player PLATFORM_SCHEMA ([@epenet] - [#120537]) +- Correct type annotations in integration sensor tests ([@emontnemery] - [#120541]) +- Add primary_config_entry attribute to device registry entries ([@emontnemery] - [#119959]) +- Improve BMW tests ([@rikroe] - [#119171]) +- Revert "Force alias when importing scene PLATFORM_SCHEMA" ([@epenet] - [#120540]) +- Fix release in MPD issue ([@joostlek] - [#120545]) +- Remove unnecessary icon states in pyLoad integration ([@tr4nt0r] - [#120548]) +- Fix airgradient select entities ([@edenhaus] - [#120549]) +- Update frontend to 20240626.0 ([@bramkragten] - [#120546]) +- Use state_reported events in Riemann sum sensor ([@emontnemery] - [#113869]) +- Convert dataclass to dict in pyLoad diagnostics ([@tr4nt0r] - [#120552]) +- Fix class and variable naming errors in pyLoad integration ([@tr4nt0r] - [#120547]) +- Implement remaining select-adaptions for Plugwise ([@bouwew] - [#120544]) +- Update docstrings in pyLoad tests ([@tr4nt0r] - [#120556]) +- Increase max temperature to 40 for Tado ([@joostlek] - [#120560]) +- Add Roborock to strict typing ([@Lash-L] - [#120379]) +- Add measurement unit and state_class to sensors in pyLoad ([@tr4nt0r] - [#120551]) +- Add created_seconds to timer info and pass to ESPHome devices ([@synesthesiam] - [#120364]) +- Add switch platform to Airgradient ([@joostlek] - [#120559]) +- Use ruff to force alias when importing PLATFORM_SCHEMA ([@epenet] - [#120539]) +- Add new coordinators to Tessie ([@Bre77] - [#118452]) +- Add options flow to Roborock ([@Lash-L] - [#104345]) +- Adjust tplink codeowners ([@rytilahti] - [#120561]) +- Add Base class for entities in PyLoad integration ([@tr4nt0r] - [#120563]) +- Redact the hostname in pyLoad diagnostics ([@tr4nt0r] - [#120567]) +- Add value_fn to switch entity description in pyLoad ([@tr4nt0r] - [#120569]) +- Implement a reboot-button for Plugwise ([@bouwew] - [#120554]) +- Add support for Dyad vacuums to Roborock ([@Lash-L] - [#115331]) +- Disable Aladdin Connect ([@joostlek] - [#120558]) +- Fix class name and deprecation version ([@tr4nt0r] - [#120570]) +- Import PLATFORM_SCHEMA from platform not from helpers ([@epenet] - [#120565]) +- Refactor PLATFORM_SCHEMA imports in platforms ([@epenet] - [#120564]) +- Add explanatory comment in tests/patch_time.py ([@emontnemery] - [#120572]) +- Add profile duration sensor for Vallox integration ([@treetip] - [#120240]) +- Add config flow to statistics ([@gjohansson-ST] - [#120496]) +- Add platinum scale to pyLoad integration ([@tr4nt0r] - [#120542]) +- Delete removed device(s) at runtime in Plugwise ([@bouwew] - [#120296]) +- Refactor PLATFORM_SCHEMA imports in tests ([@epenet] - [#120566]) +- Add additional tests to youless integration ([@gjong] - [#118869]) +- Align Shelly sleeping devices timeout with non-sleeping ([@thecode] - [#118969]) +- Don't allow switch toggle when device in locked in AVM FRITZ!SmartHome ([@florian-sabonchi] - [#120132]) +- Bump ZHA dependencies ([@TheJulianJES] - [#120581]) +- Change Shelly connect task log message level to error ([@thecode] - [#120582]) +- Bump intents to 2024.6.26 ([@synesthesiam] - [#120584]) +- Improve Bang & Olufsen error messages ([@mj23000] - [#120587]) +- Correct deprecation warning `async_register_static_paths` ([@elcajon] - [#120592]) +- Remove deprecated run_immediately flag from integration sensor ([@emontnemery] - [#120593]) +- Add last_error reporting to Shelly diagnostics ([@thecode] - [#120595]) +- Prevent changes to mutable bmw_connected_drive fixture data ([@jbouwh] - [#120600]) +- Fix mqtt test fixture usage ([@cdce8p] - [#120602]) +- Update adguardhome to 0.7.0 ([@frenck] - [#120605]) +- Fix telegram bot thread_id key error ([@luca-angemi] - [#120613]) +- Update frontend to 20240626.2 ([@piitaya] - [#120614]) +- Mark esphome integration as platinum ([@jesserockz] - [#112565]) +- Improve AtlanticDomesticHotWaterProductionMBLComponent support in Overkiz ([@ALERTua] - [#114178]) +- Remove unused fields from unifiprotect event sensors ([@bdraco] - [#120568]) +- Store tplink credentials_hash outside of device_config ([@sdb9696] - [#120597]) +- Don't allow updating a device to have no connections or identifiers ([@emontnemery] - [#120603]) +- Bump anova_wifi to 0.14.0 ([@Lash-L] - [#120616]) +- Bump uiprotect to 4.0.0 ([@bdraco] - [#120617]) +- Fix performance regression in integration from state_reported ([@bdraco] - [#120621]) +- Add async_track_state_reported_event to fix integration performance regression ([@bdraco] - [#120622]) +- Rename async_track_state_reported_event to async_track_state_report_event ([@emontnemery] - [#120637]) +- Fix the version that raises the issue ([@zweckj] - [#120638]) +- Improve typing of state event helpers ([@emontnemery] - [#120639]) +- Add snapshots to tasmota sensor test ([@emontnemery] - [#120647]) +- Move Auto On/off switches to Config EntityCategory ([@zweckj] - [#120648]) +- Bump hatasmota to 0.9.1 ([@emontnemery] - [#120649]) +- Fix values at startup for Tessie ([@Bre77] - [#120652]) +- Disable polling for Knocki ([@joostlek] - [#120656]) +- Fix unknown attribute in MPD ([@joostlek] - [#120657]) +- Fix Airgradient ABC days name ([@joostlek] - [#120659]) +- [esphome] Add more tests to bring integration to 100% coverage ([@jesserockz] - [#120661]) +- Fix docstring for EventStateEventData ([@emontnemery] - [#120662]) +- Bump uiprotect to 4.2.0 ([@bdraco] - [#120669]) +- Bump unifi-discovery to 1.2.0 ([@bdraco] - [#120684]) +- Bump Environment Canada to 0.7.0 ([@gwww] - [#120686]) +- Use more observations in NWS ([@MatthewFlamm] - [#120687]) +- Add newer models to unifi integrations discovery ([@bdraco] - [#120688]) +- Bump upb-lib to 0.5.7 ([@gwww] - [#120689]) +- Update frontend to 20240627.0 ([@bramkragten] - [#120693]) +- Bump aioautomower to 2024.6.3 ([@Thomas55555] - [#120697]) +- Bump Environment Canada to 0.7.1 ([@gwww] - [#120699]) +- Bump ttls to 1.8.3 ([@joostlek] - [#120700]) +- Update tplink unlink identifiers to deal with ids from other domains ([@sdb9696] - [#120596]) +- Set stateclass on unknown numeric Tasmota sensors ([@emontnemery] - [#120650]) +- Bump hatasmota to 0.9.2 ([@emontnemery] - [#120670]) +- Bump panasonic_viera to 0.4.2 ([@joostlek] - [#120692]) +- Bump apsystems-ez1 to 1.3.3 ([@joostlek] - [#120702]) +- Bump `nextdns` to version 3.1.0 ([@bieniu] - [#120703]) +- Link the Statistics helper entity to the source entity device ([@dougiteixeira] - [#120705]) +- Check Tessie scopes to fix startup bug ([@Bre77] - [#120710]) +- Bump airtouch5py to 1.2.0 ([@danzel] - [#120715]) +- Bump renault-api to 0.2.4 ([@epenet] - [#120727]) +- Separate renault strings ([@epenet] - [#120737]) +- Bump asyncarve to 0.1.1 ([@ikalnyi] - [#120740]) +- Fix Google Generative AI: 400 Request contains an invalid argument ([@tronikos] - [#120741]) +- Bump gcal_sync to 6.1.3 ([@allenporter] - [#120278]) +- Reject small uptime updates for Unifi clients ([@wittypluck] - [#120398]) +- Add electrical consumption sensor to Overkiz ([@ALERTua] - [#120717]) +- Add warm water remaining volume sensor to Overkiz ([@ALERTua] - [#120718]) +- Bump sense-energy to 0.12.4 ([@joostlek] - [#120744]) +- Bump govee-local-api to 1.5.1 ([@joostlek] - [#120747]) +- Bump easyenergy lib to v2.1.2 ([@klaasnicolaas] - [#120753]) +- Bump p1monitor lib to v3.0.1 ([@klaasnicolaas] - [#120756]) +- Bump greeclimate to 1.4.6 ([@cmroche] - [#120758]) +- Increase mqtt availablity timeout to 50s ([@bdraco] - [#120760]) +- Do not call async_delete_issue() if there is no issue to delete in Shelly integration ([@bieniu] - [#120762]) +- Bump aiowithings to 3.0.2 ([@joostlek] - [#120765]) +- Bump pyaprilaire to 0.7.4 ([@chamberlain2007] - [#120782]) +- Bump energyzero lib to v2.1.1 ([@klaasnicolaas] - [#120783]) +- Update frontend to 20240628.0 ([@piitaya] - [#120785]) +- Bump odp-amsterdam lib to v6.0.2 ([@klaasnicolaas] - [#120788]) +- Bump gridnet lib to v5.0.1 ([@klaasnicolaas] - [#120793]) +- Fix missing f-string in loop util ([@bdraco] - [#120800]) +- Fix blocking I/O in xmpp notify to read uploaded files ([@bdraco] - [#120801]) +- Fix unneeded dict values for MATCH_ALL recorder attrs exclude ([@bdraco] - [#120804]) +- Bump aiomealie to 0.5.0 ([@joostlek] - [#120815]) +- Add unique id to Mealie config entry ([@joostlek] - [#120816]) +- Bump python-opensky to 1.0.1 ([@joostlek] - [#120818]) +- Add icons to Airgradient ([@joostlek] - [#120820]) +- Use meal note as fallback in Mealie ([@joostlek] - [#120828]) +- Bump pizzapi to 0.0.6 ([@joostlek] - [#120691]) +- Allow EM heat on from any mode in Honeywell ([@mkmer] - [#120750]) +- Fix routes with transfer in nmbs integration ([@silamon] - [#120808]) +- Fix Tado fan mode ([@EtienneSOU] - [#120809]) +- Bump aiowebostv to 0.4.1 ([@thecode] - [#120838]) +- Fix Jewish calendar unique id move to entity ([@tsvi] - [#120842]) +- Rollback PyFlume to 0.6.5 ([@allenporter] - [#120846]) +- Bump pyfritzhome to 0.6.12 ([@mib1185] - [#120861]) +- Cleanup mqtt platform tests part 4 (init) ([@jbouwh] - [#120574]) +- Split mqtt client tests ([@jbouwh] - [#120636]) +- Fix publish cancellation handling in MQTT ([@bdraco] - [#120826]) +- Add handling for different STATFLAG formats in APCUPSD ([@yuxincs] - [#120870]) +- Bump aioautomower to 2024.6.4 ([@Thomas55555] - [#120875]) +- Fix Shelly device shutdown ([@thecode] - [#120881]) +- Bump ical to 8.1.1 ([@allenporter] - [#120888]) +- Add missing translations for device class in Scrape ([@dougiteixeira] - [#120891]) +- Add missing translations for device class in SQL ([@dougiteixeira] - [#120892]) +- Add missing translations for device class in Template ([@dougiteixeira] - [#120893]) +- Improve add user error messages ([@edenhaus] - [#120909]) +- Bump incomfort-client dependency to 0.6.3 ([@jbouwh] - [#120913]) +- Bump openai to 1.35.1 ([@balloob] - [#120926]) +- Mark dry/fan-only climate modes as supported for Panasonic room air conditioner ([@marcelveldt] - [#120939]) +- Bump python-kasa to 0.7.0.2 ([@sdb9696] - [#120940]) +- Downgrade logging previously reported asyncio block to debug ([@bdraco] - [#120942]) +- Fix Bang & Olufsen jumping volume bar ([@mj23000] - [#120946]) +- Minor polishing for tplink ([@rytilahti] - [#120868]) +- [ESPHome] Disable dashboard based update entities by default ([@jesserockz] - [#120907]) +- Create log files in an executor thread ([@emontnemery] - [#120912]) +- Fix missing airgradient string ([@joostlek] - [#120957]) +- Bump airgradient to 0.6.1 ([@joostlek] - [#120962]) +- Bump reolink-aio to 0.9.4 ([@starkillerOG] - [#120964]) +- Bump yt-dlp to 2024.07.01 ([@joostlek] - [#120978]) +- Remove Aladdin Connect integration ([@joostlek] - [#120980]) +- Reolink replace automatic removal of devices by manual removal ([@starkillerOG] - [#120981]) +- Do not hold core startup with reolink firmware check task ([@starkillerOG] - [#120985]) +- Fix setting target temperature for single setpoint Matter thermostat ([@marcelveldt] - [#121011]) +- Handle mains power for Matter appliances ([@marcelveldt] - [#121023]) +- Temporarily set apprise log level to debug in tests ([@jpbede] - [#121029]) +- Update frontend to 20240702.0 ([@bramkragten] - [#121032]) +- Bump gcal_sync to 6.1.4 ([@allenporter] - [#120941]) +- Bump inkbird-ble to 0.5.7 ([@bdraco] - [#121039]) + +## Release 2024.7.1 - July 5 + +- Improve redaction for stream error messages ([@allenporter] - [#120867]) +- Add device class translations in Random ([@dougiteixeira] - [#120890]) +- Fix locking/unlocking transition state in Matter lock platform ([@marcelveldt] - [#121099]) +- Fix HmIP-ESI GAS sensor DeviceClass ([@ChristophCaina] - [#121106]) +- Starline: Fix "Error updating SLNet token" message in Log ([@Chupaka] - [#121122]) +- Bump inkbird-ble to 0.5.8 ([@bdraco] - [#121134]) +- Fix broken pathlib import in august integration ([@mweinelt] - [#121135]) +- Bump velbusaio to 2024.7.5 ([@Cereal2nd] - [#121156]) +- Fix `pulse counter frequency` sensors for Shelly Plus Uni ([@bieniu] - [#121178]) +- Bump youless library version 2.1.2 ([@gjong] - [#121181]) +- Bump python-kasa to 0.7.0.3 ([@sdb9696] - [#121183]) +- Fix Matter light discovery schema for DimmerSwitch ([@marcelveldt] - [#121185]) +- Listen for attribute changes of OnOff cluster in appliances ([@marcelveldt] - [#121198]) +- Bump anova-wifi to 0.15.0 ([@Lash-L] - [#121222]) +- Fix work area sensor in Husqvarna Automower ([@Thomas55555] - [#121228]) +- Revert Homematic IP Cloud unique ID changes ([@hahn-th] - [#121231]) +- Bump deebot-client to 8.1.1 ([@edenhaus] - [#121241]) +- Fix WebOS TV media player status when OFF after IDLE ([@thecode] - [#121251]) +- Bump aioaquacell to 0.1.8 ([@Jordi1990] - [#121253]) +- Bump aiowebostv to 0.4.2 ([@thecode] - [#121258]) +- Bump python-holidays to 0.52 ([@gjohansson-ST] - [#121283]) +- Fix tplink light effect behaviour when activating a scene ([@sdb9696] - [#121288]) +- Update frontend to 20240705.0 ([@bramkragten] - [#121295]) + +[#120579]: https://github.com/home-assistant/core/pull/120579 +[#120867]: https://github.com/home-assistant/core/pull/120867 +[#120890]: https://github.com/home-assistant/core/pull/120890 +[#121099]: https://github.com/home-assistant/core/pull/121099 +[#121106]: https://github.com/home-assistant/core/pull/121106 +[#121122]: https://github.com/home-assistant/core/pull/121122 +[#121134]: https://github.com/home-assistant/core/pull/121134 +[#121135]: https://github.com/home-assistant/core/pull/121135 +[#121156]: https://github.com/home-assistant/core/pull/121156 +[#121178]: https://github.com/home-assistant/core/pull/121178 +[#121181]: https://github.com/home-assistant/core/pull/121181 +[#121183]: https://github.com/home-assistant/core/pull/121183 +[#121185]: https://github.com/home-assistant/core/pull/121185 +[#121198]: https://github.com/home-assistant/core/pull/121198 +[#121222]: https://github.com/home-assistant/core/pull/121222 +[#121228]: https://github.com/home-assistant/core/pull/121228 +[#121231]: https://github.com/home-assistant/core/pull/121231 +[#121241]: https://github.com/home-assistant/core/pull/121241 +[#121251]: https://github.com/home-assistant/core/pull/121251 +[#121253]: https://github.com/home-assistant/core/pull/121253 +[#121258]: https://github.com/home-assistant/core/pull/121258 +[#121283]: https://github.com/home-assistant/core/pull/121283 +[#121288]: https://github.com/home-assistant/core/pull/121288 +[#121295]: https://github.com/home-assistant/core/pull/121295 +[@Cereal2nd]: https://github.com/Cereal2nd +[@ChristophCaina]: https://github.com/ChristophCaina +[@Chupaka]: https://github.com/Chupaka +[@Jordi1990]: https://github.com/Jordi1990 +[@Lash-L]: https://github.com/Lash-L +[@Thomas55555]: https://github.com/Thomas55555 +[@allenporter]: https://github.com/allenporter +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@bramkragten]: https://github.com/bramkragten +[@dougiteixeira]: https://github.com/dougiteixeira +[@edenhaus]: https://github.com/edenhaus +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gjong]: https://github.com/gjong +[@hahn-th]: https://github.com/hahn-th +[@marcelveldt]: https://github.com/marcelveldt +[@mweinelt]: https://github.com/mweinelt +[@sdb9696]: https://github.com/sdb9696 +[@thecode]: https://github.com/thecode + +## Release 2024.7.2 - July 10 + +- Remove legacy foreign key constraint from sqlite states table ([@bdraco] - [#120779]) +- Direct Users to App-Specific Passwords for iCloud integration to prevent MFA spam ([@rcmaehl] - [#120945]) +- LLM to handle int attributes ([@ahaverty] - [#121037]) +- Fix empty list in kodi media_player ([@TermeHansen] - [#121250]) +- Fix ombi configuration validation ([@temesinko] - [#121314]) +- Bump anova-wifi to 0.17.0 ([@Lash-L] - [#121337]) +- Fix initial Wall Connector values in Tessie ([@Bre77] - [#121353]) +- Bump psutil to 6.0.0 ([@gjohansson-ST] - [#121385]) +- Fix unnecessary logging of turn on/off feature flags in Climate ([@gjohansson-ST] - [#121387]) +- Fix timezone issue in smhi weather ([@gjohansson-ST] - [#121389]) +- Fix feature flag in climate ([@gjohansson-ST] - [#121398]) +- Allow current empty feeds to be configured in Feedreader ([@mib1185] - [#121421]) +- Fix MPD config flow ([@joostlek] - [#121431]) +- Sort mealie mealplans ([@joostlek] - [#121433]) +- Fix Mealie URL field ([@joostlek] - [#121434]) +- Bump pymodbus to 3.6.9 ([@janiversen] - [#121445]) +- Bump jaraco.abode to 5.2.1 ([@jaraco] - [#121446]) +- Bump yalexs to 6.4.2 ([@bdraco] - [#121467]) +- Bump xiaomi-ble to 0.30.1 ([@joostlek] - [#120743]) +- Bump xiaomi-ble to 0.30.2 ([@ov1d1u] - [#121471]) +- Include hass device ID in mobile app get_config webhook ([@balloob] - [#121496]) +- Fix person tracking in unifiprotect ([@bdraco] - [#121528]) +- Remove homematic state_class from GAS_POWER sensor ([@ChristophCaina] - [#121533]) +- Update vehicle to 2.2.2 ([@frenck] - [#121556]) +- Update tailscale to 0.6.1 ([@frenck] - [#121557]) +- Fix upb config flow connect ([@gwww] - [#121571]) +- Bump pyenphase to 1.20.6 ([@catsmanac] - [#121583]) +- Allow ambilight when we have connection (philips_js) ([@elupus] - [#121620]) +- Update frontend to 20240710.0 ([@piitaya] - [#121651]) +- Small fix in velbus cover for the assumed states ([@Cereal2nd] - [#121656]) +- Block icloud3 custom integration from breaking the recorder ([@frenck] - [#121658]) +- Handle errors in Fully Kiosk camera ([@tronikos] - [#121659]) +- Block places <=2.7.0 custom integration from breaking the recorder ([@frenck] - [#121662]) +- Fix state for Matter Locks (including optional door sensor) ([@marcelveldt] - [#121665]) +- Matter lock state follow-up ([@marcelveldt] - [#121669]) +- Block variable <=3.4.4 custom integration from breaking the recorder ([@frenck] - [#121670]) + +[#120579]: https://github.com/home-assistant/core/pull/120579 +[#120743]: https://github.com/home-assistant/core/pull/120743 +[#120779]: https://github.com/home-assistant/core/pull/120779 +[#120945]: https://github.com/home-assistant/core/pull/120945 +[#121037]: https://github.com/home-assistant/core/pull/121037 +[#121250]: https://github.com/home-assistant/core/pull/121250 +[#121289]: https://github.com/home-assistant/core/pull/121289 +[#121314]: https://github.com/home-assistant/core/pull/121314 +[#121337]: https://github.com/home-assistant/core/pull/121337 +[#121353]: https://github.com/home-assistant/core/pull/121353 +[#121385]: https://github.com/home-assistant/core/pull/121385 +[#121387]: https://github.com/home-assistant/core/pull/121387 +[#121389]: https://github.com/home-assistant/core/pull/121389 +[#121398]: https://github.com/home-assistant/core/pull/121398 +[#121421]: https://github.com/home-assistant/core/pull/121421 +[#121431]: https://github.com/home-assistant/core/pull/121431 +[#121433]: https://github.com/home-assistant/core/pull/121433 +[#121434]: https://github.com/home-assistant/core/pull/121434 +[#121445]: https://github.com/home-assistant/core/pull/121445 +[#121446]: https://github.com/home-assistant/core/pull/121446 +[#121467]: https://github.com/home-assistant/core/pull/121467 +[#121471]: https://github.com/home-assistant/core/pull/121471 +[#121496]: https://github.com/home-assistant/core/pull/121496 +[#121528]: https://github.com/home-assistant/core/pull/121528 +[#121533]: https://github.com/home-assistant/core/pull/121533 +[#121556]: https://github.com/home-assistant/core/pull/121556 +[#121557]: https://github.com/home-assistant/core/pull/121557 +[#121571]: https://github.com/home-assistant/core/pull/121571 +[#121583]: https://github.com/home-assistant/core/pull/121583 +[#121620]: https://github.com/home-assistant/core/pull/121620 +[#121651]: https://github.com/home-assistant/core/pull/121651 +[#121656]: https://github.com/home-assistant/core/pull/121656 +[#121658]: https://github.com/home-assistant/core/pull/121658 +[#121659]: https://github.com/home-assistant/core/pull/121659 +[#121662]: https://github.com/home-assistant/core/pull/121662 +[#121665]: https://github.com/home-assistant/core/pull/121665 +[#121669]: https://github.com/home-assistant/core/pull/121669 +[#121670]: https://github.com/home-assistant/core/pull/121670 +[@Bre77]: https://github.com/Bre77 +[@Cereal2nd]: https://github.com/Cereal2nd +[@ChristophCaina]: https://github.com/ChristophCaina +[@Lash-L]: https://github.com/Lash-L +[@TermeHansen]: https://github.com/TermeHansen +[@ahaverty]: https://github.com/ahaverty +[@balloob]: https://github.com/balloob +[@bdraco]: https://github.com/bdraco +[@catsmanac]: https://github.com/catsmanac +[@elupus]: https://github.com/elupus +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gwww]: https://github.com/gwww +[@janiversen]: https://github.com/janiversen +[@jaraco]: https://github.com/jaraco +[@joostlek]: https://github.com/joostlek +[@marcelveldt]: https://github.com/marcelveldt +[@mib1185]: https://github.com/mib1185 +[@ov1d1u]: https://github.com/ov1d1u +[@piitaya]: https://github.com/piitaya +[@rcmaehl]: https://github.com/rcmaehl +[@temesinko]: https://github.com/temesinko +[@tronikos]: https://github.com/tronikos + +[#103496]: https://github.com/home-assistant/core/pull/103496 +[#104345]: https://github.com/home-assistant/core/pull/104345 +[#105134]: https://github.com/home-assistant/core/pull/105134 +[#105200]: https://github.com/home-assistant/core/pull/105200 +[#106947]: https://github.com/home-assistant/core/pull/106947 +[#109057]: https://github.com/home-assistant/core/pull/109057 +[#109603]: https://github.com/home-assistant/core/pull/109603 +[#110062]: https://github.com/home-assistant/core/pull/110062 +[#110685]: https://github.com/home-assistant/core/pull/110685 +[#112074]: https://github.com/home-assistant/core/pull/112074 +[#112334]: https://github.com/home-assistant/core/pull/112334 +[#112565]: https://github.com/home-assistant/core/pull/112565 +[#112600]: https://github.com/home-assistant/core/pull/112600 +[#112715]: https://github.com/home-assistant/core/pull/112715 +[#113052]: https://github.com/home-assistant/core/pull/113052 +[#113053]: https://github.com/home-assistant/core/pull/113053 +[#113104]: https://github.com/home-assistant/core/pull/113104 +[#113140]: https://github.com/home-assistant/core/pull/113140 +[#113194]: https://github.com/home-assistant/core/pull/113194 +[#113222]: https://github.com/home-assistant/core/pull/113222 +[#113394]: https://github.com/home-assistant/core/pull/113394 +[#113434]: https://github.com/home-assistant/core/pull/113434 +[#113565]: https://github.com/home-assistant/core/pull/113565 +[#113664]: https://github.com/home-assistant/core/pull/113664 +[#113763]: https://github.com/home-assistant/core/pull/113763 +[#113869]: https://github.com/home-assistant/core/pull/113869 +[#113935]: https://github.com/home-assistant/core/pull/113935 +[#113957]: https://github.com/home-assistant/core/pull/113957 +[#113993]: https://github.com/home-assistant/core/pull/113993 +[#114137]: https://github.com/home-assistant/core/pull/114137 +[#114171]: https://github.com/home-assistant/core/pull/114171 +[#114178]: https://github.com/home-assistant/core/pull/114178 +[#114226]: https://github.com/home-assistant/core/pull/114226 +[#114497]: https://github.com/home-assistant/core/pull/114497 +[#114801]: https://github.com/home-assistant/core/pull/114801 +[#114948]: https://github.com/home-assistant/core/pull/114948 +[#115090]: https://github.com/home-assistant/core/pull/115090 +[#115178]: https://github.com/home-assistant/core/pull/115178 +[#115191]: https://github.com/home-assistant/core/pull/115191 +[#115323]: https://github.com/home-assistant/core/pull/115323 +[#115327]: https://github.com/home-assistant/core/pull/115327 +[#115331]: https://github.com/home-assistant/core/pull/115331 +[#115471]: https://github.com/home-assistant/core/pull/115471 +[#115474]: https://github.com/home-assistant/core/pull/115474 +[#115508]: https://github.com/home-assistant/core/pull/115508 +[#115557]: https://github.com/home-assistant/core/pull/115557 +[#115594]: https://github.com/home-assistant/core/pull/115594 +[#115601]: https://github.com/home-assistant/core/pull/115601 +[#115616]: https://github.com/home-assistant/core/pull/115616 +[#115795]: https://github.com/home-assistant/core/pull/115795 +[#115835]: https://github.com/home-assistant/core/pull/115835 +[#115891]: https://github.com/home-assistant/core/pull/115891 +[#115892]: https://github.com/home-assistant/core/pull/115892 +[#115898]: https://github.com/home-assistant/core/pull/115898 +[#115962]: https://github.com/home-assistant/core/pull/115962 +[#115996]: https://github.com/home-assistant/core/pull/115996 +[#115999]: https://github.com/home-assistant/core/pull/115999 +[#116053]: https://github.com/home-assistant/core/pull/116053 +[#116100]: https://github.com/home-assistant/core/pull/116100 +[#116132]: https://github.com/home-assistant/core/pull/116132 +[#116134]: https://github.com/home-assistant/core/pull/116134 +[#116203]: https://github.com/home-assistant/core/pull/116203 +[#116216]: https://github.com/home-assistant/core/pull/116216 +[#116242]: https://github.com/home-assistant/core/pull/116242 +[#116252]: https://github.com/home-assistant/core/pull/116252 +[#116290]: https://github.com/home-assistant/core/pull/116290 +[#116323]: https://github.com/home-assistant/core/pull/116323 +[#116455]: https://github.com/home-assistant/core/pull/116455 +[#116461]: https://github.com/home-assistant/core/pull/116461 +[#116494]: https://github.com/home-assistant/core/pull/116494 +[#116498]: https://github.com/home-assistant/core/pull/116498 +[#116535]: https://github.com/home-assistant/core/pull/116535 +[#116603]: https://github.com/home-assistant/core/pull/116603 +[#116734]: https://github.com/home-assistant/core/pull/116734 +[#116739]: https://github.com/home-assistant/core/pull/116739 +[#116792]: https://github.com/home-assistant/core/pull/116792 +[#116828]: https://github.com/home-assistant/core/pull/116828 +[#116863]: https://github.com/home-assistant/core/pull/116863 +[#116876]: https://github.com/home-assistant/core/pull/116876 +[#116941]: https://github.com/home-assistant/core/pull/116941 +[#116965]: https://github.com/home-assistant/core/pull/116965 +[#117009]: https://github.com/home-assistant/core/pull/117009 +[#117107]: https://github.com/home-assistant/core/pull/117107 +[#117117]: https://github.com/home-assistant/core/pull/117117 +[#117126]: https://github.com/home-assistant/core/pull/117126 +[#117148]: https://github.com/home-assistant/core/pull/117148 +[#117165]: https://github.com/home-assistant/core/pull/117165 +[#117181]: https://github.com/home-assistant/core/pull/117181 +[#117269]: https://github.com/home-assistant/core/pull/117269 +[#117298]: https://github.com/home-assistant/core/pull/117298 +[#117363]: https://github.com/home-assistant/core/pull/117363 +[#117366]: https://github.com/home-assistant/core/pull/117366 +[#117378]: https://github.com/home-assistant/core/pull/117378 +[#117454]: https://github.com/home-assistant/core/pull/117454 +[#117461]: https://github.com/home-assistant/core/pull/117461 +[#117484]: https://github.com/home-assistant/core/pull/117484 +[#117512]: https://github.com/home-assistant/core/pull/117512 +[#117514]: https://github.com/home-assistant/core/pull/117514 +[#117692]: https://github.com/home-assistant/core/pull/117692 +[#117726]: https://github.com/home-assistant/core/pull/117726 +[#117753]: https://github.com/home-assistant/core/pull/117753 +[#117763]: https://github.com/home-assistant/core/pull/117763 +[#117870]: https://github.com/home-assistant/core/pull/117870 +[#117907]: https://github.com/home-assistant/core/pull/117907 +[#118031]: https://github.com/home-assistant/core/pull/118031 +[#118047]: https://github.com/home-assistant/core/pull/118047 +[#118062]: https://github.com/home-assistant/core/pull/118062 +[#118245]: https://github.com/home-assistant/core/pull/118245 +[#118249]: https://github.com/home-assistant/core/pull/118249 +[#118313]: https://github.com/home-assistant/core/pull/118313 +[#118316]: https://github.com/home-assistant/core/pull/118316 +[#118356]: https://github.com/home-assistant/core/pull/118356 +[#118360]: https://github.com/home-assistant/core/pull/118360 +[#118369]: https://github.com/home-assistant/core/pull/118369 +[#118379]: https://github.com/home-assistant/core/pull/118379 +[#118380]: https://github.com/home-assistant/core/pull/118380 +[#118381]: https://github.com/home-assistant/core/pull/118381 +[#118399]: https://github.com/home-assistant/core/pull/118399 +[#118415]: https://github.com/home-assistant/core/pull/118415 +[#118435]: https://github.com/home-assistant/core/pull/118435 +[#118436]: https://github.com/home-assistant/core/pull/118436 +[#118444]: https://github.com/home-assistant/core/pull/118444 +[#118449]: https://github.com/home-assistant/core/pull/118449 +[#118450]: https://github.com/home-assistant/core/pull/118450 +[#118452]: https://github.com/home-assistant/core/pull/118452 +[#118454]: https://github.com/home-assistant/core/pull/118454 +[#118456]: https://github.com/home-assistant/core/pull/118456 +[#118458]: https://github.com/home-assistant/core/pull/118458 +[#118459]: https://github.com/home-assistant/core/pull/118459 +[#118461]: https://github.com/home-assistant/core/pull/118461 +[#118465]: https://github.com/home-assistant/core/pull/118465 +[#118468]: https://github.com/home-assistant/core/pull/118468 +[#118470]: https://github.com/home-assistant/core/pull/118470 +[#118471]: https://github.com/home-assistant/core/pull/118471 +[#118475]: https://github.com/home-assistant/core/pull/118475 +[#118476]: https://github.com/home-assistant/core/pull/118476 +[#118479]: https://github.com/home-assistant/core/pull/118479 +[#118481]: https://github.com/home-assistant/core/pull/118481 +[#118482]: https://github.com/home-assistant/core/pull/118482 +[#118484]: https://github.com/home-assistant/core/pull/118484 +[#118488]: https://github.com/home-assistant/core/pull/118488 +[#118493]: https://github.com/home-assistant/core/pull/118493 +[#118497]: https://github.com/home-assistant/core/pull/118497 +[#118511]: https://github.com/home-assistant/core/pull/118511 +[#118513]: https://github.com/home-assistant/core/pull/118513 +[#118519]: https://github.com/home-assistant/core/pull/118519 +[#118529]: https://github.com/home-assistant/core/pull/118529 +[#118534]: https://github.com/home-assistant/core/pull/118534 +[#118540]: https://github.com/home-assistant/core/pull/118540 +[#118544]: https://github.com/home-assistant/core/pull/118544 +[#118545]: https://github.com/home-assistant/core/pull/118545 +[#118547]: https://github.com/home-assistant/core/pull/118547 +[#118548]: https://github.com/home-assistant/core/pull/118548 +[#118551]: https://github.com/home-assistant/core/pull/118551 +[#118557]: https://github.com/home-assistant/core/pull/118557 +[#118558]: https://github.com/home-assistant/core/pull/118558 +[#118560]: https://github.com/home-assistant/core/pull/118560 +[#118561]: https://github.com/home-assistant/core/pull/118561 +[#118563]: https://github.com/home-assistant/core/pull/118563 +[#118564]: https://github.com/home-assistant/core/pull/118564 +[#118565]: https://github.com/home-assistant/core/pull/118565 +[#118567]: https://github.com/home-assistant/core/pull/118567 +[#118572]: https://github.com/home-assistant/core/pull/118572 +[#118587]: https://github.com/home-assistant/core/pull/118587 +[#118596]: https://github.com/home-assistant/core/pull/118596 +[#118597]: https://github.com/home-assistant/core/pull/118597 +[#118599]: https://github.com/home-assistant/core/pull/118599 +[#118600]: https://github.com/home-assistant/core/pull/118600 +[#118601]: https://github.com/home-assistant/core/pull/118601 +[#118609]: https://github.com/home-assistant/core/pull/118609 +[#118610]: https://github.com/home-assistant/core/pull/118610 +[#118612]: https://github.com/home-assistant/core/pull/118612 +[#118615]: https://github.com/home-assistant/core/pull/118615 +[#118637]: https://github.com/home-assistant/core/pull/118637 +[#118641]: https://github.com/home-assistant/core/pull/118641 +[#118642]: https://github.com/home-assistant/core/pull/118642 +[#118646]: https://github.com/home-assistant/core/pull/118646 +[#118660]: https://github.com/home-assistant/core/pull/118660 +[#118663]: https://github.com/home-assistant/core/pull/118663 +[#118664]: https://github.com/home-assistant/core/pull/118664 +[#118665]: https://github.com/home-assistant/core/pull/118665 +[#118666]: https://github.com/home-assistant/core/pull/118666 +[#118667]: https://github.com/home-assistant/core/pull/118667 +[#118672]: https://github.com/home-assistant/core/pull/118672 +[#118673]: https://github.com/home-assistant/core/pull/118673 +[#118674]: https://github.com/home-assistant/core/pull/118674 +[#118676]: https://github.com/home-assistant/core/pull/118676 +[#118677]: https://github.com/home-assistant/core/pull/118677 +[#118678]: https://github.com/home-assistant/core/pull/118678 +[#118680]: https://github.com/home-assistant/core/pull/118680 +[#118681]: https://github.com/home-assistant/core/pull/118681 +[#118682]: https://github.com/home-assistant/core/pull/118682 +[#118683]: https://github.com/home-assistant/core/pull/118683 +[#118684]: https://github.com/home-assistant/core/pull/118684 +[#118685]: https://github.com/home-assistant/core/pull/118685 +[#118687]: https://github.com/home-assistant/core/pull/118687 +[#118689]: https://github.com/home-assistant/core/pull/118689 +[#118690]: https://github.com/home-assistant/core/pull/118690 +[#118691]: https://github.com/home-assistant/core/pull/118691 +[#118694]: https://github.com/home-assistant/core/pull/118694 +[#118700]: https://github.com/home-assistant/core/pull/118700 +[#118701]: https://github.com/home-assistant/core/pull/118701 +[#118704]: https://github.com/home-assistant/core/pull/118704 +[#118706]: https://github.com/home-assistant/core/pull/118706 +[#118709]: https://github.com/home-assistant/core/pull/118709 +[#118719]: https://github.com/home-assistant/core/pull/118719 +[#118726]: https://github.com/home-assistant/core/pull/118726 +[#118728]: https://github.com/home-assistant/core/pull/118728 +[#118731]: https://github.com/home-assistant/core/pull/118731 +[#118737]: https://github.com/home-assistant/core/pull/118737 +[#118738]: https://github.com/home-assistant/core/pull/118738 +[#118741]: https://github.com/home-assistant/core/pull/118741 +[#118751]: https://github.com/home-assistant/core/pull/118751 +[#118754]: https://github.com/home-assistant/core/pull/118754 +[#118759]: https://github.com/home-assistant/core/pull/118759 +[#118760]: https://github.com/home-assistant/core/pull/118760 +[#118767]: https://github.com/home-assistant/core/pull/118767 +[#118769]: https://github.com/home-assistant/core/pull/118769 +[#118771]: https://github.com/home-assistant/core/pull/118771 +[#118772]: https://github.com/home-assistant/core/pull/118772 +[#118774]: https://github.com/home-assistant/core/pull/118774 +[#118779]: https://github.com/home-assistant/core/pull/118779 +[#118780]: https://github.com/home-assistant/core/pull/118780 +[#118783]: https://github.com/home-assistant/core/pull/118783 +[#118785]: https://github.com/home-assistant/core/pull/118785 +[#118786]: https://github.com/home-assistant/core/pull/118786 +[#118789]: https://github.com/home-assistant/core/pull/118789 +[#118793]: https://github.com/home-assistant/core/pull/118793 +[#118794]: https://github.com/home-assistant/core/pull/118794 +[#118796]: https://github.com/home-assistant/core/pull/118796 +[#118802]: https://github.com/home-assistant/core/pull/118802 +[#118803]: https://github.com/home-assistant/core/pull/118803 +[#118807]: https://github.com/home-assistant/core/pull/118807 +[#118809]: https://github.com/home-assistant/core/pull/118809 +[#118810]: https://github.com/home-assistant/core/pull/118810 +[#118816]: https://github.com/home-assistant/core/pull/118816 +[#118817]: https://github.com/home-assistant/core/pull/118817 +[#118818]: https://github.com/home-assistant/core/pull/118818 +[#118820]: https://github.com/home-assistant/core/pull/118820 +[#118823]: https://github.com/home-assistant/core/pull/118823 +[#118825]: https://github.com/home-assistant/core/pull/118825 +[#118827]: https://github.com/home-assistant/core/pull/118827 +[#118831]: https://github.com/home-assistant/core/pull/118831 +[#118834]: https://github.com/home-assistant/core/pull/118834 +[#118835]: https://github.com/home-assistant/core/pull/118835 +[#118836]: https://github.com/home-assistant/core/pull/118836 +[#118837]: https://github.com/home-assistant/core/pull/118837 +[#118838]: https://github.com/home-assistant/core/pull/118838 +[#118844]: https://github.com/home-assistant/core/pull/118844 +[#118846]: https://github.com/home-assistant/core/pull/118846 +[#118847]: https://github.com/home-assistant/core/pull/118847 +[#118849]: https://github.com/home-assistant/core/pull/118849 +[#118850]: https://github.com/home-assistant/core/pull/118850 +[#118851]: https://github.com/home-assistant/core/pull/118851 +[#118852]: https://github.com/home-assistant/core/pull/118852 +[#118854]: https://github.com/home-assistant/core/pull/118854 +[#118860]: https://github.com/home-assistant/core/pull/118860 +[#118861]: https://github.com/home-assistant/core/pull/118861 +[#118862]: https://github.com/home-assistant/core/pull/118862 +[#118863]: https://github.com/home-assistant/core/pull/118863 +[#118865]: https://github.com/home-assistant/core/pull/118865 +[#118866]: https://github.com/home-assistant/core/pull/118866 +[#118867]: https://github.com/home-assistant/core/pull/118867 +[#118869]: https://github.com/home-assistant/core/pull/118869 +[#118870]: https://github.com/home-assistant/core/pull/118870 +[#118876]: https://github.com/home-assistant/core/pull/118876 +[#118877]: https://github.com/home-assistant/core/pull/118877 +[#118881]: https://github.com/home-assistant/core/pull/118881 +[#118885]: https://github.com/home-assistant/core/pull/118885 +[#118886]: https://github.com/home-assistant/core/pull/118886 +[#118887]: https://github.com/home-assistant/core/pull/118887 +[#118888]: https://github.com/home-assistant/core/pull/118888 +[#118889]: https://github.com/home-assistant/core/pull/118889 +[#118894]: https://github.com/home-assistant/core/pull/118894 +[#118895]: https://github.com/home-assistant/core/pull/118895 +[#118896]: https://github.com/home-assistant/core/pull/118896 +[#118897]: https://github.com/home-assistant/core/pull/118897 +[#118903]: https://github.com/home-assistant/core/pull/118903 +[#118905]: https://github.com/home-assistant/core/pull/118905 +[#118907]: https://github.com/home-assistant/core/pull/118907 +[#118910]: https://github.com/home-assistant/core/pull/118910 +[#118912]: https://github.com/home-assistant/core/pull/118912 +[#118921]: https://github.com/home-assistant/core/pull/118921 +[#118924]: https://github.com/home-assistant/core/pull/118924 +[#118936]: https://github.com/home-assistant/core/pull/118936 +[#118939]: https://github.com/home-assistant/core/pull/118939 +[#118940]: https://github.com/home-assistant/core/pull/118940 +[#118941]: https://github.com/home-assistant/core/pull/118941 +[#118942]: https://github.com/home-assistant/core/pull/118942 +[#118945]: https://github.com/home-assistant/core/pull/118945 +[#118948]: https://github.com/home-assistant/core/pull/118948 +[#118949]: https://github.com/home-assistant/core/pull/118949 +[#118950]: https://github.com/home-assistant/core/pull/118950 +[#118954]: https://github.com/home-assistant/core/pull/118954 +[#118955]: https://github.com/home-assistant/core/pull/118955 +[#118960]: https://github.com/home-assistant/core/pull/118960 +[#118966]: https://github.com/home-assistant/core/pull/118966 +[#118969]: https://github.com/home-assistant/core/pull/118969 +[#118974]: https://github.com/home-assistant/core/pull/118974 +[#118980]: https://github.com/home-assistant/core/pull/118980 +[#118986]: https://github.com/home-assistant/core/pull/118986 +[#118989]: https://github.com/home-assistant/core/pull/118989 +[#118990]: https://github.com/home-assistant/core/pull/118990 +[#118992]: https://github.com/home-assistant/core/pull/118992 +[#118993]: https://github.com/home-assistant/core/pull/118993 +[#118998]: https://github.com/home-assistant/core/pull/118998 +[#119007]: https://github.com/home-assistant/core/pull/119007 +[#119013]: https://github.com/home-assistant/core/pull/119013 +[#119017]: https://github.com/home-assistant/core/pull/119017 +[#119018]: https://github.com/home-assistant/core/pull/119018 +[#119019]: https://github.com/home-assistant/core/pull/119019 +[#119026]: https://github.com/home-assistant/core/pull/119026 +[#119038]: https://github.com/home-assistant/core/pull/119038 +[#119040]: https://github.com/home-assistant/core/pull/119040 +[#119042]: https://github.com/home-assistant/core/pull/119042 +[#119044]: https://github.com/home-assistant/core/pull/119044 +[#119047]: https://github.com/home-assistant/core/pull/119047 +[#119049]: https://github.com/home-assistant/core/pull/119049 +[#119053]: https://github.com/home-assistant/core/pull/119053 +[#119054]: https://github.com/home-assistant/core/pull/119054 +[#119055]: https://github.com/home-assistant/core/pull/119055 +[#119056]: https://github.com/home-assistant/core/pull/119056 +[#119057]: https://github.com/home-assistant/core/pull/119057 +[#119060]: https://github.com/home-assistant/core/pull/119060 +[#119061]: https://github.com/home-assistant/core/pull/119061 +[#119063]: https://github.com/home-assistant/core/pull/119063 +[#119065]: https://github.com/home-assistant/core/pull/119065 +[#119066]: https://github.com/home-assistant/core/pull/119066 +[#119072]: https://github.com/home-assistant/core/pull/119072 +[#119079]: https://github.com/home-assistant/core/pull/119079 +[#119088]: https://github.com/home-assistant/core/pull/119088 +[#119098]: https://github.com/home-assistant/core/pull/119098 +[#119103]: https://github.com/home-assistant/core/pull/119103 +[#119119]: https://github.com/home-assistant/core/pull/119119 +[#119122]: https://github.com/home-assistant/core/pull/119122 +[#119126]: https://github.com/home-assistant/core/pull/119126 +[#119128]: https://github.com/home-assistant/core/pull/119128 +[#119131]: https://github.com/home-assistant/core/pull/119131 +[#119134]: https://github.com/home-assistant/core/pull/119134 +[#119140]: https://github.com/home-assistant/core/pull/119140 +[#119147]: https://github.com/home-assistant/core/pull/119147 +[#119149]: https://github.com/home-assistant/core/pull/119149 +[#119152]: https://github.com/home-assistant/core/pull/119152 +[#119154]: https://github.com/home-assistant/core/pull/119154 +[#119157]: https://github.com/home-assistant/core/pull/119157 +[#119158]: https://github.com/home-assistant/core/pull/119158 +[#119160]: https://github.com/home-assistant/core/pull/119160 +[#119165]: https://github.com/home-assistant/core/pull/119165 +[#119168]: https://github.com/home-assistant/core/pull/119168 +[#119171]: https://github.com/home-assistant/core/pull/119171 +[#119178]: https://github.com/home-assistant/core/pull/119178 +[#119180]: https://github.com/home-assistant/core/pull/119180 +[#119182]: https://github.com/home-assistant/core/pull/119182 +[#119187]: https://github.com/home-assistant/core/pull/119187 +[#119188]: https://github.com/home-assistant/core/pull/119188 +[#119189]: https://github.com/home-assistant/core/pull/119189 +[#119191]: https://github.com/home-assistant/core/pull/119191 +[#119194]: https://github.com/home-assistant/core/pull/119194 +[#119199]: https://github.com/home-assistant/core/pull/119199 +[#119202]: https://github.com/home-assistant/core/pull/119202 +[#119206]: https://github.com/home-assistant/core/pull/119206 +[#119207]: https://github.com/home-assistant/core/pull/119207 +[#119209]: https://github.com/home-assistant/core/pull/119209 +[#119210]: https://github.com/home-assistant/core/pull/119210 +[#119211]: https://github.com/home-assistant/core/pull/119211 +[#119213]: https://github.com/home-assistant/core/pull/119213 +[#119219]: https://github.com/home-assistant/core/pull/119219 +[#119221]: https://github.com/home-assistant/core/pull/119221 +[#119224]: https://github.com/home-assistant/core/pull/119224 +[#119225]: https://github.com/home-assistant/core/pull/119225 +[#119227]: https://github.com/home-assistant/core/pull/119227 +[#119229]: https://github.com/home-assistant/core/pull/119229 +[#119230]: https://github.com/home-assistant/core/pull/119230 +[#119232]: https://github.com/home-assistant/core/pull/119232 +[#119233]: https://github.com/home-assistant/core/pull/119233 +[#119236]: https://github.com/home-assistant/core/pull/119236 +[#119239]: https://github.com/home-assistant/core/pull/119239 +[#119241]: https://github.com/home-assistant/core/pull/119241 +[#119246]: https://github.com/home-assistant/core/pull/119246 +[#119251]: https://github.com/home-assistant/core/pull/119251 +[#119257]: https://github.com/home-assistant/core/pull/119257 +[#119260]: https://github.com/home-assistant/core/pull/119260 +[#119262]: https://github.com/home-assistant/core/pull/119262 +[#119263]: https://github.com/home-assistant/core/pull/119263 +[#119264]: https://github.com/home-assistant/core/pull/119264 +[#119266]: https://github.com/home-assistant/core/pull/119266 +[#119268]: https://github.com/home-assistant/core/pull/119268 +[#119269]: https://github.com/home-assistant/core/pull/119269 +[#119270]: https://github.com/home-assistant/core/pull/119270 +[#119274]: https://github.com/home-assistant/core/pull/119274 +[#119275]: https://github.com/home-assistant/core/pull/119275 +[#119277]: https://github.com/home-assistant/core/pull/119277 +[#119279]: https://github.com/home-assistant/core/pull/119279 +[#119280]: https://github.com/home-assistant/core/pull/119280 +[#119282]: https://github.com/home-assistant/core/pull/119282 +[#119283]: https://github.com/home-assistant/core/pull/119283 +[#119285]: https://github.com/home-assistant/core/pull/119285 +[#119286]: https://github.com/home-assistant/core/pull/119286 +[#119291]: https://github.com/home-assistant/core/pull/119291 +[#119292]: https://github.com/home-assistant/core/pull/119292 +[#119294]: https://github.com/home-assistant/core/pull/119294 +[#119297]: https://github.com/home-assistant/core/pull/119297 +[#119299]: https://github.com/home-assistant/core/pull/119299 +[#119300]: https://github.com/home-assistant/core/pull/119300 +[#119301]: https://github.com/home-assistant/core/pull/119301 +[#119302]: https://github.com/home-assistant/core/pull/119302 +[#119307]: https://github.com/home-assistant/core/pull/119307 +[#119309]: https://github.com/home-assistant/core/pull/119309 +[#119311]: https://github.com/home-assistant/core/pull/119311 +[#119314]: https://github.com/home-assistant/core/pull/119314 +[#119315]: https://github.com/home-assistant/core/pull/119315 +[#119321]: https://github.com/home-assistant/core/pull/119321 +[#119326]: https://github.com/home-assistant/core/pull/119326 +[#119328]: https://github.com/home-assistant/core/pull/119328 +[#119330]: https://github.com/home-assistant/core/pull/119330 +[#119331]: https://github.com/home-assistant/core/pull/119331 +[#119335]: https://github.com/home-assistant/core/pull/119335 +[#119339]: https://github.com/home-assistant/core/pull/119339 +[#119346]: https://github.com/home-assistant/core/pull/119346 +[#119348]: https://github.com/home-assistant/core/pull/119348 +[#119349]: https://github.com/home-assistant/core/pull/119349 +[#119351]: https://github.com/home-assistant/core/pull/119351 +[#119352]: https://github.com/home-assistant/core/pull/119352 +[#119353]: https://github.com/home-assistant/core/pull/119353 +[#119354]: https://github.com/home-assistant/core/pull/119354 +[#119355]: https://github.com/home-assistant/core/pull/119355 +[#119356]: https://github.com/home-assistant/core/pull/119356 +[#119358]: https://github.com/home-assistant/core/pull/119358 +[#119359]: https://github.com/home-assistant/core/pull/119359 +[#119362]: https://github.com/home-assistant/core/pull/119362 +[#119364]: https://github.com/home-assistant/core/pull/119364 +[#119365]: https://github.com/home-assistant/core/pull/119365 +[#119366]: https://github.com/home-assistant/core/pull/119366 +[#119367]: https://github.com/home-assistant/core/pull/119367 +[#119368]: https://github.com/home-assistant/core/pull/119368 +[#119369]: https://github.com/home-assistant/core/pull/119369 +[#119370]: https://github.com/home-assistant/core/pull/119370 +[#119371]: https://github.com/home-assistant/core/pull/119371 +[#119373]: https://github.com/home-assistant/core/pull/119373 +[#119377]: https://github.com/home-assistant/core/pull/119377 +[#119378]: https://github.com/home-assistant/core/pull/119378 +[#119379]: https://github.com/home-assistant/core/pull/119379 +[#119385]: https://github.com/home-assistant/core/pull/119385 +[#119386]: https://github.com/home-assistant/core/pull/119386 +[#119387]: https://github.com/home-assistant/core/pull/119387 +[#119388]: https://github.com/home-assistant/core/pull/119388 +[#119389]: https://github.com/home-assistant/core/pull/119389 +[#119392]: https://github.com/home-assistant/core/pull/119392 +[#119393]: https://github.com/home-assistant/core/pull/119393 +[#119394]: https://github.com/home-assistant/core/pull/119394 +[#119395]: https://github.com/home-assistant/core/pull/119395 +[#119397]: https://github.com/home-assistant/core/pull/119397 +[#119399]: https://github.com/home-assistant/core/pull/119399 +[#119401]: https://github.com/home-assistant/core/pull/119401 +[#119402]: https://github.com/home-assistant/core/pull/119402 +[#119403]: https://github.com/home-assistant/core/pull/119403 +[#119405]: https://github.com/home-assistant/core/pull/119405 +[#119407]: https://github.com/home-assistant/core/pull/119407 +[#119408]: https://github.com/home-assistant/core/pull/119408 +[#119421]: https://github.com/home-assistant/core/pull/119421 +[#119423]: https://github.com/home-assistant/core/pull/119423 +[#119425]: https://github.com/home-assistant/core/pull/119425 +[#119430]: https://github.com/home-assistant/core/pull/119430 +[#119438]: https://github.com/home-assistant/core/pull/119438 +[#119439]: https://github.com/home-assistant/core/pull/119439 +[#119440]: https://github.com/home-assistant/core/pull/119440 +[#119441]: https://github.com/home-assistant/core/pull/119441 +[#119442]: https://github.com/home-assistant/core/pull/119442 +[#119451]: https://github.com/home-assistant/core/pull/119451 +[#119453]: https://github.com/home-assistant/core/pull/119453 +[#119454]: https://github.com/home-assistant/core/pull/119454 +[#119461]: https://github.com/home-assistant/core/pull/119461 +[#119463]: https://github.com/home-assistant/core/pull/119463 +[#119464]: https://github.com/home-assistant/core/pull/119464 +[#119467]: https://github.com/home-assistant/core/pull/119467 +[#119468]: https://github.com/home-assistant/core/pull/119468 +[#119470]: https://github.com/home-assistant/core/pull/119470 +[#119471]: https://github.com/home-assistant/core/pull/119471 +[#119472]: https://github.com/home-assistant/core/pull/119472 +[#119473]: https://github.com/home-assistant/core/pull/119473 +[#119474]: https://github.com/home-assistant/core/pull/119474 +[#119475]: https://github.com/home-assistant/core/pull/119475 +[#119476]: https://github.com/home-assistant/core/pull/119476 +[#119477]: https://github.com/home-assistant/core/pull/119477 +[#119478]: https://github.com/home-assistant/core/pull/119478 +[#119479]: https://github.com/home-assistant/core/pull/119479 +[#119480]: https://github.com/home-assistant/core/pull/119480 +[#119481]: https://github.com/home-assistant/core/pull/119481 +[#119482]: https://github.com/home-assistant/core/pull/119482 +[#119483]: https://github.com/home-assistant/core/pull/119483 +[#119489]: https://github.com/home-assistant/core/pull/119489 +[#119490]: https://github.com/home-assistant/core/pull/119490 +[#119491]: https://github.com/home-assistant/core/pull/119491 +[#119493]: https://github.com/home-assistant/core/pull/119493 +[#119494]: https://github.com/home-assistant/core/pull/119494 +[#119495]: https://github.com/home-assistant/core/pull/119495 +[#119496]: https://github.com/home-assistant/core/pull/119496 +[#119497]: https://github.com/home-assistant/core/pull/119497 +[#119500]: https://github.com/home-assistant/core/pull/119500 +[#119501]: https://github.com/home-assistant/core/pull/119501 +[#119502]: https://github.com/home-assistant/core/pull/119502 +[#119506]: https://github.com/home-assistant/core/pull/119506 +[#119507]: https://github.com/home-assistant/core/pull/119507 +[#119508]: https://github.com/home-assistant/core/pull/119508 +[#119509]: https://github.com/home-assistant/core/pull/119509 +[#119512]: https://github.com/home-assistant/core/pull/119512 +[#119514]: https://github.com/home-assistant/core/pull/119514 +[#119515]: https://github.com/home-assistant/core/pull/119515 +[#119516]: https://github.com/home-assistant/core/pull/119516 +[#119517]: https://github.com/home-assistant/core/pull/119517 +[#119518]: https://github.com/home-assistant/core/pull/119518 +[#119519]: https://github.com/home-assistant/core/pull/119519 +[#119520]: https://github.com/home-assistant/core/pull/119520 +[#119522]: https://github.com/home-assistant/core/pull/119522 +[#119523]: https://github.com/home-assistant/core/pull/119523 +[#119524]: https://github.com/home-assistant/core/pull/119524 +[#119527]: https://github.com/home-assistant/core/pull/119527 +[#119528]: https://github.com/home-assistant/core/pull/119528 +[#119529]: https://github.com/home-assistant/core/pull/119529 +[#119531]: https://github.com/home-assistant/core/pull/119531 +[#119532]: https://github.com/home-assistant/core/pull/119532 +[#119540]: https://github.com/home-assistant/core/pull/119540 +[#119542]: https://github.com/home-assistant/core/pull/119542 +[#119544]: https://github.com/home-assistant/core/pull/119544 +[#119546]: https://github.com/home-assistant/core/pull/119546 +[#119547]: https://github.com/home-assistant/core/pull/119547 +[#119548]: https://github.com/home-assistant/core/pull/119548 +[#119549]: https://github.com/home-assistant/core/pull/119549 +[#119550]: https://github.com/home-assistant/core/pull/119550 +[#119551]: https://github.com/home-assistant/core/pull/119551 +[#119552]: https://github.com/home-assistant/core/pull/119552 +[#119554]: https://github.com/home-assistant/core/pull/119554 +[#119555]: https://github.com/home-assistant/core/pull/119555 +[#119558]: https://github.com/home-assistant/core/pull/119558 +[#119560]: https://github.com/home-assistant/core/pull/119560 +[#119561]: https://github.com/home-assistant/core/pull/119561 +[#119563]: https://github.com/home-assistant/core/pull/119563 +[#119564]: https://github.com/home-assistant/core/pull/119564 +[#119565]: https://github.com/home-assistant/core/pull/119565 +[#119566]: https://github.com/home-assistant/core/pull/119566 +[#119567]: https://github.com/home-assistant/core/pull/119567 +[#119568]: https://github.com/home-assistant/core/pull/119568 +[#119570]: https://github.com/home-assistant/core/pull/119570 +[#119574]: https://github.com/home-assistant/core/pull/119574 +[#119575]: https://github.com/home-assistant/core/pull/119575 +[#119576]: https://github.com/home-assistant/core/pull/119576 +[#119577]: https://github.com/home-assistant/core/pull/119577 +[#119578]: https://github.com/home-assistant/core/pull/119578 +[#119580]: https://github.com/home-assistant/core/pull/119580 +[#119581]: https://github.com/home-assistant/core/pull/119581 +[#119583]: https://github.com/home-assistant/core/pull/119583 +[#119584]: https://github.com/home-assistant/core/pull/119584 +[#119585]: https://github.com/home-assistant/core/pull/119585 +[#119586]: https://github.com/home-assistant/core/pull/119586 +[#119589]: https://github.com/home-assistant/core/pull/119589 +[#119590]: https://github.com/home-assistant/core/pull/119590 +[#119591]: https://github.com/home-assistant/core/pull/119591 +[#119592]: https://github.com/home-assistant/core/pull/119592 +[#119593]: https://github.com/home-assistant/core/pull/119593 +[#119594]: https://github.com/home-assistant/core/pull/119594 +[#119596]: https://github.com/home-assistant/core/pull/119596 +[#119597]: https://github.com/home-assistant/core/pull/119597 +[#119598]: https://github.com/home-assistant/core/pull/119598 +[#119599]: https://github.com/home-assistant/core/pull/119599 +[#119600]: https://github.com/home-assistant/core/pull/119600 +[#119601]: https://github.com/home-assistant/core/pull/119601 +[#119602]: https://github.com/home-assistant/core/pull/119602 +[#119603]: https://github.com/home-assistant/core/pull/119603 +[#119604]: https://github.com/home-assistant/core/pull/119604 +[#119605]: https://github.com/home-assistant/core/pull/119605 +[#119606]: https://github.com/home-assistant/core/pull/119606 +[#119607]: https://github.com/home-assistant/core/pull/119607 +[#119611]: https://github.com/home-assistant/core/pull/119611 +[#119612]: https://github.com/home-assistant/core/pull/119612 +[#119614]: https://github.com/home-assistant/core/pull/119614 +[#119622]: https://github.com/home-assistant/core/pull/119622 +[#119624]: https://github.com/home-assistant/core/pull/119624 +[#119625]: https://github.com/home-assistant/core/pull/119625 +[#119627]: https://github.com/home-assistant/core/pull/119627 +[#119629]: https://github.com/home-assistant/core/pull/119629 +[#119630]: https://github.com/home-assistant/core/pull/119630 +[#119631]: https://github.com/home-assistant/core/pull/119631 +[#119633]: https://github.com/home-assistant/core/pull/119633 +[#119635]: https://github.com/home-assistant/core/pull/119635 +[#119636]: https://github.com/home-assistant/core/pull/119636 +[#119637]: https://github.com/home-assistant/core/pull/119637 +[#119640]: https://github.com/home-assistant/core/pull/119640 +[#119645]: https://github.com/home-assistant/core/pull/119645 +[#119647]: https://github.com/home-assistant/core/pull/119647 +[#119655]: https://github.com/home-assistant/core/pull/119655 +[#119658]: https://github.com/home-assistant/core/pull/119658 +[#119663]: https://github.com/home-assistant/core/pull/119663 +[#119664]: https://github.com/home-assistant/core/pull/119664 +[#119665]: https://github.com/home-assistant/core/pull/119665 +[#119666]: https://github.com/home-assistant/core/pull/119666 +[#119667]: https://github.com/home-assistant/core/pull/119667 +[#119668]: https://github.com/home-assistant/core/pull/119668 +[#119669]: https://github.com/home-assistant/core/pull/119669 +[#119671]: https://github.com/home-assistant/core/pull/119671 +[#119672]: https://github.com/home-assistant/core/pull/119672 +[#119673]: https://github.com/home-assistant/core/pull/119673 +[#119675]: https://github.com/home-assistant/core/pull/119675 +[#119678]: https://github.com/home-assistant/core/pull/119678 +[#119682]: https://github.com/home-assistant/core/pull/119682 +[#119695]: https://github.com/home-assistant/core/pull/119695 +[#119696]: https://github.com/home-assistant/core/pull/119696 +[#119698]: https://github.com/home-assistant/core/pull/119698 +[#119702]: https://github.com/home-assistant/core/pull/119702 +[#119704]: https://github.com/home-assistant/core/pull/119704 +[#119706]: https://github.com/home-assistant/core/pull/119706 +[#119716]: https://github.com/home-assistant/core/pull/119716 +[#119720]: https://github.com/home-assistant/core/pull/119720 +[#119721]: https://github.com/home-assistant/core/pull/119721 +[#119724]: https://github.com/home-assistant/core/pull/119724 +[#119725]: https://github.com/home-assistant/core/pull/119725 +[#119726]: https://github.com/home-assistant/core/pull/119726 +[#119727]: https://github.com/home-assistant/core/pull/119727 +[#119739]: https://github.com/home-assistant/core/pull/119739 +[#119740]: https://github.com/home-assistant/core/pull/119740 +[#119741]: https://github.com/home-assistant/core/pull/119741 +[#119744]: https://github.com/home-assistant/core/pull/119744 +[#119745]: https://github.com/home-assistant/core/pull/119745 +[#119746]: https://github.com/home-assistant/core/pull/119746 +[#119748]: https://github.com/home-assistant/core/pull/119748 +[#119749]: https://github.com/home-assistant/core/pull/119749 +[#119750]: https://github.com/home-assistant/core/pull/119750 +[#119753]: https://github.com/home-assistant/core/pull/119753 +[#119754]: https://github.com/home-assistant/core/pull/119754 +[#119755]: https://github.com/home-assistant/core/pull/119755 +[#119756]: https://github.com/home-assistant/core/pull/119756 +[#119758]: https://github.com/home-assistant/core/pull/119758 +[#119759]: https://github.com/home-assistant/core/pull/119759 +[#119761]: https://github.com/home-assistant/core/pull/119761 +[#119763]: https://github.com/home-assistant/core/pull/119763 +[#119768]: https://github.com/home-assistant/core/pull/119768 +[#119770]: https://github.com/home-assistant/core/pull/119770 +[#119772]: https://github.com/home-assistant/core/pull/119772 +[#119779]: https://github.com/home-assistant/core/pull/119779 +[#119780]: https://github.com/home-assistant/core/pull/119780 +[#119781]: https://github.com/home-assistant/core/pull/119781 +[#119782]: https://github.com/home-assistant/core/pull/119782 +[#119783]: https://github.com/home-assistant/core/pull/119783 +[#119785]: https://github.com/home-assistant/core/pull/119785 +[#119786]: https://github.com/home-assistant/core/pull/119786 +[#119787]: https://github.com/home-assistant/core/pull/119787 +[#119789]: https://github.com/home-assistant/core/pull/119789 +[#119790]: https://github.com/home-assistant/core/pull/119790 +[#119798]: https://github.com/home-assistant/core/pull/119798 +[#119799]: https://github.com/home-assistant/core/pull/119799 +[#119800]: https://github.com/home-assistant/core/pull/119800 +[#119802]: https://github.com/home-assistant/core/pull/119802 +[#119811]: https://github.com/home-assistant/core/pull/119811 +[#119813]: https://github.com/home-assistant/core/pull/119813 +[#119814]: https://github.com/home-assistant/core/pull/119814 +[#119817]: https://github.com/home-assistant/core/pull/119817 +[#119820]: https://github.com/home-assistant/core/pull/119820 +[#119821]: https://github.com/home-assistant/core/pull/119821 +[#119822]: https://github.com/home-assistant/core/pull/119822 +[#119824]: https://github.com/home-assistant/core/pull/119824 +[#119826]: https://github.com/home-assistant/core/pull/119826 +[#119827]: https://github.com/home-assistant/core/pull/119827 +[#119829]: https://github.com/home-assistant/core/pull/119829 +[#119830]: https://github.com/home-assistant/core/pull/119830 +[#119831]: https://github.com/home-assistant/core/pull/119831 +[#119833]: https://github.com/home-assistant/core/pull/119833 +[#119834]: https://github.com/home-assistant/core/pull/119834 +[#119838]: https://github.com/home-assistant/core/pull/119838 +[#119848]: https://github.com/home-assistant/core/pull/119848 +[#119853]: https://github.com/home-assistant/core/pull/119853 +[#119855]: https://github.com/home-assistant/core/pull/119855 +[#119856]: https://github.com/home-assistant/core/pull/119856 +[#119859]: https://github.com/home-assistant/core/pull/119859 +[#119860]: https://github.com/home-assistant/core/pull/119860 +[#119862]: https://github.com/home-assistant/core/pull/119862 +[#119863]: https://github.com/home-assistant/core/pull/119863 +[#119871]: https://github.com/home-assistant/core/pull/119871 +[#119876]: https://github.com/home-assistant/core/pull/119876 +[#119877]: https://github.com/home-assistant/core/pull/119877 +[#119880]: https://github.com/home-assistant/core/pull/119880 +[#119881]: https://github.com/home-assistant/core/pull/119881 +[#119882]: https://github.com/home-assistant/core/pull/119882 +[#119883]: https://github.com/home-assistant/core/pull/119883 +[#119885]: https://github.com/home-assistant/core/pull/119885 +[#119888]: https://github.com/home-assistant/core/pull/119888 +[#119890]: https://github.com/home-assistant/core/pull/119890 +[#119892]: https://github.com/home-assistant/core/pull/119892 +[#119893]: https://github.com/home-assistant/core/pull/119893 +[#119895]: https://github.com/home-assistant/core/pull/119895 +[#119896]: https://github.com/home-assistant/core/pull/119896 +[#119897]: https://github.com/home-assistant/core/pull/119897 +[#119898]: https://github.com/home-assistant/core/pull/119898 +[#119899]: https://github.com/home-assistant/core/pull/119899 +[#119900]: https://github.com/home-assistant/core/pull/119900 +[#119904]: https://github.com/home-assistant/core/pull/119904 +[#119905]: https://github.com/home-assistant/core/pull/119905 +[#119906]: https://github.com/home-assistant/core/pull/119906 +[#119909]: https://github.com/home-assistant/core/pull/119909 +[#119910]: https://github.com/home-assistant/core/pull/119910 +[#119911]: https://github.com/home-assistant/core/pull/119911 +[#119912]: https://github.com/home-assistant/core/pull/119912 +[#119913]: https://github.com/home-assistant/core/pull/119913 +[#119914]: https://github.com/home-assistant/core/pull/119914 +[#119916]: https://github.com/home-assistant/core/pull/119916 +[#119917]: https://github.com/home-assistant/core/pull/119917 +[#119919]: https://github.com/home-assistant/core/pull/119919 +[#119921]: https://github.com/home-assistant/core/pull/119921 +[#119922]: https://github.com/home-assistant/core/pull/119922 +[#119923]: https://github.com/home-assistant/core/pull/119923 +[#119924]: https://github.com/home-assistant/core/pull/119924 +[#119925]: https://github.com/home-assistant/core/pull/119925 +[#119927]: https://github.com/home-assistant/core/pull/119927 +[#119928]: https://github.com/home-assistant/core/pull/119928 +[#119929]: https://github.com/home-assistant/core/pull/119929 +[#119930]: https://github.com/home-assistant/core/pull/119930 +[#119931]: https://github.com/home-assistant/core/pull/119931 +[#119934]: https://github.com/home-assistant/core/pull/119934 +[#119935]: https://github.com/home-assistant/core/pull/119935 +[#119938]: https://github.com/home-assistant/core/pull/119938 +[#119940]: https://github.com/home-assistant/core/pull/119940 +[#119941]: https://github.com/home-assistant/core/pull/119941 +[#119942]: https://github.com/home-assistant/core/pull/119942 +[#119944]: https://github.com/home-assistant/core/pull/119944 +[#119945]: https://github.com/home-assistant/core/pull/119945 +[#119948]: https://github.com/home-assistant/core/pull/119948 +[#119950]: https://github.com/home-assistant/core/pull/119950 +[#119951]: https://github.com/home-assistant/core/pull/119951 +[#119952]: https://github.com/home-assistant/core/pull/119952 +[#119954]: https://github.com/home-assistant/core/pull/119954 +[#119956]: https://github.com/home-assistant/core/pull/119956 +[#119957]: https://github.com/home-assistant/core/pull/119957 +[#119958]: https://github.com/home-assistant/core/pull/119958 +[#119959]: https://github.com/home-assistant/core/pull/119959 +[#119962]: https://github.com/home-assistant/core/pull/119962 +[#119965]: https://github.com/home-assistant/core/pull/119965 +[#119968]: https://github.com/home-assistant/core/pull/119968 +[#119975]: https://github.com/home-assistant/core/pull/119975 +[#119976]: https://github.com/home-assistant/core/pull/119976 +[#119978]: https://github.com/home-assistant/core/pull/119978 +[#119982]: https://github.com/home-assistant/core/pull/119982 +[#119984]: https://github.com/home-assistant/core/pull/119984 +[#119987]: https://github.com/home-assistant/core/pull/119987 +[#119989]: https://github.com/home-assistant/core/pull/119989 +[#119990]: https://github.com/home-assistant/core/pull/119990 +[#119995]: https://github.com/home-assistant/core/pull/119995 +[#119998]: https://github.com/home-assistant/core/pull/119998 +[#120007]: https://github.com/home-assistant/core/pull/120007 +[#120008]: https://github.com/home-assistant/core/pull/120008 +[#120009]: https://github.com/home-assistant/core/pull/120009 +[#120010]: https://github.com/home-assistant/core/pull/120010 +[#120012]: https://github.com/home-assistant/core/pull/120012 +[#120013]: https://github.com/home-assistant/core/pull/120013 +[#120015]: https://github.com/home-assistant/core/pull/120015 +[#120019]: https://github.com/home-assistant/core/pull/120019 +[#120026]: https://github.com/home-assistant/core/pull/120026 +[#120027]: https://github.com/home-assistant/core/pull/120027 +[#120028]: https://github.com/home-assistant/core/pull/120028 +[#120032]: https://github.com/home-assistant/core/pull/120032 +[#120033]: https://github.com/home-assistant/core/pull/120033 +[#120037]: https://github.com/home-assistant/core/pull/120037 +[#120038]: https://github.com/home-assistant/core/pull/120038 +[#120047]: https://github.com/home-assistant/core/pull/120047 +[#120048]: https://github.com/home-assistant/core/pull/120048 +[#120049]: https://github.com/home-assistant/core/pull/120049 +[#120050]: https://github.com/home-assistant/core/pull/120050 +[#120053]: https://github.com/home-assistant/core/pull/120053 +[#120055]: https://github.com/home-assistant/core/pull/120055 +[#120059]: https://github.com/home-assistant/core/pull/120059 +[#120060]: https://github.com/home-assistant/core/pull/120060 +[#120061]: https://github.com/home-assistant/core/pull/120061 +[#120063]: https://github.com/home-assistant/core/pull/120063 +[#120066]: https://github.com/home-assistant/core/pull/120066 +[#120067]: https://github.com/home-assistant/core/pull/120067 +[#120069]: https://github.com/home-assistant/core/pull/120069 +[#120073]: https://github.com/home-assistant/core/pull/120073 +[#120074]: https://github.com/home-assistant/core/pull/120074 +[#120075]: https://github.com/home-assistant/core/pull/120075 +[#120076]: https://github.com/home-assistant/core/pull/120076 +[#120077]: https://github.com/home-assistant/core/pull/120077 +[#120078]: https://github.com/home-assistant/core/pull/120078 +[#120079]: https://github.com/home-assistant/core/pull/120079 +[#120080]: https://github.com/home-assistant/core/pull/120080 +[#120084]: https://github.com/home-assistant/core/pull/120084 +[#120086]: https://github.com/home-assistant/core/pull/120086 +[#120089]: https://github.com/home-assistant/core/pull/120089 +[#120090]: https://github.com/home-assistant/core/pull/120090 +[#120092]: https://github.com/home-assistant/core/pull/120092 +[#120093]: https://github.com/home-assistant/core/pull/120093 +[#120096]: https://github.com/home-assistant/core/pull/120096 +[#120100]: https://github.com/home-assistant/core/pull/120100 +[#120101]: https://github.com/home-assistant/core/pull/120101 +[#120103]: https://github.com/home-assistant/core/pull/120103 +[#120107]: https://github.com/home-assistant/core/pull/120107 +[#120108]: https://github.com/home-assistant/core/pull/120108 +[#120110]: https://github.com/home-assistant/core/pull/120110 +[#120111]: https://github.com/home-assistant/core/pull/120111 +[#120113]: https://github.com/home-assistant/core/pull/120113 +[#120119]: https://github.com/home-assistant/core/pull/120119 +[#120120]: https://github.com/home-assistant/core/pull/120120 +[#120121]: https://github.com/home-assistant/core/pull/120121 +[#120122]: https://github.com/home-assistant/core/pull/120122 +[#120123]: https://github.com/home-assistant/core/pull/120123 +[#120124]: https://github.com/home-assistant/core/pull/120124 +[#120125]: https://github.com/home-assistant/core/pull/120125 +[#120132]: https://github.com/home-assistant/core/pull/120132 +[#120133]: https://github.com/home-assistant/core/pull/120133 +[#120135]: https://github.com/home-assistant/core/pull/120135 +[#120136]: https://github.com/home-assistant/core/pull/120136 +[#120138]: https://github.com/home-assistant/core/pull/120138 +[#120142]: https://github.com/home-assistant/core/pull/120142 +[#120143]: https://github.com/home-assistant/core/pull/120143 +[#120147]: https://github.com/home-assistant/core/pull/120147 +[#120150]: https://github.com/home-assistant/core/pull/120150 +[#120151]: https://github.com/home-assistant/core/pull/120151 +[#120152]: https://github.com/home-assistant/core/pull/120152 +[#120155]: https://github.com/home-assistant/core/pull/120155 +[#120157]: https://github.com/home-assistant/core/pull/120157 +[#120158]: https://github.com/home-assistant/core/pull/120158 +[#120159]: https://github.com/home-assistant/core/pull/120159 +[#120160]: https://github.com/home-assistant/core/pull/120160 +[#120161]: https://github.com/home-assistant/core/pull/120161 +[#120162]: https://github.com/home-assistant/core/pull/120162 +[#120163]: https://github.com/home-assistant/core/pull/120163 +[#120168]: https://github.com/home-assistant/core/pull/120168 +[#120169]: https://github.com/home-assistant/core/pull/120169 +[#120170]: https://github.com/home-assistant/core/pull/120170 +[#120171]: https://github.com/home-assistant/core/pull/120171 +[#120172]: https://github.com/home-assistant/core/pull/120172 +[#120173]: https://github.com/home-assistant/core/pull/120173 +[#120174]: https://github.com/home-assistant/core/pull/120174 +[#120176]: https://github.com/home-assistant/core/pull/120176 +[#120177]: https://github.com/home-assistant/core/pull/120177 +[#120180]: https://github.com/home-assistant/core/pull/120180 +[#120184]: https://github.com/home-assistant/core/pull/120184 +[#120189]: https://github.com/home-assistant/core/pull/120189 +[#120218]: https://github.com/home-assistant/core/pull/120218 +[#120230]: https://github.com/home-assistant/core/pull/120230 +[#120231]: https://github.com/home-assistant/core/pull/120231 +[#120232]: https://github.com/home-assistant/core/pull/120232 +[#120234]: https://github.com/home-assistant/core/pull/120234 +[#120235]: https://github.com/home-assistant/core/pull/120235 +[#120236]: https://github.com/home-assistant/core/pull/120236 +[#120237]: https://github.com/home-assistant/core/pull/120237 +[#120240]: https://github.com/home-assistant/core/pull/120240 +[#120241]: https://github.com/home-assistant/core/pull/120241 +[#120242]: https://github.com/home-assistant/core/pull/120242 +[#120243]: https://github.com/home-assistant/core/pull/120243 +[#120244]: https://github.com/home-assistant/core/pull/120244 +[#120246]: https://github.com/home-assistant/core/pull/120246 +[#120247]: https://github.com/home-assistant/core/pull/120247 +[#120248]: https://github.com/home-assistant/core/pull/120248 +[#120250]: https://github.com/home-assistant/core/pull/120250 +[#120251]: https://github.com/home-assistant/core/pull/120251 +[#120253]: https://github.com/home-assistant/core/pull/120253 +[#120256]: https://github.com/home-assistant/core/pull/120256 +[#120257]: https://github.com/home-assistant/core/pull/120257 +[#120258]: https://github.com/home-assistant/core/pull/120258 +[#120261]: https://github.com/home-assistant/core/pull/120261 +[#120271]: https://github.com/home-assistant/core/pull/120271 +[#120274]: https://github.com/home-assistant/core/pull/120274 +[#120275]: https://github.com/home-assistant/core/pull/120275 +[#120276]: https://github.com/home-assistant/core/pull/120276 +[#120277]: https://github.com/home-assistant/core/pull/120277 +[#120278]: https://github.com/home-assistant/core/pull/120278 +[#120279]: https://github.com/home-assistant/core/pull/120279 +[#120280]: https://github.com/home-assistant/core/pull/120280 +[#120284]: https://github.com/home-assistant/core/pull/120284 +[#120286]: https://github.com/home-assistant/core/pull/120286 +[#120288]: https://github.com/home-assistant/core/pull/120288 +[#120289]: https://github.com/home-assistant/core/pull/120289 +[#120290]: https://github.com/home-assistant/core/pull/120290 +[#120291]: https://github.com/home-assistant/core/pull/120291 +[#120295]: https://github.com/home-assistant/core/pull/120295 +[#120296]: https://github.com/home-assistant/core/pull/120296 +[#120297]: https://github.com/home-assistant/core/pull/120297 +[#120303]: https://github.com/home-assistant/core/pull/120303 +[#120305]: https://github.com/home-assistant/core/pull/120305 +[#120306]: https://github.com/home-assistant/core/pull/120306 +[#120309]: https://github.com/home-assistant/core/pull/120309 +[#120311]: https://github.com/home-assistant/core/pull/120311 +[#120312]: https://github.com/home-assistant/core/pull/120312 +[#120313]: https://github.com/home-assistant/core/pull/120313 +[#120314]: https://github.com/home-assistant/core/pull/120314 +[#120315]: https://github.com/home-assistant/core/pull/120315 +[#120316]: https://github.com/home-assistant/core/pull/120316 +[#120317]: https://github.com/home-assistant/core/pull/120317 +[#120318]: https://github.com/home-assistant/core/pull/120318 +[#120319]: https://github.com/home-assistant/core/pull/120319 +[#120321]: https://github.com/home-assistant/core/pull/120321 +[#120322]: https://github.com/home-assistant/core/pull/120322 +[#120323]: https://github.com/home-assistant/core/pull/120323 +[#120324]: https://github.com/home-assistant/core/pull/120324 +[#120325]: https://github.com/home-assistant/core/pull/120325 +[#120326]: https://github.com/home-assistant/core/pull/120326 +[#120327]: https://github.com/home-assistant/core/pull/120327 +[#120328]: https://github.com/home-assistant/core/pull/120328 +[#120329]: https://github.com/home-assistant/core/pull/120329 +[#120332]: https://github.com/home-assistant/core/pull/120332 +[#120333]: https://github.com/home-assistant/core/pull/120333 +[#120335]: https://github.com/home-assistant/core/pull/120335 +[#120336]: https://github.com/home-assistant/core/pull/120336 +[#120337]: https://github.com/home-assistant/core/pull/120337 +[#120338]: https://github.com/home-assistant/core/pull/120338 +[#120339]: https://github.com/home-assistant/core/pull/120339 +[#120340]: https://github.com/home-assistant/core/pull/120340 +[#120341]: https://github.com/home-assistant/core/pull/120341 +[#120343]: https://github.com/home-assistant/core/pull/120343 +[#120344]: https://github.com/home-assistant/core/pull/120344 +[#120345]: https://github.com/home-assistant/core/pull/120345 +[#120346]: https://github.com/home-assistant/core/pull/120346 +[#120347]: https://github.com/home-assistant/core/pull/120347 +[#120348]: https://github.com/home-assistant/core/pull/120348 +[#120350]: https://github.com/home-assistant/core/pull/120350 +[#120351]: https://github.com/home-assistant/core/pull/120351 +[#120352]: https://github.com/home-assistant/core/pull/120352 +[#120353]: https://github.com/home-assistant/core/pull/120353 +[#120355]: https://github.com/home-assistant/core/pull/120355 +[#120358]: https://github.com/home-assistant/core/pull/120358 +[#120359]: https://github.com/home-assistant/core/pull/120359 +[#120360]: https://github.com/home-assistant/core/pull/120360 +[#120361]: https://github.com/home-assistant/core/pull/120361 +[#120362]: https://github.com/home-assistant/core/pull/120362 +[#120363]: https://github.com/home-assistant/core/pull/120363 +[#120364]: https://github.com/home-assistant/core/pull/120364 +[#120367]: https://github.com/home-assistant/core/pull/120367 +[#120369]: https://github.com/home-assistant/core/pull/120369 +[#120371]: https://github.com/home-assistant/core/pull/120371 +[#120373]: https://github.com/home-assistant/core/pull/120373 +[#120376]: https://github.com/home-assistant/core/pull/120376 +[#120377]: https://github.com/home-assistant/core/pull/120377 +[#120379]: https://github.com/home-assistant/core/pull/120379 +[#120380]: https://github.com/home-assistant/core/pull/120380 +[#120384]: https://github.com/home-assistant/core/pull/120384 +[#120385]: https://github.com/home-assistant/core/pull/120385 +[#120386]: https://github.com/home-assistant/core/pull/120386 +[#120387]: https://github.com/home-assistant/core/pull/120387 +[#120388]: https://github.com/home-assistant/core/pull/120388 +[#120389]: https://github.com/home-assistant/core/pull/120389 +[#120390]: https://github.com/home-assistant/core/pull/120390 +[#120391]: https://github.com/home-assistant/core/pull/120391 +[#120392]: https://github.com/home-assistant/core/pull/120392 +[#120393]: https://github.com/home-assistant/core/pull/120393 +[#120395]: https://github.com/home-assistant/core/pull/120395 +[#120397]: https://github.com/home-assistant/core/pull/120397 +[#120398]: https://github.com/home-assistant/core/pull/120398 +[#120399]: https://github.com/home-assistant/core/pull/120399 +[#120400]: https://github.com/home-assistant/core/pull/120400 +[#120401]: https://github.com/home-assistant/core/pull/120401 +[#120402]: https://github.com/home-assistant/core/pull/120402 +[#120403]: https://github.com/home-assistant/core/pull/120403 +[#120405]: https://github.com/home-assistant/core/pull/120405 +[#120406]: https://github.com/home-assistant/core/pull/120406 +[#120407]: https://github.com/home-assistant/core/pull/120407 +[#120409]: https://github.com/home-assistant/core/pull/120409 +[#120410]: https://github.com/home-assistant/core/pull/120410 +[#120411]: https://github.com/home-assistant/core/pull/120411 +[#120412]: https://github.com/home-assistant/core/pull/120412 +[#120413]: https://github.com/home-assistant/core/pull/120413 +[#120414]: https://github.com/home-assistant/core/pull/120414 +[#120415]: https://github.com/home-assistant/core/pull/120415 +[#120416]: https://github.com/home-assistant/core/pull/120416 +[#120417]: https://github.com/home-assistant/core/pull/120417 +[#120420]: https://github.com/home-assistant/core/pull/120420 +[#120428]: https://github.com/home-assistant/core/pull/120428 +[#120430]: https://github.com/home-assistant/core/pull/120430 +[#120432]: https://github.com/home-assistant/core/pull/120432 +[#120433]: https://github.com/home-assistant/core/pull/120433 +[#120440]: https://github.com/home-assistant/core/pull/120440 +[#120441]: https://github.com/home-assistant/core/pull/120441 +[#120442]: https://github.com/home-assistant/core/pull/120442 +[#120443]: https://github.com/home-assistant/core/pull/120443 +[#120444]: https://github.com/home-assistant/core/pull/120444 +[#120445]: https://github.com/home-assistant/core/pull/120445 +[#120446]: https://github.com/home-assistant/core/pull/120446 +[#120447]: https://github.com/home-assistant/core/pull/120447 +[#120450]: https://github.com/home-assistant/core/pull/120450 +[#120451]: https://github.com/home-assistant/core/pull/120451 +[#120452]: https://github.com/home-assistant/core/pull/120452 +[#120456]: https://github.com/home-assistant/core/pull/120456 +[#120461]: https://github.com/home-assistant/core/pull/120461 +[#120462]: https://github.com/home-assistant/core/pull/120462 +[#120464]: https://github.com/home-assistant/core/pull/120464 +[#120466]: https://github.com/home-assistant/core/pull/120466 +[#120470]: https://github.com/home-assistant/core/pull/120470 +[#120471]: https://github.com/home-assistant/core/pull/120471 +[#120473]: https://github.com/home-assistant/core/pull/120473 +[#120474]: https://github.com/home-assistant/core/pull/120474 +[#120475]: https://github.com/home-assistant/core/pull/120475 +[#120476]: https://github.com/home-assistant/core/pull/120476 +[#120477]: https://github.com/home-assistant/core/pull/120477 +[#120478]: https://github.com/home-assistant/core/pull/120478 +[#120479]: https://github.com/home-assistant/core/pull/120479 +[#120480]: https://github.com/home-assistant/core/pull/120480 +[#120481]: https://github.com/home-assistant/core/pull/120481 +[#120482]: https://github.com/home-assistant/core/pull/120482 +[#120483]: https://github.com/home-assistant/core/pull/120483 +[#120485]: https://github.com/home-assistant/core/pull/120485 +[#120489]: https://github.com/home-assistant/core/pull/120489 +[#120490]: https://github.com/home-assistant/core/pull/120490 +[#120491]: https://github.com/home-assistant/core/pull/120491 +[#120493]: https://github.com/home-assistant/core/pull/120493 +[#120494]: https://github.com/home-assistant/core/pull/120494 +[#120495]: https://github.com/home-assistant/core/pull/120495 +[#120496]: https://github.com/home-assistant/core/pull/120496 +[#120497]: https://github.com/home-assistant/core/pull/120497 +[#120500]: https://github.com/home-assistant/core/pull/120500 +[#120502]: https://github.com/home-assistant/core/pull/120502 +[#120503]: https://github.com/home-assistant/core/pull/120503 +[#120504]: https://github.com/home-assistant/core/pull/120504 +[#120505]: https://github.com/home-assistant/core/pull/120505 +[#120508]: https://github.com/home-assistant/core/pull/120508 +[#120509]: https://github.com/home-assistant/core/pull/120509 +[#120510]: https://github.com/home-assistant/core/pull/120510 +[#120512]: https://github.com/home-assistant/core/pull/120512 +[#120514]: https://github.com/home-assistant/core/pull/120514 +[#120518]: https://github.com/home-assistant/core/pull/120518 +[#120520]: https://github.com/home-assistant/core/pull/120520 +[#120521]: https://github.com/home-assistant/core/pull/120521 +[#120522]: https://github.com/home-assistant/core/pull/120522 +[#120523]: https://github.com/home-assistant/core/pull/120523 +[#120524]: https://github.com/home-assistant/core/pull/120524 +[#120525]: https://github.com/home-assistant/core/pull/120525 +[#120526]: https://github.com/home-assistant/core/pull/120526 +[#120527]: https://github.com/home-assistant/core/pull/120527 +[#120529]: https://github.com/home-assistant/core/pull/120529 +[#120530]: https://github.com/home-assistant/core/pull/120530 +[#120531]: https://github.com/home-assistant/core/pull/120531 +[#120532]: https://github.com/home-assistant/core/pull/120532 +[#120533]: https://github.com/home-assistant/core/pull/120533 +[#120534]: https://github.com/home-assistant/core/pull/120534 +[#120535]: https://github.com/home-assistant/core/pull/120535 +[#120536]: https://github.com/home-assistant/core/pull/120536 +[#120537]: https://github.com/home-assistant/core/pull/120537 +[#120539]: https://github.com/home-assistant/core/pull/120539 +[#120540]: https://github.com/home-assistant/core/pull/120540 +[#120541]: https://github.com/home-assistant/core/pull/120541 +[#120542]: https://github.com/home-assistant/core/pull/120542 +[#120544]: https://github.com/home-assistant/core/pull/120544 +[#120545]: https://github.com/home-assistant/core/pull/120545 +[#120546]: https://github.com/home-assistant/core/pull/120546 +[#120547]: https://github.com/home-assistant/core/pull/120547 +[#120548]: https://github.com/home-assistant/core/pull/120548 +[#120549]: https://github.com/home-assistant/core/pull/120549 +[#120551]: https://github.com/home-assistant/core/pull/120551 +[#120552]: https://github.com/home-assistant/core/pull/120552 +[#120554]: https://github.com/home-assistant/core/pull/120554 +[#120556]: https://github.com/home-assistant/core/pull/120556 +[#120558]: https://github.com/home-assistant/core/pull/120558 +[#120559]: https://github.com/home-assistant/core/pull/120559 +[#120560]: https://github.com/home-assistant/core/pull/120560 +[#120561]: https://github.com/home-assistant/core/pull/120561 +[#120563]: https://github.com/home-assistant/core/pull/120563 +[#120564]: https://github.com/home-assistant/core/pull/120564 +[#120565]: https://github.com/home-assistant/core/pull/120565 +[#120566]: https://github.com/home-assistant/core/pull/120566 +[#120567]: https://github.com/home-assistant/core/pull/120567 +[#120568]: https://github.com/home-assistant/core/pull/120568 +[#120569]: https://github.com/home-assistant/core/pull/120569 +[#120570]: https://github.com/home-assistant/core/pull/120570 +[#120572]: https://github.com/home-assistant/core/pull/120572 +[#120574]: https://github.com/home-assistant/core/pull/120574 +[#120581]: https://github.com/home-assistant/core/pull/120581 +[#120582]: https://github.com/home-assistant/core/pull/120582 +[#120584]: https://github.com/home-assistant/core/pull/120584 +[#120587]: https://github.com/home-assistant/core/pull/120587 +[#120592]: https://github.com/home-assistant/core/pull/120592 +[#120593]: https://github.com/home-assistant/core/pull/120593 +[#120595]: https://github.com/home-assistant/core/pull/120595 +[#120596]: https://github.com/home-assistant/core/pull/120596 +[#120597]: https://github.com/home-assistant/core/pull/120597 +[#120600]: https://github.com/home-assistant/core/pull/120600 +[#120602]: https://github.com/home-assistant/core/pull/120602 +[#120603]: https://github.com/home-assistant/core/pull/120603 +[#120605]: https://github.com/home-assistant/core/pull/120605 +[#120613]: https://github.com/home-assistant/core/pull/120613 +[#120614]: https://github.com/home-assistant/core/pull/120614 +[#120616]: https://github.com/home-assistant/core/pull/120616 +[#120617]: https://github.com/home-assistant/core/pull/120617 +[#120621]: https://github.com/home-assistant/core/pull/120621 +[#120622]: https://github.com/home-assistant/core/pull/120622 +[#120636]: https://github.com/home-assistant/core/pull/120636 +[#120637]: https://github.com/home-assistant/core/pull/120637 +[#120638]: https://github.com/home-assistant/core/pull/120638 +[#120639]: https://github.com/home-assistant/core/pull/120639 +[#120647]: https://github.com/home-assistant/core/pull/120647 +[#120648]: https://github.com/home-assistant/core/pull/120648 +[#120649]: https://github.com/home-assistant/core/pull/120649 +[#120650]: https://github.com/home-assistant/core/pull/120650 +[#120652]: https://github.com/home-assistant/core/pull/120652 +[#120656]: https://github.com/home-assistant/core/pull/120656 +[#120657]: https://github.com/home-assistant/core/pull/120657 +[#120659]: https://github.com/home-assistant/core/pull/120659 +[#120661]: https://github.com/home-assistant/core/pull/120661 +[#120662]: https://github.com/home-assistant/core/pull/120662 +[#120669]: https://github.com/home-assistant/core/pull/120669 +[#120670]: https://github.com/home-assistant/core/pull/120670 +[#120684]: https://github.com/home-assistant/core/pull/120684 +[#120686]: https://github.com/home-assistant/core/pull/120686 +[#120687]: https://github.com/home-assistant/core/pull/120687 +[#120688]: https://github.com/home-assistant/core/pull/120688 +[#120689]: https://github.com/home-assistant/core/pull/120689 +[#120691]: https://github.com/home-assistant/core/pull/120691 +[#120692]: https://github.com/home-assistant/core/pull/120692 +[#120693]: https://github.com/home-assistant/core/pull/120693 +[#120697]: https://github.com/home-assistant/core/pull/120697 +[#120699]: https://github.com/home-assistant/core/pull/120699 +[#120700]: https://github.com/home-assistant/core/pull/120700 +[#120702]: https://github.com/home-assistant/core/pull/120702 +[#120703]: https://github.com/home-assistant/core/pull/120703 +[#120705]: https://github.com/home-assistant/core/pull/120705 +[#120710]: https://github.com/home-assistant/core/pull/120710 +[#120715]: https://github.com/home-assistant/core/pull/120715 +[#120717]: https://github.com/home-assistant/core/pull/120717 +[#120718]: https://github.com/home-assistant/core/pull/120718 +[#120727]: https://github.com/home-assistant/core/pull/120727 +[#120737]: https://github.com/home-assistant/core/pull/120737 +[#120740]: https://github.com/home-assistant/core/pull/120740 +[#120741]: https://github.com/home-assistant/core/pull/120741 +[#120744]: https://github.com/home-assistant/core/pull/120744 +[#120747]: https://github.com/home-assistant/core/pull/120747 +[#120750]: https://github.com/home-assistant/core/pull/120750 +[#120753]: https://github.com/home-assistant/core/pull/120753 +[#120756]: https://github.com/home-assistant/core/pull/120756 +[#120758]: https://github.com/home-assistant/core/pull/120758 +[#120760]: https://github.com/home-assistant/core/pull/120760 +[#120762]: https://github.com/home-assistant/core/pull/120762 +[#120765]: https://github.com/home-assistant/core/pull/120765 +[#120782]: https://github.com/home-assistant/core/pull/120782 +[#120783]: https://github.com/home-assistant/core/pull/120783 +[#120785]: https://github.com/home-assistant/core/pull/120785 +[#120788]: https://github.com/home-assistant/core/pull/120788 +[#120793]: https://github.com/home-assistant/core/pull/120793 +[#120800]: https://github.com/home-assistant/core/pull/120800 +[#120801]: https://github.com/home-assistant/core/pull/120801 +[#120804]: https://github.com/home-assistant/core/pull/120804 +[#120808]: https://github.com/home-assistant/core/pull/120808 +[#120809]: https://github.com/home-assistant/core/pull/120809 +[#120815]: https://github.com/home-assistant/core/pull/120815 +[#120816]: https://github.com/home-assistant/core/pull/120816 +[#120818]: https://github.com/home-assistant/core/pull/120818 +[#120820]: https://github.com/home-assistant/core/pull/120820 +[#120826]: https://github.com/home-assistant/core/pull/120826 +[#120828]: https://github.com/home-assistant/core/pull/120828 +[#120838]: https://github.com/home-assistant/core/pull/120838 +[#120842]: https://github.com/home-assistant/core/pull/120842 +[#120846]: https://github.com/home-assistant/core/pull/120846 +[#120861]: https://github.com/home-assistant/core/pull/120861 +[#120868]: https://github.com/home-assistant/core/pull/120868 +[#120870]: https://github.com/home-assistant/core/pull/120870 +[#120875]: https://github.com/home-assistant/core/pull/120875 +[#120881]: https://github.com/home-assistant/core/pull/120881 +[#120888]: https://github.com/home-assistant/core/pull/120888 +[#120891]: https://github.com/home-assistant/core/pull/120891 +[#120892]: https://github.com/home-assistant/core/pull/120892 +[#120893]: https://github.com/home-assistant/core/pull/120893 +[#120907]: https://github.com/home-assistant/core/pull/120907 +[#120909]: https://github.com/home-assistant/core/pull/120909 +[#120912]: https://github.com/home-assistant/core/pull/120912 +[#120913]: https://github.com/home-assistant/core/pull/120913 +[#120926]: https://github.com/home-assistant/core/pull/120926 +[#120939]: https://github.com/home-assistant/core/pull/120939 +[#120940]: https://github.com/home-assistant/core/pull/120940 +[#120941]: https://github.com/home-assistant/core/pull/120941 +[#120942]: https://github.com/home-assistant/core/pull/120942 +[#120946]: https://github.com/home-assistant/core/pull/120946 +[#120957]: https://github.com/home-assistant/core/pull/120957 +[#120962]: https://github.com/home-assistant/core/pull/120962 +[#120964]: https://github.com/home-assistant/core/pull/120964 +[#120978]: https://github.com/home-assistant/core/pull/120978 +[#120980]: https://github.com/home-assistant/core/pull/120980 +[#120981]: https://github.com/home-assistant/core/pull/120981 +[#120985]: https://github.com/home-assistant/core/pull/120985 +[#121011]: https://github.com/home-assistant/core/pull/121011 +[#121023]: https://github.com/home-assistant/core/pull/121023 +[#121029]: https://github.com/home-assistant/core/pull/121029 +[#121032]: https://github.com/home-assistant/core/pull/121032 +[#121039]: https://github.com/home-assistant/core/pull/121039 +[#86907]: https://github.com/home-assistant/core/pull/86907 +[@2sheds]: https://github.com/2sheds +[@ALERTua]: https://github.com/ALERTua +[@AlCalzone]: https://github.com/AlCalzone +[@Betacart]: https://github.com/Betacart +[@Bouke]: https://github.com/Bouke +[@Bre77]: https://github.com/Bre77 +[@CFenner]: https://github.com/CFenner +[@Caius-Bonus]: https://github.com/Caius-Bonus +[@ChristophCaina]: https://github.com/ChristophCaina +[@Darsstar]: https://github.com/Darsstar +[@DeKaN]: https://github.com/DeKaN +[@Ernst79]: https://github.com/Ernst79 +[@EtienneSOU]: https://github.com/EtienneSOU +[@EuleMitKeule]: https://github.com/EuleMitKeule +[@GraceGRD]: https://github.com/GraceGRD +[@Grubalex]: https://github.com/Grubalex +[@Guy293]: https://github.com/Guy293 +[@HarvsG]: https://github.com/HarvsG +[@IceBotYT]: https://github.com/IceBotYT +[@Ishima]: https://github.com/Ishima +[@JakeMartin-ICL]: https://github.com/JakeMartin-ICL +[@Jordi1990]: https://github.com/Jordi1990 +[@Kane610]: https://github.com/Kane610 +[@Lash-L]: https://github.com/Lash-L +[@LennP]: https://github.com/LennP +[@MallocArray]: https://github.com/MallocArray +[@MarkGodwin]: https://github.com/MarkGodwin +[@MatthewFlamm]: https://github.com/MatthewFlamm +[@NECH2004]: https://github.com/NECH2004 +[@Noltari]: https://github.com/Noltari +[@OnFreund]: https://github.com/OnFreund +[@OzGav]: https://github.com/OzGav +[@PeteRager]: https://github.com/PeteRager +[@RJPoelstra]: https://github.com/RJPoelstra +[@SLaks]: https://github.com/SLaks +[@Sebclem]: https://github.com/Sebclem +[@Sese-Schneider]: https://github.com/Sese-Schneider +[@Shulyaka]: https://github.com/Shulyaka +[@StevenLooman]: https://github.com/StevenLooman +[@TheJulianJES]: https://github.com/TheJulianJES +[@Thomas55555]: https://github.com/Thomas55555 +[@Virenbar]: https://github.com/Virenbar +[@Yazanmy]: https://github.com/Yazanmy +[@abmantis]: https://github.com/abmantis +[@agners]: https://github.com/agners +[@alexandrecuer]: https://github.com/alexandrecuer +[@allenporter]: https://github.com/allenporter +[@arturpragacz]: https://github.com/arturpragacz +[@ashionky]: https://github.com/ashionky +[@astrandb]: https://github.com/astrandb +[@autinerd]: https://github.com/autinerd +[@azerty9971]: https://github.com/azerty9971 +[@bachya]: https://github.com/bachya +[@balloob]: https://github.com/balloob +[@basbruss]: https://github.com/basbruss +[@bdraco]: https://github.com/bdraco +[@beastie29a]: https://github.com/beastie29a +[@bieniu]: https://github.com/bieniu +[@bjpetit]: https://github.com/bjpetit +[@boralyl]: https://github.com/boralyl +[@boswelja]: https://github.com/boswelja +[@bouwew]: https://github.com/bouwew +[@bramkragten]: https://github.com/bramkragten +[@c0ffeeca7]: https://github.com/c0ffeeca7 +[@cRemE-fReSh]: https://github.com/cRemE-fReSh +[@catsmanac]: https://github.com/catsmanac +[@cdce8p]: https://github.com/cdce8p +[@cermakjn]: https://github.com/cermakjn +[@cgarwood]: https://github.com/cgarwood +[@chamberlain2007]: https://github.com/chamberlain2007 +[@chammp]: https://github.com/chammp +[@chemelli74]: https://github.com/chemelli74 +[@cmroche]: https://github.com/cmroche +[@cottsay]: https://github.com/cottsay +[@cyr-ius]: https://github.com/cyr-ius +[@dalinicus]: https://github.com/dalinicus +[@danzel]: https://github.com/danzel +[@davet2001]: https://github.com/davet2001 +[@david1024pl]: https://github.com/david1024pl +[@dbrgn]: https://github.com/dbrgn +[@dgomes]: https://github.com/dgomes +[@dknowles2]: https://github.com/dknowles2 +[@dkrahmer]: https://github.com/dkrahmer +[@dontinelli]: https://github.com/dontinelli +[@dougiteixeira]: https://github.com/dougiteixeira +[@dsymonds]: https://github.com/dsymonds +[@edenhaus]: https://github.com/edenhaus +[@eifinger]: https://github.com/eifinger +[@elcajon]: https://github.com/elcajon +[@elupus]: https://github.com/elupus +[@emontnemery]: https://github.com/emontnemery +[@engrbm87]: https://github.com/engrbm87 +[@epenet]: https://github.com/epenet +[@erwindouna]: https://github.com/erwindouna +[@ethemcemozkan]: https://github.com/ethemcemozkan +[@etnoy]: https://github.com/etnoy +[@farmio]: https://github.com/farmio +[@florian-sabonchi]: https://github.com/florian-sabonchi +[@focabr]: https://github.com/focabr +[@freekode]: https://github.com/freekode +[@frenck]: https://github.com/frenck +[@gedaliahknizhnik]: https://github.com/gedaliahknizhnik +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gjong]: https://github.com/gjong +[@gwww]: https://github.com/gwww +[@hahn-th]: https://github.com/hahn-th +[@huyuwei1996]: https://github.com/huyuwei1996 +[@igorsantos07]: https://github.com/igorsantos07 +[@ikalnyi]: https://github.com/ikalnyi +[@iprak]: https://github.com/iprak +[@j-a-n]: https://github.com/j-a-n +[@jafar-atili]: https://github.com/jafar-atili +[@jaraco]: https://github.com/jaraco +[@jaym25]: https://github.com/jaym25 +[@jbouwh]: https://github.com/jbouwh +[@jeeftor]: https://github.com/jeeftor +[@jesserockz]: https://github.com/jesserockz +[@jgaedicke]: https://github.com/jgaedicke +[@joostlek]: https://github.com/joostlek +[@jpbede]: https://github.com/jpbede +[@jschlyter]: https://github.com/jschlyter +[@jvmahon]: https://github.com/jvmahon +[@karwosts]: https://github.com/karwosts +[@klaasnicolaas]: https://github.com/klaasnicolaas +[@kvakulo]: https://github.com/kvakulo +[@kvanzuijlen]: https://github.com/kvanzuijlen +[@lboue]: https://github.com/lboue +[@lnx85]: https://github.com/lnx85 +[@luca-angemi]: https://github.com/luca-angemi +[@marcelveldt]: https://github.com/marcelveldt +[@matrixd2]: https://github.com/matrixd2 +[@mawoka-myblock]: https://github.com/mawoka-myblock +[@meee1]: https://github.com/meee1 +[@miaucl]: https://github.com/miaucl +[@mib1185]: https://github.com/mib1185 +[@middlingphys]: https://github.com/middlingphys +[@mikosoft83]: https://github.com/mikosoft83 +[@mj23000]: https://github.com/mj23000 +[@mkmer]: https://github.com/mkmer +[@mletenay]: https://github.com/mletenay +[@mtielen]: https://github.com/mtielen +[@natekspencer]: https://github.com/natekspencer +[@neturmel]: https://github.com/neturmel +[@ollo69]: https://github.com/ollo69 +[@osohotwateriot]: https://github.com/osohotwateriot +[@paulusbrand]: https://github.com/paulusbrand +[@pavoni]: https://github.com/pavoni +[@peteS-UK]: https://github.com/peteS-UK +[@piitaya]: https://github.com/piitaya +[@puddly]: https://github.com/puddly +[@r-xyz]: https://github.com/r-xyz +[@raman325]: https://github.com/raman325 +[@rikroe]: https://github.com/rikroe +[@riokuu]: https://github.com/riokuu +[@rokam]: https://github.com/rokam +[@ronweikamp]: https://github.com/ronweikamp +[@rwalker777]: https://github.com/rwalker777 +[@rytilahti]: https://github.com/rytilahti +[@sdb9696]: https://github.com/sdb9696 +[@shaiu]: https://github.com/shaiu +[@silamon]: https://github.com/silamon +[@slovdahl]: https://github.com/slovdahl +[@starkillerOG]: https://github.com/starkillerOG +[@swistakm]: https://github.com/swistakm +[@synesthesiam]: https://github.com/synesthesiam +[@szclsya]: https://github.com/szclsya +[@t0bst4r]: https://github.com/t0bst4r +[@teharris1]: https://github.com/teharris1 +[@thecode]: https://github.com/thecode +[@themaxgross]: https://github.com/themaxgross +[@thomaskistler]: https://github.com/thomaskistler +[@timmo001]: https://github.com/timmo001 +[@tkdrob]: https://github.com/tkdrob +[@tr4nt0r]: https://github.com/tr4nt0r +[@treetip]: https://github.com/treetip +[@tronikos]: https://github.com/tronikos +[@tsmt09]: https://github.com/tsmt09 +[@tsvi]: https://github.com/tsvi +[@vmonkey]: https://github.com/vmonkey +[@wfltaylor]: https://github.com/wfltaylor +[@wgrant]: https://github.com/wgrant +[@wittypluck]: https://github.com/wittypluck +[@xyzroe]: https://github.com/xyzroe +[@yuxincs]: https://github.com/yuxincs +[@zweckj]: https://github.com/zweckj +[@zxdavb]: https://github.com/zxdavb diff --git a/source/common-tasks/os.markdown b/source/common-tasks/os.markdown index 229c107f9409..b46e13f1d1d8 100644 --- a/source/common-tasks/os.markdown +++ b/source/common-tasks/os.markdown @@ -82,11 +82,15 @@ You can manually define that the previous boot slot is used. This can be useful {% include common-tasks/lost_password.md %} {% include common-tasks/third-party-addons.md %} {% include common-tasks/configuration_check.md %} +{% include common-tasks/enable_i2c.md %} -## Home Assistant Versions +## Home Assistant versions + +To see which version your system is running, go to {% my info title="**Settings** > **About**" %}. {% include common-tasks/specific_version.md %} {% include common-tasks/beta_version.md %} {% include common-tasks/development_version.md %} {% include common-tasks/data_disk.md %} + diff --git a/source/common-tasks/supervised.markdown b/source/common-tasks/supervised.markdown index f1032210cd46..74a9c6101fab 100644 --- a/source/common-tasks/supervised.markdown +++ b/source/common-tasks/supervised.markdown @@ -20,7 +20,9 @@ related: {% include common-tasks/third-party-addons.md %} {% include common-tasks/configuration_check.md %} -## Home Assistant Versions +## Home Assistant versions + +To see which version your system is running, go to {% my info title="**Settings** > **About**" %}. {% include common-tasks/specific_version.md %} {% include common-tasks/beta_version.md %} diff --git a/source/dashboards/badges.markdown b/source/dashboards/badges.markdown index 198b11f4105a..42a86fc31b3e 100644 --- a/source/dashboards/badges.markdown +++ b/source/dashboards/badges.markdown @@ -10,9 +10,69 @@ Badges are widgets that sit at the top of a panel, above all the cards. Badges at the top of a panel. </p> -## State Label Badge +## Entity badge -The State Label badge allows you to display a state badge. This badge supports [actions](/dashboards/actions/). +The Entity badge allows you to display the state of an entity on a badge. This badge supports [actions](/dashboards/actions/). + +```yaml +type: entity +entity: light.living_room +``` + +{% configuration entity %} +type: + required: true + description: "`entity`" + type: string +entity: + required: true + description: Entity ID. + type: string +name: + required: false + description: Overwrites the entity name. + type: string +icon: + required: false + description: Overwrites the entity icon. + type: string +color: + required: false + description: Set the color when the entity is active. By default, the color is based on `state`, `domain`, and `device_class` of your entity. It accepts [color token](/dashboards/tile/#available-colors) or hex color code. + type: string + default: state +show_entity_picture: + required: false + description: If your entity has a picture, it will replace the icon. + type: boolean + default: false +display_type: + required: false + description: Type of display for the badge. It can be either `minimal` (icon only), `standard` (icon and state), or `complete` (icon, state, and name). + type: string + default: standard +state_content: + required: false + description: > + Content to display for the state. Can be `state`, `last_changed`, `last_updated`, or any attribute of the entity. Can be either a string with a single item, or a list of string items. Default depends on the entity domain. + type: [string, list] +tap_action: + required: false + description: Action taken on card tap. See [action documentation](/dashboards/actions/#tap-action). By default, it will show the "more-info" dialog. + type: map +hold_action: + required: false + description: Action taken on tap-and-hold. See [action documentation](/dashboards/actions/#hold-action). + type: map +double_tap_action: + required: false + description: Action taken on double tap. See [action documentation](/dashboards/actions/#double-tap-action). + type: map +{% endconfiguration %} + +## State label badge + +The state label badge allows you to display a state badge. This badge supports [actions](/dashboards/actions/). ```yaml type: state-label diff --git a/source/dashboards/cards.markdown b/source/dashboards/cards.markdown index 44965b1aa527..4fbf8ed25ddc 100644 --- a/source/dashboards/cards.markdown +++ b/source/dashboards/cards.markdown @@ -53,10 +53,11 @@ A card can be added to a dashboard directly [from the view](#to-add-a-card-from- - Then, select **Continue**. ![Screenshot add cards by entity](/images/dashboards/dashboard_add-by-entity_02.png) -3. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#show-or-hide-a-card-conditionally). -4. If you like, define [card actions, features, header and footer widgets](#card-actions-features-header-and-footer-widgets). +3. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#showing-or-hiding-a-card-conditionally). +4. If you are adding this card to a [sections view](/dashboards/sections/), on the **Layout** tab, you can [resize the card](#resizing-a-card). +5. If you like, define [card actions, features, header and footer widgets](#card-actions-features-header-and-footer-widgets). - Not all cards support these elements. Refer to the documentation of the specific card type. -5. Select **Add to dashboard**. +6. Select **Add to dashboard**. ![Screenshot card suggestions](/images/dashboards/dashboard_add-by-entity_04.png) ### To add a card from the device page @@ -74,24 +75,47 @@ This method is useful if you are on the **Device** page and want to create a car - If you like the card proposal, select **Add to dashboard**. - If you want to change the card, **Pick different card** and choose your card type. - **Result**: The card is added to the selected view. - ![Add to Dashboard button on the device page](/images/dashboards/add_card_from_device_page_02.png) + ![Add to Dashboard button on the device page](/images/dashboards/add_card_from_device_page_02.png) 5. To edit the card configuration, open the view to which you added the card. - Select **Edit card**. -6. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#show-or-hide-a-card-conditionally). +6. If you want this card to be visible only to specific users or under a certain condition, you can [define those conditions](#showing-or-hiding-a-card-conditionally). +7. If you are adding this card to a [sections view](/dashboards/sections/), on the **Layout** tab, you can [resize the card](#resizing-a-card). -7. If you like, define [card actions, features, header and footer widgets](#card-actions-features-header-and-footer-widgets). +8. If you like, define [card actions, features, header and footer widgets](#card-actions-features-header-and-footer-widgets). - Not all cards support these elements. Refer to the documentation of the specific card type. -## Show or hide a card conditionally +## Showing or hiding a card conditionally You can choose to show or hide certain cards based on different conditions. The [available conditions](/dashboards/conditional/#card-conditions) are the same as the ones for the conditional card. 1. On the **Visibility** tab, select **Add condition**. - - Don't see a **Visibility** tab? It is not available on nested cards: - - vertical stack, horizontal stack, and grid card + - Don't see a **Visibility** tab? + - It is not available inside nested cards: vertical stack, horizontal stack, and grid card 2. Select the type of condition, and enter the parameters. - If you define multiple conditions, the section is only shown when all conditions are met. - If you did not define any conditions, the section is always shown, to all users. +3. Select **Save**. + +## Resizing a card + +In [sections view](/dashboards/sections/), you can resize cards. Follow these steps: + +1. On the **Layout** tab, move the sliders to adjust the card size. + - Don't see a **Layout** tab? + - It is not available inside nested cards: vertical stack, horizontal stack, and grid card + - It is not available on the picture elements card. + ![Screenshot of the Layout tab in the card dialog](/images/dashboards/card_resize.png) + +2. Select **Save**. + +## Revert resizing of a card + +If you previously [resized](#resizing-a-card) a card in the [sections view](/dashboards/sections/), and you don't like the new size, you can revert back to the card's default size. Follow these steps: + +1. On the **Layout** tab, select the {% icon "mdi:restore" %} icon. + ![Screenshot of the Layout tab in the card dialog](/images/dashboards/card_resize.png) + +2. Select **Save**. ## Card actions, features, header and footer widgets diff --git a/source/dashboards/dashboards.markdown b/source/dashboards/dashboards.markdown index d8c819955ccf..36b8c09cfc2d 100644 --- a/source/dashboards/dashboards.markdown +++ b/source/dashboards/dashboards.markdown @@ -96,7 +96,7 @@ This will leave the default dashboard intact. - The **Edit dashboard** dialog appears. - By editing the dashboard, you are taking over control of this dashboard. - This means that it is no longer automatically updated when new dashboard elements become available. - - To continue, in the dialog, select the three dots menu, then select **Take control**. + - To continue, in the dialog, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Take control**. 7. You can now [add a card](/dashboards/cards/#adding-cards-to-your-dashboard) or [add a view](/dashboards/views/#adding-a-view-to-a-dashboard). ## Deleting a dashboard @@ -121,10 +121,10 @@ A good way to start this file is to copy and paste the "Raw configuration" from - In your sidebar, select **Overview**. - In the top-right corner, select the pencil icon. -- Select the three dots menu and select **Raw configuration editor**. +- Select the three dots {% icon "mdi:dots-vertical" %} menu and select **Raw configuration editor**. - There you see the configuration for your current dashboard. Copy that into the `<config>/ui-lovelace.yaml` file. -Once you take control of your UI via YAML, the Home Assistant interface for modifying it won't be available anymore and new entities will not automatically be added to your UI. +Once you take control of your UI via YAML, the Home Assistant interface for modifying it won't be available anymore, and new entities will not automatically be added to your UI. When you make changes to `ui-lovelace.yaml`, you don't have to restart Home Assistant or refresh the page. Just hit the refresh button in the menu at the top of the UI. @@ -181,7 +181,7 @@ mode: type: string resources: required: false - description: "List of resources that should be loaded. Only use this when mode is `yaml`. If you change anything here, click the three dots menu (top-right) and click on `Reload resources` to pick up changes without restarting Home Assistant. You can also call `lovelace.reload_resources` service directly." + description: "List of resources that should be loaded. Only use this when mode is `yaml`. If you change anything here, click the three dots {% icon "mdi:dots-vertical" %} menu (top-right) and click on `Reload resources` to pick up changes without restarting Home Assistant. You can also call `lovelace.reload_resources` action directly." type: list keys: url: diff --git a/source/docs/index.html b/source/docs/index.html new file mode 100644 index 000000000000..9b0a48c87601 --- /dev/null +++ b/source/docs/index.html @@ -0,0 +1,17 @@ +--- +title: "Documentation" +description: "Documentation for Home Assistant" +feedback: false +no_toc: true +--- + +<p>The documentation covers beginner to advanced topics around the installation, setup, configuration, and usage of Home Assistant.</p> + +<p> + To see what Home Assistant can do, take a look at the <a href="https://demo.home-assistant.io">demo page</a>. +</p> + +<ul class="docs-index"> + {% include asides/docs_sitemap.html docs_index=true %} +</ul> + diff --git a/source/docs/index.markdown b/source/docs/index.markdown deleted file mode 100644 index 6c4cf84649d6..000000000000 --- a/source/docs/index.markdown +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Documentation" -description: "Documentation for Home Assistant" -feedback: false ---- - -The documentation covers beginner to advanced topics around the installation, setup, configuration, and usage of Home Assistant. - -<div class="text-center hass-option-cards" markdown="0"> - <a class='option-card' href='/getting-started/'> - <div class='img-container'> - <img src='https://brands.home-assistant.io/homeassistant/icon.png' /> - </div> - <div class='title'>Installation</div> - </a> - <a class='option-card' href='/docs/configuration/'> - <div class='img-container'> - <img src='/images/supported_brands/pencil.png' /> - </div> - <div class='title'>Configuration</div> - </a> - <a class='option-card' href='/integrations/mqtt/'> - <div class='img-container'> - <img src='https://brands.home-assistant.io/mqtt/icon.png' /> - </div> - <div class='title'>MQTT</div> - </a> - <a class='option-card' href='/dashboards/'> - <div class='img-container'> - <img src='/images/supported_brands/view-dashboard.png' /> - </div> - <div class='title'>Dashboards</div> - </a> - <a class='option-card' href='https://companion.home-assistant.io/'> - <div class='img-container'> - <img src='https://brands.home-assistant.io/mobile_app/icon.png' /> - </div> - <div class='title'>Android and iOS</div> - </a> - <a class='option-card' href='/voice_control/'> - <div class='img-container'> - <img src='/images/assist/assist-icon.svg' /> - </div> - <div class='title'>Voice assistant</div> - </a> -</div> - -<br/> - -To see what Home Assistant can do, take a look at the [demo page](https://demo.home-assistant.io). diff --git a/source/font/FontAwesome.otf b/source/font/FontAwesome.otf deleted file mode 100644 index 70125459f7d5..000000000000 Binary files a/source/font/FontAwesome.otf and /dev/null differ diff --git a/source/font/fontawesome-webfont.eot b/source/font/fontawesome-webfont.eot deleted file mode 100644 index 0662cb96bfb7..000000000000 Binary files a/source/font/fontawesome-webfont.eot and /dev/null differ diff --git a/source/font/fontawesome-webfont.svg b/source/font/fontawesome-webfont.svg deleted file mode 100644 index 2edb4ec34cbc..000000000000 --- a/source/font/fontawesome-webfont.svg +++ /dev/null @@ -1,399 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata></metadata> -<defs> -<font id="fontawesomeregular" horiz-adv-x="1536" > -<font-face units-per-em="1792" ascent="1536" descent="-256" /> -<missing-glyph horiz-adv-x="448" /> -<glyph unicode=" " horiz-adv-x="448" /> -<glyph unicode=" " horiz-adv-x="448" /> -<glyph unicode=" " horiz-adv-x="448" /> -<glyph unicode="¨" horiz-adv-x="1792" /> -<glyph unicode="©" horiz-adv-x="1792" /> -<glyph unicode="®" horiz-adv-x="1792" /> -<glyph unicode="´" horiz-adv-x="1792" /> -<glyph unicode="Æ" horiz-adv-x="1792" /> -<glyph unicode=" " horiz-adv-x="768" /> -<glyph unicode=" " /> -<glyph unicode=" " horiz-adv-x="768" /> -<glyph unicode=" " /> -<glyph unicode=" " horiz-adv-x="512" /> -<glyph unicode=" " horiz-adv-x="384" /> -<glyph unicode=" " horiz-adv-x="256" /> -<glyph unicode=" " horiz-adv-x="256" /> -<glyph unicode=" " horiz-adv-x="192" /> -<glyph unicode=" " horiz-adv-x="307" /> -<glyph unicode=" " horiz-adv-x="85" /> -<glyph unicode=" " horiz-adv-x="307" /> -<glyph unicode=" " horiz-adv-x="384" /> -<glyph unicode="™" horiz-adv-x="1792" /> -<glyph unicode="∞" horiz-adv-x="1792" /> -<glyph unicode="≠" horiz-adv-x="1792" /> -<glyph unicode="" horiz-adv-x="500" d="M0 0z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> -<glyph unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> -<glyph unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> -<glyph unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> -<glyph unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> -<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> -<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " /> -<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> -<glyph unicode="" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> -<glyph unicode="" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> -<glyph unicode="" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " /> -<glyph unicode="" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> -<glyph unicode="" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" /> -<glyph unicode="" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> -<glyph unicode="" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" /> -<glyph unicode="" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> -<glyph unicode="" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> -<glyph unicode="" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> -<glyph unicode="" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> -<glyph unicode="" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> -<glyph unicode="" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" /> -<glyph unicode="" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> -<glyph unicode="" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> -<glyph unicode="" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> -<glyph unicode="" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" /> -<glyph unicode="" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" /> -<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" /> -<glyph unicode="" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" /> -<glyph unicode="" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" /> -<glyph unicode="" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> -<glyph unicode="" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" /> -<glyph unicode="" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> -<glyph unicode="" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> -<glyph unicode="" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> -<glyph unicode="" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> -<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> -<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> -<glyph unicode="" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> -<glyph unicode="" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" /> -<glyph unicode="" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> -<glyph unicode="" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" /> -<glyph unicode="" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" /> -<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" /> -<glyph unicode="" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> -<glyph unicode="" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> -<glyph unicode="" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" /> -<glyph unicode="" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> -<glyph unicode="" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> -<glyph unicode="" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> -<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> -<glyph unicode="" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> -<glyph unicode="" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " /> -<glyph unicode="" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> -<glyph unicode="" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> -<glyph unicode="" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> -<glyph unicode="" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " /> -<glyph unicode="" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> -<glyph unicode="" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> -<glyph unicode="" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> -<glyph unicode="" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> -<glyph unicode="" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> -<glyph unicode="" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> -<glyph unicode="" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" /> -<glyph unicode="" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" /> -<glyph unicode="" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> -<glyph unicode="" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> -<glyph unicode="" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> -<glyph unicode="" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> -<glyph unicode="" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> -<glyph unicode="" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> -<glyph unicode="" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" /> -<glyph unicode="" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> -<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" /> -<glyph unicode="" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> -<glyph unicode="" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" /> -<glyph unicode="" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> -<glyph unicode="" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> -<glyph unicode="" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> -<glyph unicode="" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> -<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> -<glyph unicode="" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> -<glyph unicode="" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> -<glyph unicode="" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " /> -<glyph unicode="" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " /> -<glyph unicode="" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> -<glyph unicode="" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" /> -<glyph unicode="" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> -<glyph unicode="" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> -<glyph unicode="" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> -<glyph unicode="" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> -<glyph unicode="" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> -<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> -<glyph unicode="" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" /> -<glyph unicode="" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" /> -<glyph unicode="" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> -<glyph unicode="" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> -<glyph unicode="" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> -<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> -<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> -<glyph unicode="" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> -<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> -<glyph unicode="" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> -<glyph unicode="" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> -<glyph unicode="" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" /> -<glyph unicode="" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> -<glyph unicode="" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> -<glyph unicode="" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" /> -<glyph unicode="" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" /> -<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" /> -<glyph unicode="" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> -<glyph unicode="" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> -<glyph unicode="" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> -<glyph unicode="" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> -<glyph unicode="" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> -<glyph unicode="" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> -<glyph unicode="" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> -<glyph unicode="" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" /> -<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> -<glyph unicode="" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " /> -<glyph unicode="" horiz-adv-x="1152" d="M896 608v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h224q14 0 23 -9t9 -23zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28 t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68zM1152 928v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704q93 0 158.5 -65.5t65.5 -158.5z" /> -<glyph unicode="" horiz-adv-x="1152" d="M928 1152q93 0 158.5 -65.5t65.5 -158.5v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68z M864 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576z" /> -<glyph unicode="" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> -<glyph unicode="" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> -<glyph unicode="" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> -<glyph unicode="" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" /> -<glyph unicode="" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> -<glyph unicode="" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> -<glyph unicode="" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> -<glyph unicode="" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> -<glyph unicode="" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> -<glyph unicode="" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> -<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" /> -<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" /> -<glyph unicode="" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> -<glyph unicode="" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> -<glyph unicode="" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> -<glyph unicode="" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> -<glyph unicode="" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1708 881l-188 -881h-304l181 849q4 21 1 43q-4 20 -16 35q-10 14 -28 24q-18 9 -40 9h-197l-205 -960h-303l204 960h-304l-205 -960h-304l272 1280h1139q157 0 245 -118q86 -116 52 -281z" /> -<glyph unicode="" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> -<glyph unicode="" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> -<glyph unicode="" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> -<glyph unicode="" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" /> -<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> -<glyph unicode="" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> -<glyph unicode="" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> -<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> -<glyph unicode="" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> -<glyph unicode="" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> -<glyph unicode="" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> -<glyph unicode="" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" /> -<glyph unicode="" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> -<glyph unicode="" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1664 352v-32q0 -132 -94 -226t-226 -94h-128q-132 0 -226 94t-94 226v480h-224q-2 -102 -14.5 -190.5t-30.5 -156t-48.5 -126.5t-57 -99.5t-67.5 -77.5t-69.5 -58.5t-74 -44t-69 -32t-65.5 -25.5q-4 -2 -32 -13q-8 -2 -12 -2q-22 0 -30 20l-71 178q-5 13 0 25t17 17 q7 3 20 7.5t18 6.5q31 12 46.5 18.5t44.5 20t45.5 26t42 32.5t40.5 42.5t34.5 53.5t30.5 68.5t22.5 83.5t17 103t6.5 123h-256q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h1216q14 0 23 -9t9 -23v-160q0 -14 -9 -23t-23 -9h-224v-512q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v64q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1280 1376v-160q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h960q14 0 23 -9t9 -23z" /> -<glyph unicode="" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> -<glyph unicode="" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> -<glyph unicode="" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" /> -<glyph unicode="" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" /> -<glyph unicode="" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> -<glyph unicode="" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> -<glyph unicode="" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> -<glyph unicode="" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> -<glyph unicode="" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> -<glyph unicode="" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> -<glyph unicode="" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" /> -<glyph unicode="" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" /> -<glyph unicode="" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> -<glyph unicode="" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" /> -<glyph unicode="" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" /> -<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> -<glyph unicode="" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> -<glyph unicode="" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " /> -<glyph unicode="" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> -<glyph unicode="" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> -<glyph unicode="" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> -<glyph unicode="" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> -<glyph unicode="" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> -<glyph unicode="" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> -<glyph unicode="" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> -<glyph unicode="" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" /> -<glyph unicode="" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> -<glyph unicode="" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> -<glyph unicode="" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> -<glyph unicode="" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> -<glyph unicode="" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> -<glyph unicode="" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> -<glyph unicode="" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" /> -<glyph unicode="" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> -<glyph unicode="" horiz-adv-x="1920" d="M805 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM453 1176v-344q0 -179 -89.5 -326t-234.5 -217q-129 152 -129 351q0 200 129.5 352t323.5 184zM958 991q-128 -152 -128 -351q0 -201 128 -351q-145 70 -234.5 218t-89.5 328 v341q196 -33 324 -185zM1638 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM1286 1176v-344q0 -179 -91 -326t-237 -217v0q133 154 133 351q0 195 -133 351q129 151 328 185zM1920 640q0 -201 -129 -351q-145 70 -234.5 218 t-89.5 328v341q194 -32 323.5 -184t129.5 -352z" /> -<glyph unicode="" horiz-adv-x="1792" /> -<glyph unicode="" horiz-adv-x="1792" /> -<glyph unicode="" horiz-adv-x="1792" /> -<glyph unicode="" horiz-adv-x="1792" /> -</font> -</defs></svg> \ No newline at end of file diff --git a/source/font/fontawesome-webfont.ttf b/source/font/fontawesome-webfont.ttf deleted file mode 100644 index d3659246915c..000000000000 Binary files a/source/font/fontawesome-webfont.ttf and /dev/null differ diff --git a/source/font/fontawesome-webfont.woff b/source/font/fontawesome-webfont.woff deleted file mode 100644 index b9bd17e158d8..000000000000 Binary files a/source/font/fontawesome-webfont.woff and /dev/null differ diff --git a/source/getting-started/automation.markdown b/source/getting-started/automation.markdown index 024912d4b0de..eed565a8bc89 100644 --- a/source/getting-started/automation.markdown +++ b/source/getting-started/automation.markdown @@ -3,7 +3,9 @@ title: "Automating Home Assistant" description: "A quick intro on getting your first automation going." --- -Once your {% term devices %} are set up, it's time to put the cherry on the pie: {% term automation %}. We're going to create a simple automation to turn on the lights when the sun sets. Of course, this assumes that you have set up an integration that provides a light at this point. +Once your {% term devices %} are set up, it's time to put the cherry on the pie: {% term automation %}. + +We're going to create a simple automation to turn on the lights when the sun sets. Of course, this assumes that you have set up an integration that provides a light at this point. ## Automatically turn on the lights before sunset @@ -26,9 +28,8 @@ Once your {% term devices %} are set up, it's time to put the cherry on the pie: 4. Once we have defined our trigger, we need to define what should happen. - Select **Add action**. - - Type `Ser` and select **Call service** 5. Select **Light** > **Turn on** or directly enter `light.turn_on`. - - For this automation, we're going to turn on all lights in the living room, so let's select the **Area**. + - For this automation, we're going to turn on all lights in the living room, so under **Targets**, select the **Area**. - This only works if your lights are assigned to an {% term area %}. ![A new automation with the action set up to turn on the lights in the living room.](/images/getting-started/action.png) diff --git a/source/getting-started/configuration.markdown b/source/getting-started/configuration.markdown index b18abfa0212f..1a4348acc724 100644 --- a/source/getting-started/configuration.markdown +++ b/source/getting-started/configuration.markdown @@ -1,61 +1,48 @@ --- -title: "Advanced Configuration" -description: "Instructions to get Home Assistant configured." +title: "Next steps" +description: "Next steps in configuring your Home Assistant" +related: + - docs: configuration/basic/ + title: Changing basic settings + - docs: /docs/configuration/ + title: configuration.yaml file + - docs: /common-tasks/os/#network-storage + title: Network storage + - docs: /common-tasks/os/#backups + title: Backups + - docs: /voice_control/ + title: Voice control + - url: https://companion.home-assistant.io/ + title: Home Assistant on Android and iOS --- -The onboarding process takes care of the initial setup for Home Assistant, such as naming your home and selecting your location. After initial onboarding, these options can be changed in the user interface by clicking on Configuration in the sidebar and clicking on General, or by manually editing them in the Home Assistant configuration file called `configuration.yaml`. This section will explain how to do the latter. +The onboarding process takes you through the initial setup for Home Assistant, such as getting the system up and running, naming your home and selecting your location. This section points you to further documentation helping you with the next steps. -<div class='note'> +## Changing the basic settings -The steps below do not apply to Home Assistant Core & Container installations, for those types of installations, [see here](/docs/configuration/). +To change basic settings such as location, unit system and language, refer to [Changing basic settings](/docs/configuration/basic/). -</div> +## Creating a backup -We are going to help you make your first changes to `configuration.yaml`. To do this, we are going to install an add-on from the Home Assistant add-on store: the File editor. To get to the add-on store, go to {% my supervisor title="Settings > Add-ons" %}. On the new page, open the add-on store tab. +You can back up your Home Assistant, add-on data, and configuration. Backups are used to restore a system or parts of it if a rollback is needed, or to migrate your Home Assistant to new hardware. It is good practice to create a backup before updating. -![Add-on store.](/images/hassio/screenshots/dashboard.png) +To learn how to create a backup of your Home Assistant installation, refer to the following topics: -Under the **Official add-ons** section, you will find the **File editor** add-on. +- {% term "Home Assistant Operating System" %}: [Creating a backup from OS](/common-tasks/os/#backups) +- {% term "Home Assistant Supervised" %}: [Creating a backup from Supervised](/common-tasks/supervised/#backups) - - Click on **File editor** and click on **Install**. When the installation is complete, the UI will go to the add-on details page for the file editor. - - Now start the add-on by clicking on **Start**. - - Open the user interface by clicking on **Open Web UI**. +## Editing the configuration.yaml and configuring file access -Now let's make a change using the file editor: we are going to change the name, location, unit system, and time zone of your Home Assistant installation. +While you can configure most of Home Assistant from the user interface, for some integrations, you will need to [edit the `configuration.yaml` file](/docs/configuration/). This file contains integrations to be loaded along with their configurations. Throughout the documentation, you will find snippets that you can add to your configuration file to enable specific functionality. For starters, there is no need to edit the `configuration.yaml` file. You will be pointed to the documentation when this is needed. - - Click the folder icon in the top left of the file editor window to open the file browser sidebar. - - Click the `configuration.yaml` file (in the `/config/` folder) to load it into the main file editor window. - - Add the following to this file (preferably at the very top, but it ultimately doesn't matter): - ```yaml - homeassistant: - name: Home - latitude: xx.xxxx - longitude: xx.xxxx - unit_system: us_customary - time_zone: America/Chicago - ``` -<div class='note'> - - Valid options for `unit_system` are `us_customary` or `metric`. See [here](https://timezonedb.com/time-zones) for a list of valid time zones. Enter the appropriate option found under the Time Zone column at that page. +## Setting up network storage -</div> +If you need more space to store data, you can configure a [network storage](/common-tasks/os/#network-storage), for example to store backups or to access media. - - Click the save icon in the top right to commit changes. - - Most changes in `configuration.yaml` require Home Assistant to be restarted to see the changes. You can verify that your changes are acceptable by running a configuration check. Do this by navigating to {% my server_controls title="Developer Tools > YAML" %} and then clicking on the **Check configuration** button. When it's valid, it will show the text "Configuration valid!". In order for the **Check Configuration**" button to be visible, you must enable **Advanced Mode** on your user profile. - - Now restart Home Assistant. You can do so by either using the **Restart** option in the ⚙ menu of the File Editor UI or by navigating to {% my system_dashboard title="Settings > System" %} and then clicking on the **Restart** button on the top right of the page. +## Getting started with voice assistant -![Screenshot of the "General" page in the configuration panel.](/images/screenshots/configuration-validation.png) +If you want to get started with a voice assistant, refer to the documentation on [Assist](/voice_control/). -<div class='note'> +## Apps for Android and iOS - If you have watched any videos about setting up Home Assistant using `configuration.yaml` (particularly ones that are old), you might notice your default configuration file is much smaller than what the videos show. Don't be concerned, you haven't done anything wrong. Many items in the default configuration files shown in those old videos are now included in the `default_config:` line that you see in your configuration file. [See here](/integrations/default_config/) for more information on what's included in that line. - -</div> - -### Editing configuration via Samba/Windows Networking - -Maybe you are not a big fan of our web editor and want to use a text editor on your computer instead. This is possible by sharing the configuration over the network using the Samba add-on, which can also be installed from the Home Assistant add-on store. This will make your configuration accessible via the network tab on your computer. - -Go to the add-on store and look for Samba in the core section. After you have installed the add-on, click on **Start**. Home Assistant should now be available in the networking tab on your computer. - -We suggest that to edit `configuration.yaml`, you use the free text editor [Visual Studio Code](https://code.visualstudio.com/) in combination with the [Home Assistant Configuration Helper extension](https://marketplace.visualstudio.com/items?itemName=keesschollaart.vscode-home-assistant). +If you are looking for information on Home Assistant for Android or iOS, refer to the [documentation for the Companion Apps](https://companion.home-assistant.io/). diff --git a/source/getting-started/index.markdown b/source/getting-started/index.markdown index 4e8fa10bf8f4..0de9831c9146 100644 --- a/source/getting-started/index.markdown +++ b/source/getting-started/index.markdown @@ -2,15 +2,20 @@ title: "Getting started" description: "Getting started with Home Assistant" body_id: getting_started +feedback: false show_title: true --- -{% include getting-started/next_step.html step="Installation" link="/installation/" %} -{% include getting-started/next_step.html step="Onboarding" link="/getting-started/onboarding/" %} -{% include getting-started/next_step.html step="Concepts and terminology" link="/getting-started/concepts-terminology/" %} -{% include getting-started/next_step.html step="Edit the dashboard" link="/getting-started/onboarding_dashboard/" %} -{% include getting-started/next_step.html step="Integration" link="/getting-started/integration/" %} -{% include getting-started/next_step.html step="Automation" link="/getting-started/automation/" %} -{% include getting-started/next_step.html step="Presence detection" link="/getting-started/presence-detection/" %} -{% include getting-started/next_step.html step="Join the community" link="/getting-started/join-the-community/" %} -{% include getting-started/next_step.html step="Advanced Configuration" link="/getting-started/configuration/" %} +Thanks for choosing Home Assistant for your smart home. Here are the basic steps to get you started on the journey to a more private, powerful, and sustainable home. + +<!-- textlint-disable --> +{% include getting-started/next_step.html step="Installation" link="/installation/" icon="simple-icons:homeassistant" %} +<!-- textlint-enable --> +{% include getting-started/next_step.html step="Onboarding" link="/getting-started/onboarding/" icon="fluent-mdl2:onboarding" %} +{% include getting-started/next_step.html step="Concepts and terminology" link="/getting-started/concepts-terminology/" icon="material-symbols:dictionary" %} +{% include getting-started/next_step.html step="Edit the dashboard" link="/getting-started/onboarding_dashboard/" icon="mdi:view-dashboard-edit" %} +{% include getting-started/next_step.html step="Integration" link="/getting-started/integration/" icon="mdi:devices" %} +{% include getting-started/next_step.html step="Automation" link="/getting-started/automation/" icon="mdi:robot-happy" %} +{% include getting-started/next_step.html step="Presence detection" link="/getting-started/presence-detection/" icon="mdi:motion-detector" %} +{% include getting-started/next_step.html step="Join the community" link="/getting-started/join-the-community/" icon="mdi:people-group-outline" %} +{% include getting-started/next_step.html step="Next steps" link="/getting-started/configuration/" icon="mdi:cog" %} diff --git a/source/getting-started/join-the-community.markdown b/source/getting-started/join-the-community.markdown index 46195984267e..eb8d7d039d78 100644 --- a/source/getting-started/join-the-community.markdown +++ b/source/getting-started/join-the-community.markdown @@ -7,7 +7,7 @@ You made it here? Good job! You've been able to install Home Assistant and get a Now that you've got that going, let's see what is next: - - Learn about [advanced configuration](/getting-started/configuration/) using `configuration.yaml` in our bonus step of the getting started guide. + - Learn about [next steps](/getting-started/configuration/) of the getting started guide, such as creating a backup or configuring network storage. - Join the community in [our forums] or [our chat]. - Check out [video tutorials] on a wide range of Home Assistant related topics diff --git a/source/getting-started/onboarding_dashboard.markdown b/source/getting-started/onboarding_dashboard.markdown index a4e35a2ece26..d5355cb92397 100644 --- a/source/getting-started/onboarding_dashboard.markdown +++ b/source/getting-started/onboarding_dashboard.markdown @@ -81,7 +81,7 @@ In the following steps, we will create a new dashboard and edit some card settin 4. Open your new dashboard and in the top right of the screen, select the <img height="28px" src="/images/blog/2024-03-dashboard-chapter-1/mdi-edit.png" alt="Edit icon"/> button. 5. By editing the dashboard, you are taking over control of this dashboard. - This means that it is no longer automatically updated when new dashboard elements become available. - - To continue, in the dialog, select the three dots menu, then select **Take control**. + - To continue, in the dialog, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Take control**. - Read and accept this before continuing. 6. Your dashboard might not have much on it yet. - If you have smart home devices in your home, some may have been connected automatically. @@ -91,7 +91,7 @@ In the following steps, we will create a new dashboard and edit some card settin ![Dashboard after onboarding a new device](/images/getting-started/onboarding_dashboard_01.png) 7. Next, we want to edit the weather card. - Select the weather card. - - Then, select the cogwheel. + - Then, select the cogwheel {% icon "mdi:cog-outline" %}. ![Weather details](/images/getting-started/weather_card_details_01.png) @@ -101,7 +101,7 @@ In the following steps, we will create a new dashboard and edit some card settin ![Weather details](/images/getting-started/onboarding_card_settings_01.png) 9. Next, we want to add a new card for this weather {% term service %}. - - Select the weather card again, select the three dots, then **Device info**. + - Select the weather card again, select the three dots {% icon "mdi:dots-vertical" %}, then **Device info**. - Under **Sensors**, select **Add to dashboard**, then **Pick different card**. ![Dashboard - change the card type](/images/getting-started/onboarding_pick_different_card_01.png) diff --git a/source/getting-started/presence-detection.markdown b/source/getting-started/presence-detection.markdown index 3d1f98eb8e65..a206c6e1a472 100644 --- a/source/getting-started/presence-detection.markdown +++ b/source/getting-started/presence-detection.markdown @@ -24,9 +24,9 @@ During the setup of Home Assistant Companion on your mobile device, the app will {% term Zones %} allow you to name areas on a map. These areas can then be used to name the location a tracked user is, or use entering/leaving a zone as an automation {% term trigger %} or {% term condition %}. See [Zones integration](/integrations/zone/) page for more details like creating zones. -<div class='note'> +{% note %} The <a href="/dashboards/map/">map dashboard</a> will hide all devices that are home. -</div> +{% endnote %} [routers]: /integrations/#presence-detection [nmap]: /integrations/nmap_tracker diff --git a/source/green/index.html b/source/green/index.html index 0e6dee540bdd..179dc2d3ace9 100644 --- a/source/green/index.html +++ b/source/green/index.html @@ -6,6 +6,7 @@ og_image: /images/blog/2023-09-ha10/green-intro.png frontpage: true frontpage_image: /images/frontpage/green-frontpage.png +dark_header: true --- <link rel="stylesheet" href="/green/styles.css" /> diff --git a/source/green/styles.css b/source/green/styles.css index 88209b31d8af..5fe7045e8599 100644 --- a/source/green/styles.css +++ b/source/green/styles.css @@ -12,10 +12,24 @@ html { } } +#landingpage .site-header .grid-wrapper { + max-width: 1380px !important; + padding: 0 30px !important; +} + +#landingpage footer .grid-wrapper { + max-width: 1380px; + padding: 0 30px; +} + #landingpage #buy-dialog { overflow-y: auto; } +#landingpage #buy-dialog .distributors { + font-family: 'Instrument Sans', Figtree, sans-serif; +} + #landingpage .page-content { height: auto; overflow-x: unset; @@ -43,7 +57,6 @@ html { } #landingpage .page-content { - padding-top: unset; background-color: #f2f4f9; } @@ -75,10 +88,8 @@ article.page h3 { text-transform: unset; } -@media only screen and (max-width: 480px) { - #landingpage .page-content { - padding-top: 68px; - } +#landingpage .page-content { + padding-top: 68px; } .exploded-view-animation { @@ -635,7 +646,7 @@ button, padding-top: 35px; position: -webkit-sticky; position: sticky; - top: 42px; + top: 64px; } .margin-bottom-small { @@ -670,28 +681,32 @@ button, transition: backdrop-filter 0.5s; } -.wrappernav.scrolled { - -webkit-backdrop-filter: saturate(180%) blur(20px); - backdrop-filter: saturate(180%) blur(20px); -} - .wrappernav.wrappernavlocal { background-color: rgba(0, 0, 0, 0); margin-bottom: -12em; position: -webkit-sticky; position: sticky; + top: 64px; + transition: top .1s, background-color .1s; +} + +.wrappernav.scrolled { + -webkit-backdrop-filter: saturate(180%) blur(20px); + backdrop-filter: saturate(180%) blur(20px); + background-color: rgba(255,255,255,.5); + top: 0; } .navgrid { width: 100%; - max-width: 1100px; + max-width: 1380px; min-height: 6em; grid-column-gap: 0px; grid-template-rows: auto; grid-template-columns: auto 2fr auto; align-items: center; - padding-left: 24px; - padding-right: 24px; + padding-left: 30px; + padding-right: 30px; } .navbar { @@ -728,7 +743,7 @@ button, color: #c9c9c9; background-color: #181818; background-image: linear-gradient(360deg, #222, #2b2b2b); - font-family: Pretendard Regular, sans-serif; + font-family: Figtree, sans-serif; font-weight: 600; transition-property: all; box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), @@ -776,8 +791,9 @@ button, .nav-link.nav-local { text-transform: none; - font-size: 16px; - font-weight: 400; + font-size: 14px; + font-family: 'Instrument Sans', Figtree, sans-serif; + font-weight: 500; } .image-brand { @@ -1010,6 +1026,7 @@ button, font-weight: 400; line-height: 1.4; text-decoration: none; + letter-spacing: 0 !important; } .heading-small { @@ -1020,6 +1037,11 @@ button, font-weight: 400; line-height: 1.4; text-decoration: none; + letter-spacing: 0 !important; +} + +h4.heading-small { + margin-top: 0 !important; } .text-white { @@ -1133,7 +1155,7 @@ button, justify-content: center; align-items: center; padding: 14px 30px; - font-family: Pretendard, sans-serif; + font-family: Figtree, sans-serif; font-size: 16px; font-weight: 600; text-decoration: none; @@ -1149,7 +1171,7 @@ button, .topnav-button.black { color: #fff; background-color: #222; - font-family: Pretendard Regular, sans-serif; + font-family: Figtree, sans-serif; font-weight: 600; } @@ -1345,6 +1367,7 @@ button, } .paragraph-m { + font-family: 'Instrument Sans', Figtree, sans-serif; color: #1d2126; letter-spacing: 0; margin-top: 0 !important; @@ -1352,6 +1375,7 @@ button, font-size: 1.6em !important; line-height: normal !important; font-weight: 400; + letter-spacing: 0 !important; } .paragraph-m.text-white { @@ -1491,8 +1515,9 @@ button, } .main-paragraph-w { + font-family: 'Instrument Sans', Figtree, sans-serif; color: #1d2126; - letter-spacing: 0; + letter-spacing: 0 !important; margin-bottom: 0; font-size: 1.4em; font-weight: 400; @@ -1846,8 +1871,9 @@ button, } .paragraph-small { + font-family: 'Instrument Sans', Figtree, sans-serif; color: rgba(29, 33, 38, 0.75); - letter-spacing: 0; + letter-spacing: 0 !important; margin-bottom: 0; font-size: 1.1em !important; font-weight: 400; @@ -1928,7 +1954,7 @@ button, padding-top: 12px; padding-bottom: 12px; padding-left: 29px; - font-family: Pretendard Bold, sans-serif; + font-family: Figtree, sans-serif; font-size: 16px; font-weight: 700; } @@ -2314,7 +2340,7 @@ button, .topnav-button { width: auto; padding: 18px 40px; - font-family: Pretendard, sans-serif; + font-family: Figtree, sans-serif; font-weight: 400; } @@ -2826,6 +2852,7 @@ button, .heading-small { font-size: 14px; line-height: 1.3; + letter-spacing: 0; } .stats-number.large { @@ -3643,27 +3670,6 @@ button, } } -@font-face { - font-family: "Pretendard Bold"; - src: url("/green/fonts/Pretendard-Bold.woff2") format("woff2"); - font-weight: 700; - font-style: normal; - font-display: swap; -} -@font-face { - font-family: "Pretendard Regular"; - src: url("/green/fonts/Pretendard-Regular.woff2") format("woff2"); - font-weight: 400; - font-style: normal; - font-display: swap; -} -@font-face { - font-family: "Pretendard"; - src: url("/green/fonts/Pretendard-SemiBold.woff2") format("woff2"); - font-weight: 600; - font-style: normal; - font-display: swap; -} @font-face { font-family: "Figtree"; font-style: normal; diff --git a/source/help/reporting_issues.markdown b/source/help/reporting_issues.markdown index c07e5c9f4ca0..d8f60b0d3821 100644 --- a/source/help/reporting_issues.markdown +++ b/source/help/reporting_issues.markdown @@ -1,7 +1,15 @@ --- title: "Reporting issues" description: "Reporting issues about Home Assistant" -sidebar: false +related: + - docs: /docs/configuration/ + title: Configuration.yaml file + - docs: /docs/configuration/troubleshooting/ + title: Enable debug logging + - url: https://community.home-assistant.io/ + title: Forum + - docs: /help/ + title: Bug trackers --- If you have an installation, a setup or a configuration issue, please use our [Forum](https://community.home-assistant.io/) to get help. We have a big community which will help you if they can. @@ -43,7 +51,7 @@ The information contained in the generated diagnostics file is redacted to avoid ### Problem-relevant `configuration.yaml` entries -To exclude configuration issues and allow the developers to quickly test, and perhaps reproduce, your issue, add the relevant part of your `configuration.yaml` file. This file is located in your [configuration folder](/docs/configuration/). +To exclude configuration issues and allow the developers to quickly test, and perhaps reproduce, your issue, add the relevant part of your {% term "`configuration.yaml`" %} file. This file is located in your [configuration folder](/docs/configuration/). ```yaml sensor: @@ -54,7 +62,7 @@ Make sure that you don't post your username, password, API key, access token or ### Traceback and log information (if applicable) -If things go wrong, there will be a so-called traceback or an error message {% my logs title="in your log" %}. Please include this. It starts with **Traceback** and can contain information about where the error was triggered in the code. +If things go wrong, there will be a so-called traceback or an error message in your logs under {% my logs title="**Settings** > **System** > **Logs**" %}. Please include this. It starts with **Traceback** and can contain information about where the error was triggered in the code. ```bash Traceback (most recent call last): @@ -65,6 +73,8 @@ In some cases, it is also necessary to [enable debug logging](/docs/configuratio Enabling this will instruct Home Assistant to log a lot of fine-grained information about the integration. This is helpful for debugging and fixing the issue. In contrast to the diagnostics information, debug logs are not automatically redacted. Make sure to include only the parts you think are relevant to the issue. +Look at the `home-assistant.log` file in the [configuration folder](/docs/configuration/) and see if there are any errors related to your integration. + ### Additional information This section can contain additional details or other observation. Often the little things can help as well. diff --git a/source/images/blog/2024-06-voice-chapter-7/art.jpg b/source/images/blog/2024-06-voice-chapter-7/art.jpg new file mode 100644 index 000000000000..052c4adc2edb Binary files /dev/null and b/source/images/blog/2024-06-voice-chapter-7/art.jpg differ diff --git a/source/images/blog/2024-06-voice-chapter-7/mWW-v1-vs-v2.png b/source/images/blog/2024-06-voice-chapter-7/mWW-v1-vs-v2.png new file mode 100644 index 000000000000..cbddd9c4e9a7 Binary files /dev/null and b/source/images/blog/2024-06-voice-chapter-7/mWW-v1-vs-v2.png differ diff --git a/source/images/blog/2024-06-voice-chapter-7/voice-script.png b/source/images/blog/2024-06-voice-chapter-7/voice-script.png new file mode 100644 index 000000000000..e568bd3fd46e Binary files /dev/null and b/source/images/blog/2024-06-voice-chapter-7/voice-script.png differ diff --git a/source/images/blog/2024-07/blueprint-automation-preview.png b/source/images/blog/2024-07/blueprint-automation-preview.png new file mode 100644 index 000000000000..ad910c25b842 Binary files /dev/null and b/source/images/blog/2024-07/blueprint-automation-preview.png differ diff --git a/source/images/blog/2024-07/blueprint-automation-take-control.png b/source/images/blog/2024-07/blueprint-automation-take-control.png new file mode 100644 index 000000000000..c8747097e6fb Binary files /dev/null and b/source/images/blog/2024-07/blueprint-automation-take-control.png differ diff --git a/source/images/blog/2024-07/dashboard-resize-card.png b/source/images/blog/2024-07/dashboard-resize-card.png new file mode 100644 index 000000000000..adf4c2c8e329 Binary files /dev/null and b/source/images/blog/2024-07/dashboard-resize-card.png differ diff --git a/source/images/blog/2024-07/dashboard-resize-cards-example.png b/source/images/blog/2024-07/dashboard-resize-cards-example.png new file mode 100644 index 000000000000..c6caf191b55c Binary files /dev/null and b/source/images/blog/2024-07/dashboard-resize-cards-example.png differ diff --git a/source/images/blog/2024-07/data-tables-customize-columns.png b/source/images/blog/2024-07/data-tables-customize-columns.png new file mode 100644 index 000000000000..8363e515cabc Binary files /dev/null and b/source/images/blog/2024-07/data-tables-customize-columns.png differ diff --git a/source/images/blog/2024-07/datatables-customize-columns.png b/source/images/blog/2024-07/datatables-customize-columns.png new file mode 100644 index 000000000000..ed302ad11e7b Binary files /dev/null and b/source/images/blog/2024-07/datatables-customize-columns.png differ diff --git a/source/images/blog/2024-07/social.png b/source/images/blog/2024-07/social.png new file mode 100644 index 000000000000..f4c42347d0ab Binary files /dev/null and b/source/images/blog/2024-07/social.png differ diff --git a/source/images/blog/2024-07/templates-link-to-device.png b/source/images/blog/2024-07/templates-link-to-device.png new file mode 100644 index 000000000000..a1b6294de174 Binary files /dev/null and b/source/images/blog/2024-07/templates-link-to-device.png differ diff --git a/source/images/blueprints/blueprint_take_control.webp b/source/images/blueprints/blueprint_take_control.webp new file mode 100644 index 000000000000..979827a7ffda Binary files /dev/null and b/source/images/blueprints/blueprint_take_control.webp differ diff --git a/source/images/dashboards/badges.png b/source/images/dashboards/badges.png index 3d1cad12498a..593b0a33c1ee 100644 Binary files a/source/images/dashboards/badges.png and b/source/images/dashboards/badges.png differ diff --git a/source/images/dashboards/card_resize.png b/source/images/dashboards/card_resize.png new file mode 100644 index 000000000000..a9852b50e544 Binary files /dev/null and b/source/images/dashboards/card_resize.png differ diff --git a/source/images/docs/automation-editor/add-trigger-to-automation.png b/source/images/docs/automation-editor/add-trigger-to-automation.png index aecd2455d782..4c755e757261 100644 Binary files a/source/images/docs/automation-editor/add-trigger-to-automation.png and b/source/images/docs/automation-editor/add-trigger-to-automation.png differ diff --git a/source/images/docs/automation-editor/add_action.png b/source/images/docs/automation-editor/add_action.png new file mode 100644 index 000000000000..ce27322f6824 Binary files /dev/null and b/source/images/docs/automation-editor/add_action.png differ diff --git a/source/images/docs/configuration/change_location_radius.webp b/source/images/docs/configuration/change_location_radius.webp new file mode 100644 index 000000000000..5e0ea3c19d0d Binary files /dev/null and b/source/images/docs/configuration/change_location_radius.webp differ diff --git a/source/images/footer-logo-text.svg b/source/images/footer-logo-text.svg new file mode 100644 index 000000000000..5f06722ed50f --- /dev/null +++ b/source/images/footer-logo-text.svg @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg id="b" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 146.62 71.24"> + <g id="c" data-name="Layer 1"> + <g> + <path d="M2.95,0h4.46v10.99l11.58.04V0h4.5v26.28h-4.5v-11.3l-11.58-.04v11.34H2.95V0Z" fill="#1d2126" stroke-width="0"/> + <path d="M36.57,8.03c2.72,0,4.93.87,6.64,2.62s2.57,3.99,2.57,6.73-.86,4.97-2.57,6.71-3.93,2.62-6.64,2.62-4.97-.87-6.68-2.62-2.57-3.98-2.57-6.71.86-5,2.57-6.74,3.94-2.61,6.68-2.61ZM36.57,22.89c1.45,0,2.63-.51,3.54-1.54s1.36-2.36,1.36-4-.45-2.97-1.36-3.98-2.09-1.52-3.54-1.52-2.69.51-3.6,1.52-1.37,2.34-1.37,3.98.46,2.97,1.37,4,2.12,1.54,3.6,1.54Z" fill="#1d2126" stroke-width="0"/> + <path d="M76.15,14.98v11.3h-4.13v-10.65c0-1.23-.32-2.19-.95-2.88s-1.49-1.04-2.58-1.04c-1.16,0-2.09.38-2.78,1.13s-1.04,1.81-1.04,3.17v10.27h-4.18v-10.65c0-1.23-.31-2.19-.92-2.88s-1.47-1.04-2.56-1.04c-1.16,0-2.09.38-2.79,1.13s-1.05,1.81-1.05,3.17v10.27h-4.25V8.53h3.96l.14,1.71c1.03-1.51,2.71-2.27,5.04-2.27,1.36,0,2.54.28,3.53.84s1.75,1.38,2.27,2.46c.43-1.03,1.15-1.84,2.15-2.43s2.19-.88,3.58-.88c2.02,0,3.62.62,4.8,1.86s1.78,2.96,1.78,5.15Z" fill="#1d2126" stroke-width="0"/> + <path d="M96.78,18.97h-13.61c.14,1.34.64,2.36,1.51,3.06s1.97,1.05,3.3,1.05c2.17,0,3.69-.9,4.55-2.71l3.55,1.41c-.67,1.56-1.72,2.78-3.16,3.66s-3.08,1.32-4.95,1.32c-2.62,0-4.75-.86-6.39-2.58s-2.45-3.97-2.45-6.76.82-5.06,2.47-6.8,3.8-2.62,6.46-2.62,4.72.86,6.31,2.58,2.39,3.99,2.39,6.8v1.58ZM83.24,15.98h9.21c-.08-1.44-.52-2.54-1.31-3.3s-1.85-1.13-3.19-1.13-2.4.38-3.23,1.15-1.32,1.86-1.48,3.28Z" fill="#1d2126" stroke-width="0"/> + <path d="M17.17,56.16H7.17l-2.16,6.12H.4l9.49-26.28h4.61l9.51,26.28h-4.71l-2.13-6.12ZM15.87,52.38l-3.67-10.51-3.71,10.51h7.38Z" fill="#1d2126" stroke-width="0"/> + <path d="M32.35,59.33c.88,0,1.57-.17,2.08-.52s.76-.86.76-1.54c0-.95-.64-1.58-1.92-1.9l-2.44-.65c-3.36-.91-5.04-2.64-5.04-5.19,0-1.63.59-2.96,1.78-3.99s2.78-1.55,4.78-1.55c1.79,0,3.3.41,4.51,1.23s1.95,1.95,2.22,3.38l-3.81.9c-.08-.64-.38-1.15-.89-1.53s-1.14-.56-1.89-.56-1.38.19-1.85.57-.7.88-.7,1.49c0,.49.18.9.53,1.23s.9.59,1.63.79l2.41.6c1.61.43,2.83,1.09,3.67,1.97s1.27,1.96,1.27,3.25c0,1.66-.63,2.99-1.88,3.97s-2.98,1.48-5.19,1.48c-2.04,0-3.67-.45-4.9-1.34s-1.96-2.11-2.18-3.63l3.88-.69c.07.7.38,1.25.94,1.64s1.3.59,2.22.59Z" fill="#1d2126" stroke-width="0"/> + <path d="M48.48,59.33c.88,0,1.57-.17,2.08-.52s.76-.86.76-1.54c0-.95-.64-1.58-1.92-1.9l-2.44-.65c-3.36-.91-5.04-2.64-5.04-5.19,0-1.63.59-2.96,1.78-3.99s2.78-1.55,4.78-1.55c1.79,0,3.3.41,4.51,1.23s1.95,1.95,2.22,3.38l-3.81.9c-.08-.64-.38-1.15-.89-1.53s-1.14-.56-1.89-.56-1.38.19-1.85.57-.7.88-.7,1.49c0,.49.18.9.53,1.23s.9.59,1.63.79l2.41.6c1.61.43,2.83,1.09,3.67,1.97s1.27,1.96,1.27,3.25c0,1.66-.63,2.99-1.88,3.97s-2.98,1.48-5.19,1.48c-2.04,0-3.67-.45-4.9-1.34s-1.96-2.11-2.18-3.63l3.88-.69c.07.7.38,1.25.94,1.64s1.3.59,2.22.59Z" fill="#1d2126" stroke-width="0"/> + <path d="M58.28,38.37c0-.76.26-1.4.78-1.92s1.16-.77,1.91-.77,1.37.26,1.89.79.78,1.16.78,1.9-.26,1.37-.78,1.91-1.15.8-1.89.8-1.37-.27-1.9-.8-.79-1.17-.79-1.91ZM63.1,44.53v17.75h-4.25v-17.75h4.25Z" fill="#1d2126" stroke-width="0"/> + <path d="M73.39,59.33c.88,0,1.57-.17,2.08-.52s.76-.86.76-1.54c0-.95-.64-1.58-1.92-1.9l-2.44-.65c-3.36-.91-5.04-2.64-5.04-5.19,0-1.63.59-2.96,1.78-3.99s2.78-1.55,4.78-1.55c1.79,0,3.3.41,4.51,1.23s1.95,1.95,2.22,3.38l-3.81.9c-.08-.64-.38-1.15-.89-1.53s-1.14-.56-1.89-.56-1.38.19-1.85.57-.7.88-.7,1.49c0,.49.18.9.53,1.23s.9.59,1.63.79l2.41.6c1.61.43,2.83,1.09,3.67,1.97s1.27,1.96,1.27,3.25c0,1.66-.63,2.99-1.88,3.97s-2.98,1.48-5.19,1.48c-2.04,0-3.67-.45-4.9-1.34s-1.96-2.11-2.18-3.63l3.88-.69c.07.7.38,1.25.94,1.64s1.3.59,2.22.59Z" fill="#1d2126" stroke-width="0"/> + <path d="M93.19,62.28c-1.22.27-2.25.4-3.09.4-1.79,0-3.19-.49-4.19-1.48s-1.5-2.45-1.5-4.39v-8.68h-2.72v-3.6h2.72v-5.54h4.22v5.54h4.1v3.6h-4.1v7.93c0,1.92.74,2.88,2.23,2.88.48,0,1.08-.12,1.79-.37l.54,3.71Z" fill="#1d2126" stroke-width="0"/> + <path d="M107.44,62.28c-.14-.57-.24-1.25-.3-2.02-.52.76-1.25,1.37-2.19,1.82s-2.04.68-3.28.68c-1.95,0-3.5-.52-4.68-1.56s-1.76-2.44-1.76-4.21.58-3.09,1.73-4.07,2.73-1.47,4.74-1.47h5.33v-.69c0-1.11-.33-1.95-.98-2.5s-1.56-.83-2.73-.83c-2.07,0-3.56.87-4.46,2.6l-3.09-1.81c1.5-2.82,4.1-4.24,7.79-4.24,2.24,0,4.07.57,5.5,1.72,1.44,1.16,2.16,3.03,2.16,5.61v7.07c0,2,.11,3.3.32,3.88h-4.1ZM107.07,54.39h-4.38c-1,0-1.77.23-2.32.69s-.83,1.08-.83,1.88.28,1.46.84,1.9,1.37.65,2.41.65c1.25,0,2.28-.4,3.08-1.19s1.2-1.97,1.2-3.52v-.4Z" fill="#1d2126" stroke-width="0"/> + <path d="M131.65,51.33v10.95h-4.24v-10.04c0-1.69-.4-2.84-1.2-3.46-.76-.62-1.65-.93-2.67-.93-1.23,0-2.26.39-3.08,1.18s-1.23,1.9-1.23,3.36v9.9h-4.25v-17.75h3.99l.14,1.92c.5-.75,1.24-1.34,2.2-1.78s2.01-.66,3.15-.66c2.3,0,4.07.64,5.32,1.91s1.87,3.08,1.87,5.42Z" fill="#1d2126" stroke-width="0"/> + <path d="M145.23,62.28c-1.22.27-2.25.4-3.09.4-1.79,0-3.19-.49-4.19-1.48s-1.5-2.45-1.5-4.39v-8.68h-2.72v-3.6h2.72v-5.54h4.22v5.54h4.1v3.6h-4.1v7.93c0,1.92.74,2.88,2.23,2.88.48,0,1.08-.12,1.79-.37l.54,3.71Z" fill="#1d2126" stroke-width="0"/> + </g> + </g> +</svg> \ No newline at end of file diff --git a/source/images/footer-skyline.svg b/source/images/footer-skyline.svg new file mode 100644 index 000000000000..30218c777d7e --- /dev/null +++ b/source/images/footer-skyline.svg @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg id="b" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 740 130"> + <g id="c" data-name="Layer 1"> + <g> + <path d="M63.14,95.19l-26.33-26.33c-1.55-1.55-4.1-1.55-5.65,0l-26.33,26.33c-1.55,1.55-2.83,4.63-2.83,6.82v23.99c0,2.2,1.8,4,4,4h24.59l-10.83-10.83c-.56.19-1.15.3-1.77.3-3.01,0-5.46-2.45-5.46-5.46s2.45-5.46,5.46-5.46,5.46,2.45,5.46,5.46c0,.62-.11,1.21-.3,1.77l8.43,8.43v-30.88c-1.81-.89-3.06-2.75-3.06-4.9,0-3.01,2.45-5.46,5.46-5.46s5.46,2.45,5.46,5.46c0,2.15-1.25,4.01-3.06,4.9v21.66l8.39-8.39c-.17-.52-.26-1.08-.26-1.65,0-3.01,2.45-5.46,5.46-5.46s5.46,2.45,5.46,5.46-2.45,5.46-5.46,5.46c-.67,0-1.3-.13-1.89-.34l-11.7,11.7v8.23h25.59c2.2,0,4-1.8,4-4v-23.99c0-2.2-1.27-5.27-2.83-6.82Z" fill="#18bcf2" stroke-width="0"/> + <path d="M641.04,85.42c-1.87-1.87-4.92-1.87-6.78,0l-9.21,9.21c-1.87,1.87-3.39,1.23-3.39-1.41v-22.39c0-2.64-2.16-4.8-4.8-4.8h-22.39c-2.64,0-4.8,2.16-4.8,4.8v59.17h63.96v-27.19c0-2.64-1.53-6.32-3.39-8.19l-9.21-9.21Z" fill="#f2f4f9" stroke-width="0"/> + <path d="M673.63,130c0-17.66,14.32-31.98,31.98-31.98s31.98,14.32,31.98,31.98h-63.96Z" fill="#f2f4f9" stroke-width="0"/> + <g> + <rect x="523.58" y="84.5" width="12.14" height="10.29" fill="#f2f4f9" stroke-width="0"/> + <path d="M535.72,97.5h-12.14v14.08h12.14v-14.08ZM528.86,110.04v-4.74h-2.35l3.93-6.32v4.74h2.39l-3.97,6.32Z" fill="#f2f4f9" stroke-width="0"/> + <path d="M564.89,66.04h-54.37c-2.64,0-4.8,2.16-4.8,4.8v59.17h21.69v-14.18h-8.08v-31.23c0-1.11.38-2.2,1.14-3.01.85-.91,1.88-1.36,3.11-1.36h12.05c1.11,0,2.21.39,3.01,1.15.91.86,1.36,1.9,1.36,3.14v14.04h3.61c.67,0,1.25.24,1.72.72.48.48.71,1.05.71,1.73v10.11c0,.57.23,1.02.7,1.37.47.35,1,.52,1.58.52.64,0,1.22-.17,1.75-.52.53-.35.79-.8.79-1.37v-17.92h-.36c-.59,0-1.08-.2-1.48-.61-.4-.41-.6-.91-.6-1.51v-4.65h.9v-2.57h2.03v2.57h1.76v-2.57h2.03v2.57h.9v4.65c0,.6-.2,1.1-.6,1.51-.4.41-.89.61-1.48.61h-.36v17.92c0,1.24-.52,2.44-1.45,3.27-1.11.98-2.4,1.47-3.87,1.47-1.37,0-2.55-.45-3.54-1.34-.99-.89-1.48-2.02-1.48-3.4v-9.8h-3.29v14.53h-8.08v14.18h37.76v-59.17c0-2.64-2.16-4.8-4.8-4.8Z" fill="#f2f4f9" stroke-width="0"/> + </g> + <g> + <path d="M287.52,95.08h-1.69v-1.99h1.69v-3.34h-1.69v-1.97h1.69v-1.46c0-.47-.16-.88-.49-1.2-.33-.33-.73-.49-1.21-.49s-.88.16-1.2.49c-.32.33-.49.73-.49,1.2v10.92h3.38v-2.16Z" fill="#f2f4f9" stroke-width="0"/> + <path d="M314.43,5.46l-57.18,57.18c-1.87,1.87-3.39,5.55-3.39,8.19v59.17h29.7v-13.64c-1.69-.39-3.19-1.22-4.49-2.51-1.85-1.85-2.77-4.1-2.77-6.77,0-1.48.32-2.9.95-4.25.63-1.35,1.6-2.38,2.9-3.09v-13.41c0-1.59.55-2.94,1.64-4.05s2.43-1.67,4.02-1.67,2.88.53,3.98,1.59c1.16,1.12,1.75,2.7,1.75,4.31v13.22c1.27.71,2.23,1.75,2.88,3.1.65,1.35.97,2.77.97,4.26,0,2.65-.93,4.9-2.8,6.75-1.31,1.3-2.81,2.13-4.51,2.51v13.64h29.75V6.87c0-2.64-1.53-3.27-3.39-1.41Z" fill="#f2f4f9" stroke-width="0"/> + </g> + <g> + <path d="M203.73,68.47l-1.9-1.86-1.74,1.69c-.28.26-.51.56-.69.92s-.27.71-.27,1.08c0,.75.27,1.39.81,1.91.54.53,1.19.79,1.95.79s1.41-.27,1.94-.8c.53-.53.8-1.17.8-1.91,0-.34-.08-.65-.25-.95s-.38-.59-.63-.87Z" fill="#f2f4f9" stroke-width="0"/> + <path d="M212.49,52.05h-21.24v28.01h21.24v-28.01ZM199.88,55.29c.34-.32.76-.49,1.25-.49s.93.17,1.28.5c.34.33.52.75.52,1.24s-.17.9-.52,1.23c-.34.33-.76.5-1.26.5s-.92-.16-1.26-.48-.52-.74-.52-1.25.17-.93.51-1.26ZM194.34,57.77c-.34-.33-.51-.75-.51-1.24s.17-.9.51-1.23c.34-.33.75-.5,1.24-.5s.91.16,1.25.48.52.74.52,1.25-.17.93-.51,1.26c-.34.32-.75.49-1.24.49s-.92-.17-1.26-.5ZM206.3,74.6c-1.22,1.16-2.69,1.73-4.42,1.73s-3.19-.58-4.43-1.74c-1.23-1.16-1.85-2.6-1.83-4.33,0-.84.17-1.65.54-2.4s.84-1.42,1.42-2l4.29-4.22,4.45,4.36c.59.59,1.04,1.26,1.35,1.99.31.73.47,1.49.47,2.28,0,1.72-.61,3.16-1.83,4.32Z" fill="#f2f4f9" stroke-width="0"/> + <path d="M230.48,30.66l-9.21-9.21c-1.87-1.87-4.92-1.87-6.78,0l-9.21,9.21c-1.87,1.87-4.92,1.87-6.78,0l-9.21-9.21c-1.87-1.87-4.92-1.87-6.78,0l-9.21,9.21c-1.87,1.87-3.39,5.55-3.39,8.19v91.15h28.99v-45.96h-7.64c-1.12,0-2.07-.38-2.83-1.15-.76-.76-1.15-1.71-1.15-2.83v-28.01c0-1.13.38-2.09,1.15-2.86.76-.77,1.71-1.16,2.83-1.16h21.24c1.13,0,2.09.39,2.86,1.16.77.77,1.16,1.73,1.16,2.86v28.01c0,1.12-.39,2.07-1.16,2.83-.77.76-1.73,1.15-2.86,1.15h-9.08v45.96h30.47V38.85c0-2.64-1.53-6.32-3.39-8.19Z" fill="#f2f4f9" stroke-width="0"/> + </g> + <g> + <polygon points="356.28 85.75 356.28 92.43 360.21 92.43 358.86 85.75 356.28 85.75" fill="#f2f4f9" stroke-width="0"/> + <path d="M375.86,106.84c-1.13-1.09-2.52-1.63-4.19-1.63h-3.47c-1.66,0-3.06.54-4.19,1.63-1.13,1.09-1.69,2.39-1.69,3.91v1.65s15.23,0,15.23,0v-1.65c0-1.52-.56-2.83-1.69-3.91ZM368.74,110.1c-.32-.32-.49-.73-.49-1.21s.16-.88.49-1.21c.32-.32.73-.49,1.21-.49s.88.16,1.21.49c.32.32.49.73.49,1.21s-.16.88-.49,1.21c-.32.32-.73.49-1.21.49s-.88-.16-1.21-.49Z" fill="#f2f4f9" stroke-width="0"/> + <polygon points="374.26 101.7 377.05 85.75 362.41 85.75 365.63 101.7 374.26 101.7" fill="#f2f4f9" stroke-width="0"/> + <path d="M389.18,21.45c-1.87-1.87-4.92-1.87-6.78,0l-9.21,9.21c-1.87,1.87-3.39,5.55-3.39,8.19v22.39c0,2.64-1.53,3.27-3.39,1.41l-9.21-9.21c-1.87-1.87-4.92-1.87-6.78,0l-9.21,9.21c-1.87,1.87-3.39,5.55-3.39,8.19v59.17s29.73,0,29.73,0v-14.09s-5.22,0-5.22,0c-.95,0-1.77-.35-2.47-1.04-.7-.7-1.04-1.52-1.04-2.47v-1.65c0-1.33.31-2.59.93-3.79.62-1.2,1.54-2.24,2.75-3.11l-1.69-7.91h-3.94c-1.04,0-2.07-.36-2.82-1.06-.85-.79-1.28-1.76-1.28-2.91v-5.67c0-1.03.36-2.05,1.07-2.8.8-.84,1.78-1.27,2.95-1.27h9.31s0-2.12,0-2.12h7.28v2.12s7.83,0,7.83,0l-3.81,21.62c1.21.87,2.13,1.91,2.75,3.12.62,1.2.93,2.46.93,3.78v1.65c0,.95-.35,1.77-1.04,2.47-.7.7-1.52,1.04-2.47,1.04h-5.5s0,14.09,0,14.09h29.73s0-59.17,0-59.17c0-2.64,0-6.96,0-9.59v-22.39c0-2.64-1.53-6.32-3.39-8.19l-9.21-9.21Z" fill="#f2f4f9" stroke-width="0"/> + </g> + <g> + <path d="M439.73,87.42v21.24s28.01,0,28.01,0v-21.24s-28.01,0-28.01,0ZM442.26,106.12v-3.47c.91.06,1.69.42,2.33,1.09s1.02,1.46,1.14,2.38h-3.47ZM447.43,106.12c0-1.43-.5-2.65-1.5-3.65-1-1.01-2.22-1.51-3.66-1.51v-2.54c2.13,0,3.95.75,5.45,2.24,1.5,1.49,2.25,3.31,2.25,5.46h-2.54ZM446.91,95.14c1.46.63,2.72,1.48,3.79,2.55,1.07,1.07,1.92,2.33,2.55,3.79.63,1.46.95,3.01.95,4.64h-2.54c0-2.62-.91-4.84-2.73-6.66-1.82-1.82-4.04-2.73-6.66-2.73v-2.54c1.64,0,3.18.32,4.64.95Z" fill="#f2f4f9" stroke-width="0"/> + <path d="M446.83,116.02v-3.38s-7.02,0-7.02,0c-1.03,0-2.05-.36-2.8-1.06-.84-.79-1.27-1.77-1.27-2.91v-21.16c0-1.04.36-2.07,1.06-2.82.79-.85,1.76-1.28,2.91-1.28h27.92c1.04,0,2.07.36,2.83,1.07.85.8,1.28,1.78,1.28,2.95v21.15c0,1.03-.36,2.05-1.07,2.8-.8.84-1.79,1.27-2.95,1.27h-7.07s0,3.38,0,3.38h-4.66s0,13.98,0,13.98h29.73s0-59.17,0-59.17c0-2.64-1.53-6.32-3.39-8.19l-25.2-25.2c-1.87-1.87-4.92-1.87-6.78,0l-25.2,25.2c-1.87,1.87-3.39,5.55-3.39,8.19v59.17s29.73,0,29.73,0v-13.98s-4.66,0-4.66,0Z" fill="#f2f4f9" stroke-width="0"/> + </g> + <g> + <path d="M112.39,100.32h11.11c1.3-.87,2.32-1.98,3.07-3.34.75-1.36,1.12-2.84,1.12-4.44,0-2.69-.96-4.98-2.88-6.88-1.92-1.9-4.22-2.86-6.9-2.86s-4.98.95-6.9,2.86c-1.92,1.9-2.88,4.2-2.88,6.88,0,1.6.38,3.08,1.14,4.43.76,1.35,1.8,2.47,3.1,3.34Z" fill="#f2f4f9" stroke-width="0"/> + <path d="M85.95,130h29.7s0-13.57,0-13.57c-.15-.12-.29-.24-.43-.38-.75-.8-1.12-1.8-1.12-2.98h7.62c0,1.18-.37,2.18-1.12,2.98-.14.15-.28.27-.43.39v13.57s29.75,0,29.75,0v-59.17c0-2.64-2.16-4.8-4.8-4.8h-6.4c-2.64,0-4.8-2.16-4.8-4.8v-22.39c0-2.64-2.16-4.8-4.8-4.8h-22.39c-2.64,0-4.8,2.16-4.8,4.8v22.39c0,2.64-2.16,4.8-4.8,4.8h-6.4c-2.64,0-4.8,2.16-4.8,4.8v59.17ZM125.07,110.18h-14.3v-3.05h14.3v3.05ZM108.23,82.88c2.71-2.73,5.94-4.09,9.67-4.09,3.73,0,6.97,1.36,9.7,4.09,2.74,2.73,4.1,5.95,4.1,9.66,0,2.51-.62,4.77-1.86,6.77-1.24,2-2.91,3.67-4.99,4.99h-13.88c-2.03-1.33-3.67-2.99-4.93-4.98-1.26-2-1.88-4.26-1.88-6.78,0-3.72,1.36-6.94,4.07-9.66Z" fill="#f2f4f9" stroke-width="0"/> + </g> + <rect width="740" height="130" fill="none" stroke-width="0"/> + </g> + </g> +</svg> \ No newline at end of file diff --git a/source/images/home-assistant-logo-white.svg b/source/images/home-assistant-logo-white.svg new file mode 100644 index 000000000000..df7045ba9f5a --- /dev/null +++ b/source/images/home-assistant-logo-white.svg @@ -0,0 +1,16 @@ +<svg width="1705" height="241" viewBox="0 0 1705 241" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M229.39 109.203L130.61 10.423C124.78 4.59304 115.23 4.59304 109.4 10.423L10.61 109.203C4.78 115.033 0 126.563 0 134.813V224.813C0 233.063 6.75 239.813 15 239.813H107.27L66.64 199.183C64.55 199.903 62.32 200.313 60 200.313C48.7 200.313 39.5 191.113 39.5 179.813C39.5 168.513 48.7 159.313 60 159.313C71.3 159.313 80.5 168.513 80.5 179.813C80.5 182.143 80.09 184.373 79.37 186.463L111 218.093V102.213C104.2 98.873 99.5 91.893 99.5 83.823C99.5 72.523 108.7 63.323 120 63.323C131.3 63.323 140.5 72.523 140.5 83.823C140.5 91.893 135.8 98.873 129 102.213V183.483L160.46 152.023C159.84 150.063 159.5 147.983 159.5 145.823C159.5 134.523 168.7 125.323 180 125.323C191.3 125.323 200.5 134.523 200.5 145.823C200.5 157.123 191.3 166.323 180 166.323C177.5 166.323 175.12 165.853 172.91 165.033L129 208.943V239.823H225C233.25 239.823 240 233.073 240 224.823V134.823C240 126.573 235.23 115.053 229.39 109.213V109.203Z" fill="#F2F4F9"/> +<path d="M320.04 46.6064H344.8V107.606L409.16 107.806V46.6064H434.16V192.606H409.16V129.826L344.8 129.626V192.626H320L320.04 46.6064Z" fill="#F2F4F9"/> +<path d="M506.8 91.2364C521.9 91.2364 534.203 96.0864 543.71 105.786C553.217 115.486 557.97 127.956 557.97 143.196C557.97 158.363 553.217 170.796 543.71 180.496C534.203 190.196 521.9 195.046 506.8 195.046C491.56 195.046 479.19 190.196 469.69 180.496C460.19 170.796 455.437 158.363 455.43 143.196C455.43 127.863 460.183 115.38 469.69 105.746C479.197 96.1131 491.567 91.2764 506.8 91.2364ZM506.8 173.756C514.873 173.756 521.433 170.91 526.48 165.216C531.527 159.523 534.047 152.116 534.04 142.996C534.04 133.89 531.52 126.516 526.48 120.876C521.44 115.236 514.88 112.423 506.8 112.436C498.533 112.436 491.867 115.25 486.8 120.876C481.733 126.503 479.193 133.876 479.18 142.996C479.18 152.116 481.72 159.523 486.8 165.216C491.88 170.91 498.547 173.756 506.8 173.756Z" fill="#F2F4F9"/> +<path d="M726.68 129.826V192.616H703.68V133.426C703.68 126.6 701.923 121.266 698.41 117.426C694.897 113.586 690.11 111.663 684.05 111.656C677.61 111.656 672.467 113.756 668.62 117.956C664.773 122.156 662.853 128.033 662.86 135.586V192.586H639.67V133.426C639.67 126.6 637.96 121.266 634.54 117.426C631.12 113.586 626.383 111.663 620.33 111.656C613.89 111.656 608.717 113.756 604.81 117.956C600.903 122.156 598.95 128.033 598.95 135.586V192.586H575.32V93.9764H597.32L598.1 103.446C603.833 95.0464 613.167 90.8464 626.1 90.8464C633.653 90.8464 640.197 92.4097 645.73 95.5364C651.257 98.6586 655.662 103.441 658.32 109.206C660.708 103.505 664.931 98.7646 670.32 95.7364C675.88 92.4764 682.503 90.8464 690.19 90.8464C701.39 90.8464 710.277 94.2964 716.85 101.196C723.423 108.096 726.7 117.64 726.68 129.826Z" fill="#F2F4F9"/> +<path d="M841.28 151.986H765.7C766.48 159.406 769.28 165.073 774.1 168.986C778.92 172.9 785.04 174.846 792.46 174.826C804.5 174.826 812.93 169.826 817.75 159.826L837.48 167.636C833.937 176.093 827.799 183.206 819.95 187.946C811.95 192.84 802.787 195.283 792.46 195.276C777.873 195.276 766.04 190.506 756.96 180.966C747.88 171.426 743.337 158.91 743.33 143.416C743.33 127.923 747.907 115.326 757.06 105.626C766.213 95.9264 778.173 91.0764 792.94 91.0764C807.46 91.0764 819.147 95.8598 828 105.426C836.853 114.993 841.28 127.593 841.28 143.226V151.986ZM766.09 135.376H817.26C816.8 127.376 814.377 121.273 809.99 117.066C805.603 112.86 799.693 110.78 792.26 110.826C784.927 110.826 778.927 112.956 774.26 117.216C769.593 121.476 766.87 127.53 766.09 135.376Z" fill="#F2F4F9"/> +<path d="M993.53 158.626H937.97L925.97 192.626H900.38L953.11 46.6264H978.7L1031.53 192.626H1005.36L993.53 158.626ZM986.31 137.626L965.9 79.2264L945.29 137.626H986.31Z" fill="#F2F4F9"/> +<path d="M1077.86 176.196C1082.74 176.196 1086.6 175.236 1089.43 173.316C1090.82 172.385 1091.94 171.108 1092.69 169.61C1093.43 168.113 1093.78 166.447 1093.68 164.776C1093.68 159.51 1090.13 155.993 1083.04 154.226L1069.46 150.616C1050.79 145.536 1041.46 135.933 1041.46 121.806C1041.46 112.76 1044.75 105.37 1051.32 99.6364C1057.89 93.9031 1066.75 91.0397 1077.88 91.0464C1087.84 91.0464 1096.17 93.3231 1102.88 97.8764C1106.12 99.9841 1108.89 102.737 1111.01 105.963C1113.14 109.19 1114.57 112.82 1115.23 116.626L1094.04 121.626C1093.86 119.944 1093.33 118.317 1092.48 116.854C1091.63 115.391 1090.48 114.124 1089.11 113.136C1086.04 110.98 1082.36 109.881 1078.61 110.006C1074.38 110.006 1070.96 111.066 1068.36 113.186C1067.11 114.159 1066.1 115.412 1065.42 116.845C1064.74 118.278 1064.41 119.851 1064.45 121.436C1064.42 122.72 1064.67 123.994 1065.17 125.173C1065.68 126.353 1066.43 127.411 1067.38 128.276C1069.34 130.096 1072.37 131.56 1076.46 132.666L1089.84 135.986C1098.76 138.4 1105.56 142.046 1110.25 146.926C1112.56 149.322 1114.36 152.152 1115.57 155.253C1116.77 158.353 1117.34 161.662 1117.25 164.986C1117.25 174.24 1113.77 181.596 1106.8 187.056C1099.83 192.516 1090.23 195.253 1077.99 195.266C1066.66 195.266 1057.57 192.776 1050.74 187.796C1047.44 185.455 1044.65 182.454 1042.57 178.982C1040.48 175.51 1039.14 171.643 1038.63 167.626L1060.21 163.816C1060.34 165.633 1060.88 167.398 1061.78 168.979C1062.69 170.559 1063.94 171.915 1065.44 172.946C1068.6 175.116 1072.72 176.196 1077.86 176.196Z" fill="#F2F4F9"/> +<path d="M1167.46 176.196C1172.35 176.196 1176.2 175.196 1179.04 173.316C1180.43 172.383 1181.55 171.105 1182.29 169.607C1183.03 168.11 1183.37 166.445 1183.28 164.776C1183.28 159.51 1179.73 155.993 1172.64 154.226L1159.07 150.616C1140.4 145.536 1131.07 135.933 1131.07 121.806C1131.07 112.76 1134.36 105.37 1140.93 99.6364C1147.5 93.9031 1156.36 91.0397 1167.49 91.0464C1177.45 91.0464 1185.78 93.3231 1192.49 97.8764C1195.73 99.9853 1198.5 102.739 1200.62 105.964C1202.75 109.19 1204.19 112.82 1204.85 116.626L1183.65 121.626C1183.47 119.944 1182.94 118.317 1182.09 116.854C1181.24 115.391 1180.09 114.124 1178.72 113.136C1175.65 110.98 1171.97 109.881 1168.22 110.006C1163.99 110.006 1160.57 111.066 1157.97 113.186C1156.72 114.16 1155.71 115.414 1155.03 116.846C1154.36 118.279 1154.02 119.851 1154.06 121.436C1154.03 122.72 1154.28 123.994 1154.79 125.173C1155.29 126.353 1156.04 127.411 1156.99 128.276C1158.99 130.096 1161.99 131.556 1166.08 132.666L1179.46 135.986C1188.37 138.4 1195.17 142.046 1199.87 146.926C1202.17 149.323 1203.98 152.154 1205.18 155.254C1206.38 158.354 1206.96 161.662 1206.87 164.986C1206.87 174.24 1203.39 181.596 1196.42 187.056C1189.45 192.516 1179.85 195.253 1167.61 195.266C1156.28 195.266 1147.19 192.776 1140.36 187.796C1137.06 185.455 1134.27 182.454 1132.19 178.982C1130.1 175.51 1128.76 171.643 1128.25 167.626L1149.84 163.816C1149.97 165.633 1150.5 167.397 1151.41 168.978C1152.31 170.558 1153.56 171.915 1155.06 172.946C1158.2 175.116 1162.32 176.196 1167.46 176.196Z" fill="#F2F4F9"/> +<path d="M1221.91 59.8264C1221.88 57.852 1222.24 55.8907 1222.97 54.0589C1223.71 52.2272 1224.81 50.5623 1226.2 49.1632C1227.6 47.764 1229.26 46.6592 1231.09 45.9142C1232.92 45.1692 1234.88 44.7993 1236.85 44.8264C1238.81 44.7963 1240.75 45.1706 1242.56 45.926C1244.36 46.6814 1246 47.8015 1247.35 49.2164C1250.14 52.0264 1251.71 55.8261 1251.71 59.7864C1251.71 63.7467 1250.14 67.5464 1247.35 70.3564C1246 71.7865 1244.38 72.9207 1242.57 73.6869C1240.76 74.453 1238.81 74.8343 1236.85 74.8064C1234.88 74.8321 1232.93 74.4501 1231.11 73.6843C1229.29 72.9184 1227.66 71.7854 1226.3 70.3564C1224.9 68.9882 1223.78 67.3499 1223.03 65.5403C1222.27 63.7306 1221.89 61.787 1221.91 59.8264ZM1248.67 94.0064V192.636H1225.03V93.9764L1248.67 94.0064Z" fill="#F2F4F9"/> +<path d="M1305.85 176.196C1310.73 176.196 1314.59 175.236 1317.42 173.316C1318.81 172.384 1319.93 171.106 1320.68 169.609C1321.42 168.112 1321.76 166.446 1321.67 164.776C1321.67 159.51 1318.12 155.993 1311.02 154.226L1297.45 150.616C1278.78 145.536 1269.45 135.933 1269.45 121.806C1269.45 112.76 1272.74 105.37 1279.31 99.6364C1285.88 93.9031 1294.74 91.0397 1305.88 91.0464C1315.84 91.0464 1324.17 93.3231 1330.88 97.8764C1334.11 99.9872 1336.88 102.741 1339.01 105.967C1341.13 109.193 1342.57 112.821 1343.23 116.626L1322.04 121.626C1321.86 119.944 1321.33 118.317 1320.48 116.854C1319.63 115.391 1318.48 114.124 1317.11 113.136C1314.04 110.982 1310.36 109.884 1306.61 110.006C1302.38 110.006 1298.96 111.066 1296.35 113.186C1295.1 114.161 1294.1 115.415 1293.42 116.848C1292.74 118.281 1292.41 119.852 1292.45 121.436C1292.42 122.72 1292.67 123.994 1293.17 125.173C1293.68 126.353 1294.43 127.411 1295.38 128.276C1297.33 130.096 1300.36 131.56 1304.46 132.666L1317.84 135.986C1326.76 138.4 1333.56 142.046 1338.25 146.926C1340.56 149.322 1342.36 152.152 1343.57 155.253C1344.77 158.353 1345.34 161.662 1345.25 164.986C1345.25 174.24 1341.77 181.596 1334.8 187.056C1327.83 192.516 1318.23 195.253 1305.99 195.266C1294.66 195.266 1285.58 192.776 1278.75 187.796C1275.44 185.459 1272.66 182.458 1270.57 178.985C1268.49 175.513 1267.15 171.645 1266.64 167.626L1288.22 163.816C1288.35 165.633 1288.88 167.397 1289.79 168.978C1290.69 170.558 1291.94 171.915 1293.44 172.946C1296.58 175.116 1300.7 176.196 1305.85 176.196Z" fill="#F2F4F9"/> +<path d="M1415.86 192.606C1410.23 193.964 1404.46 194.718 1398.67 194.856C1388.71 194.856 1380.95 192.12 1375.38 186.646C1369.81 181.173 1367.03 173.036 1367.03 162.236V113.996H1351.89V93.9964H1367.03V63.2164H1390.47V93.9764H1413.22V113.976H1390.47V157.976C1390.47 168.643 1394.6 173.976 1402.87 173.976C1406.29 173.833 1409.67 173.14 1412.87 171.926L1415.86 192.606Z" fill="#F2F4F9"/> +<path d="M1495.01 192.606C1494.16 188.914 1493.6 185.158 1493.35 181.376C1490.28 185.78 1486.08 189.273 1481.19 191.486C1475.48 194.09 1469.26 195.375 1462.98 195.246C1452.17 195.246 1443.5 192.366 1436.98 186.606C1430.46 180.846 1427.21 173.05 1427.22 163.216C1427.22 153.576 1430.43 146.04 1436.84 140.606C1443.25 135.173 1452.02 132.453 1463.15 132.446H1492.8V128.646C1492.8 122.46 1490.99 117.836 1487.38 114.776C1483.77 111.716 1478.71 110.186 1472.2 110.186C1460.68 110.186 1452.41 115.003 1447.39 124.636L1430.21 114.576C1438.54 98.8897 1452.96 91.0464 1473.47 91.0464C1485.9 91.0464 1496.08 94.2364 1504.03 100.616C1511.98 106.996 1515.98 117.38 1516.03 131.766V171.026C1516.03 182.153 1516.61 189.346 1517.78 192.606H1495.01ZM1493.01 148.756H1468.69C1463.16 148.756 1458.87 150.026 1455.8 152.566C1454.28 153.837 1453.08 155.441 1452.28 157.254C1451.48 159.067 1451.12 161.039 1451.21 163.016C1451.21 167.636 1452.77 171.153 1455.9 173.566C1459.03 175.976 1463.48 177.176 1469.28 177.176C1476.24 177.176 1481.94 174.98 1486.37 170.586C1490.8 166.193 1493.02 159.666 1493.01 151.006V148.756Z" fill="#F2F4F9"/> +<path d="M1629.53 131.766V192.606H1606V136.826C1606 127.446 1603.79 121.033 1599.36 117.586C1595.18 114.155 1589.92 112.323 1584.51 112.416C1581.37 112.323 1578.24 112.853 1575.31 113.975C1572.38 115.098 1569.69 116.791 1567.42 118.956C1562.87 123.316 1560.6 129.533 1560.59 137.606V192.606H1536.96V93.9764H1559.12L1559.9 104.616C1562.96 100.236 1567.19 96.803 1572.11 94.7064C1577.6 92.2344 1583.57 90.9856 1589.59 91.0464C1602.35 91.0464 1612.2 94.5764 1619.13 101.636C1626.06 108.696 1629.53 118.74 1629.53 131.766Z" fill="#F2F4F9"/> +<path d="M1704.98 192.606C1699.35 193.952 1693.59 194.696 1687.8 194.826C1677.84 194.826 1670.08 192.09 1664.51 186.616C1658.94 181.143 1656.16 173.006 1656.16 162.206V113.996H1641.02V93.9964H1656.16V63.2164H1679.59V93.9764H1702.35V113.976H1679.59V157.976C1679.59 168.643 1683.73 173.976 1692 173.976C1695.42 173.833 1698.8 173.14 1702 171.926L1704.98 192.606Z" fill="#F2F4F9"/> +</svg> diff --git a/source/images/home-assistant-logo.svg b/source/images/home-assistant-logo.svg index 10d3654ed4cc..742b2124457f 100644 --- a/source/images/home-assistant-logo.svg +++ b/source/images/home-assistant-logo.svg @@ -1,67 +1,17 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 277.55 43.62"> - <defs> - <style> - .cls-1, .cls-2, .cls-3 { - fill: none; - } - - .cls-2 { - stroke-width: 3px; - } - - .cls-2, .cls-4 { - stroke: #f2f4f9; - stroke-miterlimit: 10; - } - - .cls-5 { - fill: #1d2126; - } - - .cls-6 { - fill: #18bcf2; - } - - .cls-4 { - fill: #f2f4f9; - stroke-width: 1.5px; - } - - .cls-3 { - clip-path: url(#clippath); - } - </style> - <clipPath id="clippath"> - <polygon class="cls-1" points="40 40 0 40 0 20 20 0 40 20 40 40"/> - </clipPath> - </defs> - <g id="Layer_2-2" data-name="Layer 2"> - <g> - <path class="cls-5" d="m55.96,9.01h3.97v9.77l10.3.03v-9.8h4v23.36h-4v-10.05l-10.3-.03v10.08h-3.97V9.01Z"/> - <path class="cls-5" d="m85.84,16.15c2.42,0,4.39.78,5.91,2.33,1.52,1.55,2.28,3.55,2.28,5.98s-.76,4.42-2.28,5.97c-1.52,1.55-3.49,2.33-5.91,2.33s-4.42-.78-5.94-2.33c-1.52-1.55-2.28-3.54-2.28-5.97s.76-4.45,2.28-5.99c1.52-1.55,3.5-2.32,5.94-2.32Zm0,13.2c1.29,0,2.34-.46,3.15-1.37.81-.91,1.21-2.1,1.21-3.55s-.4-2.64-1.21-3.54c-.81-.9-1.86-1.35-3.15-1.35s-2.39.45-3.2,1.35c-.81.9-1.22,2.08-1.22,3.54s.41,2.64,1.22,3.55c.81.91,1.88,1.37,3.2,1.37Z"/> - <path class="cls-5" d="m121.02,22.32v10.05h-3.67v-9.47c0-1.09-.28-1.95-.84-2.56-.56-.61-1.33-.92-2.3-.92-1.03,0-1.85.34-2.47,1.01-.61.67-.92,1.61-.92,2.82v9.12h-3.72v-9.47c0-1.09-.27-1.95-.82-2.56-.55-.61-1.3-.92-2.27-.92-1.03,0-1.86.34-2.48,1.01s-.94,1.61-.94,2.82v9.12h-3.78v-15.78h3.52l.12,1.52c.92-1.34,2.41-2.02,4.48-2.02,1.21,0,2.25.25,3.14.75.89.5,1.56,1.23,2.02,2.19.39-.92,1.02-1.64,1.91-2.16.89-.52,1.95-.78,3.18-.78,1.79,0,3.21.55,4.27,1.66,1.05,1.1,1.58,2.63,1.58,4.58Z"/> - <path class="cls-5" d="m139.36,25.86h-12.09c.12,1.19.57,2.09,1.34,2.72.77.62,1.75.94,2.94.94,1.93,0,3.28-.8,4.05-2.41l3.16,1.25c-.59,1.39-1.53,2.47-2.8,3.25-1.28.78-2.74,1.17-4.4,1.17-2.33,0-4.23-.76-5.68-2.29-1.45-1.53-2.18-3.53-2.18-6.01s.73-4.49,2.2-6.05c1.46-1.55,3.38-2.33,5.74-2.33s4.19.77,5.61,2.3c1.42,1.53,2.12,3.55,2.12,6.05v1.41Zm-12.03-2.66h8.19c-.07-1.28-.46-2.26-1.16-2.93s-1.65-1.01-2.84-1.01-2.14.34-2.88,1.02c-.74.68-1.18,1.65-1.31,2.91Z"/> - <path class="cls-5" d="m163.72,26.93h-8.89l-1.92,5.44h-4.09l8.44-23.36h4.09l8.45,23.36h-4.19l-1.89-5.44Zm-1.16-3.36l-3.27-9.34-3.3,9.34h6.56Z"/> - <path class="cls-5" d="m177.21,29.74c.78,0,1.4-.15,1.85-.46.45-.31.68-.76.68-1.37,0-.84-.57-1.41-1.7-1.69l-2.17-.58c-2.99-.81-4.48-2.35-4.48-4.61,0-1.45.53-2.63,1.58-3.55,1.05-.92,2.47-1.38,4.25-1.38,1.59,0,2.93.36,4.01,1.09,1.08.73,1.74,1.73,1.98,3l-3.39.8c-.07-.57-.34-1.03-.79-1.36-.45-.33-1.01-.5-1.68-.5s-1.22.17-1.64.51c-.42.34-.62.78-.62,1.32,0,.44.16.8.47,1.09.31.29.8.53,1.45.7l2.14.53c1.43.39,2.52.97,3.27,1.75s1.12,1.75,1.12,2.89c0,1.48-.56,2.66-1.67,3.53-1.11.88-2.65,1.31-4.61,1.31-1.81,0-3.27-.4-4.36-1.2s-1.74-1.87-1.94-3.23l3.45-.61c.06.62.34,1.11.84,1.46.49.35,1.15.52,1.98.52Z"/> - <path class="cls-5" d="m191.55,29.74c.78,0,1.4-.15,1.85-.46.45-.31.68-.76.68-1.37,0-.84-.57-1.41-1.7-1.69l-2.17-.58c-2.99-.81-4.48-2.35-4.48-4.61,0-1.45.53-2.63,1.58-3.55,1.05-.92,2.47-1.38,4.25-1.38,1.59,0,2.93.36,4.01,1.09,1.08.73,1.74,1.73,1.98,3l-3.39.8c-.07-.57-.34-1.03-.79-1.36-.45-.33-1.01-.5-1.68-.5s-1.22.17-1.64.51c-.42.34-.62.78-.62,1.32,0,.44.16.8.47,1.09.31.29.8.53,1.45.7l2.14.53c1.43.39,2.52.97,3.27,1.75s1.12,1.75,1.12,2.89c0,1.48-.56,2.66-1.67,3.53-1.11.88-2.65,1.31-4.61,1.31-1.81,0-3.27-.4-4.36-1.2s-1.74-1.87-1.94-3.23l3.45-.61c.06.62.34,1.11.84,1.46.49.35,1.15.52,1.98.52Z"/> - <path class="cls-5" d="m200.26,11.11c0-.68.23-1.24.7-1.7.46-.46,1.03-.69,1.7-.69s1.22.23,1.68.7c.46.47.7,1.03.7,1.69s-.23,1.22-.7,1.7c-.46.47-1.02.71-1.68.71s-1.22-.24-1.69-.71c-.47-.47-.7-1.04-.7-1.7Zm4.28,5.47v15.78h-3.78v-15.78h3.78Z"/> - <path class="cls-5" d="m213.69,29.74c.78,0,1.4-.15,1.85-.46.45-.31.68-.76.68-1.37,0-.84-.57-1.41-1.7-1.69l-2.17-.58c-2.99-.81-4.48-2.35-4.48-4.61,0-1.45.53-2.63,1.58-3.55,1.05-.92,2.47-1.38,4.25-1.38,1.59,0,2.93.36,4.01,1.09,1.08.73,1.74,1.73,1.98,3l-3.39.8c-.07-.57-.34-1.03-.79-1.36-.45-.33-1.01-.5-1.68-.5s-1.22.17-1.64.51c-.42.34-.62.78-.62,1.32,0,.44.16.8.47,1.09.31.29.8.53,1.45.7l2.14.53c1.43.39,2.52.97,3.27,1.75s1.12,1.75,1.12,2.89c0,1.48-.56,2.66-1.67,3.53-1.11.88-2.65,1.31-4.61,1.31-1.81,0-3.27-.4-4.36-1.2s-1.74-1.87-1.94-3.23l3.45-.61c.06.62.34,1.11.84,1.46.49.35,1.15.52,1.98.52Z"/> - <path class="cls-5" d="m231.29,32.36c-1.08.24-2,.36-2.75.36-1.59,0-2.84-.44-3.73-1.31s-1.34-2.18-1.34-3.91v-7.72h-2.42v-3.2h2.42v-4.92h3.75v4.92h3.64v3.2h-3.64v7.05c0,1.71.66,2.56,1.98,2.56.43,0,.96-.11,1.59-.33l.48,3.3Z"/> - <path class="cls-5" d="m243.95,32.36c-.12-.51-.21-1.11-.27-1.8-.46.68-1.11,1.22-1.95,1.62-.84.4-1.81.6-2.91.6-1.73,0-3.11-.46-4.16-1.38-1.04-.92-1.56-2.17-1.56-3.74s.51-2.75,1.54-3.62c1.03-.87,2.43-1.3,4.21-1.3h4.73v-.61c0-.99-.29-1.73-.87-2.22-.58-.49-1.39-.73-2.43-.73-1.84,0-3.17.77-3.97,2.31l-2.75-1.61c1.33-2.51,3.64-3.77,6.92-3.77,1.99,0,3.62.51,4.89,1.53,1.28,1.03,1.92,2.69,1.92,4.98v6.28c0,1.78.09,2.93.28,3.45h-3.64Zm-.33-7.02h-3.89c-.89,0-1.57.2-2.06.61-.49.41-.73.96-.73,1.67s.25,1.3.75,1.69c.5.39,1.21.58,2.14.58,1.11,0,2.03-.35,2.73-1.05.71-.7,1.06-1.75,1.06-3.13v-.36Z"/> - <path class="cls-5" d="m265.48,22.63v9.73h-3.77v-8.92c0-1.5-.35-2.53-1.06-3.08-.68-.55-1.47-.83-2.38-.83-1.09,0-2.01.35-2.73,1.05-.73.7-1.09,1.69-1.09,2.98v8.8h-3.78v-15.78h3.55l.12,1.7c.45-.67,1.1-1.2,1.95-1.59.85-.39,1.79-.59,2.8-.59,2.04,0,3.62.57,4.73,1.7,1.11,1.13,1.66,2.74,1.66,4.82Z"/> - <path class="cls-5" d="m277.55,32.36c-1.08.24-2,.36-2.75.36-1.59,0-2.84-.44-3.73-1.31s-1.34-2.18-1.34-3.91v-7.72h-2.42v-3.2h2.42v-4.92h3.75v4.92h3.64v3.2h-3.64v7.05c0,1.71.66,2.56,1.98,2.56.43,0,.96-.11,1.59-.33l.48,3.3Z"/> - </g> - <g class="cls-3"> - <g> - <path class="cls-6" d="m40,37.5c0,1.37-1.12,2.5-2.5,2.5H2.5c-1.37,0-2.5-1.12-2.5-2.5v-15c0-1.37.8-3.3,1.77-4.27L18.23,1.77c.97-.97,2.56-.97,3.54,0l16.46,16.46c.97.97,1.77,2.89,1.77,4.27v15Z"/> - <path class="cls-1" d="m9.33,32.67c-1.1,0-2-.9-2-2v-5.63c0-1.1.64-2.64,1.41-3.41l9.84-9.84c.78-.78,2.05-.78,2.83,0l9.84,9.84c.78.78,1.41,2.31,1.41,3.41v5.63c0,1.1-.9,2-2,2H9.33Z"/> - <circle class="cls-4" cx="20" cy="14" r="2.67"/> - <circle class="cls-4" cx="30" cy="24.33" r="2.67"/> - <circle class="cls-4" cx="10" cy="30" r="2.67"/> - <polyline class="cls-2" points="20 13.98 20 40 10 30"/> - <line class="cls-2" x1="30" y1="24.23" x2="20.12" y2="34.11"/> - </g> - </g> - </g> -</svg> \ No newline at end of file +<svg width="1705" height="241" viewBox="0 0 1705 241" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M240 224.813C240 233.063 233.25 239.813 225 239.813H15C6.75 239.813 0 233.063 0 224.813V134.813C0 126.563 4.77 115.043 10.61 109.203L109.39 10.423C115.22 4.59304 124.77 4.59304 130.6 10.423L229.39 109.213C235.22 115.043 240 126.573 240 134.823V224.823V224.813Z" fill="#F2F4F9"/> +<path d="M229.39 109.203L130.61 10.423C124.78 4.59304 115.23 4.59304 109.4 10.423L10.61 109.203C4.78 115.033 0 126.563 0 134.813V224.813C0 233.063 6.75 239.813 15 239.813H107.27L66.64 199.183C64.55 199.903 62.32 200.313 60 200.313C48.7 200.313 39.5 191.113 39.5 179.813C39.5 168.513 48.7 159.313 60 159.313C71.3 159.313 80.5 168.513 80.5 179.813C80.5 182.143 80.09 184.373 79.37 186.463L111 218.093V102.213C104.2 98.873 99.5 91.893 99.5 83.823C99.5 72.523 108.7 63.323 120 63.323C131.3 63.323 140.5 72.523 140.5 83.823C140.5 91.893 135.8 98.873 129 102.213V183.483L160.46 152.023C159.84 150.063 159.5 147.983 159.5 145.823C159.5 134.523 168.7 125.323 180 125.323C191.3 125.323 200.5 134.523 200.5 145.823C200.5 157.123 191.3 166.323 180 166.323C177.5 166.323 175.12 165.853 172.91 165.033L129 208.943V239.823H225C233.25 239.823 240 233.073 240 224.823V134.823C240 126.573 235.23 115.053 229.39 109.213V109.203Z" fill="#18BCF2"/> +<path d="M320.04 46.6064H344.8V107.606L409.16 107.806V46.6064H434.16V192.606H409.16V129.826L344.8 129.626V192.626H320L320.04 46.6064Z" fill="#1D2126"/> +<path d="M506.8 91.2364C521.9 91.2364 534.203 96.0864 543.71 105.786C553.217 115.486 557.97 127.956 557.97 143.196C557.97 158.363 553.217 170.796 543.71 180.496C534.203 190.196 521.9 195.046 506.8 195.046C491.56 195.046 479.19 190.196 469.69 180.496C460.19 170.796 455.437 158.363 455.43 143.196C455.43 127.863 460.183 115.38 469.69 105.746C479.197 96.113 491.567 91.2764 506.8 91.2364ZM506.8 173.756C514.873 173.756 521.433 170.91 526.48 165.216C531.527 159.523 534.047 152.116 534.04 142.996C534.04 133.89 531.52 126.516 526.48 120.876C521.44 115.236 514.88 112.423 506.8 112.436C498.533 112.436 491.867 115.25 486.8 120.876C481.733 126.503 479.193 133.876 479.18 142.996C479.18 152.116 481.72 159.523 486.8 165.216C491.88 170.91 498.547 173.756 506.8 173.756Z" fill="#1D2126"/> +<path d="M726.68 129.826V192.616H703.68V133.426C703.68 126.6 701.923 121.266 698.41 117.426C694.897 113.586 690.11 111.663 684.05 111.656C677.61 111.656 672.467 113.756 668.62 117.956C664.773 122.156 662.853 128.033 662.86 135.586V192.586H639.67V133.426C639.67 126.6 637.96 121.266 634.54 117.426C631.12 113.586 626.383 111.663 620.33 111.656C613.89 111.656 608.717 113.756 604.81 117.956C600.903 122.156 598.95 128.033 598.95 135.586V192.586H575.32V93.9764H597.32L598.1 103.446C603.833 95.0464 613.167 90.8464 626.1 90.8464C633.653 90.8464 640.197 92.4097 645.73 95.5364C651.257 98.6586 655.662 103.441 658.32 109.206C660.708 103.505 664.931 98.7646 670.32 95.7364C675.88 92.4764 682.503 90.8464 690.19 90.8464C701.39 90.8464 710.277 94.2964 716.85 101.196C723.423 108.096 726.7 117.64 726.68 129.826Z" fill="#1D2126"/> +<path d="M841.28 151.986H765.7C766.48 159.406 769.28 165.073 774.1 168.986C778.92 172.9 785.04 174.846 792.46 174.826C804.5 174.826 812.93 169.826 817.75 159.826L837.48 167.636C833.937 176.093 827.799 183.206 819.95 187.946C811.95 192.84 802.787 195.283 792.46 195.276C777.873 195.276 766.04 190.506 756.96 180.966C747.88 171.426 743.337 158.91 743.33 143.416C743.33 127.923 747.907 115.326 757.06 105.626C766.213 95.9264 778.173 91.0764 792.94 91.0764C807.46 91.0764 819.147 95.8597 828 105.426C836.853 114.993 841.28 127.593 841.28 143.226V151.986ZM766.09 135.376H817.26C816.8 127.376 814.377 121.273 809.99 117.066C805.603 112.86 799.693 110.78 792.26 110.826C784.927 110.826 778.927 112.956 774.26 117.216C769.593 121.476 766.87 127.53 766.09 135.376Z" fill="#1D2126"/> +<path d="M993.53 158.626H937.97L925.97 192.626H900.38L953.11 46.6264H978.7L1031.53 192.626H1005.36L993.53 158.626ZM986.31 137.626L965.9 79.2264L945.29 137.626H986.31Z" fill="#1D2126"/> +<path d="M1077.86 176.196C1082.74 176.196 1086.6 175.236 1089.43 173.316C1090.82 172.385 1091.94 171.108 1092.69 169.61C1093.43 168.113 1093.78 166.447 1093.68 164.776C1093.68 159.51 1090.13 155.993 1083.04 154.226L1069.46 150.616C1050.79 145.536 1041.46 135.933 1041.46 121.806C1041.46 112.76 1044.75 105.37 1051.32 99.6364C1057.89 93.903 1066.75 91.0397 1077.88 91.0464C1087.84 91.0464 1096.17 93.323 1102.88 97.8764C1106.12 99.984 1108.89 102.737 1111.01 105.963C1113.14 109.19 1114.57 112.82 1115.23 116.626L1094.04 121.626C1093.86 119.944 1093.33 118.317 1092.48 116.854C1091.63 115.391 1090.48 114.124 1089.11 113.136C1086.04 110.98 1082.36 109.881 1078.61 110.006C1074.38 110.006 1070.96 111.066 1068.36 113.186C1067.11 114.159 1066.1 115.412 1065.42 116.845C1064.74 118.278 1064.41 119.851 1064.45 121.436C1064.42 122.719 1064.67 123.994 1065.17 125.173C1065.68 126.353 1066.43 127.411 1067.38 128.276C1069.34 130.096 1072.37 131.56 1076.46 132.666L1089.84 135.986C1098.76 138.4 1105.56 142.046 1110.25 146.926C1112.56 149.322 1114.36 152.152 1115.57 155.253C1116.77 158.353 1117.34 161.662 1117.25 164.986C1117.25 174.24 1113.77 181.596 1106.8 187.056C1099.83 192.516 1090.23 195.253 1077.99 195.266C1066.66 195.266 1057.57 192.776 1050.74 187.796C1047.44 185.455 1044.65 182.454 1042.57 178.982C1040.48 175.51 1039.14 171.643 1038.63 167.626L1060.21 163.816C1060.34 165.633 1060.88 167.398 1061.78 168.978C1062.69 170.559 1063.94 171.915 1065.44 172.946C1068.6 175.116 1072.72 176.196 1077.86 176.196Z" fill="#1D2126"/> +<path d="M1167.46 176.196C1172.35 176.196 1176.2 175.196 1179.04 173.316C1180.43 172.383 1181.55 171.104 1182.29 169.607C1183.03 168.11 1183.37 166.445 1183.28 164.776C1183.28 159.51 1179.73 155.993 1172.64 154.226L1159.07 150.616C1140.4 145.536 1131.07 135.933 1131.07 121.806C1131.07 112.76 1134.36 105.37 1140.93 99.6364C1147.5 93.903 1156.36 91.0397 1167.49 91.0464C1177.45 91.0464 1185.78 93.323 1192.49 97.8764C1195.73 99.9853 1198.5 102.739 1200.62 105.964C1202.75 109.19 1204.19 112.82 1204.85 116.626L1183.65 121.626C1183.47 119.944 1182.94 118.317 1182.09 116.854C1181.24 115.391 1180.09 114.124 1178.72 113.136C1175.65 110.98 1171.97 109.881 1168.22 110.006C1163.99 110.006 1160.57 111.066 1157.97 113.186C1156.72 114.16 1155.71 115.414 1155.03 116.846C1154.36 118.279 1154.02 119.851 1154.06 121.436C1154.03 122.719 1154.28 123.994 1154.79 125.173C1155.29 126.353 1156.04 127.411 1156.99 128.276C1158.99 130.096 1161.99 131.556 1166.08 132.666L1179.46 135.986C1188.37 138.4 1195.17 142.046 1199.87 146.926C1202.17 149.323 1203.98 152.154 1205.18 155.254C1206.38 158.354 1206.96 161.662 1206.87 164.986C1206.87 174.24 1203.39 181.596 1196.42 187.056C1189.45 192.516 1179.85 195.253 1167.61 195.266C1156.28 195.266 1147.19 192.776 1140.36 187.796C1137.06 185.455 1134.27 182.454 1132.19 178.982C1130.1 175.51 1128.76 171.643 1128.25 167.626L1149.84 163.816C1149.97 165.633 1150.5 167.397 1151.41 168.978C1152.31 170.558 1153.56 171.915 1155.06 172.946C1158.2 175.116 1162.32 176.196 1167.46 176.196Z" fill="#1D2126"/> +<path d="M1221.91 59.8264C1221.88 57.852 1222.24 55.8907 1222.97 54.0589C1223.71 52.2271 1224.81 50.5623 1226.2 49.1631C1227.6 47.764 1229.26 46.6592 1231.09 45.9142C1232.92 45.1692 1234.88 44.7993 1236.85 44.8264C1238.81 44.7962 1240.75 45.1706 1242.56 45.926C1244.36 46.6813 1246 47.8015 1247.35 49.2164C1250.14 52.0264 1251.71 55.826 1251.71 59.7864C1251.71 63.7467 1250.14 67.5464 1247.35 70.3564C1246 71.7865 1244.38 72.9207 1242.57 73.6868C1240.76 74.453 1238.81 74.8343 1236.85 74.8064C1234.88 74.8321 1232.93 74.45 1231.11 73.6842C1229.29 72.9184 1227.66 71.7854 1226.3 70.3564C1224.9 68.9882 1223.78 67.3499 1223.03 65.5403C1222.27 63.7306 1221.89 61.7869 1221.91 59.8264ZM1248.67 94.0064V192.636H1225.03V93.9764L1248.67 94.0064Z" fill="#1D2126"/> +<path d="M1305.85 176.196C1310.73 176.196 1314.59 175.236 1317.42 173.316C1318.81 172.384 1319.93 171.106 1320.68 169.609C1321.42 168.112 1321.76 166.446 1321.67 164.776C1321.67 159.51 1318.12 155.993 1311.02 154.226L1297.45 150.616C1278.78 145.536 1269.45 135.933 1269.45 121.806C1269.45 112.76 1272.74 105.37 1279.31 99.6364C1285.88 93.903 1294.74 91.0397 1305.88 91.0464C1315.84 91.0464 1324.17 93.323 1330.88 97.8764C1334.11 99.9872 1336.88 102.741 1339.01 105.967C1341.13 109.193 1342.57 112.821 1343.23 116.626L1322.04 121.626C1321.86 119.944 1321.33 118.317 1320.48 116.854C1319.63 115.391 1318.48 114.124 1317.11 113.136C1314.04 110.982 1310.36 109.884 1306.61 110.006C1302.38 110.006 1298.96 111.066 1296.35 113.186C1295.1 114.161 1294.1 115.415 1293.42 116.848C1292.74 118.281 1292.41 119.852 1292.45 121.436C1292.42 122.719 1292.67 123.994 1293.17 125.173C1293.68 126.353 1294.43 127.411 1295.38 128.276C1297.33 130.096 1300.36 131.56 1304.46 132.666L1317.84 135.986C1326.76 138.4 1333.56 142.046 1338.25 146.926C1340.56 149.322 1342.36 152.152 1343.57 155.253C1344.77 158.353 1345.34 161.662 1345.25 164.986C1345.25 174.24 1341.77 181.596 1334.8 187.056C1327.83 192.516 1318.23 195.253 1305.99 195.266C1294.66 195.266 1285.58 192.776 1278.75 187.796C1275.44 185.458 1272.66 182.458 1270.57 178.985C1268.49 175.513 1267.15 171.645 1266.64 167.626L1288.22 163.816C1288.35 165.633 1288.88 167.397 1289.79 168.978C1290.69 170.558 1291.94 171.915 1293.44 172.946C1296.58 175.116 1300.7 176.196 1305.85 176.196Z" fill="#1D2126"/> +<path d="M1415.86 192.606C1410.23 193.964 1404.46 194.718 1398.67 194.856C1388.71 194.856 1380.95 192.12 1375.38 186.646C1369.81 181.173 1367.03 173.036 1367.03 162.236V113.996H1351.89V93.9964H1367.03V63.2164H1390.47V93.9764H1413.22V113.976H1390.47V157.976C1390.47 168.643 1394.6 173.976 1402.87 173.976C1406.29 173.833 1409.67 173.14 1412.87 171.926L1415.86 192.606Z" fill="#1D2126"/> +<path d="M1495.01 192.606C1494.16 188.914 1493.6 185.158 1493.35 181.376C1490.28 185.78 1486.08 189.273 1481.19 191.486C1475.48 194.09 1469.26 195.375 1462.98 195.246C1452.17 195.246 1443.5 192.366 1436.98 186.606C1430.46 180.846 1427.21 173.05 1427.22 163.216C1427.22 153.576 1430.43 146.04 1436.84 140.606C1443.25 135.173 1452.02 132.453 1463.15 132.446H1492.8V128.646C1492.8 122.46 1490.99 117.836 1487.38 114.776C1483.77 111.716 1478.71 110.186 1472.2 110.186C1460.68 110.186 1452.41 115.003 1447.39 124.636L1430.21 114.576C1438.54 98.8897 1452.96 91.0464 1473.47 91.0464C1485.9 91.0464 1496.08 94.2364 1504.03 100.616C1511.98 106.996 1515.98 117.38 1516.03 131.766V171.026C1516.03 182.153 1516.61 189.346 1517.78 192.606H1495.01ZM1493.01 148.756H1468.69C1463.16 148.756 1458.87 150.026 1455.8 152.566C1454.28 153.837 1453.08 155.441 1452.28 157.254C1451.48 159.066 1451.12 161.039 1451.21 163.016C1451.21 167.636 1452.77 171.153 1455.9 173.566C1459.03 175.976 1463.48 177.176 1469.28 177.176C1476.24 177.176 1481.94 174.98 1486.37 170.586C1490.8 166.193 1493.02 159.666 1493.01 151.006V148.756Z" fill="#1D2126"/> +<path d="M1629.53 131.766V192.606H1606V136.826C1606 127.446 1603.79 121.033 1599.36 117.586C1595.18 114.155 1589.92 112.323 1584.51 112.416C1581.37 112.323 1578.24 112.853 1575.31 113.975C1572.38 115.098 1569.69 116.791 1567.42 118.956C1562.87 123.316 1560.6 129.533 1560.59 137.606V192.606H1536.96V93.9764H1559.12L1559.9 104.616C1562.96 100.236 1567.19 96.803 1572.11 94.7064C1577.6 92.2344 1583.57 90.9856 1589.59 91.0464C1602.35 91.0464 1612.2 94.5764 1619.13 101.636C1626.06 108.696 1629.53 118.74 1629.53 131.766Z" fill="#1D2126"/> +<path d="M1704.98 192.606C1699.35 193.952 1693.59 194.696 1687.8 194.826C1677.84 194.826 1670.08 192.09 1664.51 186.616C1658.94 181.143 1656.16 173.006 1656.16 162.206V113.996H1641.02V93.9964H1656.16V63.2164H1679.59V93.9764H1702.35V113.976H1679.59V157.976C1679.59 168.643 1683.73 173.976 1692 173.976C1695.42 173.833 1698.8 173.14 1702 171.926L1704.98 192.606Z" fill="#1D2126"/> +</svg> diff --git a/source/images/installation/rpi_imager.png b/source/images/installation/rpi_imager.png deleted file mode 100644 index fadf98b066b1..000000000000 Binary files a/source/images/installation/rpi_imager.png and /dev/null differ diff --git a/source/images/integrations/aladdin_connect/oauth-screenshot.png b/source/images/integrations/aladdin_connect/oauth-screenshot.png new file mode 100644 index 000000000000..3d10dc62ba52 Binary files /dev/null and b/source/images/integrations/aladdin_connect/oauth-screenshot.png differ diff --git a/source/images/integrations/application_credentials/application-credential_delete.png b/source/images/integrations/application_credentials/application-credential_delete.png new file mode 100644 index 000000000000..4bc6d3bc8805 Binary files /dev/null and b/source/images/integrations/application_credentials/application-credential_delete.png differ diff --git a/source/images/merchandise/shirt-frontpage.jpg b/source/images/merchandise/shirt-frontpage.jpg new file mode 100644 index 000000000000..124e6760b1f9 Binary files /dev/null and b/source/images/merchandise/shirt-frontpage.jpg differ diff --git a/source/images/organizing/customize_columns.webp b/source/images/organizing/customize_columns.webp new file mode 100644 index 000000000000..44fc4fce8bba Binary files /dev/null and b/source/images/organizing/customize_columns.webp differ diff --git a/source/images/screenshots/custom_polling_02.png b/source/images/screenshots/custom_polling_02.png index d3c7363cd839..4f2fca8fe665 100644 Binary files a/source/images/screenshots/custom_polling_02.png and b/source/images/screenshots/custom_polling_02.png differ diff --git a/source/images/screenshots/developer-tools.png b/source/images/screenshots/developer-tools.png index 4c5dabc02188..f083dc872b81 100644 Binary files a/source/images/screenshots/developer-tools.png and b/source/images/screenshots/developer-tools.png differ diff --git a/source/images/works_with/works-with-bluetooth.png b/source/images/works_with/works-with-bluetooth.png index 24898b4e17be..4ab85b19ec78 100644 Binary files a/source/images/works_with/works-with-bluetooth.png and b/source/images/works_with/works-with-bluetooth.png differ diff --git a/source/images/works_with/works-with-cloud.png b/source/images/works_with/works-with-cloud.png index f004735821a8..10d0ca17c9e4 100644 Binary files a/source/images/works_with/works-with-cloud.png and b/source/images/works_with/works-with-cloud.png differ diff --git a/source/images/works_with/works-with-local.png b/source/images/works_with/works-with-local.png index f73d05ab3cc2..cbbb54c6ba08 100644 Binary files a/source/images/works_with/works-with-local.png and b/source/images/works_with/works-with-local.png differ diff --git a/source/images/works_with/works-with-matter.png b/source/images/works_with/works-with-matter.png index 2d17da65334e..ebab669ce7a3 100644 Binary files a/source/images/works_with/works-with-matter.png and b/source/images/works_with/works-with-matter.png differ diff --git a/source/images/works_with/works-with-zigbee.png b/source/images/works_with/works-with-zigbee.png index 56a08f38206a..3d93267fc512 100644 Binary files a/source/images/works_with/works-with-zigbee.png and b/source/images/works_with/works-with-zigbee.png differ diff --git a/source/images/works_with/works-with-zwave.png b/source/images/works_with/works-with-zwave.png index 9fc555b55924..27538c150350 100644 Binary files a/source/images/works_with/works-with-zwave.png and b/source/images/works_with/works-with-zwave.png differ diff --git a/source/index.html b/source/index.html index 89ebda6e4e17..30a1c5e7824b 100644 --- a/source/index.html +++ b/source/index.html @@ -2,35 +2,20 @@ show_title: false sidebar: false hero_unit: true +dark_header: true is_homepage: true regenerate: true feedback: false --- -{% assign recent_release_post = site.categories['Core'].first %} - <div class="frontpage"> <div class="grid"> - <div class="grid__item one-third lap-one-third palm-one-whole"> - <div class="current-version material-card text"> - <h1> - Current Version: {{ site.current_major_version }}.{{ - site.current_minor_version }}.{{ site.current_patch_version }} - </h1> - Released: - <span class="release-date" - >{{ site.date_released | date: "%B %e, %Y" }}</span - > - <div class="links"> - <a href="{{ recent_release_post.url }}{{ site.patch_version_notes }}" - >Release notes</a - > - </div> - </div> + <!-- Left sidebar begins --> + <div class="grid__item one-third lap-one-third palm-one-whole"> <div class="recent-posts material-card text"> - <h1>Recent Blog Posts</h1> + <h1>{% icon "mdi:newspaper-variant-multiple" %} Recent Blog Posts</h1> {% for post in site.posts limit: 4 %} <li class="post" style="display: grid; font-size: 16px"> @@ -41,13 +26,14 @@ <h1>Recent Blog Posts</h1> </div> <div class="join-community material-card text"> - <h1>Join The Community</h1> - We love to help with & talk about home automation. + <h1>{% icon "mdi:people-group-outline" %} Join The Community</h1> + + Our vibrant community is very active and super friendly. We love to talk and share our passion for home automation. <div class="links"> - <a href="https://community.home-assistant.io">Forums</a> - <a href="/join-chat/">Chat</a> - <a href="/newsletter/">Newsletter</a> + <a href="https://community.home-assistant.io">{% icon "simple-icons:discourse" %} Forums</a> + <a href="/join-chat/">{% icon "simple-icons:discord" %} Chat</a> + <a href="/newsletter/">{% icon "mdi:email-newsletter" %} Newsletter</a> </div> </div> @@ -56,11 +42,11 @@ <h1>Join The Community</h1> href="/blog/2016/01/19/perfect-home-automation/" > Read our founder's vision for the perfect home automation - <i class="icon-arrow-right"></i> + <iconify-icon icon="mdi:arrow-right-thick"></iconify-icon> </a> <div class="material-card text"> - <h1>Alexa, turn on the lights</h1> + <h1>{% icon "simple-icons:amazonalexa" %} Alexa, turn on the lights</h1> Use Alexa to control Home Assistant. <div class="links"> @@ -72,7 +58,7 @@ <h1>Alexa, turn on the lights</h1> </div> </div> <div class="material-card text"> - <h1>Ok Google, turn on the AC</h1> + <h1>{% icon "simple-icons:googleassistant" %} Ok Google, turn off the AC</h1> Use Google Assistant to control Home Assistant. <div class="links"> @@ -90,8 +76,10 @@ <h1>Ok Google, turn on the AC</h1> style="background-image: url(/images/frontpage/cast-frontpage.png)" > <div class="caption"> - <div class="title"> - Take over all the screens + <div> + <div class="title"> + Take over all the screens + </div> <div class="subtitle"> Home Assistant Cast makes every TV a display. </div> @@ -104,6 +92,9 @@ <h1>Ok Google, turn on the AC</h1> </div> </a> </div> + <!-- Left sidebar ends --> + + <!-- Right content begins --> <div class="grid__item two-thirds lap-two-thirds palm-one-whole"> <!-- State of the Open Home --> <a @@ -126,8 +117,10 @@ <h1>Ok Google, turn on the AC</h1> " > <div class="caption"> - <div class="title"> - Control your home with Assist + <div> + <div class="title"> + Control your home with Assist + </div> <div class="subtitle"> Our private, insanely fast, voice assistant running on affordable hardware. Now supporting wake words. @@ -154,8 +147,10 @@ <h1>Ok Google, turn on the AC</h1> " > <div class="caption"> - <div class="title"> - {{page.title}} + <div> + <div class="title"> + {{page.title}} + </div> <div class="subtitle">{{page.description}}</div> </div> <svg viewBox="0 0 24 24"> @@ -185,8 +180,10 @@ <h1>Ok Google, turn on the AC</h1> " > <div class="caption"> - <div class="title"> - Home Assistant Tags + <div> + <div class="title"> + Home Assistant Tags + </div> <div class="subtitle"> Use NFC to bring music to your life or automate the mundane. </div> @@ -202,11 +199,13 @@ <h1>Ok Google, turn on the AC</h1> <a class="material-card picture-promo" href="https://home-assistant-store.creator-spring.com/" - style="background-image: url(/images/merchandise/shirt-frontpage.png)" + style="background-image: url(/images/merchandise/shirt-frontpage.jpg)" > <div class="caption"> - <div class="title"> - Join the Home Assistant t-shirt revolution! + <div> + <div class="title"> + Join the Home Assistant t-shirt revolution! + </div> <div class="subtitle"> Look sharp in blue, black or gray. Wearing a HA t-shirt is okay. </div> @@ -219,117 +218,126 @@ <h1>Ok Google, turn on the AC</h1> </div> </a> </div> + <!-- Right content ends --> + - <div class="sub-title">Features</div> + <!-- Features section --> {% include custom/features.html %} - <div class="grid sponsors-and-press"> - <div class="sponsored-by grid__item one-half lap-one-half palm-one-whole"> - <div class="material-card"> - <h1>Home Assistant is sponsored by</h1> - <a href="https://www.nabucasa.com" - ><img alt="Nabu Casa logo" src="/images/sponsors/nabu_casa.svg" - /></a> - </div> - </div> - <div class="seen-press grid__item one-half lap-one-half palm-one-whole"> - <div class="material-card"> - <h1>Home Assistant in the press</h1> - <a - href="https://www.theverge.com/2021/9/16/22678088/home-assistant-amber-smart-home-hub-specs-release-date-price" - target="_blank" - rel="noopener" - ><img alt="The Verge logo" src="/images/press/theverge.svg" - /></a> + <!-- Press section --> + <section class="grid sponsors-and-press"> + <div class="seen-press grid__item one-whole"> + <h2>Home Assistant in the press</h2> - <a - href="https://arstechnica.com/information-technology/2021/03/how-to-achieve-smart-home-nirvana-or-home-automation-without-subscription/" - target="_blank" - rel="noopener" - ><img - alt="ArsTechnica.com logo" - src="/images/press/arstechnica.svg" - /></a> + <a + href="https://www.theverge.com/2021/9/16/22678088/home-assistant-amber-smart-home-hub-specs-release-date-price" + target="_blank" + rel="noopener" + ><div class="material-card"><img alt="The Verge logo" src="/images/press/theverge.svg" + /></div></a> - <a - href="https://tweakers.net/reviews/8704/paulus-schoutsen-home-assistant-concurreert-met-alles-wat-via-de-cloud-gaat.html" - target="_blank" - rel="noopener" - ><img alt="Tweakers.net logo" src="/images/press/tweakers.png" - /></a> + <a + href="https://arstechnica.com/information-technology/2021/03/how-to-achieve-smart-home-nirvana-or-home-automation-without-subscription/" + target="_blank" + rel="noopener" + ><div class="material-card"><img + alt="ArsTechnica.com logo" + src="/images/press/arstechnica.svg" + /></div></a> - <a - href="https://www.youtube.com/watch?v=x7pSkVarixU" - target="_blank" - rel="noopener" - ><img - alt="Linus Tech Tips logo" - class="square" - src="/images/press/ltt.svg" - /></a> + <a + href="https://tweakers.net/reviews/8704/paulus-schoutsen-home-assistant-concurreert-met-alles-wat-via-de-cloud-gaat.html" + target="_blank" + rel="noopener" + ><div class="material-card"><img alt="Tweakers.net logo" src="/images/press/tweakers.png" + /></div></a> - <a - href="https://www.troyhunt.com/iot-unravelled-part-1-its-a-mess-but-then-theres-home-assistant/" - target="_blank" - rel="noopener" - ><img - class="square round" - alt="Troy Hunt logo" - src="/images/press/troyhunt.jpg" - /></a> + <a + href="https://www.youtube.com/watch?v=x7pSkVarixU" + target="_blank" + rel="noopener" + ><div class="material-card"><img + alt="Linus Tech Tips logo" + class="square" + src="/images/press/ltt.svg" + /></div></a> - <a - href="https://www.tomshardware.com/news/raspberry-pi-home-assistant-amber" - target="_blank" - rel="noopener" - ><img - alt="Tom's Hardware logo" - src="/images/press/tomshardware.svg" - /></a> + <a + href="https://www.troyhunt.com/iot-unravelled-part-1-its-a-mess-but-then-theres-home-assistant/" + target="_blank" + rel="noopener" + ><div class="material-card"><img + class="square round" + alt="Troy Hunt logo" + src="/images/press/troyhunt.jpg" + /></div></a> - <a - href="https://www.producthunt.com/posts/home-assistant" - target="_blank" - rel="noopener" - ><img - alt="ProductHunt.com logo" - src="/images/press/producthunt.com.png" - /></a> + <a + href="https://www.tomshardware.com/news/raspberry-pi-home-assistant-amber" + target="_blank" + rel="noopener" + ><div class="material-card"><img + alt="Tom's Hardware logo" + src="/images/press/tomshardware.svg" + /></div></a> - <a - href="https://www.linux.com/news/home-assistant-python-approach-home-automation-video" - target="_blank" - rel="noopener" - ><img alt="Linux.com logo" src="/images/press/linux.com.png" - /></a> + <a + href="https://www.producthunt.com/posts/home-assistant" + target="_blank" + rel="noopener" + ><div class="material-card"><img + alt="ProductHunt.com logo" + src="/images/press/producthunt.com.png" + /></div></a> - <a - href="https://opensource.com/article/17/7/home-automation-primer" - target="_blank" - rel="noopener" - ><img - alt="OpenSource.com logo" - src="/images/press/opensource.com.svg" - /></a> + <a + href="https://www.linux.com/news/home-assistant-python-approach-home-automation-video" + target="_blank" + rel="noopener" + ><div class="material-card"><img alt="Linux.com logo" src="/images/press/linux.com.png" + /></div></a> - <a - href="http://www.linux-magazine.com/Issues/2017/203/Home-Assistant" - target="_blank" - rel="noopener" - ><img - alt="Linux Magazine logo" - src="/images/press/LinuxMagazine.png" - /></a> + <a + href="https://opensource.com/article/17/7/home-automation-primer" + target="_blank" + rel="noopener" + ><div class="material-card"><img + alt="OpenSource.com logo" + src="/images/press/opensource.com.svg" + /></div></a> - <a - href="https://www.heise.de/select/ct/2017/26/1513910625909214" - target="_blank" - rel="noopener" - ><img alt="Ct logo" src="/images/press/ct.png" + <a + href="http://www.linux-magazine.com/Issues/2017/203/Home-Assistant" + target="_blank" + rel="noopener" + ><div class="material-card"><img + alt="Linux Magazine logo" + src="/images/press/LinuxMagazine.png" + /></div></a> + + <a + href="https://www.heise.de/select/ct/2017/26/1513910625909214" + target="_blank" + rel="noopener" + ><div class="material-card"><img alt="Ct logo" src="/images/press/ct.png" + /></div></a> + </div> + </section> + + + <!-- Sponsor section --> + + <section class="sponsor"> + <div class="sponsored-by grid__item one-whole"> + <h2>The Home Assistant project is sponsored by</h2> + <div class="material-card text"> + <a href="https://www.nabucasa.com" + ><img alt="Nabu Casa logo" src="/images/sponsors/nabu_casa.svg" /></a> </div> </div> - </div> + </section> + </div> -</div> +</div> \ No newline at end of file diff --git a/source/installation/alternative.markdown b/source/installation/alternative.markdown index efcc59b2c131..c3b9f88ed273 100644 --- a/source/installation/alternative.markdown +++ b/source/installation/alternative.markdown @@ -1,6 +1,6 @@ --- title: "Alternative" -description: "Install Home Assistant" +description: "Alternative ways to install Home Assistant" installation_type: alternative --- {% comment %} diff --git a/source/installation/index.html b/source/installation/index.html index ebceffe9dd68..24218b21e949 100644 --- a/source/installation/index.html +++ b/source/installation/index.html @@ -7,7 +7,7 @@ --- <div class="intro"> - <p> + <p class="lead"> The first step to getting started with Home Assistant is to install it on a device. There are many ways to run it for all kinds of scenarios and all kinds of skill levels. @@ -102,7 +102,7 @@ <h3>Install Home Assistant on Raspberry Pi</h3> </div> </div> <div class="buttons"> - <a href="https://amzn.to/2S0Gcl1" class="button accent" + <a href="https://amzn.to/3UH6TcD" class="button accent" >Get Raspberry Pi {% include assets/chevron_right.html %}</a > <a href="/installation/raspberrypi" class="button" @@ -309,61 +309,38 @@ <h2>Advanced installation methods</h2> <td>✅</td> </tr> <tr> - <td><a href="/docs/blueprint" target="_blank">Blueprints</a></td> - <td>✅</td> - <td>✅</td> + <td><a href="/addons" target="_blank">Add-ons</a></td> <td>✅</td> + <td>❌</td> + <td>❌</td> <td>✅</td> </tr> <tr> - <td>Uses container</td> + <td><a href="/docs/blueprint" target="_blank">Blueprints</a></td> + <td>✅</td> <td>✅</td> <td>✅</td> - <td>❌</td> <td>✅</td> </tr> <tr> <td> - <a href="/docs/glossary/#home-assistant-supervisor" target="_blank" - >Supervisor</a - > + One-click updates </td> <td>✅</td> <td>❌</td> <td>❌</td> - <td>✅</td> - </tr> - <tr> - <td><a href="/addons" target="_blank">Add-ons</a></td> - <td>✅</td> - <td>❌</td> - <td>❌</td> - <td>✅</td> + <td>☑️<sup>2</sup></td> </tr> <tr> <td><a href="/common-tasks/os/#backups" target="_blank">Backups</a></td> <td>✅</td> - <td>✅<sup>2</sup></td> - <td>✅<sup>2</sup></td> + <td>☑️<sup>3</sup></td> + <td>☑️<sup>3</sup></td> <td>✅</td> </tr> - <tr> - <td>Managed Restore</td> - <td>✅</td> - <td>❌<sup>3</sup></td> - <td>❌<sup>3</sup></td> - <td>✅</td> - </tr> - <tr> - <td>Managed OS</td> - <td>✅</td> - <td>❌</td> - <td>❌</td> - <td>❌</td> - </tr> </table> </div> - + <sub >1: Names are abbreviated. The full names of the installation methods are: <ul> @@ -375,11 +352,12 @@ <h2>Advanced installation methods</h2> > <p> <sub - >2: Backups for Home Assistant Core and Home Assistant Container is provided - by the - <a href="/integrations/backup" target="_blank" - ><code>backup</code> integration</a - >.</sub + >2: Home Assistant Supervised requires users to maintain their own operating system.</sub + > + </p> + <p> + <sub + >3: Home Assistant Core and Home Assistant Container can create backups via the user interface but they need to be manually restored.</sub > </p> <p> @@ -389,6 +367,49 @@ <h2>Advanced installation methods</h2> > </p> <p></p> + <div class="installations-card"> + <div class="material-card text"> + <div class="content-container"> + <div class="image"> + <img + src="/images/installation/rpi.jpg" + /> + </div> + <div class="content"> + <h3>Install Home Assistant variants on Raspberry Pi</h3> + <p>A low-cost DIY solution to get started with Home Assistant</p> + <div class="columns"> + <div> + <b>SKILLS REQUIRED</b> + <ul> + <li>Assembling a Raspberry Pi setup</li> + <li>Flashing a Raspberry Pi</li> + <li>Advanced knowledge of Linux</li> + <li>Using Linux command line</li> + </ul> + </div> + <div> + <b>TOOLS REQUIRED</b> + <ul> + <li>Raspberry Pi 3, 4 or 5 with power supply</li> + <li>MicroSD card</li> + <li>Ethernet connection</li> + </ul> + </div> + </div> + <div class="buttons"> + <a href="https://amzn.to/3UH6TcD" class="button accent" + >Get Raspberry Pi {% include assets/chevron_right.html %}</a + > + <a href="/installation/raspberrypi-other" class="button" + >View tutorial {% include assets/chevron_right.html %}</a + > + </div> + </div> + </div> + </div> + </div> + <div class="installations-card"> <div class="material-card text"> <div class="content-container"> diff --git a/source/installation/raspberrypi-other.markdown b/source/installation/raspberrypi-other.markdown new file mode 100644 index 000000000000..860f90130d0c --- /dev/null +++ b/source/installation/raspberrypi-other.markdown @@ -0,0 +1,18 @@ +--- +title: "Advanced Raspberry Pi installations" +description: "Advanced instructions to install Home Assistant variants on a Raspberry Pi" +installation_type: raspberrypi-other +--- + +{% comment %} +Included section for this page is located under source/_includes/installation +{% endcomment %} + +{% assign board = "Raspberry Pi" %} +{% assign installation_media = "SD card" %} + +While we recommend Home Assistant OS, there are also alternative ways to install Home Assistant. Before you continue, be aware of the limitations and differences compared to Home Assistant OS. You can find more information on the [installation page](/installation/#advanced-installation-methods). Most notably, +<a href="/addons">add-ons</a> are only available with the Home Assistant Operating System. + +{% include installation/container.md %} +{% include installation/core.md %} diff --git a/source/installation/raspberrypi.markdown b/source/installation/raspberrypi.markdown index e469ff8d22e2..e2662752bbbd 100644 --- a/source/installation/raspberrypi.markdown +++ b/source/installation/raspberrypi.markdown @@ -10,36 +10,28 @@ Included section for this page is located under source/_includes/installation {% assign board = "Raspberry Pi" %} {% assign installation_media = "SD card" %} -<div class='note warning'> - -Please remember to ensure you're using an [appropriate power supply](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#power-supply) with your Raspberry Pi. Mobile chargers may not be suitable, since some are designed to only provide the full power with that manufacturer's handsets. USB ports on your computer also will not supply enough power and must not be used. - -</div> - -Before installing Home Assistant, you might want to <a href="/installation#compare-installation-methods">compare installation methods</a>. Most notably, -<a href="/addons">add-ons</a> are only available with the Home Assistant Operating System. - ## Suggested Hardware -We will need a few things to get started with installing Home Assistant. Links below lead to Amazon US. If you’re not in the US, you should be able to find these items in web stores in your country. +We will need a few things to get started with installing Home Assistant. -- [Raspberry Pi 5](https://amzn.to/3UH6TcD) -- [Raspberry Pi 4](https://amzn.to/2S0Gcl1) (Raspberry Pi 3 Model B is ok too, but the Model A does not have enough RAM). Raspberry Pi are currently hard to come by, use [RPilocator](https://rpilocator.com/?cat=PI4) to find official distributors with stock. -- [Power Supply for Raspberry Pi 4](https://amzn.to/2ReZ2Vq) or [Power Supply for Raspberry Pi 3](https://amzn.to/2R8yG7h) +- [Raspberry Pi 5](https://amzn.to/3UH6TcD) or [Raspberry Pi 4](https://amzn.to/2S0Gcl1) with [power supply](https://amzn.to/2ReZ2Vq) (Raspberry Pi 3 Model B is ok to get started, but the Model A does not have enough RAM). - [Micro SD Card](https://amzn.to/2X0Z2di). Ideally get one that is [Application Class 2](https://www.sdcard.org/developers/overview/application/index.html) as they handle small I/O much more consistently than cards not optimized to host applications. A 32 GB or bigger card is recommended. - SD Card reader. This is already part of most laptops, but you can purchase a [standalone USB adapter](https://amzn.to/2WWxntY) if you don't have one. The brand doesn't matter, just pick the cheapest. - [Ethernet cable](https://amzn.com/dp/B00N2VISLW). Required for installation. After installation, Home Assistant can work with Wi-Fi, but an Ethernet connection is more reliable and highly recommended. +{% note %} +Remember to ensure you're using an [appropriate power supply](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#power-supply) with your Raspberry Pi. Mobile chargers may not be suitable, since some are designed to only provide the full power with that manufacturer's handsets. USB ports on your computer also will not supply enough power and must not be used. +{% endnote %} + ## Install Home Assistant Operating System This guide shows how to install the Home Assistant Operating system onto your Raspberry Pi using Raspberry Pi Imager. -If Raspberry Pi Imager is not supported by your platform, you can use [Balena Etcher](#writing-the-image-with-balena-etcher) instead. +If Raspberry Pi Imager is not supported by your platform, you can use Balena Etcher instead. ### Write the image to your SD card 1. Download and install the Raspberry Pi Imager on your computer as described under [https://www.raspberrypi.com/software/](https://www.raspberrypi.com/software/). - ![Install Raspberry Pi Imager](/images/installation/rpi_imager.png) 2. Open the Raspberry Pi Imager and select your Raspberry Pi device. ![Open Raspberry Pi Imager](/images/installation/rpi_imager_start.png) 3. Choose the operating system: @@ -68,10 +60,10 @@ If Raspberry Pi Imager is not supported by your platform, you can use [Balena Et Within a few minutes after connecting the Raspberry Pi, you will be able to reach your new Home Assistant. - In the browser of your desktop system, enter <a href="http://homeassistant.local:8123" target="_blank">homeassistant.local:8123</a>. - - <div class="note"> - If you are running an older Windows version or have a stricter network configuration, you might need to access Home Assistant at <a href="http://homeassistant:8123" target="_blank">homeassistant:8123</a> or `http://X.X.X.X:8123` (replace X.X.X.X with your Raspberry Pi’s IP address). - </div> + +{% note %} +If you are running an older Windows version or have a stricter network configuration, you might need to access Home Assistant at <a href="http://homeassistant:8123" target="_blank">homeassistant:8123</a> or `http://X.X.X.X:8123` (replace X.X.X.X with your Raspberry Pi’s IP address). +{% endnote %} - The time it takes for this page to become available depends on your hardware. On a Raspberry Pi 4 or 5, this page should be available within a minute. - If it does not show up after 5 minutes on a Pi 4 or 5, maybe the image was not written properly. @@ -88,52 +80,7 @@ With the Home Assistant Operating System installed and accessible, you can now c {% include getting-started/next_step.html step="Onboarding" link="/getting-started/onboarding/" %} -{% include installation/container.md %} -{% include installation/core.md %} - -## Writing the image with Balena Etcher - -Use this procedure if Raspberry Pi Imager is not supported by your platform. - -1. Insert the SD card into the computer. Note: the contents of the card will be overwritten. -2. Download and start <a href="https://www.balena.io/etcher" target="_blank">Balena Etcher</a>. You may need to run it with administrator privileges on Windows. - -3. Download the image to your computer. - - Copy the correct URL for the Raspberry Pi 3, 4 or 5 (Note: there are 3 different links below!): - -{% tabbed_block %} -{% for variant in site.installation.types[page.installation_type].variants %} - -- title: {{ variant.name }} - content: | - - ```text - https://github.com/home-assistant/operating-system/releases/download/{{site.data.version_data.hassos[variant.key]}}/haos_{{ variant.key }}-{{site.data.version_data.hassos[variant.key]}}.img.xz - ``` - -{% endfor %} -{% endtabbed_block %} - -_Select and copy the URL or use the "copy" button that appear when you hover it._ - -4. Paste the URL into your browser to start the download. -5. Select **Flash from file** and select the image you just downloaded. - - **Flash from URL** does not work on some systems. - - ![Screenshot of the Etcher software showing flash from URL selected.](/images/installation/etcher1_file.png) -6. **Select target**. -![Screenshot of the Etcher software showing the select target button highlighted.](/images/installation/etcher3.png) -7. Select the SD card you want to use for your installation. -![Screenshot of the Etcher software showing the targets available.](/images/installation/etcher4.png) -8. Select **Flash!** to start writing the image. -![Screenshot of the Etcher software showing the Flash button highlighted.](/images/installation/etcher5.png) -9. Once Balena Etcher has finished writing the image, you will see a confirmation. -![Screenshot of the Etcher software showing that the installation has completed.](/images/installation/etcher6.png) - - <div style="margin-top:50px"> <p> <i>We get commissions for purchases made through links in this post.</i></p> </div> - -{% include common-tasks/enable_i2c.md %} diff --git a/source/integrations/index.html b/source/integrations/index.html index 1adb594483dc..fa2edd532491 100644 --- a/source/integrations/index.html +++ b/source/integrations/index.html @@ -25,15 +25,21 @@ {%- assign categories = components | map: 'ha_category' | join: ',' | downcase | split: ',' | uniq | sort -%} <div class="grid"> - <div class="grid__item one-sixth lap-one-whole palm-one-whole"> + <div class="grid__item one-fifth lap-one-whole palm-one-whole"> <div class="filter-button-group"> - <a href='#all' class="btn">All ({{tot}})</a> + <div class="all"> + <a href='#all' class="btn">All <span class="count">{{tot}}</span></a> + </div> + <div class="featured"> <a href='#featured' class="btn">Featured</a> <a href='#works-with-home-assistant' class="btn">Partner brands</a> </div> - <div class="version_select">Added in: <select id="versions" name="versions"> + + <div class="version_select"> + <label>By release</label> + <select id="versions" name="versions"> <option value="#"></option> {%- for group in components_by_version -%} <optgroup label="{{ group.label }} ({{group.new_components_count}})"> @@ -43,36 +49,75 @@ {%- endfor -%} </optgroup> {%- endfor -%} - </select></div> - {%- for category in categories -%} - {%- assign category_name = "" -%} - {%- assign components_count = 0 -%} - {%- for comp in components -%} - {%- assign comp_categories = comp.ha_category | join: ',' | downcase -%} - {%- if comp_categories contains category -%} + </select> + </div> + + <div class="category_list"> + <label>By Categories</label> + {%- for category in categories -%} + {%- assign category_name = "" -%} + {%- assign components_count = 0 -%} + {%- for comp in components -%} + {%- assign comp_categories = comp.ha_category | join: ',' | downcase -%} + {%- if comp_categories contains category -%} + {%- if category_name == "" -%} + {%- for cat in comp.ha_category -%} + {%- assign lower_cat = cat | downcase -%} + {%- if lower_cat == category -%} + {%- assign category_name = cat -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + {%- assign components_count = components_count | plus: 1 -%} + {%- endif -%} + {%- endfor -%} + {%- if category != 'other' and components_count != 0 -%} {%- if category_name == "" -%} - {%- for cat in comp.ha_category -%} - {%- assign lower_cat = cat | downcase -%} - {%- if lower_cat == category -%} - {%- assign category_name = cat -%} - {%- endif -%} - {%- endfor -%} - {%- endif -%} - {%- assign components_count = components_count | plus: 1 -%} + {%- assign category_name = category | capitalize -%} + {%- endif -%} + <a href='#{{ category_name | slugify }}' class="btn" onclick="document.querySelector('.page-content').scrollTop = 0">{{ category_name }} <span class="count">{{ components_count }}</span></a> {%- endif -%} {%- endfor -%} - {%- if category != 'other' and components_count != 0 -%} - {%- if category_name == "" -%} - {%- assign category_name = category | capitalize -%} - {%- endif -%} - <a href='#{{ category_name | slugify }}' class="btn" onclick="document.querySelector('.page-content').scrollTop = 0">{{ category_name }} ({{ components_count }})</a> - {%- endif -%} - {%- endfor -%} + <a href='#other' class="btn" onclick="document.querySelector('.page-content').scrollTop = 0">Other <span class="count">{{ components | where: 'ha_category', 'Other' | size }}</span></a> + </div> + + <div class="category_select"> + <label>By Categories</label> + <select id="categories" name="categories"> + <option value="#"></option> + {%- for category in categories -%} + {%- assign category_name = "" -%} + {%- assign components_count = 0 -%} + {%- for comp in components -%} + {%- assign comp_categories = comp.ha_category | join: ',' | downcase -%} + {%- if comp_categories contains category -%} + {%- if category_name == "" -%} + {%- for cat in comp.ha_category -%} + {%- assign lower_cat = cat | downcase -%} + {%- if lower_cat == category -%} + {%- assign category_name = cat -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + {%- assign components_count = components_count | plus: 1 -%} + {%- endif -%} + {%- endfor -%} + {%- if category != 'other' and components_count != 0 -%} + {%- if category_name == "" -%} + {%- assign category_name = category | capitalize -%} + {%- endif -%} + <option value="#{{ category_name | slugify }}">{{ category_name }} ({{ components_count }}) + </option> + {%- endif -%} + {%- endfor -%} + <option value="#other">Other ({{ components | where: 'ha_category', 'Other' | size }}) + </option> + </select> + </div> - <a href='#other' class="btn" onclick="document.querySelector('.page-content').scrollTop = 0">Other ({{ components | where: 'ha_category', 'Other' | size }})</a> </div> </div> - <div class="grid__item five-sixths lap-one-whole palm-one-whole"> + <div class="grid__item four-fifths lap-one-whole palm-one-whole"> <div class="component-search"> <form onsubmit="event.preventDefault(); return false"> <input type="text" name="search" id="search" class="search" placeholder="Search integrations..." autofocus /> @@ -201,7 +246,7 @@ </a> `).join('\n'); } else { - rendered = '<p class="note">Nothing found!</p>'; + rendered = '<div class="alert alert-note"><p class="alert-content">Nothing found!</p></div>'; } // set active class on active menu item @@ -224,7 +269,7 @@ 'https://brands.home-assistant.io', component.ha_brand ? 'brands' : '_', component.domain, - 'logo' + 'icon' ].join('/'); return `<img src="${urlBase}.png" srcset="${urlBase}@2x.png 2x" loading="lazy">`; @@ -246,6 +291,12 @@ applyFilter(); }); + const categoriesEl = document.getElementById('categories'); + categoriesEl.addEventListener('change', () => { + history.pushState('', '', categoriesEl.value); + applyFilter(); + }); + /** * Simple debounce implementation */ diff --git a/source/more-info/free-space.markdown b/source/more-info/free-space.markdown index e6853e3221b9..d6f62245b531 100644 --- a/source/more-info/free-space.markdown +++ b/source/more-info/free-space.markdown @@ -1,49 +1,76 @@ --- title: "Clear up storage" description: "More information on how to clear up storage in Home Assistant." +related: + - docs: /integrations/recorder/#action-purge + title: purge the contents of the database + - docs: /common-tasks/os/#network-storage + title: Add network storage + - docs: /common-tasks/os/#using-external-data-disk + title: Using an external data disk + - URL: https://yellow.home-assistant.io/guides/add-ssd-existing-installation/ + title: Adding an SSD to Home Assistant Yellow --- Reaching your storage limit, this page will help you when that happens. There are several things you can do to free up some space: -- [Clean the database](#clean-the-database) -- [Delete old backups](#delete-old-backups) -- [Uninstall unused add-ons](#uninstall-unused-add-ons) -- [Last resort](#last-resort) +- [Clean the database](#cleaning-the-database) +- [Reduce space used for backups](#reducing-space-used-for-backups) +- [Uninstall unused add-ons](#uninstalling-unused-add-ons) +- [Expand storage](#expanding-storage) -## Clean the database +## Cleaning the database The Home Assistant database can get huge! -Luckily there is a tool you can use to [purge the contents of the database](/integrations/recorder/#service-purge) +Luckily, there is a tool you can use to [purge the contents of the database](/integrations/recorder/#action-purge) You can [filter](/integrations/recorder/#configure-filter) what you send to the database, and even change how long it stores the data [with the `purge_keep_days` setting](/integrations/recorder/#purge_keep_days) -## Delete old backups +## Reducing space used for backups -Open the Home Assistant UI and go to {% my backup title="Settings > System > Backups" %}, here you will see all your backups, -these can be downloaded and placed somewhere safe. When you have done that, you can delete -them in the UI and it will free up some space for you. +### Deleting obsolete backups -## Uninstall unused add-ons +Previous backups are not included when you create a new one. But they do take up space. To delete old backups, follow these steps: + +1. Go to {% my backup title="**Settings** > **System** > **Backups**" %}. +2. From the list of backups, select all the ones you want to delete, then select **Delete selected backups**. + - This clears up space in Home Assistant. + +### Storing backups outside of Home Assistant + +Storing backups outside of Home Assistant makes sure they don't use space on Home Assistant to begin with. It also makes sure you can [restore Home Assistant from backup](/common-tasks/os/#restoring-a-backup) in case you have an issue with your current installation. + +1. Go to {% my backup title="**Settings** > **System** > **Backups**" %}, and from the list of backups, select the backup you want to keep. +2. In the dialog, select the checkbox for each component, in the three-dots menu, select **Download backup**. +3. Store the backup somewhere safe. + - For example, [add network storage](/common-tasks/os/#network-storage), and then [change your default backup location](/common-tasks/os/#change-default-backup-location). + +## Uninstalling unused add-ons Add-ons can take a lot of space, not just the add-on itself but also their data. -Open the Home Assistant UI and go to {% my supervisor title="Settings > Add-ons" %} in the sidebar. Here you will see -all your installed add-ons, maybe you have some that you no longer use, if -you do those can be uninstalled to free up some space. +1. Go to {% my supervisor title="**Settings** > **Add-ons**" %}. +2. Look at your installed add-ons and identify the ones you no longer use. +3. To remove the add-on, select the add-on and select **Uninstall**. -## Last resort +## Expanding storage -If all else fails, you need to expand your storage. +If the above steps to free up space did not help, you need to expand your storage. + +### Expanding storage: Home Assistant Operating System + +When you are running {% term "Home Assistant Operating System" %}, you can use the following options to expand your storage: + +- Replace your current storage medium, for example, the SD card, with a bigger one. Use a backup to [restore Home Assistant from backup](/common-tasks/os/#restoring-a-backup) on the new SD card. +- [Use an external data disk](/common-tasks/os/#using-external-data-disk) + +### Expanding storage on VM If you are running Home Assistant as a VM, look at the documentation for your hypervisor on how to expand disks for virtual machines. Home Assistant will auto-expand to use the newly added space. - -If you are not running a VM, you need to replace your storage medium -(typically, this will be an SD card). You can use [backups](/common-tasks/os#home-assistant-os-backups) to quickly restore your Home Assistant -installation on a new storage medium. diff --git a/source/voice_control/android.markdown b/source/voice_control/android.markdown index d5b7e7039eec..7cd4ea2a7fe5 100644 --- a/source/voice_control/android.markdown +++ b/source/voice_control/android.markdown @@ -27,7 +27,8 @@ To define Home Assistant Assist as default assistant app, follow these steps: 2. Under **Digital assistant app**, select **Default digital assistant app**. - On some Android versions, this might be under **Digital & voice input** > **Default digital assistant app** > **Voice Assistant**. 3. Select **Home Assistant**. - - On some Android versions, you might be able to change the assistants language settings here by selecting the cogwheel. + + - On some Android versions, you might be able to change the assistant's language settings here by selecting the cogwheel {% icon "mdi:cog-outline" %}. 4. Go back one step. The **Default digital assistant app** should now show *Home Assistant* as the default. 5. Leave the **Settings**. 6. Start Assist using the gesture to start an assistant. The gesture may differ depending on the version. @@ -120,7 +121,7 @@ This procedure was written using Wear OS version 3.5. The exact steps may vary d To define Home Assistant Assist as default assistant app, follow these steps: -1. On the watch, navigate to the **Apps screen** and select the cogwheel. +1. On the watch, navigate to the **Apps screen** and select the cogwheel {% icon "mdi:cog-outline" %}. 2. Go to **Apps** > **Choose default apps** > **Digital assistant app**. 3. From the list, select **Home Assistant**. 4. When you go back one step, under **Default app**, it now says **HA: Assist**. diff --git a/source/voice_control/apple.markdown b/source/voice_control/apple.markdown index cc5c2ff782ba..2b1e3e97b210 100644 --- a/source/voice_control/apple.markdown +++ b/source/voice_control/apple.markdown @@ -34,9 +34,9 @@ Open the shortcuts app, and edit the Button Assist shortcut. The text in quotes - Use the arrow to expand the _"Dictate text"_ action options, and select your language - Use the arrow to expand the _"Assist with `Provided Input`"_ options, and select your language. -<p class='note'> +{% important %} You can import the button shortcut multiple times to create versions for different languages, when asked if you would like to replace your Shortcut, choose "Keep Both". -</p> +{% endimportant %} ## Multiple servers diff --git a/source/voice_control/assist_daily_summary.markdown b/source/voice_control/assist_daily_summary.markdown index b63a6c20e1fa..07b25b9cdaf5 100644 --- a/source/voice_control/assist_daily_summary.markdown +++ b/source/voice_control/assist_daily_summary.markdown @@ -82,7 +82,8 @@ We are using a blueprint (courtesy of [@allenporter]) that polls calendar events 1. To import the blueprint, select the button below: - {% my blueprint_import badge blueprint_url="https://www.home-assistant.io/blueprints/blog/2023-07/notify_agent_agenda.yaml" %} + {% my blueprint_import badge blueprint_url="https://www.home-assistant.io/blueprints/integrations/conversation_notify_agent_agenda.yaml" %} + 2. Select **Preview**, then select **Import blueprint**. 3. Select the blueprint **Conversation agent agenda notification** from the list. 4. Enter the values for each category. diff --git a/source/voice_control/builtin_sentences.markdown b/source/voice_control/builtin_sentences.markdown index c7fc58551652..dec11f675041 100644 --- a/source/voice_control/builtin_sentences.markdown +++ b/source/voice_control/builtin_sentences.markdown @@ -70,6 +70,25 @@ These sentences allow you, for example, to: - **Control the vacuum** - *"return rover to base"* - *"start rover"* +- **Use timers** + - *“Create a timer for 5 minutes”* + - *“Create a 15-minute timer for pizza”* + - *“Cancel my timer”* + - *“Pause my timer”* + - *“Resume my timer”* + - *“Add 2 minutes to my 5-minute timer”* + - *“Remove 3 minutes from my pizza timer”* + + <p class='img'><lite-youtube videoid="v3mNdTsX4J0" videotitle="Voice timers with countdown text and loading bar"></lite-youtube>Timers running on an S3-Box-3B, with countdown text and a loading bar!</p> + +To learn how to set this up, refer to the [ESP32-S3-Box-3B tutorial](/voice_control/s3_box_voice_assistant/). + +- **Combine timers and device control to add a delay** +Unlike regular voice timers, delayed commands cannot be canceled or modified. + - *“Turn off the lights in the living room in 5 minutes”* + - *“Pause TV in 10 minutes”* + - *“Open the blinds in 5 minutes”* + - **Abort wake word** - *"Nevermind"*: If you triggered the wake word by mistake and want to stop Home Assistant from listening diff --git a/source/voice_control/custom_sentences.markdown b/source/voice_control/custom_sentences.markdown index e348a65b27b0..7924dc94905c 100644 --- a/source/voice_control/custom_sentences.markdown +++ b/source/voice_control/custom_sentences.markdown @@ -3,7 +3,7 @@ title: "Assist - custom sentences" related: - docs: /voice_control/aliases/ title: Create aliases - - docs: /docs/scripts/#respond-to-a-conversation/ + - docs: /docs/scripts/#respond-to-a-conversation title: Conversation response script action - docs: /docs/automation/trigger/#sentence-trigger title: Sentence triggers @@ -181,4 +181,4 @@ responses: - [$13 voice assistant for Home Assistant](/voice_control/thirteen-usd-voice-remote/) - [S3-BOX-3 voice assistant](/voice_control/s3_box_voice_assistant/) - [Assist for Apple](/voice_control/apple/) -- [Assist for Android](/voice_control/android/) \ No newline at end of file +- [Assist for Android](/voice_control/android/) diff --git a/source/voice_control/s3_box_voice_assistant.markdown b/source/voice_control/s3_box_voice_assistant.markdown index 87c17e6d2fdf..581255f0e33e 100644 --- a/source/voice_control/s3_box_voice_assistant.markdown +++ b/source/voice_control/s3_box_voice_assistant.markdown @@ -18,7 +18,7 @@ related: title: ESPHome projects page --- -This tutorial will guide you to turn an ESP32-S3-BOX, ESP32-S3-BOX-3, or an ESP32-S3-BOX-Light into a Home Assistant voice assistant. Note, the term ESP32-S3-BOX is used to refer to any of the 3 product variants. +This tutorial will guide you to turn an ESP32-S3-BOX, ESP32-S3-BOX-3(B), or an ESP32-S3-BOX-Lite into a Home Assistant voice assistant. Note, the term ESP32-S3-BOX may be used to refer to any of the 3 product variants. <lite-youtube videoid="erf7HqTwCGs" videotitle="Okay Nabu! Open-source voice assistant running on an Espressif ESP32-S3-Box "></lite-youtube> @@ -29,50 +29,157 @@ This tutorial will guide you to turn an ESP32-S3-BOX, ESP32-S3-BOX-3, or an ESP3 - [Home Assistant Cloud](/voice_control/voice_remote_cloud_assistant/) or a manually configured [Assist Pipeline](/voice_control/voice_remote_local_assistant) - The password to your 2.4 GHz Wi-Fi network - Chrome or Edge browser on a desktop (not Android/iOS) -- One of the three Espressif ESP32-S3-BOX variants: - - [ESP32-S3-BOX-3](https://www.aliexpress.us/item/1005005920207976.html?gatewayAdapt=4itemAdapt) - - ESP32-S3-BOX or ESP32-S3-BOX-Lite (not currently on the market) +- One of the Espressif ESP32-S3-BOX variants: + - ESP32-S3-BOX-3B + - ESP32-S3-BOX-3, ESP32-S3-BOX, or ESP32-S3-BOX-Lite (not currently on the market) - USB-C cable to connect the ESP32-S3-BOX +- This procedure assumes that this is the first time you are installing ESPHome firmware on the device. If you have previously completed this tutorial and now want to install the latest software version, follow the steps on [updating the software on the S3-BOX](#updating-the-software-on-the-s3-box). ## Installing the software onto the ESP32-S3-BOX Before you can use this device with Home Assistant, you need to install a bit of software on it. -1. Make sure this page is opened in a Chromium-based browser on a **desktop**. The software installation does not work with a tablet or phone. - - - If you have an ESP32-S3-BOX-3, select the **Connect** button below to display a list of available USB devices. Do not connect the ESP32-S3-BOX-3 yet. We want to see the list of available USB devices first, so that it is easier to recognize the ESP device afterwards. - - If your browser does not support web serial, you will see a warning message indicating this instead of a button. - - <script type="module" src="https://unpkg.com/esp-web-tools@10/dist/web/install-button.js?module"></script> - <esp-web-install-button manifest="https://firmware.esphome.io/wake-word-voice-assistant/esp32-s3-box-3/manifest.json"></esp-web-install-button> - - - - If you have an ESP32-S3-BOX or ESP32-S3-BOX-Lite, open the [ESPHome projects](https://esphome.io/projects/index.html?type=voice) page, select your variant and follow the installation instructions. - - **For advanced users**: The configuration files are available on GitHub: - - [ESP32-S3-BOX-3](https://github.com/esphome/firmware/blob/main/wake-word-voice-assistant/esp32-s3-box-3.yaml) - -{% include voice_assistant/install_esp_firmware.md %} - -9. Select the **ESPHome** integration. Under **Devices**, you should see the **ESP32-S3-BOX** listed. - ![ESP32-S3-BOX-3 discovered](/images/assist/s32-s3-box-3-discovered.png) - - - Your ESP32-S3-BOX is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply. - -10. Make sure your assistant has [wake word enabled](/voice_control/about_wake_word/), using "OK Nabu". -11. Under **Devices**, on the ESP32-S3-BOX-3 entry, select **Device** to open the device page. -12. Check the device settings: - - If you want, you can process the wake word on the ESP32-S3 device, rather than on your Home Assistant server. (The server is the device where Home Assistant is installed, for example on Home Assistant Green): - - Under **Wake word engine location**, select **On device**, if you want your wake word to be processed on the device itself, and not in Home Assistant. +{% tabbed_block %} + +- title: Using the ESP32-S3-BOX + content: | + + 1. Make sure this page is opened in a Chromium-based browser on a **desktop**. The software installation does not work with a tablet or phone. + + - If your browser does not support web serial, you will see a warning message indicating this instead of a button. + + <script type="module" src="https://unpkg.com/esp-web-tools@10/dist/web/install-button.js?module"></script> + <esp-web-install-button manifest="https://firmware.esphome.io/wake-word-voice-assistant/esp32-s3-box/manifest.json"></esp-web-install-button> + + - **For advanced users**: The configuration files are available on GitHub: + - [ESP32-S3-BOX config on GitHub](https://github.com/esphome/firmware/blob/main/wake-word-voice-assistant/esp32-s3-box.yaml) + + 2. To connect the ESP32-S3-BOX to your computer, follow these steps: + - In the pop-up window, view the available ports. + - Plug the USB-C cable into the ESP32-S3-BOX and connect it to your computer. + 3. Select **Install Voice Assistant**, then **Install**. + - Once the installation is complete, select **Next**. + - Add the ESP32-S3-BOX to your Wi-Fi: + - When prompted, select your network from the list and enter the credentials to your 2.4 GHz Wi-Fi network. + - Select **Connect**. + - The ESP32-S3-BOX now joined your network. Select **Add to Home Assistant**. + 4. This opens the **My** link to Home Assistant. + - If you have not used My Home Assistant before, you will need to configure it. If your Home Assistant URL is not accessible on `http://homeassistant.local:8123`, replace it with the URL to your Home Assistant instance. + - Open the link. + ![Open My link](/images/assist/esp32-atom-flash-06.png) + 5. Select **OK**. + ![Set up ESPHome](/images/assist/esp32-atom-flash-07.png) + 6. To add the newly discovered device, select the ESP32-S3-BOX from the list. + - Add your ESP32-S3-BOX to a room and select **Finish**. + 7. You should now see the **ESPHome** integration. + ![New ESPHome device discovered](/images/assist/m5stack-atom-echo-discovered-33.png) + 8. Select the **ESPHome** integration. Under **Devices**, you should see the **ESP32-S3-BOX** listed. + ![ESP32-S3-BOX-3 discovered](/images/assist/s32-s3-box-3-discovered.png) + + - Your ESP32-S3-BOX is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply. + +- title: Using the ESP32-S3-BOX-3(B) + content: | + + 1. These steps apply both to the ESP32-S3-BOX-3 and the ESP32-S3-BOX-3B. Make sure this page is opened in a Chromium-based browser on a **desktop**. The software installation does not work with a tablet or phone. + + - Select the **Connect** button below to display a list of available USB devices. Do not connect the ESP32-S3-BOX-3 yet. We want to see the list of available USB devices first, so that it is easier to recognize the ESP device afterward. + - If your browser does not support web serial, you will see a warning message indicating this instead of a button. + + <script type="module" src="https://unpkg.com/esp-web-tools@10/dist/web/install-button.js?module"></script> + <esp-web-install-button manifest="https://firmware.esphome.io/wake-word-voice-assistant/esp32-s3-box-3/manifest.json"></esp-web-install-button> + + - **For advanced users**: The configuration files are available on GitHub: + - [ESP32-S3-BOX-3 config on GitHub](https://github.com/esphome/firmware/blob/main/wake-word-voice-assistant/esp32-s3-box-3.yaml) + + 2. To connect the ESP32-S3-BOX-3 to your computer, follow these steps: + - In the pop-up window, view the available ports. + - Plug the USB-C cable into the box directly, not into the docking station (not into the blue part) and connect it to your computer. + - **Troubleshooting**: If your ESP32-S3-BOX-3 does not appear in the list of devices presented by your browser, you need to manually invoke "flash mode": + - Hold the "boot" button (left side upper button) as you tap the "reset" button (left side lower button). + - After a few seconds, the ESP32-S3-BOX-3 should appear in the list of USB devices presented by your browser. + - Follow the steps until step 3. After selecting the **Next** button, on the S3-Box-3, tap the "Reset" button again. + - Then, select the blue **Connect button** again, select the USB device and follow the prompts to configure the Wi-Fi. + - In the pop-up window, there should now appear a new entry. Select this USB serial port and select **Connect**. + 3. Select **Install Voice Assistant**, then **Install**. + - Once the installation is complete, select **Next**. + - Add the ESP32-S3-BOX-3 to your Wi-Fi: + - When prompted, select your network from the list and enter the credentials to your 2.4 GHz Wi-Fi network. + - Select **Connect**. + - The ESP32-S3-BOX-3 now joined your network. Select **Add to Home Assistant**. + 4. This opens the **My** link to Home Assistant. + - If you have not used My Home Assistant before, you will need to configure it. If your Home Assistant URL is not accessible on `http://homeassistant.local:8123`, replace it with the URL to your Home Assistant instance. + - Open the link. + ![Open My link](/images/assist/esp32-atom-flash-06.png) + 5. Select **OK**. + + ![Set up ESPHome](/images/assist/esp32-atom-flash-07.png) + 6. To add the newly discovered device, select the ESP32-S3-BOX-3 from the list. + - Add your ESP32-S3-BOX-3 to a room and select **Finish**. + 7. You should now see the **ESPHome** integration. + ![New ESPHome device discovered](/images/assist/m5stack-atom-echo-discovered-33.png) + + 8. Select the **ESPHome** integration. Under **Devices**, you should see the **ESP32-S3-BOX** listed. + ![ESP32-S3-BOX-3 discovered](/images/assist/s32-s3-box-3-discovered.png) + + - Your ESP32-S3-BOX is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply. + +- title: Using the ESP32-S3-BOX-Lite + content: | + + 1. Make sure this page is opened in a Chromium-based browser on a **desktop**. The software installation does not work with a tablet or phone. + + - If your browser does not support web serial, you will see a warning message indicating this instead of a button. + + <script type="module" src="https://unpkg.com/esp-web-tools@10/dist/web/install-button.js?module"></script> + <esp-web-install-button manifest="https://firmware.esphome.io/wake-word-voice-assistant/esp32-s3-box-lite/manifest.json"></esp-web-install-button> + + - **For advanced users**: The configuration files are available on GitHub: + - [ESP32-S3-BOX-Lite config on GitHub](https://github.com/esphome/firmware/blob/main/wake-word-voice-assistant/esp32-s3-box-lite.yaml) + + 2. To connect the ESP32-S3-BOX-Lite to your computer, follow these steps: + - In the pop-up window, view the available ports. + - Plug the USB-C cable into the ESP32-S3-BOX-Lite and connect it to your computer. + 3. Select **Install Voice Assistant**, then **Install**. + - Once the installation is complete, select **Next**. + - Add the ESP32-S3-BOX-Lite to your Wi-Fi: + - When prompted, select your network from the list and enter the credentials to your 2.4 GHz Wi-Fi network. + - Select **Connect**. + - The ESP32-S3-BOX-Lite now joined your network. Select **Add to Home Assistant**. + 4. This opens the **My** link to Home Assistant. + - If you have not used My Home Assistant before, you will need to configure it. If your Home Assistant URL is not accessible on `http://homeassistant.local:8123`, replace it with the URL to your Home Assistant instance. + - Open the link. + ![Open My link](/images/assist/esp32-atom-flash-06.png) + 5. Select **OK**. + ![Set up ESPHome](/images/assist/esp32-atom-flash-07.png) + 6. To add the newly discovered device, select the ESP32-S3-BOX-Lite from the list. + - Add your ESP32-S3-BOX-Lite to a room and select **Finish**. + 7. You should now see the **ESPHome** integration. + ![New ESPHome device discovered](/images/assist/m5stack-atom-echo-discovered-33.png) + 8. Select the **ESPHome** integration. Under **Devices**, you should see the **ESP32-S3-BOX-Lite** listed. + ![ESP32-S3-BOX-3 discovered](/images/assist/s32-s3-box-3-discovered.png) + + - Your ESP32-S3-BOX-Lite is connected to Home Assistant over Wi-Fi. You can now move it to any place in your home with a USB power supply. + +{% endtabbed_block %} + +## Checking wake word settings + +1. Make sure your assistant has [wake word enabled](/voice_control/about_wake_word/), using "OK Nabu". +2. Under **Devices**, on the ESP32-S3-BOX* entry, select **Device** to open the device page. +3. Check the device settings: + - If you want, you can process the wake word on the ESP32-S3 device, rather than on your Home Assistant server. (The server is the device where Home Assistant is installed, for example on Home Assistant Green): + - Under **Wake word engine location**, select **On device**, if you want your wake word to be processed on the device itself, and not in Home Assistant. - Local processing is faster. - The wake word is now *Okay Nabu*. - - If **Display conversation** is enabled, the conversation is shown on the ESP32-S3-BOX-3 display. + - If **Display conversation** is enabled, the conversation is shown on the ESP32-S3-BOX* display. ![ESP32-S3-BOX-3 on device wake word processing](/images/assist/wake_word_engine_location.png) -13. If you chose on-device wake word, but you do not want to use *Okay Nabu*, you can change the on-device wake word. - - Currently, *Hey Jarvis* or *Alexa* are the supported alternatives. - - To change your wake word, follow the steps in [Customizing the S3-BOX-3 with on-device wake words](/voice_control/s3-box-customize/#customizing-on-device-wake-words-microwakeword). -14. Congratulations! You can now voice control Home Assistant via a ESP32 device with a display. Now give some commands. +4. If you chose on-device wake word, but you do not want to use *Okay Nabu*, you can change the on-device wake word. + - Currently, *Hey Jarvis* or *Alexa* are the supported alternatives. + - To change your wake word, follow the steps in [Customizing the S3-BOX-3 with on-device wake words](/voice_control/s3-box-customize/#customizing-on-device-wake-words-microwakeword). +5. Congratulations! You can now voice control Home Assistant via a ESP32 device with a display. Now give some commands. ## Controlling Home Assistant @@ -100,3 +207,18 @@ Before you can use this device with Home Assistant, you need to install a bit of - Disable **LCD Backlight**. ![Toggle to enable/disable wake word](/images/assist/s3-box-disable-screen.png) + +## Updating the software on the S3-BOX + +To update the software on your S3-BOX, follow the steps below that reflect your setup. + +- **Option 1**: You have Home Assistant 2024.7 or later, and have not manually altered your ESPHome configuration for the S3-BOX: + - Once an update is available, you will receive an update notification, just like any other update. + - To install the precompiled new firmware directly on your box, make sure the S3-BOX is connected to your network, and under **ESP32 S3 BOX...Firmware**, select **Install**. +- **Option 2**: You have Home Assistant 2024.6 or older, and have not manually altered your ESPHome configuration for the S3-BOX: + - Follow steps 1-3 of the procedure on [installing the software onto the S3-BOX](#installing-the-software-onto-the-esp32-s3-box). + - This installs the latest, precompiled firmware for your S3-BOX. +- **Option 3**: You have manually changed the configuration file for your S3-BOX: + - You need to compile your own firmware. To do so, either: + - Use the ESPHome dashboard add-on within Home Assistant. While the easiest option, it tends to be the slowest and may fail, particularly on older systems or on systems with limited memory/CPU resources. + - Follow the steps in the [ESPHome documentation](https://esphome.io/guides/getting_started_command_line) and use a desktop-class system to compile and install the firmware. Initial setup is more complex, but the process is significantly faster and more reliable. diff --git a/source/voice_control/troubleshooting.markdown b/source/voice_control/troubleshooting.markdown index de34a08cb9da..9bcf0221517d 100644 --- a/source/voice_control/troubleshooting.markdown +++ b/source/voice_control/troubleshooting.markdown @@ -69,7 +69,7 @@ The example below shows common pitfalls when enquiring about the weather. While ![Create weather entity](/images/assist/metno_weather_entity.png) 3. Make sure the entity is exposed to Assist: - Under {% my entities title="**Settings** > **Devices & services** > **Entities**" %}, select the weather entity for that location. - - In the details view that opens, select the cogwheel, then select **Voice Assistant**. + - In the details view that opens, select the cogwheel {% icon "mdi:cog-outline" %}, then select **Voice Assistant**. ![Select voice assistants](/images/assist/weather_entity_voice_assistant.png)