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..7d112dedd4c6 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 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 fd9f66656978..ba7ea78a3c35 100644 --- a/Gemfile +++ b/Gemfile @@ -10,8 +10,8 @@ group :development do gem 'stringex', '2.8.6' # > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189 gem 'sassc', '2.1.0' - gem 'rubocop', '1.64.1' - gem 'ruby-lsp', '0.17.4' + gem 'rubocop', '1.65.1' + gem 'ruby-lsp', '0.17.11' gem 'rackup', '2.1.0' end @@ -23,7 +23,7 @@ group :jekyll_plugins do end gem 'sinatra', '4.0.0' -gem 'nokogiri', '1.16.6' +gem 'nokogiri', '1.16.7' # Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem # and associated library diff --git a/Gemfile.lock b/Gemfile.lock index c6becd37de75..093966cb8199 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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.2-x86_64-linux) + google-protobuf (4.27.3-x86_64-linux) bigdecimal rake (>= 13) http_parser.rb (0.8.0) @@ -75,20 +75,20 @@ GEM logger (1.6.0) mercenary (0.4.0) multi_json (1.15.0) - mustermann (3.0.0) + mustermann (3.0.1) ruby2_keywords (~> 0.0.1) - nokogiri (1.16.6-x86_64-linux) + nokogiri (1.16.7-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 (6.0.0) - racc (1.8.0) - rack (3.1.4) + public_suffix (6.0.1) + racc (1.8.1) + rack (3.1.7) rack-protection (4.0.0) base64 (>= 0.1.0) rack (>= 3.0.0, < 4) @@ -102,26 +102,26 @@ GEM rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rbs (3.5.1) + rbs (3.5.2) logger regexp_parser (2.9.2) - rexml (3.3.1) + rexml (3.3.4) strscan rouge (4.3.0) - rubocop (1.64.1) + rubocop (1.65.1) 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) + rubocop-ast (1.32.0) parser (>= 3.3.1.0) - ruby-lsp (0.17.4) + ruby-lsp (0.17.11) language_server-protocol (~> 3.17.0) prism (>= 0.29.0, < 0.31) rbs (>= 3, < 4) @@ -130,8 +130,8 @@ GEM ruby2_keywords (0.0.5) safe_yaml (1.0.5) sass (3.4.25) - sass-embedded (1.77.5-x86_64-linux-gnu) - google-protobuf (>= 3.25, < 5.0) + sass-embedded (1.77.8-x86_64-linux-gnu) + google-protobuf (~> 4.26) sass-globbing (1.1.5) sass (>= 3.1) sassc (2.1.0-x86_64-linux) @@ -142,7 +142,7 @@ GEM rack-protection (= 4.0.0) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11460) + sorbet-runtime (0.5.11514) stringex (2.8.6) strscan (3.1.0) terminal-table (3.0.2) @@ -165,11 +165,11 @@ DEPENDENCIES jekyll-paginate (= 1.1.0) jekyll-sitemap (= 1.4.0) jekyll-toc (= 0.19.0) - nokogiri (= 1.16.6) + nokogiri (= 1.16.7) rackup (= 2.1.0) rake (= 13.2.1) - rubocop (= 1.64.1) - ruby-lsp (= 0.17.4) + rubocop (= 1.65.1) + ruby-lsp (= 0.17.11) sass-globbing (= 1.1.5) sassc (= 2.1.0) sinatra (= 4.0.0) diff --git a/_config.yml b/_config.yml index fa7a68b274fc..bf3cc05f11f2 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_minor_version: 7 current_patch_version: 4 -date_released: 2024-06-21 +date_released: 2024-07-30 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. @@ -139,26 +139,48 @@ defaults: footer: true sharing: true sidebar: true + toc: true # Enable table of contents for integrations and installations # # To set toc as a default value, we need to set the scope with an empty path # and the collection as type # https://github.com/toshimaru/jekyll-toc/issues/116#issuecomment-644205770 # + - scope: + path: "" + type: dashboards + values: + toc: true - scope: path: "" type: integrations values: toc: true + - scope: + path: "" + type: docs + values: + toc: true - scope: path: "installation/*" values: toc: true - no_toc: true - scope: path: "common-tasks/*" values: toc: true + - scope: + path: "getting-started/*" + values: + toc: true + - scope: + path: "more-info/*" + values: + toc: true + - scope: + path: "voice_control/*" + values: + toc: true - scope: path: "hassio/*" values: diff --git a/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..17c897ac35d8 100644 --- a/plugins/my.rb +++ b/plugins/my.rb @@ -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 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..9fa6482393bf 100644 --- a/plugins/terminology_tooltip.rb +++ b/plugins/terminology_tooltip.rb @@ -1,51 +1,51 @@ module Jekyll module HomeAssistant class TerminologyTooltip < Liquid::Tag - def initialize(tag_name, args, tokens) super - if args.strip =~ SYNTAX - @term = Regexp.last_match(1) - @text = Regexp.last_match(2) - else - raise SyntaxError, <<~MSG - Syntax error in tag 'term' while parsing the following options: - - #{args} - - Valid syntax: - {% term <term> [<text>] %} - MSG - end + raise SyntaxError, <<~MSG unless args.strip =~ SYNTAX + Syntax error in tag 'term' while parsing the following options: + + #{args} + + Valid syntax: + {% term <term> [<text>] %} + MSG + + @term = Regexp.last_match(1) + @text = Regexp.last_match(2) end def render(context) - @term.gsub!(/\"/, "") - entries = context.registers[:site].data["glossary"].select do |entry| - entry.key?("term") and (@term.casecmp(entry["term"]).zero? or (entry.key?("aliases") and entry["aliases"].any?{ |s| s.casecmp(@term)==0 })) + @term.gsub!(/"/, '') + entries = context.registers[:site].data['glossary'].select do |entry| + entry.key?('term') and (@term.casecmp(entry['term']).zero? or (entry.key?('aliases') and entry['aliases'].any? do |s| + s.casecmp(@term) == 0 + end)) end raise ArgumentError, "Term #{@term} was not found in the glossary" if entries.length == 0 raise ArgumentError, "Term #{@term} is in the glossary multiple times" if entries.length > 1 - raise ArgumentError, "Term #{@term} is missing a definition" unless entries[0].key?("definition") + raise ArgumentError, "Term #{@term} is missing a definition" unless entries[0].key?('definition') + glossary = entries[0] - definition = glossary["excerpt"] || glossary["definition"] - - 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>" + definition = glossary['excerpt'] || glossary['definition'] + + if glossary.key?('link') + rendered_link = Liquid::Template.parse(glossary['link']).render(context).strip + link = "<a class='terminology-link' href='#{rendered_link}'> [Learn more]</a>" + definition = "#{definition.strip}#{link}".strip end - tooltip = "<span class='terminology-tooltip'>#{definition}#{link || ""}</span>" + tooltip = "<span class='terminology-tooltip'>#{definition.strip}</span>" "<span class='terminology'>#{@text || @term}#{tooltip}</span>" end private - SYNTAX = %r!^(\w+?|".+?")(?:\s+(\w+|".+"))?$!.freeze - + SYNTAX = /^(\w+?|".+?")(?:\s+(\w+|".+"))?$/ end end end 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..3afa6de89bec --- /dev/null +++ b/sass/homeassistant/_overrides.scss @@ -0,0 +1,1374 @@ +@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-index, .blog-category { + .grid-wrapper>.grid.grid-center { + display: flex; + flex-direction: row-reverse; + justify-content: flex-end; + } + } + + #sidebar { + .vertical-nav, .recent-categories, .blog-index .recent-posts, .categories { + background: none; + padding: 0 16px 0 0; + } + } + + .documentation-page, .blog-index { + #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-index #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%); + } + + iconify-icon { + vertical-align: middle; + } + } + + .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); +} + + +.author-avatar { + position: relative; + width: 40px; + height: 40px; + border-radius: 24px !important; + vertical-align: middle; + margin: 0 8px 0 0; + border: 2px solid rgba(0,0,0,.1) !important; + box-shadow: none !important; +} + + +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 87% rename from sass/oscailte/base/_post.scss rename to sass/homeassistant/base/_post.scss index a93338fe6daa..2735acac2929 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,18 +90,19 @@ 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; - border-bottom: 1px solid $primary-color; + border-bottom: 2px solid $grayLighter; + margin: 2em 0 2.5em; } } @@ -114,11 +114,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 92% rename from sass/custom/_getting_started.scss rename to sass/homeassistant/pages/_getting_started.scss index 85a35ec3c51b..64c829a2be19 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 { @@ -18,15 +14,19 @@ &.easiest { color: #04b154; } + &.easy { color: #02b0ff; } + &.intermediate { color: #eb873f; } + &.hard { color: #ff5454; } + &.expert { color: #ff02b8; } @@ -81,7 +81,8 @@ align-items: center; border-radius: 4px; background-color: #c4c4c4; - > * { + + >* { border-radius: 0; border: 0; box-shadow: none; @@ -93,10 +94,12 @@ .content { flex: 1; padding: 8px 0; + p { font-size: 0.8em; margin: 0; } + b { font-size: 0.7em; } @@ -107,7 +110,7 @@ margin-top: 8px; gap: 8px; - & > * { + &>* { flex-basis: min-content; flex-grow: 1; } @@ -122,6 +125,7 @@ margin-bottom: 0; } } + .buttons { margin-top: 16px; display: flex; @@ -130,19 +134,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; + } + } } } } @@ -181,28 +198,36 @@ tr:nth-child(even) { background-color: #fafafa; } + + iconify-icon { + font-size: 1.5em; + } } } .link-card { text-decoration: none !important; color: black !important; + div { margin: 32px 0; height: 64px; display: flex; justify-content: space-between; + svg { height: 32px; width: 32px; max-width: 32px; } + p { margin: 0; align-self: center; } } } + .next-step { p { text-transform: uppercase; @@ -216,6 +241,7 @@ .material-card { .content-container { flex-direction: column; + .image { width: 100%; display: flex; @@ -228,9 +254,11 @@ height: unset; } } + .icon { width: 100%; height: 200px; + * { height: 100%; width: auto; @@ -257,4 +285,4 @@ } } } -} +} \ No newline at end of file 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/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/sections.markdown b/source/_dashboards/sections.markdown index c3ce04b8d170..a96f998d8495 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 @@ -51,7 +52,7 @@ Once you have created a sections view, you can populate it with sections and car ![Add Section button](/images/dashboards/sections_view_add-card-or-section.png) 2. To add a new section, select the **Create section** button. -3. To edit the section title, select the <img height="28px" src="/images/blog/2024-03-dashboard-chapter-1/mdi-edit.png" alt="Edit icon"/> button. +3. To edit the section title, select the edit {% icon "mdi:edit" %} button. - If you leave the section title empty, this line will be hidden. 4. If you want this section to be visible only to specific users or under a certain condition, you can define those conditions: - On the **Visibility** tab, select **Add condition**. @@ -63,16 +64,16 @@ Once you have created a sections view, you can populate it with sections and car ## Deleting a section -1. To delete a section, go to the dashboard and in the top right corner, select the pencil icon. +1. To delete a section, go to the dashboard and in the top right corner, select the edit {% icon "mdi:edit" %} button. 2. Open the view with the section you want to delete. -3. Select the <img height="28px" src="/images/blog/2024-03-dashboard-chapter-1/mdi-trash.png" alt="Delete icon"/> button. +3. Select the delete {% icon "mdi:trash" %} button. ## Rearranging sections and cards In the sections view, you can rearrange sections and cards by dragging them to a new location. This is not yet possible in other views. -1. To edit your dashboard, in the top right corner, select the pencil icon. -2. To rearrange sections, hold the <img height="28px" src="/images/blog/2024-03-dashboard-chapter-1/mdi-move.png" alt="Move icon"/> button and move the card. +1. To edit your dashboard, in the top right corner, select the edit {% icon "mdi:edit" %} button. +2. To rearrange sections, hold the move {% icon "mdi:cursor-move" %} button and move the card. <p class='img'> <img src="/images/blog/2024-03-dashboard-chapter-1/drag-and-drop-sections.gif" alt="Rearranging sections by dragging"/> @@ -90,7 +91,7 @@ In the sections view, you can rearrange sections and cards by dragging them to a You can choose to show or hide certain sections based on different conditions. The [available conditions](/dashboards/conditional/#card-conditions) are the same as that for the conditional card. -To edit the section visibility conditions, select the <img height="28px" src="/images/blog/2024-03-dashboard-chapter-1/mdi-edit.png" alt="Edit icon"/> button and then click on the visibility tab. +To edit the section visibility conditions, select the edit {% icon "mdi:edit" %} button and then click on the visibility tab. ## Check out the demo 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/people.yml b/source/_data/people.yml new file mode 100644 index 000000000000..a26451c9c2b6 --- /dev/null +++ b/source/_data/people.yml @@ -0,0 +1,79 @@ +Paulus Schoutsen: + name: Paulus Schoutsen + github: balloob + +Pascal Vizeli: + name: Pascal Vizeli + github: pvizeli + +Franck Nijhof: + name: Franck Nijhof + github: frenck + +Bram Kragten: + name: Bram Kragten + github: bramkragten + +Madelena Mak: + name: Madelena Mak + github: madelena + +Guy Sie: + name: Guy Sie + github: GuySie + +Gordon Cameron: + name: Gordon Cameron + github: googanhiem + +Uwe Bernitt: + name: Uwe Bernitt + github: b-uwe + +Jean-Loïc Pouffier: + name: Jean-Loïc Pouffier + github: jlpouffier + +Stefan Agner: + name: Stefan Agner + github: agners + +Bruno Pantaleão: + name: Bruno Pantaleão + github: bgoncal + +Matthias de Baat: + name: Matthias de Baat + github: matthiasdebaat + +Marcel van der Veldt: + name: Marcel van der Veldt + github: marcelveldt + +Mike Hansen: + name: Mike Hansen + github: synesthesiam + +Paul Bottein: + name: Paul Bottein + github: piitaya + +Zack Barett: + name: Zack Barett + github: zsarnett + +Joris Pelgröm: + name: Joris Pelgröm + github: jpelgrom + +Daniel Shokouhi: + name: Daniel Shokouhi + github: dshokouhi + +Zac West: + name: Zac West + github: zacwest + +Klaas Schoute: + name: Klaas Schoute + github: klaasnicolaas 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..8a83d5cc3741 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,14 @@ _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/). +## Adding a person to Home Assistant + +If you have administrator rights, you can [add a person to Home Assistant](/integrations/person/#adding-a-person-to-home-assistant) and create them a user account. + +## 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..16405ff6d981 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,11 +52,9 @@ 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 @@ -105,10 +103,8 @@ Try logging out, then logging in again. You will be asked for the six-digit one- 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..e44f4f8ea629 100644 --- a/source/_docs/automation/action.markdown +++ b/source/_docs/automation/action.markdown @@ -3,7 +3,9 @@ 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 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). 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. diff --git a/source/_docs/automation/basics.markdown b/source/_docs/automation/basics.markdown index 2815c6340e76..8a2d4ceb2ef5 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 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/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..5e53c3e88bc8 100644 --- a/source/_docs/automation/troubleshooting.markdown +++ b/source/_docs/automation/troubleshooting.markdown @@ -19,7 +19,7 @@ Testing with complex triggers, conditions, and variables can be difficult. Note ### 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. 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/backend/database.markdown b/source/_docs/backend/database.markdown index f16cf2a2553a..743d26c0ed87 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`: 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..b0204772d13b 100644 --- a/source/_docs/blueprint/selectors.markdown +++ b/source/_docs/blueprint/selectors.markdown @@ -283,6 +283,10 @@ The output of this selector is the name of the selected network storage. It may also be the value `/backup`, if the user chooses to use the local data disk option instead of one of the configured network storage locations. +```yaml +backup_location: +``` + ## Boolean selector The boolean selector shows a toggle that allows the user to turn on or off @@ -1365,7 +1369,7 @@ entity: required: false {% endconfiguration %} -<div class='note'> +{% important %} Targets are meant to be used with the `target` property of a service call in a script sequence. For example: @@ -1376,7 +1380,7 @@ action: target: !input lights ``` -</div> +{% endimportant %} ### Example target selectors <!-- omit from toc --> @@ -1528,4 +1532,4 @@ The output of this selector is a list of triggers. For example: - platform: numeric_state entity_id: "sensor.outside_temperature" below: 20 -``` \ No newline at end of file +``` diff --git a/source/_docs/blueprint/tutorial.markdown b/source/_docs/blueprint/tutorial.markdown index 6f988e5465cf..3ba49f9a325e 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 @@ -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 f93267df57b9..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.'> @@ -68,6 +70,12 @@ To set up file access, follow the steps for your [installation method](/installa - {% 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 After changing configuration or automation files, you can check if the configuration is valid. A configuration check is also applied automatically when you reload the configuration or when you restart Home Assistant. @@ -83,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..791dabc77834 100644 --- a/source/_docs/configuration/basic.markdown +++ b/source/_docs/configuration/basic.markdown @@ -19,7 +19,13 @@ The general settings described here are managed by the [Home Assistant Core inte 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..30548a0aeb0a 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. 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 727e2f7ccf77..0380c51caae2 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -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 %} @@ -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,13 +1114,28 @@ Some examples: {% endraw %} -</div> +{% endnote %} ### String filters - Filter `urlencode` will convert an object to a percent-encoded ASCII text string (e.g., for HTTP requests using `application/x-www-form-urlencoded`). - Filter `slugify(separator="_")` will convert a given string into a "slug". - Filter `ordinal` will convert an integer into a number defining a position in a series (e.g., `1st`, `2nd`, `3rd`, `4th`, etc). +- Filter `value | base64_decode` Decodes a base 64 string to a string, by default utf-8 encoding is used. +- Filter `value | base64_decode("ascii")` Decodes a base 64 string to a string, using ascii encoding. +- Filter `value | base64_decode(None)` Decodes a base 64 string to raw bytes. + +<div class='note'> + +Some examples: +{% raw %} + +- `{{ "aG9tZWFzc2lzdGFudA==" | base64_decode }}` - renders as `homeassistant` +- `{{ "aG9tZWFzc2lzdGFudA==" | base64_decode(None) }}` - renders as `b'homeassistant'` + +{% endraw %} + +</div> ### Regular expressions @@ -1247,7 +1262,7 @@ The [MQTT integration](/integrations/mqtt/) relies heavily on templates. Templat 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: @@ -1261,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. -<div class='note'> +{% note %} Example command template: @@ -1281,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 3320902fbb7a..a0f5b80e7d5f 100644 --- a/source/_docs/frontend.markdown +++ b/source/_docs/frontend.markdown @@ -28,7 +28,7 @@ To learn how to create and style your own dashboards, refer to the following top 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/filtering) +- [Filtering](/docs/organizing/tables) ## User- or browser-dependent settings, general settings diff --git a/source/_docs/frontend/icons.markdown b/source/_docs/frontend/icons.markdown index ed95d33b1469..3a50a1823678 100644 --- a/source/_docs/frontend/icons.markdown +++ b/source/_docs/frontend/icons.markdown @@ -32,11 +32,9 @@ The most common way you can find icons is by using the icon picker built right i <img src='/images/screenshots/icon-picker.png' alt='Icon Picker in Home Assistant' /> </p> -<div class='note info'> - - 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> +{% 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 %} For more detailed steps on customizing entities, including their icon, refer to [customizing entities](/docs/configuration/customizing-devices/). @@ -48,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 diff --git a/source/_docs/organizing.markdown b/source/_docs/organizing.markdown index 5091baaac10a..a7574f85df59 100644 --- a/source/_docs/organizing.markdown +++ b/source/_docs/organizing.markdown @@ -12,14 +12,16 @@ 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). - -| Taxonomy | Automation target | Entity can have multiple | -| -------- | ----------------- | ------------------------ | -| Area | ✅ | ❌ | -| Floor | ✅ | ❌ | -| Label | ✅ | ✅ | -| Category | ❌ | ❌ | +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 | +| -------- | -------------------------------- | -------------------------------- | +| Area | {% icon "openmoji:check-mark" %} | {% icon "openmoji:cross-mark" %} | +| Floor | {% icon "openmoji:check-mark" %} | {% icon "openmoji:cross-mark" %} | +| Label | {% icon "openmoji:check-mark" %} | {% icon "openmoji:check-mark" %} | +| Category | {% icon "openmoji:cross-mark" %} | {% icon "openmoji:cross-mark" %} | ## Area diff --git a/source/_docs/organizing/areas.markdown b/source/_docs/organizing/areas.markdown index 6af4f1434ba7..eaa6d032f582 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 a service call. 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 @@ -42,7 +44,7 @@ Follow these steps to create a new area from the **Areas** view. If an area has not yet been assigned to a floor, it is shown in the **Unassigned areas** section. Follow these steps to assign an area to a floor. 1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %} and select **Create area**. -2. On the area card, select the pencil icon. +2. On the area card, select the edit {% icon "mdi:edit" %} button. 3. In the dialog, select the floor and add labels, if you like. ## Assigning an area to multiple items @@ -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) @@ -62,7 +64,7 @@ You can assign an area to multiple items at once in the automation, scene, scrip Follow these steps to edit an area. -1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %} and on the area card, select the pencil icon. +1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %} and on the area card, select the edit {% icon "mdi:edit" %} button. 2. In the dialog, adjust the area details you want to change: - Edit the area **Name**. - Add an icon (We use [Material icons](https://pictogrammers.com/library/mdi/)). diff --git a/source/_docs/organizing/categories.markdown b/source/_docs/organizing/categories.markdown index 261332fbc02c..3fd569de1ab8 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,11 +31,11 @@ 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: - - Select the <img height="28px" src="/images/organizing/multiselect_icon.png" alt="Multiselect icon"/> button. + - Select the multi-select {% icon "mdi:order-checkbox-ascending" %} button. - From the list, select all the items to which you want to apply a category. - In the top right corner, select **Move to category**. - Then, select the category from the list. 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..8722042a6a35 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 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. ## Creating a label @@ -36,20 +38,20 @@ Follow these steps to apply a label 1. To apply a label to an area: - Go to {% my areas title="**Settings** > **Areas, labels & zones**" %}. - - On the area card, select the pencil icon. + - On the area card, select the edit {% icon "mdi:edit" %} button. - 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. - - Select the <img height="28px" src="/images/organizing/multiselect_icon.png" alt="Multiselect icon"/> button. + - Select the {% icon "mdi:order-checkbox-ascending" %} 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. - - Select the <img height="28px" src="/images/organizing/multiselect_icon.png" alt="Multiselect icon"/> button. + - Select the {% icon "mdi:order-checkbox-ascending" %} 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,7 +59,7 @@ 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. @@ -66,8 +68,8 @@ If you used this label in automations or script as targets, you need to adjust t 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. -2. Select the <img height="28px" src="/images/organizing/multiselect_icon.png" alt="Multiselect icon"/> button. +2. Select the {% icon "mdi:order-checkbox-ascending" %} 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 78% rename from source/_docs/organizing/filtering.markdown rename to source/_docs/organizing/tables.markdown index d8fa65532d75..ce2cd40852f9 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/ @@ -20,7 +20,7 @@ When working with tables, you can select multiple items to apply an action. If y ## Selecting multiple items in a table -1. In your table, select the <img height="28px" src="/images/organizing/multiselect_icon.png" alt="Multiselect icon"/> button. +1. In your table, select the {% icon "mdi:order-checkbox-ascending" %} button. ![Screenshots point out the enable selection mode button in the toolbar of the tables in Home Assistant](/images/blog/2024-04/enable-selection-mode.png) @@ -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/editor.markdown b/source/_docs/scene/editor.markdown index cf9ff0fc4f4b..38653989c71e 100644 --- a/source/_docs/scene/editor.markdown +++ b/source/_docs/scene/editor.markdown @@ -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..5ec95991b326 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. @@ -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 @@ -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: 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..6450ab0bf7b1 100644 --- a/source/_docs/scripts/service-calls.markdown +++ b/source/_docs/scripts/service-calls.markdown @@ -9,9 +9,9 @@ The configuration options to call a configuration are the same between all integ 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'> +{% tip %} Use the "Services" tab under Developer Tools to discover available services. -</div> +{% endtip %} ### The basics @@ -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'> +{% important %} Which data fields can be used in a service call depends on the type of notification service that is used. -</div> +{% endimportant %} {% raw %} diff --git a/source/_docs/tools/quick-bar.markdown b/source/_docs/tools/quick-bar.markdown index ba73ba75a75e..ae4c666b1821 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 diff --git a/source/_docs/troubleshooting.markdown b/source/_docs/troubleshooting.markdown deleted file mode 100644 index a6a0d70ec538..000000000000 --- a/source/_docs/troubleshooting.markdown +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Troubleshooting installation problems" -description: "Common installation problems and their solutions." ---- - -It can happen that you run into trouble while installing Home Assistant. This page is here to help you solve the most common problems. - -#### pip3: command not found - -This utility should have been installed as part of the Python installation. Check if Python is installed by running `python3 --version`. If it is not installed, [download it here](https://www.python.org/getit/). - -If you are able to successfully run `python3 --version` but not `pip3`, install Home Assistant by running the following command instead: - -```bash -python3 -m pip install homeassistant -``` - -On a Debian system, you can also install python3 by `sudo apt-get install python3`, and pip3 by `sudo apt-get install python3-pip`. - -#### No module named pip - -[Pip](https://pip.pypa.io/en/stable/) should come bundled with the latest Python 3 but is omitted by some distributions. If you are unable to run `python3 -m pip --version` you can install `pip` by [downloading the installer](https://bootstrap.pypa.io/get-pip.py) and running it with Python 3: - -```bash -python3 get-pip.py -``` - -#### No access to the frontend - -In newer Linux distributions the access to a host is very limited. This means that you can't access the Home Assistant frontend that is running on a host outside of the host machine. - -To fix this you will need to open your machine's firewall for TCP traffic to port 8123. The method for doing this will vary depending on your operating system and the firewall you have installed. Below are some suggestions to try. Google is your friend here. - -For UFW systems (Ubuntu, Debian, Raspberry Pi OS, etc.): - -```bash -sudo ufw allow 8123/tcp -``` - -For `iptables` systems (was the default for older distributions): - -```bash -iptables -I INPUT -p tcp --dport 8123 -j ACCEPT -iptables-save > /etc/network/iptables.rules # your rules may be saved elsewhere -``` - -### System freezes - -On small systems (such as a Pi2), not directly supported by binaries (Python Wheels) you may run out of memory. -Upon the first run or after an upgrade, Home Assistant uses a lot of resources to (re)compile all the integrations. -If you run out of memory and/or swap memory, your system will freeze. -Increasing swap memory can help: - -```bash -sudo dphys-swapfile swapoff -sudo nano /etc/dphys-swapfile -``` - -Modify the line the sets the swapfile size. Set it equal to your memory or double your current setting: `CONF_SWAPSIZE = 925` then: - -```bash -sudo dphys-swapfile swapon -sudo systemctl restart dphys-swapfile.service -``` diff --git a/source/_docs/troubleshooting_general.markdown b/source/_docs/troubleshooting_general.markdown index 81bdf45a2914..07139cc1a304 100644 --- a/source/_docs/troubleshooting_general.markdown +++ b/source/_docs/troubleshooting_general.markdown @@ -53,7 +53,7 @@ Typically, updates are shown at the top of the **Settings** page. If you don't s ### Resolution -1. On the **System** page, in the top-right corner, select the three dots menu and select **Check for updates**. +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, then set **Visible** to active. + - 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..0ebaef121829 100644 --- a/source/_docs/z-wave/controllers.markdown +++ b/source/_docs/z-wave/controllers.markdown @@ -7,22 +7,43 @@ 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. +The firmwares of 700 and 800 series Z-Wave controllers have several bugs which impact the stability of the mesh and can cause the controller to become unresponsive. Because there is no known firmware version that is completely fixed, it is recommended to choose a firmware based on the following criteria: -Users should upgrade the firmware on all 700 series controllers to version 7.17.2 or greater. Firmware can be upgraded using the below directions: +- 700 series: + - prefer SDK versions 7.17.2 to 7.18.x + - SDK versions 7.19.x are okay + - avoid SDK versions before 7.17.2 + - avoid SDK versions 7.20 to 7.21.3 + +- 800 series + - prefer SDK versions 7.22.x + - SDK versions 7.17.2 to 7.19.x are okay + - avoid SDK versions before 7.17.2 + - avoid SDK versions 7.20 to 7.21.3 + +{% note %} +The SDK version does not have to match the firmware version. If you are unsure which SDK versions a firmware is based on, contact the manufacturer of your device. +{% endnote %} + +{% important %} +You should upgrade the firmware on all 700 and 800 series controllers to a recommended version. +{% endimportant %} + +Firmware can be upgraded using the below directions: - [Upgrade instructions using Linux](https://github.com/kpine/zwave-js-server-docker/wiki/700-series-Controller-Firmware-Updates-(Linux)) - [Upgrade instructions using Windows (Aeotec)](https://aeotec.freshdesk.com/support/solutions/articles/6000252296-update-z-stick-7-with-windows) - [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) + - Z-Wave.Me Z-Station - HomeSeer SmartStick G8 + - Zooz 800 Series Z-Wave Long Range S2 Stick (ZST39 LR) - 700 series controllers - Aeotec Z-Stick 7 USB stick (ZWA010) (the EU version is not recommended due to RF performance issues) @@ -50,9 +71,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 +92,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,33 +146,27 @@ 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 This procedure has been tested with the following modules: - - Aeotec Z-Pi 7 Raspberry Pi HAT/Shield - - Z-Wave.Me RaZberry 7 - - Z-Wave.Me RaZberry 7 Pro +- Aeotec Z-Pi 7 Raspberry Pi HAT/Shield +- Z-Wave.Me RaZberry 7 +- Z-Wave.Me RaZberry 7 Pro -1. Make sure the module is properly seated on the Home Assistant Yellow. +1. Make sure the module is properly seated on the Home Assistant Yellow. ![Aeotec Z-Pi 7 on Home Assistant Yellow](/images/docs/z-wave/zpi-7-yellow.jpg). 2. Carefully [close the case](https://yellow.home-assistant.io/guides/add-ssd-existing-installation/#reassembling-top-part) and power up Home Assistant Yellow. 3. Follow the procedure on [setting up a Z-Wave JS server](/integrations/zwave_js/#setting-up-a-z-wave-js-server). 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 bfa5374d231e..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, cards %}</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..4711a2941dc6 --- /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/ 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> + {% 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/ Service calls %}</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-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> + {% 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..dd8a3652facb 100644 --- a/source/_includes/asides/getting_started_navigation.html +++ b/source/_includes/asides/getting_started_navigation.html @@ -1,24 +1,35 @@ -<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> + <li>{% active_link /installation/troubleshooting/ Troubleshooting %}</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 3c3fdc9c9234..da16646999d3 100644 --- a/source/_includes/asides/help_navigation.html +++ b/source/_includes/asides/help_navigation.html @@ -1,12 +1,12 @@ <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> 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..bb2ec5ddbe7f 100644 --- a/source/_includes/blog/post/article.html +++ b/source/_includes/blog/post/article.html @@ -1,16 +1,16 @@ <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 %} <div class="meta clearfix"> - {% include blog/post/date.html %}{{ time }} {% include post/author.html %} + {% include blog/post/date.html %}{{ time }} {% include blog/post/tags.html %} {% if page.comments != false and post.comments != false %} <a class='comments' 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..2dd8a4e8d2ba 100644 --- a/source/_includes/common-tasks/backups.md +++ b/source/_includes/common-tasks/backups.md @@ -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). diff --git a/source/_includes/common-tasks/beta_version.md b/source/_includes/common-tasks/beta_version.md index 378a0859c24b..f1dbf69adb2a 100644 --- a/source/_includes/common-tasks/beta_version.md +++ b/source/_includes/common-tasks/beta_version.md @@ -15,10 +15,10 @@ If you would like to test next release before anyone else, you can install the b 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 menu and select **Check for updates**. + - 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, then set **Visible** to active. + - 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 862918031073..ab6ddbcc311d 100644 --- a/source/_includes/common-tasks/data_disk.md +++ b/source/_includes/common-tasks/data_disk.md @@ -6,23 +6,17 @@ 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 @@ -72,7 +64,7 @@ This can be an option if the following elements apply to your use case: - You already have a functioning Home Assistant instance (system 1) that is using an external data disk. - You have another, new, Home Assistant instance (system 2). -- You want now want to use the data disk of system 1 on system 2 instead. +- You now want to use the data disk of system 1 on system 2 instead. The aim is to migrate the data from system 1 to system 2. One way to do this is by [restoring a backup](/common-tasks/os/#restoring-a-backup). The other way is to move the data disk. This can be an interesting option if you have a large amount of data on your external disk or if your external disk has more storage capacity than your new 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..819b21f5fac2 100644 --- a/source/_includes/common-tasks/define_custom_polling.md +++ b/source/_includes/common-tasks/define_custom_polling.md @@ -5,7 +5,7 @@ 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. +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. 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/third-party-addons.md b/source/_includes/common-tasks/third-party-addons.md index d2b6c3732033..6dbb01599fa7 100644 --- a/source/_includes/common-tasks/third-party-addons.md +++ b/source/_includes/common-tasks/third-party-addons.md @@ -1,25 +1,33 @@ -## Installing third-party add-ons +## Installing a third-party add-on repository -Home Assistant allows anyone to create add-on repositories to share their add-ons easily. To try this locally, you can use our example add-on repository at +Home Assistant allows anyone to create an add-on repository to share their own add-ons with the community. -```text -https://github.com/home-assistant/hassio-addons-example -``` - -<div class='note warning'> +{% warning %} Home Assistant cannot guarantee the quality or security of third-party add-ons. Use at your own risk. -</div> +{% endwarning %} + +To add an add-on repository, follow these steps: + +1. Copy the URL of the repository. + - The URL is the git repository clone URL (on GitHub, use the Code button and copy the HTTPS URL). + - This documentation uses an example add-on repository. It is not practically useful but follows the same steps. + - If you are interested in add-on development, refer to our [add-on development documentation](https://developers.home-assistant.io/docs/add-ons). -<p class='img'> -<img src='/images/hassio/screenshots/dashboard.png' /> -From {% my supervisor title="Settings > Add-ons" %} open the add-on store. -</p> + ```text + https://github.com/home-assistant/hassio-addons-example + ``` +2. Go to {% my supervisor title="**Settings** > **Add-ons**" %} and select **Add-on store**. + ![Screenshot of the add-on store](/images/getting-started/add-ons.png) +3. In the top-right corner, select the three dots {% icon "mdi:dots-vertical" %} menu, and select **Repositories**. +4. Add the URL of the repository and select **Add**. + ![Screenshot of the add-on store](/images/hassio/screenshots/adding_repositories.png) + - **Result**: A new card for the repository will appear. + ![Screenshot of the add-on store](/images/hassio/screenshots/add-ons-community_example.png) -<p class='img'> -<img src='/images/hassio/screenshots/adding_repositories.png' /> -Add the URL of the repository and then press "Add". A new card for the repository will appear. -</p> +### Troubleshooting: Repository is not showing up -### Help: Repository is not showing up +If you have added an add-on repository, but it's not showing up, make sure to refresh your browser. If it still doesn't show up, the add-on repository may contain invalid configuration data. -If you have added a repository, but it's not showing up, it means that the repository contains invalid configuration. Go to {% my logs title="Settings > System > Logs" %} to find the System log. It should tell you what went wrong. Report this information to the repository author. +1. Go to {% my logs title="**Settings** > **System** > **Logs**" %} and select Supervisor in the top right corner to get the Supervisor log. + - It should tell you what went wrong. +2. Report this information to the add-on repository author. diff --git a/source/_includes/common-tasks/update.md b/source/_includes/common-tasks/update.md index a04a0e286c1f..6d5c7087ade0 100644 --- a/source/_includes/common-tasks/update.md +++ b/source/_includes/common-tasks/update.md @@ -21,10 +21,10 @@ To update Home Assistant Core when you run Home Assistant {{ page.installation_n 2. Navigate to the **Settings** panel. 3. On the top you will be presented with an update notification. - **Troubleshooting**: If you do not see that notification: - - In the top right corner, select the three dots menu and select **Check for updates**. - - Go to {% my updates title="**System** > **Updates**" %}. + - 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, then set **Visible** to active. + - 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..a3f3f9e08f47 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='/installation/' 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 +</p> diff --git a/source/_includes/dashboard/edit_dashboard.md b/source/_includes/dashboard/edit_dashboard.md index 0e5d9dd0bb1a..1053b8b3cdf8 100644 --- a/source/_includes/dashboard/edit_dashboard.md +++ b/source/_includes/dashboard/edit_dashboard.md @@ -4,9 +4,9 @@ To add the {{ title | downcase }} to your user interface: -1. In the top right of the screen, select the pencil icon. +1. In the top right of the screen, select the edit {% icon "mdi:edit" %} button. - 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 7963a76c9bb9..c19dc49391cd 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**. If you want to use add-ons, you need to use another installation method. The recommended method is {% term "Home Assistant Operating System" %}. Checkout the [overview table of installation types](https://www.home-assistant.io/installation/#advanced-installation-methods) to see the differences. +{% 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 @@ -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: 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/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..c75bb03c2e88 100644 --- a/source/_includes/post/author.html +++ b/source/_includes/post/author.html @@ -5,4 +5,13 @@ {% else %} {% assign author = site.author %} {% endif %} -{% if author %}<span class="byline author vcard"><i class='icon-user'></i> {{ author }}</span>{% endif %} +{% if author %} + {% assign person = site.data.people[author] %} + {% if person %} + <span class="byline author vcard" + <a href="https://github.com/{{ person.github }}" target="_blank"><img class="author-avatar" src="https://avatars.githubusercontent.com/{{ person.github }}?size=64" alt="{{ person.name }}"/> {{ person.name }}</a> + </span> + {% else %} + <span class="byline author vcard">{% icon "mdi:person" %} {{ author }}</span> + {% endif %} +{% 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..b0ef872724a3 --- /dev/null +++ b/source/_includes/site/vertical_nav.html @@ -0,0 +1,48 @@ +{% 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 %} + {% else %} + {% if doc == 'categories' %} + {% include asides/categories.html %} + {% elsif root == 'blog' %} + {% include post/sharing.html %} + {% include asides/recent_posts.html posts='5' %} + {% else %} + {% include post/sharing.html %} + {% endif %} + {% endif %} +{% endif %} 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..656c268afc61 100644 --- a/source/_integrations/adguard.markdown +++ b/source/_integrations/adguard.markdown @@ -53,10 +53,10 @@ 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 diff --git a/source/_integrations/aftership.markdown b/source/_integrations/aftership.markdown index ad71021b6b99..847373c567c2 100644 --- a/source/_integrations/aftership.markdown +++ b/source/_integrations/aftership.markdown @@ -20,9 +20,9 @@ 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 %} @@ -45,6 +45,6 @@ AfterShip removed the Tracking API functionality from the Forever Free plan, and | `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..2b4131e19bd5 100644 --- a/source/_integrations/agent_dvr.markdown +++ b/source/_integrations/agent_dvr.markdown @@ -22,9 +22,9 @@ 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 diff --git a/source/_integrations/airgradient.markdown b/source/_integrations/airgradient.markdown index e44ed718703d..e843a783f00d 100644 --- a/source/_integrations/airgradient.markdown +++ b/source/_integrations/airgradient.markdown @@ -12,18 +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'> - +{% 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 %} @@ -47,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/aladdin_connect.markdown b/source/_integrations/aladdin_connect.markdown deleted file mode 100644 index 3a9c957c5cf4..000000000000 --- a/source/_integrations/aladdin_connect.markdown +++ /dev/null @@ -1,32 +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 %} - -## Troubleshooting -If you see the below attached screen instead of the login page, please ensure that your -{% term "`configuration.yaml`" %} file includes either a [`default_config:`](/integrations/default_config/) or [`cloud:`](/integrations/cloud/) section. - -![OAuth Error Screen](/images/integrations/aladdin_connect/oauth-screenshot.png) diff --git a/source/_integrations/alarm_control_panel.ifttt.markdown b/source/_integrations/alarm_control_panel.ifttt.markdown index 609a4358de42..6f79d20bfe3a 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,11 +79,11 @@ 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 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..cbc5bc4614fc 100644 --- a/source/_integrations/alarmdecoder.markdown +++ b/source/_integrations/alarmdecoder.markdown @@ -109,11 +109,9 @@ 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'> - +{% 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> +{% endnote %} ### Examples @@ -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.smart_home.markdown b/source/_integrations/alexa.smart_home.markdown index ee92110be1d6..0a23bc96f837 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: @@ -148,7 +148,7 @@ The first thing you need to do after signing into the [AWS console](https://cons Next you need create a Lambda function. - Click `Services` in top navigation bar, expand the menu to display all AWS services, then under `Compute` section click `Lambda` to navigate to Lambda console. Or you may use this [link](https://console.aws.amazon.com/lambda/home) -- **IMPORTANT - Alexa Skills are only supported in certain AWS regions** Your current server location will be displayed on the top right corner (for example, Ohio), make sure you select the server closest to your location / region based on your Amazon account's country, whilst also ensuring that it is within one of the supported regions for Alexa Skills otherwise this will not work! +- **IMPORTANT - Alexa Skills are only supported in certain AWS regions.** Your current server location will be displayed in the top-right corner (for example, Ohio). Select an available server below that is closest to your location and in your region, based on your Amazon account’s country. Alexa Lambda functions created on other servers will not work properly and may prevent account linking! - **US East (N.Virginia)** region for English (US) or English (CA) skills - **EU (Ireland)** region for English (UK), English (IN), German (DE), Spanish (ES) or French (FR) skills - **US West (Oregon)** region for Japanese and English (AU) skills. @@ -244,9 +244,14 @@ 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> + {% note %} + Despite the Alexa documentation's disclaimer, however, [Let's Encrypt](https://letsencrypt.org/) certificates are still accepted. + {% endnote %} + +{% 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 +457,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 +484,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 @@ -594,11 +597,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 +728,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 +811,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 +942,9 @@ 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 %} ### Scene @@ -1007,9 +1006,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/alpha_vantage.markdown b/source/_integrations/alpha_vantage.markdown index 7f836a4522c4..32dbeefc073d 100644 --- a/source/_integrations/alpha_vantage.markdown +++ b/source/_integrations/alpha_vantage.markdown @@ -79,7 +79,7 @@ foreign_exchange: ## API information -Alpha Vantage offers two tiers of the API key, one free and one paid for. If you are using the free version, you will be limited to twenty-five queries per day. The sensor polls every 5 minutes, so you will only get data for the first two hours per day. +Alpha Vantage offers two tiers of the API key, one free and one paid for. If you are using the free version, you will be limited to twenty-five queries per day. The sensor polls every 5 minutes, so you will only get data for the first two hours per day. This can be configured using the `scan_interval` variable. The paid version starts at 75 queries per minute, increasing ticker quantity quite a bit. diff --git a/source/_integrations/amazon_polly.markdown b/source/_integrations/amazon_polly.markdown index 3a323c98755f..1bf7d2274547 100644 --- a/source/_integrations/amazon_polly.markdown +++ b/source/_integrations/amazon_polly.markdown @@ -9,6 +9,8 @@ ha_iot_class: Cloud Push ha_platforms: - tts ha_integration_type: integration +ha_codeowners: + - '@jschlyter' related: - docs: /docs/configuration/ title: Configuration file 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 d91224a91adf..0373de442fbd 100644 --- a/source/_integrations/androidtv.markdown +++ b/source/_integrations/androidtv.markdown @@ -3,6 +3,7 @@ title: Android Debug Bridge description: Instructions on how to integrate Android and Fire TV devices into Home Assistant. ha_category: - Media player + - Remote ha_release: 0.7.6 ha_config_flow: true ha_iot_class: Local Polling @@ -13,16 +14,15 @@ ha_domain: androidtv ha_platforms: - diagnostics - media_player + - remote 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 @@ -64,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. @@ -86,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. @@ -112,6 +106,10 @@ 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. +## 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. + ## Services ### `media_player.select_source` @@ -243,3 +241,99 @@ The solution to this problem is the `state_detection_rules` configuration parame - `'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. + +## 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. + +{% details "Full keycodes list" %} + +**Power Keys** +Key|Description +---|----------- +"POWER"|Power toggle +"SLEEP"|Sleep mode +"RESUME"|Resume +"SUSPEND"|Suspend mode +"WAKEUP"|Wake up +____________ + +**Input Keys** +Key|Description +---|----------- +"COMPONENT1"|Component 1 +"COMPONENT2"|Component 2 +"COMPOSITE1"|Composite 1 +"COMPOSITE2"|Composite 2 +"HDMI1"|HDMI output port 1 +"HDMI2"|HDMI output port 2 +"HDMI3"|HDMI output port 3 +"HDMI4"|HDMI output port 4 +"INPUT"|Change input +"SAT"|Satellite +"VGA"|VGA +_____________ + +**Volume Keys** +Key|Description +---|----------- +"VOLUME_DOWN"|Volume down +"VOLUME_UP"|Volume up +"MUTE"|Volume mute +________________ + +**Color Keys** +Key|Description +---|----------- +"BLUE"|Blue +"GREEN"Green +"YELLOW"|Yellow +"RED"|Red +_____________ + +**Other Keys** +Key|Description +---|----------- +"BACK"|Back +"CENTER"|Center +"DOWN"|Down +"END"|End +"ENTER"|Enter +"ESCAPE"|Escape +"FAST_FORWARD"|Fast forward +"HOME"|Home +"LEFT"|Left +"MENU"|Menu +"MOVE_HOME"|Move home +"PAIRING"|Pairing +"REWIND"|Rewind +"RIGHT"|Right +"SEARCH"|Search +"SETTINGS"|Settings +"SYSDOWN"|Sysdown +"SYSLEFT"|Sysleft +"SYSRIGHT"|Sysright +"SYSUP"|Sysup +"TEXT"|Text +"TOP"|Top +"UP"|Up + +{% enddetails %} + +You can also send other Android keys using the syntax `input keyevent {key}`, replacing `{key}` with the Android numeric key event. Refer to [Android TV KeyEvent](https://developer.android.com/reference/android/view/KeyEvent) for details. + +**Example to send sequence of commands:** + +```yaml +service: remote.send_command +target: + device_id: 12345f9b4c9863e28ddd52c87dcebe05 +data: + command: + - MENU + - RIGHT + - UP + - UP + - ENTER + +``` diff --git a/source/_integrations/androidtv_remote.markdown b/source/_integrations/androidtv_remote.markdown index 3c8e69fb7a28..f4ca07be6eb9 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 service %}, 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 @@ -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/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/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/aprilaire.markdown b/source/_integrations/aprilaire.markdown index 0b3d47c4233c..f9ac89bcb342 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,16 @@ ha_codeowners: ha_config_flow: true ha_platforms: - climate + - 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 +30,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 13ec8c3e80bd..3df7389c7c9c 100644 --- a/source/_integrations/apsystems.markdown +++ b/source/_integrations/apsystems.markdown @@ -8,6 +8,7 @@ ha_category: - Energy ha_domain: apsystems ha_platforms: + - number - sensor ha_integration_type: device ha_codeowners: @@ -15,13 +16,17 @@ ha_codeowners: - '@SonnenladenGmbH' --- -The **APsystems** {% term integration %} allows you to read the data from your [APsystems EZ1](https://emea.apsystems.com/diy/ez1/) microinverter. +The **APsystems** {% term integration %} allows you to read the data from your [APsystems EZ1](https://emea.apsystems.com/diy/ez1/) microinverter. It also allows you to set the output limit to any number between 30 and 800 watts. The following data is provided by the integration: - Lifetime production (Per input and in total) - Current production (Per input and in total) - Today's production (Per input and in total) +The following data can be set by the integration: + +- Maximal output in watts + ## Prerequisites Make sure the local API is activated and set to **Continuously**. For that, connect to the inverter via Bluetooth using the app and go to **Settings** > **Local Mode**, set the switch **Enable Local Mode** to on and make sure to set this to **Continuously**. diff --git a/source/_integrations/aquacell.markdown b/source/_integrations/aquacell.markdown new file mode 100644 index 000000000000..edd0ea9f44ea --- /dev/null +++ b/source/_integrations/aquacell.markdown @@ -0,0 +1,37 @@ +--- +title: Aquacell +description: Instructions on how to integrate AquaCell with Home Assistant. +ha_category: + - Sensor +ha_release: 2024.7 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_codeowners: + - '@Jordi1990' +ha_domain: aquacell +ha_platforms: + - sensor +ha_integration_type: device +--- + +AquaCell is a water-softening device. The **AquaCell** {% term integration %} allows you to monitor your AquaCell device in Home Assistant. +You will need your Aquacell account information as used in the **AquaCell** app. + +{% include integrations/config_flow.md %} + +<div class='note warning'> +This integration only works with <b>AquaCell</b> devices which have an <b>i-Lid</b> and are configured through the 'Mijn AquaCell' mobile app. +</div> + +## Sensors + +This integration provides {% term sensors %} for the following information from the AquaCell device: + +- Percentage of salt remaining. +- Time remaining until 0% salt level is reached. +- iLid battery level. +- Wi-Fi signal strength. + +<div class="note"> +The device does not update frequently, the integration polls the information once a day from the cloud. +</div> 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..96ed0bdf2973 100644 --- a/source/_integrations/atag.markdown +++ b/source/_integrations/atag.markdown @@ -57,10 +57,10 @@ This integration supports the following services (see [Climate](/integrations/cl - `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..d32e3ffd9911 100644 --- a/source/_integrations/august.markdown +++ b/source/_integrations/august.markdown @@ -58,9 +58,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 diff --git a/source/_integrations/aws.markdown b/source/_integrations/aws.markdown index a2edad54af17..9682f1b4be52 100644 --- a/source/_integrations/aws.markdown +++ b/source/_integrations/aws.markdown @@ -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". 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 10834c229a11..39013b176e7b 100644 --- a/source/_integrations/azure_devops.markdown +++ b/source/_integrations/azure_devops.markdown @@ -23,4 +23,14 @@ Azure DevOps instance in Home Assistant. This integration provides a sensor for Azure DevOps: -- Latest build - This includes attributes with additional info about the build. +- Latest build - The build number of the latest build. +- Latest build id - The ID of the latest build. +- Latest build reason - The reason the build was triggered. +- Latest build result - The build result. +- Latest build source branch - The source git branch. +- Latest build source version - This is the version i.e. the tag if set, or the commit. +- Latest build status - The build status. +- 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. 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..4cf22321a513 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 @@ -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/bang_olufsen.markdown b/source/_integrations/bang_olufsen.markdown index ddb939932e79..4cf90fa4ef72 100644 --- a/source/_integrations/bang_olufsen.markdown +++ b/source/_integrations/bang_olufsen.markdown @@ -52,7 +52,7 @@ Device model: ### play_media services -The Bang & Olufsen integration supports different playback types in the `media_player.play_media` service: playback from URL, activating a favourite, playback from a local file, playing a radio station, activating a Deezer flow and Deezer playlists, albums, and tracks. +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. #### play_media examples @@ -150,6 +150,101 @@ data: media_content_id: 1234567890 ``` +Playing a Tidal playlist. Optionally define starting position for the playlist: + +```yaml +service: media_player.play_media +target: + entity_id: media_player.beosound_balance_12345678 +data: + media_content_type: tidal + media_content_id: playlist:01234567-89ab-cdfe-0123-456789abcdef + extra: + start_from: 123 +``` + +Playing a Tidal album. Optionally define starting position for the album: + +```yaml +service: media_player.play_media +target: + entity_id: media_player.beosound_balance_12345678 +data: + media_content_type: tidal + media_content_id: album:123456789 + extra: + start_from: 123 +``` + +Playing a Tidal track: + +```yaml +service: media_player.play_media +target: + entity_id: media_player.beosound_balance_12345678 +data: + media_content_type: tidal + media_content_id: 123456789 +``` + +##### Overlay + +Interrupts currently playing media to play an audio message. + +To use the Bang & Olufsen Cloud TTS, use `overlay_tts` as the `media_content_type` and enter a message into the `media_content_id` field. +Bang & Olufsen Cloud TTS messages are limited to 100 unique messages a day and are cached for 24 hours. + +Extra keys available: + +| Service 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. | +| `overlay_tts_language` | yes | Specify the language used for text-to-speech. Uses the BCP 47 standard. Default value is "en-us". | + +###### Examples: + +Playing a local file with an absolute volume as an overlay: + +```yaml +service: media_player.play_media +target: + entity_id: media_player.beosound_balance_12345678 +data: + media_content_type: music + media_content_id: media-source://media_source/local/doorbell.mp3 + announce: true + extra: + overlay_absolute_volume: 60 +``` + +Playing a Bang & Olufsen Cloud TTS message with an offset volume (as TTS messages can be quiet): + +```yaml +service: media_player.play_media +target: + entity_id: media_player.beosound_balance_12345678 +data: + media_content_type: overlay_tts + media_content_id: This is a test + announce: true + extra: + overlay_offset_volume: 10 +``` + +Playing a Bang & Olufsen Cloud TTS message with a local language: +```yaml +service: media_player.play_media +target: + entity_id: media_player.beosound_balance_12345678 +data: + media_content_type: overlay_tts + media_content_id: Dette er en test + announce: true + extra: + overlay_tts_language: da-dk +``` + ## Automations WebSocket notifications received from the device are fired as events in Home Assistant. These can be received by listening to `bang_olufsen_websocket_event` event types, where `device_id` or `serial_number` can be used to differentiate devices. @@ -159,3 +254,6 @@ WebSocket notifications received from the device are fired as events in Home Ass To find Deezer playlist, album URIs, and user IDs for Deezer flows, the Deezer website has to be accessed. When navigating to an album, the URL will look something like: <https://www.deezer.com/en/album/ALBUM_ID>, and this needs to be converted to: `album:ALBUM_ID` and the same applies to playlists, which have the format: `playlist:PLAYLIST_ID`. Additionally a Deezer user ID can be found at <https://www.deezer.com/en/profile/USER_ID> by selecting the active user in a web browser. + +### Getting Tidal URIs +Tidal playlists, album URIs and track IDs are available via the Tidal website. When navigating to an album, the URL will look something like <https://listen.tidal.com/album/ALBUM_ID/>, and this needs to be converted to `album:ALBUM_ID`. The same applies to playlists, which have the format `playlist:PLAYLIST_ID`. Individual tracks can be found by sharing the track and selecting the `Copy track link` method, which should yield a link of the format <https://tidal.com/browse/track/TRACK_ID?u>, this can be played by extracting the track id `TRACK_ID`. diff --git a/source/_integrations/bayesian.markdown b/source/_integrations/bayesian.markdown index 66efb3fb525d..2bcab49f8597 100644 --- a/source/_integrations/bayesian.markdown +++ b/source/_integrations/bayesian.markdown @@ -48,7 +48,9 @@ To enable the Bayesian sensor, add the following lines to your {% term "`configu # Example configuration.yaml entry binary_sensor: - platform: bayesian - prior: 0.1 + name: "Kitchen Occupied" + prior: 0.3 + probability_threshold: 0.5 observations: - entity_id: "switch.kitchen_lights" prob_given_true: 0.6 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/binary_sensor.rest.markdown b/source/_integrations/binary_sensor.rest.markdown index dbf2c7e9cc24..1d6eef7f6a95 100644 --- a/source/_integrations/binary_sensor.rest.markdown +++ b/source/_integrations/binary_sensor.rest.markdown @@ -19,6 +19,9 @@ _Tip:_ If you want to create multiple `sensors` using the same endpoint, use the The JSON messages can contain different values like `1`, `"1"`, `TRUE`, `true`, `on`, or `open`. If the value is nested then use a [template](/docs/configuration/templating/#processing-incoming-data). +If the endpoint returns XML with the `text/xml`, `application/xml`, or +`application/xhtml+xml` content type, it will automatically be converted +to JSON according to this [specification](https://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html). ```json { 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..4b606d2cde83 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 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/bmw_connected_drive.markdown b/source/_integrations/bmw_connected_drive.markdown index 06a9f7ae834c..c3319f624729 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,11 +59,9 @@ 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: @@ -122,18 +120,14 @@ 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 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. +{% endwarning %} -</div> +{% 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. +{% endnote %} ## Selects diff --git a/source/_integrations/broadlink.markdown b/source/_integrations/broadlink.markdown index ffd66c4926fe..51b6cbbf8f37 100644 --- a/source/_integrations/broadlink.markdown +++ b/source/_integrations/broadlink.markdown @@ -29,7 +29,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` 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/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.mqtt.markdown b/source/_integrations/button.mqtt.markdown index e3393dc32296..1fb48e1e8932 100644 --- a/source/_integrations/button.mqtt.markdown +++ b/source/_integrations/button.mqtt.markdown @@ -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..ac89bbdc5e0c 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. diff --git a/source/_integrations/calendar.markdown b/source/_integrations/calendar.markdown index 231c3f6c5e18..a3f4b24f9bc5 100644 --- a/source/_integrations/calendar.markdown +++ b/source/_integrations/calendar.markdown @@ -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: @@ -204,11 +202,9 @@ with calendar events within a date range. It can return events from multiple cal | `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 diff --git a/source/_integrations/cast.markdown b/source/_integrations/cast.markdown index 2a880e2b4abf..01695310d541 100644 --- a/source/_integrations/cast.markdown +++ b/source/_integrations/cast.markdown @@ -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) 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..a82a52773f19 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: diff --git a/source/_integrations/climate.markdown b/source/_integrations/climate.markdown index b49e08ac8209..66ea3f0e5576 100644 --- a/source/_integrations/climate.markdown +++ b/source/_integrations/climate.markdown @@ -21,11 +21,9 @@ The **Climate** {% term integration %} allows you to control and monitor HVAC (h 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` -<div class='note'> - +{% tip %} Not all climate {% term services %} may be available for your platform. You can check which climate services are available under **Developer Tools** -> **Services**. - -</div> +{% endtip %} ### Service `climate.set_aux_heat` diff --git a/source/_integrations/color_extractor.markdown b/source/_integrations/color_extractor.markdown index 211fa90d800b..6f5a2382b3d8 100644 --- a/source/_integrations/color_extractor.markdown +++ b/source/_integrations/color_extractor.markdown @@ -28,11 +28,9 @@ 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 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..4e2c2050c100 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: @@ -373,7 +371,7 @@ command_line: ``` {% endraw%} -<div class='note'> +{% note %} A note on `name` for `cover` and `switch`: @@ -381,17 +379,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. @@ -691,9 +689,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 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/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..c7d9b50124dd 100644 --- a/source/_integrations/cover.template.markdown +++ b/source/_integrations/cover.template.markdown @@ -3,10 +3,19 @@ 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 @@ -70,7 +79,7 @@ cover: required: false type: template availability_template: - description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison not case sensitive; `"TrUe"` and `"yEs"` are allowed. + description: Defines a template to get the `available` state of the entity. If the template either fails to render or returns `True`, `"1"`, `"true"`, `"yes"`, `"on"`, `"enable"`, or a non-zero number, the entity will be `available`. If the template returns any other value, the entity will be `unavailable`. If not configured, the entity will always be `available`. Note that the string comparison is not case sensitive; `"TrUe"` and `"yEs"` are allowed. required: false type: template default: true 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..410fa24874aa 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,7 +61,7 @@ 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 @@ -76,13 +76,13 @@ The `daikin` climate platform integrates Daikin air conditioning systems into Ho 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/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 df62d531ab67..5db24e5c0298 100644 --- a/source/_integrations/denonavr.markdown +++ b/source/_integrations/denonavr.markdown @@ -81,6 +81,7 @@ Known supported devices: - Marantz AV7704 - Marantz AV8802A - Marantz CINEMA 50 +- Marantz CINEMA 60 - Marantz CINEMA 70s - Marantz M-CR510 - Marantz M-CR511 @@ -115,9 +116,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 %} @@ -165,11 +166,11 @@ To use these commands, call the `denonavr.get_command` service and append the sp 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. -</div> +{% endtip %} #### Service `denonavr.set_dynamic_eq` diff --git a/source/_integrations/devialet.markdown b/source/_integrations/devialet.markdown index 077ee62441e6..110bd38060a6 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 %} diff --git a/source/_integrations/device_tracker.markdown b/source/_integrations/device_tracker.markdown index d43b7dc7bc00..0d54b76ee60a 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 | | --------------- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 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..ad572ac4f7d0 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 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/discord.markdown b/source/_integrations/discord.markdown index f5e2c9476f09..efac386d101f 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'> - +{% 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> +{% endnote %} ### Setting up the bot 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/dnsip.markdown b/source/_integrations/dnsip.markdown index 832d3d7859f0..d19bf7b5c81e 100644 --- a/source/_integrations/dnsip.markdown +++ b/source/_integrations/dnsip.markdown @@ -25,5 +25,7 @@ The **DNS IP** {% term integration %} will expose an IP address, fetched via DNS {% configuration_basic %} Resolver: - description: "You may override the default nameservers that are being used by setting any nameserver you like." + description: "You may override the default IPV4 and IPV6 nameservers that are being used by setting any nameserver IP address you like, for example `1.1.1.1` (IPV4) or `2606:4700:4700::1111` (IPV6)." +Port: + description: "You may override the default DNS port of `53`. This may be useful to bypass DNS filtering or redirection." {% endconfiguration_basic %} diff --git a/source/_integrations/doorbird.markdown b/source/_integrations/doorbird.markdown index a530813955a1..8899e03bbf52 100644 --- a/source/_integrations/doorbird.markdown +++ b/source/_integrations/doorbird.markdown @@ -50,9 +50,9 @@ Event names will be prefixed by `doorbird_devicename`. For example, the example See [Automation Example](#automation-example) section below for details on how to use the event names in an automation. -<div class="note info"> +{% important %} Events will not be received in Home Assistant until a schedule is defined via the DoorBird app. -</div> +{% endimportant %} ### Clearing registered events @@ -77,9 +77,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 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/drop_connect.markdown b/source/_integrations/drop_connect.markdown index d1994cc4b79e..e402289fa5f8 100644 --- a/source/_integrations/drop_connect.markdown +++ b/source/_integrations/drop_connect.markdown @@ -60,8 +60,6 @@ Assistant. {% 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..420dde2b9bdb 100644 --- a/source/_integrations/dsmr.markdown +++ b/source/_integrations/dsmr.markdown @@ -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). @@ -44,9 +44,9 @@ To configure options for DSMR integration go to **Settings** -> **Devices & Serv 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 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..a86987926766 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 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..0f9fc6f4cc7d 100755 --- a/source/_integrations/dynalite.markdown +++ b/source/_integrations/dynalite.markdown @@ -60,11 +60,11 @@ The initial process can be a bit time consuming and tedious, but it only has to 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 | | ---------------------- | -------- | ----------------------------------------------------------------------------------------- | @@ -76,11 +76,11 @@ This does not return the area preset. It sends a network command asking the area 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 | | ---------------------- | -------- | ----------------------------------------------------------------------------------------- | diff --git a/source/_integrations/eafm.md b/source/_integrations/eafm.md index 2bd773d5ccf8..d3dda12da5bd 100644 --- a/source/_integrations/eafm.md +++ b/source/_integrations/eafm.md @@ -12,11 +12,11 @@ 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 diff --git a/source/_integrations/ecobee.markdown b/source/_integrations/ecobee.markdown index c71d87898e7b..f816b0b143e8 100644 --- a/source/_integrations/ecobee.markdown +++ b/source/_integrations/ecobee.markdown @@ -35,9 +35,11 @@ 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'> -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> +{% 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. + +In the meantime, you can use the [HomeKit Device](/integrations/homekit_controller/) integration as a fully functional alternative. +{% 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.) @@ -124,7 +126,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 diff --git a/source/_integrations/ecovacs.markdown b/source/_integrations/ecovacs.markdown index a8b7b579ec3a..293d95b3902b 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' @@ -140,6 +139,54 @@ Alternatively, you can use the `ecovacs_error` event to watch for errors. This e Finally, if a vacuum becomes unavailable (usually due to being idle and off its charger long enough for it to completely power off,) the vacuum's `status` attribute will change to `offline` until it is turned back on. +### Getting device and chargers coordinates + +The integration has a `raw_get_positions` service to retrieve device and chargers coordinates. + +Example: + +```yaml +service: ecovacs.raw_get_positions +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: + +```yaml +vacuum.deebot_n8_plus: + ret: ok + resp: + header: + pri: 1 + tzm: 480 + ts: "1717748487712" + ver: 0.0.1 + fwVer: 1.2.0 + hwVer: 0.1.1 + body: + code: 0 + msg: ok + data: + deebotPos: + x: 1 + y: 5 + a: 85 + invalid: 0 + chargePos: + - x: 5 + y: 9 + a: 85 + t: 1 + invalid: 0 + mid: "200465850" + id: 5o81 + payloadType: j +``` + +{% enddetails %} + ## Self-hosted configuration Depending on your setup of the self-hosted instance, you can connect to the server using the following settings: diff --git a/source/_integrations/ecowitt.markdown b/source/_integrations/ecowitt.markdown index d56a1c778c11..3c548ad78d84 100644 --- a/source/_integrations/ecowitt.markdown +++ b/source/_integrations/ecowitt.markdown @@ -4,6 +4,7 @@ description: Instructions on how to integrate Ecowitt Weather Station within Hom ha_category: - Binary sensor - Sensor + - Weather ha_release: 2022.9 ha_iot_class: Local Push ha_domain: ecowitt 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/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/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..309e5123711d 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 @@ -93,7 +101,7 @@ The default polling interval is 60 seconds. To customize the polling interval, r ## 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/esphome.markdown b/source/_integrations/esphome.markdown index dda362e5ab80..1586fb31627e 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 --- 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/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..b2ef4308b102 100644 --- a/source/_integrations/fan.markdown +++ b/source/_integrations/fan.markdown @@ -22,11 +22,11 @@ The fan integration allows you to control and monitor fan devices. Available services: `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**. -</div> +{% endnote %} ### Service `fan.set_percentage` 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..12d154426ff4 100644 --- a/source/_integrations/fan.template.markdown +++ b/source/_integrations/fan.template.markdown @@ -3,10 +3,19 @@ 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 diff --git a/source/_integrations/fastdotcom.markdown b/source/_integrations/fastdotcom.markdown index dd8d9b5fb59d..541b0bdf727b 100644 --- a/source/_integrations/fastdotcom.markdown +++ b/source/_integrations/fastdotcom.markdown @@ -20,12 +20,10 @@ 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. diff --git a/source/_integrations/feedreader.markdown b/source/_integrations/feedreader.markdown index 9ef96296dd7f..ad6216e31e06 100644 --- a/source/_integrations/feedreader.markdown +++ b/source/_integrations/feedreader.markdown @@ -6,6 +6,7 @@ ha_category: ha_release: 0.18 ha_iot_class: Cloud Polling ha_domain: feedreader +ha_config_flow: true ha_integration_type: integration related: - docs: /docs/configuration/ @@ -14,48 +15,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.: diff --git a/source/_integrations/ffmpeg_motion.markdown b/source/_integrations/ffmpeg_motion.markdown index 6a7481666e26..4e9e286dd183 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`. -</div> +{% endnote %} ## Motion diff --git a/source/_integrations/ffmpeg_noise.markdown b/source/_integrations/ffmpeg_noise.markdown index dcc2d43bdd6e..7ce51100996b 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`. -</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/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/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/flux.markdown b/source/_integrations/flux.markdown index 85a7e405881e..5610acc184cd 100644 --- a/source/_integrations/flux.markdown +++ b/source/_integrations/flux.markdown @@ -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/forecast_solar.markdown b/source/_integrations/forecast_solar.markdown index cd02101c586d..e1b3ad222faf 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 diff --git a/source/_integrations/foscam.markdown b/source/_integrations/foscam.markdown index 54abf407e3b0..2256a39b1a23 100644 --- a/source/_integrations/foscam.markdown +++ b/source/_integrations/foscam.markdown @@ -18,9 +18,9 @@ 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 diff --git a/source/_integrations/free_mobile.markdown b/source/_integrations/free_mobile.markdown index 0a5f30e9fbad..a84c839d721f 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 diff --git a/source/_integrations/freebox.markdown b/source/_integrations/freebox.markdown index 12263bcceca1..95e02bfa79c7 100644 --- a/source/_integrations/freebox.markdown +++ b/source/_integrations/freebox.markdown @@ -45,19 +45,19 @@ 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. diff --git a/source/_integrations/fritz.markdown b/source/_integrations/fritz.markdown index 85f8b91ee070..46986bea29f8 100644 --- a/source/_integrations/fritz.markdown +++ b/source/_integrations/fritz.markdown @@ -42,9 +42,9 @@ 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 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/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..9e4504bfd73c 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,9 +69,22 @@ 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: + +- Camera (the camera only works in Fully Kiosk if the **Motion detection** is set to **On**). + +The following is available as image entity: + +- Screenshot + +The following notify entities that can be passed to `notify.send_message` service 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 %} ## Services 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..33fcf5956df9 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 @@ -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/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..039cf3d5dc34 100644 --- a/source/_integrations/github.markdown +++ b/source/_integrations/github.markdown @@ -116,12 +116,10 @@ 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"> - +{% 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> +{% endnote %} ### Notify new releases 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..8d5407dc6da2 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" %} @@ -88,11 +86,9 @@ You can use the service `google.create_event` to create a new calendar event in {% details "Create Event Service details" %} -<div class='note'> - +{% 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: @@ -107,11 +103,9 @@ 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`. - -</div> +{% endimportant %} This is a full example of service call in YAML: @@ -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..f3d1b6f2804f 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 diff --git a/source/_integrations/google_assistant_sdk.markdown b/source/_integrations/google_assistant_sdk.markdown index 750bba81ba8e..08a2182410d5 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 diff --git a/source/_integrations/google_generative_ai_conversation.markdown b/source/_integrations/google_generative_ai_conversation.markdown index 2cc8115013ce..74f77d515918 100644 --- a/source/_integrations/google_generative_ai_conversation.markdown +++ b/source/_integrations/google_generative_ai_conversation.markdown @@ -92,11 +92,9 @@ The tutorial is using OpenAI, but this could also be done with the Google Genera ### Service `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 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. +{% 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. 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_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..90df5a2270a7 100644 --- a/source/_integrations/google_translate.markdown +++ b/source/_integrations/google_translate.markdown @@ -131,11 +131,9 @@ data: ## Service say (legacy) -<div class='note'> - +{% tip %} 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> +{% endtip %} 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. diff --git a/source/_integrations/gree.markdown b/source/_integrations/gree.markdown index 7db402cdc3ba..0ad1b2b4492e 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 @@ -39,6 +39,7 @@ Any Gree Smart device working with the Gree+ app should be supported, including - Tadiran - Heiwa - Ekokai +- Lessar ## Climate @@ -51,9 +52,9 @@ The `gree` climate platform integrates Gree HVAC systems into Home Assistant, en - [`swing mode`](/integrations/climate#service-climateset_swing_mode) - [`set_preset_mode`](/integrations/climate#service-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..ee8bca181be1 100644 --- a/source/_integrations/group.markdown +++ b/source/_integrations/group.markdown @@ -400,11 +400,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: diff --git a/source/_integrations/harmony.markdown b/source/_integrations/harmony.markdown index efe32137376f..f6587389b56f 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 --- 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..a9821ae15dad 100644 --- a/source/_integrations/hdmi_cec.markdown +++ b/source/_integrations/hdmi_cec.markdown @@ -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 diff --git a/source/_integrations/heos.markdown b/source/_integrations/heos.markdown index 84abe6d82c10..3272570aead0 100644 --- a/source/_integrations/heos.markdown +++ b/source/_integrations/heos.markdown @@ -26,9 +26,9 @@ 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 @@ -37,8 +37,10 @@ A connection to a single device enables control for all devices on the network. 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: ```yaml -username: "example@example.com" -password: "password" +service: heos.sign_in +data: + username: "example@example.com" + password: "password" ``` | Service data attribute | Optional | Description | @@ -57,9 +59,11 @@ Use the sign-out service to sign the connected controller out of a HEOS account. You can play a HEOS favorite by number or name with the `media_player.play_media` service. Example service 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 | @@ -73,9 +77,11 @@ media_content_id: "1" You can play a HEOS playlist with the `media_player.play_media` service. Example service 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 | @@ -89,9 +95,11 @@ media_content_id: "Awesome Music" You can play a HEOS Quick Select by number or name with the `media_player.play_media` service. Example service 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 | @@ -105,9 +113,11 @@ media_content_id": "1" 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: ```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 | @@ -121,10 +131,12 @@ media_content_id: "http://path.to/stream.mp3" 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. ```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 | @@ -137,6 +149,12 @@ group_members: For removing a HEOS player from a group you can use the `media_player.unjoin` service. +```yaml +service: media_player.unjoin +data: + entity_id: media_player.office +``` + | Service 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 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..ce2f169057ba 100644 --- a/source/_integrations/history_stats.markdown +++ b/source/_integrations/history_stats.markdown @@ -18,7 +18,7 @@ related: The **History stats** {% term integration %} provides quick statistics about another integration or platforms, using data from the [`history`](/integrations/history/) integration. -It can track how long the {% term integration %} has been in a specific state, in a custom time period. +It can track how long an {% term entity %} has been in a specific state, in a custom time period. Examples of what you can track: @@ -84,13 +84,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 +131,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 +249,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..92e1509f6b94 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. diff --git a/source/_integrations/homeassistant.markdown b/source/_integrations/homeassistant.markdown index 0bbbd06d500a..dae857da4658 100644 --- a/source/_integrations/homeassistant.markdown +++ b/source/_integrations/homeassistant.markdown @@ -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: diff --git a/source/_integrations/homekit.markdown b/source/_integrations/homekit.markdown index 4d090c329950..2f69ea1d14cb 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 %} @@ -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 @@ -430,8 +428,8 @@ 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. | diff --git a/source/_integrations/homekit_controller.markdown b/source/_integrations/homekit_controller.markdown index 958bf36cbb51..ac1156de2928 100644 --- a/source/_integrations/homekit_controller.markdown +++ b/source/_integrations/homekit_controller.markdown @@ -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..d1e1599ca384 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. 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/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..1ce3f7b4e23c 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 diff --git a/source/_integrations/http.markdown b/source/_integrations/http.markdown index 9ad3a7149242..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 @@ -150,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 @@ -174,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. @@ -259,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/hue.markdown b/source/_integrations/hue.markdown index f115aab7b048..c268e8dc16f5 100644 --- a/source/_integrations/hue.markdown +++ b/source/_integrations/hue.markdown @@ -67,11 +67,9 @@ You can use this service for example if you'd like to start/stop Dynamic Mode. 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 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..28c8d0ad570b 100644 --- a/source/_integrations/humidifier.markdown +++ b/source/_integrations/humidifier.markdown @@ -43,11 +43,9 @@ The following device classes are supported for humidifiers: Available services: `humidifier.set_mode`, `humidifier.set_humidity`, `humidifier.turn_on`, `humidifier.turn_off`, `humidifier.toggle` -<div class='note'> - +{% tip %} 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/). - -</div> +{% endtip %} ### Service `humidifier.set_mode` 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..8b3494adde1a 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"> +{% 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. [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 18af31743490..b08f6d683ad0 100644 --- a/source/_integrations/husqvarna_automower.markdown +++ b/source/_integrations/husqvarna_automower.markdown @@ -3,6 +3,7 @@ title: Husqvarna Automower description: Instructions on how to integrate Husqvarna Automower lawn mowers into Home Assistant. ha_category: - Binary sensor + - Button - Device tracker - Lawn Mower - Number @@ -16,6 +17,7 @@ ha_codeowners: - '@Thomas55555' ha_platforms: - binary_sensor + - button - device_tracker - diagnostics - lawn_mower @@ -103,6 +105,10 @@ The integration will create the following binary sensors: - Returning to dock *The mower is on its way home to the charging station.* +### Button (if available) + +The integration will create a button entity for confirming minor mower errors. This entity is disabled by default. You have to enable it manually. The API can't detect if the mower has the capability to confirm minor errors remotely. Before enabling this function, refer to the mower documentation. + ### Device tracker (if available) The integration will create a device tracker entity to show the position of the mower. @@ -147,13 +153,35 @@ The integration will create the following sensors: - Total drive distance - Total running time - Total searching time +- Work area (if available). For example: *My lawn*, *Front lawn*, *Back lawn* ### 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) +## Services -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 services: + +### Override schedule + +With this service, 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..677ffec21893 100644 --- a/source/_integrations/hydrawise.markdown +++ b/source/_integrations/hydrawise.markdown @@ -12,6 +12,7 @@ ha_iot_class: Cloud Polling ha_domain: hydrawise ha_codeowners: - '@dknowles2' + - '@thomaskistler' - '@ptcryan' ha_platforms: - binary_sensor @@ -41,21 +42,25 @@ There is currently support for the following device types within Home Assistant: Binary sensor entities are created for the controller: - Cloud API availability +- Rain sensor moisture detection (if a rain sensor is attached to the controller) -<div class='note warning'> -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> - -Binary sensor entities are created for each zone: +Binary sensor entities are created for each irrigation zone: - Running status ## Sensor -Sensor entities are added to each zone: +Sensor entities are created for the controller: + +- Daily total water use (if a flow sensor is attached to the controller) +- Daily active water use (if a flow sensor is attached to the controller) +- Daily inactive water use (if a flow sensor is attached to the controller) + +Sensor entities are created for each irrigation zone: - Timestamp for the next scheduled automatic watering cycle -- Remaining time for the current watering cycle +- Remaining time (in minutes) for the current watering cycle +- Daily active water use for the zone (if a flow sensor is attached to the irrigation zone) ## Switch @@ -70,6 +75,6 @@ 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 %} 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..c38486af1be1 100644 --- a/source/_integrations/icloud.markdown +++ b/source/_integrations/icloud.markdown @@ -28,17 +28,19 @@ It does require that your devices are registered with the [Find My](https://www. {% include integrations/config_flow.md %} -<div class='note warning'> -You may receive an email and a notification from Apple saying that someone has logged into your account. +{% warning %} +You may receive recurring emails and notifications from Apple stating that someone has logged into your account if the integration is improperly configured. If this occurs, select `Don't Allow` on your iOS device and reconfigure the Integration Credentials when prompted. 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. ## Two Factor Authentication -If two-step authentication is enabled for your iCloud account, some time after Home Assistant startup the integration will ask to enter the verification code you receive on your device via a notification in the Home Assistant UI. The duration of this authentication is determined by Apple, so you will need to verify your account every now and then. +{% important %} +You need to use an [app-specific password](https://support.apple.com/102654) to set up this integration. +{% endimportant %} ## In case of troubleshooting 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..fa4bbc3b6640 100644 --- a/source/_integrations/ifttt.markdown +++ b/source/_integrations/ifttt.markdown @@ -66,9 +66,9 @@ 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 a service 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 diff --git a/source/_integrations/imap.markdown b/source/_integrations/imap.markdown index 0e10b7ea74f0..844b022aa5ba 100644 --- a/source/_integrations/imap.markdown +++ b/source/_integrations/imap.markdown @@ -62,12 +62,9 @@ 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) @@ -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 %} @@ -196,11 +185,9 @@ Available services are: - `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'> - +{% caution %} 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> +{% endcaution %} ## Example - post-processing diff --git a/source/_integrations/incomfort.markdown b/source/_integrations/incomfort.markdown index f6183a1b9ad3..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 @@ -17,9 +17,7 @@ ha_platforms: - sensor - water_heater ha_integration_type: integration -related: - - docs: /docs/configuration/ - title: Configuration file +ha_config_flow: true --- The `incomfort` {% term integration %} links Home Assistant with your Intergas Lan2RF gateway, including the boiler and any room thermostats attached to it. @@ -38,50 +36,10 @@ In addition, there is a **Sensor** for each of CV pressure, CV temperature, and Any room thermostats (there can be 0, 1 or 2) are represented as **Climate** devices. They will report the thermostat's `temperature` (setpoint, target temperature) and `current_temperature` and the setpoint can be changed. -## Configuration - -To set up this integration, add one of the following to your {% term "`configuration.yaml`" %} file. -{% include integrations/restart_ha_after_config_inclusion.md %} +{% include integrations/config_flow.md %} The hub does not have to be in the same network as HA, but must be reachable via port 80/HTTP. -### Older gateways - -Older gateways do not require user authentication: - -```yaml -# Example configuration.yaml entry, older firmware with no user credentials -incomfort: - host: IP_ADDRESS -``` - -### Newer gateways - -Alternatively, if a **username** & **password** is printed on the back of the gateway: - -```yaml -# Example configuration.yaml entry, newer firmware with user credentials -incomfort: - host: IP_ADDRESS - username: USERNAME - password: PASSWORD -``` - -{% configuration %} -host: - description: The hostname/IP address of the Lan2RF gateway. - required: true - type: string -username: - description: "The username of the Lan2RF gateway, if any. Most likely: `admin`." - required: inclusive - type: string -password: - description: "The password of the Lan2RF gateway, if any. Most likely: `intergas`." - required: inclusive - type: string -{% endconfiguration %} - ## Automation To send an alert if the CV pressure is too low or too high, consider the following example: 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_select.markdown b/source/_integrations/input_select.markdown index 442636fda928..7db599b4f188 100644 --- a/source/_integrations/input_select.markdown +++ b/source/_integrations/input_select.markdown @@ -63,11 +63,9 @@ 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 diff --git a/source/_integrations/insteon.markdown b/source/_integrations/insteon.markdown index 193dca0801c7..4197d1f52f4b 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. @@ -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 @@ -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 7bf9d3e400a7..1c40f629d0aa 100644 --- a/source/_integrations/integration.markdown +++ b/source/_integrations/integration.markdown @@ -22,10 +22,8 @@ This integrations provides the [Riemann sum](https://en.wikipedia.org/wiki/Riema of the values provided by a source sensor. The Riemann sum is an approximation of an **integral** by a finite sum. -The integration sensors are updated upon changes of the **source**. Fast -sampling source sensors provide more accurate results. In this implementation, the -default is the Trapezoidal method, but Left and Right methods can optionally -be used. +The integration sensors are updated whenever the source changes and, optionally, based on a predefined +time interval. Source sensors with higher sampling frequency provide more accurate results. {% include integrations/config_flow.md %} {% configuration_basic %} @@ -41,6 +39,9 @@ Metric prefix: description: Metric unit to prefix the integration result. Integration time: description: SI unit of time to integrate over. +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. + {% endconfiguration_basic %} @@ -91,17 +92,20 @@ method: required: false type: string default: trapezoidal +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 %} -In case you expect that your source sensor will provide several subsequent values that are equal, you should opt for the `left` method to get accurate readings. - 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. ## Integration method -Riemann Sum is a approximation of an integral by a finite sum and is therefore intrinsically inaccurate, nonetheless, depending on the method used, values can be more or less accurate. +The Riemann Sum is an approximation of an integral by a finite sum and is therefore intrinsically inaccurate. Nonetheless, depending on the method used, values can be more or less accurate. -Regardless of the method used the integration will be more accurate if the source updates more often. If your source is not updated, neither will the Riemann Sum sensor, as all this integration does is calculate the next step in the event of a source update. +The integration method defines how to calculate the area under the source sensor when it changes. Regardless of the method used, the integration will be more accurate if the source updates more often. The config `max_sub_interval` can be used to trigger integration when the source sensor is constant. ### Trapezoidal @@ -128,6 +132,8 @@ sensor: name: energy_spent unit_prefix: k round: 2 + max_sub_interval: + minutes: 5 ``` This configuration will provide you with `sensor.energy_spent` which will have your energy in kWh, as a `device_class` of `energy`. 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/ista_ecotrend.markdown b/source/_integrations/ista_ecotrend.markdown new file mode 100644 index 000000000000..254958515c72 --- /dev/null +++ b/source/_integrations/ista_ecotrend.markdown @@ -0,0 +1,36 @@ +--- +title: ista EcoTrend +description: Instructions on how to integrate ista EcoTrend with Home Assistant. +ha_release: 2024.7 +ha_category: + - Energy +ha_iot_class: Cloud Polling +ha_codeowners: + - '@tr4nt0r' +ha_domain: ista_ecotrend +ha_platforms: + - sensor +ha_config_flow: true +ha_integration_type: integration +--- + +The **ista EcoTrend** {% term integration %} for Home Assistant allows you to import your monthly meter readings from the [ista EcoTrend](https://ecotrend.ista.de) service. + + +{% include integrations/config_flow.md %} + + +## Sensors + +The **ista EcoTrend** integration exposes the last monthly readings as sensors. It provides the following sensors: + +- **Heating**: readings from your heat cost allocators (measured in units) +- **Heating energy**: estimated value in kWh +- **Heating costs**: estimated costs in EUR +- **Hot water**: consumption readings in m³ +- **Hot water energy**: estimated value in kWh +- **Hot water costs**: estimated costs in EUR +- **Water**: consumption readings in m³ +- **Water costs**: estimated costs in EUR + +Not all values may be available in your ista EcoTrend account. Cost estimation is an optional service that has to be booked by your property manager. Therefore, the cost sensors are deactivated by default. 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..198e96fed3f8 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: @@ -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'> - +{% tip %} 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> +{% endtip %} {% raw %} @@ -656,11 +650,9 @@ action: 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'> - +{% 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 @@ -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 @@ -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 diff --git a/source/_integrations/kodi.markdown b/source/_integrations/kodi.markdown index ff019861220f..59172153f6eb 100644 --- a/source/_integrations/kodi.markdown +++ b/source/_integrations/kodi.markdown @@ -220,11 +220,9 @@ 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. - -</div> +{% endimportant %} ### Kodi services samples diff --git a/source/_integrations/konnected.markdown b/source/_integrations/konnected.markdown index 36df0a6f4ed8..82e8ec45ead8 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,11 +41,9 @@ 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 @@ -58,13 +53,11 @@ Starting with 0.106.0 Home Assistant requires UI based configuration of Konnecte 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> +{% 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. 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 4dfa142916f8..279883f2e40f 100644 --- a/source/_integrations/lamarzocco.markdown +++ b/source/_integrations/lamarzocco.markdown @@ -74,7 +74,6 @@ Host: | Switch name | Description | Available for machines | |-------------|-------------| ---------------------- | | Main | Allows to turn machines on-/off | all | -| Auto on/off | Allows to enable/disable the auto on/off schedule | all | | Steam boiler | Allows to enable/disable the steam boiler | all | ## Binary sensors @@ -83,13 +82,14 @@ 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 | Sensor name | Description | Available for machines | Remarks | |-------------|-------------| ---------------------- | ------- | | Current coffee temperature | Current temperature of the coffee boiler | all | - | -| Current steam temperature| Current temperature of the steam boiler | all | - | +| Current steam temperature| Current temperature of the steam boiler | Linea Micra, GS3 AV, GS3 MP | - | | Total coffees made | Counter for total coffees made| all | - | | Total flushes made | Counter for total flushes done | all | - | | Shot timer | Time the current brew is running | all | Only available when the *Host* was set during component configuration. | @@ -107,7 +107,3 @@ Host: |-------------|-------------| ------------------------| ---------------------- | | Prebrew/-infusion mode | Whether to use prebrew, preinfusion, or neither | Disabled, Prebrew, Preinfusion | Linea Micra, Linea Mini, GS3 AV | | Steam level | The level your steam boiler should run at | 1,2,3 | Linea Micra | - -## Calendar - -The integration exposes a calendar for the auto on/off schedule set for the machine. The schedule will be displayed recurringly: If you set the machine to start up on Mondays at 8:00, and shut down at 9:00, you will get events for all Mondays in your calendar. On days when you have the auto on/off feature disabled, you won't get an event in the calendar. Also, if you have the auto on/off feature disabled globally (for example, through the switch "Auto on/off"), there will be no events in the calendar. diff --git a/source/_integrations/lannouncer.markdown b/source/_integrations/lannouncer.markdown index 377f499d6bf7..f099e1451502 100644 --- a/source/_integrations/lannouncer.markdown +++ b/source/_integrations/lannouncer.markdown @@ -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.mqtt.markdown b/source/_integrations/lawn_mower.mqtt.markdown index 315bdc458280..e145f53b1fa0 100644 --- a/source/_integrations/lawn_mower.mqtt.markdown +++ b/source/_integrations/lawn_mower.mqtt.markdown @@ -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..d4fc37af7af9 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 [service calls](#services). +They are ideal to be used in automation scripts or for the `template` platforms. +{% endnote %} ## Configuration @@ -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): @@ -846,10 +835,10 @@ 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` @@ -875,10 +864,10 @@ 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` @@ -898,10 +887,10 @@ 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` 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/light.markdown b/source/_integrations/light.markdown index e79877da7128..45310001d08f 100644 --- a/source/_integrations/light.markdown +++ b/source/_integrations/light.markdown @@ -29,11 +29,9 @@ 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 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> +{% endnote %} ### Service `light.turn_on` @@ -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,11 +97,9 @@ 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. - -</div> +{% endnote %} ### Service `light.turn_off` 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..0555b8c5d586 100644 --- a/source/_integrations/light.template.markdown +++ b/source/_integrations/light.template.markdown @@ -3,10 +3,19 @@ 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 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/lock.mqtt.markdown b/source/_integrations/lock.mqtt.markdown index 862ee9531b5b..48c20b765939 100644 --- a/source/_integrations/lock.mqtt.markdown +++ b/source/_integrations/lock.mqtt.markdown @@ -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 db5153e48f2b..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. @@ -60,6 +69,11 @@ lock: required: false type: template default: true + code_format_template: + description: Defines a template to get the `code_format` attribute of the entity. This template must evaluate to a valid [Python regular expression](https://docs.python.org/3/library/re.html#regular-expression-syntax) or `None`. If it evaluates to a not-`None` value, the user is prompted to enter a code when interacting with the lock. The code will be matched against the regular expression, and only if it matches, the lock/unlock actions will be executed. The actual _validity_ of the entered code must be verified within these actions. If there's a syntax error in the template, the entity will be unavailable. If the template fails to render for other reasons or if the regular expression is invalid, no code will be accepted and the lock/unlock actions will never be invoked. + required: false + type: template + default: None lock: description: Defines an action to run when the lock is locked. required: true @@ -156,3 +170,40 @@ lock: ``` {% endraw %} + +### Lock from switch with dynamic code + +This example shows a lock that copies data from a switch. It needs a PIN code defined as a [secret](/docs/configuration/secrets) to unlock and no code to lock. Note that the actual validity check of the code is part of the `unlock` action and should always happen there or in scripts called from these actions. In this way, you can not only perform code checks against static values, but also dynamic ones (for instance, TOTPs). + +{% raw %} + +```yaml +lock: + - platform: template + name: Garage Door + value_template: "{{ is_state('switch.source', 'on') }}" + code_format_template: "{{ '\\d{4}' if is_state('switch.source', 'on') else None }}" + lock: + - service: switch.turn_on + target: + entity_id: switch.source + unlock: + - variables: + pin: !secret garage_door_pin + - condition: "{{ code == pin }}" + - service: switch.turn_off + target: + entity_id: switch.source +``` + +{% endraw %} + +In `secrets.yaml`: + +{% raw %} + +```yaml +garage_door_pin: "1234" +``` + +{% endraw %} diff --git a/source/_integrations/logbook.markdown b/source/_integrations/logbook.markdown index 9a35e87bf2b2..e283e8bc151b 100644 --- a/source/_integrations/logbook.markdown +++ b/source/_integrations/logbook.markdown @@ -172,14 +172,10 @@ script: ``` -<div class="note warning"> - +{% important %} 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. +{% endimportant %} -</div> - -<div class='note'> - +{% 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/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..5d5d7874025f 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 diff --git a/source/_integrations/lutron_caseta.markdown b/source/_integrations/lutron_caseta.markdown index 4ca57f96e973..73a52dc26874 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. diff --git a/source/_integrations/manual.markdown b/source/_integrations/manual.markdown index eae9dbc2fec6..f80cc1440b7f 100644 --- a/source/_integrations/manual.markdown +++ b/source/_integrations/manual.markdown @@ -72,6 +72,11 @@ disarm_after_trigger: required: false type: boolean default: false +arming_states: + description: Limit the supported arming states. + required: false + type: list + default: armed_away, armed_home, armed_night, armed_vacation, armed_custom_bypass armed_custom_bypass/armed_home/armed_away/armed_night/armed_vacation/disarmed/triggered: description: State specific settings required: false @@ -132,6 +137,7 @@ be used for example to sound the siren for a shorter time during the night. In the configuration example below: +- The only arming states allowed are `armed_away` and `armed_home`. - The `disarmed` state never triggers the alarm. - The `armed_home` state will leave no time to leave the building or disarm the alarm. - The other states will give 30 seconds to leave the building before triggering the alarm, and 20 seconds to disarm the alarm when coming back. @@ -145,6 +151,9 @@ alarm_control_panel: arming_time: 30 delay_time: 20 trigger_time: 4 + arming_states: + - armed_away + - armed_home disarmed: trigger_time: 0 armed_home: 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/matrix.markdown b/source/_integrations/matrix.markdown index a94c3500060c..284debed43b0 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 @@ -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..f5a0ac8ae8b8 100644 --- a/source/_integrations/matter.markdown +++ b/source/_integrations/matter.markdown @@ -8,6 +8,7 @@ ha_category: - Fan - Light - Lock + - Number - Sensor - Switch ha_release: '2022.12' @@ -25,6 +26,7 @@ ha_platforms: - fan - light - lock + - number - sensor - switch ha_integration_type: integration @@ -42,9 +44,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 +82,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 @@ -135,11 +137,13 @@ Make sure you have all these components ready before trying to add a Matter devi - Android: - Have the Android version 8.1 or higher. - Have the latest version of the Home Assistant Companion app, installed from the Play Store (full version). - - If you are using {% term Thread %}: Make sure there is a Thread border router device (Nest Hub (2nd Gen) or Nest Wi-Fi Pro) present in your home network. + - If you are using {% term Thread %}: Make sure there is a Thread border router device (Nest Hub (2nd Gen) or Nest Wi-Fi Pro or Home Assistant with the OpenThread Border Router add-on) present in your home network. + - If you are using OpenThread (for Connect ZBT-1/SkyConnect) as border router, make sure you followed the steps in the [Thread documentation](/integrations/thread#turning-home-assistant-into-a-thread-border-router). - iPhone - Have the iOS version 16 or higher - Have the latest version of the Home Assistant Companion app installed. - - If you are using {% term Thread %}: Make sure there is a Thread border router device (HomePod Mini or V2, Apple TV 4K) present in your home network. + - If you are using {% term Thread %}: Make sure there is a Thread border router device (HomePod Mini or V2, Apple TV 4K or Home Assistant with the OpenThread Border Router add-on) present in your home network. + - If you are using OpenThread (for Connect ZBT-1/SkyConnect) as border router, make sure you followed the steps in the [Thread documentation](/integrations/thread#turning-home-assistant-into-a-thread-border-router). - Make sure the phone is in close range of the border router and your device. - If you are adding a Wi-Fi-based Matter device: Matter devices often use the 2.4 GHz frequency for Wi-Fi. For this reason, make sure your phone is in the same 2.4 GHz network where you want to operate your devices. @@ -182,7 +186,7 @@ This guide describes how to add a new device. This will use the Bluetooth connec - 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. -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. +6. By default, the device gets a factory specified name. To rename it, on the device page, select the pencil {% icon "mdi:edit" %} 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..c5df067d8bcd --- /dev/null +++ b/source/_integrations/mealie.markdown @@ -0,0 +1,40 @@ +--- +title: Mealie +description: Instructions on how to setup Mealie devices in Home Assistant. +ha_category: + - Calendar +ha_config_flow: true +ha_release: 2024.7 +ha_iot_class: Local Polling +ha_codeowners: + - '@joostlek' +ha_domain: mealie +ha_platforms: + - calendar +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 diff --git a/source/_integrations/media_extractor.markdown b/source/_integrations/media_extractor.markdown index 2c4c6e745fed..83551dc7b625 100644 --- a/source/_integrations/media_extractor.markdown +++ b/source/_integrations/media_extractor.markdown @@ -18,9 +18,9 @@ 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 %} diff --git a/source/_integrations/media_source.markdown b/source/_integrations/media_source.markdown index fa6260eabb3e..bf532adeebfa 100644 --- a/source/_integrations/media_source.markdown +++ b/source/_integrations/media_source.markdown @@ -62,13 +62,10 @@ 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 @@ -76,7 +73,7 @@ To play media from a media source via a service call, 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..c3fc8c88b3d3 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. 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..ef286f0ae59f 100644 --- a/source/_integrations/meteo_france.markdown +++ b/source/_integrations/meteo_france.markdown @@ -61,13 +61,13 @@ To enable an entity disabled by default, go in **Settings** -> **Devices & Servi ### 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_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/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/modbus.markdown b/source/_integrations/modbus.markdown index 7beb76bd1d10..4edd69b5b1f9 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 @@ -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). diff --git a/source/_integrations/modern_forms.markdown b/source/_integrations/modern_forms.markdown index 162d4080aa09..8974ce1a6ac2 100644 --- a/source/_integrations/modern_forms.markdown +++ b/source/_integrations/modern_forms.markdown @@ -27,11 +27,9 @@ ha_integration_type: integration {% include integrations/config_flow.md %} -<div class='note'> - +{% note %} If the Modern Forms fan does not have a light unit installed, then the Light entities and services will not show up. - -</div> +{% endnote %} ## Fans @@ -88,8 +86,6 @@ This service will set a sleep timer for the light. When the sleep timer is expir | ---------------------- | -------- | -------------------------------------------------- | | `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/mold_indicator.markdown b/source/_integrations/mold_indicator.markdown index e3ca94b0825d..45b97b01247d 100644 --- a/source/_integrations/mold_indicator.markdown +++ b/source/_integrations/mold_indicator.markdown @@ -15,9 +15,9 @@ related: title: Configuration file --- -The Mold Indicator sensor {% term integration %} consumes information of two temperature sensors and a humidity sensor to give an indication for possible mold growth in your home. In case of bad ventilation and insulation, the indoor humidity may lead to condensation on cold surfaces as the windows or even walls. Condensation or a high relative humidity near those cold surfaces leads to a higher risk for mold growth. This sensor integration estimates the temperature at a pre-calibrated critical point in the room (the coldest surface) and calculates the relative humidity of the air at that point. If the sensor value rises above approximately 70 percent, mold growth might occur and the room should be ventilated. At 100%, the air humidity condensates at the critical point. +The Mold Indicator sensor {% term integration %} uses data from two temperature sensors and a humidity sensor to predict the humidity near a cold surface. High humidity may lead to mold growth at more than ~70% and causes condensation at 100%. -The sensor data may be used e.g., to signal bad air quality (too high air humidity) or to automate operation of indoor air humidifiers to keep the indoor humidity at an optimum. +The sensor data may be used, for example, to detect bad air quality (high humidity) or automate the operation of indoor air humidifiers to keep the indoor humidity at an optimum. ## Configuration @@ -59,9 +59,16 @@ calibration_factor: In this case, the weather forecast temperature sensor is used for the outside temperature. +## Background + +First, this sensor predicts the temperature near the given surface by estimating it from the indoor and outdoor temperatures. The predicted temperature starts with the indoor temperature, then either brings it closer to the outdoor temperature (if the calibration factor is positive, indicating the surface is influenced by the outdoors) or away (if the calibration factor is negative, indicating the surface is inversely correlated with the outdoor temperature). + +From there, the sensor calculates the relative humidity near the given surface based on the dew point. + ## Calibration The Mold Indicator sensor integration needs to be calibrated in order to estimate the temperature at the critical point from the outdoor and indoor temperature. First find the coldest surface in the room (critical point), which is typically near the window frames, but depends on the insulation of your home. For calibration you need to measure the temperature at this critical point and simultaneously write down the values for the indoor- and outdoor temperature sensors used for the Mold Indicator. Be sure that there is a significant indoor to outdoor temperature difference to get the best calibration results. + With the three measured temperatures (in Celsius or Fahrenheit), the calibration_factor for your configuration file is given by: ```text diff --git a/source/_integrations/motion_blinds.markdown b/source/_integrations/motion_blinds.markdown index 1915faa3bd4d..82212010a3e8 100644 --- a/source/_integrations/motion_blinds.markdown +++ b/source/_integrations/motion_blinds.markdown @@ -40,6 +40,7 @@ Additionally the following brands have been reported to also work with this inte - [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) @@ -58,6 +59,8 @@ The following bridges are reported to work with this integration: - Linx Hub - Linx Hub Mini - Linx Hub USB +- SIRO Connect SI7002 +- SIRO Connect SI7005 {% include integrations/config_flow.md %} diff --git a/source/_integrations/motionblinds_ble.markdown b/source/_integrations/motionblinds_ble.markdown index aee84394c9f6..0072c4a0a40f 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,6 +47,11 @@ 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 diff --git a/source/_integrations/mpd.markdown b/source/_integrations/mpd.markdown index be76527d973e..8140f0f7cf72 100644 --- a/source/_integrations/mpd.markdown +++ b/source/_integrations/mpd.markdown @@ -14,40 +14,11 @@ related: title: Configuration file --- -The `mpd` {% term integration %} allows you to control a [Music Player Daemon](https://www.musicpd.org/) from Home Assistant. Unfortunately you will not be able to manipulate the playlist (add or delete songs) or add transitions between the songs. +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. -To add MPD 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: mpd - host: IP_ADDRESS -``` - -{% configuration %} -host: - description: Hostname or IP address of the Host where Music Player Daemon is running. - required: true - type: string -port: - description: Port of the Music Player Daemon. - required: false - type: integer - default: 6600 -name: - description: Name of your Music Player Daemon. - required: false - type: string - default: MPD -password: - description: Password for your Music Player Daemon. - required: false - type: string -{% endconfiguration %} +{% include integrations/config_flow.md %} Example script to load a saved playlist called "DeckMusic" and set the volume: diff --git a/source/_integrations/mqtt.markdown b/source/_integrations/mqtt.markdown index dc0380564248..df9d2de90357 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 @@ -142,24 +140,17 @@ Add the MQTT integration, then provide your broker's hostname (or IP address) an 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,11 +178,9 @@ 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 @@ -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 @@ -1130,14 +1113,9 @@ The MQTT integration will register the service `mqtt.publish` which allows publi | `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 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/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/nam.markdown b/source/_integrations/nam.markdown index dec2f704529b..fcce7ede591e 100644 --- a/source/_integrations/nam.markdown +++ b/source/_integrations/nam.markdown @@ -26,6 +26,7 @@ The integration currently has support for the following sensors: - BMP180 - BMP280 - DHT22 +- DS18B20 - HECA - MH-Z14A - PMSx003 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..5f326db13fc7 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 diff --git a/source/_integrations/neato.markdown b/source/_integrations/neato.markdown index 8afdb03c7054..35d8defa100b 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 @@ -105,12 +103,10 @@ And a specific Platform Service: 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). - -</div> +{% endnote %} | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown index 2568f640bdb9..2abcf8fbc270 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> @@ -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,16 +241,16 @@ 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 @@ -264,14 +260,14 @@ Home Assistant supports all SDM API features. However, every Camera or Doorbell - **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*. -<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,13 +445,13 @@ 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" %}**. diff --git a/source/_integrations/netatmo.markdown b/source/_integrations/netatmo.markdown index d7d58a462e85..c2ae41783cf3 100644 --- a/source/_integrations/netatmo.markdown +++ b/source/_integrations/netatmo.markdown @@ -187,12 +187,10 @@ Service to manually register and unregister the webhook. 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,11 +300,9 @@ 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. diff --git a/source/_integrations/netgear_lte.markdown b/source/_integrations/netgear_lte.markdown index 41970ddd18f6..15fef5916b50 100644 --- a/source/_integrations/netgear_lte.markdown +++ b/source/_integrations/netgear_lte.markdown @@ -29,11 +29,9 @@ 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 %} 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..7b944db0faf6 100644 --- a/source/_integrations/nissan_leaf.markdown +++ b/source/_integrations/nissan_leaf.markdown @@ -21,11 +21,9 @@ 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: 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.mqtt.markdown b/source/_integrations/notify.mqtt.markdown index 9328222e0467..fc6a71e48d49 100644 --- a/source/_integrations/notify.mqtt.markdown +++ b/source/_integrations/notify.mqtt.markdown @@ -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/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.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/onkyo.markdown b/source/_integrations/onkyo.markdown index 35e2f9e588c2..949225d3d0da 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) @@ -50,7 +52,7 @@ max_volume: default: 100 type: integer receiver_max_volume: - description: The maximum volume of the receiver. For older Onkyo receivers this was 80, newer Onkyo receivers use 200. + description: The number of steps it takes for the receiver to go from the lowest to the highest possible volume. Possible values are 50, 80, 100, 200. For older Onkyo receivers, this typically is 80; newer Onkyo receivers use 200. required: false default: 80 type: integer @@ -89,22 +91,6 @@ List of source names: - `xm` - `sirius` -If your source is not listed above, and you want to figure out how to format that source name so you can map its entry, you can use the `onkyo-eiscp` Python module to discover the exact naming needed. First, change your receiver's source to the one that you need to define, and then run: - -```bash -onkyo --host 192.168.0.100 source=query -``` - -If this returns multiple, comma-separated values, use the first one. For example, if `dvd,bd,dvd` is returned, use `dvd`. - -To find your receivers max volume use the onkyo-eiscp Python module set the receiver to its maximum volume -(don't do this whilst playing something!) and run: - -```bash -onkyo --host 192.168.0.100 volume=query -unknown-model: master-volume = 191 -``` - ### Service `onkyo_select_hdmi_output` Changes HDMI output of your receiver diff --git a/source/_integrations/onvif.markdown b/source/_integrations/onvif.markdown index 807735dc891a..523eed5ae543 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 diff --git a/source/_integrations/opentherm_gw.markdown b/source/_integrations/opentherm_gw.markdown index 80e4f954bed2..3f2b3c199785 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 %} @@ -46,13 +46,13 @@ 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`" {% 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 @@ -92,11 +92,9 @@ To return control of the central heating to the thermostat, call the [set_contro | `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. - -</div> +{% endwarning %} ### Service `opentherm_gw.set_clock` @@ -110,9 +108,9 @@ Provide the time and day of week to the OpenTherm Gateway. The value provided he ### Service `opentherm_gw.set_control_setpoint` -<div class='note warning'> +{% caution %} 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> +{% 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. @@ -123,11 +121,9 @@ In a normal situation, the thermostat will calculate and control the central hea | `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. - -</div> +{% endwarning %} ### Service `opentherm_gw.set_hot_water_ovrd` @@ -175,9 +171,9 @@ For a list of possible modes with explanation, see [LED modes](#led-modes) ### Service `opentherm_gw.set_max_modulation` -<div class='note warning'> +{% warning %} Improper use of this service may impair the performance of your central heating system. -</div> +{% 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. @@ -188,11 +184,9 @@ In a normal situation, the thermostat will control the maximum modulation level | `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. - -</div> +{% endwarning %} ### Service `opentherm_gw.set_outside_temperature` @@ -214,12 +208,26 @@ The value you provide here will be used with the GPIO `home` (5) and `away` (6) | `gateway_id` | no | The `gateway_id` as specified during configuration. | | `temperature` | no | The setback temperature. Accepted values are `0.0` through `30.0`. | +### Service `opentherm_gw.send_transparent_command` + +<div class='note warning'> +Improper use of this service may impair the performance of your central heating system. +</div> + +Send a transparent [command](https://otgw.tclcode.com/firmware.html) to the OpenTherm Gateway. + +| Service 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..c373bf43f94d 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,10 +50,10 @@ 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> +{% 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 diff --git a/source/_integrations/openweathermap.markdown b/source/_integrations/openweathermap.markdown index 229eb8726706..5a76e29a9006 100644 --- a/source/_integrations/openweathermap.markdown +++ b/source/_integrations/openweathermap.markdown @@ -45,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 %} @@ -64,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 @@ -97,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/opower.markdown b/source/_integrations/opower.markdown index 663b5bfc7ab1..fddcefc798a8 100644 --- a/source/_integrations/opower.markdown +++ b/source/_integrations/opower.markdown @@ -74,7 +74,9 @@ Alternatively, you can create a new TOTP secret for your account and use the "no ### Exelon subsidiaries -When using Opower with any of the Exelon subsidiaries, such as BGE, ComEd, PECO, Pepco, etc., you need to actively disable two-factor authentication. Log onto the website, select **Don't use 2FA** and **Don't ask me again**. If you have already enabled 2FA, disable it. +When using Opower with any of the Exelon subsidiaries, such as BGE, ComEd, PECO, Pepco, etc., you need to actively disable two-factor authentication. +Before proceeding, make sure you understand the security implications of disabling 2FA. +Log onto the website, select **Don't use 2FA** and **Don't ask me again**. If you have already enabled 2FA, disable it. {% include integrations/config_flow.md %} 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/osoenergy.markdown b/source/_integrations/osoenergy.markdown index e307b4832b00..3ea3a379ce67 100644 --- a/source/_integrations/osoenergy.markdown +++ b/source/_integrations/osoenergy.markdown @@ -55,6 +55,14 @@ The **OSO Energy** integration exposes OSO Energy data as a sensor. It provides - The lower boundary of the V40 Min sensor that can be achieved during normal operation of the water heater. Can vary depending on the type of the heater. - Maximum Level of V40 Min (L) for water heaters. - The upper boundary of the V40 Min sensor that can be achieved during normal operation of the water heater. Can vary depending on the type of the heater. +- Temperature top + - The current measured temperature of the water from the top sensor of the water heater. +- Temperature middle + - The current measured temperature of the water from the middle sensor of the water heater. +- Temperature bottom + - The current measured temperature of the water from the bottom segment of the water heater. +- Temperature one + - The current measured temperature of the water from the one wire sensor of the water heater. ## Water heater diff --git a/source/_integrations/otp.markdown b/source/_integrations/otp.markdown index 9954dedf775a..d6dadccac328 100644 --- a/source/_integrations/otp.markdown +++ b/source/_integrations/otp.markdown @@ -10,6 +10,7 @@ ha_quality_scale: internal ha_domain: otp ha_platforms: - sensor +ha_config_flow: true ha_integration_type: integration related: - docs: /docs/configuration/ @@ -18,29 +19,7 @@ related: The `otp` {% term integration %} generates One-Time Passwords according to [RFC6238](https://tools.ietf.org/html/rfc6238) that is compatible with most OTP generators available, including Google Authenticator. You can use this when building custom security solutions and want to use "rolling codes", that change every 30 seconds. -## Configuration - -To enable the OTP {% term integration %}, 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: otp - token: SHARED_SECRET_TOKEN -``` - -{% configuration %} -name: - description: Name of the sensor to use in the frontend. - required: false - default: OTP Sensor - type: string -token: - description: The shared secret you use in your OTP generator (e.g., Google Authenticator on your phone). - required: true - type: string -{% endconfiguration %} +{% include integrations/config_flow.md %} ## Generating a token @@ -61,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..d81674431142 100644 --- a/source/_integrations/owntracks.markdown +++ b/source/_integrations/owntracks.markdown @@ -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/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..b54c9be32b74 100644 --- a/source/_integrations/persistent_notification.markdown +++ b/source/_integrations/persistent_notification.markdown @@ -114,11 +114,9 @@ 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 diff --git a/source/_integrations/person.markdown b/source/_integrations/person.markdown index ac2de5440e1a..eeedf8c73eb6 100644 --- a/source/_integrations/person.markdown +++ b/source/_integrations/person.markdown @@ -32,6 +32,36 @@ In short, when you're at home, your position is determined first by stationary t You can manage persons {% my people title="via the UI from the person page inside the configuration panel" %} or via `YAML` in your {% term "`configuration.yaml`" %} file. +## Adding a person to Home Assistant + +If you have administrator rights, you can add other persons to Home Assistant and create them a user account. Depending on the rights you give them, they can then use Home Assistant on their own devices, can have their own dashboards, and be used in automations. + +1. Go to {% my people title="**Settings** > **People**" %} and select **Add person**. +2. Enter their **Name**. +3. Add an image if you like. +4. Under **Allow login**, select if they should be able to log in. + - If they cannot log in, they do not get a user account, and they cannot do much with Home Assistant. + - They cannot have their own dashboard, for example. + - But they can still be used for device tracking and show up on a map and be used in automations. +5. If they are able to log in, fill in the user information. + - Check if the user name is correct. A suggestion is made based on the person name. But they do not have to be identical. + - The username is required to log in. + - The person name is the name displayed in the UI. + - Enter a password and store it in a safe location. + - Define if they should have **Local access only**. + - If this is enabled, they won't have access to Home Assistant when they are outside your network, for example from their phone. + - Define if they should have **Administrator** rights. + - Select **Create**. +6. If you have already set up devices for [presence detection](/getting-started/presence-detection/), **select the devices that belong to this person**. + +### Customizing the picture for a person + +You can easily upload a picture in the frontend. Simply click on a person, select or drop an image in the input field, and then crop it. + +<lite-youtube videoid="rOlRnwaaT7Y" videotitle="Changing a profile picture" posterquality="maxresdefault"></lite-youtube> + +See the documentation about [hosting files](/integrations/http/#hosting-files) for more information about the `www` folder. + ## Configuring the `person` integration via the Home Assistant configuration panel This integration is by default enabled, unless you've disabled or removed the [`default_config:`](/integrations/default_config/) line from your configuration. If that is the case, the following example shows you how to enable this integration manually: @@ -90,19 +120,3 @@ person: ``` If you change the YAML, you can reload it by calling the `person.reload` service. - -### Customizing the picture for a person - -You can easily upload a picture in the frontend. Simply click on a person, select or drop an image in the input field, and then crop it. - -<lite-youtube videoid="rOlRnwaaT7Y" videotitle="Changing a profile picture" posterquality="maxresdefault"></lite-youtube> - -You can also do this using YAML. By following the instructions on the [customizing entities](/docs/configuration/customizing-devices#entity_picture) page, you can customize the picture used for a person entity in the `customize:` section of your configuration. For example: - -```yaml -customize: - person.ada: - entity_picture: "/local/ada.jpg" -``` - -See the documentation about [hosting files](/integrations/http/#hosting-files) for more information about the `www` folder. diff --git a/source/_integrations/ping.markdown b/source/_integrations/ping.markdown index 741931d29cc6..4bf4a86344ad 100644 --- a/source/_integrations/ping.markdown +++ b/source/_integrations/ping.markdown @@ -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..c808aca95386 100644 --- a/source/_integrations/plex.markdown +++ b/source/_integrations/plex.markdown @@ -96,11 +96,9 @@ 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 @@ -165,20 +163,16 @@ 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 diff --git a/source/_integrations/plugwise.markdown b/source/_integrations/plugwise.markdown index 2806419855e4..adb07bf2cdde 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) @@ -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` 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/proximity.markdown b/source/_integrations/proximity.markdown index 8bb23da47ff8..54a774f4b44d 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"> -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> +{% note %} +When adding the **Proximity** integration, you are prompted to define the **Tolerance distance**. The tolerance distance must be provided in meters (m) and is used to filter out small GPS coordinate changes (_due to inaccuracies of GPS_) to calculate the direction of travel. +{% 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..5ced1f435298 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,9 +166,10 @@ 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. 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..c0b7597156f8 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 @@ -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/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..849fb33468c4 100644 --- a/source/_integrations/python_script.markdown +++ b/source/_integrations/python_script.markdown @@ -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 @@ -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 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 f58ecddc2ca3..5dcf8ce6c23f 100644 --- a/source/_integrations/rachio.markdown +++ b/source/_integrations/rachio.markdown @@ -37,11 +37,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 %} @@ -83,17 +81,17 @@ Service 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'> +{% note %} The services below only apply to sprinkler controllers and will not be shown if only smart hose timers are on the account. -</div> +{% endnote %} ### Service `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 | | ---------------------- | -------- | ----------- | 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..ea451129bd90 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,14 +30,20 @@ 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: +## Disk space requirements + +A bare minimum requirement is to have at least as much free temporary space available as the size of your database at all times. A table rebuild, repair, or repack may happen at any time, which can result in a copy of the data on disk during the operation. Meeting the bare minimum requirement is essential during a version upgrade, where the schema may change, as this operation almost always requires making a temporary copy of part of the database. + +For example, if your database is 1.5 GiB on disk, you must always have at least 1.5 GiB free. + +## Advanced configuration + ```yaml # Example configuration.yaml entry recorder: @@ -125,7 +129,7 @@ recorder: type: list {% endconfiguration %} -## Configure filter +### Configure filter By default, no entity will be excluded. To limit which entities are being exposed to `recorder`, you can use the `include` and `exclude` parameters. @@ -147,7 +151,7 @@ recorder: If you only want to hide events from your history, take a look at the [`history` integration](/integrations/history/). The same goes for the [logbook](/integrations/logbook/). But if you have privacy concerns about certain events or want them in neither the history or logbook, you should use the `exclude`/`include` options of the `recorder` integration. That way they aren't even in your database, you can reduce storage and keep the database small by excluding certain often-logged events (like `sensor.last_boot`). -### Common filtering examples +#### Common filtering examples Defining domains and entities to `exclude` (i.e. blocklist) is convenient when you are basically happy with the information recorded, but just want to remove some entities or domains. @@ -250,15 +254,19 @@ Call the service `recorder.disable` to stop saving events and states to the data Call the service `recorder.enable` to start again saving events and states to the database. This is the opposite of `recorder.disable`. -## Custom database engines +## Handling disk corruption and hardware failures -<div class='note'> +When using SQLite, if the system encounters unrecoverable disk corruption, it will move the database aside and create a new database to keep the system online. In this case, having at least 2.5x the database size available in free disk space is essential. Starting a new database is the system's last resort recovery option and is usually caused by failing flash storage, an inadequate power supply, an unclean shutdown, or another hardware failure. +In this event, it may be possible to recover the old database by following the [SQLite recovery guide](https://www.sqlite.org/recovery.html). + +## Custom database engines + +{% 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,31 +310,23 @@ 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 @@ -357,9 +357,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/refoss.markdown b/source/_integrations/refoss.markdown index 38dd516ed3df..8027b414864b 100644 --- a/source/_integrations/refoss.markdown +++ b/source/_integrations/refoss.markdown @@ -2,6 +2,7 @@ title: Refoss description: Integrate Refoss devices ha_category: + - Sensor - Switch ha_release: 2024.1 ha_codeowners: @@ -10,6 +11,7 @@ ha_iot_class: Local Polling ha_domain: refoss ha_config_flow: true ha_platforms: + - sensor - switch ha_integration_type: integration --- @@ -26,10 +28,14 @@ Integrate Refoss devices into Home Assistant. - The integration will occupy port: 9989. {% include integrations/config_flow.md %} -### Supported device model +### Supported device models -- Refoss Smart Wi-Fi Switch, R10 - +| Model | Version | +| ----------- |--------------------| +| `Refoss Smart Wi-Fi Switch, R10` | `all` | +| `Refoss Smart Wi-Fi Switch, R20` | `all` | +| `Refoss Smart Energy Monitor, EM06` | `v2.3.8 and above` | + ### Discover device - After integrating Refoss, it will start socket broadcast and Home Assistant will automatically discover Refoss devices under the current LAN. 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/reolink.markdown b/source/_integrations/reolink.markdown index c06d2ba66985..ea18b67970bc 100644 --- a/source/_integrations/reolink.markdown +++ b/source/_integrations/reolink.markdown @@ -65,16 +65,17 @@ Dual lens cameras provide additional streams for the second lens. Depending on the supported features of the camera, binary sensors are added for: -- Motion detection -- Visitor (Doorbell presses) -- AI person detection -- AI vehicle detection -- AI pet detection -- AI animal detection -- AI face detection -- AI package detection - -These sensors receive events using 3 methods in order: ONVIF push, ONVIF long polling or fast polling (every 5 seconds). +- Motion detection+ +- Visitor+ (Doorbell presses) +- AI person detection+ +- AI vehicle detection+ +- AI pet detection+ +- AI animal detection+ +- AI face detection+ +- AI package detection+ +- Sleep status + +\+ These sensors receive events using 3 methods in order: ONVIF push, ONVIF long polling or fast polling (every 5 seconds). The latency for receiving the events is the best for ONVIF push and the worst for fast polling, the fastest available method that is detected to work will be used, and slower methods will not be used. For redundancy, these sensors are polled every 60 seconds together with the update of all other entities. Not all camera models generate ONVIF push events for all event types, some binary sensors might, therefore, only be polled. @@ -165,7 +166,7 @@ Depending on the supported features of the camera, select entities are added for - Play quick reply message - Auto quick reply message - Auto track method (Digital, Digital first, Pan/Tilt first) -- Status LED (Doorbell only: Stay off, Auto, Auto & always on at night) +- Doorbell LED (Stay off, Auto, Auto & always on at night) **PTZ preset** positions can be set in the Reolink app/windows/web client, the names of the presets will be loaded into Home Assistant at the start of the integration. When adding new preset positions, please restart the Reolink integration. @@ -191,6 +192,7 @@ Depending on the supported features of the camera, switch entities are added for - PTZ patrol (start/stop) - Doorbell button sound - Record +- Manual record - Push notifications - Buzzer on event - Email on event @@ -252,6 +254,7 @@ The following models have been tested and confirmed to work with a direct link t - C1 Pro* - C2 Pro* - [CX410](https://reolink.com/product/cx410/) +- [CX810](https://reolink.com/product/cx810/) - [E1 Zoom](https://reolink.com/product/e1-zoom/) - [E1 Outdoor](https://reolink.com/product/e1-outdoor/) - [E1 Outdoor PoE](https://reolink.com/product/e1-outdoor-poe/) @@ -276,6 +279,7 @@ The following models have been tested and confirmed to work with a direct link t - [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/) @@ -299,6 +303,8 @@ Battery-powered Reolink cameras can be used with Home Assistant with the help of 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/) @@ -352,7 +358,7 @@ Then power up the camera while pointing it at the QR code. It takes about a minu ### 2. Enabling HTTP/HTTPS ports -Test if you can access the camera by its IP address in your browser `https://<your-camera-ip>`. If you cannot, in the [windows or Mac](https://reolink.com/software-and-manual/) client ensure at least one of the HTTP/HTTPS ports are enabled under **Settings** > **Network** > **Advanced** > **Port Settings**. See [additional instructions](https://support.reolink.com/hc/en-us/articles/900004435763-How-to-Set-up-Reolink-Ports-Settings-via-Reolink-Client-New-Client-) on the Reolink site. +Test if you can access the camera by its IP address in your browser `https://<your-camera-ip>`. If you cannot, in the [Reolink mobile app, Windows, or Mac client](https://reolink.com/software-and-manual/) ensure at least one of the HTTP/HTTPS ports are enabled under **Settings** > **top camera model box** > **Network Information** > **Advanced** (mobile) or **Settings** > **Network** > **Advanced** > **Port Settings** (PC). See [additional instructions](https://support.reolink.com/hc/en-us/articles/900000621783-How-to-Set-up-Reolink-Ports-Settings/) on the Reolink site. ### 3. Add integration in Home Assistant @@ -366,7 +372,7 @@ Set up the Reolink integration in Home Assistant using the credentials you set i ## Troubleshooting - Older firmware versions do not expose the necessary information the integration needs to function. Ensure the camera is updated to the [latest firmware](https://reolink.com/download-center/) prior to setting up the integration. Note that Reolink auto update and check for update functions in the app/windows/web client often do not show the latest available firmware version. Therefore check the version in the [Reolink download center](https://reolink.com/download-center/) online. -- Ensure at least one of the HTTP/HTTPS ports is enabled in the [windows](https://reolink.com/software-and-manual/)/web client under **Settings** > **Network** > **Advanced** > **Port Settings**, see [additional instructions](https://support.reolink.com/hc/en-us/articles/900004435763-How-to-Set-up-Reolink-Ports-Settings-via-Reolink-Client-New-Client-) on the Reolink site. +- Ensure at least one of the HTTP/HTTPS ports is enabled in the [Reolink mobile app, Windows, or Mac client](https://reolink.com/software-and-manual/) under **Settings** > **top camera model box** > **Network Information** > **Advanced** (mobile) or **Settings** > **Network** > **Advanced** > **Port Settings** (PC), see [additional instructions](https://support.reolink.com/hc/en-us/articles/900000621783-How-to-Set-up-Reolink-Ports-Settings/) on the Reolink site. - On some camera models, the RTMP port needs to be enabled in order for the HTTP(S) port to function properly. Make sure this port is also enabled if you get a `Cannot connect to host` error while one of the HTTP/HTTPS ports is already enabled. - Setting a static IP address for Reolink cameras/NVRs in your router is advisable to prevent (temporal) connectivity issues when the IP address changes. - Do not set a static IP in the Reolink device itself, but leave the **Connection Type** on **DHCP** under **Settings** > **Network** > **Network Information** > **Set Up**. If you set it to **static** on the Reolink device itself, this is known to cause incorrect DHCP requests on the network. The incorrect DHCP request causes Home Assistant to use the wrong IP address for the camera, resulting in connection issues. The issue originates from the Reolink firmware, which keeps sending DCHP requests even when you set a static IP address in the Reolink device. 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/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..3b37083f038d 100644 --- a/source/_integrations/rfxtrx.markdown +++ b/source/_integrations/rfxtrx.markdown @@ -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 diff --git a/source/_integrations/ridwell.markdown b/source/_integrations/ridwell.markdown index 8a726b2d3967..df6ebebc8630 100644 --- a/source/_integrations/ridwell.markdown +++ b/source/_integrations/ridwell.markdown @@ -21,6 +21,30 @@ The Ridwell integration allows users to track waste recycling pickups scheduled {% include integrations/config_flow.md %} +## Calendar + +The calendar sensor contains a `calendar` state attribute, which contains: + +- The name of the Ridwell Calendar. +- If the event is an all-day event (Boolean). +- The start time of the calendar event. Starts at midnight. +- The end time of the event. Ends at midnight. +- The location of the event. +- The description of the items being picked up. +- Friendly name of the calendar event. + +For example: + +```yaml +message: Ridwell Pickup (scheduled) +all_day: true +start_time: 2024-07-26 00:00:00 +end_time: 2024-07-27 00:00:00 +location: +description: Pickup types: Light Bulbs (quantity: 1), Hand Tools (quantity: 1), Batteries (quantity: 1), Threads (quantity: 1), Plastic Film (quantity: 1) +friendly_name: Ridwell +``` + ## Pickup types The pickup sensor contains a `pickup_types` state attribute, which contains: 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 a60a8900559d..d0dab1d822b8 100644 --- a/source/_integrations/roborock.markdown +++ b/source/_integrations/roborock.markdown @@ -40,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. @@ -132,6 +132,25 @@ 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. + + ## FAQ ### Can I use the Mi home app with this integration? @@ -155,20 +174,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 -``` +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. + + - **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** > **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. Example: + ```yaml service: vacuum.send_command data: 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/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/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/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/script.markdown b/source/_integrations/script.markdown index 339c872932ca..475e5186c0f2 100644 --- a/source/_integrations/script.markdown +++ b/source/_integrations/script.markdown @@ -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: @@ -215,14 +213,14 @@ 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, - the `this` variable the value of which is a dictionary of the current script's state. -</div> +{% endnote %} ### Waiting for Script to Complete 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.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/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..a0d6a67791ff 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 %} 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..d82e8444d241 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. diff --git a/source/_integrations/seventeentrack.markdown b/source/_integrations/seventeentrack.markdown index 0d589bf49605..e09fc5e0e9a1 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 %} diff --git a/source/_integrations/shell_command.markdown b/source/_integrations/shell_command.markdown index 280cf33f7ab7..8da0e3e8dc64 100644 --- a/source/_integrations/shell_command.markdown +++ b/source/_integrations/shell_command.markdown @@ -46,11 +46,9 @@ 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. diff --git a/source/_integrations/shelly.markdown b/source/_integrations/shelly.markdown index 33d1d981fb88..012d80fa6d1f 100644 --- a/source/_integrations/shelly.markdown +++ b/source/_integrations/shelly.markdown @@ -74,9 +74,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 +226,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,11 +249,9 @@ Shelly lights supporting light transition: - Shelly RGBW2 - Shelly Vintage -<div class="note"> - +{% note %} The firmware limits the transition time to 5 seconds. - -</div> +{% endnote %} ## Device services @@ -292,13 +288,7 @@ As soon as you change the temperature, it gets enabled again. ## Shelly Gas with Valve add-on -If you have Valve add-on connected to Shelly Gas, the integration will create three entities for the valve. The `switch` and `valve` entities allow you to control the valve, the `sensor` entity shows exact states of the valve. The `switch` entity is deprecated and will be removed in a future version of Home Assistant. - -<div class="note"> - -The `switch` entity in Home Assistant does not support transition states. For this reason, the `opening` state of the valve maps to the `on` (opened) state of the entity and the `closing` state of the valve maps to the `off` (closed) state of the entity. - -</div> +If you have the Valve add-on connected to Shelly Gas, the integration will create two entities for the valve. The `valve` entity allows you to control the valve, the `sensor` entity shows exact states of the valve. ## CoAP port (generation 1) diff --git a/source/_integrations/signal_messenger.markdown b/source/_integrations/signal_messenger.markdown index 2cbb794eda66..1de78bdfc0af 100644 --- a/source/_integrations/signal_messenger.markdown +++ b/source/_integrations/signal_messenger.markdown @@ -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 Service -## 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/simplisafe.markdown b/source/_integrations/simplisafe.markdown index e72ee5f143f1..bdeda6d3d051 100644 --- a/source/_integrations/simplisafe.markdown +++ b/source/_integrations/simplisafe.markdown @@ -48,9 +48,9 @@ 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). diff --git a/source/_integrations/siren.mqtt.markdown b/source/_integrations/siren.mqtt.markdown index f9887db48d44..161244e94835 100644 --- a/source/_integrations/siren.mqtt.markdown +++ b/source/_integrations/siren.mqtt.markdown @@ -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/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/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/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 b965856b6314..c162f383ca14 100644 --- a/source/_integrations/smtp.markdown +++ b/source/_integrations/smtp.markdown @@ -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/snips.markdown b/source/_integrations/snips.markdown index ecba5b734d4b..49be4f778612 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. 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..3af56562b1ba 100644 --- a/source/_integrations/snooz.markdown +++ b/source/_integrations/snooz.markdown @@ -46,9 +46,9 @@ 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 @@ -83,9 +83,9 @@ automation: 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" %} 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 21b20cd1c733..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'> -The solarlog integration is using the sunwatcher 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 sunwatcher package. -</div> +{% 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. +{% endnote %} diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown index 53e329f020e9..103cca0ec7a3 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 @@ -115,12 +113,9 @@ 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 @@ -280,11 +275,9 @@ The Sonos integration makes various custom services available in addition to the 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'> - +{% 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. - -</div> +{% endnote %} | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | @@ -295,15 +288,13 @@ The queue is not snapshotted and must be left untouched until the restore. Using 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 | | ---------------------- | -------- | ----------- | 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/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..6eed9c32cb93 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: @@ -48,13 +50,13 @@ transporter_toslink: 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 | | ---------------------- | -------- | ----------- | | `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. @@ -72,13 +74,13 @@ This can work with title search and basically any thing. The same wouldn't have 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 | | ---------------------- | -------- | ----------- | | `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: `hass.services.call("squeezebox", "call_query", { "entity_id": "media_player.kitchen", "command": "albums", "parameters": ["0", "20", "search:beatles", "tags:al"] })` diff --git a/source/_integrations/starline.markdown b/source/_integrations/starline.markdown index f8be1291e3ce..2d34d5b604c9 100644 --- a/source/_integrations/starline.markdown +++ b/source/_integrations/starline.markdown @@ -41,14 +41,12 @@ This integration provides the following platforms: 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 %} 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..01107c7f796a 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: diff --git a/source/_integrations/subaru.markdown b/source/_integrations/subaru.markdown index 60c91c162ad6..727540e3cc42 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,9 +64,9 @@ 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 @@ -90,9 +90,9 @@ Subaru integration options are set via: - **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 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.mqtt.markdown b/source/_integrations/switch.mqtt.markdown index 267ffcf1ef3e..1ac9b513e7a1 100644 --- a/source/_integrations/switch.mqtt.markdown +++ b/source/_integrations/switch.mqtt.markdown @@ -215,11 +215,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..e6ae6f21b10c 100644 --- a/source/_integrations/switch.template.markdown +++ b/source/_integrations/switch.template.markdown @@ -3,10 +3,19 @@ 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_platforms: + - switch +ha_integration_type: helper +related: + - docs: /docs/configuration/ + title: Configuration file --- The `template` platform creates switches that combines components. diff --git a/source/_integrations/switchbot.markdown b/source/_integrations/switchbot.markdown index e26c78592b11..078c1bce662d 100644 --- a/source/_integrations/switchbot.markdown +++ b/source/_integrations/switchbot.markdown @@ -62,8 +62,10 @@ 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) ## SwitchBot Entity @@ -76,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. @@ -93,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 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/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/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..a32a73bc8b91 100644 --- a/source/_integrations/technove.markdown +++ b/source/_integrations/technove.markdown @@ -50,4 +50,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..0fa0feec7c44 100644 --- a/source/_integrations/telegram.markdown +++ b/source/_integrations/telegram.markdown @@ -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. @@ -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 0eec4e95e928..92cd8dbba847 100644 --- a/source/_integrations/telegram_bot.markdown +++ b/source/_integrations/telegram_bot.markdown @@ -37,6 +37,7 @@ Send a notification. | `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"]]]` | | `message_tag` | yes | Tag for sent message. In `telegram_sent` event data: {% raw %}`{{trigger.event.data.message_tag}}`{% endraw %} | | `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` @@ -61,6 +62,7 @@ Send a photo. | `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"]]]` | | `message_tag` | yes | Tag for sent message. In `telegram_sent` event data: {% raw %}`{{trigger.event.data.message_tag}}`{% endraw %} | | `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` @@ -84,6 +86,7 @@ Send a video. | `keyboard` | yes | List of rows of commands, comma-separated, to make a custom keyboard. `[]` to reset to no custom keyboard. Example: `["/command1, /command2", "/command3"]` | | `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"]]]` | | `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` @@ -108,6 +111,7 @@ Send an animation. | `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"]]]` | | `message_tag` | yes | Tag for sent message. In `telegram_sent` event data: {% raw %}`{{trigger.event.data.message_tag}}`{% endraw %} | | `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` @@ -131,6 +135,7 @@ Send a voice 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"]]]` | | `message_tag` | yes | Tag for sent message. In `telegram_sent` event data: {% raw %}`{{trigger.event.data.message_tag}}`{% endraw %} | | `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` @@ -154,6 +159,7 @@ Send a sticker. | `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"]]]` | | `message_tag` | yes | Tag for sent message. In `telegram_sent` event data: {% raw %}`{{trigger.event.data.message_tag}}`{% endraw %} | | `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` @@ -178,6 +184,7 @@ Send a document. | `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"]]]` | | `message_tag` | yes | Tag for sent message. In `telegram_sent` event data: {% raw %}`{{trigger.event.data.message_tag}}`{% endraw %} | | `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` @@ -195,6 +202,7 @@ Send a location. | `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"]]]` | | `message_tag` | yes | Tag for sent message. In `telegram_sent` event data: {% raw %}`{{trigger.event.data.message_tag}}`{% endraw %} | | `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` @@ -211,6 +219,7 @@ Send a poll. | `disable_notification` | yes | True/false for send the message silently. iOS users and web users will not receive a notification, Android users will receive a notification with no sound. Defaults to False. | | `timeout` | yes | Timeout for sending voice in seconds. Will help with timeout errors (poor internet connection, etc) | | `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` 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..7f81978c0d09 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. @@ -57,9 +60,19 @@ _For old sensor/binary sensor configuration format, [see below](#legacy-binary-s ## 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 and binary sensor template can be configured using the user interface at **{% my helpers title="Settings > Devices & Services > Helpers" %}**. +{% 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 @@ -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 diff --git a/source/_integrations/tensorflow.markdown b/source/_integrations/tensorflow.markdown index 356134cd4676..511a5ccb7987 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 diff --git a/source/_integrations/teslemetry.markdown b/source/_integrations/teslemetry.markdown index ec332c85c8d4..9820296e9b5e 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 @@ -196,3 +197,73 @@ 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. + +## Services + +Teslemetry provides various custom services 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/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..5904599d4649 100644 --- a/source/_integrations/thread.markdown +++ b/source/_integrations/thread.markdown @@ -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 @@ -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 @@ -181,8 +182,9 @@ 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. + - 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 24e5cd82d481..dba887df9d2b 100644 --- a/source/_integrations/tibber.markdown +++ b/source/_integrations/tibber.markdown @@ -83,6 +83,54 @@ If you have a Tibber Pulse it will also show the electricity consumption in real </div> +## Services + +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. + +### Service `tibber.get_prices` + +Fetches hourly energy prices including price level. + +| Service 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 | + +#### Response data + +The response data is a dictionary with the energy prices for each Home. `start_time` is returned in local time from the API. + +```json +{ + "prices": { + "Nickname_Home":[ + { + "start_time": "2023-12-09 03:00:00+02:00", + "price": 0.46914, + "level": "VERY_EXPENSIVE" + }, + { + "start_time": "2023-12-09 04:00:00+02:00", + "price": 0.46914, + "level": "VERY_EXPENSIVE" + } + ], + "Nickname_Home_2":[ + { + "start_time": "2023-12-09 03:00:00+02:00", + "price": 0.46914, + "level": "VERY_EXPENSIVE" + }, + { + "start_time": "2023-12-09 04:00:00+02:00", + "price": 0.46914, + "level": "VERY_EXPENSIVE" + } + ] + } +} +``` + ## Examples In this section, you will find some real-life examples of how to use this sensor. diff --git a/source/_integrations/timer.markdown b/source/_integrations/timer.markdown index cefa8f42d82d..c934fb949a77 100644 --- a/source/_integrations/timer.markdown +++ b/source/_integrations/timer.markdown @@ -14,13 +14,11 @@ The `timer` integration aims to simplify automations based on (dynamic) duration 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. -<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 diff --git a/source/_integrations/todoist.markdown b/source/_integrations/todoist.markdown index 6c50a7b9c59f..e9907f8d773f 100644 --- a/source/_integrations/todoist.markdown +++ b/source/_integrations/todoist.markdown @@ -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/tplink.markdown b/source/_integrations/tplink.markdown index 7d6708816e42..9997162b2c8f 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,106 +47,42 @@ 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 - -#### Bulbs - -- EP40 -- LB100 -- LB110 -- LB120 -- LB130 -- LB230 -- KL50 -- KL60 -- KL110 -- KL120 -- KL125 -- KL130 -- KL135 - -#### 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. +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. ### Random Effect - Service `tplink.random_effect` -The light strips allow setting a random effect. +Light strips allow setting a random effect. | Service data attribute | Description | | ---------------------- | ----------- | @@ -184,7 +131,7 @@ data: ### Sequence Effect - Service `tplink.sequence_effect` -The light strips allow setting a sequence effect. +Light strips allow setting a sequence effect. | Service data attribute | Description | | ---------------------- | ----------- | diff --git a/source/_integrations/tplink_omada.markdown b/source/_integrations/tplink_omada.markdown index d81801236fc1..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 @@ -59,3 +60,11 @@ Controller versions 5.1.0 and later are supported. - WAN Port Connect/Disconnect switches - LAN Port PoE activity sensor - Firmware Update + +### Device trackers + +The integration can track Wi-Fi devices connected to access points managed by the TP-Link Omada controller. All known Wi-Fi clients will be initially created in a disabled state. You then need to enable the entities that you want to track. + +If you want to increase the polling frequency of client updates, follow [these instructions](https://www.home-assistant.io/common-tasks/general/#defining-a-custom-polling-interval). You only need to request a refresh from one of the tracked devices, all of the tracked devices will be refreshed at the same time. + +Note: The TP-Link Omada controller takes a few minutes to detect when a client disconnects from the Wi-Fi network, even with more regular polling updates. 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/tts.markdown b/source/_integrations/tts.markdown index e0258a107865..5389b41e8025 100644 --- a/source/_integrations/tts.markdown +++ b/source/_integrations/tts.markdown @@ -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. diff --git a/source/_integrations/twilio_sms.markdown b/source/_integrations/twilio_sms.markdown index bcfadebe6466..acf4b2b7f8f5 100644 --- a/source/_integrations/twilio_sms.markdown +++ b/source/_integrations/twilio_sms.markdown @@ -29,7 +29,7 @@ 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: diff --git a/source/_integrations/uk_transport.markdown b/source/_integrations/uk_transport.markdown index 720e22c7c765..d1614a923e9b 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`. diff --git a/source/_integrations/unifi.markdown b/source/_integrations/unifi.markdown index fd7752e55a94..a4d28694b900 100644 --- a/source/_integrations/unifi.markdown +++ b/source/_integrations/unifi.markdown @@ -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 diff --git a/source/_integrations/unifiprotect.markdown b/source/_integrations/unifiprotect.markdown index 74799a699530..a809d99a1e63 100644 --- a/source/_integrations/unifiprotect.markdown +++ b/source/_integrations/unifiprotect.markdown @@ -20,9 +20,6 @@ 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 @@ -58,13 +55,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,26 +97,22 @@ 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: @@ -225,15 +216,6 @@ Below are the accepted identifiers to resolve media. Since events do not necessa ## Services -### Service unifiprotect.set_default_doorbell_text - -Sets the default doorbell message. This will be the message that is automatically selected when a message "expires". - -| Service 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 | The default message for your Doorbell. Must be less than 30 characters. | - ### Service unifiprotect.add_doorbell_text Adds a new custom message for Doorbells. @@ -289,7 +271,7 @@ The easiest way to find the `nvr_id`, `camera_id`, `start`, and `end` times is b ### Delay in video feed -The default settings on the stream integration will give you a 5-15+ second delay. You can reduce this delay to 1-3 seconds, by enabling [LL-HLS in the stream integration](/integrations/stream/#ll-hls). You will also want to put an HTTP/2 reserve proxy in front of Home Assistant so you can have connection pooling. If you do not add a reverse proxy, you may start to get "Waiting for WebSocket..." messages while trying to view too many camera streams at once. One way to do this is using the official NGINX Proxy Add-on: +The default settings on the stream integration will give you a 5-15+ second delay. You can reduce this delay to 1-3 seconds, by enabling [LL-HLS in the stream integration](/integrations/stream/#ll-hls). You will also want to put an HTTP/2 reverse proxy in front of Home Assistant so you can have connection pooling. If you do not add a reverse proxy, you may start to get "Waiting for WebSocket..." messages while trying to view too many camera streams at once. One way to do this is using the official NGINX Proxy Add-on: {% my supervisor_addon addon="core_nginx_proxy" badge %} 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.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..124bc28e623a 100644 --- a/source/_integrations/utility_meter.markdown +++ b/source/_integrations/utility_meter.markdown @@ -24,9 +24,9 @@ From a user perspective, utility meters operate in cycles (usually monthly) for 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). -<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 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.template.markdown b/source/_integrations/vacuum.template.markdown index da6037747446..8a8d19ee43de 100644 --- a/source/_integrations/vacuum.template.markdown +++ b/source/_integrations/vacuum.template.markdown @@ -3,10 +3,19 @@ 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 diff --git a/source/_integrations/valve.mqtt.markdown b/source/_integrations/valve.mqtt.markdown index d1c05dab5342..5f373bea4e77 100644 --- a/source/_integrations/valve.mqtt.markdown +++ b/source/_integrations/valve.mqtt.markdown @@ -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/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/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..472c677b794a 100644 --- a/source/_integrations/vicare.markdown +++ b/source/_integrations/vicare.markdown @@ -3,6 +3,7 @@ title: Viessmann ViCare description: Instructions how to integrate Viessmann heating devices with Home Assistant ha_category: - Climate + - Water heater ha_release: 0.99 ha_iot_class: Cloud Polling ha_config_flow: true @@ -24,122 +25,156 @@ ha_codeowners: The **Viessmann ViCare** {% term integration %} lets you control [Viessmann](https://www.viessmann.com) devices via the Viessmann ViCare (REST) API. Most recent network-connected Viessmann heating devices (e.g., gas boilers) should be supported. -There is currently support for the following device types within Home Assistant: +## Prerequisites -- [Climate](#climate) (Heating) -- [Water heater](#water-heater) (Domestic hot water) -- [Sensor](#sensor) (Sensor) -- [Button](#button) (Button) -- [Number](#number) +You will need to sign in on the [Viessmann developer portal](https://app.developer.viessmann.com/) with **your existing ViCare app user credentials**. + +Create a new API client by selecting **Add** in the **Clients** section on the developer dashboard with the following settings: + - Name: `HomeAssistant` + - Google reCAPTCHA: `disabled` + - Redirect URIs: `vicare://oauth-callback/everest` + +Copy the **Client ID** in the **Clients** section on the developer dashboard for the setup in Home Assistant. + +{% important %} +You have to set up the {% term integration %} from your device (phone) where you have the ViCare app installed. Otherwise, your device does not know how to handle the `vicare://` redirect URL, and you will receive an **Invalid credentials** notification and the setup procedure will fail. +{% endimportant %} + +{% note %} +It may take up to an hour for your new client to become active and usable. Otherwise, you will not receive any devices in Home Assistant. +{% endnote %} + +### API limits + +The Viessmann API is rate-limited. If you exceed one of the limits below, you will be blocked for 24 hours: + +- 120 calls for a time window of 10 minutes +- 1450 calls for a time window of 24 hours + +The {% term integration %} polls the API every 60 seconds and will work within these limits. However, any additional requests to the API, for example, by setting the temperature via the integration but also by interacting with the ViCare app, count into those limits. + +{% note %} +If you have multiple Viessmann devices in Home Assistant, the limit is shared between them, meaning the poll interval is increased, and the values are less frequently updated! +{% endnote %} {% include integrations/config_flow.md %} -Use your ViCare app login credentials for *username* and *password*. +## Entities -The required *client ID* can be obtained from the [Viessmann Developer Portal](https://app.developer.viessmann.com/): -1. Log in with **your existing ViCare app username and password**. -2. On the developer dashboard, select **Add** in the **Clients** section. -3. Create a new client using the following data: - - Name: `HomeAssistant` - - Google reCAPTCHA: Disabled - - Redirect URIs: `vicare://oauth-callback/everest` -4. Find the **Client ID** in the **Clients** section on the developer dashboard. +ViCare represents devices as a set of [data points](https://documentation.viessmann.com/static/iot/data-points) and the ViCare {% term integration %} maps those to {% term entity entities %} of different {% term platform platforms %} in Home Assistant. A single device may be represented by one or more platforms. + +### Climate + +Represents the heating controls of your device. + +{% note %} +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. +{% endnote %} + +### Water heater + +Represents the domestic hot water controls of your device. + +{% note %} +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 integration. Therefore, the operation mode of that integration is just available as an attribute and cannot be modified. +{% endnote %} -The `heating_type` can either be `auto` to automatically find the most suitable type for your device or one of `gas`, `oil`, `pellets`, `heatpump`, `fuelcell`, `hybrid`. +### Sensor -Important: the redirect URI that you configure requires that you perform the initial setup on a device that has the ViCare application installed. If your device does not know how to handle the `vicare://` URL, you will receive an **Invalid credentials** notification and the setup procedure will fail. This means: install the ViCare app on your phone and set up the {% term integration %} from your phone. +Additional data for a device is available as separate sensors. The sensors are automatically discovered based on the available API data points. -Multiple device instances might be generated depending on the number of burners and/or circuits of your installation. If there is more than a single instance all devices are suffixed with the circuit or burner ID. +### Button -## Viessmann API limits +Button entities are available for triggering like a one-time charge of the water heater. -The Viessmann API is rate-limited. If you exceed one of the limits below you will be banned for 24 hours: +### Number -- Limit 1: 120 calls for a time window of 10 minutes -- Limit 2: 1450 calls for a time window of 24 hours +Number entities are available to adjust values like the predefined temperature for different heating programs or the heating curve shift and slope. -The {% term integration %} polls the Viessmann API every 60 seconds and will work within these limits. Note however that any additional requests to the API, e.g., by setting the temperature via the {% term integration %} but also by interacting with the ViCare app also counts into those limits. +## Services -## Climate +The following services of the [climate integration](/integrations/climate/) are provided by the ViCare integration: `set_temperature`, `set_hvac_mode`, `set_preset_mode` -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. +The following services of the [water_heater integration](/integrations/water_heater/) are provided by the ViCare integration: `set_temperature` -### Supported services `climate.vicare_heating` +### Service `vicare.set_vicare_mode` -The following services of the [Climate integration](/integrations/climate/) are provided by the ViCare {% term integration %}: `set_temperature`, `set_hvac_mode`, `set_preset_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. + +| Service 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 the `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_temperature` +### Service `climate.set_temperature` Sets the target temperature to the given temperature. | Service 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 +| `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` +### Service `climate.set_hvac_mode` Set HVAC mode for the climate device. The following modes are supported: -The `climate.vicare_heating` {% term integration %} has the following mapping of HVAC modes to Viessmann operation modes: +The ViCare {% term integration %} has the following mapping of HVAC modes to Viessmann operation modes: | HVAC mode | Viessmann mode | Description | | ---------------------- | -------- | ----------- | -| `off` | `ForcedReduced` | Permanently set heating to reduced temperature. Note: This will also deactivate domestic hot water -| `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 +| `off` | `ForcedReduced` | Permanently set heating to reduced temperature. Note: This will also deactivate domestic hot water. | +| `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 | | ---------------------- | -------- | ----------- | -| `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` +| `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. | -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. - -| Service 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` +### Service `climate.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 | | ---------------------- | -------- | ----------- | -| `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. - -## Water heater - -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` +| `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. | -The following services of the [water heater integration](/integrations/water_heater/) are provided by the ViCare {% term integration %}: `set_temperature` - -#### Service `set_temperature` +### Service `water_heater.set_temperature` Sets the target temperature of domestic hot water to the given temperature. | Service 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 +| `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. | -## Sensor +## Troubleshooting -Additional data from ViCare is available as separate sensors. The sensors are automatically discovered based on the available API data points. +### UTF-8 characters in passwords -## Button +The underlying PyViCare Python library cannot handle UTF-8 characters in passwords, so do not use for example `ü`, `ø`, etc. in passwords. -Button entities are available for triggering like a one-time charge of the water heater. +### GATEWAY_OFFLINE -## Number +The ViCare API tends to lose contact with the gateway from time to time. This will be logged in Home Assistant with: -Number entities are available to adjust values like the predefined temperature for different heating programs or the heating curve shift and slope. +```log +Invalid data from Vicare server: { + 'viErrorId': '...', + 'statusCode': 400, + 'errorType': 'DEVICE_COMMUNICATION_ERROR', + 'message': '', + 'extendedPayload': { + 'httpStatusCode': 'NotFound', + 'code': '404', + 'reason': 'GATEWAY_OFFLINE' + } +} +``` + +Usually, this resolves itself after a while, but if this state persists, try to power cycle your gateway. 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/vizio.markdown b/source/_integrations/vizio.markdown index d845eb8ffa83..2d4ced2fac0c 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. diff --git a/source/_integrations/vlc.markdown b/source/_integrations/vlc.markdown index 9097c3a5e8be..fd9e162cd6f0 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 diff --git a/source/_integrations/vodafone_station.markdown b/source/_integrations/vodafone_station.markdown index 7229ac0e6c32..5a33f943b1eb 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: 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..44f71468418d 100644 --- a/source/_integrations/wake_on_lan.markdown +++ b/source/_integrations/wake_on_lan.markdown @@ -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> +{% endnote %} ## Switch diff --git a/source/_integrations/water_heater.markdown b/source/_integrations/water_heater.markdown index be9c62129d1e..f58071ad053d 100644 --- a/source/_integrations/water_heater.markdown +++ b/source/_integrations/water_heater.markdown @@ -26,11 +26,9 @@ water_heater: Available services: `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 services may be available for your platform. Be sure to check the available services Home Assistant has enabled by checking **Developer Tools** -> **Services**. - -</div> +{% endtip %} ### Service `water_heater.set_temperature` diff --git a/source/_integrations/watttime.markdown b/source/_integrations/watttime.markdown index a3b545eb8fcb..630f02429337 100644 --- a/source/_integrations/watttime.markdown +++ b/source/_integrations/watttime.markdown @@ -3,6 +3,8 @@ title: WattTime description: Instructions on how to set up the WattTime integration within Home Assistant. ha_category: - Sensor + - Energy + - Environment ha_release: '2021.10' ha_iot_class: Cloud Polling ha_domain: watttime @@ -38,9 +40,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/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/weatherflow_cloud.markdown b/source/_integrations/weatherflow_cloud.markdown index 2ca7803738bc..51d9df1e16f4 100644 --- a/source/_integrations/weatherflow_cloud.markdown +++ b/source/_integrations/weatherflow_cloud.markdown @@ -15,6 +15,34 @@ ha_domain: weatherflow_cloud ha_integration_type: integration --- -The **WeatherFlow Cloud** integration provides access to cloud provided Weather Forecast of a user's Tempest Weather Stations. In order to access the station you will need to configure the integration with an [Api Key](https://weatherflow.github.io/Tempest/api/). +The **WeatherFlow Cloud** integration provides access to cloud provided Weather Forecast of a user's Tempest Weather Stations. In order to access the station, you will need to configure the integration with an [Api Key](https://weatherflow.github.io/Tempest/api/). {% include integrations/config_flow.md %} + + +## Weather icons + +There is not a straight 1-1 mapping between the Home Assistant supported weather conditions and what tempest provides - as such you may see a difference between what is displayed in the tempest app and what is displayed in Home Assistant. + +| Weather Flow icon | Home Assistant icon | +|-------------------|----------------------| +| clear-day | sunny | +| clear-night | clear-night | +| cloudy | cloudy | +| foggy | fog | +| partly-cloudy-day | partlycloudy | +| partly-cloudy-night | partlycloudy | +| possibly-rainy-day | rainy | +| possibly-rainy-night | rainy | +| possibly-sleet-day | snowy-rainy | +| possibly-sleet-night | snowy-rainy | +| possibly-snow-day | snowy | +| possibly-snow-night | snowy | +| possibly-thunderstorm-day | lightning-rainy | +| possibly-thunderstorm-night | lightning-rainy | +| rainy | rainy | +| sleet | snowy-rainy | +| snow | snowy | +| thunderstorm | lightning | +| windy | windy | + 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..3421c30261b9 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: diff --git a/source/_integrations/whirlpool.markdown b/source/_integrations/whirlpool.markdown index 7ef99e50b5dd..2c0dd6cfb732 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 %} diff --git a/source/_integrations/wled.markdown b/source/_integrations/wled.markdown index 513f700efaab..f35d7b8447f9 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 diff --git a/source/_integrations/workday.markdown b/source/_integrations/workday.markdown index ca831ad2e0cb..9b42586b410d 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 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..d86a78049f26 100644 --- a/source/_integrations/xbox.markdown +++ b/source/_integrations/xbox.markdown @@ -28,11 +28,9 @@ 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 @@ -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_miio.markdown b/source/_integrations/xiaomi_miio.markdown index c2813807e7df..5cee1d7167d6 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 %} @@ -222,6 +220,8 @@ Supported devices: | Air Purifier Super 2 | zhimi.airpurifier.sa2 | | | Air Purifier 3 (2019) | zhimi.airpurifier.ma4 | AC-M6-SC | | Air Purifier 3H (2019) | zhimi.airpurifier.mb3 | | +| Air Purifier Pro H | zhimi.airpurifier.va1 | | +| Air Purifier Pro H EU | zhimi.airpurifier.vb2 | | | Air Purifier 3C | zhimi.airpurifier.mb4 | | | Air Purifier ZA1 | zhimi.airpurifier.za1 | | | Air Purifier 4 | zhimi.airp.mb5 | AC-M16-SC | @@ -492,6 +492,45 @@ This model uses newer MiOT communication protocol. | Buzzer | Turn on/off the buzzer | | Child Lock | Turn on/off the child lock | +### Air Purifier Pro H/Pro H EU (zhimi.airpurifier.va1/zhimi.airpurifier.vb2) + +- Power (on, off) +- Operation modes (Auto, Silent, Favorite, Fan) +- Attributes (fan platform) + - `use_time` +- Number entities + +| Number | Description | +| -------------- | ---------------------- | +| Fan Level | Set the fan level | +| Favorite Level | Set the favorite level | + +- Select entities + +| Select | Description | +| -------------- | ------------------------------------------------------ | +| LED Brightness | Controls the brightness of the LEDs (bright, dim, off) | + +- Sensor entities + +| Sensor | Description | Enabled by default | +| ------------------------- | ------------------------------------------------------------- | ------------------ | +| Filter Lifetime Remaining | The remaining lifetime of the filter | True | +| Filter Use | Filter usage time in hours | True | +| Humidity | The current humidity measured | True | +| Motor Speed | The current motor speed measured in rpm | True | +| PM2.5 | The current particulate matter 2.5 measured | True | +| Purify Volume | The volume of purified air in qubic meter | False | +| Temperature | The current temperature measured | True | +| Use Time | The accumulative number of seconds the device has been in use | False | + +- Switch entities + +| Switch | Description | +| ---------- | -------------------------- | +| Buzzer | Turn on/off the buzzer | +| Child Lock | Turn on/off the child lock | + ### Air Purifier 3C (zhimi.airpurifier.mb4) - Power (on, off) @@ -917,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) @@ -1687,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 @@ -2066,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/> @@ -2078,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..f9ab77cef631 100644 --- a/source/_integrations/xmpp.markdown +++ b/source/_integrations/xmpp.markdown @@ -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/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/yeelight.markdown b/source/_integrations/yeelight.markdown index 381ca2440e57..fcd157f378b2 100644 --- a/source/_integrations/yeelight.markdown +++ b/source/_integrations/yeelight.markdown @@ -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 | |------------|--------------|--------------------------------------------------| 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..43886aaf357a 100644 --- a/source/_integrations/yolink.markdown +++ b/source/_integrations/yolink.markdown @@ -40,19 +40,7 @@ Home Assistant will use account linking provided by Nabu Casa for authenticating 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 - -### `Play on SpeakerHub` - -With this service, you can convert text to speech for playback on SpeakerHub. - -Service data attribute | Optional | Description --|-|- -`target_device` | no| SpeakerHub device ID for audio playback. -`message` | no| Text for speech conversion. -`tone` | no| Tone before playing audio. -`volume` | no| Speaker volume during playback. -`repeat` | no| The number of times the text will be repeated. +## Supported device list The integration is tested and verified for the following devices from YoLink: @@ -64,6 +52,7 @@ The integration is tested and verified for the following devices from YoLink: - YS3607-UC (YoLink SirenFob) - YS4002-UC (YoLink Thermostat) - YS4003-UC (YoLink Thermostat Heatpump) +- YS4004-UC (YoLink Thermostat 2) - YS4906-UC + YS7706-UC (Garage Door Kit 1) - YS4908-UC + YS7706-UC (Garage Door Kit 2 (Finger)) - YS4909-UC (Water Valve Controller) @@ -103,8 +92,29 @@ The integration is tested and verified for the following devices from YoLink: - YS8004-UC (Weatherproof Temperature Sensor) - YS8005-UC (Weatherproof Temperature & Humidity Sensor) - YS8006-UC (X3 Temperature & Humidity Sensor) +- YS8007-UC (Thermometer Hygrometer) - YS8014-UC (X3 Outdoor Temperature Sensor) - YS8015-UC (X3 Outdoor Temperature & Humidity Sensor) - YS5006-UC (FlowSmart Control) - YS5007-UC (FlowSmart Meter) - YS5008-UC (FlowSmart All-in-One) + +## Services + +### `Play on SpeakerHub` + +With this service, you can convert text to speech for playback on SpeakerHub. + +Service data attribute | Optional | Description +-|-|- +`target_device` | no| SpeakerHub device ID for audio playback. +`message` | no| Text for speech conversion. +`tone` | no| Tone before playing audio. +`volume` | no| Speaker volume during playback. +`repeat` | no| The number of times the text will be repeated. + +## Community notes + +1. This integration requires an MQTT connection to be established via port 8003. If you are using a firewall, please allow communication via port 8003 in the firewall settings. +2. If you use a network proxy, such as a VPN, the integration may not be able to update the device status. Turn off the VPN. +3. Please do not use UAC as credentials for the Home Assistant YoLink integration. 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 c9f375bb8fb5..7e820af5fc4c 100644 --- a/source/_integrations/zha.markdown +++ b/source/_integrations/zha.markdown @@ -103,6 +103,7 @@ Some other Zigbee coordinator hardware may not support a firmware that is capabl - Texas Instruments based radios (via the [zigpy-znp](https://github.com/zigpy/zigpy-znp) library for zigpy) - [CC2652P/CC2652R/CC2652RB USB stick, module, or dev board hardware flashed with Z-Stack coordinator firmware](https://www.zigbee2mqtt.io/guide/adapters/) - [CC1352P/CC1352R USB stick, module, or dev board hardware flashed with Z-Stack coordinator firmware](https://www.zigbee2mqtt.io/guide/adapters/) + - [XZG - Universal Firmware for Zigbee Gateway](https://xzg.xyzroe.cc/) - dresden elektronik deCONZ based Zigbee radios (via the [zigpy-deconz](https://github.com/zigpy/zigpy-deconz) library for zigpy) - [ConBee III (a.k.a. ConBee 3) USB adapter from dresden elektronik](https://phoscon.de/conbee3) - [ConBee II (a.k.a. ConBee 2) USB adapter from dresden elektronik](https://phoscon.de/conbee2) @@ -134,15 +135,13 @@ Some other Zigbee coordinator hardware may not support a firmware that is capabl #### 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. 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. 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. - -</div> +{% endcaution %} ## Configuration - GUI @@ -213,8 +212,10 @@ Some devices can be auto-discovered, which can simplify the ZHA setup process. T | [ZigStar Stick (CC2652 + CH340B variant)](https://zig-star.com/projects/zigbee-stick-v4/) | USB | 1A86:7523 | | [Tube’s EFR32 Pro Ethernet/Serial Coordinator](https://www.tubeszb.com/) | USB | 10C4:EA60 | | [ZigStar Coordinators](https://zig-star.com/) | USB | 1A86:7523 | +| [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. | @@ -228,11 +229,9 @@ The ZHA integration has the ability to perform OTA (over-the-air) firmware updat 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. -<div class="note warning"> - +{% 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. - -</div> +{% endwarning %} ## Configuration - YAML @@ -334,15 +333,14 @@ 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 - -</div> +{% endnote %} ### Service `zha.remove` @@ -425,9 +423,9 @@ ZHA supports Zigbee groups and binding devices to each other. These features can 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. -<div class='note'> -Note that 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. -</div> +{% 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. @@ -610,6 +608,13 @@ The visualization shows multi-hop connections between your paired devices and th The exact method in which these values are reported depends on the Zigbee network stack used on each device. LQI values can be modified at each step as the message propagates through the mesh networking matrix. +#### Why some links are missing in Zigbee network topology maps + +Missing links between Zigbee end devices (often battery-powered devices) in the Zigbee network visualization map are common. They are generally not a sign of a faulty device if the device is still reporting state changes. This happens with sleepy Zigbee end devices and does not mean that the device is no longer connected. + +Some end devices (for example, Xiaomi door sensors) sleep for an extended period, causing the parent Zigbee Router to remove them from its child table via a feature called router child aging. Since using child aging and removing them from the child table is a Zigbee 3.0 feature, this does not always occur because not all Zigbee router devices use child aging. + +This is what causes devices to show a missing link. Even though the device is no longer in the child table, the end device can still communicate via the parent Zigbee router. #### How to interpret RSSI and LQI values Interpreting RSSI and LQI values can be complex, as metrics of network health and communication quality are provided by the devices themselves, and each device could get to its results in different ways. Unless you are a Zigbee specialist yourself or are guided by one, please ignore those values. They can be misleading. If you delve into this, it is important to understand not to judge RSSI or LQI values on their own. When troubleshooting Zigbee messages that are being dropped, you must interpret the combination of both RSSI and LQI. diff --git a/source/_integrations/zone.markdown b/source/_integrations/zone.markdown index b3411912a37c..64d118183854 100644 --- a/source/_integrations/zone.markdown +++ b/source/_integrations/zone.markdown @@ -10,17 +10,58 @@ ha_codeowners: - '@home-assistant/core' ha_domain: zone ha_integration_type: system +related: + - docs: /docs/configuration/basic/ + title: Editing basic settings + - docs: /docs/organizing/areas/ + title: Areas + - docs: /getting-started/onboarding/ + title: Onboarding + - docs: /getting-started/presence-detection/ + title: Presence detection --- -Zones allow you to specify certain regions on earth (for now). When a device tracker sees a device to be within a zone, the state will take the name from the zone. Zones can also be used as a [trigger](/docs/automation/trigger#zone-trigger) or [condition](/docs/scripts/conditions/#zone-condition) inside automation setups. +Zones allow you to specify certain regions on a map. They enable [zone presence-detection](/getting-started/presence-detection/). This information can be used in automations. For example, to start the vacuum after you left home or start the heating at home when you leave the office. -Zones can be added and managed through the user interface at {% my zones title="**Settings** > **Areas, labels & zones**" %}. +Create a zone for each area you want to automate on. For example, work, school, and home. Different technologies can be used to detect presence in these zones. A common method is app-based detection using a mobile phone. -![Screenshot of the UI for adding or editing a zone](/images/integrations/zone/zone_edit_ui.png) +<p class='img'> + <img src="/images/screenshots/map.png" alt="Screenshot of a map dashboard in Home Assistant showing a school, work and home zone and two people."/> + Map dashboard showing a school, work, and a home zone and the location of two people. +</p> -You can add a zone in the user interface by specifying the GPS coordinates or dragging the icon on the map. You can adjust the zone radius (except for the Home zone) by changing the size of the zone circle. +## About the home zone -Zones can also be configured via {% term "`configuration.yaml`" %}: +During the [onboarding process](/getting-started/onboarding/), Home Assistant asked for your home location. You either entered this manually or asked Home Assistant to detect it automatically. This location was used to create the home zone with a 100 m radius. The home zone is a special, pre-defined zone with a few characteristics that set it apart from other zones. + +- The name of this zone is defined by the name of your Home Assistant installation name (which defaults to "Home"). +- The home zone cannot be deleted and is designated with the home icon in the zone configuration page. +- The home zone's location is used by integrations that are location-based. For example, the [Sun integration](/integrations/sun/), which uses it to calculate the position of the sun relative to your home. +- During onboarding, Home Assistant used the location to define settings such as the unit system and time zone. If you change the location later, unit system and time zone will not be changed automatically anymore. +- Devices that are in the home zone will not appear on the map in the Home Assistant UI. For example, if you are using your phone for presence detection, you won't see your phone on the Map dashboard while you are at home. + +## Adding a new zone or editing zones + +1. Go to {% my zones title="**Settings** > **Areas, labels & zones**" %}. +2. To edit an existing zone, select the edit {% icon "mdi:edit" %} button. To add a new zone, select **Add zone**. +3. Give your zone a name, for example `Nina's office`, or `school`. + - The home zone always has the name of your Home Assistant installation. To change the name of the home, go to {% my general title="**Settings** > **System** > **General**" %}. +4. Pick any icon from [Material Design Icons](https://pictogrammers.com/library/mdi/) and prefix the name with `mdi:`. + - For example, `mdi:school`, `mdi:briefcase`, `mdi:home`, `mdi:cart`, or `mdi:castle`. + - For the home zone, the icon cannot be changed. +5. To change location or radius, under **Edit location**, select edit. + - To adjust the location, specify the GPS coordinates or drag the icon on the map + - To change the zone radius, change the size of the zone circle or edit the **Radius** in meters. + + ![Screenshot of the UI for adding or editing a zone](/images/integrations/zone/zone_edit_ui.png) + +6. If you want to hide the zone from the frontend and not use the zone for device tracker state, enable **Passive**. You can still use it in automations. + - For the home zone, **Passive** is not available. +7. To save your changes, select **Update**. + +## Editing zones in YAML + +Zones can also be configured via {% term "`configuration.yaml`" %}. If you define these settings in YAML, they cannot be edited in the UI. They will appear greyed out. ```yaml # Example configuration.yaml entry @@ -66,7 +107,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 @@ -74,19 +115,6 @@ passive: To find the latitude/longitude of a certain place you can use [Google Maps](https://www.google.com/maps/) or [Bing Maps](https://www.bing.com/maps). Just right click and copy the coordinates from there (Bing) or click on the "What is here?" (Google) -## Home zone - -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'> - -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> - -## Icons - -It is recommended that you pick an icon to use for your zone. Pick any icon from [Material Design Icons](https://pictogrammers.com/library/mdi/) and prefix the name with `mdi:`. For example `mdi:school`, `mdi:briefcase`, `mdi:home`, `mdi:cart`, or `mdi:castle`. - ## State The state of a zone is a number, which represents the number of diff --git a/source/_integrations/zoneminder.markdown b/source/_integrations/zoneminder.markdown index 7959118599af..d260c519e313 100644 --- a/source/_integrations/zoneminder.markdown +++ b/source/_integrations/zoneminder.markdown @@ -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..2be9de61aace 100644 --- a/source/_integrations/zwave_js.markdown +++ b/source/_integrations/zwave_js.markdown @@ -94,9 +94,9 @@ 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 @@ -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'> - +{% 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> +{% endnote %} Example 1: @@ -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 @@ -891,9 +885,9 @@ Z-Wave does not automatically poll devices on a regular basis. Polling can quick - 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 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..9e4cb491fa4c 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 page.blog_index %}blog-index{% endif %} {% if root == 'blog' %}blog-post {% if doc == 'categories' %}blog-category{% endif %}{% 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-06-22-release-72.markdown b/source/_posts/2018-06-22-release-72.markdown index 783fb10bdfa3..399a4c0cdce2 100644 --- a/source/_posts/2018-06-22-release-72.markdown +++ b/source/_posts/2018-06-22-release-72.markdown @@ -8,6 +8,7 @@ author_twitter: balloob categories: - Release-Notes - Core +- Dashboard og_image: /images/blog/2018-06-release-0.72/lovelace.png --- 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/2019-01-23-lovelace-released.markdown b/source/_posts/2019-01-23-lovelace-released.markdown index 1048534c7aae..a1092480b2de 100644 --- a/source/_posts/2019-01-23-lovelace-released.markdown +++ b/source/_posts/2019-01-23-lovelace-released.markdown @@ -8,6 +8,7 @@ author_twitter: balloob categories: - Release-Notes - Core +- Dashboard og_image: /images/blog/2019-01-lovelace/demo.png --- 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-06-07-release-20236.markdown b/source/_posts/2023-06-07-release-20236.markdown index c46258ed4137..99b7a87ccc2b 100644 --- a/source/_posts/2023-06-07-release-20236.markdown +++ b/source/_posts/2023-06-07-release-20236.markdown @@ -911,7 +911,7 @@ other choice than to disable this integration. ([@frenck] - [#92124]) ([documentation](/integrations/watson_tts)) [@frenck]: https://github.com/frenck -[#91492]: https://github.com/home-assistant/core/pull/92124 +[#92124]: https://github.com/home-assistant/core/pull/92124 {% enddetails %} @@ -925,7 +925,7 @@ measurement, there is currently no way to get text sensors from IHC working. This is a breaking fix because if you currently have temperature sensors without a unit of measurement set, you will have to set this for the sensors. -([@dingusdk] - [#91096]) ([documentation](/integrations/ihc)) +([@dingusdk] - [#93054]) ([documentation](/integrations/ihc)) [@dingusdk]: https://github.com/dingusdk [#93054]: https://github.com/home-assistant/core/pull/93054 @@ -1068,7 +1068,7 @@ other choice than to disable this integration. ([@frenck] - [#92124]) ([documentation](/integrations/smarty)) [@frenck]: https://github.com/frenck -[#91492]: https://github.com/home-assistant/core/pull/92124 +[#92124]: https://github.com/home-assistant/core/pull/92124 {% enddetails %} 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-07-03-release-20247.markdown b/source/_posts/2024-07-03-release-20247.markdown new file mode 100644 index 000000000000..aa59baa09c67 --- /dev/null +++ b/source/_posts/2024-07-03-release-20247.markdown @@ -0,0 +1,1238 @@ +--- +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) + - [2024.7.3 - July 19](#202473---july-19) + - [2024.7.4 - July 30](#202474---july-30) +- [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 + +### 2024.7.3 - July 19 + +- Fix reauth error and exception in ista EcoTrend integration ([@tr4nt0r] - [#121482]) +- Retain Jellyfin config flow input on connection issue ([@j-stienstra] - [#121618]) +- Update Supla async_set_cover_position to use "REVEAL_PARTIALLY" ([@ontaptom] - [#121663]) +- Bump sunweg 3.0.2 ([@rokam] - [#121684]) +- Allow enigma2 devices to use different source bouquets ([@autinerd] - [#121686]) +- Fix tplink bug changing color temp on bulbs with light effects ([@sdb9696] - [#121696]) +- Bump knocki to 0.3.0 ([@joostlek] - [#121704]) +- Bump pyloadapi to v1.3.2 ([@tr4nt0r] - [#121709]) +- Fix update happening too early in unifiprotect ([@bdraco] - [#121714]) +- Bump knocki to 0.3.1 ([@joostlek] - [#121717]) +- Fix bad access to UniFi runtime_data when not assigned ([@Kane610] - [#121725]) +- Update Idasen Desk library to 2.6.2 ([@abmantis] - [#121729]) +- Bump opower to 0.5.2 to fix 403 forbidden errors for users with multiple accounts ([@tronikos] - [#121762]) +- Pin mashumaro version >= 3.13.1 for python 3.12.4 compatibility. ([@allenporter] - [#121782]) +- Bump pytedee_async to 0.2.20 ([@zweckj] - [#121783]) +- Add some missing tplink ouis ([@bdraco] - [#121785]) +- Use async_connect in newly bumped 0.5.8 UPB library ([@gwww] - [#121789]) +- Bump python-kasa to 0.7.0.4 ([@sdb9696] - [#121791]) +- Add missing translations to Roborock ([@jpbede] - [#121796]) +- Fix alexa does to check `current_position` correctly when handling cover range changes ([@jbouwh] - [#121798]) +- Reolink media second lens ([@starkillerOG] - [#121800]) +- Bump PySwitchbot to 0.48.1 ([@ollo69] - [#121804]) +- Bump aiolifx to 1.0.4 ([@Djelibeybi] - [#121267]) +- Bump aiolifx to 1.0.5 ([@Djelibeybi] - [#121824]) +- Log add/remove index complete at the same level as when it starts ([@bdraco] - [#121852]) +- Fix opentherm_gw availability ([@mvn23] - [#121892]) +- Fix rainforest_raven closing device due to timeout ([@cottsay] - [#121905]) +- Fix enigma2 mute ([@tgorochowik] - [#121928]) +- Fix `configuration_url` for Shelly device using IPv6 ([@bieniu] - [#121939]) +- Narrow sqlite database corruption check to ensure disk image is malformed ([@bdraco] - [#121947]) +- Bump python-holidays to 0.53 ([@gjohansson-ST] - [#122021]) +- Mark UniFi power cycle button as unavailable if PoE is not enabled on port ([@Kane610] - [#122035]) +- Fix hive not updating when boosting ([@HarryEMartland] - [#122042]) +- Update tplink device config during reauth flow ([@sdb9696] - [#122089]) +- Prevent connecting to a Shelly device that is already connected ([@thecode] - [#122105]) +- Bump tplink dependency python-kasa to 0.7.0.5 ([@sdb9696] - [#122119]) +- Update yt-dlp to 2024.07.16 ([@cdce8p] - [#122124]) +- Fix KeyError in config flow of Bring integration ([@tr4nt0r] - [#122136]) + +[#120579]: https://github.com/home-assistant/core/pull/120579 +[#121267]: https://github.com/home-assistant/core/pull/121267 +[#121289]: https://github.com/home-assistant/core/pull/121289 +[#121482]: https://github.com/home-assistant/core/pull/121482 +[#121618]: https://github.com/home-assistant/core/pull/121618 +[#121663]: https://github.com/home-assistant/core/pull/121663 +[#121671]: https://github.com/home-assistant/core/pull/121671 +[#121684]: https://github.com/home-assistant/core/pull/121684 +[#121686]: https://github.com/home-assistant/core/pull/121686 +[#121696]: https://github.com/home-assistant/core/pull/121696 +[#121704]: https://github.com/home-assistant/core/pull/121704 +[#121709]: https://github.com/home-assistant/core/pull/121709 +[#121714]: https://github.com/home-assistant/core/pull/121714 +[#121717]: https://github.com/home-assistant/core/pull/121717 +[#121725]: https://github.com/home-assistant/core/pull/121725 +[#121729]: https://github.com/home-assistant/core/pull/121729 +[#121762]: https://github.com/home-assistant/core/pull/121762 +[#121782]: https://github.com/home-assistant/core/pull/121782 +[#121783]: https://github.com/home-assistant/core/pull/121783 +[#121785]: https://github.com/home-assistant/core/pull/121785 +[#121789]: https://github.com/home-assistant/core/pull/121789 +[#121791]: https://github.com/home-assistant/core/pull/121791 +[#121796]: https://github.com/home-assistant/core/pull/121796 +[#121798]: https://github.com/home-assistant/core/pull/121798 +[#121800]: https://github.com/home-assistant/core/pull/121800 +[#121804]: https://github.com/home-assistant/core/pull/121804 +[#121824]: https://github.com/home-assistant/core/pull/121824 +[#121852]: https://github.com/home-assistant/core/pull/121852 +[#121892]: https://github.com/home-assistant/core/pull/121892 +[#121905]: https://github.com/home-assistant/core/pull/121905 +[#121928]: https://github.com/home-assistant/core/pull/121928 +[#121939]: https://github.com/home-assistant/core/pull/121939 +[#121947]: https://github.com/home-assistant/core/pull/121947 +[#122021]: https://github.com/home-assistant/core/pull/122021 +[#122035]: https://github.com/home-assistant/core/pull/122035 +[#122042]: https://github.com/home-assistant/core/pull/122042 +[#122089]: https://github.com/home-assistant/core/pull/122089 +[#122105]: https://github.com/home-assistant/core/pull/122105 +[#122119]: https://github.com/home-assistant/core/pull/122119 +[#122124]: https://github.com/home-assistant/core/pull/122124 +[#122136]: https://github.com/home-assistant/core/pull/122136 +[@Djelibeybi]: https://github.com/Djelibeybi +[@HarryEMartland]: https://github.com/HarryEMartland +[@Kane610]: https://github.com/Kane610 +[@abmantis]: https://github.com/abmantis +[@allenporter]: https://github.com/allenporter +[@autinerd]: https://github.com/autinerd +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@cdce8p]: https://github.com/cdce8p +[@cottsay]: https://github.com/cottsay +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gwww]: https://github.com/gwww +[@j-stienstra]: https://github.com/j-stienstra +[@jbouwh]: https://github.com/jbouwh +[@joostlek]: https://github.com/joostlek +[@jpbede]: https://github.com/jpbede +[@mvn23]: https://github.com/mvn23 +[@ollo69]: https://github.com/ollo69 +[@ontaptom]: https://github.com/ontaptom +[@rokam]: https://github.com/rokam +[@sdb9696]: https://github.com/sdb9696 +[@starkillerOG]: https://github.com/starkillerOG +[@tgorochowik]: https://github.com/tgorochowik +[@thecode]: https://github.com/thecode +[@tr4nt0r]: https://github.com/tr4nt0r +[@tronikos]: https://github.com/tronikos +[@zweckj]: https://github.com/zweckj + +### 2024.7.4 - July 30 + +- Bump `aiotractive` to 0.6.0 ([@bieniu] - [#121155]) +- Ensure mqtt subscriptions are in a set ([@jbouwh] - [#122201]) +- Add Z-Wave discovery schema for ZVIDAR roller shades ([@alexschneider] - [#122332]) +- Fix device class on sensor in ViCare ([@CFenner] - [#122334]) +- Goofle Generative AI: Fix string format ([@Shulyaka] - [#122348]) +- Ensure script llm tool name does not start with a digit ([@Shulyaka] - [#122349]) +- Bump reolink-aio to 0.9.5 ([@starkillerOG] - [#122366]) +- Fix gemini api format conversion ([@Shulyaka] - [#122403]) +- Fix typo in Matter lock platform ([@marcelveldt] - [#122536]) +- Fix target service attribute on Mastodon integration ([@andrew-codechimp] - [#122546]) +- Bump aiolifx to 1.0.6 ([@Djelibeybi] - [#122569]) +- Bump deebot-client to 8.2.0 ([@edenhaus] - [#122612]) +- Bump aiohue to version 4.7.2 ([@marcelveldt] - [#122651]) +- Return unknown when data is missing in Trafikverket Weather ([@gjohansson-ST] - [#122652]) +- Retry later on OSError during apple_tv entry setup ([@bdraco] - [#122747]) + +[#120579]: https://github.com/home-assistant/core/pull/120579 +[#121155]: https://github.com/home-assistant/core/pull/121155 +[#121289]: https://github.com/home-assistant/core/pull/121289 +[#121671]: https://github.com/home-assistant/core/pull/121671 +[#122194]: https://github.com/home-assistant/core/pull/122194 +[#122201]: https://github.com/home-assistant/core/pull/122201 +[#122332]: https://github.com/home-assistant/core/pull/122332 +[#122334]: https://github.com/home-assistant/core/pull/122334 +[#122348]: https://github.com/home-assistant/core/pull/122348 +[#122349]: https://github.com/home-assistant/core/pull/122349 +[#122366]: https://github.com/home-assistant/core/pull/122366 +[#122403]: https://github.com/home-assistant/core/pull/122403 +[#122536]: https://github.com/home-assistant/core/pull/122536 +[#122546]: https://github.com/home-assistant/core/pull/122546 +[#122569]: https://github.com/home-assistant/core/pull/122569 +[#122612]: https://github.com/home-assistant/core/pull/122612 +[#122651]: https://github.com/home-assistant/core/pull/122651 +[#122652]: https://github.com/home-assistant/core/pull/122652 +[#122747]: https://github.com/home-assistant/core/pull/122747 +[@CFenner]: https://github.com/CFenner +[@Djelibeybi]: https://github.com/Djelibeybi +[@Shulyaka]: https://github.com/Shulyaka +[@alexschneider]: https://github.com/alexschneider +[@andrew-codechimp]: https://github.com/andrew-codechimp +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@edenhaus]: https://github.com/edenhaus +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@jbouwh]: https://github.com/jbouwh +[@marcelveldt]: https://github.com/marcelveldt +[@starkillerOG]: https://github.com/starkillerOG + +## 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/_posts/2024-07-26-dashboard-chapter-2.markdown b/source/_posts/2024-07-26-dashboard-chapter-2.markdown new file mode 100644 index 000000000000..f10e6c5d54c6 --- /dev/null +++ b/source/_posts/2024-07-26-dashboard-chapter-2.markdown @@ -0,0 +1,161 @@ +--- +layout: post +title: "Dashboard chapter 2: Let’s redesign the cards together!" +description: "We have been steadily shipping updates to our new dashboard design every month, and we would like our community of contributors to get involved!" +date: 2024-07-26 00:00:00 +date_formatted: "July 26, 2024" +author: Madelena Mak +comments: true +categories: Dashboard +og_image: /images/blog/2024-07-dashboard-chapter-2/dashboard-banner.png +--- + +<p class='img'> + <lite-youtube videoid="9zmXLxQPr1o" videotitle="A Home-Approved Dashboard - Chapter 2: Let's redesign the cards together!"></lite-youtube> +</p> + +We have been steadily shipping updates to our new dashboard design every month since we announced [Project Grace](/blog/2024/03/04/dashboard-chapter-1/#what-is-project-grace), and our new grid system is finally maturing to a point where we would like our community of contributors to get involved! + +If you are a UX/UI designer or a custom card developer who would like to contribute to the Home Assistant project, [sign up to be part of our dashboard working group](/join-dashboard-group) and read more about what you can do to improve compatibility of your custom cards. + +<!--more--> + +## What’s new since the last chapter? + +Thanks to your feedback, we continued to build upon the grid system and the sections layout with features such as: + +- [Max column option for sections](/blog/2024/04/03/release-20244/#define-the-columns-in-the-section-view) (2024.4) +- [Drag and drop for card features](/blog/2024/05/01/release-20245/#reorder-features-of-the-tile-card) (2024.5) +- [Visibility options for sections and cards](/blog/2024/06/05/release-20246/#dashboards) (2024.6) +- [Dashboard background](/blog/2024/06/05/release-20246/#setting-a-dashboard-background) (2024.6) +- [Resizable cards on sections view](/blog/2024/07/03/release-20247/#resize-the-cards-on-your-dashboard) (2024.7) + +Check out the corresponding blogs for more details. + +### New badges! + +In the upcoming 2024.8, we are introducing our redesigned [badges](/dashboards/badges/). + +The original badges was created as far back as [version 0.7](/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/) in August 2015, and its design has not changed much since. Designed to sit at the top of a dashboard view, badges provide a summary of the most important information that you need to know, at a glance. + +According to our case studies of dashboards created by our users, we found that these badges are underused, mainly due to its outmoded appearance, bulky size, and the lack of configurable options from the UI. Instead, we found that many users are using [Mushroom Chip cards](https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/chips.md), created by [@piitaya](https://github.com/pittaya) who also works at Nabu Casa, for similar purposes. Therefore, we decided to redesign our badges to match the design of the Mushroom Chip cards. + +![New badges sitting on top of a dashboard view!](/images/blog/2024-07-dashboard-chapter-2/new-badges.png) + +The new badges feature a wide range of configurable options from the UI. For each individual badge, you can now specify whether the icon, name, and/or state will be visible, and you can configure the contents within each of these components: States can include multiple attributes to be displayed, and icons can be replaced with the entity picture for a person’s avatar or a media_player’s record cover. + +Visibility options are also available for the new badges, which allow you to show or hide them based on who is viewing the dashboard, what screen size it is displayed within, whether an entity is in a certain state, and more. + +Badges can be easily reordered with drag-and-drop, and they also come with copy, paste, and duplicate features that cards in the new sections view have. Last but not least, the new badges work across both the new sections view and the old masonry view. + +#### Notes for card developers + +On a default installation, we offer one built-in badge, the entity badge. However, you are not limited to that, as you can build and use your own! +Defining a badge is done in a very similar way to defining a custom card. For more information, check out [our developer documentations](https://developers.home-assistant.io/docs/frontend/custom-ui/custom-badge). + +We would love to see your new creations - perhaps a small sparkline graph, or how about a mini progress bar? What do users want to quickly find out on a dashboard at a glance, and what can you display in this small amount of space to get the message across? Let your creativity go wild! + + +## What’s next for Dashboards? + +As the new sections view matures in its featureset, we want to begin our focus on a bigger task: to revamp all the dashboard cards and bring them up to modern standards. To achieve this, we need you - the power of our contributor community! + +### How can we achieve this? + +Once upon a time (I mean, Summer of 2018), [a group of developers came together to create the Lovelace dashboard](/blog/2018/06/22/release-72/). It was built organically - developers contributed where they see a need, either for replicating a feature from the previous States UI, or for adding something that they use personally. While the cards that come with Lovelace are adequate, the usability and aesthetics left much to be improved. In order to raise the bar in our design standards, we need more design-minded contributors. + +Enter (semi) open-source design. + +Traditionally, open-source projects are built around code repositories such as GitHub. This allows easy submission of contributions by anyone who can code. We figured that we may be able to achieve the same for product direction and UX design, too. + +However, it is not easy to start with a blank canvas, and designers and developers have different workflows. Therefore, as the maintainers of the Home Assistant project, we are providing the product goals, the base design framework, and the process to facilitate collaboration. + +### Product goals: What do we want to achieve? + +The goal of Project Grace is to make customization and organization of dashboards easy and intuitive for all users in a household. Dashboards are created to help users monitor and control smart homes, and as cards are the building blocks of dashboards, by extension, cards should also achieve the same product goals: + +- **Monitor**: Allow users to monitor the states of the device and service entities, with data visualizations that are easy and quick to understand. +- **Control**: Allow users to control the devices in their smart homes, mainly with touch screens, and on the desktop with a mouse occasionally. + +To bring them up to modern standards, we want you to join us to: + +- **Revamp existing cards to fit the new grid system.** This will achieve the modularity and ease of customization we are looking to achieve with the sections view. +- **Standardize the design system.** The new cards should adhere to the same design tokens for typography, iconography, shapes, dimensions, and more. +- **Create new cards.** This will fill the current feature gaps that we have not addressed. +- **Extend existing cards with card features.** Card features allow every card to be more modular and be always up-to-date. +- **Incorporate existing popular cards on HACS.** This will reduce the need to install custom cards and also bring them up to the UX standards of the Home Assistant frontend. + +### Design framework: What will our card designs be based upon? + +#### The grid system + +The new cards will be based on the [design grid system](/blog/2024/03/04/dashboard-chapter-1/#the-grid-system) as defined previously, finalized with a few tweaks for better information density and aesthetics. We have reduced the height of each row on the grid to eliminate the empty space between the card contents and card features: + +<p class='text-center'><img src='/images/blog/2024-07-dashboard-chapter-2/card-size-comparison.png' style='width: 66%;' alt='Comparison of the old and new grid dimensions effect on cards'></p> + +The finalized grid dimensions are as follows: + +- Row height: 66px → 56px +- Gutter: 8px +- Icon size: 40px → 36px +- Feature height : 40px → 42px + +<p class='text-center'><img src='/images/blog/2024-07-dashboard-chapter-2/grid-dimensions.png' alt='Grid size dimensions'></p> + +#### Design guidelines + +We have also researched on the design of the Tile card, and here are some of the guidelines we have deduced from the research: + +- Each card used for controls should have a clear primary action. +- Affordance: Everything that is designed to invite users to interact with should look clickable. +- Features get better results than icon buttons. +- Don't clutter up the card. + +As for the rest of the design system, we have been gradually moving towards Material 3 for the past year, but we have yet to finalize and adapt it fully on our frontend. We would like to hear your input on how we can bring it to our cards. + +### Process: How can we work together? + +Since open-source design is not attempted often, there are not a lot of precedents we can refer to. We are experimenting with our process and will tweak it as we learn more. For now, we come up with the following process: + +1. **Working group, assemble!** If you are an UX designer, product person, or a frontend developer, you are welcomed to [sign up](/join-dashboard-group) to be part of the dashboard working group! We pick based on experience in dashboard and card design and development. +2. **Meet and greet.** We will organize introduction workshops where everyone comes together to learn about what we can offer and define our project goals. +3. **Start small.** We will parcel out each individual card as a project. We will start with the easier cards first. Every working group member can work on as many cards as they like. +4. **Research and design.** We will quickly research, ideate, prototype, and validate our designs together, and share our designs and work-in-progress live on Figma. +5. **Let’s build it!** We will clean up and finalize our designs, develop the cards, and launch the new cards with the next HA release! + +### Action items: What can you do as a custom card developer now? + +If you have already created some custom cards, this is a great time to start upgrading your work to the next level! + +#### 1. Fit your custom card into grid system + +In order for your custom card to work well with the sections view, you need to specify the default, minimum, and maximum width and height of your card: + +- **Default** width and height is the size of the card when it is first added to the dashboard. +- **Minimum** width and height is the size of the card when its content cannot shrink further in size to adapt to and be usable with the provided area. +- **Maximum** width and height is the size of the card when its content cannot expand further in size to adapt to and be usable with the provided area. + +Our grid system has a fixed row height, which means that you can estimate how many rows your card will need by dividing the height of your card by the sum of the row height and the gutter. + +For more information on how you can implement the card resizing logic, check out our [developer documentation](https://developers.home-assistant.io/docs/frontend/custom-ui/custom-card#sizing-in-sections-view). + +#### 2. Follow usability guidelines from our user research + +Audit the usability of your custom card with [the guidelines](#design-guidelines) as mentioned above. + +#### 3. Create new card features + +<p class='text-center'><img src='https://developers.home-assistant.io/assets/images/dashboard-custom-card-feature-screenshot-8425524ea32eb5d4744a7557fcfcab33.png' alt='Card feature example'></p> + +Card features are widgets that can be placed inside cards for displaying or controlling an attribute of the entity. By building [custom card features](https://developers.home-assistant.io/docs/frontend/custom-ui/custom-card-feature), you can expand the abilities of many cards that support card features. You can also allow your custom card to use card features, similar to what we had done to the [Thermostat card]. + +#### 4. Ensure features are editable in UI + +<p class='text-center'><img src='/images/blog/2024-07-dashboard-chapter-2/card-visual-editor-example.png' style='width: 50%;' alt='Example of a visual editor for a card'></p> + +The inclusion of a [visual editor](https://developers.home-assistant.io/docs/frontend/custom-ui/custom-card-feature) is key to the ease of use of your custom cards, allowing more people to be able to edit and use them on their dashboards. Be sure to include only the necessary options in the visual editor, while also hide away the less used options in YAML or in an accordion UI to avoid clutter. + +--- + +That’s all from us this time! To learn more about the UX research and design thinking behind the dashboard, be sure to check out our [Dashboard Chapter 2 live stream](https://www.youtube.com/watch?v=9zmXLxQPr1o)! + diff --git a/source/_posts/2024-08-01-streamlining-the-home-assistant-yellow-lineup.markdown b/source/_posts/2024-08-01-streamlining-the-home-assistant-yellow-lineup.markdown new file mode 100644 index 000000000000..34d5e58bb682 --- /dev/null +++ b/source/_posts/2024-08-01-streamlining-the-home-assistant-yellow-lineup.markdown @@ -0,0 +1,117 @@ +--- +layout: post +title: "Streamlining the Home Assistant Yellow lineup" +description: "Home Assistant Yellow continues to be our flagship product, and the line is getting a small tweak." +date: 2024-08-01 00:00:01 +date_formatted: "August 1, 2024" +author: Andy Gill +comments: true +categories: Announcements +og_image: /images/blog/2024-08-yellow-lineup/art.jpg +--- +<p class='img'><img src='/images/blog/2024-08-yellow-lineup/art.jpg' style='border: 0;box-shadow: none;' alt="Home Assistant Yellow and packaging">Home Assistant Yellow fully assembled with additional (and not included) NVMe storage and Z-Wave GPIO module</p> + +**TL;DR:**  We will now only sell the Home Assistant Yellow as a kit, which requires the separate purchase of a CM4. Home Assistant Green is the best plug-and-play option for beginners. + +An important part of getting more people to use Home Assistant is providing great purpose-built hardware. It's our goal to provide hardware that makes it easier than ever to start with Home Assistant, along with compelling options for advanced users.  In 2022, we began shipping our [Home Assistant Yellow](/yellow/), and I'm happy to say that now in 2024, it remains our flagship hardware product.  We see a long life ahead for this expandable little powerhouse, and that's why we're streamlining our hardware lineup to make a bit more sense going forward. + +We will now only sell the Home Assistant Yellow as a kit and have stopped producing the Home Assistant Yellow Standard (our version that came preassembled with a CM4 and Home Assistant already installed). Rest assured, as the Home Assistant Yellow Standard's hardware is identical to our kits, it will continue to receive the same support and software updates. The kits will continue to be available with or without power-over-ethernet (PoE). + +It's not the biggest change, but we wanted our community to know - and if you want to see why we made the change, and how our [current hardware compares](#comparison), keep reading. + +<!--more--> + +## Background + +When we launched Home Assistant Yellow, we designed it with expandability in mind.  It includes an onboard Zigbee/Thread radio, M.2 for more robust storage, and USB ports to add more connectivity (like adding our future [Z-Wave device](/blog/2024/06/12/roadmap-2024h1/#next-priority-home-assistant-connect-hardware-for-z-wave)).  Most importantly, you can change the core specs of the device by swapping the Raspberry Pi Compute Module 4 (CM4).  This allows users to increase the RAM, add eMMC storage, or even add built-in Wi-Fi/Bluetooth. + +All this expandability is great, but we found many users wanted a more straightforward way to get started with Home Assistant. That's why we created the Home Assistant Yellow Standard variant, which included a CM4 with Home Assistant already installed onto the board - unlike our kits there was no assembly required. This meant you could immediately start using it after plugging in Ethernet and power. + +### Green meets Yellow + +Jump ahead to 2023, and in our quest to create an even more affordable starting point, we launched [Home Assistant Green](/green/). Not only does it cost less, it better fulfills the plug-and-play role the Home Assistant Yellow Standard used to occupy. From a timing perspective 2021 and 2022, were not the easiest time to source Raspberry Pi products, including the CM4. We learned some big lessons about the added supply chain complexities of this kind of product, and it influenced our thinking when designing Green. Ultimately, Home Assistant Green being a better beginner option led us to end production of the Standard. Though the Home Assistant Yellow Standard is now out of stock at major retailers, it will continue to receive support. + +## Comparison + +<p class='img'><img src='/images/blog/2024-08-yellow-lineup/green-meets-yellow.jpg' style='border: 0;box-shadow: none;' alt="Home Assistant Green and Yellow compared">Home Assistant Green and Yellow compared - as you can see they're about the same size</p> +So you've decided on getting some official Home Assistant hardware and don't know where to start, here's a little comparison to help you choose between the Green and Yellow. + +<br><br> +<table style="font-size: 0.9em; width: 100%;"> + <colgroup> + <col style="width: 20%;"> + <col style="width: 40%;"> + <col style="width: 40%;"> + </colgroup> + <thead> + <tr> + <th style="font-size: 1.2em;">Features</th> + <th style="font-size: 1.2em;">Home Assistant Green</th> + <th style="font-size: 1.2em;">Home Assistant Yellow Kit</th> + </tr> + </thead> + <tbody> + <tr> + <td><b>Best for</b></td> + <td>Beginners, plug-and-play</td> + <td>Advanced users, tinkerers, expandability</td> + </tr> + <tr> + <td><b>Setup</b></td> + <td>Easy - plug in the two included cables, and you're up and running</td> + <td>Requires purchase of a CM4, basic <a href="https://yellow.home-assistant.io/power-supply/">assembly</a>, and <a href="https://yellow.home-assistant.io/power-supply/#installing-home-assistant-software-on-kit">software installation</a></td> + </tr> + <tr> + <td><b>Connectivity</b></td> + <td>Ethernet via included cable</td> + <td>Ethernet via included cable</td> + </tr> + <tr> + <td><b>Zigbee/Thread built-in</b></td> + <td>No <p>(Can be added with <a href="/connectzbt1/">Home Assistant Connect ZBT-1</a>)</p></td> + <td>Yes <p>(Onboard <a href="https://yellow.home-assistant.io/guides/about-firmware-options/">Zigbee 3.0 / Thread</a>)</p></td> + </tr> + <tr> + <td><b>Expandability</b></td> + <td> + Good + <ul> + <li>2x USB ports</li> + </ul> + </td> + <td> + Best + <ul> + <li>1x Compute module connector (RAM, eMMC, Wi-Fi/Bluetooth)</li> + <li>1x NVMe slot</li> + <li>2x USB ports</li> + <li>10-pin GPIO</li> + </ul> + </td> + </tr> + <tr> + <td><b>Power</b></td> + <td>Included power supply</td> + <td> + <a href="https://yellow.home-assistant.io/">Model dependent</a>: + <ul> + <li>Kit: included power supply</li> + <li>Kit PoE: Power-over-Ethernet, no power supply</li> + </ul> + </td> + </tr> + <tr> + <td><b>What else do they have in common</b></td> + <td colspan="2">Both are small, fanless/silent, have extremely low power draw, and solid performance, leading to a smooth Home Assistant experience. Plus, purchasing either supports the development of Home Assistant!</td> + </tr> + <tr> + <td><b>More information</b></td> + <td><a href="/green/">Learn more about Home Assistant Green</a></td> + <td><a href="/yellow/">Learn more about Home Assistant Yellow</a></td> + </tr> + </tbody> +</table> + +## Conclusion + +This small change helps us keep things simple while continuing to provide great hardware options for new and existing users. But as we always say, run Home Assistant on whatever hardware you have, whether that's our hardware or whatever you already have on hand. In the end, one of our main goals is to build a more sustainable smart home. diff --git a/source/_redirects b/source/_redirects index 157d74fc4dbf..a0de377a2c76 100644 --- a/source/_redirects +++ b/source/_redirects @@ -34,8 +34,9 @@ layout: null /yellow https://yellow.home-assistant.io /blog/2021/09/13/home-assistant-amber/ /blog/2021/09/13/home-assistant-yellow/ -# User research +# Design & User research /join-research https://forms.clickup.com/2533032/f/2d9n8-12931/52N1KK00E9BXEW71TN +/join-dashboard-group https://forms.clickup.com/2533032/f/2d9n8-18091/711QWINKTF866N9HYV # Older development pages /developers https://developers.home-assistant.io @@ -346,8 +347,6 @@ layout: null /getting-started/scripts-service-calls /docs/scripts/service-calls /getting-started/scripts-conditions /docs/scripts/conditions /getting-started/securing /docs/configuration/securing -/getting-started/troubleshooting /docs/troubleshooting -/getting-started/troubleshooting-configuration /docs/troubleshooting /getting-started/updating /common-tasks/os /getting-started/yaml /docs/configuration/yaml /getting-started/z-wave /integrations/zwave_js @@ -490,6 +489,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 +517,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/changelogs/core-2024.7.markdown b/source/changelogs/core-2024.7.markdown new file mode 100644 index 000000000000..6c8b1f8d9175 --- /dev/null +++ b/source/changelogs/core-2024.7.markdown @@ -0,0 +1,2888 @@ +--- +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 + +## Release 2024.7.3 - July 19 + +- Fix reauth error and exception in ista EcoTrend integration ([@tr4nt0r] - [#121482]) +- Retain Jellyfin config flow input on connection issue ([@j-stienstra] - [#121618]) +- Update Supla async_set_cover_position to use "REVEAL_PARTIALLY" ([@ontaptom] - [#121663]) +- Bump sunweg 3.0.2 ([@rokam] - [#121684]) +- Allow enigma2 devices to use different source bouquets ([@autinerd] - [#121686]) +- Fix tplink bug changing color temp on bulbs with light effects ([@sdb9696] - [#121696]) +- Bump knocki to 0.3.0 ([@joostlek] - [#121704]) +- Bump pyloadapi to v1.3.2 ([@tr4nt0r] - [#121709]) +- Fix update happening too early in unifiprotect ([@bdraco] - [#121714]) +- Bump knocki to 0.3.1 ([@joostlek] - [#121717]) +- Fix bad access to UniFi runtime_data when not assigned ([@Kane610] - [#121725]) +- Update Idasen Desk library to 2.6.2 ([@abmantis] - [#121729]) +- Bump opower to 0.5.2 to fix 403 forbidden errors for users with multiple accounts ([@tronikos] - [#121762]) +- Pin mashumaro version >= 3.13.1 for python 3.12.4 compatibility. ([@allenporter] - [#121782]) +- Bump pytedee_async to 0.2.20 ([@zweckj] - [#121783]) +- Add some missing tplink ouis ([@bdraco] - [#121785]) +- Use async_connect in newly bumped 0.5.8 UPB library ([@gwww] - [#121789]) +- Bump python-kasa to 0.7.0.4 ([@sdb9696] - [#121791]) +- Add missing translations to Roborock ([@jpbede] - [#121796]) +- Fix alexa does to check `current_position` correctly when handling cover range changes ([@jbouwh] - [#121798]) +- Reolink media second lens ([@starkillerOG] - [#121800]) +- Bump PySwitchbot to 0.48.1 ([@ollo69] - [#121804]) +- Bump aiolifx to 1.0.4 ([@Djelibeybi] - [#121267]) +- Bump aiolifx to 1.0.5 ([@Djelibeybi] - [#121824]) +- Log add/remove index complete at the same level as when it starts ([@bdraco] - [#121852]) +- Fix opentherm_gw availability ([@mvn23] - [#121892]) +- Fix rainforest_raven closing device due to timeout ([@cottsay] - [#121905]) +- Fix enigma2 mute ([@tgorochowik] - [#121928]) +- Fix `configuration_url` for Shelly device using IPv6 ([@bieniu] - [#121939]) +- Narrow sqlite database corruption check to ensure disk image is malformed ([@bdraco] - [#121947]) +- Bump python-holidays to 0.53 ([@gjohansson-ST] - [#122021]) +- Mark UniFi power cycle button as unavailable if PoE is not enabled on port ([@Kane610] - [#122035]) +- Fix hive not updating when boosting ([@HarryEMartland] - [#122042]) +- Update tplink device config during reauth flow ([@sdb9696] - [#122089]) +- Prevent connecting to a Shelly device that is already connected ([@thecode] - [#122105]) +- Bump tplink dependency python-kasa to 0.7.0.5 ([@sdb9696] - [#122119]) +- Update yt-dlp to 2024.07.16 ([@cdce8p] - [#122124]) +- Fix KeyError in config flow of Bring integration ([@tr4nt0r] - [#122136]) + +[#120579]: https://github.com/home-assistant/core/pull/120579 +[#121267]: https://github.com/home-assistant/core/pull/121267 +[#121289]: https://github.com/home-assistant/core/pull/121289 +[#121482]: https://github.com/home-assistant/core/pull/121482 +[#121618]: https://github.com/home-assistant/core/pull/121618 +[#121663]: https://github.com/home-assistant/core/pull/121663 +[#121671]: https://github.com/home-assistant/core/pull/121671 +[#121684]: https://github.com/home-assistant/core/pull/121684 +[#121686]: https://github.com/home-assistant/core/pull/121686 +[#121696]: https://github.com/home-assistant/core/pull/121696 +[#121704]: https://github.com/home-assistant/core/pull/121704 +[#121709]: https://github.com/home-assistant/core/pull/121709 +[#121714]: https://github.com/home-assistant/core/pull/121714 +[#121717]: https://github.com/home-assistant/core/pull/121717 +[#121725]: https://github.com/home-assistant/core/pull/121725 +[#121729]: https://github.com/home-assistant/core/pull/121729 +[#121762]: https://github.com/home-assistant/core/pull/121762 +[#121782]: https://github.com/home-assistant/core/pull/121782 +[#121783]: https://github.com/home-assistant/core/pull/121783 +[#121785]: https://github.com/home-assistant/core/pull/121785 +[#121789]: https://github.com/home-assistant/core/pull/121789 +[#121791]: https://github.com/home-assistant/core/pull/121791 +[#121796]: https://github.com/home-assistant/core/pull/121796 +[#121798]: https://github.com/home-assistant/core/pull/121798 +[#121800]: https://github.com/home-assistant/core/pull/121800 +[#121804]: https://github.com/home-assistant/core/pull/121804 +[#121824]: https://github.com/home-assistant/core/pull/121824 +[#121852]: https://github.com/home-assistant/core/pull/121852 +[#121892]: https://github.com/home-assistant/core/pull/121892 +[#121905]: https://github.com/home-assistant/core/pull/121905 +[#121928]: https://github.com/home-assistant/core/pull/121928 +[#121939]: https://github.com/home-assistant/core/pull/121939 +[#121947]: https://github.com/home-assistant/core/pull/121947 +[#122021]: https://github.com/home-assistant/core/pull/122021 +[#122035]: https://github.com/home-assistant/core/pull/122035 +[#122042]: https://github.com/home-assistant/core/pull/122042 +[#122089]: https://github.com/home-assistant/core/pull/122089 +[#122105]: https://github.com/home-assistant/core/pull/122105 +[#122119]: https://github.com/home-assistant/core/pull/122119 +[#122124]: https://github.com/home-assistant/core/pull/122124 +[#122136]: https://github.com/home-assistant/core/pull/122136 +[@Djelibeybi]: https://github.com/Djelibeybi +[@HarryEMartland]: https://github.com/HarryEMartland +[@Kane610]: https://github.com/Kane610 +[@abmantis]: https://github.com/abmantis +[@allenporter]: https://github.com/allenporter +[@autinerd]: https://github.com/autinerd +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@cdce8p]: https://github.com/cdce8p +[@cottsay]: https://github.com/cottsay +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@gwww]: https://github.com/gwww +[@j-stienstra]: https://github.com/j-stienstra +[@jbouwh]: https://github.com/jbouwh +[@joostlek]: https://github.com/joostlek +[@jpbede]: https://github.com/jpbede +[@mvn23]: https://github.com/mvn23 +[@ollo69]: https://github.com/ollo69 +[@ontaptom]: https://github.com/ontaptom +[@rokam]: https://github.com/rokam +[@sdb9696]: https://github.com/sdb9696 +[@starkillerOG]: https://github.com/starkillerOG +[@tgorochowik]: https://github.com/tgorochowik +[@thecode]: https://github.com/thecode +[@tr4nt0r]: https://github.com/tr4nt0r +[@tronikos]: https://github.com/tronikos +[@zweckj]: https://github.com/zweckj + +## Release 2024.7.4 - July 30 + +- Bump `aiotractive` to 0.6.0 ([@bieniu] - [#121155]) +- Ensure mqtt subscriptions are in a set ([@jbouwh] - [#122201]) +- Add Z-Wave discovery schema for ZVIDAR roller shades ([@alexschneider] - [#122332]) +- Fix device class on sensor in ViCare ([@CFenner] - [#122334]) +- Goofle Generative AI: Fix string format ([@Shulyaka] - [#122348]) +- Ensure script llm tool name does not start with a digit ([@Shulyaka] - [#122349]) +- Bump reolink-aio to 0.9.5 ([@starkillerOG] - [#122366]) +- Fix gemini api format conversion ([@Shulyaka] - [#122403]) +- Fix typo in Matter lock platform ([@marcelveldt] - [#122536]) +- Fix target service attribute on Mastodon integration ([@andrew-codechimp] - [#122546]) +- Bump aiolifx to 1.0.6 ([@Djelibeybi] - [#122569]) +- Bump deebot-client to 8.2.0 ([@edenhaus] - [#122612]) +- Bump aiohue to version 4.7.2 ([@marcelveldt] - [#122651]) +- Return unknown when data is missing in Trafikverket Weather ([@gjohansson-ST] - [#122652]) +- Retry later on OSError during apple_tv entry setup ([@bdraco] - [#122747]) + +[#120579]: https://github.com/home-assistant/core/pull/120579 +[#121155]: https://github.com/home-assistant/core/pull/121155 +[#121289]: https://github.com/home-assistant/core/pull/121289 +[#121671]: https://github.com/home-assistant/core/pull/121671 +[#122194]: https://github.com/home-assistant/core/pull/122194 +[#122201]: https://github.com/home-assistant/core/pull/122201 +[#122332]: https://github.com/home-assistant/core/pull/122332 +[#122334]: https://github.com/home-assistant/core/pull/122334 +[#122348]: https://github.com/home-assistant/core/pull/122348 +[#122349]: https://github.com/home-assistant/core/pull/122349 +[#122366]: https://github.com/home-assistant/core/pull/122366 +[#122403]: https://github.com/home-assistant/core/pull/122403 +[#122536]: https://github.com/home-assistant/core/pull/122536 +[#122546]: https://github.com/home-assistant/core/pull/122546 +[#122569]: https://github.com/home-assistant/core/pull/122569 +[#122612]: https://github.com/home-assistant/core/pull/122612 +[#122651]: https://github.com/home-assistant/core/pull/122651 +[#122652]: https://github.com/home-assistant/core/pull/122652 +[#122747]: https://github.com/home-assistant/core/pull/122747 +[@CFenner]: https://github.com/CFenner +[@Djelibeybi]: https://github.com/Djelibeybi +[@Shulyaka]: https://github.com/Shulyaka +[@alexschneider]: https://github.com/alexschneider +[@andrew-codechimp]: https://github.com/andrew-codechimp +[@bdraco]: https://github.com/bdraco +[@bieniu]: https://github.com/bieniu +[@edenhaus]: https://github.com/edenhaus +[@frenck]: https://github.com/frenck +[@gjohansson-ST]: https://github.com/gjohansson-ST +[@jbouwh]: https://github.com/jbouwh +[@marcelveldt]: https://github.com/marcelveldt +[@starkillerOG]: https://github.com/starkillerOG + +[#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 91a9c8a0d83a..258b1250e021 100644 --- a/source/common-tasks/os.markdown +++ b/source/common-tasks/os.markdown @@ -77,8 +77,8 @@ You can manually define that the previous boot slot is used. This can be useful ### Updating Home Assistant Core {% include common-tasks/update.md %} + {% include common-tasks/network_storage.md %} -{% include common-tasks/commandline.md %} {% include common-tasks/lost_password.md %} {% include common-tasks/third-party-addons.md %} {% include common-tasks/configuration_check.md %} @@ -92,3 +92,9 @@ To see which version your system is running, go to {% my info title="**Settings* {% include common-tasks/development_version.md %} {% include common-tasks/data_disk.md %} + +<!-- Accessing Home Assistant from the commandline--> +{% include common-tasks/commandline.md %} + +<!-- Enabling i2c--> +{% include common-tasks/enable_i2c.md %} diff --git a/source/common-tasks/supervised.markdown b/source/common-tasks/supervised.markdown index 74a9c6101fab..ca6781d71518 100644 --- a/source/common-tasks/supervised.markdown +++ b/source/common-tasks/supervised.markdown @@ -15,7 +15,6 @@ related: {% include common-tasks/update.md %} {% include common-tasks/network_storage.md %} -{% include common-tasks/commandline.md %} {% include common-tasks/lost_password.md %} {% include common-tasks/third-party-addons.md %} {% include common-tasks/configuration_check.md %} @@ -26,4 +25,6 @@ To see which version your system is running, go to {% my info title="**Settings* {% include common-tasks/specific_version.md %} {% include common-tasks/beta_version.md %} -{% include common-tasks/development_version.md %} \ No newline at end of file +{% include common-tasks/development_version.md %} + +{% include common-tasks/commandline.md %} \ No newline at end of file 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..ae7370fd31d8 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` service 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..5067a348deba 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 diff --git a/source/getting-started/concepts-terminology.markdown b/source/getting-started/concepts-terminology.markdown index a53e51760532..12dfdb831363 100644 --- a/source/getting-started/concepts-terminology.markdown +++ b/source/getting-started/concepts-terminology.markdown @@ -18,6 +18,8 @@ Once an {% term integration %} has been added, the hardware and/or data are repr Entities are the basic building blocks to hold data in Home Assistant. An {% term entity %} represents a {% term sensor %}, actor, or function in Home Assistant. Entities are used to monitor physical properties or to control other {% term entities %}. An {% term entity %} is usually part of a {% term device %} or a {% term service %}. Entities have {% term states %}. +<p class='img'><img src='/images/getting-started/entities.png' style='border: 0;box-shadow: none;' alt="Screenshot showing the Entities table">Screenshot of the Entities table. Each line represents an entity.</p> + ## Devices Devices are a logical grouping for one or more {% term entities %}. A {% term device %} may represent a physical {% term device %}, which can have one or more sensors. The sensors appear as entities associated with the {% term device %}. For example, a motion sensor is represented as a {% term device %}. It may provide motion detection, temperature, and light levels as {% term entities %}. Entities have states such as *detected* when motion is detected and *clear* when there is no motion. @@ -66,8 +68,12 @@ To learn how to use {% term scenes %}, refer to the [scene](/integrations/scene/ ## Add-ons -Depending on your [installation type](/installation), you can install third party add-ons. Add-ons are usually apps that can be run with Home Assistant but provide a quick and easy way to install, configure, and run within Home Assistant. Add-ons provide additional functionality whereas {% term integrations %} connect Home Assistant to other apps. +Add-ons are third-party applications that provide additional functionality in Home Assistant. Add-ons run directly alongside Home Assistant, whereas {% term integrations %} connect Home Assistant to other apps. Add-ons are only supported by the {% term "Home Assistant Operating System" %} and {% term "Home Assistant Supervised" %} [installation type](/installation). + +Add-ons are installed from the add-on store under {% my supervisor title="**Settings** > **Add-ons**" %}. If you are curious now and feel like installing every add-on that looks interesting: beware that add-ons can use quite a bit of resources in terms of disk space, memory, and additional load on the processor. + +Among the most used add-ons are the ones that provide [file access and edit files](/docs/configuration/#to-set-up-access-to-the-files-and-prepare-an-editor) in Home Assistant. -![Add-ons](/images/getting-started/add-ons.png) +<p class='img'><img src='/images/getting-started/add-ons.png' style='border: 0;box-shadow: none;' alt="Screenshot of the add-on page">Screenshot of the add-on page, showing all the installed add-ons on a test system.</p> {% include getting-started/next_step.html step="Edit the dashboard" link="/getting-started/onboarding_dashboard/" %} diff --git a/source/getting-started/configuration.markdown b/source/getting-started/configuration.markdown index b18abfa0212f..7ee91082b739 100644 --- a/source/getting-started/configuration.markdown +++ b/source/getting-started/configuration.markdown @@ -1,61 +1,57 @@ --- -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'> +## Adding other persons to Home Assistant -The steps below do not apply to Home Assistant Core & Container installations, for those types of installations, [see here](/docs/configuration/). +You can add other people to Home Assistant. They can have their own login, use Home Assistant on their devices and create their own dashboards. To add other people, refer to [Adding a person to Home Assistant](/integrations/person/#adding-a-person-to-home-assistant). -</div> +## Apps for Android and iOS -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 use Home Assistant on your phone, smartwatch, and even in your car. -![Add-on store.](/images/hassio/screenshots/dashboard.png) +- To learn how to install Home Assistant on Android or iOS, refer to the [documentation for the Companion Apps](https://companion.home-assistant.io/). +- Want to use your voice to control Home Assistant? + - Refer to the documentation on using [Assist on Android](/voice_control/android/). -Under the **Official add-ons** section, you will find the **File editor** add-on. +## Changing the basic settings - - 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**. +To change basic settings such as location, unit system, and language, refer to [Changing basic settings](/docs/configuration/basic/). -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. +## Creating a backup - - 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. +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. -</div> +To learn how to create a backup of your Home Assistant installation, refer to the following topics: - - 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. +- {% 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) -![Screenshot of the "General" page in the configuration panel.](/images/screenshots/configuration-validation.png) +## Editing the configuration.yaml and configuring file access -<div class='note'> +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. - 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. +## 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. -### Editing configuration via Samba/Windows Networking +## Getting started with voice assistant -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. +If you want to get started with a voice assistant, refer to the documentation on [Assist](/voice_control/). -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). 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.markdown b/source/getting-started/onboarding.markdown index e9df380e60b7..74d608175f9d 100644 --- a/source/getting-started/onboarding.markdown +++ b/source/getting-started/onboarding.markdown @@ -3,56 +3,55 @@ title: "Onboarding Home Assistant" description: "Instructions to get Home Assistant configured." --- -Alright, you made it here. The tough part is done. +After Home Assistant has been [installed](/installation/) on your device, there are 5 steps to complete setting up Home Assistant. -- As the last step of the [installation procedure](/installation/) specific to your device, you entered the Home Assistant device's address in your browser's address bar. - - Typically, this is `http://homeassistant.local:8123/`. - - 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 device's IP address). - - - **Result**: You now see the welcome screen. Depending on your hardware, preparation may take a while. +1. Enter the following URL into the browser's address bar: [http://homeassistant.local:8123/](http://homeassistant.local:8123/). + - **Result**: You now see the **Preparing Home Assistant** page. Depending on your hardware and internet connection, preparation may take a while. + - Home Assistant downloads the latest version of {% term "Home Assistant Core" %} (about 700 MB). + - If you ran into issues with this step, refer to the [installation troubleshooting](/installation/troubleshooting/). + - Once preparation is finished, the welcome screen is shown. ![Home Assistant preparation](/images/getting-started/onboarding_preparing_01_.png) - - Depending on the preinstalled software version, you might see a slightly different version of the welcome screen. - - To view the log files, select the pulsing blue dot. - - ![Home Assistant preparation](/images/getting-started/onboarding_preparing_01.png) - -With Home Assistant installed, it's time to set up the basics. - -We will now create the owner's account of Home Assistant. This account is an administrator account. It will always be able to change everything. - -1. If you want to restore from a backup of a previous installation, select **Restore from backup**. - - Continue with the procedure on [restoring from backup](/common-tasks/os/#restoring-a-backup). - - Ignore the rest of this procedure. The following steps describe how to create a new installation, not how to restore from backup. -2. If this is your initial installation, select **Create my smart home**. -3. Enter a name, username, and password. - - Store the name, username, and password in a password manager. There is no way to recover the owner credentials. - - Select **Create account**. +2. You can either create a new installation or recover an existing installation from a backup: + - **Option 1: new installation**: If this is your initial installation, we will now create the owner's account of Home Assistant. + - {% icon "mdi:information-outline" %} This account is an administrator account. It will always be able to change everything. + - Select **Create my smart home**. + - Enter a name, username, and password. + - Make sure the username is lowercase and contains no whitespace. + - Store the name, username, and password somewhere safe. There is no way to recover the owner credentials. + - Select **Create account**. ![Set your username and password.](/images/getting-started/username.png) -4. Enter the location of your home. - - The location is used to populate settings such as time zone, unit system, and currency. - - It is also used for location-based information and automations: for example showing the weather-forecast, opening the shades at sunrise, or starting the vacuum when you leave the home. - - If you'd rather not send your location, you can choose a location far away from where you live. + - **Option 2: restore from backup**: If you want to restore a backup of a previous installation, select **Restore from backup**. + - Ignore the rest of this procedure and continue with the procedure on [restoring from backup](/common-tasks/os/#restoring-a-backup). + - If you have a Home Assistant Yellow, start with the [Yellow documentation on restoring from backup](https://yellow.home-assistant.io/guides/restore-backup/). + - If you have a Home Assistant Green, start with the [Green documentation on restoring from backup](https://green.home-assistant.io/guides/restore-backup/). + +3. Enter the location of your home. + - The home location is used to configure the time zone, unit system, and currency. + - It is also used to create the home [zone](/integrations/zone/), which designates the area of your home with a default radius of 100 m. - You can always change this information later in the settings. + - This home zone can be used for automations such as showing the weather, opening the shades at sunrise, or starting the vacuum when you leave the home. + - After finding your location, select **Next**. ![Define your location.](/images/getting-started/onboarding_location.png) -5. Select which information you are willing to share. +4. Select which information you are willing to share. - Sharing is disabled by default. However, we would like to encourage you to share some of this data. - - This information helps us to find out which platforms we need to support and where to focus our efforts. + - This information helps us find out which platforms we need to support and where to focus our efforts. - The data is anonymized and aggregated. To see the charts we generate out of this data, take a look at our [analytics page](https://analytics.home-assistant.io/). + - To confirm, select **Next**. ![Share anonymized data](/images/getting-started/onboarding_share_anonymized_info.png) -6. Once you are done, select **Next**. - - Home Assistant will then show any {% term devices %} it has discovered on your network. +5. Check out the {% term devices %} Home Assistant has discovered on your network. - Don't be alarmed if you see fewer items than shown below; you can always manually add devices later. - + - Select **Finish**. ![Discovery of devices on your network.](/images/getting-started/onboarding_devices.png) -7. Finally, select **Finish**. - - Now you're brought to the Home Assistant web interface. If some of your devices were discovered and set up automatically, this default dashboard may already show some of your devices. +6. {% icon "mdi:party-popper" %} You’ve now got Home Assistant up and running. + - You now see the default [dashboard](/dashboards/). + - If some of your devices were discovered and set up automatically, this shows those devices. {% include getting-started/next_step.html step="Concepts & Terminology" link="/getting-started/concepts-terminology/" %} 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..5ef07b83cf16 100644 --- a/source/getting-started/presence-detection.markdown +++ b/source/getting-started/presence-detection.markdown @@ -1,32 +1,68 @@ --- title: "Setting up presence detection" -description: "Instructions on how to setup presence detection within Home Assistant." +description: "Instructions on how to set up zone presence detection within Home Assistant." --- -Presence detection detects if people are home, which can be valuable input for automation. Knowing who is home or where they are, will open a whole range of other automation options: +Zone presence detection detects if people are within a certain zone, which can be valuable input for automation. Knowing who is home or where they are opens a range of automation options: - Send me a notification when my child arrives at school - Turn on the AC when I leave work -![Screenshot of Home Assistant showing a school, work and home zone and two people.](/images/screenshots/map.png) +<p class='img'> + <img src="/images/screenshots/map.png" alt="Screenshot of a map dashboard in Home Assistant showing a school, work and home zone and two people."/> + Map dashboard showing a school, work, and a home zone and the location of two people. +</p> -### Adding presence detection +## About setting up zone presence detection -There are different ways of setting up presence detection. Usually the easiest way to detect presence is by checking which {% term devices %} are connected to the network. You can do that if you have one of our [supported routers][routers]. By leveraging what your router already knows, you can easily detect if people are at home. +There are different ways of setting up zone presence detection. One way is to run an app on your phone to send detailed location information to your Home Assistant instance. Another way to detect presence is by checking which {% term devices %} are connected to the network. You can do that if you have one of our [supported routers][routers]. By leveraging what your router already knows, you can detect if people are at home. -It's also possible to run an app on your phone to provide detailed location information to your Home Assistant instance. For iOS and Android, we suggest using the [Home Assistant Companion app][companion]. +## Adding zone presence detection with a mobile phone -During the setup of Home Assistant Companion on your mobile device, the app will ask for permission to allow the device's location to be provided to Home Assistant. Allowing this will create a `device_tracker` entity for that device which can be used in automations and conditions. +### Prerequisites -### Zones +- [Home Assistant installed](/installation/) +- [Onboarding steps](/getting-started/onboarding/) completed +- [Remote access enabled](/docs/configuration/remote/) + - The easiest way to do this is by enabling + - [Home Assistant Cloud](https://nabucasa.com/config/) +- Mobile phone: + - Android (Android 5 or later) or iPhone (iOS 15 or later) + - Phone plan with Internet access + - Access to your local network where Home Assistant is running +- [Home Assistant Companion app installed](https://companion.home-assistant.io/docs/getting_started/) on your phone. + - During the setup procedure, make sure to grant **Location access**. + - Location access creates a `device_tracker` entity for that device. This entity can be used in automations and conditions. -![Map with zones](/images/screenshots/badges-zone.png) +### To add zone presence detection with a mobile phone -{% 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. +1. Open the Home Assistant Companion app on your phone and log in to your Home Assistant instance. +2. On the screen to **Connect to Home Assistant**, make sure you activate **Enable location tracking**. + - Select **Continue**. +3. Go to {% my integrations title="**Settings** > **Devices** & **Services**" %} and look for the new integration that was added: **Mobile App**. + - On the integration card, select **1 Device**. This opens the device info page. + - You now see your phone name and its entities. +4. To view the location of your phone on the map, open the **Map** dashboard. + - You now see a circle on that map with your initial. + - It shows the current location of your phone. + - To view the details, select that initial. + - Open the **Attributes** list to see the phone's **Latitude**, **Longitude**, and the **Source** of information. + - The source is the `device_tracker` entity for that device, for example `device_tracker.pixel_7_pro`. +5. To view the entity details and the history, go to {% my entities title="**Settings** > **Devices & services** > **Entities**" %} and in the search field, enter `devi` and select your `device_tracker` entity from the list. +6. Check your [Zones](/integrations/zone/) to prepare them for automations. + - Your home zone was set up during onboarding, but you can edit it. + - You can add other zones if you want to automate on them. + - For example, if you want the heating to start when you leave your office, you can add a zone called **Office**. + - In this case, leaving the office zone would be an automation {% term trigger %}. + - You could also use the location information as an automation {% term condition %}, for example, when you have an automation to turn on the light at sunset, but only when you are home. -<div class='note'> -The <a href="/dashboards/map/">map dashboard</a> will hide all devices that are home. -</div> +## Adding presence detection for other persons in your home + +1. For each person you want to have presence detection, add a device tracker (for example, their phone). + - You can also use a smartwatch for presence detection. To do this, install the [Home Assistant Companion app](https://companion.home-assistant.io/docs/getting_started/) on the device. Make sure to allow location tracking. + - To use it for zone presence detection outside your home, the smartwatch requires a mobile plan. +2. Go to {% my people title="**Settings** > **People**" %} and select the person. +3. Scroll down and under **Select the devices that belong to this person**, select the device. [routers]: /integrations/#presence-detection [nmap]: /integrations/nmap_tracker diff --git a/source/green/index.html b/source/green/index.html index 0e6dee540bdd..f5be07b3259a 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" /> @@ -2311,11 +2312,11 @@ <h1 class="heading-large"> <details id="dist_america"> <summary class="region">Shipping to America</summary> <div> - <a href="https://ameridroid.com/products/home-assistant-green" target="_blank"> + <a href="https://www.amazon.com/dp/B0CXVKSG19?maas=maas_adg_BB51722E249D328CABB2F6DF1F8976CC_afap_abs&ref_=aa_maas&tag=maas" target="_blank"> <div class="distributor"> <div> <div>🇺🇸</div> - <div>ameriDroid</div> + <div>Amazon US</div> <div>Shipping from US</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> @@ -2325,7 +2326,22 @@ <h1 class="heading-large"> </svg> </div> </a> - + + <a href="https://ameridroid.com/products/home-assistant-green" target="_blank"> + <div class="distributor"> + <div> + <div>🇺🇸</div> + <div>ameriDroid</div> + <div>Shipping from US</div> + </div> + <svg width="24" height="24" viewBox="0 0 24 24"> + <path + d="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z" + /> + </svg> + </div> + </a> + <a href="https://cloudfree.shop/product/home-assistant-green/" target="_blank"> <div class="distributor"> <div> 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 f37c8cc57847..d8f60b0d3821 100644 --- a/source/help/reporting_issues.markdown +++ b/source/help/reporting_issues.markdown @@ -1,7 +1,6 @@ --- title: "Reporting issues" description: "Reporting issues about Home Assistant" -sidebar: false related: - docs: /docs/configuration/ title: Configuration.yaml file diff --git a/source/images/blog/2024-07-dashboard-chapter-2/card-size-comparison.png b/source/images/blog/2024-07-dashboard-chapter-2/card-size-comparison.png new file mode 100644 index 000000000000..072520db10e4 Binary files /dev/null and b/source/images/blog/2024-07-dashboard-chapter-2/card-size-comparison.png differ diff --git a/source/images/blog/2024-07-dashboard-chapter-2/card-visual-editor-example.png b/source/images/blog/2024-07-dashboard-chapter-2/card-visual-editor-example.png new file mode 100644 index 000000000000..6c2be354689e Binary files /dev/null and b/source/images/blog/2024-07-dashboard-chapter-2/card-visual-editor-example.png differ diff --git a/source/images/blog/2024-07-dashboard-chapter-2/dashboard-banner.png b/source/images/blog/2024-07-dashboard-chapter-2/dashboard-banner.png new file mode 100644 index 000000000000..663abb72448f Binary files /dev/null and b/source/images/blog/2024-07-dashboard-chapter-2/dashboard-banner.png differ diff --git a/source/images/blog/2024-07-dashboard-chapter-2/grid-dimensions.png b/source/images/blog/2024-07-dashboard-chapter-2/grid-dimensions.png new file mode 100644 index 000000000000..aa2afb5bb118 Binary files /dev/null and b/source/images/blog/2024-07-dashboard-chapter-2/grid-dimensions.png differ diff --git a/source/images/blog/2024-07-dashboard-chapter-2/new-badges.png b/source/images/blog/2024-07-dashboard-chapter-2/new-badges.png new file mode 100644 index 000000000000..7ee093b9af15 Binary files /dev/null and b/source/images/blog/2024-07-dashboard-chapter-2/new-badges.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/blog/2024-08-yellow-lineup/art.jpg b/source/images/blog/2024-08-yellow-lineup/art.jpg new file mode 100644 index 000000000000..c9434c8ab292 Binary files /dev/null and b/source/images/blog/2024-08-yellow-lineup/art.jpg differ diff --git a/source/images/blog/2024-08-yellow-lineup/green-meets-yellow.jpg b/source/images/blog/2024-08-yellow-lineup/green-meets-yellow.jpg new file mode 100644 index 000000000000..ef04df3348ce Binary files /dev/null and b/source/images/blog/2024-08-yellow-lineup/green-meets-yellow.jpg 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/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/getting-started/add-ons.png b/source/images/getting-started/add-ons.png index 35f7d35df53a..bf3d1fe6923b 100644 Binary files a/source/images/getting-started/add-ons.png and b/source/images/getting-started/add-ons.png differ diff --git a/source/images/getting-started/entities.png b/source/images/getting-started/entities.png new file mode 100644 index 000000000000..9cb2ef30fc0f Binary files /dev/null and b/source/images/getting-started/entities.png differ diff --git a/source/images/getting-started/error_installing_ha.png b/source/images/getting-started/error_installing_ha.png new file mode 100644 index 000000000000..7cfd41b6be89 Binary files /dev/null and b/source/images/getting-started/error_installing_ha.png differ diff --git a/source/images/hassio/screenshots/add-ons-community_example.png b/source/images/hassio/screenshots/add-ons-community_example.png new file mode 100644 index 000000000000..92044534ba90 Binary files /dev/null and b/source/images/hassio/screenshots/add-ons-community_example.png differ diff --git a/source/images/hassio/screenshots/adding_repositories.png b/source/images/hassio/screenshots/adding_repositories.png index 09fd9e2ce15b..dd9a05fc386d 100644 Binary files a/source/images/hassio/screenshots/adding_repositories.png and b/source/images/hassio/screenshots/adding_repositories.png differ diff --git a/source/images/hassio/screenshots/dashboard.png b/source/images/hassio/screenshots/dashboard.png deleted file mode 100644 index bd8f2ec9576d..000000000000 Binary files a/source/images/hassio/screenshots/dashboard.png and /dev/null differ 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/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/integrations/zone/zone_edit_ui.png b/source/images/integrations/zone/zone_edit_ui.png index 622dc608e18c..f8a28300bd1a 100644 Binary files a/source/images/integrations/zone/zone_edit_ui.png and b/source/images/integrations/zone/zone_edit_ui.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/area_assign_devices.png b/source/images/organizing/area_assign_devices.png new file mode 100644 index 000000000000..d3511dfd90a9 Binary files /dev/null and b/source/images/organizing/area_assign_devices.png differ diff --git a/source/images/organizing/area_delete.png b/source/images/organizing/area_delete.png new file mode 100644 index 000000000000..de387cf44e10 Binary files /dev/null and b/source/images/organizing/area_delete.png 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/storage_view_free-diskspace.png b/source/images/screenshots/storage_view_free-diskspace.png new file mode 100644 index 000000000000..e2a22ec75e06 Binary files /dev/null and b/source/images/screenshots/storage_view_free-diskspace.png differ diff --git a/source/index.html b/source/index.html index 89ebda6e4e17..db39f95886ef 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"> @@ -84,14 +70,24 @@ <h1>Ok Google, turn on the AC</h1> </div> </div> + <a + class="material-card highlight-blog-post" + href="https://www.openhomefoundation.org/blog/announcing-the-open-home-foundation/" + > + We are a non-profit and can't be sold or acquired + <iconify-icon icon="mdi:arrow-right-thick"></iconify-icon> + </a> + <a class="material-card picture-promo" href="/blog/2019/08/06/home-assistant-cast/" 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 +100,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 +125,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 +155,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 +188,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 +207,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 +226,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> 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..a3fe1ba5579e 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" @@ -289,81 +289,58 @@ <h2>Advanced installation methods</h2> <th>Supervised<sup>1</sup></th> <tr> <td><a href="/docs/automation" target="_blank">Automations</a></td> - <td>✅</td> - <td>✅</td> - <td>✅</td> - <td>✅</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> </tr> <tr> <td><a href="/dashboards" target="_blank">Dashboards</a></td> - <td>✅</td> - <td>✅</td> - <td>✅</td> - <td>✅</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> </tr> <tr> <td><a href="/integrations" target="_blank">Integrations</a></td> - <td>✅</td> - <td>✅</td> - <td>✅</td> - <td>✅</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> </tr> <tr> - <td><a href="/docs/blueprint" target="_blank">Blueprints</a></td> - <td>✅</td> - <td>✅</td> - <td>✅</td> - <td>✅</td> + <td><a href="/addons" target="_blank">Add-ons</a></td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:cross-mark" %}</td> + <td>{% icon "openmoji:cross-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> </tr> <tr> - <td>Uses container</td> - <td>✅</td> - <td>✅</td> - <td>❌</td> - <td>✅</td> + <td><a href="/docs/blueprint" target="_blank">Blueprints</a></td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:check-mark" %}</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>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "openmoji:cross-mark" %}</td> + <td>{% icon "openmoji:cross-mark" %}</td> + <td>{% icon "noto-v1:check-mark" %}<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>✅</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> + <td>{% icon "openmoji:check-mark" %}</td> + <td>{% icon "noto-v1:check-mark" %}<sup>3</sup></td> + <td>{% icon "noto-v1:check-mark" %}<sup>3</sup></td> + <td>{% icon "openmoji:check-mark" %}</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/linux.markdown b/source/installation/linux.markdown index 627335576144..bd8f669b8925 100644 --- a/source/installation/linux.markdown +++ b/source/installation/linux.markdown @@ -11,3 +11,19 @@ Included sections for this page is located under source/_includes/installation {% include installation/container.md %} {% include installation/core.md %} {% include installation/supervised.md %} + +## Troubleshooting + +### No access to the frontend + +Symptom: You cannot open the Home Assistant page in your browser. If you are not using {% term "Home Assistant Operating System" %}, the cause may be an access restriction. + +In newer Linux distributions, the access to a host is very limited. This means that you can't access the Home Assistant frontend that is running on a host outside of the host machine. + +To fix this, you will need to open your machine's firewall for TCP traffic to port 8123. The method for doing this will vary depending on your operating system and the firewall you have installed. Below are some suggestions to try. Google is your friend here. + +For UFW systems (for example, Debian): + +```bash +sudo ufw allow 8123/tcp +``` \ No newline at end of file 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/installation/troubleshooting.markdown b/source/installation/troubleshooting.markdown new file mode 100644 index 000000000000..d4c54b808a1b --- /dev/null +++ b/source/installation/troubleshooting.markdown @@ -0,0 +1,84 @@ +--- +title: "Troubleshooting installation problems" +description: "Common installation problems and their solutions." +--- + +It can happen that you run into trouble while installing and onboarding Home Assistant. This page is here to help you solve the most common problems. + +## Can’t access Home Assistant in my browser + +### Symptom: “This site can’t be reached” + +When trying to access Home Assistant in the browser, the browser shows the message “This site can’t be reached”. + +### Description + +This means the browser can’t find your Home Assistant installation on the network. + +### Resolution + +To resolve this issue, try the following steps: + +1. Make sure your Home Assistant device is powered up (LEDs are on). +2. Make sure your Home Assistant installation is connected to the internet: + - Make sure the Ethernet cable is plugged-in to both Home Assistant and to your router or switch. + - Make sure your network has internet access. + - During first startup, time will be synchronized. Ensure NTP is allowed in your network. + - During first startup, Home Assistant completes the installation. It needs access to the following URLs: + - version.home-assistant.io: to fetch new version information. + - github.com: to update metadata of the add-on store. + - ghcr.io: the GitHub container registry to fetch new Home Assistant updates. +3. Make sure the system on which you opened the browser to access Home Assistant is connected to the same network as Home Assistant. + - For example, if the system your Browser runs on is using Wi-Fi, make sure it is using the same Wi-Fi Home Assistant is connected to. +4. Make sure you typed the address correctly. + - Especially if the message includes the error code “ERR_CONNECTION_REFUSED”, it is likely that there was a typo in the port part of the URL (`:8123`). + - Typically, the URL is [http://homeassistant.local:8123](http://homeassistant.local:8123). + - If you are running an older Windows version or have a stricter network configuration, try [http://homeassistant:8123](http://homeassistant:8123) instead. +5. The system might still be starting up. Wait for a couple of minutes and refresh the page. + - Refreshing might work differently depending on your browser. Look for the refresh {% icon "mdi:refresh" %} icon, or press CTRL+R or CTRL+SHIFT+R. +6. Check your router's web interface to see what IP address is assigned to your Home Assistant installation. + - Enter this IP address (`http://x.x.x.x:8123`) directly into your browser. +7. If you still can’t reach Home Assistant, connect keyboard and monitor to the device Home Assistant is running on to access the console and see where Home Assistant gets stuck. + - If you are using a Home Assistant Green, follow these steps [to access the console](https://green.home-assistant.io/guides/use-terminal/). + - If you are using a Home Assistant Yellow, follow these steps [to access the console from Windows](https://yellow.home-assistant.io/guides/use-serial-console-windows/), or [to access the console from Linux or macOS](https://yellow.home-assistant.io/guides/use-serial-console-linux-macos/). +8. [Reach out to our community for help](https://www.home-assistant.io/help/). + +## "Error installing Home Assistant" + +### Symptom: During onboarding, there is an "Error installing Home Assistant" + +You are in the onboarding procedure, but you get the message **Error installing Home Assistant**. + +![Error installing Home Assistant during onboarding](/images/getting-started/error_installing_ha.png) + +### Resolution + +1. Make sure your network has internet access. + - During first startup, time will be synchronized. Ensure NTP is allowed in your network. + - During first startup, Home Assistant completes the installation. It needs access to the following URLs: + - version.home-assistant.io: to fetch new version information. + - github.com: to update metadata of the add-on store. + - ghcr.io: the GitHub container registry to fetch new Home Assistant updates. +2. After changing your network environment, wait a few minutes. Home Assistant will try to reconnect. +3. [Reach out to our community for help](https://www.home-assistant.io/help/). + +## Stuck at "Preparing Home Assistant" + +### Symptom: Onboarding seems stuck at "Preparing Home Assistant" + +You are in the onboarding procedure, but the process seems stuck at the step **Preparing Home Assistant**. + +![Home Assistant preparation](/images/getting-started/onboarding_preparing_01.png) + +### Resolution + +1. Select the pulsing blue dot to view the log files. + - The log files might provide more information on the current status. +2. Make sure your network has internet access. + - During first startup, time will be synchronized. Ensure NTP is allowed in your network. + - During first startup, Home Assistant completes the installation. It needs access to the following URLs: + - version.home-assistant.io: to fetch new version information. + - github.com: to update metadata of the add-on store. + - ghcr.io: the GitHub container registry to fetch new Home Assistant updates. +3. After changing your network environment, wait a few minutes. Home Assistant will try to reconnect. +4. [Reach out to our community for help](https://www.home-assistant.io/help/). 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..8e98f63e4519 100644 --- a/source/more-info/free-space.markdown +++ b/source/more-info/free-space.markdown @@ -1,49 +1,88 @@ --- title: "Clear up storage" description: "More information on how to clear up storage in Home Assistant." +related: + - docs: /integrations/recorder/#service-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 +## Viewing the available disk space -The Home Assistant database can get huge! +Follow these steps to check the available free disk space. -Luckily there is a tool you can use to [purge the contents of the database](/integrations/recorder/#service-purge) +1. Go to **{% my storage title="Settings > System > Storage" %}**. +2. Under disk metrics, hover over the status bar to view the details. + - {% icon "mdi:information-outline" %} The **Network storage** section only shows if you have [added network storage](/common-tasks/os/#network-storage). -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) + ![Screenshot of the "Move datadisk" feature](/images/screenshots/storage_view_free-diskspace.png) -## Delete old backups +## Cleaning the database -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. +The Home Assistant database can become very large. Follow these steps to reduce the size of the database. -## Uninstall unused add-ons +1. To view the size of the current database, go to {% my system_health title="**Settings** > **System** > **Repairs**" %}. + - Select the three dots {% icon "mdi:dots-vertical" %} menu and select **System information**. + - Scroll down to the **Recorder**, and check the **Estimated database size (MiB)**. +2. [Purge the contents of the database](/integrations/recorder/#service-purge). +3. To slow down the growth of the database, [filter](/integrations/recorder/#configure-filter) what you send to +the database. +4. Change how long it stores the data, using the [`purge_keep_days` setting](/integrations/recorder/#purge_keep_days). + +## Reducing space used for backups + +### Deleting obsolete backups + +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**. + +## Expanding storage + +If the above steps to free up space did not help, you need to expand your storage. -## Last resort +### Expanding storage: Home Assistant Operating System -If all else fails, you need to expand your storage. +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/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/s3_box_voice_assistant.markdown b/source/voice_control/s3_box_voice_assistant.markdown index fcaf39a912db..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-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. +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,10 +29,11 @@ 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 @@ -77,12 +78,12 @@ Before you can use this device with Home Assistant, you need to install a bit of - 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 +- title: Using the ESP32-S3-BOX-3(B) 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. + 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 afterwards. + - 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> @@ -206,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/thirteen-usd-voice-remote.markdown b/source/voice_control/thirteen-usd-voice-remote.markdown index 51dd02077192..71b9f89b1446 100644 --- a/source/voice_control/thirteen-usd-voice-remote.markdown +++ b/source/voice_control/thirteen-usd-voice-remote.markdown @@ -45,7 +45,7 @@ Before you can use this device with Home Assistant, you need to install a bit of - Select the **Connect** button below. If your browser does not support web serial, you will see a warning 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/voice-assistant/m5stack-atom-echo/manifest.json"></esp-web-install-button> + <esp-web-install-button manifest="https://firmware.esphome.io/wake-word-voice-assistant/m5stack-atom-echo/manifest.json"></esp-web-install-button> - **For advanced users**: The configuration file is available on [GitHub](https://github.com/esphome/firmware/blob/main/voice-assistant/m5stack-atom-echo.yaml). {% include voice_assistant/install_esp_firmware.md %} 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) diff --git a/source/yellow/index.html b/source/yellow/index.html index a9db671f8ffb..e3f73fb341b2 100644 --- a/source/yellow/index.html +++ b/source/yellow/index.html @@ -154,11 +154,6 @@ <span>Zigbee & Thread</span> <span>Comes with Zigbee out of the box. Thread to power your Matter network is coming soon.</span> </div> - <div class="item"> - <span>Ready</span> - <span>Zero Setup</span> - <span>Comes with Home Assistant.</span> - </div> </div> </div> @@ -168,17 +163,6 @@ <div class="material-card text spaced-card"> <h1>Pick your flavor</h1> - <div class="yellow-variant"> - <div><img src="/images/yellow/yellow-2d.jpg" alt="2D overview of the content of the Home Assistant Yellow"></div> - <div> - <b>Home Assistant Yellow</b><br> - This flagship version of Home Assistant Yellow is ready to go out of the box. - <br><br> - It comes pre-assembled in a custom enclosure with a Raspberry Pi Compute Module 4 (CM4) and a custom heat sink for fanless, silent operation. The CM4 is a version without wireless and has 2 GB RAM and 16 GB eMMC storage. Pre-installed with Home Assistant. - <br><br> - To get started, just plug in the power supply and the Ethernet cable. The cables are included in the box. This variant does not have Power-over-Ethernet. - </div> - </div> <div class="yellow-variant"> <div><img src="/images/yellow/yellow-kit-poe-2d.jpg" alt="2D overview of the content of the Home Assistant Yellow Kit Power-over-Ethernet variant"></div> <div> @@ -197,6 +181,14 @@ <h1>Pick your flavor</h1> <b>Not included</b>: You must provide your own Raspberry Pi Compute Module 4 and install Home Assistant on it. This allows you to pick the compute module with the memory and eMMC storage to fit your needs. This kit comes with a power supply, but does not support Power-over-Ethernet. </div> </div> + <div class="yellow-variant"> + <div><img src="/images/yellow/yellow-2d.jpg" alt="2D overview of the content of the Home Assistant Yellow"></div> + <div> + <b>Home Assistant Yellow Standard*</b><br> + The version of Home Assistant Yellow that was ready to go out of the box. It came pre-assembled in a custom enclosure with a Raspberry Pi Compute Module 4 (CM4), a custom heat sink for silent operation, and with the Home Assistant Operating System pre-installed. + <br><br>*Although Home Assistant Yellow Standard is no longer manufactured, it will continue to receive the same support as the kit models. If you are looking for more of a plug-and-play experience, take a look at the <a href = "https://www.home-assistant.io/green/">Home Assistant Green</a>. + </div> + </div> </div> @@ -212,8 +204,6 @@ <h1>Open hardware</h1> <h1>Buying a Raspberry Pi Compute Module 4 (CM4)</h1> <p>If you bought the Home Assistant Yellow Kit, you need to bring your own Raspberry Pi Compute Module 4. </p> - <p>A chip shortage still impacts the availability of the CM4. Our recommendation is to use <a href="https://rpilocator.com/" target="_blank">rpilocator</a>. This website tracks the stock of official Raspberry Pi distributors. Follow them on X and enable push notifications. You will be notified as soon as the bot tweets that products are in stock. - </p> <p> We recommend purchasing a Raspberry Pi Compute Module 4 with the following characteristics: <ul> @@ -315,6 +305,16 @@ <h1>Buying a Raspberry Pi Compute Module 4 (CM4)</h1> </ul> </div> +<h1 class="sub-title">FAQs</h1> +<div class="faq-list"> + {% details "Can I buy the Home Assistant Yellow pre-assembled?" %} <p>No. We previously offered a Home Assistant Yellow Standard model that came pre-assembled with a Raspberry Pi CM4, but this model is no longer manufactured. It is now recommended that if you want a more plug-and-play experience, you purchase a <a href="https://www.home-assistant.io/green" target="_blank">Home Assistant Green</a>, as it requires no assembly and matches many of the capabilities of the Yellow, especially if you add a <a href="https://www.home-assistant.io/connectzbt1/" target="_blank">Home Assistant Connect ZBT-1</a> to give it Zigbee/Thread capability. + </p> + {% enddetails %} + + {% details "What happened to Home Assistant Yellow Standard, and will it still be supported?" %} <p>The Home Assistant Yellow Standard was originally designed to be the beginner option in our product line, as it was pre-assembled and easier to get started with. In 2023, we launched the <a href="https://www.home-assistant.io/green" target="_blank">Home Assistant Green</a>, which offered similar features, including easy setup, but at a lower price point. This led us to end the manufacture of the Home Assistant Yellow Standard and focus on Yellow Kit versions for advanced users. Rest assured, it will continue to receive the same support and software updates as the Yellow Kit variants. + </p> + {% enddetails %} + <div class="material-card text spaced-card"> <a href="https://yellow.home-assistant.io/" target="_blank" class="documentation-card"> @@ -358,7 +358,7 @@ <h1>View documentation</h1> <div> <div>🇺🇸</div> <div>ameriDroid</div> - <div>Shipping from US. Yellow Kit versions only. Also sells CM4 modules.</div> + <div>Shipping from US</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path @@ -373,22 +373,7 @@ <h1>View documentation</h1> <div> <div>🇺🇸</div> <div>CloudFree</div> - <div>Shipping from US. Yellow Kit versions only. Also sells CM4 modules.</div> - </div> - <svg width="24" height="24" viewBox="0 0 24 24"> - <path - d="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z" - /> - </svg> - </div> - </a> - - <a href="https://www.crowdsupply.com/nabu-casa/home-assistant-yellow#products" target="_blank"> - <div class="distributor"> - <div> - <div>🇺🇸</div> - <div>Crowd Supply</div> - <div>Shipping from US. Yellow Kit versions only.</div> + <div>Shipping from US</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path @@ -406,7 +391,7 @@ <h1>View documentation</h1> <div> <div>🇨🇳</div> <div>Seeed Studio</div> - <div>Shipping from China, US and Germany. Also sells CM4 modules.</div> + <div>Shipping from China, US and Germany</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path @@ -430,7 +415,7 @@ <h1>View documentation</h1> <div> <div>🇨🇳</div> <div>Seeed Studio</div> - <div>Shipping from China, US and Germany. Also sells CM4 modules.</div> + <div>Shipping from China, US and Germany</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path @@ -472,7 +457,7 @@ <h1>View documentation</h1> <div> <div>🇵🇱</div> <div>Botland</div> - <div>Shipping from Poland. Yellow Kit versions only. Also sells CM4 modules.</div> + <div>Shipping from Poland</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path @@ -490,7 +475,7 @@ <h1>View documentation</h1> <div> <div>🇵🇹</div> <div>Mauser</div> - <div>Shipping from Portugal. Yellow Kit versions only. Also sells CM4 modules.</div> + <div>Shipping from Portugal</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path @@ -508,7 +493,7 @@ <h1>View documentation</h1> <div> <div>🇨🇭</div> <div>Pi-Shop.ch</div> - <div>Shipping from Switzerland. Also sells CM4 modules.</div> + <div>Shipping from Switzerland</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path @@ -526,7 +511,7 @@ <h1>View documentation</h1> <div> <div>🇩🇰</div> <div>RaspberryPi.dk</div> - <div>Shipping from Denmark. Also sells CM4 modules.</div> + <div>Shipping from Denmark</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path @@ -544,7 +529,7 @@ <h1>View documentation</h1> <div> <div>🇨🇳</div> <div>Seeed Studio</div> - <div>Shipping from China, US and Germany. Kit versions only. Also sells CM4 modules.</div> + <div>Shipping from China, US and Germany</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path @@ -562,7 +547,7 @@ <h1>View documentation</h1> <div> <div>🇬🇧</div> <div>The Pi Hut</div> - <div>Shipping from the United Kingdom. Kit versions only. Also sells CM4 modules.</div> + <div>Shipping from the United Kingdom</div> </div> <svg width="24" height="24" viewBox="0 0 24 24"> <path